Files
Jyotisha/frontend/src/lib/consultation-condensed-checklist.ts
T
Jesse_ChenandClaude Opus 5.5 401796509a feat(consult): shared affliction-first reading, lists for every domain, health renamed
- T1 (BUG-1160): 「通用读法 · 先看受冲」 opens every turn's methodology once.
- T2 (BUG-1161): Chinese lists for parents, children, education, migration,
  family, annual, general, health; health replaces the English route in the
  web consultation only.
- T3 (BUG-1162): career / marriage / wealth each gain an affliction line.
- T4 (BUG-1163): health label 健康, prompt asks about the constitution first.
- Single-domain annual / timing turns keep the pre-brief method
  (CONSULT_READING_BUDGET_BLOCKED): they would exceed the 12,000-character
  assertions, which this brief may not change.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
2026-10-02 00:14:54 +08:00

177 lines
14 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { ConsultationDomain } from "./consultation-domain-registry.ts";
import type { ProfileGender } from "./profile-gender.ts";
/**
* Condensed consultation checklists (TASK-consult-evidence-card-v2-20260927
* T4, decision "方案 B"): what the web consultation hands the answer model for
* career, marriage and wealth instead of the full strict route and the full
* event-judgment file.
*
* Condensed from the live skill's `references/strict-workflow-router.md`
* (§2 shared baseline, §3 career-timing-strict, §4 relationship-timing-strict,
* §5 finance-timing-strict) and `references/event_judgment_career.md`,
* `event_judgment_marriage.md`, `event_judgment_wealth.md`. Each list is 5–8
* lines: the must-see items (all of them on the evidence card), the three
* layers to keep apart, the forbidden statements, and what stays a lookup.
*
* TASK-consult-affliction-reading-20261001 (T2/T3) added one affliction line to
* each of those three and wrote the lists for the remaining domains (parents,
* children, education, migration, family, annual, general, health); those
* cite the brief, not the router, as their source.
*
* Consultation only. The router and the event-judgment files are unchanged and
* still serve reports and every other surface; this file does not edit the
* skill, so there is no skill version change.
*/
export const CONDENSED_CHECKLIST_SOURCE =
"consultation condensed checklist (from references/strict-workflow-router.md §2–§5 and references/event_judgment_*.md)";
/**
* The marriage list's gender line (TASK-consult-gender-optional-20260927, G3).
* `unknown` applies only when the current subject's gender is not filled.
* When it is filled, the line follows strict-workflow-router.md §4 ("Confirm
* gender and day/night context before spouse significator analysis") and the
* repo's gender interpretation contract
* (references/oracle/gender_interpretation_contract_2026_07_19.json): the core
* stack stays gender-neutral and the spouse significator is a supplement.
*/
export const CONDENSED_GENDER_LINES = {
unknown: "性别未知:金星与木星都要看,不按性别指定「夫星」「妻星」下定论。",
female: "性别:女(卡上 gender)。先确认性别与昼夜盘(卡上 day_night)再取夫星:夫星以木星为主,部分传承兼看火星;它只是补充层,核心仍是 7 宫、7 宫主、D9、UL、DK,不得只因夫星的大运或过运就定婚期。",
male: "性别:男(卡上 gender)。先确认性别与昼夜盘(卡上 day_night)再取妻星:妻星取金星;它只是补充层,核心仍是 7 宫、7 宫主、D9、UL、DK,不得只因金星的大运或过运就定婚期。",
} as const satisfies Record<ProfileGender | "unknown", string>;
/**
* The shared reading every consultation turn gets once, ahead of any domain
* list (TASK-consult-affliction-reading-20261001 T1, decisions D1/D2): read the
* afflictions before the dignities. The text is the brief's final wording;
* field names in brackets were adapted to where the evidence card really
* carries them (planet rows `conjunct_with` / `aspected_by` / `combust` /
* `status`, house rows `occupants` / `aspected_by`, the base
* `functional_benefic_malefic` layer, the parents rows' `functional`, the
* yogas section's `hits`). The "two or more signals" threshold is a product
* heuristic, not a classical rule; the celebrity backtest of the third brief
* checks it for false positives.
*/
export const CONDENSED_SHARED_READING_TITLE = "通用读法 · 先看受冲";
export const CONDENSED_SHARED_READING_SOURCE = "consultation shared reading (TASK-consult-affliction-reading-20261001)";
export const CONDENSED_SHARED_READING_LINES: readonly string[] = [
"先看受冲,再看旺弱。旺弱和力量(入旺、入庙、Shadbala、SAV)只说明这颗星自己有没有力气,不说明它管的那件事顺不顺、那个人在不在你身边。",
"受冲信号,每条算一个:①宫、宫主或代表星与罗睺、计都、土星、火星同宫(星行 conjunct_with、宫行 occupants),或被土星、火星照(aspected_by);②宫主落 6、8、12 宫,或落在从该宫数起的第 6、8、12 宫;③宫主或代表星是本上升的功能凶星(functional_malefics,父母行 functional);④落陷(status)或燃烧(combust);⑤对应分盘里同号宫有凶星,或宫主落分盘的 6、8、12 宫。",
"同一个人或同一件事有两个及以上受冲信号:这一段第一句先写这一面,用「可能」,括号里写是哪几条;只有一个:补充一句;没有:不写。吉的一面同样要有依据,吉凶都有时两面都说。",
"力量大的星如果本身是 6、8、12 宫主,它带来的麻烦也有力量,不得因为「强」就说「没事」。",
"不写没有区分度的推论:逆行不等于「反复、打回来」;宫主不在本宫不等于「往外跑」;某星不在某宫不等于「离得远」;空宫不单独下结论。",
"不断言死亡、离婚、疾病诊断、流产、不孕。",
"瑜伽只认 yogas.hits:hits 里的才是这张盘成立的格局;只在 names 里、没进 hits 的是待检规则,不得说成本人的格局。",
];
/** The shared reading as one numbered block. */
export function sharedConsultationReading(): string {
return CONDENSED_SHARED_READING_LINES.map((line, index) => `${index + 1}. ${line}`).join("\n");
}
/**
* Domains whose list was written by TASK-consult-affliction-reading-20261001
* (T2, decision D5) rather than condensed from the router; their section
* cites that brief as its source.
*/
export const CONSULT_BRIEF_CHECKLIST_SOURCE = "consultation checklist (TASK-consult-affliction-reading-20261001)";
export const CONSULTATION_CONDENSED_CHECKLISTS: Readonly<Partial<Record<ConsultationDomain, readonly string[]>>> = {
career: [
"必看:D1 10 宫与 10 宫主、AmK;卡上 d9 段确认 10 宫主与 AmK 的旺弱、Vargottama、D1/D9 反转;D10 上升与 10 宫;AL 与 A10;10 宫 SAV 与木星、土星所在宫的 SAV。",
"时间:Vimshottari(MD/AD/PD)与 Narayana 双轨同向才谈应期,看大运主与 10 宫、10 宫主、D10 的关系;每颗星先按功能吉凶定性。",
"分三层说,不得合成一句「事业机会」:①接触(消息、面试、初步接洽)②结构性机会(合同、正式职位、长期项目)③公开落地(发布、到账、公开的职位与名声)。",
"禁写:本命承诺弱时,不得因一段大运或一次行运断言「事业必成」;不得把接触窗写成落地窗。",
"AL 落第几宫要说出来(落 10 宫 = 公众形象就是事业);10 宫主、AmK 的受冲按通用读法。",
"卡外按需补取一次:Karakamsha、宫主链、D1→D9→D10 联动、Argala、Chara 大运;KP 精确宫头仍 blocked,只作参考、不作依据。",
],
marriage: [
"第一句先冻结判定对象:心动接触 / 关系成对(契约)/ 社会法律落地;对象不清就先说清楚再往下。",
"必看:D1 7 宫与 7 宫主、5 宫与 5 宫主、金星、木星、DK、UL;卡上 d9 段(D9 上升、金木与 DK 的旺弱);昼夜盘;Vivah Saham 的度数与落宫。",
"分三层说:①心动接触:5 宫、5 宫主、Punarphoo 观察 ②关系成对:7 宫主、DK、UL ③社会法律落地:D9 + UL + Vivah Saham + 双大运同向。",
"时间:Vimshottari 与 Narayana 双轨;双重过运(木星、土星同时激活 7 宫 / 7 宫主 / DK / UL)只是激活窗,不是事件日。",
CONDENSED_GENDER_LINES.unknown,
"7 宫主或金星与罗睺、计都同宫,火星照 7 宫,UL 第 2 宫有凶星,伴侣代表星落 6、8、12:受冲两个及以上就写「感情可能不止一段 / 可能有断续」,只作可能;不预设用户现在有伴侣或单身。",
"禁写:5 宫主大运 ≠ 法律婚;金星过本命月亮 ≠ 心动月;Punarphoo 不得写成结婚;土星回到本命月亮是观察项,不是结婚。",
"卡外按需补取一次:Chara 大运、KP 7 宫副主星(KP 精确宫头仍 blocked,只作参考、不作依据)。",
],
wealth: [
"必看:D1 2、11、5、9 宫及宫主,8 宫(共享资源、突然得失)与 12 宫(支出、外流);木星、金星、水星;D2、D11;2、11 宫 SAV 与最强、最弱星座;卡上 d9 段确认 2 宫主、11 宫主的旺弱。",
"时间:2、11、5、9 宫主(收入来自工作时加 10 宫主)大运是否激活,Vimshottari 与 Narayana 双轨同向;每颗星先按功能吉凶定性。",
"分三层说:①挣钱机会 ②收入或资产真实增长 ③到账变现;不得合成一句「财运好」。",
"禁写:本命承诺弱时,不得因一次行运或一段大运断言「发财」;不给投资建议、不保证收益。",
"8 宫也管版税、继承、意外之财,不只读成纠纷;2、11 宫主与 9 宫主同宫或互照是财富组合。",
"卡外按需补取一次:收入来自工作时补取 D10;Argala、KP 到账类(KP 精确宫头仍 blocked,只作参考、不作依据)。",
],
// The lists below are the final wording of TASK-consult-affliction-reading-20261001
// §5 T2 (decision D5); field names were adapted to the card's real placement only.
parents: [
"父亲:9 宫、9 宫主、太阳、PiK(卡上有才看);母亲:4 宫、4 宫主、月亮、MK;D12 同号宫及其宫主(roles.*.d12_house)。看 roles.father/mother 的 lord_rows、significator_rows。父亲、母亲各自判断,依据不混用。",
"先判断「在不在身边、近不近」,再谈性格:受冲信号两个及以上,这一段第一句写「爸爸(妈妈)可能不常在你身边 / 很早就有距离 / 关系断断续续」,不得写成「有分量」「站得住」。",
"4 宫、4 宫主、月亮都落双体星座(双子、处女、射手、双鱼),且有受冲信号:可以提「照顾你长大的可能不止一位」,只作可能。",
"不拿太阳、月亮的旺弱代替关系好坏。",
"禁写:凭单一信号断定父母离婚、去世、生病。",
"时间:9 宫主、4 宫主、太阳、月亮的大运子运,配 Narayana 当前段。",
],
children: [
"必看:5 宫、5 宫主、木星、PK;D7 上升、D7 的 5 宫与 5 宫主落 D7 第几宫。",
"先分清问的是「有没有、来得顺不顺」还是「和孩子怎么相处」。前者看受冲信号(5 宫主落 6、8、12;D7 的 5 宫主落 D7 的 6、8、12;木星落陷、燃烧、受冲),只能说「可能晚、可能要费些周折」。",
"孩子性别不写,统一写「孩子」。",
"禁写:断言不孕、流产、孩子性别、孩子的健康诊断。",
],
education: [
"必看:4 宫(正规学业)、5 宫(理解力、考试)、9 宫(高等教育)及宫主;水星、木星;D24 上升与 4、5、9 宫。",
"学历路和真本事分开说:4、9 宫受冲而 5 宫、水星有力,常见「学历这条路不顺,本事不靠学历」。",
"分盘行只有星座:旺弱以卡上 d9 段和本命 status 为准,不自己推分盘旺弱。",
"禁写:断言考不上、拿不到学位。",
],
migration: [
"必看:4 宫(家乡、住处)、12 宫(远方、异地居住)、9 宫(远行)及宫主;罗睺;D4。",
"先说这张盘一生迁动多不多(包括早年),再说现在的时间。",
"禁写:只凭一次行运断言搬家、出国。",
],
family: [
"先分清问的是谁(父母、兄弟姐妹、伴侣家人、孩子),按人分开,各自取宫:父母见父母清单,兄弟姐妹 3 宫、3 宫主、火星,家里整体 2 宫、4 宫。",
"受冲读法同通用读法。",
],
annual: [
"年盘(年主、Muntha、年运)只作当年层;一生的底子仍以本命为准。",
"必看:当前大运、子运的星主管哪几宫、和谁同宫、被谁照;Narayana 当前段所在宫;土星、木星行运所在宫;saturn_from_moon_house 为 12、1、2 时是土星压月亮那几年,只说压力大、节奏慢,不说灾。",
"罗睺、计都主事的大运要点出来:落哪宫、和谁同宫。",
"禁写:凭一次行运断言具体事件或日期。",
],
general: [
"命宫、命主、月亮、太阳的强弱与受冲是底子,先讲。",
"入旺或入庙的星坐 1、4、7、10 宫是大力量,要说出来;落陷的星,卡上瑜伽有取消才说取消。没上卡的格局不得自造名字。",
"起步与后劲分开说;不得因一颗星落陷就说「起步慢、没天赋」。",
],
// Replaces the English health-timing-strict route in the web consultation
// only; reports keep the router's route.
health: [
"先讲体质底子:命宫、命主、月亮、太阳的强弱与受冲。命主兼 6、8 宫主,或与 6、8 宫主同宫,底子偏弱、需要长期照顾。",
"必看:6 宫(疾病)、8 宫(慢性、手术)、12 宫(住院)及宫主;土星、火星;D6、D8、D30 上命主、6 宫主、8 宫主落第几宫、和谁同宫。",
"宫位对应的身体部位只作提示(如 4 宫胸、心、肺),不写成诊断。",
"分三层:一生底子;压力窗(当前大运子运激活 1、6、8、12 宫主);恢复窗。",
"禁写:诊断、病名、治疗建议、手术或死亡的断言;保留「这不是医疗意见」。",
],
};
/**
* The condensed list for one domain, or null when the domain keeps its full
* route. `gender` is the current subject's optional gender: the gender-unknown
* line is swapped for the female / male line only when it is filled.
*/
export function condensedConsultationChecklist(
domain: ConsultationDomain,
options: Readonly<{ gender?: ProfileGender | null }> = {},
): string | null {
const lines = CONSULTATION_CONDENSED_CHECKLISTS[domain];
if (!lines) return null;
const genderLine = options.gender ? CONDENSED_GENDER_LINES[options.gender] : CONDENSED_GENDER_LINES.unknown;
return lines
.map((line) => (line === CONDENSED_GENDER_LINES.unknown ? genderLine : line))
.map((line, index) => `${index + 1}. ${line}`)
.join("\n");
}