docs(rectification): grounding records — BUG-1055..1058, BUG-593 R1 note, changelog, progress, device checklist
T7 of TASK-rectification-grounding-20260927. Skill not bumped (10.0.31 text unchanged, sliced per turn). regenerate_agentic_rectification_turn kept, to be retired in a later brief. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
717a378b08
commit
2efe225863
@@ -9224,6 +9224,7 @@
|
||||
- 根因:结果投影把 `candidates` 换成推断层,但报告仍喂引擎 `indistinguishable_width_minutes` 和 `dasha_agreement`。分盘上升没有按候选分钟给出星座,模型按换升时刻自己算。
|
||||
- 修复:有推断层时报告宽度用 `credible_range` 含两端分钟数;双轨在 active 候选内重算,引擎原值只留 `dasha_agreement_pre_inference` 供审计。顶层宽度改名 `engine_indistinguishable_width_minutes`。报告给出 `sign_by_candidate`,与分歧面板共用换升函数。确认门不改。Skill 10.0.16 要求只抄该表。
|
||||
补正(2026-09-10):代码里**已有** `dasha_agreement_pre_inference`。BUG-638 修的是引擎原值仍按网格分钟判冲突、与报告口径不一致,不是这个字段缺失。
|
||||
补充(2026-09-27,TASK-rectification-grounding-20260927 R1):旁路。`rectification-offer-candidates` 一直把完整投影交给模型(公开 AA 盘约 100KB:`*_pre_inference`、31KB 对照包、探针),compare 返回里 `engine_indistinguishable_width_minutes` 可被引用、验证报告 Markdown 出现两次。现在 offer 与 compare 走同一套给模型的剥离(`offerModelProjection` / `agentVisibleLatestProjection`):不给 `*_pre_inference`、对照包、探针、引擎宽度,报告 Markdown 只留 `skill_verification_report` 一份;offer 100,012 → 28,799 字节,compare 38,026 → 29,698 字节。病例 API 投影与回执指纹不变。测试 `frontend/tests/rectification-grounding-projection-20260927.test.ts`;本条原测试未改。
|
||||
- 验证:`frontend/tests/rectification-delivery-report-facts.test.ts`:推断窗 04:51–04:53、引擎宽 29、双轨 top 为已淘汰分钟时,报告 `width_minutes === 3` 且正文不含 29 / 已淘汰分钟;D10 05:00 换升时 `sign_by_candidate["04:53"].d10 === "巨蟹座"`。`agent-voice-copy-contract` / `skill-registry` 锁 10.0.16 新句。
|
||||
- 防复发:交付轮宽度、双轨、分盘星座必须来自推断层报告字段,不得再把引擎原跨度或换升时刻交给模型自算。
|
||||
- 相关记录:BUG-545、BUG-568、BUG-290、BUG-638
|
||||
@@ -14202,6 +14203,67 @@
|
||||
- 复发自:无
|
||||
- 修复版本:`75a1844c`,随 `cd4dde9d` 部署 staging(run 2964)。
|
||||
|
||||
## BUG-1055 | 生时校正证据轮:服务端范围句被裁句裁掉,旧范围反而落库
|
||||
|
||||
- 状态:resolved(本地修复 `codex/rectification-grounding-20260927`,未推送;待部署 staging 与真机清单)
|
||||
- 首次发现 / 最近更新:2026-09-27 / 2026-09-27
|
||||
- 影响面:`frontend/src/lib/rectification-agentic/v9/agent-run-attempt.ts`(结算段)、`agent-run-finish.ts`(证据轮裁句)、`agent-run-support.ts`(`composeSpokenWithServerFacts`)、新增 `spoken-grounding.ts`;`rectification-record-evidence-batch` 返回;系统提示 `agentic-rectification.ts`。
|
||||
- 用户现象:说一件带年月的事,范围句「范围从 A 变为 B。」在流式时闪出一下又被撤回,落库只剩模型的第一句;模型第一句写了开轮时的旧范围时,旧范围落库。「这次没有重新比较」「候选比较这次没跑成」同样会被裁掉。
|
||||
- 触发条件:证据轮模型正文 ≥ 2 句(加上范围句超过两句即触发「只留首句」),或模型正文带时刻 / 百分比。诊断用真实 `runV9AgentTurn` 复现(两句正文 → 落库只剩首句;首句带旧范围 → 旧范围落库)。
|
||||
- 根因:服务端事实句与模型正文共用「先拼后裁」的管线:attempt 把范围句接到正文末尾并先流式放出,finish 再按 `trimEvidenceTurnBody`(超过两句只留首句)裁剪并 `replace`。batch 工具返回里没有重算后的范围,模型唯一的范围来源是开轮读到的旧值;系统提示还鼓励「有收窄就说进度」。证据轮与交付轮正文没有任何数字校验。
|
||||
- 修复:attempt 不再流式放出事实句,只把结构化事实(比较失败 / 未重算 / 开轮范围 / 结算范围)与当轮数字白名单交给 finish;finish 先对模型正文执行 P3 数字白名单(带时刻、时刻区间或百分比且不等于当轮服务端事实的句子整句丢弃,正则只当门不在句中删词;一句不剩时用 batch 回执复述代替),再按 BUG-606 / BUG-615 裁句,最后接服务端事实句,一次 `replace` 与落库一致。batch 返回 `range_after_rescore`(重算后可信范围、代表分钟、吻合率、`delivers_range_this_turn`),回执指纹仍按旧形状计算。系统提示改为「范围由系统说,除出牌轮外不写时刻和百分比」,出牌三句只在 batch 说本轮交付时写。
|
||||
- 验证:`frontend/tests/rectification-grounding-20260927.test.ts`(9 条:两句正文保住范围句且流式终态 = 落库;三句正文裁成一句范围句完整;首句旧范围整句不落库;编造吻合率被丢、服务端吻合率保留;重算后范围与代表分钟可复述;正文被白名单清空时用 batch 复述;「这次没有重新比较」「候选比较这次没跑成」在多句正文下保留且不被撤回;白名单单元)。前 8 条在未改动基线上全部失败。`rectification-grounding-projection-20260927.test.ts` 锁 batch `range_after_rescore` 与回执指纹不变。BUG-588 原测试(`rectification-probe-replay-loss-20260908.test.ts`)未改、仍通过。
|
||||
- 为什么旧测试没拦住:BUG-588 的回归只用单句正文(「记下了。」「接下来我们继续。」),加上范围句正好两句,不触发裁句;源码合同只锁「先剪问句再接范围句」的顺序,没有一条用多句正文跑真实 `runV9AgentTurn` 看落库。
|
||||
- 防复发:服务端事实句不得早于正文最终态流式放出,也不得再进入任何裁句 / 过滤;证据轮落库正文里的时刻、区间、百分比必须等于当轮服务端事实。新增旁白规则必须用多句正文与带数字正文跑真实 `runV9AgentTurn`。
|
||||
- 相关记录:BUG-588、BUG-594、BUG-606、BUG-615、BUG-585、BUG-1053(同为「写正文的步看不到事实」一族)。
|
||||
- 复发自:BUG-588(证据轮范围句,本次在裁句一侧丢失)。
|
||||
- 修复版本:`codex/rectification-grounding-20260927`(本地提交,未推送)。
|
||||
|
||||
## BUG-1056 | 生时校正「重试(重新生成)」盲写且不校验就落库
|
||||
|
||||
- 状态:resolved(产品 2026-09-27 决定下线入口;本地修复 `codex/rectification-grounding-20260927`,未推送)
|
||||
- 首次发现 / 最近更新:2026-09-27 / 2026-09-27
|
||||
- 影响面:原 `POST /api/rectification/cases/[caseId]/turns/[turnId]/regenerate`、`v9/regenerate-turn.ts`、`getRectificationV9RegenerationAgent`、`createRectificationV9ReadOnlyTools`;校正消息操作栏(`rectification-message-entry.tsx`、`rectification-agentic-chat.tsx`、`rectification-chat-view.ts`、`rectification-surface-state.ts`、`rectification-chat-message-actions.ts`);`ChatMessageActions`。
|
||||
- 用户现象:点校正回答下的「重新生成」,新正文可以写出与卡片不符的范围和吻合率并直接替换旧正文(诊断复现:写出「范围收在 09:00–09:05,吻合率 90%」原样落库,实际范围 08:54–09:24)。
|
||||
- 触发条件:生时校正里点最近一条助手回答的重新生成。
|
||||
- 根因:重新生成走 V5 之前的自由重写:`agent.generate` 只拿旧正文 + read-case(且 read-case 在 9 个候选时已清空对话,见 BUG-1057),Skill 未注入,输出不剪问句、不补范围句、不查数字与禁用词,直接调 `regenerate_agentic_rectification_turn` 落库。
|
||||
- 修复:产品 P1 决定删除入口(多余入口宁可删除也不修):删掉重新生成路由、服务端模块、重新生成 Agent 与只读工具集、客户端重新生成动作与状态、`regenerating` / `canRegenerate` 属性;`ChatMessageActions` 不传 `onRegenerate` 时不画重新生成按钮,普通对话不变。数据库函数 `regenerate_agentic_rectification_turn` 本单不动(AGENTS §7.6 两轮规则),待另开单退役。
|
||||
- 验证:`frontend/tests/rectification-grounding-regenerate-20260927.test.ts`(校正回答只有赞 / 踩 / 复制;普通对话操作条仍有「重新生成回答」;路由与服务端代码已删、`src` 不再引用该函数、迁移里的函数仍在)。既有断言按三栏改写(见 PROGRESS);`rectification-v9-regenerate.test.ts` 整份删除(测的是已删除的接口)。
|
||||
- 防复发:生时校正里任何写入助手正文的新路径都必须经过与主链相同的剪问句、事实句与数字白名单,不得再有只读自由重写。
|
||||
- 相关记录:BUG-1055、BUG-1057、BUG-1053。
|
||||
- 复发自:无。
|
||||
- 修复版本:`codex/rectification-grounding-20260927`(本地提交,未推送)。
|
||||
|
||||
## BUG-1057 | 生时校正 read-case 超 6KB 时先清空对话与证据(候选多时「失忆」)
|
||||
|
||||
- 状态:resolved(本地修复 `codex/rectification-grounding-20260927`,未推送)
|
||||
- 首次发现 / 最近更新:2026-09-27 / 2026-09-27
|
||||
- 影响面:`frontend/src/lib/rectification-agentic/v9/turn-decision.ts`(`projectTurnDecision`、`enforceTurnDecisionBudget`、新增 `modelVisibleInference`);compare / offer 给模型的 `inference_state`。
|
||||
- 用户现象:候选多(约 7 个及以上的常见窗口)时,用户说「那年」「刚才那件事」,助手像没听过前文。
|
||||
- 触发条件:turn-decision 投影超过 6KB。公开 AA 盘 30 分钟窗 9 个候选、2 条短对话即触发(5,639 字节,`truncated: true`,对话与证据摘要都是空数组)。
|
||||
- 根因:模型消息里没有历史(只有 bootstrap + 本轮用户话),read-case 的 `recent_turns` 与 `relevant_evidence_summary` 是唯一对话记忆;预算裁剪却最先砍它们,保留每个约 458 字节的候选定位元数据(窗口序号、偏移、区间明细),`candidate_summary.candidates` 还与 `inference.candidates` 重复。现有测试只断言不超上限。
|
||||
- 修复:给模型看的候选只留 time / score / status / cluster_range(上一轮淘汰与分差改按时刻列出),删去重复的 `candidate_summary.candidates`;超限顺序改为:先去掉 cluster_range → 只留最好的 6 个候选(未淘汰优先,注明省略数)→ 缩短对话与证据 → 最后才清空(`truncated`)。落库的推断状态与回执不变。
|
||||
- 验证:`frontend/tests/rectification-grounding-read-case-20260927.test.ts`(真实引擎 fixture 9 个候选 + 6 条对话:对话 6 条、证据 3 条都在、候选只有四个字段、无重复列表、≤6KB;超限时先砍候选明细再动对话;第一步只去 cluster_range)。体量:9 个候选 2 条对话 5,639 → 3,022 字节(对话 0 → 2 条、证据 0 → 3 条);6 条对话 3,420 字节。
|
||||
- 防复发:read-case 的预算裁剪不得先动 `recent_turns` / `relevant_evidence_summary`;新增投影字段要按候选数量级核算体量。
|
||||
- 相关记录:BUG-1056(重新生成读到的就是被清空的 read-case)、BUG-1055。
|
||||
- 复发自:无。
|
||||
- 修复版本:`codex/rectification-grounding-20260927`(本地提交,未推送)。
|
||||
|
||||
## BUG-1058 | 点选题答案里顺手说了带年月的经历:范围变了没人说
|
||||
|
||||
- 状态:resolved(本地修复 `codex/rectification-grounding-20260927`,未推送;真机清单待走)
|
||||
- 首次发现 / 最近更新:2026-09-27 / 2026-09-27
|
||||
- 影响面:`frontend/src/lib/rectification-agentic/v9/agent-route-typed-message.ts`(点选焦点的 `deferFollowup` 分支)、`agent-route-support.ts`(`RectificationAgentTurnState.rangeBeforeTurn`)、`agent-route-agent-turn.ts`、`agent-run.ts` / `agent-run-attempt.ts`(`rangeBeforeTurn` 选项)。
|
||||
- 用户现象:对着点选题打字「有,2023 年 3 月换了工作」,答题让范围收窄了,但这条回复里没有任何范围句。
|
||||
- 触发条件:分类器判为回答当前点选题且带新的带日期事件(`has_new_dated_event`),走 `deferFollowup` 交给 Agent 轮。
|
||||
- 根因:`applyRectificationChoice` 在 Agent 轮之前已写入答题后的新推断,`deferFollowup` 时它的旁白(含范围句)不落库;随后 Agent 轮 prepare 读到的「开轮范围」已是答题后范围,结算时前后相同,也不写范围句。两边都不说。
|
||||
- 修复:二选一取「把答题前范围交给随后的 Agent 轮」:typed-message 在 `deferFollowup` 时把答题前的 `credible_range` 写进 `turnState.rangeBeforeTurn`,Agent 轮用它做开轮范围。理由:只有一条服务端范围句、走 BUG-1055 的同一条事实句通道(不裁、不撤回),答题与经历两次变化合成一句;不把 `applied.narration` 并入正文,避免同一条消息出现两句范围。
|
||||
- 验证:`frontend/tests/rectification-grounding-route-20260927.test.ts`(真实 `POST /api/rectification/agent` + typed-message + agent-turn + `runV9AgentTurn`,模块替身只替掉答题写入、分类器、Agent 流、计费与出口门):答题收窄、经历不再变 → 落库有且仅有「范围从 04:50–05:10 变为 04:55–05:05。」;经历再收窄 → 一句从答题前算到最终。去掉修复后两条都失败。
|
||||
- 防复发:任何「先确定性写入、再交给 Agent 轮」的路径,都要把写入前的事实传给 Agent 轮,不得让 prepare 读到的状态充当开轮状态。
|
||||
- 相关记录:BUG-588、BUG-569、BUG-1055。
|
||||
- 复发自:无(BUG-588 / BUG-569 同族,新路径)。
|
||||
- 修复版本:`codex/rectification-grounding-20260927`(本地提交,未推送)。
|
||||
|
||||
## BUG-1059 | 调工具那一步没写完的半句过程说明,会粘到下一步正文开头
|
||||
|
||||
- 状态:resolved(已部署 staging:门禁 run 2962 通过,deploy run 2964,`/api/health` gitCommit = `cd4dde9d`;真机清单待产品走)
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
# PROGRESS · 生时校正:旁白事实有据 + 去掉重试按钮 + 给模型的资料瘦身 · 2026-09-27
|
||||
|
||||
- 执行方式:直接执行(产品负责人授权子代理执行;Claude 事后独立验收)
|
||||
- 任务书:`docs/tasks/TASK-rectification-grounding-20260927.md`(`a98d3b20`)
|
||||
- 基线:开工 `origin/staging` `a98d3b20`(诊断基于 `599fe7a9`);中途 staging 合入数据卡单(`cd4dde9d`),本分支已 rebase 到 `cd4dde9d`,最终对比基线全部在 `cd4dde9d` 上重跑;随后再 rebase 到 `19376089`(只改 `docs/BUG_HISTORY.md` 的纯文档提交,代码树与 `cd4dde9d` 相同)。
|
||||
- 分支:`codex/rectification-grounding-20260927`,工作树 `.worktrees/rectification-grounding-20260927`(本地提交,未推送)
|
||||
- BUG 编号:预留 BUG-1055~1058,开工与提交时核对(开工最大号 1054;rebase 后 staging 有 1059,本单 1055~1058 未被占用)
|
||||
- Skill:不 bump。`jyotish-birth-time-rectification` 10.0.31 文本未改,只是证据轮按章节切片发送;registry 不动。
|
||||
- 数据库:不动。`regenerate_agentic_rectification_turn` 保留,**待另开单退役**(AGENTS §7.6 两轮规则:本轮先下线代码)。
|
||||
|
||||
## 提交
|
||||
|
||||
| 任务 | 提交 | 内容 |
|
||||
| --- | --- | --- |
|
||||
| T1 | `0e0baaa7` | BUG-1055:事实句不参与裁句、不先流后撤;P3 数字白名单(`spoken-grounding.ts`);batch 返回 `range_after_rescore`;系统提示「范围由系统说」 |
|
||||
| T4 | `5a808449` | BUG-1058:`deferFollowup` 路径把答题前范围交给 Agent 轮(`rangeBeforeTurn`);路由级回归 |
|
||||
| T2 | `84eb2315` | BUG-1056:删除校正重新生成(路由、服务端模块、Agent、只读工具集、客户端动作与状态);`ChatMessageActions` 无 `onRegenerate` 不画按钮;DESIGN / VOICE |
|
||||
| T3 | `13d93020`、`5b9fbe5b` | BUG-1057:read-case 候选四字段、去重复列表、超限先砍候选明细;(后者只修测试里的类型转换) |
|
||||
| T5 | `1ed3e555` | R1:offer 走 compare 同一套剥离;报告 Markdown 只留一份;引擎宽度不给模型 |
|
||||
| T6 | `c4bb394b` | R4 + Skill 切片:证据轮只附 §5/§7;关 Mastra `<available_skills>` 注入 |
|
||||
| — | `717a378b` | T3/T5 跟进:同样行为,改写法避免新增 3 条 unused-var 警告 |
|
||||
| T7 | 本提交 | BUG 历史、CHANGELOG、本记录、真机清单、任务索引 |
|
||||
|
||||
T4 先于 T2 提交(T1 的 attempt 改动已带 `rangeBeforeTurn` 选项,T4 只接路由)。
|
||||
|
||||
## 各项怎么修的
|
||||
|
||||
| 项 | 做法 |
|
||||
| --- | --- |
|
||||
| D1 / BUG-1055 | attempt 结算时不再把「范围从…变为…」「这次没有重新比较」「候选比较这次没跑成」接进正文、也不流式放出;只把结构化事实(`TurnServerFacts`)和当轮数字白名单(`SpokenFactWhitelist`:结算后可信范围与区间、代表分钟、决策范围、吻合率)交给 finish。finish 顺序:① 证据轮对模型正文跑白名单(任何一句的时刻 / 时刻区间 / 百分比不在白名单就整句丢;一句不剩用 batch 回执复述)→ ② BUG-606 / BUG-615 裁句(只作用于模型正文)→ ③ `composeSpokenWithServerFacts` 接事实句(沿用原 `withCompareFailedRetryNotice` / `withRescoreSkippedNotice` / `withRangeChangedAfterEvidence` 的格式)→ ④ 交付时的缺口句 → 与已流式文本不同则一次 `replace`。batch 返回 `range_after_rescore`(`credible_range`、`representative_time`、`event_fit_percent`、`delivers_range_this_turn` = 无下一问且 `deliveryNarrationAllowed`),回执指纹仍按旧形状算。系统提示:删「有收窄就说进度」,改为范围由系统说、除出牌轮外不写时刻和百分比;出牌三句只在 `delivers_range_this_turn=true` 时写、数字只抄它(R3)。 |
|
||||
| D2 / BUG-1056 | 路由只服务校正 → 整条删除(Next 返回 404)。删 `regenerate-turn.ts`、`getRectificationV9RegenerationAgent`、`createRectificationV9ReadOnlyTools`、交付守卫的 `"regenerate"` 触发源、`insertV9SkillRunReceipt` 的 `"regeneration"` 分支类型;客户端删 `regenerateRectificationMessage`、`regeneratingMessageKey`、`regenerating` / `canRegenerate` / `latestRegeneratableKey`、问题空档输入的 `regenerating`。`ChatMessageActions` 的 `onRegenerate` / `canRegenerate` 改可选,不传不画按钮;普通对话照旧传。 |
|
||||
| D3 / BUG-1057 | `modelVisibleInference`:候选只留 `time` / `score`(= 推断概率,保留三位小数)/ `status` / `cluster_range`;上一轮 `eliminated_ids` / `score_deltas` 改按时刻(`eliminated_times`)。删 `candidate_summary.candidates`。`enforceTurnDecisionBudget` 新顺序:去 cluster_range → 最好 6 个候选(未淘汰优先,`candidates_omitted`)→ 对话 4 条 / 证据 3 条 → 清空(`truncated`)。compare / offer 的 `inference_state` 用同一个瘦身视图。 |
|
||||
| D4 / BUG-1058 | 二选一选「把答题前范围交给 Agent 轮」:只出一条服务端范围句、走 D1 的事实句通道(不裁、不撤回),答题与经历两次变化合成一句;若把 `applied.narration` 并进正文,同一条消息会有两句范围。实现:typed-message 在点选焦点 `deferFollowup` 时写 `turnState.rangeBeforeTurn = previous?.credible_range`,Agent 轮用它当开轮范围。收集焦点拒答的 `deferFollowup` 不改推断,不传。 |
|
||||
| R1 | `offerModelProjection` = `agentVisibleLatestProjection(payload)`;后者再去掉 `engine_indistinguishable_width_minutes` 与 `range_delivery.verification_markdown`(与 `skill_verification_report.markdown` 逐字相同)。病例 API 的 `latestResultToolProjection` 与回执不变。 |
|
||||
| R3 | 见 D1:写正文时是否交付由 batch 的 `delivers_range_this_turn` 告诉模型,吻合率也在里面;数字仍过白名单。 |
|
||||
| R4 | 校正 Agent 加 `inputProcessors: [rectificationSkillBoundProcessor]`(`providesSkillDiscovery: "on-demand"`,与咨询 Agent 的做法相同):Mastra 不再加 `<available_skills>`(含临时目录路径)与「请调用 skill 工具」两条系统消息,`agent.getSkill` 仍按绑定版本加载。 |
|
||||
| Skill 切片 | `skill-slice.ts`,规则常量 `RECTIFICATION_SKILL_SECTIONS_BY_ACTION`:证据轮按标题取「ConversationFocus 与意图承接」「批量证据与日期真实性」(10.0.x 的 §5、§7),前面加一句「本轮是证据轮…其余章节不适用」;开场、只读等其余动作发整份。按标题不按编号:9.0.0 的编号不同(它的 §5 是候选语言),找不齐标题就整份发,历史 Case 仍按绑定版本原文运行(BUG-621)。§6(全是 `full_diagnostics` 才有的字段:`method_followup_plan`、`guided_collect_windows`…)在证据轮不再发送。 |
|
||||
|
||||
## 红线测试清单
|
||||
|
||||
| 红线 | 测试 |
|
||||
| --- | --- |
|
||||
| 1 事实句不裁、流式终态 = 落库、不先出后撤 | `rectification-grounding-20260927.test.ts`:repro 1(两句)、repro 1b(三句)、repro 2、「这次没有重新比较」、「候选比较这次没跑成」——都断言 `states.at(-1) === persisted` 且事实句一旦出现不再消失(`assertNeverWithdrawn`);`rectification-grounding-route-20260927.test.ts` 两条(路由级 `shown === persisted`) |
|
||||
| 2 时刻 / 区间 / 百分比 = 当轮事实 | 同文件:首句旧范围整句不落库、编造吻合率 90% 被丢 / 服务端 80% 保留、重算后范围与代表分钟可复述、白名单单元(整句门、不在句中删词) |
|
||||
| 3 9 个候选仍保留对话与证据 | `rectification-grounding-read-case-20260927.test.ts`:真实引擎 9 候选 + 6 条对话;超限先砍候选明细;第一步只去 cluster_range |
|
||||
| 5 历史会话(BUG-621) | `rectification-grounding-prompt-20260927.test.ts`:9.0.0 快照仍可 `resolveExactSkillPackage`,切片对它整份返回;Skill 未 bump,既有 `skill-registry` / `rectification-history-open-20260909` 测试照旧通过 |
|
||||
| D2 | `rectification-grounding-regenerate-20260927.test.ts`(校正无重新生成、普通对话有、路由与代码已删、DB 函数仍在迁移里) |
|
||||
| R1 | `rectification-grounding-projection-20260927.test.ts`(offer / compare 模型视图,真实引擎响应) |
|
||||
| R4 / 切片 / 体量 | `rectification-grounding-prompt-20260927.test.ts`(真实 `runV9AgentTurn` + 真实 Agent + 记录提示词的假模型:无 `<available_skills>`、只含 §5/§7、每次调用固定开销 < 8K) |
|
||||
|
||||
未改动基线上:`rectification-grounding-20260927` 的 8 条运行级用例全部失败;路由级 2 条在去掉修复后失败。
|
||||
|
||||
fixture:`frontend/tests/fixtures/rectification-grounding-aa-30min.golden.json`,诊断时本机真实引擎对公开 AA 盘(30 分钟窗、3 件公开事件)的 `runV9CandidateScore` 请求与响应(388KB,AGENTS §7.4)。
|
||||
|
||||
## 体量前后对比
|
||||
|
||||
测量方法:同一个脚本分别在 `cd4dde9d`(改前)与本分支(改后)上跑:真实 `runV9AgentTurn`(证据轮)+ 真实 `getRectificationV9Agent`(真实绑定 Skill 10.0.31、真实工具)+ 记录每次调用提示词的假模型;数据是上面的公开 AA 盘 fixture(9 个候选)。token 为估算:每个 CJK 字符(含全角标点)记 1,其余字符每 4 个记 1(`estimateTokens`,不是供应商分词器)。「固定开销」= 每次调用都会重发、与工具结果无关的部分:全部 system 消息 + 工具 schema。
|
||||
|
||||
| 每次调用 | 改前 | 改后 |
|
||||
| --- | --- | --- |
|
||||
| system 消息字符数 | 13,083 | 3,925 |
|
||||
| system 消息 token | 8,211 | 2,680 |
|
||||
| 工具 schema(第 1 步只有 read-case) | 797 B / 229 | 797 B / 229 |
|
||||
| 工具 schema(第 2 步起 14 个工具) | 13,796 B / 3,791 | 13,796 B / 3,791 |
|
||||
| **固定开销,第 1 步** | **8,440** | **2,909** |
|
||||
| **固定开销,第 2 步起** | **12,002** | **6,471**(目标 < 8K) |
|
||||
| 第 1 次调用合计输入 | 8,556 | 3,025 |
|
||||
| 第 2 次调用合计输入(含 read-case 结果) | 13,605 | 7,417 |
|
||||
|
||||
system 消息改前 = 系统提示 1.5K 字 + Skill 全文 10.7K 字 + Mastra 技能清单与「调用 skill 工具」约 0.95K 字;改后 = 系统提示 + Skill §5/§7。工具 schema 没动(按轮次收窄 schema 是可选项,本单未做,见让步)。
|
||||
|
||||
典型「read-case → compare → 写正文」三次调用合计(前两次实测,第三次 = 第二次 + compare 返回):改前约 8,556 + 13,605 + (13,605 + 10,488) ≈ 46.3K;改后约 3,025 + 7,417 + (7,417 + 8,129) ≈ 26.0K。
|
||||
|
||||
| 工具返回(给模型看的) | 改前 | 改后 |
|
||||
| --- | --- | --- |
|
||||
| read-case,9 候选 + 2 条对话 | 5,639 B,`truncated`,对话 0 / 证据 0,候选明细 3,778 B | 3,022 B,对话 2 / 证据 3,候选 754 B |
|
||||
| read-case,9 候选 + 6 条对话 | 5,639 B,`truncated`,对话 0 / 证据 0 | 3,420 B,对话 6 / 证据 3 |
|
||||
| compare | 38,026 B(约 10.5K token) | 29,698 B(约 8.1K token) |
|
||||
| offer | 100,012 B | 28,799 B |
|
||||
|
||||
read-case 内容对比(9 候选):改前每个候选带 `id`、`probability`、`posterior_score`、`rank`、窗口定位五项(`candidate_date` / `window_index` / `window_offset_minutes` / `segment_index` / `cluster_intervals`),另有 `candidate_summary.candidates` 重复一份前 6 个;超限后对话与证据被清空。改后每个候选只有 `time` / `score` / `status` / `cluster_range`,无重复列表,对话与证据都在。
|
||||
|
||||
## 测试与构建(最终在 rebase 后的分支上跑)
|
||||
|
||||
| 项 | 基线 `cd4dde9d` | 本分支 | 结论 |
|
||||
| --- | --- | --- | --- |
|
||||
| `tsc --noEmit` | — | 0 错 | 通过 |
|
||||
| `npm run lint` | 0 error / 127 warning | 0 error / 127 warning(逐条同名单) | 通过;中途多出的 3 条 unused-var 由 `717a378b` 改写法消掉 |
|
||||
| 全量前端测试(Node 22.14,TAP 写文件避免 stdout 吞行) | 4136 tests,fail 24 | 4152 tests,fail 24 | 失败名单逐条一致(24 条均为无 Docker 的 DB / 部署套件);新增 27 个测试名 |
|
||||
| 消失的测试名 | — | 11 个 | 8 个是删掉的 `rectification-v9-regenerate.test.ts`;3 个改名:`completed Agent replies restore feedback, copy and safe in-place regeneration actions`、`question gap: nothing is shown while busy, readonly, regenerating, or for non-resumable cases`、`reply regeneration is a separate Jyotisha agent with only read-case access`(三栏见下表) |
|
||||
| 全量 Python 门禁集(`gate-pytest-args.txt`,含 `test_api_server_growth_contract.py`) | 948 passed / 1 skipped | 948 passed / 1 skipped | 通过;未改 Python、`scripts/jyotish_api_server.py` 未动,伪造点与方法数不变 |
|
||||
| `npm run build -- --webpack` | `/`、`/chart`、`/ephemeris`、`/people` ○ Static | 同左 ○ Static | 通过 |
|
||||
| rootMainFiles gzip(level 9,4 个文件) | 131,145 B | 130,933 B | −0.16%,在 ±2% 内 |
|
||||
| 首页 index.html 引用的 36 个 js/css gzip | 661,107 B | 660,413 B | −0.10% |
|
||||
| `tests/*.py` 读前端文本 | — | 已 grep 本单改动的文件名与文案(重新生成、`有收窄就说进度`、`candidate_summary`、消息组件等),无 Python 合同命中 | — |
|
||||
|
||||
失败名单对比方法:`tsx --test --test-reporter=tap --test-reporter-destination=<file> tests/*.test.ts tests/*.test.tsx`,取 `^(not )?ok N - ` 行排序后 `comm`;基线在 `cd4dde9d` 的一次性工作树上跑。构建后已删 `frontend/frontend/`。
|
||||
|
||||
## 改动的既有断言(原值 / 新值 / 原因)
|
||||
|
||||
每处在测试文件里都写了三栏注释,这里汇总:
|
||||
|
||||
| 文件 · 用例 | 原值 | 新值 | 原因 |
|
||||
| --- | --- | --- | --- |
|
||||
| `rectification-v9-agent` · set-focus after spoken text… | 第二句「范围收到 05:00 到 05:10。」 | 「这件事拿去和星盘对照了。」 | P3:夹具无候选快照,手写时刻整句不落库;本用例锁 set-focus 之后不接第二段 |
|
||||
| `rectification-v9-agent` · agent-run strips question sentences… | 首句「范围已经收到,收在 05:00–05:10。」 | 「2016 年 9 月去北京工作,这件事拿去和星盘对照。」 | 同上;剪问句断言不变 |
|
||||
| `rectification-v9-agent` · delivery persist keeps three sentences… | 首句「目前范围 04:49–04:53。」,回执无吻合率 | 「代表分钟是 05:02。」,回执加 `event_fit_rate` 80% | P3 只放行当轮事实;三句 / 四句裁三句的断言不变 |
|
||||
| `rectification-v9-agent` · reply regeneration is a separate… | 断言重新生成 Agent 与只读工具 | 改名「rectification has no reply-regeneration agent…」,断言两者不存在 | BUG-1056 删除 |
|
||||
| `rectification-surface-state` · question gap: nothing is shown while busy, readonly, regenerating… | 含 `regenerating: true` → idle | 去掉 regenerating 与该断言(改名) | 输入已无此项 |
|
||||
| `rectification-agentic-entry` · completed Agent replies restore feedback, copy and safe in-place regeneration… | 容器有重新生成请求、路由不计费且按绑定 Skill | 改名「…feedback and copy, no regeneration」;断言校正不传 `onRegenerate`、无请求、路由文件不存在 | BUG-1056 |
|
||||
| `api-service-unavailable-20260904` | 路由清单含 regenerate | 移出 | 文件已删 |
|
||||
| `chat-composer-queue` | `/if \(busy \|\| regeneratingMessageKey\) \{/` | `/if \(busy\) \{/` | 排队行为不变 |
|
||||
| `rectification-answer-choice` · attempt timeout stays under… | 另断言 regenerate 路由 maxDuration | 只断言 agent 路由 | 文件已删 |
|
||||
| `rectification-delivery-ui-simplify` · already_delivered… | 断言 regenerate 路由 `trigger: "regenerate"` | 删该断言 | 触发源随之删除 |
|
||||
| `rectification-request-dossier-cache` | 路由清单含 regenerate | 移出 | 文件已删 |
|
||||
| `rectification-v9-stream` · whole-run budget is less than both route maxDuration values | 另断言 regenerate 路由 | 只断言 agent 路由(名称保留) | 文件已删 |
|
||||
| `rectification-settled-render-split` | 传 `regenerating` / `canRegenerate` / `latestRegeneratableKey` / `regeneratingMessageKey` | 去掉 | 属性已删;渲染计数断言不变 |
|
||||
| 11 个文件里的问题空档输入 `regenerating: false,`(delivery-vs-collect、open-collect-invite、post-adopt-verify、probe-pool-exhausted、replay-20260911、spoken-orphan、surface-state、targeted-card-live、targeted-spoken-focus-recovery、tiebreak-before-card、tied-first-fix)与 `rectification-chat-run-fixtures` 的 `regeneratingMessageKey: null` | 有这一项 | 删除这一行 | 输入类型已无此项(tsc 会拒绝多余属性);各断言不变 |
|
||||
| `rectification-v9-regenerate.test.ts` | 8 条重新生成用例 | 整份删除 | 测的是已删除的接口;替代为 `rectification-grounding-regenerate-20260927.test.ts` |
|
||||
|
||||
BUG-588 原测试(`rectification-probe-replay-loss-20260908`)、BUG-593 原测试(`rectification-delivery-report-facts`)、BUG-615 源码合同(`rectification-delivery-ui-simplify` 的裁句顺序)未改、仍通过。
|
||||
|
||||
## 让步与未做
|
||||
|
||||
- T6 可选项「按轮次收窄每步工具 schema」未做(第 2 步起 14 个工具 3,791 token 仍是固定开销的大头;固定开销已低于 8K,留下一单)。
|
||||
- compare 返回仍约 29.7KB(`range_delivery.columns`、`window_scan`、`candidates`、审计表等),本单只按任务书剥离了推断前数据、对照包、探针、重复 Markdown 与引擎宽度。
|
||||
- `delivers_range_this_turn` 是 batch 时刻按服务端交付判定(无下一问 + `deliveryNarrationAllowed`)给出的;finish 里 `persistNextInterviewIfIdle` 若再触发陈旧快照重算,最终是否交付以它为准(模型正文仍过白名单与三句上限)。
|
||||
- 证据轮切片不含 §9(候选语言);交付轮的边界句由系统提示第 5 条与白名单保证。若验收认为交付轮需要 §9,可在常量里加标题。
|
||||
- 数据库函数 `regenerate_agentic_rectification_turn` 待另开单退役。
|
||||
|
||||
## 环境缺口
|
||||
|
||||
- 无 Docker:24 条 DB / 部署套件失败,与基线逐条一致(见上)。
|
||||
- 无真实模型凭据:真实模型下的旁白质量、`delivers_range_this_turn` 时的三句写法,需部署后按 `docs/testing/rectification-grounding-20260927.md` 走真机。
|
||||
@@ -36,7 +36,7 @@
|
||||
| 任务书 | 进度 | 主题 | 状态 | 落点 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| `TASK-rectification-fewer-probes-card-20260926.md` | [PROGRESS](PROGRESS-rectification-fewer-probes-card-20260926.md) | **减少无效追问 + 卡片区间为主**:引导补件离线新增达标 0 → 上限 6→2、定向题问完门槛未达直接出卡;卡片区间为主标题、代表分钟副标题,第一二名差距 ≥5 个百分点才显示百分比,否则写「目前区分不开」。不放宽任何置信度。先做 | 已验收(真机清单欠) | `4e6e8d87` + 验收补改 `7203d94e`(区分不开时隐藏「最可能」),deploy-staging run 2933 已部署;回放真值 ±30/±60 19→20、宽度中位 ±1 分钟、提问 11.4→7.8;Skill 10.0.30;真机清单 `docs/testing/rectification-fewer-probes-card-20260926.md` 未走 |
|
||||
| `TASK-rectification-grounding-20260927.md` | `PROGRESS-rectification-grounding-20260927.md` | **生时校正旁白事实有据 + 去重试 + 资料瘦身**:服务端范围句被裁句裁掉(BUG-1055,复发自 588);重试按钮盲写不校验→校正里下线(1056);read-case 超限先删对话记忆(1057);点选题带经历时范围变化无人说(1058);offer/compare 剥离推断前数据、报告去重;Skill 按轮次切片、关 skills 注入 | 待领取 | 与数据卡单并行,文件互斥 |
|
||||
| `TASK-rectification-grounding-20260927.md` | `PROGRESS-rectification-grounding-20260927.md` | **生时校正旁白事实有据 + 去重试 + 资料瘦身**:服务端范围句被裁句裁掉(BUG-1055,复发自 588);重试按钮盲写不校验→校正里下线(1056);read-case 超限先删对话记忆(1057);点选题带经历时范围变化无人说(1058);offer/compare 剥离推断前数据、报告去重;Skill 按轮次切片、关 skills 注入 | 待验收 | `codex/rectification-grounding-20260927` 本地提交 T1–T7(未推送);BUG-1055~1058;Skill 不 bump;见 PROGRESS |
|
||||
| `TASK-rectification-telemetry-20260926.md` | [PROGRESS](PROGRESS-rectification-telemetry-20260926.md) | **匿名聚合统计**:每会话一行只存数字 / 枚举(题数分类、宽度、差距、停止原因、门槛达标、耗时、版本),管理后台只看汇总、保留 180 天;动表须 test:db。排在 fewer-probes 后 | 已验收(后台登录走查欠) | `d0bfc1fc`,门禁 run 2938 含真实 PG 测试通过、migrate 2940、deploy 2941(`e801fcf5`);只存数字/枚举、不存用户 id;后台「校正统计」页 |
|
||||
| `TASK-rectification-offline-research-20260926.md` | `PROGRESS-rectification-offline-research-20260926.md` | **三项离线研究**:答错 1–2 题的容错、V1/V2 分盘配权正确重跑、改正「1 分钟≈1.1 天」(实测中位 3.8 天)并核实 `_representative_pairs` 推断。不改线上。结论(`docs/research/rectification_offline_research_2026_09_26.md`):R1 答错 1 题真值在区间 98–100%、头名降三到四成,答错 2 题 ±30/±60 挤出 7–10%(两道反答=8 分=淘汰线);R2 权重生效,V1/V2 在 ±30/±60 按定义恒等、±10 六题后指标不变 → `no_benefit`(已实测);R3 3.8 天/分钟复现,45 天闸≈8–34 分钟,`_representative_pairs` 推断被推翻(全配对题数不变,卡在逐月评估),另记 BUG-1048 `investigating`(闸门跨年豁免 + zip 错位)。三项均不建议立实现单 | 已验收 | `0f5442ce`(纯研究,不改线上);三项均不立实现单:答错 2 题 ±30 真值入区间 0.93、V1/V2 no_benefit、每分钟边界位移中位 3.82 天(勘误 5 份文档);新发现 BUG-1048 出题闸门两处漏洞待产品决定 |
|
||||
| `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 条 |
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
# 真机清单:生时校正旁白事实有据 + 去掉重新生成(2026-09-27)
|
||||
|
||||
对应任务书 `docs/tasks/TASK-rectification-grounding-20260927.md`,BUG-1055~1058。自动化已用真实 `runV9AgentTurn` / 真实路由 / 真实 Agent + 记录提示词的假模型覆盖;下面是只能在 staging 用真实模型走一遍的部分。用本人账号、真实或虚构资料均可,不要把出生资料写进反馈。
|
||||
|
||||
准备:新建一次生时校正,资料里选一个带不确定档的出生时间(窗口 30 分钟左右更容易出现 7 个以上候选)。
|
||||
|
||||
## 1. 说一件带年月的事,范围句完整留下(BUG-1055)
|
||||
|
||||
1. 开场后打字说一件事,最好说两三句,例如「2016 年 9 月去北京读研,那年搬了家,也换了专业方向。」
|
||||
2. 看这条回复:
|
||||
- [ ] 流式过程中不出现「范围从 … 变为 …」然后又消失的情况。
|
||||
- [ ] 回复结束时,如果范围变了,最后一句是「范围从 A 变为 B。」且只出现一次。
|
||||
- [ ] 刷新页面,这条回复和刷新前一模一样(包括范围句)。
|
||||
- [ ] 回复里的时刻(HH:MM)只出现在「范围从 … 变为 …」这句,或与右栏 / 时间轴上当前范围一致;没有与右栏对不上的时刻或百分比。
|
||||
3. 再说一件,这次故意多说几句。
|
||||
- [ ] 模型的复述被裁成一句也没关系,但范围句仍然完整。
|
||||
|
||||
## 2. 候选多时说「那年」,看它记不记得(BUG-1057)
|
||||
|
||||
1. 在已经说过三四件事、时间轴上候选较多(7 个以上)时,打字「那年还发生过一件事:我父亲住院了。」(「那年」指上一条说的年份)。
|
||||
- [ ] 回复能对上前面说过的那一年(复述里写对年份,或按服务端题目追问年份),而不是像没听过前文。
|
||||
|
||||
## 3. 点选题顺手打字补一件带年月的经历(BUG-1058)
|
||||
|
||||
1. 出现 A/B/C/D 点选题时,不点选项,直接打字回答并顺手带一件事,例如「有,2019 年 3 月换了工作。」
|
||||
- [ ] 这条回复里有且只有一句「范围从 A 变为 B。」(若这次答题和经历让范围变了)。
|
||||
- [ ] 没有两句范围句,也没有前后矛盾的范围。
|
||||
|
||||
## 4. 校正回答下没有「重新生成」(BUG-1056)
|
||||
|
||||
1. 看生时校正里任意一条已完成的助手回答下面的操作条。
|
||||
- [ ] 只有 赞 / 踩 / 复制 三个按钮,没有「重新生成」。
|
||||
2. 打开一次普通对话,问一个问题。
|
||||
- [ ] 普通对话最近一条回答下面仍有「重新生成」,点了能重新生成。
|
||||
|
||||
## 5. 交付那一轮(顺带看)
|
||||
|
||||
1. 继续答到出现「目前范围」卡片的那一轮。
|
||||
- [ ] 正文里的范围、代表分钟、吻合率若出现,与卡片上的数字一致;对不上的句子不应出现。
|
||||
- [ ] 正文不出现「这次给出」「结束」「最终」。
|
||||
|
||||
## 6. 历史会话仍能打开(BUG-621 回归)
|
||||
|
||||
1. 从侧栏点开一条几天前的生时校正。
|
||||
- [ ] 能正常打开,能继续说一件事并得到回复。
|
||||
|
||||
反馈时写:第几步、勾了哪些、没勾的截个图(遮住出生资料)。
|
||||
Reference in New Issue
Block a user