From 86cafe6845445e945e15e2159102f239ea4e4b3b Mon Sep 17 00:00:00 2001 From: Jesse_Chen Date: Tue, 6 Oct 2026 12:45:46 +0800 Subject: [PATCH] docs(tasks): brief for conversational first-turn answers (BUG-1244~1245) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8 --- docs/tasks/README.md | 1 + ...-consult-conversational-answer-20261006.md | 138 ++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 docs/tasks/TASK-consult-conversational-answer-20261006.md diff --git a/docs/tasks/README.md b/docs/tasks/README.md index 443033ff..12afa3f3 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -424,3 +424,4 @@ | `TASK-consult-latency-quickwins-20261005.md` | `PROGRESS-consult-latency-quickwins-20261005.md` | 普通对话耗时两项快修:咨询链校正闸不再同步白等 VedAstro 官方快照子进程(每域约 4 s,复用顶层缓存 + 负缓存,不推翻 BUG-301);补分段计时(第 0/1 步耗时、推理 token、分类耗时进日志与 usage)。推理强度/精简说明待模型 key 另单(BUG-1231、BUG-1232) | 已验收(Claude 10-05 Linux:Python 62 / 前端 24 失败与基线逐名相同,Static、gzip 0%;装 SDK 实测每领域 4.47→1.66 s,剩余 1.33 s 是保留的顶层前台等待;/admin/usage 真机欠) | 分支 `codex/consult-latency-quickwins-20261005` | | `TASK-rectification-nadi-seconds-research-20261005.md` | `PROGRESS-rectification-nadi-seconds-research-20261005.md` | **「纳迪秒级校准」可证伪检验(离线)**:竞品宣传「问前事到天 → 秒级」。本仓主链只用三层小运,Sookshma / Prana 与 D150 从未进评价集;v5 真值 52/77 是整 5 分钟(秒级无真值可对)。N0 五层小运 + D150 底座(前三层与主链对账 0 差)、N1 拟合率 vs 安慰剂日期(核心)、N2 留一件预测、N3 六题后区间内再细分能否提头名、N4 岁差 / 坐标 / 时间扰动的噪声地板、N5 D150 结构层(原文比对 blocked)、N6 结论 + 对外口径草稿。规则先登记再跑;不改生产代码;不得重调 BUG-1091 已关的权重 | 已验收(Claude 10-05:N1/N2/N3/N5 不过门、N4 触发文案禁令;Linux 复跑内容 0 差,结果改 LF;补 Lahiri/KP/True Chitra 对照,月亮差 0.83′ 第 5 层仍换 94%)→ 不立实现单 | 分支 `codex/rectification-nadi-seconds-research-20261005`(BUG-1240 `closed_by_design`) | | `TASK-rectification-delivery-dup-adopt-20261006.md` | `PROGRESS-rectification-delivery-dup-adopt-20261006.md` | **校正交付一次两段回答 + 点「改用…盘解读」被拒 `adoption_not_allowed`**(10-06 真机):收尾补位按文字子串防重,遇采用旁白 Agent 改写版失效(BUG-1153 复发);accept/GET 调 `decideFromDossier` 不带出生日期,未成年探针复活致判定与出卡时相反(BUG-598/680 同族);卡片按钮不看公开 can_adopt、拒绝码直出英文。不放宽采用门,判定入参统一 + 结构防重 + 按钮判据 + 中文提示(BUG-1241~1243) | 待领取 | — | +| `TASK-consult-conversational-answer-20261006.md` | `PROGRESS-consult-conversational-answer-20261006.md` | **普通对话首轮去汇报骨架,改成聊天**(10-06 产品反馈「像机器在汇报」):首轮取消全部 `##`(三个固定节 + 按对象标题,多人改分段落点名)、行动不强制(盘上有具体指向才顺口一句,问「怎么办」再展开)、首轮三到六段;示范删可抄的行动句(实测被逐字照抄);思考栏去「这周可以做什么」。推翻 10-01 D2 与 D8 首轮部分(BUG-1244~1245) | 待领取 | — | diff --git a/docs/tasks/TASK-consult-conversational-answer-20261006.md b/docs/tasks/TASK-consult-conversational-answer-20261006.md new file mode 100644 index 00000000..b32d2c5e --- /dev/null +++ b/docs/tasks/TASK-consult-conversational-answer-20261006.md @@ -0,0 +1,138 @@ +# 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。