docs(consult): records for answer-the-question — BUG-1070~1073, VOICE/DESIGN, changelog, device checklist, progress

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
This commit is contained in:
Jesse_Chen
2026-09-27 23:31:44 +08:00
co-authored by Claude Fable 5.1
parent 9a42333a55
commit 2b435f11d0
8 changed files with 186 additions and 8 deletions
+8
View File
@@ -1,5 +1,13 @@
# 印度占星 Skill 更新日志 # 印度占星 Skill 更新日志
## 2026-09-27 — 普通对话回答问的那句话:不揣测动机、追问轮直接答、首轮只说一遍(待验收)
- 回答不再替你说你「其实想问什么」「要的是什么」「是否需要什么」,也不替父母、伴侣说他们的心思;反差只写盘上的结构(哪颗星、哪个宫、哪段大运),问的是别人时写那个人在你盘上对应的宫位与代表星。是非题第一句就答「是」「不是」或「看情况」,再给依据。删掉了让模型先改写问题再回答的那条规则(BUG-1070)。
- 同一个会话里第二个问题起是追问轮:200 字左右直接回答,不再重开 400 字开场加整套标题,不重述上一轮已经说过的盘面;明确换领域或说「完整看一下」才回到完整形状。追问轮由「这个会话已经有过回答」判定,不猜问句(BUG-1071)。
- 首轮解读只说一遍:开场不带行动清单,正文删掉「先回答你的问题」这一节,只有「盘里支持这个判断的地方」(只写开场没说过的依据)、「时间怎么看」、「这周可以做的一件事」(行动只在这里出现一次)三节,全文目标 900 字内(BUG-1073)。
- 步骤栏第一节改叫「先回答你问的这件事」(BUG-1072)。
- 排盘工具仍每轮调用,扣点、结算不变。Skill 版本不 bump(Skill 文本未改)。不改数据库。
## 2026-09-27 — 双重过运的本命 + 九分盘跨层条目按「同一宫 / 同一宫主」配对(待验收) ## 2026-09-27 — 双重过运的本命 + 九分盘跨层条目按「同一宫 / 同一宫主」配对(待验收)
- 双重过运里「木星在本命盘、土星在九分盘(或反过来)同时激活同一件事」的跨层条目,以前按目标名字里的数字配对:九分盘名字都带「D9」的 9,于是本命第 N 宫永远配不上九分盘第 N 宫,查 9 宫时又会和不相干的九分盘目标配上(BUG-1061)。现在按目标的含义配对:本命第 N 宫配九分盘第 N 宫;第 N 宫主配它在九分盘的星座(及它恰好也是九分盘第 N 宫主时的那一项),与以前相同。 - 双重过运里「木星在本命盘、土星在九分盘(或反过来)同时激活同一件事」的跨层条目,以前按目标名字里的数字配对:九分盘名字都带「D9」的 9,于是本命第 N 宫永远配不上九分盘第 N 宫,查 9 宫时又会和不相干的九分盘目标配上(BUG-1061)。现在按目标的含义配对:本命第 N 宫配九分盘第 N 宫;第 N 宫主配它在九分盘的星座(及它恰好也是九分盘第 N 宫主时的那一项),与以前相同。
+60
View File
@@ -14371,3 +14371,63 @@
- 相关记录:BUG-1031、BUG-1062 - 相关记录:BUG-1031、BUG-1062
- 复发自:无 - 复发自:无
- 修复版本:待定 - 修复版本:待定
## BUG-1070 | 普通对话替用户和当事人说心思:反差写到人身上、是非题被改写成「你是否需要」
- 状态:fixed_pending_acceptance(代码与提示词已改、假模型与合同测试通过;真实模型输出待部署后按 `docs/testing/consult-answer-the-question-20260927.md` 复核)
- 首次发现 / 最近更新:2026-09-27 / 2026-09-27
- 影响面:普通咨询(本命 / 无出生分钟 / 申报时段共用的口气层 `productConversationVoice`)。
- 现象:真机首轮父母题的正文出现「她问的是结果,你要的是被听」「你自己这一端本来也是收着的」;产品转述另一轮「我问是不是 X,他答你是否需要 Y」。用户的感受是「他在揣测我为什么这样问」。
- 触发条件:问的是别人(父母、伴侣)或一句是非题;模型按开场形状找「表面 / 底下」的反差。
- 根因:三处提示词合力。① OPENER SHAPE 第 1 步「表面 A,底下 B」没有限定 A、B 必须是盘面结构,问人时最省事的反差就是当事人的行为和动机;② PERSONA 段「问题含糊时……写『这句我按『……』理解了,不对你纠正我』」鼓励先改写问题再答,「是不是 X」被改写成「你是否需要 Y」;③ 合同没有任何一条禁止替用户陈述动机 / 需求 / 感受。
- 修复(`frontend/src/mastra/product-voice.ts`):反差的 A、B 限定为星 / 宫 / 大运 / 分盘,问人时写那个人在盘上对应的宫位与代表星;删「这句我按『……』理解了」,改成只有两种实质不同读法时才写一句「我按 A 答」、单义问题直接答;新增「不揣测」段(六个禁写短语 + 禁止替用户或当事人陈述动机 / 需求 / 感受)与是非题答法(第一句是 / 不是 / 看情况,第二句盘上依据);合同 Never 段加「不写人要什么,写盘把人放在哪」;Good / Bad 各加一组虚构盘面的是非题样例。`frontend/docs/VOICE.md` 同步。
- 验证:`frontend/tests/consultation-voice-contract.test.ts` 新增「the voice answers the sentence asked」用例(六个禁写短语、反差限盘面、是非题答法、样例);原「这句我按『……』理解了」断言按三栏改成 doesNotMatch。tsc 0、lint 0 error。
- 防复发:禁写短语与反差限定由 voice 合同测试钉住;真机清单第 2 条检查追问的第一句。
- 相关记录:BUG-1071、BUG-1072、BUG-1073;口气定稿 `84b293fb`(TASK-agent-voice)。
- 复发自:无
- 修复版本:codex/consult-answer-the-question-20260927(待验收推 staging)
## BUG-1071 | 追问轮重开 400 字开场 + 整套标题:一句是非题得到整份领域解读
- 状态:fixed_pending_acceptance
- 首次发现 / 最近更新:2026-09-27 / 2026-09-27
- 影响面:普通咨询本命路径(agentic 与 grounded 兜底两条),`daily_starlanguage` 入口不受影响。
- 现象:会话里第二个问题起(「那我爸呢」「我妈是不是不太在意我」),回答仍是口语开场加四个二级标题的完整解读,重述上一轮已经写过的宫位;用户感受是「太宽泛」。
- 触发条件:同一会话已有一轮本命解读后的任何追问。
- 根因:`jyotishInstructions`「Call run-jyotish-consultation before answering every turn, including short follow-ups」、`natalSpokenReportContract` 末句「One natal … question still uses the opener-plus-skeleton above」、每轮用户轮的 `natalAnswerShapeInstruction()`「一次写完这四个二级标题」三处都不区分首轮与追问轮。
- 修复:`consultation-thinking-plan.ts` 新增 `followUpAnswerShapeInstruction()`(≤ 200 字、第一句答问的那句、是非题先答是 / 不是、最多三处盘面事实、不写二级标题、不写行动清单、不重述上一轮、不解释用户为什么问;明确换领域或要求完整看才回首轮形状)、`hasPriorAssistantAnswer(history)`(存量历史里已有非空 assistant 正文即追问轮,不看问句字面)与 `natalUserTurnShape()`(daily 不变 / 追问 / 首轮);`route.ts` 用户轮按它切指令,grounded 兜底同样切换(同一份 `legacyNatalInstruction`);思考栏与工具上下文带 `followUpTurn`。合同末句改为「首轮用开场 + 骨架,追问轮按用户轮里的指令」。工具仍每轮调用,扣点与结算不变(D7)。
- 验证:新文件 `frontend/tests/consult-answer-the-question-20260927.test.ts`:真实 Agent + 记录提示词的假模型 + 公开盘 golden,追问轮 → 写作步的提示词含「这是追问轮 / 不超过 200 字」、不含三标题指令,工具跑 1 次、模型 2 次,无标题短正文(< 160 字)整段放出并结算扣点 1 次;首轮对照用例保持开场 + 三标题。`consultation-thinking-plan.test.ts` 覆盖 `hasPriorAssistantAnswer` / `natalUserTurnShape` 四种情况(空历史、只有用户轮、空白 assistant、有回答;daily 不受历史影响)。
- 防复发:D6 硬红线——追问判定只用历史事实,禁正则识别意图(沿用 BUG-976/977);route 合同测试断言 `natalUserTurnShape({ entrypoint: consultEntrypoint, history })` 与 `followUpTurn` 的接线。
- 相关记录:BUG-1070、BUG-1073、BUG-1053(答案由看过工具结果的步写)、BUG-976/977(禁正则)。
- 复发自:无
- 修复版本:codex/consult-answer-the-question-20260927(待验收推 staging)
## BUG-1072 | 步骤栏第一节写着「先抓住你真正在问的事」
- 状态:fixed_pending_acceptance
- 首次发现 / 最近更新:2026-09-27 / 2026-09-27
- 影响面:普通咨询步骤栏(思考计划第一节 `title`,经 run timeline 显示)。
- 现象:用户每轮先看到系统在找他「真正在问的事」,再看到答案换了题(BUG-1070),两者互相印证成「揣测」。
- 触发条件:任何本命咨询轮。
- 根因:`natalConsultationThinkingPlan` 第一节 `title: "先抓住你真正在问的事"`。
- 修复:改为 `OPENER_THINKING_TITLE = "先回答你问的这件事"`;首轮步骤「用盘上的反差回答这个问题」,追问轮步骤「直接回答这句话」。该节没有自己的正文标题,heading 与「盘里支持这个判断的地方」共用(第一个正文 H2 出现即收口)。`frontend/DESIGN.md` 同步。
- 验证:`consultation-run-timeline.test.ts`(三栏)、`consultation-thinking-plan.test.ts`、`consultation-agentic-runtime.test.ts`(三栏,改断 title)。
- 防复发:合同测试断言 JSON 化的计划里不含「先抓住你真正在问的事」。
- 相关记录:BUG-1070、BUG-1071
- 复发自:无
- 修复版本:codex/consult-answer-the-question-20260927(待验收推 staging)
## BUG-1073 | 首轮解读同一判断写三遍、三条行动给两遍(约 1,500 字)
- 状态:fixed_pending_acceptance
- 首次发现 / 最近更新:2026-09-27 / 2026-09-27
- 影响面:普通咨询本命首轮(agentic 与 grounded 兜底)。
- 现象:真机首轮父母题:口语开场(判断 + 三条行动)→ `## 先回答你的问题` 再讲一遍母亲 / 父亲两头 → `## 盘里支持这个判断的地方` 六行表第三次列出 → `## 这周可以做的一件事` 三条行动与开场几乎原句重复。全文约 1,500 字,用户感受是「说了很多没多说什么」。
- 触发条件:任何本命首轮。
- 根因:2026-09-17 口气定稿(`84b293fb`)把「口语开场(含三条行动)」叠在原有四标题骨架之上,没有从骨架里减掉重合部分:`natalSpokenReportContract` 要求开场后再写 `## 先回答你的问题`,`natalAnswerShapeInstruction()`「先用口语回答问题;然后一次写完这四个二级标题」,开场结尾三条行动与最后一节三条行动是同一份清单。
- 修复(产品 2026-09-27 拍板 D8):`REPORT_HEADING` 去掉 `question`,正文只剩「盘里支持这个判断的地方 / 时间怎么看 / 这周可以做的一件事」;开场不带行动,行动只在最后一节出现一次;依据节只写开场没说过的,表格与正文二选一;首轮全文 ≤ 900 字。四处同步:`natalSpokenReportContract`、`natalAnswerShapeInstruction()`、`skill-binding.ts` 的 `NATAL_REPORT_SKELETON`、`index.ts` 的写作句;`route.ts` grounded 兜底两处内联指令合并为一份 `legacyNatalInstruction`;`consultationContinuePrompt` 与 `consultationSpokenHeadingRule("natal")` 的标题清单同步。申报窗口模式的 `## 先回答你的问题` 保留为 `WINDOW_OPEN_HEADING`(不在本单范围)。`shortenAnswerHeading` 的旧缩写保留给历史消息。
- 验证:`consultation-thinking-plan.test.ts`(标题表、拆分、进度、续写、指令,三栏)、`consultation-voice-contract.test.ts`(合同三标题、开场无行动、≤ 900 字、只引支撑字段,三栏)、五个用 `## 先回答你的问题` 做正文夹具的测试改成从开场直接到「盘里支持」(三栏)。
- 防复发:voice 合同测试 `doesNotMatch(/## 先回答你的问题/)`;`Object.values(REPORT_HEADING).length === 3`。
- 相关记录:BUG-1070、BUG-1071、BUG-1072;`84b293fb`。
- 复发自:无
- 修复版本:codex/consult-answer-the-question-20260927(待验收推 staging)
@@ -0,0 +1,76 @@
# PROGRESS · 普通对话回答问的那句话(2026-09-27)
任务书:`TASK-consult-answer-the-question-20260927.md`。执行方:Claude 子代理(产品要求直接执行)。分支 `codex/consult-answer-the-question-20260927`,工作树 `.worktrees/consult-answer-the-question-20260927`,未推送。
## 基线
- `origin/staging` = `2ce3c216`(任务书含首轮原文与 R6 的那一版)。D8 已由产品确认,T6 已做。
- 开工实测(Node 22.14,`npm test`):4192 条 / pass 4096 / fail 66(TAP 行 24 条 `not ok`,均为无 Docker 的 DB / 部署套件)/ skipped 30。失败清单存 scratchpad `baseline-fails.txt`。
- BUG 编号:`BUG_HISTORY.md` 最大 1063,任务书预留至 1069,本单从 1070 起。
## 做了什么
| 任务 | 改动 | 落点 |
| --- | --- | --- |
| T1 口气层 | 反差的 A、B 限定为盘面结构,问人时写宫位与代表星;删「这句我按『……』理解了」改成两种读法才写「我按 A 答」;新增「不揣测」段(六个禁写短语 + 禁替用户 / 当事人陈述动机需求感受);是非题答法;Good / Bad 是非题样例(虚构盘面);合同 Never 段加「写盘把人放在哪,不写人要什么」 | `frontend/src/mastra/product-voice.ts`、`frontend/docs/VOICE.md` |
| T6 首轮只说一遍(D8) | `REPORT_HEADING` 去掉 `question`(申报窗口保留 `WINDOW_OPEN_HEADING`);开场不带行动;正文三标题;依据节只写开场没说过的、表格与正文二选一;行动只在最后一节;首轮 ≤ 900 字。四处同步:`natalSpokenReportContract`、`natalAnswerShapeInstruction()`、`NATAL_REPORT_SKELETON`、`index.ts` 写作句;`route.ts` grounded 兜底两处内联指令合并为一份 `legacyNatalInstruction`;续写提示与 `consultationSpokenHeadingRule("natal")` 同步 | `consultation-thinking-plan.ts`、`product-voice.ts`、`skill-binding.ts`、`index.ts`、`route.ts` |
| T2 追问轮 | `followUpAnswerShapeInstruction()`、`hasPriorAssistantAnswer(history)`、`natalUserTurnShape({ entrypoint, history })`;route 用户轮按它切;grounded 兜底同样切;agent context 与思考计划带 `followUpTurn`。工具仍每轮调用 | `consultation-thinking-plan.ts`、`route.ts`、`consultation-tools.ts` |
| T3 清单是核对项 | `index.ts` 加「The checklist is a list of things to check, not a list of paragraphs to write…」;合同第 2 条加「cite only the fields that support this judgment, and only what the opener did not already say」 | `index.ts`、`product-voice.ts` |
| T4 步骤栏 | 第一节标题 `OPENER_THINKING_TITLE = "先回答你问的这件事"`;首轮步骤「用盘上的反差回答这个问题」,追问轮「直接回答这句话」;该节 heading 与「盘里支持」共用 | `consultation-thinking-plan.ts`、`frontend/DESIGN.md` |
| T5 记录 | BUG-1070~1073(`fixed_pending_acceptance`)、CHANGELOG 一条(Skill 不 bump)、真机清单、本文件、README 索引 | `docs/**`、`CHANGELOG.md` |
### 思考栏节的 heading 选择(任务书允许执行方自选)
开场节保留为思考栏第一节,`heading` 指向第一个正文 H2(「盘里支持这个判断的地方」):第一个正文 H2 出现时开场节与依据节一起收口;追问轮整篇无 H2,四节在结算时收口(`applyThinkingSectionProgress` 的 `settled` 分支已有)。没有删节,`thinkPlanSteps` 的 id 序列不变,改动量最小。
## 测试
新增:`frontend/tests/consult-answer-the-question-20260927.test.ts`(2 条:追问轮真实 Agent + 记录提示词假模型 + 公开盘 golden:写作步提示词含追问形状、工具 1 次 / 模型 2 次、无标题短正文 < 160 字整段放出并扣点一次、思考栏步骤「直接回答这句话」;首轮对照);`consultation-thinking-plan.test.ts` +1(追问指令、`hasPriorAssistantAnswer` 四种历史、`natalUserTurnShape` 三种入口、追问计划);`consultation-voice-contract.test.ts` +1(禁写短语、反差限盘面、是非题答法、样例、行动位置)。测试支撑 `consult-natal-agent-test-support.ts` 加 `instruction` / `followUpTurn` 两个可选项(默认值不变)。
### 改既有断言(原值 / 新值 / 原因,注释也写在测试里)
| 文件 | 原值 | 新值 | 原因 |
| --- | --- | --- | --- |
| `consultation-voice-contract.test.ts` | `match(voice, /## 先回答你的问题/)` | `doesNotMatch` + 三标题顺序、开场无行动、Say each thing once、≤ 900 字、只引支撑字段、行动只在最后一节、合同末句改追问轮 | D8 / BUG-1073 |
| `consultation-voice-contract.test.ts` | `match(voice, /这句我按『……』理解了,不对你纠正我/)` | `doesNotMatch` + 「两种实质不同的读法时才写『我按 A 答』」「单义的问题直接答,不改写它」 | D4 / BUG-1070 |
| `consultation-thinking-plan.test.ts` | 四节 heading `[question, support, timing, action]` | `[support, support, timing, action]`,首节 title「先回答你问的这件事」,不含「先抓住你真正在问的事」 | D5 / D8 |
| `consultation-thinking-plan.test.ts` | window heading = `REPORT_HEADING.question` | `WINDOW_OPEN_HEADING`(字面不变) | 正文标题表删掉 question,申报窗口不在本单范围 |
| `consultation-thinking-plan.test.ts` | 拆分测试四标题、首节切片含「外松内紧」 | 三标题、开场留在 preamble | D8 |
| `consultation-thinking-plan.test.ts` | 写出 `## 先回答你的问题` → 首节 done、第二节 active | 无标题时首节 active;写出 `## 盘里支持` 后前两节 done、时间节 active | 开场与依据节共用 heading |
| `consultation-thinking-plan.test.ts` | 指令含四个标题 | 三个标题 + 开场不写行动、只在这里出现一次、≤ 900 字、不写「先回答你的问题」、反差只写盘上 | D8 |
| `consultation-thinking-plan.test.ts` | 续写夹具 / 续写标题清单用 question | 用 support;续写提示不含「## 先回答你的问题、」 | D8 |
| `consultation-run-timeline.test.ts` | 正文夹具 `## 先回答你的问题`;思考行「先抓住你真正在问的事」;写作行 `write-先回答你的问题` | 口语开场 + `## 盘里支持…`;「先回答你问的这件事」;`write-盘里支持这个判断的地方` | D5 / D8(BUG-1072/1073) |
| `consultation-run-timeline.test.ts` | settled 夹具以 `## 先回答你的问题` 开头 | 口语开场无标题再接「盘里支持」 | D8 |
| `consult-single-pass-answer-20260927.test.ts` | `match(route, /natalAnswerShapeInstruction\(\)/)` | `natalUserTurnShape({ entrypoint: consultEntrypoint, history })`、`followUpTurn` 接线、`doesNotMatch` 旧调用 | D3 / D6(BUG-1071) |
| `consult-single-pass-answer / condensed-checklist / evidence-lookup / gender-card` 四个 ANSWER 夹具 | 含 `## ${REPORT_HEADING.question}` 一节 | 该节删除,开场直接到 `## 盘里支持` | D8 |
| `consult-answer-truncation-20260926.test.ts` | 夹具标题 `REPORT_HEADING.question` | `REPORT_HEADING.support`(只需任意一个标题) | D8 |
| `consultation-agentic-runtime.test.ts` | `sections.some(heading === REPORT_HEADING.question)`;5 处正文夹具标题 question | `sections.some(title === OPENER_THINKING_TITLE)`;夹具改 support | D5 / D8 |
| `consultation-smalltalk.test.ts` | `match(contract, /One natal … question still uses the opener-plus-skeleton/)` | `/The first natal … answer of a session uses the opener-plus-skeleton above/` + 追问轮句 | D3(BUG-1071) |
`frontend/tests/agent-voice-copy-contract.test.ts` 里的 `marriageConsultOpen: ["## 先回答你的问题", …]` 是 Task 0 冻结的「修前快照」数据,不是对现状的断言,未改。`chat-answer-split.ts` 的 `shortenAnswerHeading` 保留「先回答你的问题 → 先回答」给历史消息渲染。Python `tests/` 无按这些文案断言的用例(已 grep)。
## 门禁数字(完工实测,Node 22.14,本工作树)
| 项 | 开工基线 | 完工 | 结论 |
| --- | --- | --- | --- |
| `tsc --noEmit` | — | 0 错 | 通过 |
| `npm run lint` | — | 0 error(127 warning,既有) | 通过 |
| `npm test` 总数 | 4192 | 4196(+4:新文件 2、thinking-plan 1、voice 合同 1) | 通过 |
| `npm test` pass / fail / skipped | 4096 / 66(TAP 顶层 `not ok` 24 条)/ 30 | 4142 / 24 / 30 | 失败名单与基线 24 条逐条一致(`diff` 为空),均为无 Docker 的 DB / 部署套件;退出码 1 即这 24 条 |
| 消失的测试名 | — | 0(只有新增) | 通过 |
| `next build --webpack` | — | 退出 0;`/`、`/chart`、`/ephemeris`、`/people` 均 ○ Static | 通过 |
| 首屏 rootMainFiles gzip(9) | 130,933 B(`PROGRESS-consult-evidence-card-v2` / `single-pass` 口径) | 130,933 B(0.00%) | 通过 |
| `index.html` 引用的 `_next/static` JS gzip(9) | 660,412~661,444 B(36 个,gender 单口径) | 618,938 B(33 个,本单用正则从 `.next/server/app/index.html` 取,文件数不同,口径未必相同) | 供参考;rootMainFiles 为准 |
| `frontend/src/app/(app)/page.tsx` | — | 未改 | 通过 |
## 提交
- `9a42333a` feat(consult):T1/T6/T2/T3/T4 代码与测试(18 个文件,+416/−70)。
- 第二个提交:T5 记录(BUG-1070~1073、CHANGELOG、VOICE、DESIGN、真机清单、本文件、README、任务书 D8 确认)。
## 偏离与说明
- 提交分组:任务书要求按 T1/T6、T2/T3、T4、T5 分四次提交;T2(`followUp`)与 T6(标题表)落在同一批文件(`consultation-thinking-plan.ts`、`route.ts`、同一批测试)的相邻改动里,按 hunk 拆分不可靠,改为两次提交:代码 + 测试一次,记录一次。
- `next build` 默认 Turbopack 对软链的 `node_modules` 报 `Symlink … points out of the filesystem root`(与 `PROGRESS-consult-gender-optional-20260927` 同一现象),改用 `next build --webpack` 量 `/` 状态与首屏 gzip;数字口径与该记录一致(rootMainFiles,gzip level 9)。
- lint 有 127 条既有 warning(0 error),不在本单范围,未动。
- 真实模型输出未验(无凭据):见 `docs/testing/consult-answer-the-question-20260927.md`。
+1 -1
View File
@@ -244,7 +244,7 @@
| `TASK-engine-runtime-hygiene-20260901.md` | `PROGRESS-engine-runtime-hygiene-20260901.md` | Python 引擎运行时治理 | 已验收 | `124d3990`(staging 实机三条待部署窗口) | | `TASK-engine-runtime-hygiene-20260901.md` | `PROGRESS-engine-runtime-hygiene-20260901.md` | Python 引擎运行时治理 | 已验收 | `124d3990`(staging 实机三条待部署窗口) |
| `TASK-billing-pricing-20260830.md` | `PROGRESS-billing-pricing-20260830.md` | 计费闭环与功能级定价 | 已合入 | `aaaa5fb7`~`a499c344` | | `TASK-billing-pricing-20260830.md` | `PROGRESS-billing-pricing-20260830.md` | 计费闭环与功能级定价 | 已合入 | `aaaa5fb7`~`a499c344` |
| `TASK-cost-accounting-gaps-20260927.md` | — | **成本记账补漏与缓存分价**:七处模型调用不入账(标题 / 摘要 / 校正意图 / 采用旁白 / 校正开场 / 生时引导 / 每日星语);缓存命中按全价算、单价表无缓存列;多事件账本 `metadata.cache` 被覆盖;失败运行无成本记录;测算页不显示 token 分位数;**后台模型表单没有单价输入框,单价只能是 0**。只加「记」不加「扣」,不动售价与会员参数 | 待领取 | BUG-1064~1069 预留;部署后由产品按 `docs/testing/cost-accounting-20260927.md` 采真实成本 | | `TASK-cost-accounting-gaps-20260927.md` | — | **成本记账补漏与缓存分价**:七处模型调用不入账(标题 / 摘要 / 校正意图 / 采用旁白 / 校正开场 / 生时引导 / 每日星语);缓存命中按全价算、单价表无缓存列;多事件账本 `metadata.cache` 被覆盖;失败运行无成本记录;测算页不显示 token 分位数;**后台模型表单没有单价输入框,单价只能是 0**。只加「记」不加「扣」,不动售价与会员参数 | 待领取 | BUG-1064~1069 预留;部署后由产品按 `docs/testing/cost-accounting-20260927.md` 采真实成本 |
| `TASK-consult-answer-the-question-20260927.md` | — | **普通对话回答问的那句话**:反差只写盘上、删「按我的理解答」、禁写动机句;追问轮 ≤ 200 字直接回答不重开四标题骨架(服务端按「本会话已有解读」切指令,不用正则);清单是核对项不是段落大纲;步骤栏「先抓住你真正在问的事」改「先回答你问的这件事」 | 待领取(D8 首轮只说一遍待产品确认) | 基线 `24a9a635`;BUG 从 1070 起;原文夹具已由产品补交 | | `TASK-consult-answer-the-question-20260927.md` | `PROGRESS-consult-answer-the-question-20260927.md` | **普通对话回答问的那句话**:反差只写盘上、删「按我的理解答」、禁写动机句;追问轮 ≤ 200 字直接回答不重开四标题骨架(服务端按「本会话已有解读」切指令,不用正则);清单是核对项不是段落大纲;步骤栏「先抓住你真正在问的事」改「先回答你问的这件事」 | 已实现待验收(Claude 子代理直接执行) | 分支 `codex/consult-answer-the-question-20260927`(未推送);基线 `2ce3c216`;BUG-1070~1073;Skill 不 bump;真机清单 `docs/testing/consult-answer-the-question-20260927.md` |
| `TASK-cend-ui-claude-alignment-20260916.md` | `PROGRESS-cend-ui-r1/r2/r3-20260916.md` | **C 端界面向 claude.ai 产品界面对齐(三轮串行 R1→R2→R3,都动 `globals.css`,不得并行)**:根因是 `frontend/CLAUDE_DESIGN.md` 扒的是 **claude.com 营销官网**,它自己在 Known Gaps 里写明 claude.ai 产品界面不在范围内,而 `DESIGN.md:3` 把它当成了产品界面的实现契约。**R1**:`--font-display` 里 Tiempos Headline / StyreneB **从未加载**(无 `@font-face`、`public/` 无字体、`layout.tsx` 只 vendor 了 Inter),中文标题全站落到 **宋体 / SimSun**,波及 20 处含助手回答的 h2/h3(BUG-737);亮色强调色 `#85432f` 与暗色 `#d78064` 不同源,产品拍板亮色换 **Claude coral `#cc785c`**,**易漏点**是 `globals.css:16` 的 `--color-ring` 硬编码在 `@theme inline` 里不跟随 `:root`,另有第四个 `:root` 亮色块(`:4358`)必须同步(BUG-738);`.composer-footer` 常驻 44px + 顶栏 68px + `--composer-reserve` 148px,每屏固定吃掉 216px,模型选择器移进输入框内部、删掉底栏、顶栏收到 46px 并删「分析对象」副标题。**R2**:空状态是营销落地页(hero 卡 + 两张 132px 入口大卡 + 3 列 156px 主题卡),输入框被压在 **800px 以上**内容之下,重排成「问候 + 居中输入框 + 两枚入口 pill + 一排 chip」。**R3**:侧栏两个 `<details>` 拍平成一条「最近」、星盘的两个入口(侧栏分组 + 账户菜单)收敛到一处、删掉逐条助手头像。**决策记录 D3 推翻 DESIGN.md「报告强调色与应用同源」一句**(报告刻意保留深棕)。原型图 https://claude.ai/code/artifact/da275da6-2954-4f50-99aa-32bb8694d38b(三套画面 + 明暗,页面标题就是建议字体栈的实际渲染)。环境缺口:无登录态无 Chrome,四项真机观感留 `docs/testing/`。BUG 段 737–738 | 待领取 | — | | `TASK-cend-ui-claude-alignment-20260916.md` | `PROGRESS-cend-ui-r1/r2/r3-20260916.md` | **C 端界面向 claude.ai 产品界面对齐(三轮串行 R1→R2→R3,都动 `globals.css`,不得并行)**:根因是 `frontend/CLAUDE_DESIGN.md` 扒的是 **claude.com 营销官网**,它自己在 Known Gaps 里写明 claude.ai 产品界面不在范围内,而 `DESIGN.md:3` 把它当成了产品界面的实现契约。**R1**:`--font-display` 里 Tiempos Headline / StyreneB **从未加载**(无 `@font-face`、`public/` 无字体、`layout.tsx` 只 vendor 了 Inter),中文标题全站落到 **宋体 / SimSun**,波及 20 处含助手回答的 h2/h3(BUG-737);亮色强调色 `#85432f` 与暗色 `#d78064` 不同源,产品拍板亮色换 **Claude coral `#cc785c`**,**易漏点**是 `globals.css:16` 的 `--color-ring` 硬编码在 `@theme inline` 里不跟随 `:root`,另有第四个 `:root` 亮色块(`:4358`)必须同步(BUG-738);`.composer-footer` 常驻 44px + 顶栏 68px + `--composer-reserve` 148px,每屏固定吃掉 216px,模型选择器移进输入框内部、删掉底栏、顶栏收到 46px 并删「分析对象」副标题。**R2**:空状态是营销落地页(hero 卡 + 两张 132px 入口大卡 + 3 列 156px 主题卡),输入框被压在 **800px 以上**内容之下,重排成「问候 + 居中输入框 + 两枚入口 pill + 一排 chip」。**R3**:侧栏两个 `<details>` 拍平成一条「最近」、星盘的两个入口(侧栏分组 + 账户菜单)收敛到一处、删掉逐条助手头像。**决策记录 D3 推翻 DESIGN.md「报告强调色与应用同源」一句**(报告刻意保留深棕)。原型图 https://claude.ai/code/artifact/da275da6-2954-4f50-99aa-32bb8694d38b(三套画面 + 明暗,页面标题就是建议字体栈的实际渲染)。环境缺口:无登录态无 Chrome,四项真机观感留 `docs/testing/`。BUG 段 737–738 | 待领取 | — |
| `TASK-cend-surfaces-claude-alignment-20260916.md` | `PROGRESS-cend-shell-20260916.md`、`PROGRESS-cend-report-20260916.md`、`PROGRESS-cend-rectification-20260916.md`、`PROGRESS-cend-chart-eph-20260916.md` | **次级页面对齐(上一单的续篇,R4→R5/R6,R7、R8 可并行)**:星盘 `/chart`、星历 `/ephemeris`、报告 `/reports` **各是脱离 app 外壳的独立全屏页**,顶部只有一个「返回对话」链接、侧栏整个消失,且三家各写了一套一模一样的 `*-shell`/`*-topbar`/`*-hero` 骨架——与上一单 E5 同根因(营销站 band 结构被套到产品界面)。**R4** 抽只读导航外壳 `AppNavRail`(只用现成的 `GET /api/sessions` + `GET /api/account`,会话行走 `sessionHref` 跳 `/?c=<uuid>`;**刻意不带**重命名/删除/收藏/归档——那套连着 `Home()` 的乐观更新与回滚,搬过来会撞 useState 增长门禁)。**R5** 星盘五 tab 下划线化 + 参数合表 + 行星表横向滚动;星历日期导航改 `‹ 日期 ›`。**R6** 报告中心卡片网格改行式列表;阅读页加常驻目录。**R7** 生时校正把可信区间从盘面板标题行提成常驻条(窄屏 `.is-compact` 下盘面板是 overlay,现在默认看不到区间),五个 `technique-audit` 折叠块收成两段。**R8** 设置内容区收窄(880px 弹窗里表单铺了 690px)、套餐卡三修饰符收敛成两态。**已解锁**:原挡路的设置单已于 `111b4a84`(BUG-698)合入。**两条不得回退**:BUG-698 的 `@supports (height: 1dvh)` 写法(重复声明回退会被 Lightning CSS 折叠)、BUG-616/617 的报告盘面 grid 实现。默认不占 BUG 号 | **R4–R8 全部已实现并验收合入** | R4:抽出 `AppNavRail`(只读,两个 GET,零写操作)+ `SecondaryShell`,三个次级页并入 app 外壳并删掉各自的 shell/topbar/hero;四个路由渲染标记**完全不变**(`/` `/chart` `/ephemeris` 仍 Static);CSS gzip −0.25%。`/reports/[reportId]` 留给 R6 与目录一起做。两处自身健壮性问题被测试抓到:`usePathname()` 可为 null、`fetch` 可能不存在。差点弄丢 BUG-717 的 eyebrow 文案(已放回)。R8:表单分区收窄到 440px(列表分区不变)、套餐卡三修饰符收敛成互斥的 `is-current` / `is-recommended`,`--highlighted` 删除改为滚动定位;手机端 `order:-1` 改挂 `[data-plan-alias]`(版位不是状态)。测试 3350→3354(净增 4),失败清单与基线逐条一致;`/` 仍 Static;我的干净构建实测 CSS gzip −3 字节。**遗留待产品拍板**:`?plan=` 深链现在完全没有视觉指向,只有滚动位置。R6:报告中心卡片网格改行式列表、阅读页并入外壳并把目录挪到右侧常驻。**任务书 E10 过期**——目录在 `cfcd369d` 就已存在,本轮是挪位置定稿而非从零加。挂外壳带出一个真实打印风险已处理:`.chat-app`/`.chat-panel` 是 `height:100%;overflow:hidden`,裸 `window.print()` 会把九节报告裁成一页,阅读页因此多挂一条只在挂载期生效的 print 样式解锁外壳。「生成中的分节进度」做不了——`REPORT_LIST_COLUMNS` 不返回节数,按 VOICE.md 不许前端编。R7:区间常驻条与盘面折叠收敛。**任务书 E9 也不准确**——对话区顶部早有常驻条 `RectificationTimeline` 且窄屏可见,真正只在盘面标题行的是**代表分钟**;因此没另造第二条,在既有条上补齐代表分钟与已答题数(与盘面同一次 `workingRectificationTime()` 调用)。折叠块实际是 **8 个**不是 5 个。**触发让步顺序第 5 条**:收窄进度未做——服务端无该字段,且 `candidate_range` 会放宽(BUG-572),前端相减会把一次放宽报成收窄,已写进 `BLOCKED.md`。顺带修掉一个**静默失效的旧断言**(`slice(indexOf(A), indexOf(B))` 在 B 改名后变成几乎整份文件,四条 `doesNotMatch` 假通过)| | `TASK-cend-surfaces-claude-alignment-20260916.md` | `PROGRESS-cend-shell-20260916.md`、`PROGRESS-cend-report-20260916.md`、`PROGRESS-cend-rectification-20260916.md`、`PROGRESS-cend-chart-eph-20260916.md` | **次级页面对齐(上一单的续篇,R4→R5/R6,R7、R8 可并行)**:星盘 `/chart`、星历 `/ephemeris`、报告 `/reports` **各是脱离 app 外壳的独立全屏页**,顶部只有一个「返回对话」链接、侧栏整个消失,且三家各写了一套一模一样的 `*-shell`/`*-topbar`/`*-hero` 骨架——与上一单 E5 同根因(营销站 band 结构被套到产品界面)。**R4** 抽只读导航外壳 `AppNavRail`(只用现成的 `GET /api/sessions` + `GET /api/account`,会话行走 `sessionHref` 跳 `/?c=<uuid>`;**刻意不带**重命名/删除/收藏/归档——那套连着 `Home()` 的乐观更新与回滚,搬过来会撞 useState 增长门禁)。**R5** 星盘五 tab 下划线化 + 参数合表 + 行星表横向滚动;星历日期导航改 `‹ 日期 ›`。**R6** 报告中心卡片网格改行式列表;阅读页加常驻目录。**R7** 生时校正把可信区间从盘面板标题行提成常驻条(窄屏 `.is-compact` 下盘面板是 overlay,现在默认看不到区间),五个 `technique-audit` 折叠块收成两段。**R8** 设置内容区收窄(880px 弹窗里表单铺了 690px)、套餐卡三修饰符收敛成两态。**已解锁**:原挡路的设置单已于 `111b4a84`(BUG-698)合入。**两条不得回退**:BUG-698 的 `@supports (height: 1dvh)` 写法(重复声明回退会被 Lightning CSS 折叠)、BUG-616/617 的报告盘面 grid 实现。默认不占 BUG 号 | **R4–R8 全部已实现并验收合入** | R4:抽出 `AppNavRail`(只读,两个 GET,零写操作)+ `SecondaryShell`,三个次级页并入 app 外壳并删掉各自的 shell/topbar/hero;四个路由渲染标记**完全不变**(`/` `/chart` `/ephemeris` 仍 Static);CSS gzip −0.25%。`/reports/[reportId]` 留给 R6 与目录一起做。两处自身健壮性问题被测试抓到:`usePathname()` 可为 null、`fetch` 可能不存在。差点弄丢 BUG-717 的 eyebrow 文案(已放回)。R8:表单分区收窄到 440px(列表分区不变)、套餐卡三修饰符收敛成互斥的 `is-current` / `is-recommended`,`--highlighted` 删除改为滚动定位;手机端 `order:-1` 改挂 `[data-plan-alias]`(版位不是状态)。测试 3350→3354(净增 4),失败清单与基线逐条一致;`/` 仍 Static;我的干净构建实测 CSS gzip −3 字节。**遗留待产品拍板**:`?plan=` 深链现在完全没有视觉指向,只有滚动位置。R6:报告中心卡片网格改行式列表、阅读页并入外壳并把目录挪到右侧常驻。**任务书 E10 过期**——目录在 `cfcd369d` 就已存在,本轮是挪位置定稿而非从零加。挂外壳带出一个真实打印风险已处理:`.chat-app`/`.chat-panel` 是 `height:100%;overflow:hidden`,裸 `window.print()` 会把九节报告裁成一页,阅读页因此多挂一条只在挂载期生效的 print 样式解锁外壳。「生成中的分节进度」做不了——`REPORT_LIST_COLUMNS` 不返回节数,按 VOICE.md 不许前端编。R7:区间常驻条与盘面折叠收敛。**任务书 E9 也不准确**——对话区顶部早有常驻条 `RectificationTimeline` 且窄屏可见,真正只在盘面标题行的是**代表分钟**;因此没另造第二条,在既有条上补齐代表分钟与已答题数(与盘面同一次 `workingRectificationTime()` 调用)。折叠块实际是 **8 个**不是 5 个。**触发让步顺序第 5 条**:收窄进度未做——服务端无该字段,且 `candidate_range` 会放宽(BUG-572),前端相减会把一次放宽报成收窄,已写进 `BLOCKED.md`。顺带修掉一个**静默失效的旧断言**(`slice(indexOf(A), indexOf(B))` 在 B 改名后变成几乎整份文件,四条 `doesNotMatch` 假通过)|
| — (产品口头拍板,无任务书) | `PROGRESS-chart-glyphs-20260918.md` | **星盘改用行星符号,度数进行星表(非 Bug,无 BUG 号)**:北印星盘(星盘页 / 校正右栏 / 我的报告三处共用 `VedicChartSvg`)宫内不再画「水 19°」「罗逆 29°」这类文本——一宫三颗星就叠三行、字号压到 8。改成九个彩色符号(☉☽☿♀♂♃♄☊☋),每行最多 3 个、逆行改符号下同色横线、第 1 宫加 `As`、盘下两行图例。颜色只认星不表吉凶,罗计共用中性灰,`--color-planet-*` 九个 token 在 `:root` 与两个深色块各一份;颜色挂 `is-*` 修饰类而非行内 `style`(报告标记合同禁 `style=`)。符号字体是 vendored 的 9 字形 Noto Sans Symbols 子集(OFL,1.5 KB),`--font-planet-glyphs`,♀♂ 带 U+FE0E 防 iOS 画成表情。星盘页行星表四列扩到八列(行星 / 黄道经度 / 速度 / 宫位 / 星宿 / 宿主 / pada / 状态),度数精确到分,首行是上升(`vedic.ascendant` 新字段)。数据来源:`toNorthIndianChart()` 加结构化 `occupantGlyphs`;校正与报告两条路线的模型只有引擎/golden 显示文本,按首字解析并有测试锁住。**星宿未译中文**——仓库无对照表,印度 27 宿与中国二十八宿不同源,不自造 | 已实现,待验收 | `codex/chart-glyphs-20260918`:tsc 0 / lint 0 error(118 warning 不变)/ npm test 3471→3484 条、36 红与基线 `84b293fb` 逐条相同、0 新红 / `○ /` Static / 首屏 JS gzip 1,450,774→1,455,017(+0.29%),CSS gzip +2.23%(构成见 PROGRESS §2)。真机走查欠(iOS 符号呈现、深浅两主题配色、375px 横滚、打印) | | — (产品口头拍板,无任务书) | `PROGRESS-chart-glyphs-20260918.md` | **星盘改用行星符号,度数进行星表(非 Bug,无 BUG 号)**:北印星盘(星盘页 / 校正右栏 / 我的报告三处共用 `VedicChartSvg`)宫内不再画「水 19°」「罗逆 29°」这类文本——一宫三颗星就叠三行、字号压到 8。改成九个彩色符号(☉☽☿♀♂♃♄☊☋),每行最多 3 个、逆行改符号下同色横线、第 1 宫加 `As`、盘下两行图例。颜色只认星不表吉凶,罗计共用中性灰,`--color-planet-*` 九个 token 在 `:root` 与两个深色块各一份;颜色挂 `is-*` 修饰类而非行内 `style`(报告标记合同禁 `style=`)。符号字体是 vendored 的 9 字形 Noto Sans Symbols 子集(OFL,1.5 KB),`--font-planet-glyphs`,♀♂ 带 U+FE0E 防 iOS 画成表情。星盘页行星表四列扩到八列(行星 / 黄道经度 / 速度 / 宫位 / 星宿 / 宿主 / pada / 状态),度数精确到分,首行是上升(`vedic.ascendant` 新字段)。数据来源:`toNorthIndianChart()` 加结构化 `occupantGlyphs`;校正与报告两条路线的模型只有引擎/golden 显示文本,按首字解析并有测试锁住。**星宿未译中文**——仓库无对照表,印度 27 宿与中国二十八宿不同源,不自造 | 已实现,待验收 | `codex/chart-glyphs-20260918`:tsc 0 / lint 0 error(118 warning 不变)/ npm test 3471→3484 条、36 红与基线 `84b293fb` 逐条相同、0 新红 / `○ /` Static / 首屏 JS gzip 1,450,774→1,455,017(+0.29%),CSS gzip +2.23%(构成见 PROGRESS §2)。真机走查欠(iOS 符号呈现、深浅两主题配色、375px 横滚、打印) |
@@ -58,7 +58,7 @@
- D5 **思考栏第一节标题**改成「先回答你问的这件事」。 - D5 **思考栏第一节标题**改成「先回答你问的这件事」。
- D6 判断「追问轮」用服务端事实(本会话此前是否已有一轮本命解读),不用正则识别用户意图(沿用 BUG-976/977 的口径);是非题 / 换领域由模型按提示词判断。 - D6 判断「追问轮」用服务端事实(本会话此前是否已有一轮本命解读),不用正则识别用户意图(沿用 BUG-976/977 的口径);是非题 / 换领域由模型按提示词判断。
- D7 排盘工具仍每轮调用(计算是请求级的,BUG-1053 后答案由看过工具结果的那一步写),本单只改答案形状,不改工具调用与结算。 - D7 排盘工具仍每轮调用(计算是请求级的,BUG-1053 后答案由看过工具结果的那一步写),本单只改答案形状,不改工具调用与结算。
- D8 **首轮解读只说一遍(Claude 建议,待产品确认后执行方才做 T6;未确认则 T6 不做,其余照做)**:口语开场保留反差、谁推谁修、扮演哪个象,**不再带三条行动**;删掉 `## 先回答你的问题` 这一节(开场就是回答);`## 盘里支持这个判断的地方` 只写开场没说过的依据,表格与正文二选一,不得把开场的判断再列一遍;三条行动只出现在最后一节 `## 这周可以做的一件事`。首轮全文目标 ≤ 900 字。这条修改 09-17 口气定稿的骨架顺序,但保留其口语开场形状;`REPORT_HEADING.question` 相关的思考栏节、续写提示、测试一并调整。 - D8 **首轮解读只说一遍(产品 2026-09-27 晚已确认,T6 必做;产品同时要求 Claude 直接执行本单)**:口语开场保留反差、谁推谁修、扮演哪个象,**不再带三条行动**;删掉 `## 先回答你的问题` 这一节(开场就是回答);`## 盘里支持这个判断的地方` 只写开场没说过的依据,表格与正文二选一,不得把开场的判断再列一遍;三条行动只出现在最后一节 `## 这周可以做的一件事`。首轮全文目标 ≤ 900 字。这条修改 09-17 口气定稿的骨架顺序,但保留其口语开场形状;`REPORT_HEADING.question` 相关的思考栏节、续写提示、测试一并调整。
## 硬红线 ## 硬红线
@@ -109,7 +109,7 @@
**验收**:timeline 测试通过;组件快照若有变化写三栏。 **验收**:timeline 测试通过;组件快照若有变化写三栏。
### T6 首轮只说一遍(R6、D8;产品确认后才做) ### T6 首轮只说一遍(R6、D8;产品已确认)
- `natalSpokenReportContract`、`natalAnswerShapeInstruction()`、`skill-binding.ts` 的 `NATAL_REPORT_SKELETON`、`index.ts` 里「Write in Simplified Chinese: a heading-free spoken opener first (… → 最多三条短行动 …)」四处同步:开场不带行动;骨架三个标题 `## 盘里支持这个判断的地方`、`## 时间怎么看`、`## 这周可以做的一件事`;依据节只写开场没说过的,表格或正文二选一。 - `natalSpokenReportContract`、`natalAnswerShapeInstruction()`、`skill-binding.ts` 的 `NATAL_REPORT_SKELETON`、`index.ts` 里「Write in Simplified Chinese: a heading-free spoken opener first (… → 最多三条短行动 …)」四处同步:开场不带行动;骨架三个标题 `## 盘里支持这个判断的地方`、`## 时间怎么看`、`## 这周可以做的一件事`;依据节只写开场没说过的,表格或正文二选一。
- `consultation-thinking-plan.ts`:`REPORT_HEADING.question` 与 `natalConsultationThinkingPlan` 第一节按 D5 改名后保留为思考栏节,但不再对应正文标题(或删除该节,执行方按快照测试改动量选,写进 PROGRESS);`consultationContinuePrompt` 的标题清单同步。 - `consultation-thinking-plan.ts`:`REPORT_HEADING.question` 与 `natalConsultationThinkingPlan` 第一节按 D5 改名后保留为思考栏节,但不再对应正文标题(或删除该节,执行方按快照测试改动量选,写进 PROGRESS);`consultationContinuePrompt` 的标题清单同步。
@@ -122,7 +122,7 @@
- BUG-1070 普通对话把是非题改写成「你是否需要」并解释提问动机(R1、R2)。 - BUG-1070 普通对话把是非题改写成「你是否需要」并解释提问动机(R1、R2)。
- BUG-1071 追问轮重开 ≤ 400 字开场 + 四标题骨架,一句是非题得到整份领域解读(R4、R5)。 - BUG-1071 追问轮重开 ≤ 400 字开场 + 四标题骨架,一句是非题得到整份领域解读(R4、R5)。
- BUG-1072 步骤栏显示「先抓住你真正在问的事」(R3)。 - BUG-1072 步骤栏显示「先抓住你真正在问的事」(R3)。
- BUG-1073 首轮解读同一判断写三遍、三条行动给两遍(R6);产品未确认 D8 时记为 `investigating`,不修。 - BUG-1073 首轮解读同一判断写三遍、三条行动给两遍(R6)。
- 三条都关联 `84b293fb`(口气定稿)与 BUG-1053(答案由看过工具结果的步写);修复版本写本单 commit;状态在 Claude 验收前写 `fixed_pending_acceptance`,不写 `resolved`。 - 三条都关联 `84b293fb`(口气定稿)与 BUG-1053(答案由看过工具结果的步写);修复版本写本单 commit;状态在 Claude 验收前写 `fixed_pending_acceptance`,不写 `resolved`。
- `CHANGELOG.md` 一条:普通对话追问轮直接回答、不再揣测动机;Skill 不 bump。 - `CHANGELOG.md` 一条:普通对话追问轮直接回答、不再揣测动机;Skill 不 bump。
- `docs/tasks/PROGRESS-consult-answer-the-question-20260927.md`:基线、测试数字(开工 / 完工)、三栏表、偏离。 - `docs/tasks/PROGRESS-consult-answer-the-question-20260927.md`:基线、测试数字(开工 / 完工)、三栏表、偏离。
@@ -0,0 +1,17 @@
# 真机清单 · 普通对话回答问的那句话(2026-09-27)
对应 `docs/tasks/TASK-consult-answer-the-question-20260927.md`(BUG-1070~1073)。本机没有登录态与模型凭据,以下只能在 staging 部署后由产品在手机或桌面浏览器上照做。问句全部用下面的虚构句式,不要贴真实问答原文到任何记录里。
前置:`https://staging.jyotisha.chat/api/health` 的 `deployment.gitCommit` 等于本单合入 staging 的 SHA;用一个已有出生分钟的星盘;模型任选(真机反馈来自 `deepseek-v4-flash`,优先用它复核)。
| # | 操作 | 期望 | 结果 |
| --- | --- | --- | --- |
| 1 | 新会话,问「我和父母的关系怎么看」 | 首轮:无标题的口语开场(反差写的是宫位 / 星 / 大运,不是父母的心思;开场**没有**三条行动);正文只有三个二级标题「盘里支持这个判断的地方」「时间怎么看」「这周可以做的一件事」;**没有**「先回答你的问题」这一节;行动只在最后一节出现一次;全文约 900 字内;同一判断不重复出现三次 | |
| 2 | 同一会话接着问「我妈是不是不太在意我」 | 第一句就是「是」「不是」或「看情况」;全文 200 字左右;没有二级标题;没有「你是否需要」「你要的是」「你其实想问」「她问的是……你要的是……」这类句子;不重述第 1 步已经写过的四宫 / 九宫 | |
| 3 | 接着问「那我爸呢」 | 同第 2 步形状;只讲父亲那条线,不把母亲段再讲一遍 | |
| 4 | 接着问「完整看一下我的事业」 | 回到第 1 步的形状:口语开场 + 三个二级标题 | |
| 5 | 第 1~4 步过程中看步骤栏 | 第一节标题是「先回答你问的这件事」;首轮它的步骤是「用盘上的反差回答这个问题」,第 2、3 步是「直接回答这句话」;没有「先抓住你真正在问的事」;写作行不出现「正在写先回答你的问题」 | |
| 6 | 第 2 步的回答完成后,看用量 / 后台 | 仍然计一次排盘、扣一次点(追问轮照常调用排盘工具) | |
| 7 | 换无出生分钟的星盘问「今天适合做什么」 | 开场结尾仍有一到三条短行动(无骨架模式行动留在开场);不出现本命结构 | |
任一条不符,按 BUG-1070~1073 追加记录,附问句句式与回答的**结构描述**(标题、字数、第一句是不是是 / 不是),不贴回答原文。
+6
View File
@@ -2,6 +2,12 @@
This file adapts the full visual analysis in `CLAUDE_DESIGN.md` to the shipped Jyotisha application. `CLAUDE_DESIGN.md` remains the upstream reference; this file is the implementation contract. This file adapts the full visual analysis in `CLAUDE_DESIGN.md` to the shipped Jyotisha application. `CLAUDE_DESIGN.md` remains the upstream reference; this file is the implementation contract.
## 普通咨询:步骤栏第一节与正文三标题(2026-09-27,TASK-consult-answer-the-question,BUG-1071~1073)
步骤栏(思考计划)第一节标题从「先抓住你真正在问的事」改成「先回答你问的这件事」;首轮它的唯一步骤是「用盘上的反差回答这个问题」,追问轮是「直接回答这句话」。这一节没有自己的正文标题(口语开场没有 H2),它和「盘里支持这个判断的地方」共用一个 heading:第一个正文 H2 出现时两节一起收口;追问轮整篇没有 H2,四节都在结算时收口。无新组件、无新动效。
写作行(`write-<标题>`)跟着正文标题走:首轮依次是「盘里支持这个判断的地方」「时间怎么看」「这周可以做的一件事」,不再出现「正在写先回答你的问题」;追问轮没有标题,写作行是「组织回答」那一条。`shortenAnswerHeading` 里「先回答你的问题 → 先回答」的缩写保留,给历史消息用。
## 校正回答没有「重新生成」;范围句结算时出现一次(2026-09-27,BUG-1055~1058) ## 校正回答没有「重新生成」;范围句结算时出现一次(2026-09-27,BUG-1055~1058)
生时校正里助手回答下面的操作条只有「赞 / 踩 / 复制」三个按钮,不再有「重新生成回答」(BUG-1056:那条路是盲写,不校验就落库)。普通对话的操作条不变,最近一条回答仍可重新生成。`ChatMessageActions` 不传 `onRegenerate` 时不画这个按钮,其余按钮位置不变。 生时校正里助手回答下面的操作条只有「赞 / 踩 / 复制」三个按钮,不再有「重新生成回答」(BUG-1056:那条路是盲写,不校验就落库)。普通对话的操作条不变,最近一条回答仍可重新生成。`ChatMessageActions` 不传 `onRegenerate` 时不画这个按钮,其余按钮位置不变。
+15 -4
View File
@@ -10,9 +10,11 @@ Jyotisha 的可见文案是产品的一部分。正确性红线(真实性、
直接,有立场,带一点锋利。**毒只对处境,不对人**:每一句锋利都要有盘上的证据撑着(哪颗星、哪个宫、哪段大运),没有证据就不许刻薄。 直接,有立场,带一点锋利。**毒只对处境,不对人**:每一句锋利都要有盘上的证据撑着(哪颗星、哪个宫、哪段大运),没有证据就不许刻薄。
有偏好:喜欢清晰的问题、直接的反馈、做完就能看到改变的事;最烦一句话丢过来让人猜半天。问题含糊时不猜、也不反问一串——写「这句我按『……』理解了,不对你纠正我」,然后照这个理解把答案给完。 有偏好:喜欢清晰的问题、直接的反馈、做完就能看到改变的事;最烦一句话丢过来让人猜半天。问题含糊时不猜、也不反问一串:只有当这句话有两种实质不同的读法时,才写一句「我按 A 答」,答完不再解释为什么这样理解;单义的问题直接答,不改写它(2026-09-27,BUG-1070:旧规则「这句我按『……』理解了」让模型先改写问题再答,「是不是 X」变成「你是否需要 Y」)。
收尾只给一到三件能做的事。 **不揣测。** 回答对象是用户问的那句话。不写「你其实想问的是」「你真正在意的是」「你要的是」「你是否需要」「你问这个是因为」「你更想知道」,也不写任何替用户或当事人陈述动机、需求、感受的句子。盘上有证据可以写「4 宫主落 10 宫,母亲的注意力在你的前途上」,不得写「她问的是结果,你要的是被听」——前者是宫位,后者是读心。是非题(是不是 / 会不会 / 能不能 / 有没有 / ……吗)第一句就是「是」「不是」或「看情况:……」,第二句给盘上的依据,不先讲背景。
收尾只给一到三件能做的事。本命解读里这三条只写在正文最后一节「这周可以做的一件事」,开场不带行动;无出生分钟与申报时段没有正文骨架,行动写在开场结尾。
对用户称「你」。口语化,但不轻佻。不加「亲爱的」,不每轮感谢信任,不用 emoji。 对用户称「你」。口语化,但不轻佻。不加「亲爱的」,不每轮感谢信任,不用 emoji。
@@ -144,7 +146,7 @@ Jyotisha 的可见文案是产品的一部分。正确性红线(真实性、
4. **同一约束换着说。** 边界句必须在交付/采用轮完整出现一次;中间轮不要逐字复读法务稿。 4. **同一约束换着说。** 边界句必须在交付/采用轮完整出现一次;中间轮不要逐字复读法务稿。
5. **口语化但不轻佻。** 短句、具体事实、少套话。 5. **口语化但不轻佻。** 短句、具体事实、少套话。
6. **希望纪律。** 占星结果是客观的,表达是主观的。不顺就说不顺,但每次都要让人知道这段时间可以拿来干什么。盘上确有转机、且 `answer_policy.can_answer_precise_timing` 允许精确应期时,把转机说到月份(哪颗星换宫、哪段大运交接);不允许精确应期、或这一段确实没有转机时,说清这段时间是拿来干什么的(攒、守、清账、练手)以及可以扮演哪个象,不编月份。不是每个人都有转机,但每个人都有能扮演的象。不写「一切都会好」「相信自己」「加油」「你值得更好的」「宇宙自有安排」。 6. **希望纪律。** 占星结果是客观的,表达是主观的。不顺就说不顺,但每次都要让人知道这段时间可以拿来干什么。盘上确有转机、且 `answer_policy.can_answer_precise_timing` 允许精确应期时,把转机说到月份(哪颗星换宫、哪段大运交接);不允许精确应期、或这一段确实没有转机时,说清这段时间是拿来干什么的(攒、守、清账、练手)以及可以扮演哪个象,不编月份。不是每个人都有转机,但每个人都有能扮演的象。不写「一切都会好」「相信自己」「加油」「你值得更好的」「宇宙自有安排」。
7. **开场形状。** 开场不是一句判词,是一个形状,三种模式(本命 / 无出生分钟 / 申报时段)共用,总长不超过 400 字、全程无标题:① **反差**——先说「表面 A,底下 B」,并把这个反差命名成一个格局(例:外松内紧);② **谁在推、谁在修**——动力层与形式层分开讲,哪一层在推这段时间(大运主星),哪一层只负责把结果修得体面(行运);③ **别去应 X 的象,去扮演 Y 的象**——盘是客观的,活出它哪一个象是他的选择,哪怕重的一年也总有一个能扮演的象;④ **最多三条短行动**——破折号短句,每条不超过 20 字,做完就能看到改变。术语当场用引号里的白话套住:土星的「磨」、木星的「享受」、土星的「守」。<br>降级路线(形状照给,只换填法):**申报时段**第 ② 步只讲窗口内稳定的那一层(行星落座、公开日历),上升、宫位、大运、分盘不进这一步,也不写月份;**无出生分钟**第 ② 步只讲公开日历这一天在推什么,不点个人大运、不写月份。两条路线第 ③ 步都照给,无出生分钟时能扮演的象取自公开日历,不取自个人盘。 7. **开场形状。** 开场不是一句判词,是一个形状,三种模式(本命 / 无出生分钟 / 申报时段)共用,总长不超过 400 字、全程无标题:① **反差**——先说「表面 A,底下 B」,并把这个反差命名成一个格局(例:外松内紧);A 和 B 都必须是盘上的结构(哪颗星、哪个宫、哪段大运、哪张分盘),问的是别人(父母、伴侣、子女)时,反差写那个人在你盘上对应的宫位与代表星,不写那个人的心思(2026-09-27,BUG-1070);② **谁在推、谁在修**——动力层与形式层分开讲,哪一层在推这段时间(大运主星),哪一层只负责把结果修得体面(行运);③ **别去应 X 的象,去扮演 Y 的象**——盘是客观的,活出它哪一个象是他的选择,哪怕重的一年也总有一个能扮演的象;④ **最多三条短行动**——破折号短句,每条不超过 20 字,做完就能看到改变;本命解读里这三条不写在开场,只在正文最后一节出现一次(2026-09-27,BUG-1073)。术语当场用引号里的白话套住:土星的「磨」、木星的「享受」、土星的「守」。<br>降级路线(形状照给,只换填法):**申报时段**第 ② 步只讲窗口内稳定的那一层(行星落座、公开日历),上升、宫位、大运、分盘不进这一步,也不写月份;**无出生分钟**第 ② 步只讲公开日历这一天在推什么,不点个人大运、不写月份。两条路线第 ③ 步都照给,无出生分钟时能扮演的象取自公开日历,不取自个人盘。
## 好 / 坏对照 ## 好 / 坏对照
@@ -284,7 +286,16 @@ Jyotisha 的可见文案是产品的一部分。正确性红线(真实性、
本命类回答默认只展开口语层。从第一个 H2 起的骨架仍完整写出、入库、可复制,但折在「完整分析」里。折叠是可见性,不是省略。 本命类回答默认只展开口语层。从第一个 H2 起的骨架仍完整写出、入库、可复制,但折在「完整分析」里。折叠是可见性,不是省略。
口语层没有标题,总量不超过 400 字。形状见上面第七条原则:反差 → 谁在推谁在修 → 别去应 X 的象、去扮演 Y 的象 → 最多三条短行动(破折号短句,每条不超过 20 字)。句子必须是完整句子,不得写成名词短语枚举。 口语层没有标题,总量不超过 400 字。形状见上面第七条原则:反差(盘上的) → 谁在推谁在修 → 别去应 X 的象、去扮演 Y 的象。句子必须是完整句子,不得写成名词短语枚举。
**首轮只说一遍(2026-09-27,BUG-1073,产品拍板 D8)。** 开场就是回答,正文不再从「先回答你的问题」重来。正文只有三个二级标题:`## 盘里支持这个判断的地方`(只写开场没说过的依据,表格与正文二选一,不把开场的判断再列一遍)、`## 时间怎么看`、`## 这周可以做的一件事`(一到三条行动,只在这里出现一次)。首轮全文不超过 900 字。此前一份约 1,500 字的父母解读把同一个判断说了三遍、三条行动给了两遍,用户读到的是「说了很多没多说什么」。
**追问轮直接回答(2026-09-27,BUG-1071,D3)。** 本会话已经有过一轮解读之后,后面的问题按直接回答写:不超过 200 字,第一句回答问的那句话(是非题先答是 / 不是 / 看情况),只引与这句话直接相关的盘面事实(最多三处),不写二级标题、不写行动清单、不重述上一轮已经写过的结构。只有用户明确换了领域或要求「完整看一下」才回到口语开场 + 三标题。「追问轮」由服务端按「本会话已有回答」判定,不用正则猜用户意图(BUG-976/977 口径)。
| 坏 | 好 | 为什么 |
|---|---|---|
| (用户问「我妈是不是不太在意我」)你其实要的是被听见,她给的是安排;你是否需要的是一种被看见的方式…… | 不是。4 宫主水星逆行落 10 宫,她把心力投在你的前途上——不是不在意,是不会用你想要的方式在意。 | 是非题第一句答是 / 不是;依据是宫位,不是读心;不把问题改写成需求。 |
| (首轮)开场三条行动 + `## 先回答你的问题` 再答一遍 + 表格再列一遍 + `## 这周可以做的一件事` 再给三条 | 开场(反差、谁推谁修、扮演哪个象)→ `## 盘里支持这个判断的地方`(只写新依据)→ `## 时间怎么看` → `## 这周可以做的一件事`(三条,一次) | 同一判断只说一遍,行动只给一遍。 |
| 坏 | 好 | 为什么 | | 坏 | 好 | 为什么 |
|---|---|---| |---|---|---|