Files
Jyotisha/docs/tasks/TASK-consult-conversational-answer-20261006.md
T

139 lines
14 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-06)
- 基线:`origin/staging` @ `65b61ed5`(形状最近一次改动:`7806c72f` / `6a02e5e9`)
- 执行分支:`codex/consult-conversational-answer-20261006`,worktree `.worktrees/consult-conversational-answer-20261006`
- BUG 编号起点:**BUG-1244**(`docs/BUG_HISTORY.md` 现最大 1240,1241~1243 已被 `TASK-rectification-delivery-dup-adopt-20261006` 预留;开工时再核对一次)
- 串行:本单只改普通对话形状,与同日校正单(BUG-1241~1243)不碰同一文件;开工前 `git log origin/staging -3 -- frontend/src/mastra/product-voice.ts frontend/src/lib/consultation-thinking-plan.ts`,若有新提交先 rebase 再动手。
## 1. 事故实证
产品 10-06 真机(普通对话,事业 / 财富类首轮)读到的结尾:
```
## 这周可以做的一件事
- 把这周口头答应的事各补一条书面确认,特别是涉及钱、时间和谁负责哪一部分的。
- 挑一件你在做、但一直没名分的事,写清它占多少时间、带来多少钱,按这个数去谈一次条件,先别谈头衔。
- 记一张两栏清单:这周新来的机会,一栏只算接触,一栏有具体条件;月底只看第二栏。
```
产品原话:「这种固定的输出能不能去掉,能不能做成人和 agent 平常聊天的那种;现在输出的答案格式有些固定,语气不像一个人,像一个机器在做汇报。」
源码(行号按符号定位,以基线为准):
| 现象 | 位置 |
| --- | --- |
| 首轮固定写「开场 → 按对象 H2 → `## 盘上依据` → `## 时间怎么看` → `## 这周可以做的一件事`」,「骨架不可省略」 | `frontend/src/lib/consultation-thinking-plan.ts` 的 `REPORT_HEADING`、`NATAL_ANSWER_SHAPE_SUMMARY`、`natalAnswerShapeBody()`、`followUpAnswerShapeInstruction()` 末两句;`frontend/src/mastra/product-voice.ts` 的 `ANSWER SHAPE` 第 4 条与 `natalSpokenReportContract` 第 3–5 条;`frontend/src/mastra/skill-binding.ts` 的 `NATAL_REPORT_SKELETON`;`frontend/src/mastra/index.ts` 引 `NATAL_ANSWER_SHAPE_SUMMARY` / `consultationSpokenHeadingRule("natal")`;`frontend/src/app/api/consult/route.ts` 里 `legacyNatalInstruction`(「骨架不可省略」) |
| 第一条行动和提示词示范逐字相同 | `product-voice.ts` 单对象事业题 Good 示范:「口头答应的事,补一份书面确认。」 |
| 每轮都要交行动清单 | `product-voice.ts` PERSONA 末句「每次收尾只给一到三件能做的事」;HOPE DISCIPLINE「每次都要说清这段时间能做什么」 |
| 并列点必须写成加粗标签列表 | `consultationSpokenHeadingRule("natal")` 第二句(「must be Markdown bullet lists. Bold a short label…」) |
| 首轮写成长篇 | 10-01 D8 取消字数上限(`TASK-consult-plain-answer-20261001`) |
| 思考栏有「这周可以做什么」一节,进度靠正文 H2 推进 | `natalConsultationThinkingPlan()` 的 `action` 节;`applyThinkingSectionProgress()` 按 `^## ` 判断完成 |
| 申报时段路线开头固定 `## 先回答你的问题` | `WINDOW_OPEN_HEADING` + `consultationSpokenHeadingRule("window")` |
追问轮(`followUpAnswerShapeInstruction`)已经是无标题、无行动清单的直答,不是本次问题来源;但它「换领域时回到完整形状:……二级标题」那句要跟着改。
## 2. 根因
1. **形状是报告模板**:首轮被规定成固定章节,每节有固定名字和固定位置,读起来就是一份汇报。09-27(BUG-1073)和 10-01(BUG-1132)两轮都在这个骨架里调内容,骨架本身没动过。
2. **示范带了可抄的具体内容**:Good 示范里写了真实的行动句,模型照抄或照着改写,所以不同的人收到的行动都像一个模子出来的(「书面确认」「两栏清单」)。
3. **行动是硬性必交项**:PERSONA 和第 5 条合起来要求每次首轮都交一到三条,盘上没有指向具体事情时,模型只能编一些放谁身上都成立的职场建议。
4. **加粗标签列表 + 不限长度**放大了汇报感。
## 3. 决策记录(产品 2026-10-06 授权)
产品当面选择(三问均选推荐项):
- **D1 去掉全部小标题。** 首轮正文不写任何 `##`:三个固定标题(盘上依据 / 时间怎么看 / 这周可以做的一件事)取消,**按对象分段的标题也取消**。问到几个人(妈妈、爸爸……)时仍然分开说,改成分段落、段首用人话点名(「你妈妈这边……」「爸爸那边……」),不揉成一段。申报时段路线的 `## 先回答你的问题` 一并取消。
- **推翻**:10-01 `TASK-consult-plain-answer-20261001` D2(按对象 H2 分段 + 三个固定标题);09-27 `TASK-consult-answer-the-question-20260927` D8 中「行动只在最后一节出现一次」的标题部分;VOICE.md 第七条原则与 §「首轮只说一遍」里的标题骨架。BUG-1073「同一件事只说一遍」**保留**。
- **D2 行动建议不强制。** 只有盘上确实指向一件和问题相关的具体事情时,才在话里顺口说一句(不列清单、不放固定位置、全篇最多一处);用户问「我该怎么办 / 怎么做」时再展开,那一轮可以给几条。
- **推翻**:PERSONA「每次收尾只给一到三件能做的事」;`ANSWER SHAPE` 第 4 条;`natalSpokenReportContract` 第 5 条。
- HOPE DISCIPLINE **保留其意**:不顺就说不顺、说清这段时间拿来干什么、不编月份、禁空话清单——但用一句话说进正文,不变成行动清单。
- **D3 首轮写几段话,细节等追问。** 首轮讲清结论、最关键的一两条依据、相关时有时间,通常三到六段;不为显得周全把各方面写满。不设硬截断,不改输出 token 上限和答题时钟。
- **推翻**:10-01 D8「不限字数,讲清楚为准」的首轮部分(追问轮仍「讲清楚为准」)。
- **D4(架构,Claude 定)示范只演示口气,不带可抄的内容。** Good 示范里不得出现任何具体行动句或生活建议;依据一律用占位写法。
- **D5(架构,Claude 定)并列点不再强制列表。** 普通对话首轮默认写段落;只有用户要求列举、或确有三个以上候选时间窗时才用列表,且不用「加粗标签 + 一句」的格式。今日运势(daily)形状本单不动。
- **D6(架构,Claude 定)括号依据收敛**:每段最多一处括号依据;10-01 的「人话自检」(删掉括号仍能读懂)、禁格局名、禁拟人大运、禁星名当形容词、空宫规则、名词规则、受冲规则(`AFFLICTION_RANGE_RULE`)、事业不猜行业(`CAREER_FIELD_ASK_RULE`)、「请用户说实际情况全篇最多一处」**全部保留**,只是不再依附标题。
- **不变**:工具每轮照调;技法审计表 / 统一参数仍在证据面板,不进正文;纯寒暄快路径;追问轮形状;Part B、MEVG、置信度边界;今日运势与「深入看今日」的骨架;校正 Agent 口气。
## 4. 硬红线
1. 不改证据卡、工具调用、模型选择、输出 token 上限、答题时钟、计费。
2. 不改 `frontend/src/app/(app)/page.tsx`(冻结文件);不改数据库与迁移。
3. 形状仍只定义一处:`consultation-thinking-plan.ts` 里的一组常量 / 函数,其余提示词引用它,不再各抄一份。
4. 不得用正则判断用户是否在问「怎么办」(沿用 BUG-976/977 口径),这交给模型阅读。
5. 改既有断言必须写「原值 / 新值 / 原因」三栏;测试总数不得低于基线(删掉的标题断言要换成新形状的断言,不是直接删)。
6. 历史消息里已有的 `##` 标题照常渲染;`shortenAnswerHeading` 等兼容旧消息的代码保留。
## 5. 任务分解
### T1 新形状(BUG-1244)
改 `consultation-thinking-plan.ts` 的单一定义,并让 `product-voice.ts`、`skill-binding.ts`、`index.ts`、`route.ts` 引用它:
- 删除 `REPORT_HEADING` 在提示词里的用法;`NATAL_ANSWER_SHAPE_SUMMARY` / `natalAnswerShapeBody()` 改写为 D1–D3、D5、D6 的意思:无标题、多对象分段落段首点名、行动按 D2、首轮三到六段、段落优先、每段最多一处括号。
- `product-voice.ts`:PERSONA 末句改成 D2 的说法;`ANSWER SHAPE` 第 2–4 条按 D1/D2 重写;`natalSpokenReportContract` 的 1–5 条改成无标题版本,删「骨架不可省略」。
- `skill-binding.ts` `NATAL_REPORT_SKELETON`:Level 2 模板只作为依据来源;六步宫位 / Yoga 表不再「放在 ## 盘上依据 下」,正文只在括号里引用需要的那一两条。
- `route.ts` `legacyNatalInstruction`:删「骨架不可省略」。
- `followUpAnswerShapeInstruction()`:换领域或要求完整看时「回到首轮形状」,不再列二级标题。
- `consultationSpokenHeadingRule("natal")`:删强制列表那句,换成 D5;`"window"`:删 `## 先回答你的问题` 要求(`WINDOW_OPEN_HEADING` 常量若只剩思考栏在用可保留作思考栏标题)。
- 新增一条明确禁令:首轮正文不写 `##`、不写「这周可以做」「盘上依据」「时间怎么看」这类节名,也不用加粗短语冒充小标题。
**验收**:`git grep -n "这周可以做的一件事\|骨架不可省略" frontend/src` 只允许出现在兼容旧消息的代码与注释里(逐条列进进度记录);`git grep -n "REPORT_HEADING" frontend/src` 不出现在任何提示词字符串拼接中;新增合同测试断言首轮指令不含 `##` 节名要求、含「多对象分段落」「行动不强制」「三到六段」三层意思。
### T2 示范改写(BUG-1245)
- `product-voice.ts` 里所有 Good 示范:去掉 `##`,改成段落;删除全部具体行动句(含「口头答应的事,补一份书面确认」「身体的小毛病这周就去看」「给妈妈打电话时先问她最近怎样」);父母示范改为分段落、段首点名。
- 新增一条 Bad 示范:带三个固定标题 + 三条行动列表的汇报体(只写结构示意,括注为什么不行)。
- 新增合同测试:提示词全文不含上面三句旧行动示范,也不含「## 这周」。
**验收**:上述测试通过;示范里没有任何一句可以原样出现在真实回答里的生活建议。
### T3 思考栏去掉对标题的依赖
- `natalConsultationThinkingPlan()`:删 `action` 节;`support` / `timing` 节去掉对正文 H2 的依赖(`heading` 字段若为 schema 必填,就让首轮进度按现有「无标题 → 结束时全部完成」路径走)。
- `applyThinkingSectionProgress()`:正文没有 H2 时,不得出现某一节一直卡在 active、结算后仍未完成;写一条回归测试覆盖「整篇无 H2 的首轮」流式中与结算后两个状态。
- 写作行:首轮无标题时走 `write-open`「组织回答」那一条(`consultation-run-timeline.ts` 已有该分支,补测试即可)。
**验收**:`consultation-thinking-plan.test.ts`、`consultation-run-timeline.test.ts` 改动三栏说明齐全;思考栏不再出现「这周可以做什么」。
### T4 文档与记录
- `frontend/docs/VOICE.md`:第七条原则、「首轮只说一遍」一节、对照表那一行改成新形状,写明 10-06 推翻 10-01 D2 / D8 首轮部分及原因。
- `frontend/DESIGN.md` 写作行那段(现写「首轮依次是……这周可以做的一件事」)改成首轮只有「组织回答」。
- `docs/BUG_HISTORY.md`:BUG-1244(首轮汇报骨架,关联 BUG-1073 / 1132)、BUG-1245(示范行动被照抄);状态在部署 + 真机前写 `fixed-pending-verify` 一类,不写 `resolved`。
- `CHANGELOG.md`:一句话标题 + 要点;Skill 版本不 bump(未改 skill)。
- `docs/testing/consult-conversational-answer-20261006.md`:真机清单(见 T5)。
- `docs/tasks/README.md` 状态板这一行改状态。
### T5 效果验证
- **长度核对**:说明新形状下首轮典型长度的估计(有模型凭据就实测),记进进度记录。
- **离线**(有模型凭据才做,没有写成环境缺口):用公开名人 golden 卡或虚构资料,新旧提示词各跑:①「我和父母关系如何」②「我的事业接下来怎么走」③「我今年财运怎么样」④「我和伴侣还能走下去吗」。逐条检查:无 `##`、无行动清单、行动最多一句、段落数、有无照抄示范。原文存进度记录。
- **真机清单**(给产品,staging,deepseek-v4-flash 与另一个模型各走一遍):
1. 问「我今年财运怎么样」:没有任何小标题,没有「这周可以做的一件事」,读起来是几段话;如果提了建议,只有一句、嵌在话里。
2. 问「我和父母关系如何」:妈妈、爸爸分开两段说,段首点名,没有标题。
3. 同一个问题换个账号或换个人再问:建议(如有)不再是「书面确认 / 两栏清单」这类同一模子的句子。
4. 追问「那我该怎么做」:这一轮可以给几条具体建议,第一句就答。
5. 追问「那我爸呢」:只讲爸爸,第一句就答,没有标题。
6. 打「你好」:仍是一句寒暄。
7. 未填出生分钟的档案问事业:不点个人大运、不写月份,也没有标题。
8. 思考栏:首轮不出现「这周可以做什么」,结束后没有卡住的转圈项。
## 6. 让步顺序
T1 + T2 必须同一次交付(只改一边会出现新旧两套形状打架)> T3 > T4 > T5 离线部分。
## 7. 开工前置命令
```bash
cd /workspace/Jyotisha
git status -sb
git fetch origin --prune
git worktree add -b codex/consult-conversational-answer-20261006 .worktrees/consult-conversational-answer-20261006 origin/staging
cd .worktrees/consult-conversational-answer-20261006/frontend && npm ci
./node_modules/.bin/tsc --noEmit && npm run lint && npm test 2>&1 | tail -20 # 记下测试总数与失败名单作基线(Node 22)
grep -o "BUG-1[0-9]\{3\}" ../docs/BUG_HISTORY.md | sort -n -t- -k2 | tail -1
```
交付门:`tsc --noEmit` 0 错;`npm run lint` 0 error;`npm test` 失败名单与基线逐条一致、总数不少于基线;`next build` 后 `/` 仍 Static、首屏 gzip ±2%。推 `codex/consult-conversational-answer-20261006` 后回报,由 Claude 验收后再推 staging。