Files
Jyotisha/docs/tasks/TASK-consult-plain-answer-20261001.md
T

16 KiB
Raw Blame History

TASK · 普通对话改说人话、按人分段(2026-10-01)

  • 基线:origin/staging 75166802
  • 分支 / worktree:codex/consult-plain-answer-20261001 / .worktrees/consult-plain-answer-20261001
  • 范围:普通对话(本命 / 无出生分钟 / 申报时段三种模式)的回答形状提示词 + 父母数据卡;生时校正面不动
  • BUG 编号起点:BUG-1132(开工时 grep -o "BUG-1[0-9]\{3\}" docs/BUG_HISTORY.md | sort -u | tail -1 核对,当前最大 1131;若已被别的单占用则顺延)

1. 事故实证

产品 10-01 真机(staging,deepseek-v4-flash),问「我和父母关系如何,感……」。首轮开场原文(盘上事实不涉隐私,可引):

你与父母的关系是「外近内隔」:表面上很近——太阳(父)和月亮(母)都落在你的第 10 宫……推这一段的是月亮大运(2024-02 到 2034-02),情感与母亲那条线被顶到前台;修形式的是罗睺子运(到 2027-01),它让期待错位,体面交给金星子子运去收尾。所以别去应土星的「冷」和计都的「疏」……去扮演月亮的「照看」:4 宫、9 宫都是空宫,感情不靠自动流动,靠你主动接。

真实读者的评价是「还是废话」。对照的 Gemini 回答会分开讲「我和我妈的关系」「我和我爸的关系」「他们怎么对待我」。

逐句对照提示词(按符号定位):

现象 来源
「外近内隔」自造四字格局名 frontend/src/mastra/product-voice.ts productConversationVoice → OPENER SHAPE 第 1 步「并把这个反差命名成一个格局(例:外松内紧)」
「推这一段的是…修形式的是…体面交给…收尾」 同处第 2 步「谁在推、谁在修……只负责把结果修得体面」
「别去应土星的「冷」…去扮演月亮的「照看」」 同处第 3 步,以及 HOPE DISCIPLINE「指出这段时间可以扮演哪个象」
爸妈被揉成一段、没有「他们怎么对我」 同处「全程无标题,总长 ≤ 400」+ 第 1 步只允许一个反差;natalSpokenReportContract 的固定三标题里没有按对象分段的位置
「4 宫、9 宫都是空宫,感情不靠自动流动」 没有任何规则禁止拿空宫下结论(Jyotish 看空宫要看宫主,空宫本身不算弱)
爸、妈的依据混着用 frontend/src/lib/consultation-evidence-card.ts EVIDENCE_CARD_SPECS.parents 只给 houses: [4, 9]、planets: ["Sun", "Moon"],没有标「母亲 / 父亲」,也没有 Jaimini 母亲代表星 MK

同一套形状文字还抄在另外 6 处:natalSpokenReportContract(同文件)、frontend/src/mastra/index.ts 指令第 21 行附近("On the first natal answer of a session")、frontend/src/mastra/skill-binding.ts NATAL_REPORT_SKELETON、frontend/src/lib/consultation-thinking-plan.ts(natalAnswerShapeInstruction、骨架说明 On the first natal answer、步骤标签「用盘上的反差回答这个问题」「这周可以扮演哪个象」)、frontend/src/app/api/consult/route.ts 用户回合指令(搜「先给反差」)、frontend/docs/VOICE.md 原则 6、7 和示例表。

2. 根因

09-17(84b293fb)照一段紫微流年范文定下了四步开场形状:反差格局名 → 谁推谁修 → 扮演哪个象 → 行动。那段范文针对的是「一年事业」这种单一对象、单一时段的问题。现在这个形状对所有领域强制生效。模型按格填空,结果是术语叠术语的谜语。问到多个人时,只给一段 400 字、只容一个反差,所以没地方分开讲每个人。BUG-1070(09-27)只收窄了「反差只写盘上」,没碰形状本身,所以不算复发,是同一形状的另一个后果。

模型偏弱(flash)会放大问题,但不是根因:换 Gemini 走同一提示词,也会被推成同样的形状。

3. 决策记录(产品 2026-10-01 授权)

D1 推翻 09-17 四步开场形状(84b293fb)以及 VOICE.md 原则 7、示例表里的「外松内紧」定稿。 执行方不得以「这是产品拍板的口气定稿」为由保留。BUG-1070(反差只写盘上)、BUG-1073(每件事只说一遍)的目的继续有效:不读心、不重复。只是落到新形状里。

D2 新形状:先答,再按对象分段。

  1. 开场 1–3 句人话,第一句就是结论。不写标题,不起格局名。
  2. 问题里点到几个对象(妈妈、爸爸、伴侣、老板……)或几个子问题(关系如何、他们怎么对我、什么时候),开场之后每个各一段,H2 标题用问题里的词(例:## 你和妈妈、## 你和爸爸、## 他们怎么对你)。只有一个对象、一个子问题时不拆,开场后直接接下面第 4 步。
  3. 每段先用人话讲清楚这个人是什么样、你们怎么相处、事情会怎么走,写到讲清楚为止;然后在括号里给出撑住这段判断的盘上依据(宫、宫主、代表星、分盘、大运),够用就停,不堆无关的。
  4. 之后依次是 ## 时间怎么看(卡里有相关大运或行运才写,没有就省)、## 这周可以做的一件事(1–3 条,只出现一次)。
  5. 原 ## 盘里支持这个判断的地方 改名 ## 盘上依据,放在 ## 时间怎么看 之前,只写对象段括号里没引过、而判断需要的依据(Raman 六步、Yoga 表照旧放这里,表格与正文二选一);没有新依据就省掉这一节。
  6. 不设字数上限(D8),以讲清楚为准。约束换成两条:同一件事只说一遍(BUG-1073 的目的保留),不为显得周全写问题用不到的盘面事实。追问轮仍是第一句就答、不重开整份骨架、不重讲上一轮,但不再限 200 字。

D3 人话自检,写进提示词。 把每句话括号里的内容删掉后,一个完全不懂占星的人仍能看懂它在说什么。禁止:

  • 自造格局名、四字概括(「外松内紧」「外近内隔」之类)
  • 「推 / 修 / 收尾」这类大运拟人修辞,「去扮演 X 的象」「别去应 X 的象」
  • 把星名当形容词主语(「土星的冷」「计都的疏」「月亮的照看」)
  • 括号外每段最多 1 个占星术语,首次出现时用白话套住(例:「现在这十年(月亮大运)」)

D4 推断边界: 空宫不单独下结论,要看宫主;只用卡上和查得到的事实。与「不读心」同级写进 Never 清单。

D5 希望纪律保留,换说法。 保留:不顺就说不顺;允许精确应期时转机说到月份,不允许就说这段时间拿来干什么;禁空话五句。删除:「扮演哪个象」「每个人都有能扮演的象」。改成「每次都要说清这段时间能做什么」。

D6 父母卡标角色: parents 卡分成 mother(4 宫、4 宫主、月亮、MK、D12 4 宫)和 father(9 宫、9 宫主、太阳、D12 9 宫;引擎有 PiK 才加,没有不造)。模型直接看到哪条依据属于谁。

D7 形状说明只定义一处。 7 处抄写收敛为 product-voice.ts 导出的常量,其余位置引用它(英文骨架说明可以一句话指过去),以后改口气只改一处。

D8 取消字数上限(产品 2026-10-01 追加:「字数可以不限制,讲清楚最重要」)。 推翻开场 ≤ 400 字、首轮 ≤ 900 字(BUG-1073 D8)、追问轮 ≤ 200 字(BUG-1072)三个数字。所有提示词里的字数上限一律删除(开场、首轮、追问、natalAnswerShapeInstruction、followUpShape 那句「不超过 200 字」、route 用户回合「不超过 400 字 / 全文不超过 900 字」)。保留的是目的:第一句就答、同一件事只说一遍、追问不重开骨架。行动条数(1–3 条)不是字数限制,保留。

4. 硬红线

  1. 不动生时校正的提示词、lexicon、Skill 报告;不动寒暄豁免(BUG-976/977)与追问轮(BUG-1072)的判定逻辑(哪一轮算追问不变,只去掉追问指令里的 200 字)。
  2. 不动 Part B / MEVG / 技法审计表的去向(仍在证据面板,不进正文);不动工具调用流程、数据卡其它领域、route.ts 流程代码(只改那一段指令文字)。
  3. 降级路线保留语义:申报时段不讲宫位、大运、分盘、月份;无出生分钟只讲公开日历、不点个人大运、不写月份。改的只是形状,不是边界。
  4. frontend/src/app/page.tsx、scripts/jyotish_api_server.py 不增长;不升级依赖;不改数据库。
  5. 改既有断言必须写「原值 / 新值 / 原因」三栏;测试总数不低于开工实测。
  6. 新的 Good 示例只能用虚构或示意数据,并标「盘上数据是示意」;不得把本次事故截图的原文当示例写进仓库(Bad 示例只能用改写过的短句)。
  7. skills/ 不需要改(形状不在 Skill 里)。若执行中发现需要改,先停下回报,不要顺手 bump 版本。

5. 任务分解

T1 新形状写进 product-voice.ts(BUG-1132)

  • 删 OPENER SHAPE 整段,新写 ANSWER SHAPE,按 D2 / D3 / D4。降级路线两条按红线 3 改写成新形状的填法。
  • HOPE DISCIPLINE 按 D5 改写;PERSONA 不动。
  • Good / Bad 示例全部换掉。至少要有:① 父母题按对象分段的完整首轮(下附草稿,执行方可润色,不得改结构);② 单对象事业题(不拆段);③ 是非题、追问轮两个现有示例保留;④ Bad 示例:格局名 + 推修 + 扮演象的改写短句,并写明坏在哪。
  • natalSpokenReportContract 改为新的标题顺序(对象段 → 盘上依据 → 时间怎么看 → 这周可以做的一件事),不写字数上限。
  • 验收:productConversationVoice 和 natalSpokenReportContract 里不再出现「扮演」「格局」「谁在推」「外松内紧」;model-facing 字符串里不再出现「≤ 400」「不超过 400 字」「900」「不超过 200 字」这类字数上限(钉住这些数字的既有断言按三栏改);新增单测钉住:按对象分段规则、人话自检句、禁止清单四项、空宫规则、降级路线两条。

父母题 Good 草稿(盘上数据是示意):

你和父母不疏远,但亲近主要落在「为你的前途操心」上,聊心事的时候少。妈妈管得细、操心多;爸爸话少,关心靠做事来表达。

## 你和妈妈
她对你的事很上心,但常把关心说成提醒和安排,所以你们聊工作、聊打算的时候多,聊感受的时候少。(母亲宫主水星落在事业宫;月亮也在事业宫)

## 你和爸爸
他在你心里分量重,是你做事的标杆;他不太会说软话,你们之间更像互相看着对方做事。(太阳在事业宫;9 宫主木星落 12 宫,父亲的心力有一部分在远处或在自己的事上)

## 他们怎么对你
两个人对你都是期望多于宠,要求不少,但出发点是想让你立得住。

## 时间怎么看
现在这十年(月亮大运,到 2034 年 2 月)和妈妈的来往会比以前多,家里的事更容易落到你身上。

## 这周可以做的一件事
- 给妈妈打电话时先问她最近怎样,再说你自己的事。
- 有决定要做时,先听听爸爸的意见,哪怕最后不照做。

T2 同步其余 6 处,收敛为一处定义(D7)

  • index.ts、skill-binding.ts NATAL_REPORT_SKELETON、consultation-thinking-plan.ts(natalAnswerShapeInstruction、骨架说明、REPORT_HEADING.support 改为「盘上依据」)、route.ts 用户回合指令:删去反差 / 推修 / 扮演字样,改为引用 T1 导出的常量或一句与之一致的英文摘要。
  • 思考栏步骤标签:「用盘上的反差回答这个问题」改为「先用一句话回答」;「这周可以扮演哪个象」改为「这周可以做什么」。标题 OPENER_THINKING_TITLE 不变。
  • 验收:git grep -n "扮演\|谁在推\|命名成一个格局\|外松内紧" frontend/src 为 0 行;新增一条合同测试:同一组标题常量在 contract、thinking-plan、route 用户回合三处一致。

T3 父母卡标角色(D6,BUG-1133)

  • consultation-evidence-card.ts:parents 规格加 karakas: ["MK"](引擎 chara_karakas 里有 MK),并把 4 宫 / 月亮 / MK / D12 4 宫归到 mother,9 宫 / 太阳 / D12 9 宫归到 father。PiK 只在引擎表里有时才放进 father,没有时不写,也不记缺口。
  • 数据形状改动要同步卡的类型和渲染(若有),family、children 不动。
  • 验收:golden fixture(来自真实引擎响应,frontend/tests 现有 card fixture 即可)跑出的 parents 段有 mother / father 两个子对象,字段齐全;缺 MK 时写进 gaps。

T4 空宫规则(D4,BUG-1134)

  • 写进 T1 的 Never 清单:「空宫不单独下结论:要说这个宫,就说它的宫主落在哪、什么状态」。
  • 验收:T1 的单测覆盖这一句。

T5 文档与记录

  • frontend/docs/VOICE.md:原则 6 按 D5 改,原则 7 按 D2 / D3 重写(注明 2026-10-01 推翻 09-17 形状),示例表里「外松内紧」三行换成新示例。
  • docs/BUG_HISTORY.md:BUG-1132(形状逼出谜语、多对象被揉成一段)、BUG-1133(父母卡无角色)、BUG-1134(空宫推断无约束);关联 BUG-1070 / 1073,写明「不是复发:1070 只收窄了反差取材,形状本身没改」。
  • CHANGELOG.md 一条;docs/tasks/README.md 索引;docs/tasks/PROGRESS-consult-plain-answer-20261001.md。
  • docs/testing/consult-plain-answer-20261001.md 真机清单(见 T6)。

T6 效果验证

  • 长度副作用核对(必做):去掉字数上限后,查清首轮回答会不会撞上现有的输出 token 上限和 70 s 答题时钟(BUG-1053 的双钟、BUG-1049 截断记录)。只核对、记进进度记录;如果会撞上,回报给 Claude,不要自行调大上限或时钟。
  • 离线(执行方有模型凭据才做,没有就写成环境缺口):用虚构出生资料,对 4 个问题各跑新、旧提示词一次,原文存进进度记录:①「我和父母关系如何」②「我和我妈关系怎么样」③「我的事业接下来怎么走」④「我和伴侣还能走下去吗」。逐条按 D3 禁止清单打勾。
  • 真机清单(给产品,staging,deepseek-v4-flash 与另一个模型各走一遍):
    1. 问「我和父母关系如何,他们怎么对待我」:有 你和妈妈、你和爸爸、他们怎么对你 三段;无格局名、无「推/修/扮演」;没提空宫,或提了也讲了宫主。
    2. 把每段括号外的话念给不懂占星的人听,能复述大意。
    3. 追问「那我爸呢」:第一句就答,只讲爸爸,不重讲整份,没有标题。
    4. 问「我的事业接下来怎么走」:不拆段,开场后直接是依据、时间、行动。
    5. 打「你好」:仍是一句寒暄。
    6. 未填出生分钟的档案问事业:不点个人大运,不写月份。

6. 让步顺序

时间不够时按此顺序保:T1 > T2 > T4 > T3 > T5 > T6 离线部分。T1 + T2 必须同一次交付(只改一处会出现两套形状互相打架)。

7. 开工前置命令

cd /workspace/Jyotisha
git status -sb
git fetch origin --prune
git worktree add -b codex/consult-plain-answer-20261001 .worktrees/consult-plain-answer-20261001 origin/staging
cd .worktrees/consult-plain-answer-20261001/frontend && npm ci
./node_modules/.bin/tsc --noEmit && npm run lint && npm test 2>&1 | tail -20   # 记下测试总数与失败名单作基线
grep -o "BUG-1[0-9]\{3\}" ../docs/BUG_HISTORY.md | sort -u | tail -1

交付门:tsc --noEmit 0 错;npm run lint 0 error;npm test 的失败名单与基线逐条一致;next build 后 / 仍是 Static。推 codex/consult-plain-answer-20261001 后回报,由 Claude 验收后再推 staging。