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; /** * 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>> = { 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"); }