From f17af254c51cd0d7bc51db32fa7d83881fcc1d54 Mon Sep 17 00:00:00 2001 From: Jesse_Chen Date: Tue, 8 Sep 2026 07:00:17 +0000 Subject: [PATCH] docs(tasks): delivery report pre-inference facts fix brief (BUG-593) Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_0193vBv6w5MV2cifdTUu9H5P --- docs/tasks/README.md | 1 + ...fication-delivery-report-facts-20260908.md | 49 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 docs/tasks/TASK-rectification-delivery-report-facts-20260908.md diff --git a/docs/tasks/README.md b/docs/tasks/README.md index 53bece34..34d2ce0f 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -77,6 +77,7 @@ | `TASK-rectification-probe-replay-loss-20260908.md` | `PROGRESS-rectification-probe-replay-loss-20260908.md` | **P0** 收敛不了的直接原因:答完 5 道题范围收到 8 分钟,之后每补一件经历触发的重算换了候选集,`buildInferenceState` 找不到已答题定义(引擎与对照包按 asked keys 排除、状态 probes 不携带、分盘 key 内嵌分钟列表)→ `rounds:[]`、posterior=prior,交付回到 29 分钟;证据轮旁白不报范围变化;交付卡闪现待证实 | 已验收通过(真实 Case 范围收到 2 分钟;BUG-589 闪现 investigating) | `df182c16`(BUG-587~589) | | `TASK-rectification-covered-domain-recollect-20260908.md` | `PROGRESS-rectification-covered-domain-recollect-20260908.md` | 范围已收到 2 分钟、决策已是采用,却再问答过的财务题:职业覆盖后的 yearless→采集分支(L2224)不看领域是否已覆盖;`shouldSkipFollowupPersist` 把它当剩余采集挡住出卡;`persistCollectFocus` 撞 id 无条件 `:next` 再插;holdout `occupied` 不认 health/health_pressure 同义 | 已验收通过 | `7ca6ade2`(BUG-590~591) | | `TASK-rectification-same-year-probe-dedupe-20260908.md` | `PROGRESS-rectification-same-year-probe-dedupe-20260908.md` | 答完「2023 年 5 月前后」又问「2023 年前后」(BUG-559 复发):点选不重跑引擎,同一份 probes 里同域同年两题并存;TS 侧 `existenceProbeAsked` 只降权不排除,`inspectDiscriminatorProbes` 连领域+年份规则都没有。决策:同域同年硬排除、相邻年维持降权 | 待执行 | `codex/rectification-same-year-probe-dedupe-20260908`(BUG-592) | +| `TASK-rectification-delivery-report-facts-20260908.md` | `PROGRESS-rectification-delivery-report-facts-20260908.md` | 交付轮验证报告写「宽度 29 分钟」「主限偏向 05:06 / 分盘大运偏向 04:59」「04:53 D10 升狮子座」,与卡片(04:51–04:53)矛盾:`skill_verification_report` 用引擎推断前的 width / dasha_agreement,分盘星座让模型自算 | 待执行 | `codex/rectification-delivery-report-facts-20260908`(BUG-593,Skill 10.0.16) | | `TASK-api-not-configured-mislabel-20260904.md` | `PROGRESS-api-not-configured-mislabel-20260904.md` | 16 处路由把数据库瞬断(部署切换窗口)兜底翻译成 503「服务尚未配置」;改为仅配置错误用该文案,其余 `service_unavailable`,收敛为共享 helper | 已验收 | `5483649b`(BUG-542);2 条子进程测试留 CI Node 22 复核 | | `TASK-rectification-ux-20260902.md` | `PROGRESS-rectification-ux-20260903.md` | 会话面空白假死与交互摩擦 | 已验收 | `d159f08e`(09-03 在新基线重做后合入,BUG-505~509) | diff --git a/docs/tasks/TASK-rectification-delivery-report-facts-20260908.md b/docs/tasks/TASK-rectification-delivery-report-facts-20260908.md new file mode 100644 index 00000000..b6e649e7 --- /dev/null +++ b/docs/tasks/TASK-rectification-delivery-report-facts-20260908.md @@ -0,0 +1,49 @@ +# TASK · 生时校正修复单:交付轮验证报告引用推断前的引擎事实(宽度 29 分钟、双轨偏向已淘汰分钟、D10 星座算错)(2026-09-08) + +- 基线:`origin/staging` @ `f3a1a583`(代码头 `7ca6ade2`;本轮转录跑在这版,职业答完已自动出卡,BUG-590 真实环境通过) +- 分支:`codex/rectification-delivery-report-facts-20260908`,基于 `origin/staging`;与 `codex/rectification-same-year-probe-dedupe-20260908`(BUG-592)无文件重叠 +- 执行方:coding agent;验收:Claude +- 涉及文件:`frontend/src/mastra/rectification-v9-tools.ts`(L455–505 结果投影、`buildSkillVerificationReport` 入参)、`frontend/src/lib/rectification-agentic/v9/skill-verification-report.ts`(或该函数所在文件)、`skills/jyotish-birth-time-rectification/SKILL.md` §9 L119 + `references/candidate-comparison.md` +- BUG 编号起点:**BUG-593** +- 优先级:**P2**(出口已通,但交付轮正文三处事实与卡片矛盾,用户会怀疑结果) + +## 1. 事故实证(2026-09-08 staging `7ca6ade2`,只写结构) + +交付卡:范围 04:51–04:53、排盘用 04:53、对照 8 件经历、分歧面板只剩月宿边界一行。同一轮模型正文的验证报告里: + +| # | 正文写的 | 事实 | +| --- | --- | --- | +| 1 | "当前是一段不可分区间(宽度 29 分钟)" | 卡片范围宽 3 分钟;29 来自引擎门 `exact_confirmation.indistinguishable_width_minutes`,是推断层之前的引擎候选跨度 | +| 2 | "主限更偏向 05:06、分盘大运更偏向 04:59,二者冲突" | 两个分钟都已被答题淘汰;`dasha_agreement` 由引擎在全部候选上算,不看推断层 | +| 3 | "若采用 04:53,D10 升狮子座" | `window_scan` 里 D10 在 05:00 才从巨蟹座换到狮子座,04:53 的 D10 上升是巨蟹座;模型自己从换升表推算,算错 | + +## 2. 根因 + +`rectification-v9-tools.ts` L455–505 的结果投影把 `candidates` 换成推断层投影,但 `indistinguishable_width_minutes: width`、`dasha_agreement: refinement.dasha_agreement` 仍是引擎原值,且原样喂进 `buildSkillVerificationReport({ widthMinutes: width, dashaAgreement })`——服务端自己生成的报告模板就把 29 和 05:06/04:59 写给了模型。分盘上升没有按候选分钟给出现成的星座,Skill L119 要求"方法 2–3 D9/D10 类型对照",模型只能拿 `window_scan.transitions` 自己算,于是算错。 + +## 3. 决策记录 + +1. **报告只用推断层事实。** 有 `inference_state` 时:`widthMinutes` = `credible_range` 宽度(分钟数,含两端);`dasha_agreement` 在 **active 候选**内重算 top(没有 active 候选或 top 相同则 `status="agree"`/`"n/a"`),并保留引擎原值为 `dasha_agreement_pre_inference` 供审计,不进报告。`indistinguishable_width_minutes` 投影字段保留但改名 `engine_indistinguishable_width_minutes`,报告不用。 +2. **报告给出每个候选分钟的 D9 / D10 上升星座**(`sign_by_candidate: {time: {d9, d10}}`),由 `window_scan.transitions` 服务端算,与 `divergence-panel.ts` 复用同一分钟→星座函数。Skill L119 与 `references/candidate-comparison.md` 增一句:"分盘上升只抄 `skill_verification_report.sign_by_candidate`,不得自行按换升时刻推算"。Skill bump **10.0.16**(versions/ 快照、registry 同步)。 +3. 边界句"不是已确认的唯一出生分钟"保留;确认门不动。 + +## 4. 任务分解 + +- 4.1 决策 1:形状用例——推断层范围 04:51–04:53、引擎 `indistinguishable_width_minutes=29`、引擎双轨 top 均为已淘汰分钟 → 报告 `width_minutes === 3`,`dasha_agreement` 只含 active 候选,正文模板不出现 29 / 已淘汰分钟。 +- 4.2 决策 2:D10 在 05:00 换升、候选 04:51/04:53 → `sign_by_candidate["04:53"].d10 === "巨蟹座"`;`agent-voice-copy-contract`/skill 合同锁新句;`skill-registry.test.ts` 过 10.0.16。 +- 4.3 记录:`docs/BUG_HISTORY.md` BUG-593(关联 BUG-545 单分钟念两遍、BUG-568 区间读盘);`CHANGELOG.md`(Skill 10.0.16);`PROGRESS-…`;`docs/testing/rectification-scenarios-20260907.md` 加"交付轮正文的宽度、双轨、分盘星座必须与卡片一致"。 + +## 5. 让步顺序 + +4.1 必做;4.2 若 Skill bump 牵扯太广,可先做 `sign_by_candidate` 投影、Skill 句子后置为 P3,但要写进度记录;4.3 不可省。 + +## 6. 开工前置命令 + +```bash +git fetch origin --prune +git worktree add -b codex/rectification-delivery-report-facts-20260908 .worktrees/rectification-delivery-report-facts-20260908 origin/staging +cd .worktrees/rectification-delivery-report-facts-20260908 +ln -s /workspace/Jyotisha/frontend/node_modules frontend/node_modules +cd frontend && ./node_modules/.bin/tsc --noEmit; npm run lint 2>&1 | tail -1 +ls tests/rectification-*.test.ts tests/agent-voice-copy-contract.test.ts tests/skill-registry.test.ts | grep -v database | xargs npx tsx --test 2>&1 | grep -E "^# (tests|pass|fail)" +```