Files
Jyotisha/docs/tasks/PROGRESS-rectification-opening-plain-20260926.md
T
Jesse_ChenandClaude Opus 5.5 16f4600d5e
Independent Staging Quality Gate / validate (push) Successful in 13m52s
Independent Staging Quality Gate / publish (push) Canceled after 1m31s
docs(tasks): opening-plain acceptance
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-09-26 22:12:56 +08:00

64 lines
9.4 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.
# 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`。
- 未推送、未部署。
## 验收(Claude,2026-09-26)
独立复跑(Node 22.14,基于 `e53052a2`):tsc 0;lint 0 error;`npm test` 4054 / 24 fail / 28 skip,对照 `cs-test.log`(4045 / 25)失败名单仅少一条(「Gitea quality gate validates before publishing an immutable ACR manifest」因 e53052a2 恢复 vendored 文件转绿),无新增失败、无消失测试名;Python 门禁集退出 0;`/` ○ Static,rootMainFiles gzip 130933 B(±0%);提交无删除、未碰 `.gitea/`、`vendor/`。截图核对:开场正文两句大白话、题目带六个例子和答法示例且只出现一次、步骤栏「已完成 2 步:看了你的资料 / 准备好下一个问题」。真实模型开场通过率待真机清单。