fix(rectification): plain-word opening with examples in the stem, plain de-duplicated step receipt (BUG-1049, BUG-1050)

- BUG-1049 (recurrence of BUG-504): the opening stem carries six examples and
  an example answer again and is server-owned on the zero-evidence opening;
  the body is two plain sentences (no 大运/盘面/代表分钟/精确到秒, no year, no
  question). Stem de-dup compares whole sentences / near-equality instead of a
  12-char prefix, which had deleted the body's examples sentence since
  aa7ccb30 (BUG-604) + dd8f35f7 (BUG-648).
- BUG-1050: plain step labels; a finished step label shows once and
  「已完成 N 步」counts shown rows; failed rows read 「…未完成」 from the
  in-progress wording.
- Skill 10.0.30 -> 10.0.31 (OpeningPolicy); 10.0.30 kept as deprecated.
- VOICE / DESIGN / CHANGELOG / BUG_HISTORY / PROGRESS / real-device checklist
  and screenshots.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
This commit is contained in:
Jesse_Chen
2026-09-26 22:04:56 +08:00
co-authored by Claude Opus 5.5
parent e53052a258
commit 8fc1a5bded
56 changed files with 1562 additions and 134 deletions
+30
View File
@@ -14074,3 +14074,33 @@
- 相关记录:BUG-689、BUG-740、BUG-1047;ERR-110。
- 复发自:无。
- 修复版本:未修。
## BUG-1049 | 生时校正开场没有例子、满是行话,用户不知道该答什么
- 状态:resolved(代码与回归测试已完成,分支 `codex/rectification-opening-plain-20260926` 未推;部署与真机清单待验收)
- 首次发现 / 最近更新:2026-09-26 / 2026-09-26
- 影响面:`frontend/src/lib/rectification-agentic/user-copy.ts`(`GENERIC_COLLECT_QUESTION`、`OPENING_COLLECT_DOMAINS`、`openingSpokenBody`、`isAcceptableOpeningBody`)、`v9/collect-prompt.ts`(`stripQuestionSentences` / `isQuestionSentence`)、`v9/agent-run-messages.ts`(`buildOpeningBrief`)、`v9/agent-run-attempt.ts`(开场正文验收)、`v9/method-followup.ts`(`spokenFollowupForUser`)、`mastra/rectification-v9-tools.ts`(`rectification-set-focus`)、`mastra/agentic-rectification.ts`(开场说明)、Skill `jyotish-birth-time-rectification` §4 OpeningPolicy 与 `references/conversation-strategy.md` §2。
- 用户现象:产品 09-26 staging(`e53052a2`)真机:新建生时校正,开场只有「眼下按 04:45–05:15 来核对,用你记得的经历对照大运和盘面变化。最后给区间和代表分钟,不给精确到秒。」和题干「先说你最容易想起的一两件,年月大概就行。」——没有任何例子,不知道「一两件」指什么,还有大运、盘面、代表分钟、精确到秒这些没解释过的词。
- 触发条件:零证据开场(`collect:other:*`,`source=method_coverage`)。模型写的开场正文带例子句时先被剥掉、验收不过、换成兜底正文;兜底正文的例子句随后在 GET 组装(`attachQuestionsToTurns`)与客户端结算合并(`mergeTurnQuestions`,BUG-1045 起)里被再剥一次。
- 根因:两步叠加。① `aa7ccb30`(09-09,BUG-604)把六个例子从题干 `GENERIC_COLLECT_QUESTION` 挪进开场正文第三句,题干改成不带例子的「先说你最容易想起的一两件,年月大概就行。」;② `dd8f35f7`(09-11,BUG-646~648)把正文第三句改写成「先说你最容易想起的一两件,比如……,年月大概就行。」,开头 12 个字与题干完全相同。BUG-585 引入的去重规则(`4e0db55f` 起,`isQuestionSentence`)把「以题干前 12 个字开头」的正文句一律当成重复题干删除,例子句因此被删。09-11 起刷新后看不到例子;BUG-1045(`e4c1c7a3`)把同一去重搬到客户端后,实时也看不到。行话来自 BUG-604 / BUG-648 的三句模板本身。
- 复发自:**BUG-504**(防复发「开场题文案必须带具体例子」,验证「零证据开场 spoken prompt 含『比如』」)。为什么没拦住:`aa7ccb30` 把 BUG-504 的断言改成了反向(`rectification-server-focus.test.ts` 与 `agent-voice-copy-contract.test.ts` 断言题干**不含**「比如」,注释写「领域清单在开场正文」),把「必须带例子」的保证挪到了正文;而正文的检查(`isAcceptableOpeningBody`、`openingSpokenBody` 至少五类)只测正文字符串本身,没有一条测试把正文和题干一起走过 `stripQuestionSentences` / `attachQuestionsToTurns` / `mergeTurnQuestions` 看用户最终看到什么;`dd8f35f7` 改写第三句时也没有这样的渲染断言。
- 修复(产品 2026-09-26 决策 D1):题干回到带例子并加示例回答:「先说一两件你记得的大事,比如上大学、第一份工作、搬到别的城市、谈恋爱或结婚、家里添丁、生病住院。说个大概年月就行,例如「2015 年夏天换了工作」。」(示例年份是固定文案,不从生日推;只在题干,正文仍不写年份)。开场题干改为服务端固定:`rectification-set-focus` 对零证据开场仍校验模型的 `spokenPrompt`,校验通过后存服务端题干,模型改写不进问题块。正文改两句大白话(兜底与 brief 同一意思):「我们来把你的出生时间缩小到更准的范围,现在先在 HH:MM–HH:MM 之间找。做法很简单:你说几件人生里的大事和大概年月,我拿去和星盘对照。」;模型正文须说到星盘和年月、带当前窗口、不含大运 / 盘面 / 分盘 / 候选 / 区间 / 代表分钟 / 精确到秒 / 年份 / 问号、最多提两个例子,否则换兜底。开场不再说「最后给区间和代表分钟,不给精确到秒」;交付卡的「这只是代表性候选,不是已确认的唯一出生分钟。」不动。去重改为整句比较:正文句与题干整体或题干任一句相同(去空白与句末标点)、或字符二元组 Dice 相似度 ≥ 0.8 才算重复;只共享开头几个字的句子保留;以问号结尾的句子照旧删除(BUG-585)。Skill 10.0.30 → 10.0.31(§4 OpeningPolicy 与 conversation-strategy §2 改写),10.0.30 标 deprecated、快照保留,旧会话照常打开。
- 验证:`frontend/tests/rectification-opening-plain-20260926.test.ts`(零证据开场题干含「比如」「例如」与六个例子、唯一年份是示例里的 2015;有带日期经历或重问时不用该题干;模型改写 `spokenPrompt` 时 set-focus 仍存服务端题干;服务端拼接、GET 组装、客户端合并三条路径正文两句都在、题干只出现一次;09-26 staging 实际存下的旧正文例子句在新去重下保留;逐句复述题干仍被去掉;近似改写一两个词仍算复述;正文无行话、旧兜底正文与一句招呼不被接受)、`frontend/tests/rectification-opening-plain-20260926.test.tsx`(挂真实 `RectificationAgenticChat`,自动发开场、流式结算、快照合并后:正文两句在、题干与六个例子各 1 次、开场这一轮无行话)。三条旧断言按三栏注释恢复为 BUG-504 口径。截图:`docs/testing/rectification-opening-plain-20260926/`。
- 防复发:开场题干必须带例子(BUG-504 口径恢复),且由服务端固定,不由模型改写。任何改开场正文或题干的提交,必须同时有「正文 + 题干走过 GET 组装与客户端合并后用户看到什么」的断言,不能只测单个字符串。去重不得再按前缀判定。
- 相关记录:BUG-504、BUG-604、BUG-646、BUG-648、BUG-585、BUG-1045、BUG-969、BUG-621。
- 修复版本:分支 `codex/rectification-opening-plain-20260926`(本地提交,未推)。
## BUG-1050 | 生时校正步骤回执写内部名,同一步显示两次
- 状态:resolved(代码与回归测试已完成,分支未推;真机清单待验收)
- 首次发现 / 最近更新:2026-09-26 / 2026-09-26
- 影响面:`frontend/src/lib/rectification-activity-labels.ts`(完成名、进行中句、点选活动句、慢步骤句、完成列表)、`frontend/src/lib/rectification-timeline-adapter.ts`(`rectificationTimelineRows`)。
- 用户现象:同一次开场,回答上方写「已完成 3 步 / 读取校正记录 / 设置对话焦点 / 设置对话焦点」:步骤名是内部说法,「设置对话焦点」出现两次。
- 触发条件:Agent 一轮里对同一工具调用两次(开场先写问题、再改写问题,各调一次 `rectification-set-focus`),或调用多个工具。
- 根因:实时时间线(`startActivityTraceStep`)每次工具调用追加一行,结算后保留这份实时轨迹,`rectificationTimelineRows` 原样映射,「已完成 N 步」数的是调用次数;刷新后走持久化回执(按工具去重)才变成两行。步骤名直接取自工具语义(校正记录、对话焦点、事件证据、候选稳健性),没有按用户口吻写。
- 修复(产品 2026-09-26 决策 D2):`rectificationTimelineRows` 对已完成的步骤按显示名去重(保留第一行,进行中与失败行不动),「已完成 N 步」随之等于看得见的行数;`rectificationCompletedTrail` 同样去重。十四个工具的完成名与进行中句、点选活动句全部改大白话(对照表见 `frontend/docs/VOICE.md`「生时校正开场与步骤名」),进行中句沿用 BUG-1047 已批准的「正在准备下一个问题…」「正在记下这件事…」「正在重新对照盘面…」;慢步骤句改为「还在 + 进行中句」;失败行改为「在做什么 + 未完成」(「重新对照盘面未完成」),不再是过去式完成名加「未完成」。BUG-1047 的阶段句顺序与行为不变。
- 验证:`frontend/tests/rectification-opening-plain-20260926.test.ts`(read-case + set-focus ×2 → 两行「看了你的资料」「准备好下一个问题」、「已完成 2 步」;两个共用名字的工具只一行;全部步骤名不含对话焦点 / 校正记录 / 事件证据 / 候选 / 稳健性 / 焦点)、`frontend/tests/rectification-opening-plain-20260926.test.tsx`(真实组件开场回执「已完成 2 步」、两名各 1 次);`agent-activity-progress`、`rectification-adopt-flow-20260902`、`rectification-agentic-entry`、`rectification-timeline-adapter`、`rectification-latency-20260926.test.tsx` 的旧文案断言按三栏注释更新。
- 防复发:步骤名面向用户,改名先对照 VOICE;时间线任何按调用次数追加的地方,展示前都走同一个去重投影。
- 相关记录:BUG-1047、BUG-1049、BUG-725。
- 复发自:无。
- 修复版本:分支 `codex/rectification-opening-plain-20260926`(本地提交,未推)。
@@ -0,0 +1,59 @@
# PROGRESS · 生时校正开场改大白话 + 步骤回执去重(2026-09-26)
- 模式:直接执行(产品授权 subagent 实现;无单独任务书,决策 D1/D2 由 Claude 转述)
- 基线:`origin/staging` `e53052a2`
- 分支 / worktree:`codex/rectification-opening-plain-20260926` / `.worktrees/rectification-opening-plain-20260926`(本地提交,未推)
- BUG:BUG-1049(开场无例子 + 行话,复发自 BUG-504)、BUG-1050(步骤回执内部名 + 重复)
- Skill:10.0.30 → 10.0.31
## 诊断核对
Claude 的诊断成立,补充两点:
1. 例子丢失是两步叠加:`aa7ccb30`(09-09,BUG-604)把例子从 `GENERIC_COLLECT_QUESTION` 挪进正文第三句,同时把 BUG-504 的断言改成反向(题干**不含**「比如」);`dd8f35f7`(09-11,BUG-646~648)把第三句改写成以题干前 12 个字开头,BUG-585 的前缀去重(`4e0db55f` 起)因此把它删掉。09-11 起刷新路径看不到例子,BUG-1045(`e4c1c7a3`)后实时路径也看不到。BUG-504 的测试没拦住,是因为它被 BUG-604 有意改反了,而接替它的正文检查只测正文字符串,没有走 GET 组装 / 客户端合并。
2. 模型写的开场正文在服务端也先被同一去重剥掉例子句 → 不满足「至少五类」→ 换兜底正文。所以真机看到的是兜底正文去掉第三句,而不是模型的原话。
3. 步骤重复:持久化回执按工具去重,但实时轨迹每次调用一行,结算后保留实时轨迹;「已完成 3 步」数的是调用次数。刷新后才变两行。
## 决策落地
| 决策 | 实现 |
| --- | --- |
| D1 正文 | `openingSpokenBody`:两句,逐字按产品文案;无窗口时省掉「现在先在…之间找」。`buildOpeningBrief` 与 `agentic-rectification.ts` 开场说明同一意思。模型正文验收 `isAcceptableOpeningBody(body, range)`:须含「星盘」「年月」与窗口两端,≤3 句,无问号 / 年份 / 行话(`OPENING_BODY_JARGON`:大运、盘面、分盘、代表分钟、精确到秒、候选、区间、Dasha),最多提 2 个例子;否则换兜底。 |
| D1 题干 | `GENERIC_COLLECT_QUESTION` 逐字按产品文案(74 字,低于 `SPOKEN_PROMPT_MAX` 120)。**新增**:零证据开场题干由服务端固定——`rectification-set-focus` 仍校验模型的 `spokenPrompt`(坏调用照旧失败、照旧计数,BUG-586 的「两次无效不落库」不变),校验通过后存 `GENERIC_COLLECT_QUESTION`,不存模型改写。判定抽成 `isOpeningCollectFollowup`(与 `spokenFollowupForUser` 原 `openingOther` 条件相同)。理由:只靠提示词让模型照抄题干,例子迟早会被改写掉,这正是 BUG-504 这一类的防线。brief 因此改成「spokenPrompt 写『先说一两件你记得的大事』即可,题干由服务端固定」,brief 本身仍不含年份(既有断言)。 |
| D1 题干其他用途 | `GENERIC_COLLECT_QUESTION` 只在零证据开场使用(`spokenFollowupForUser` 的 `openingOther` 分支);另两处是文案清单 `listUserVisibleCopy` 与事故回放夹具 `accidentCaseHardcodedTurns.openingCollect`,都代表开场。无需拆分。 |
| D1 年份 | 示例回答里的 2015 只在题干;正文仍禁止年份(`OPENING_YEAR` 只作用于正文);题干没有年份校验路径(`validateSpokenPrompt` 的年份校验只对 `choice_frame` 题)。「不得用生日推年份」不受影响,Skill 里注明示例年份是固定文案。 |
| D1 去重 | `isQuestionSentence`:正文句与题干整体或题干任一句相同(去空白、句末标点),或字符二元组 Dice ≥ 0.8(`STEM_NEAR_EQUAL_THRESHOLD`)才算复述;以问号结尾照旧删除;删去 12 字前缀规则。BUG-584/585/1045 相关测试全部照旧通过。 |
| D1 范围句 | 开场不再说「最后给区间和代表分钟,不给精确到秒」。检查过:VOICE / DESIGN 没有要求开场必须说;Skill §4 原来要求(已改);交付卡 `REPRESENTATIVE_MINUTE_DISCLAIMER` 未动。 |
| D2 标签 | `rectification-activity-labels.ts` 十四个完成名、十四个进行中句、六个点选活动句全部改大白话(对照表在 VOICE「生时校正开场与步骤名」)。进行中句复用 BUG-1047 已批准的三句。慢步骤句改为「还在 + 进行中句」(原先拼接完成名,改成过去式后读不通)。 |
| D2 去重 | `rectificationTimelineRows` 对已完成步骤按显示名去重(保留第一行;进行中、失败行不动),`rectificationCompletedTrail` 同样去重。失败行改为「进行中句去掉『正在…』+ 未完成」(「重新对照盘面未完成」),避免「重新对照了盘面未完成」。BUG-1047 阶段句逻辑未动。 |
## 改动的既有断言(均带原值 / 新值 / 原因注释)
- `agent-voice-copy-contract.test.ts`「opening body lists domains…」:正文 ≥5 例子 → ≤2 且六个例子都在题干;正文含范围句 → 不含范围句与行话;题干不含「比如」→ 新题干逐字、含「比如」「例如」。
- `rectification-server-focus.test.ts`:题干匹配 /先说你最容易想起的一两件/ → /先说一两件你记得的大事,比如/;「GENERIC_COLLECT_QUESTION invites…」逐字与源码锁改为新题干,年份断言由「无年份」改为「唯一年份是示例里的 2015」。
- `rectification-v9-agent.test.ts` brief 断言:旧题干 → brief 写明题干服务端固定、两句正文、不重复例子、不含范围句与旧题干(仍不含年份)。
- `agent-activity-progress.test.ts`、`rectification-adopt-flow-20260902.test.ts`、`rectification-agentic-entry.test.ts`、`rectification-timeline-adapter.test.ts`、`rectification-latency-20260926.test.tsx`:旧步骤名 → 新步骤名(后两处另加断言,不弱化)。
- 版本号:`skill-registry.test.ts`(sha `51a91251…13c1`)与 16 个测试文件里的 `10.0.30` → `10.0.31`(18 处字面量 + 4 处 `version:` 正则)。遥测夹具里的 `10.0.30` 是任意样例值、不绑定当前版本,未改。
## 新增测试
- `frontend/tests/rectification-opening-plain-20260926.test.ts`(7 条):(a) 零证据题干含比如 / 例如 / 六例 / 唯一年份 2015;带日期经历或重问时不用;模型改写 spokenPrompt 时 set-focus 存服务端题干。(b) 服务端拼接、GET 组装、客户端合并三路正文两句都在、题干 1 次;09-26 staging 旧正文例子句在新去重下保留;逐句 / 近似复述仍删。(c) 正文无行话、旧兜底与一句招呼不被接受、窗口不对不被接受。(d) read-case + set-focus×2 → 两行、「已完成 2 步」;共用名字只一行;全部步骤名无内部词。
- `frontend/tests/rectification-opening-plain-20260926.test.tsx`(2 条):真实 `RectificationAgenticChat` 自动开场(流式 → 结算 → 快照合并),正文与题干各种存法下都只显示一次题干、六例各 1 次、开场这一轮无行话、回执「已完成 2 步」。
修复前验证:把 `e53052a2` 的 `collect-prompt.ts` 单独取出实跑,旧兜底正文 + 旧题干经 `stripQuestionSentences` 的输出恰好是真机看到的两句(例子句被删),与真机一致。另两项按代码推断、未在旧代码上实跑:旧 set-focus 直接存模型的 `spokenPrompt`(`withSpokenPrompt(…, spoken.prompt)`);旧 `rectificationTimelineRows` 逐条映射实时轨迹,read-case + set-focus×2 得三行「已完成 3 步」。
## 验证(Node 22.14,`/exec-daemon`)
| 项 | 结果 |
| --- | --- |
| `tsc --noEmit` | 0 错 |
| `npm run lint` | 0 error,128 warning(与基线同一批文件、同数) |
| `npm test` | 4054 tests / 4002 pass / 24 fail / 28 skip;基线 4045 / 3992 / 25 / 28。失败名单 0 新增;基线的「Gitea quality gate validates before publishing an immutable ACR manifest」在本分支通过(`e53052a2` 恢复了 upload-artifact 文件,基线日志取自其前);24 条均为 Docker/DB。测试名 0 消失、9 条新增 |
| Python 门禁集 | 948 passed / 1 skipped |
| `npm run build -- --webpack` | `/` ○ Static;rootMainFiles gzip 130933 B(基线 130933,0%) |
| 浏览器 | `next start` + Chrome 无头 + CDP 虚构接口,自动开场:题干 1 次、正文两句各 1 次、「已完成 2 步」、行「看了你的资料」「准备好下一个问题」、开场这一轮无行话;截图 `docs/testing/rectification-opening-plain-20260926/`(390 / 1280,收起 / 展开) |
## 环境缺口
- 无登录态真机、无模型凭据:模型实际写出的开场正文是否通过新验收(否则用兜底)、真实开场的步骤序列,留给 `docs/testing/rectification-opening-plain-20260926.md`。
- 未推送、未部署。
+1
View File
@@ -41,6 +41,7 @@
| `TASK-rectification-code-split-20260926.md` | `PROGRESS-rectification-code-split-20260926.md` | **代码拆分(只搬不改)**:聊天组件 2043 行 / 35 useState、`POST` 926 行、`runV9AgentTurn` 1047 行,269 处切源码测试;拆分 + 增长合同 + 切片测试改调用函数。排在 fewer-probes、telemetry 之后 | 已验收 | `3a66c39f` 组件 / `eb773f12` 路由 / `a00c40d4` agent-run;组件本体 1625→630、useState 35→12、POST 927→114、runV9AgentTurn 1046→25;增长合同 8 条 |
| `TASK-rectification-dup-question-20260926.md` | `PROGRESS-rectification-dup-question-20260926.md` | **同一轮问题出现两次(BUG-1045,复发自 BUG-585,BUG-969 拼回题干、去重只在刷新路径)+ 同一道选择题连画两张(BUG-1046:提交失败不回滚本地已答 + 兜底问题块条件过宽;H2 漏收回合)**。先于 latency 单 | 已验收(Claude 09-26 直接执行:子代理复现 A 与 B-H1(选择题提交 409 / 网络错误不回滚本地已答);Claude 变基到含 BUG-1043/1044 的 staging 后独立复验 tsc/lint 0、全量 3981 条失败名单与基线逐条一致、四路由 ○、gzip 不变) | `e4c1c7a3`(已部署 `f1d16405`,health 一致) |
| `TASK-rectification-latency-20260926.md` | `PROGRESS-rectification-latency-20260926.md` | **每轮等待过长(BUG-1047)**:一轮打字回答串行 5 次开思考的模型调用,分类在开流前且无超时。产品定:收尾两步不动、分类保持思考只加 10 秒超时、发出后立即出确定性进度句并按阶段更新;补埋点;服务端无口吻优化须 A/B 逐位一致。排在 dup-question 之后 | 已验收(Claude 09-26 直接执行:子代理实现 D1–D4 与 D5 两项;Claude 用 Node 22 独立复验 tsc/lint 0、全量 4002 条失败名单与 Node 22 基线逐条一致(24 条均为 Docker/DB)、四路由 ○、gzip 不变。D5 第 1 项(探针复用)输出逐字节一致但触发冻结打分身份,Claude 建议暂不做) | `86ff9a40`(已部署 `8a409434`,health 一致) |
| (直接执行,无任务书) | `PROGRESS-rectification-opening-plain-20260926.md` | **开场没有例子、满是行话(BUG-1049,复发自 BUG-504:BUG-604 把例子挪进正文、BUG-648 让例子句与题干同前缀、BUG-585 前缀去重删掉)+ 步骤回执内部名且重复(BUG-1050)**。产品 D1:正文两句大白话、题干带六例与示例回答且服务端固定、去重改整句;D2:步骤名大白话、同名只一行。Skill 10.0.31 | 待验收(子代理实现;tsc/lint 0、全量失败名单与基线一致 0 新增、Python 948/1、`/` ○、gzip 不变) | 分支 `codex/rectification-opening-plain-20260926`(未推) |
| `TASK-rectification-session-title-result-20260922.md` | `PROGRESS-rectification-session-title-result-20260922.md` | **校正会话标题改写结果(BUG-1001)**:BUG-988 把副标题改成最后活动时间后,标题里的日期成了重复;而 BUG-929 删掉 `uniquifySessionTitle` 之后,`resolveSessionTitle` 对校正入口只返回 `生时校正 · M月D日`,**同一天多条标题完全相同**(真机截图:9/17 三条同名、9/16 两条同名、9/14 一天 5 条);旧标题的钟点后缀是创建时间、副标题是最后活动时间,同一行两个对不上的时间。**产品 09-22 拍板**:D1 标题改为承载结果——有 `accepted_time`/`confirmed_time` 写 `生时校正 · HH:MM`,否则写 `candidate_range` 的 `生时校正 · HH:MM–HH:MM`(推翻 BUG-929 的日期口径,但「不得再加墙钟去重后缀」保留);D2 存量批量重算(推翻 BUG-929「旧标题不批量改」,先例 `20260916020000_rectification_session_title_repair.sql`);D3 今日节奏保留日期(我判定的例外);D4 只在结果变化时改 title,`open` 路径不动(对 BUG-699 边界的有限扩展)。**红线**:任何写标题的路径都不得 bump `updated_at`(否则 13 条历史会话集体跳顶、毁掉 BUG-988);标题算式必须只有一处实现(一个 SQL 函数,触发器与回填共用)——BUG-987/992 都栽在「两层规则各写一份」。T4 跨层对断不得让步。已 grep 出真正受影响的只有 7 个文件,Python 侧只查裸字符串、无需改。BUG 段 1001 起 | 已验收(Claude 09-25:单一 SQL 函数、不动 updated_at、手改名不覆盖、回填幂等) | `88fe67df`/`a94a1d67`(已部署) |
| `TASK-rectification-convergence-20260830.md` | `PROGRESS-rectification-convergence-20260830.md` | 收敛重构 v2 | 已验收 | `3a4396a4`、`86ba17ee` |
| `TASK-rectification-decision-authority-20260831.md` | `PROGRESS-rectification-decision-authority-20260831.md` | 决策权威归一与停止语义 | 已合入 | `9f011194` |
@@ -0,0 +1,16 @@
# 生时校正开场改大白话 + 步骤回执去重 · 真机清单(2026-09-26)
本轮在无头 Chrome(`next start` + 虚构接口数据)里截过开场这一轮:`rectification-opening-plain-20260926/`(390 与 1280 两种宽度,各有收起 / 展开步骤两张)。没有登录态真机,也没有跑真实模型——模型自己写的开场正文是否合格、合格率多少,要部署后看。下面留给真人,用自己的账户在 staging 上照做:
1. 新建一次生时校正。开场这一轮只有两段字:
- 正文:「我们来把你的出生时间缩小到更准的范围,现在先在 HH:MM–HH:MM 之间找。做法很简单:你说几件人生里的大事和大概年月,我拿去和星盘对照。」(模型可能换个说法,但意思一样;**不应出现**大运、盘面、分盘、候选、区间、代表分钟、精确到秒,也没有问句和年份。)
- 下面加粗的题:「先说一两件你记得的大事,比如上大学、第一份工作、搬到别的城市、谈恋爱或结婚、家里添丁、生病住院。说个大概年月就行,例如「2015 年夏天换了工作」。」——**逐字一样**,只出现一次。
2. 刷新页面:两段字不变,题目仍只出现一次,六个例子都在。
3. 回答上方写「已完成 2 步」(或 N 步)。点开:是「看了你的资料」「准备好下一个问题」这类大白话,**同一个名字只出现一次**,没有「读取校正记录」「设置对话焦点」。
4. 照着题目说一两件事(例如「2019 年秋天换了工作,2021 年搬到杭州」)。回复里记下这两件,接着出下一题;正常往下走,和以前一样。
5. 回复过程中活动行显示「收到,正在对照你的档案…」→「正在记下这件事…」→「正在重新对照盘面…」→「正在准备下一个问题…」(BUG-1047 的四句,顺序不变)。结束后展开步骤,名字都是大白话、不重复。
6. 走到出结果卡:卡上仍有「这只是代表性候选,不是已确认的唯一出生分钟。」这一句(开场不再说「最后给区间和代表分钟」,但交付卡上的边界没删)。
7. 点历史对话里一次**旧的**生时校正(本轮之前建的):能正常打开,按它原来的版本继续(Skill 升到 10.0.31 不影响旧会话)。旧会话的开场如果当时就是三句旧文案,现在打开会看到第三句「先说你最容易想起的一两件,比如……」重新出现在正文里(以前被误删),题目仍是旧的一句——这是预期。
8. 手机宽度(375 左右):开场两段不溢出,页面不横向滚动。
有任何一步和上面不一样,截图并记下是第几步。
Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB