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

14 KiB
Raw Permalink Blame History

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. 开工前置命令

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。