Compare commits

..

2 Commits

Author SHA1 Message Date
Jesse_Chen 6aba672ce5 docs(tasks): accept BUG-592/593 on 6a687085
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0193vBv6w5MV2cifdTUu9H5P
2026-09-08 08:48:07 +00:00
Jesse_Chen 56067fda28 docs(tasks): new-minute inheritance fix brief (BUG-594)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0193vBv6w5MV2cifdTUu9H5P
2026-09-08 08:47:30 +00:00
4 changed files with 107 additions and 2 deletions
+3 -2
View File
@@ -76,8 +76,9 @@
| `TASK-rectification-other-collect-fallback-20260908.md` | `PROGRESS-rectification-other-collect-fallback-20260908.md` | 七领域问完落到「也可以再说一件」、职业题从未出现、不自动出卡:`USER_COLLECT_QUESTION.other` 仍有三条活路(职业焦点 `target_domain` 压成 other 后被 active-focus 承接 followup 重建;set-focus 两次无效兜底查表;无领域采集归 other),`collect:other:*` 焦点挂着让 `persistNextInterviewIfIdle` 的出卡路径永远不跑 | 已验收通过(触发链仍 investigatingBUG-586 mitigated | `9aec5029`BUG-586 |
| `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-587589 |
| `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-590591 |
| `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` 连领域+年份规则都没有。决策:同域同年硬排除、相邻年维持降权 | 验收 | `8ae17a26`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,分盘星座让模型自算 | 验收 | `06e44104`BUG-593Skill 10.0.16 |
| `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` 连领域+年份规则都没有。决策:同域同年硬排除、相邻年维持降权 | 验收通过(真实环境未再出同年题) | `8ae17a26`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,分盘星座让模型自算 | 验收通过(Skill 10.0.16 | `06e44104`BUG-593 |
| `TASK-rectification-new-minute-inherit-20260908.md` | `PROGRESS-rectification-new-minute-inherit-20260908.md` | 5 题答完范围 13 分钟,补迁居事件后回弹到 28 分钟:重算换入的新分钟在携带题的 supports/conflicts 里没名字,一律中性、零冲突存活(BUG-587 决策 2 定错,本单推翻:按分盘星座 / 连续分钟段推结论);batch 内重算不触发 BUG-588 范围句 | 待执行 | `codex/rectification-new-minute-inherit-20260908`BUG-594 |
| `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-505509 |
@@ -47,3 +47,20 @@ 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)"
```
## 验收(Claude2026-09-08`origin/staging` @ `6a687085`staging 已部署同 SHA
| 门 | 结果 |
| --- | --- |
| tsc | 0 错 |
| lint | 0 error / 103 warning |
| 前端 rectification + consultation + voice + skill-registry(非 DB | 1270 / 0 |
| Python v5_services + event_probes + growth contract | 全绿 |
| 项 | 结论 |
| --- | --- |
| 4.1 决策 1 | 通过。真实 Case 报告"28 分钟不可分区间(04:4705:14)"与卡片一致;双轨改为 active 过滤,未点名已淘汰分钟 |
| 4.2 决策 2 | 通过。`sign_by_candidate` 表进报告,真实 Case 04:53 D10 写巨蟹座;Skill 10.0.16 与 versions/ 字节一致 |
| 4.3 记录 | 通过 |
结论:通过。但同一 Case 暴露范围回弹(13→28 分钟),另立 `TASK-rectification-new-minute-inherit-20260908.md`BUG-594)。
@@ -0,0 +1,70 @@
# TASK · 生时校正修复单:重算后新出现的候选分钟不继承已答题结论,范围从 13 分钟回弹到 28 分钟;batch 内重算不报范围变化(2026-09-08)
- 基线:`origin/staging` @ `6a687085`BUG-592/593 已合入并部署;本轮转录跑在这版)
- 分支:`codex/rectification-new-minute-inherit-20260908`,基于 `origin/staging`
- 执行方:coding agent;验收:Claude
- 涉及文件:`frontend/src/lib/rectification-agentic/core/build-state.ts``carriedAnsweredProbes`、重放循环)、`core/apply-probe-outcome.ts``directionFor`)、`v9/inference-adapter.ts``buildCaseInferenceState``window_scan.transitions`)、`v9/divergence-panel.ts::signFromTransitions`(复用)、`v9/agent-run.ts` L977(范围句触发条件)
- BUG 编号起点:**BUG-594**
- 优先级:**P1**BUG-587 的"新分钟中性"决策是我定的,实测证明它让范围回弹;用户问"这样是不是已经可以了",答案是流程可以、结果不行)
## 1. 事故实证(2026-09-08 staging `6a687085`,只写结构)
| 时点 | 旁白报的范围 |
| --- | --- |
| 5 道点选题答完(D9、2023.05、2015.05、2024.04、D10 | 04:4704:5913 分钟) |
| 之后补迁居事件 → batch 内 compare 重算 | 旁白只说"接下来我们继续",**没有范围句** |
| 健康拒答、职业答完 → 交付 | 卡片 04:47–05:1428 分钟),报告"当前候选基本并列:04:53、04:59、04:51、04:47、05:14",相对支持 17/13/11/10/10 |
报告里的分盘表:05:14 的 D9 是射手座、D10 是狮子座。用户在 D9 题选了天蝎座一侧、D10 题选了巨蟹座一侧,05:14 在两道题上都该是 conflict2024.04 事业题答"发生"支持 05:00 之后的分钟,2023.05 答"没发生"又反对 05:0005:14——按老候选集的账,05:xx 这一侧早就被淘汰过(所以此前范围是 04:47–04:59)。05:14 是重算后新进候选集的分钟,它在任何一道已答题的 `supports / conflicts` 里都没有名字,于是 6 道题对它全部记 0,`strong_conflict_count = 0`,活着,范围右端被它拉到 05:14。
## 2. 根因
### 2.1 BUG-594P1):新分钟对携带题一律中性
`TASK-rectification-probe-replay-loss-20260908.md` 决策 2 写的是"新候选集里不在旧 `supports/conflicts` 的分钟落为 `neutral`,不做邻近插值"。`apply-probe-outcome.ts::directionFor` 按候选 id 查成员,新分钟查不到 → `neutral`。引擎每次重算都重新挑 9 个分钟,几乎每次都有新分钟;新分钟零冲突就成了"幸存者",范围只会变宽不会变窄。这条是我在任务书里定错的,本单推翻。
题目语义本来就是按分钟连续定义的:分盘风格题按该分钟的分盘上升星座(`window_scan.transitions` 给出每层换升时刻),大运边界/激活题的 `expected_outcomes` 是连续分钟段。新分钟的结论可以确定性地推出来,不需要"插值"猜。
### 2.2 BUG-588 缺口:batch 内重算不触发范围句
`agent-run.ts` L977 只在 `toolsUsed.has("rectification-compare-candidates")` 时接范围句;证据轮的 compare 是 `rectification-record-evidence-batch` 内部跑的,工具集合里没有 compare,于是 13→28 分钟没有一句提示。
## 3. 决策记录
1. **携带题对新分钟按题目语义推结论,不再中性。**
- 分盘风格题(`choice_kind = varga_style``semantic_key``varga.<layer>.` 开头):用 `signFromTransitions(transitions, layer, minute)` 得到新分钟的该层上升星座,按 `style_options[].sign` 与已答 `answer_class``support / conflict`;没有 transitions 或该层无星座 → `neutral`
- 大运边界/激活/事件质量题(`expected_outcomes` 的 supports/conflicts 是分钟集合):新分钟落在某个 outcome 集合的**最小分钟与最大分钟之间且两侧最近的旧分钟同属该集合** → 继承该集合;否则 `neutral`
- 携带题在状态里补 `outcome_by_minute`(或等价缓存)以便审计;`rounds.score_deltas` 对新分钟出现非 0 值。
2. **`buildCaseInferenceState``window_scan.transitions` 传给核心层**`score-persist.ts` 已有 `windowScan`),核心层不依赖 v9`signFromTransitions` 下沉到 `core/``divergence-panel.ts` 改为引用。
3. **范围句改看事实不看工具。** `agent-run.ts`:本轮结算前比较 `dossier.latestResult.decisionReceipt.inference_state.credible_range` 与开始时的值(或 `resultId` 变化),变了就接 `withRangeChangedAfterEvidence`,不再看 `toolsUsed`
4. 淘汰阈值 `STRONG_CONFLICT_ELIMINATION_COUNT = 3``SCORE_DELTA`、各道门槛、四选项合同不动;Skill 不 bump。
## 4. 任务分解
### 4.1 BUG-594(决策 1、2
- 验收(`rectification-probe-replay-loss-20260908.test.ts` 扩):
- (a) 旧候选集 9 分钟、6 道已答题使 05:00 之后全部 `strong_conflict_count ≥ 3` 被淘汰、范围 04:47–04:59;新候选集换入 05:14D9 射手、D10 狮子,2024.04 supports 段内、2023.05 conflicts 段内)→ 重放后 05:14 `strong_conflict_count ≥ 3``status = eliminated``credible_range` 仍为 04:4704:59。
- (b) 换入的新分钟落在两个 outcome 集合之间(两侧旧分钟分属不同集合)→ 该题对它 `neutral`
- (c) 无 `transitions` 时分盘题对新分钟 `neutral`(退化到今天的行为,不报错)。
- (d) 真实 Case 回放(用 `exp_case_head.py` 的合成 7 事件序列):每次加事件后 `credible_range` 宽度 ≤ 上一轮宽度 + 新分钟数中未被任何题覆盖的个数;本轮事故形状应保持 13 分钟。
### 4.2 BUG-588 缺口(决策 3
- 验收:mock 一轮 batch 触发的 compare,范围 04:4704:59 → 04:4705:14,落库 `assistant_message` 末尾含范围句;范围不变不含;用 compare 工具的路径行为不变。
### 4.3 记录
- `docs/BUG_HISTORY.md` BUG-594(关联 BUG-587;写明是任务书决策 2 定错);BUG-588 记录补"后续复发:batch 路径"并在同条下修复;`CHANGELOG.md``PROGRESS-rectification-new-minute-inherit-20260908.md``docs/testing/rectification-scenarios-20260907.md` 加"答题后再补经历,范围不得变宽;变了必须有范围句"。
## 5. 让步顺序
4.1 (a) 必做并当天部署;(b)(c) 必做;(d) 可用现有合成序列;4.2 必做;4.3 不可省。
## 6. 开工前置命令
```bash
git fetch origin --prune
git worktree add -b codex/rectification-new-minute-inherit-20260908 .worktrees/rectification-new-minute-inherit-20260908 origin/staging
cd .worktrees/rectification-new-minute-inherit-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 | grep -v database | xargs npx tsx --test 2>&1 | grep -E "^# (tests|pass|fail)"
```
@@ -58,3 +58,20 @@ 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 | grep -v database | xargs npx tsx --test 2>&1 | grep -E "^# (tests|pass|fail)"
cd .. && .venv/bin/python -m pytest tests/test_rectification_event_probes.py -q
```
## 验收(Claude2026-09-08`origin/staging` @ `6a687085`staging 已部署同 SHA
| 门 | 结果 |
| --- | --- |
| tsc | 0 错 |
| lint | 0 error / 103 warning |
| 前端 rectification + consultation + voice + skill-registry(非 DB | 1270 / 0 |
| Python v5_services + event_probes + growth contract | 全绿 |
| 项 | 结论 |
| --- | --- |
| 4.1 (a)(c)(d) | 通过。`sameYearProbeAsked` 在 inspect 与 followup 两条路都硬排除;真实 Case(2026-09-08 第八次实测)答完 2023.05 后未再出 2023 activation |
| 4.1 (b) | 通过。相邻年只降权;偏离 3(`remainingConflictProbes` 改同年硬排除)合理 |
| 4.2 记录 | 通过(复发自 BUG-559 |
结论:通过。