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

152 lines
16 KiB
Markdown
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.
# 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. 开工前置命令
```bash
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。