docs(tasks): acceptance fix sheet for duplicate delivery and widen staleness (BUG-1241, BUG-1246)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
This commit is contained in:
Jesse_Chen
2026-10-06 13:57:36 +08:00
co-authored by Claude Opus 5.5
parent 4ecf8ee556
commit 2799c53ce0
2 changed files with 91 additions and 1 deletions
+1 -1
View File
@@ -423,5 +423,5 @@
| `TASK-gate-log-volume-20261004.md` | `PROGRESS-gate-log-volume-20261004.md` | 门禁 validate 单步日志 4.4 万行 / 2 MB 网页打不开(run 3170):快速门只打摘要(失败给末 200 行 + 日志文件)、前端测试门禁上 dot + 失败汇总(本机仍 TAP)、拆分 validate 为 7 个 step(产品授权改 workflow,只限拆分与重定向);检查一项不少 | **已实现待验收**(BUG-1230;未推送、未部署;Gitea 各 step 页面是否打得开留待推送后由产品确认) | 分支 `codex/gate-log-volume-20261004` |
| `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-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) | **验收未通过 → 修复单待领取**(Claude 10-06 验收 `b977f482`:T1 出生日期统一、T3 按钮/中文通过;T2 防重只认全等,事故原样「已记录,范围没变。」+改写仍补第二条;`persistApplied` 丢了放宽窗口/选时段后强制的 snapshotCurrent=false(BUG-1246)。tsc 0、lint 0 error、npm 失败与基线同名(+1 首页计时 flaky)、Static、gzip +0.03%) | 分支 `codex/rectification-delivery-dup-adopt-20261006`;修复单 `TASK-rectification-delivery-dup-adopt-fix-20261006.md` |
| `TASK-consult-conversational-answer-20261006.md` | `PROGRESS-consult-conversational-answer-20261006.md` | **普通对话首轮去汇报骨架,改成聊天**(10-06 产品反馈「像机器在汇报」):首轮取消全部 `##`(三个固定节 + 按对象标题,多人改分段落点名)、行动不强制(盘上有具体指向才顺口一句,问「怎么办」再展开)、首轮三到六段;示范删可抄的行动句(实测被逐字照抄);思考栏去「这周可以做什么」。推翻 10-01 D2 与 D8 首轮部分(BUG-1244~1245) | 待验收→修复中 | 28113fa0 验收未通过:`chat-answer-detail` 合同测试新红、示范段落单换行渲染成一整块;修复单 `TASK-consult-conversational-answer-fix-20261006.md` |
@@ -0,0 +1,90 @@
# TASK · 验收修复单:交付两段回答仍会复现 + 放宽窗口后的过期判定被丢(2026-10-06)
- 原任务书:`docs/tasks/TASK-rectification-delivery-dup-adopt-20261006.md`
- 被验收提交:`codex/rectification-delivery-dup-adopt-20261006` @ `b977f482`(基于 staging `86cafe68`)
- 执行:**在同一分支上追加提交**,不新开分支,不 rebase、不 force。
- BUG 编号:BUG-1241 重开(改回 `investigating`,修完再写 `resolved`);新增 **BUG-1246**(1244/1245 已被普通对话单占用)。开工时再核对一次最大号。
## 1. 验收结论(Claude,Linux,Node 22.14)
| 项 | 结论 | 证据 |
| --- | --- | --- |
| T1 判定入参统一(BUG-1242) | **通过** | 生产里所有 `decideFromDossier` 调用都经 `decision-inputs.ts`;新测试 16/16;内存矩阵与源码合同测试成立 |
| T3 按钮判据 + 中文提示(BUG-1243) | **通过** | 盘型卡、分钟卡按 `ADOPT_OUTCOMES && can_adopt`;409 改中文并重拉快照 |
| T2 收尾补位不重复(BUG-1241) | **未通过** | 见 §2.1,事故里的那种消息形状仍会写出第二条 |
| 范围外改动 | **未通过** | 见 §2.2,`persistApplied` 丢了放宽窗口 / 选时段后强制的「快照过期」 |
| tsc | 通过 | 0 错 |
| lint | 通过 | 0 error,126 warning(基线同为 126) |
| npm test | 通过 | 4952 / 25 失败,基线 `86cafe68` 为 4936 / 24。多出的「a full reload of / still plays the loading ring once」是首页计时用例,单独连跑两次 17/17,与本单无关 |
| next build | 通过 | `/` 仍是 `○ Static`;首屏 gzip 636,730 vs 基线 636,565(+165 B,+0.03%) |
## 2. 未通过项
### 2.1 BUG-1241:事故原样的消息仍会补出第二条
答题回复落库的文本是**答题回执加改写版**,不是只有改写版。在 `persistApplied` 里,交付轮的 `persistNextInterviewAfterChoice` 返回 `persisted:false`,于是 `skippedNextInterview=true`,助手消息被拼成:
```
`${input.narration}\n\n${nextInterview.hostNarration}`
→ 「已记录,范围没变。」+ 空行 + 采用旁白 Agent 改写版
```
`input.narration` 来自 `choice-action.ts` 的「已记录,范围没变。」。产品截图里第一条消息开头就是这句。
新的 `deliveryCarrierMatchesLastAssistant` 要求上一条助手原文去掉空白后**全等于**登记的改写版,带回执前缀时不相等,于是收尾仍写出第二条。
复现方法:在 `rectification-delivery-dup-adopt-20261006.test.ts` 里照「the exit fill-in does not write again…」写一条,把 `gateAccounting(REWRITE)` 换成 `gateAccounting(\`已记录,范围没变。\n\n${REWRITE}\`)`。期望写入 0 次,实际 1 次。验收时我跑过,结果是 `expected 0, actual 1`。
PROGRESS 里的真库回放也是只写了改写句、没有回执前缀,所以没有照到这个问题。
### 2.2 BUG-1246:放宽窗口 / 选时段之后的「快照过期」信号被丢
`persistApplied` 原来把 `snapshotCurrent: input.snapshotCurrent` 传给 `decideAfterInferenceChange`,本分支删掉了这一行。这个值不是答题路径「私自传 true」:
- `mutateCaseForWidenWindow` 在用户选 A/B 放宽窗口之后**强制返回 `false`**,在 `rescoreMinuteAfterWindowChange` 失败(日志 `widen rescore deferred`)时也是 false。
- 选时段的 `mutateCaseForBlockChoice`(`block-scan-answer.ts`)选定时段之后同样返回 false。
删掉之后,`decideAfterInferenceChange` 会退回 `scoreableSnapshotCurrentFromDossier`。那个函数用当前证据指纹比对,并且直接沿用**存量结果的** `candidateRangeFingerprint`,看不出窗口变了。证据没变时它判「当前」,结果是:用户刚放宽窗口、重算又失败时,系统可能按**旧窗口**的候选出交付卡、给出可采用状态。修前这种情况一律走「再比一次」。
全量测试没有覆盖这条路径,所以没有变红。这不在任务书授权范围内(任务书只要求统一出生日期)。
## 3. 决策记录
1. 不推翻原任务书的任何决定。T1 / T3 保持现状,不要顺手改。
2. 防重的判据改成「上一条助手原文**包含**登记的交付句」(去掉空白后比子串),不再要求全等。原测试「stored rewrite is not the last reply → still writes once」必须继续成立(上一条不含改写句时仍补写)。
3. `persistApplied` 恢复把调用方给的 `snapshotCurrent` 传进 `decideAfterInferenceChange`。PROGRESS 里关于「过期指纹上强行 true」的顾虑,只在调用方本来就由卷宗算出 snapshotCurrent 的路径成立。`persistNextInterviewIfIdle` / `inspectNonTerminalTurnExit` 用的 `rescored.snapshotCurrent` 本来就是卷宗算出来的,那两处可以保持本分支的写法。
## 4. 任务分解
### F1 防重包含判断(BUG-1241)
- `deliveryCarrierMatchesLastAssistant` 改为包含判断,长度不足 8 字仍不匹配。
- 新增测试:①「已记录,范围没变。」+ 空行 + 改写 → 0 次写入;②「已记录,范围没变;…领先…」这一类带 movement 的回执 + 改写 → 0 次;③上一条只有回执、不含改写 → 1 次。
- **PG17 真库重放**:答题回复按 `persistApplied` 真实拼接(带回执前缀)落库后调收尾,助手交付消息恰好 1 条。在 PROGRESS 贴出两条(或一条)消息的前 20 个字作证据,虚构资料。
- **验收**:上述三条用例通过;BUG-1153 / 1149 的旧用例与本分支 16 条照常通过。
### F2 恢复强制过期信号(BUG-1246)
- `persistApplied` 的 `decideAfterInferenceChange` 恢复 `snapshotCurrent: input.snapshotCurrent`。
- 新增测试:放宽窗口选 A、重算抛错,`persistApplied` 的决策不得是交付或可采用;选时段之后同理。至少一条要覆盖「证据指纹与存量结果相同」,否则测不出差别。
- **验收**:新用例在 `b977f482` 上失败、修后通过(在 PROGRESS 写明两次结果)。
### F3 记录
- BUG_HISTORY:BUG-1241 补「首次修复只认全等,漏了答题回执前缀」,改完再写 `resolved`;新增 BUG-1246(由 BUG-1242 的修复引入,`resolved` 须带 F2 测试)。
- PROGRESS 追加本轮一节:既有断言如有改动,写「原值 / 新值 / 原因」三栏。
- README 状态板该行改为「待验收」。
## 5. 验收口径
与原任务书 §6 相同:tsc 0;lint 0 error;npm test 失败名与 `86cafe68` 基线逐名一致(首页计时用例若再失败须单独重跑证明);`/` Static,gzip ±2%;PG17 真库 F1 重放带回执前缀。
## 6. 开工前置命令
```bash
git -C /workspace/Jyotisha status -sb | head -1
git -C /workspace/Jyotisha fetch origin --prune
cd /workspace/Jyotisha/.worktrees/rectification-delivery-dup-adopt-20261006
git status -sb | head -1 # 必须在 codex/rectification-delivery-dup-adopt-20261006,HEAD=b977f482
grep -o "^## BUG-[0-9]*" docs/BUG_HISTORY.md | sort -t- -k2 -n | tail -1
```