Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
104 lines
12 KiB
Markdown
104 lines
12 KiB
Markdown
# TASK · 生时校正「盘型口径」实现:以分盘上升段为目标交付(2026-09-30)
|
||
|
||
## 基线
|
||
|
||
- `origin/staging` @ `c2c5140d`(写作时 head;开工时以最新 `origin/staging` 为准)。
|
||
- 分支 `codex/rectification-varga-resolution-20260930`,工作树 `.worktrees/rectification-varga-resolution-20260930`。
|
||
- **前置**:研究单 `TASK-rectification-varga-resolution-research-20260930.md`(BUG-1105,已验收合入)。数字与实现要点见 `docs/research/rectification_varga_resolution_2026_09_30.md` §1、§7;研究脚本 `scripts/research/varga_resolution_probe.py` 是本单的验收回放器。
|
||
- **串行**:本单改 `frontend/src/lib/rectification-agentic/{core,v9}/*`、`user-copy.ts`、`components/rectification-range-delivery.tsx`、`rectification-timeline.tsx`。同日报告 / 首页各单不重叠;若另有校正单开工,本单先合。
|
||
- **冻结**:不动 `scripts/research/sealed_holdout_rerun.py::PRODUCTION_FILES` 的 10 个文件(含 `event_probes.py`、`decision_policy.py`、`candidate_contrast.py`、`refinement_packet.py`、`api_service.py`)、`active_rectification_event_engine.py`、任何打分常数(ERR-110)。新后端逻辑放**新文件**并从 `jyotish_api_server.py` 薄注册(§6 增长冻结)。
|
||
|
||
## 先读
|
||
|
||
- `docs/research/rectification_varga_resolution_2026_09_30.md`(全文,尤其 §1 出口表、§4 提前停不过门、§7 改 / 不改清单)
|
||
- `docs/research/rectification_scoring_research_2026_09_29.md` §1(打分层为何关闭)
|
||
- `docs/tasks/TASK-rectification-futile-collect-stop-20260929.md` D1–D4(门开只问点选卡、交付正文口径——本单沿用)
|
||
- `frontend/docs/VOICE.md`、`frontend/DESIGN.md` 校正相关段
|
||
|
||
## 事故实证
|
||
|
||
产品 2026-09-29 真机:31 分钟窗答完题范围不动,「最可能的分钟」在 v5 上头名只有 64%;用户追问「那用户信息没用了?业务怎么成这样」。研究单在 77 例上量出:
|
||
|
||
| 窗口 | D1 头段 = 真值 | D9 / D10 头段 = 真值 | 占比 ≥ 0.6 留一法准确率 | 结论 |
|
||
| --- | --- | --- | --- | --- |
|
||
| ≤ ±10 | 76/77 | 88% / 86% | 92% / 90% | 分盘可分档给可信度 |
|
||
| ±30 | 75/77 | 57% / 64% | 92–94%(约 1/4–1/3 用户达标) | 多数用户只能给 D1 |
|
||
| ±60 | 69/77 | ≤ 47% | 真值段保留 74 < 基线 75 | 分盘 **blocked** |
|
||
|
||
同一题库按「段级信息增益」重排:≤ ±30 头段命中 +3~+7、宽度 −2、真值段保留不降;±60 更差。**提前停(占比达 0.7 / 0.8 即停)丢真值段,不过红线。** 「不用校正」只对只需 D1 的问题成立(±10 64/77),D9 / D10 为 0/77。
|
||
|
||
## 根因(产品层)
|
||
|
||
1. 目标函数是分钟:选题按分开候选分钟排序、交付按分钟区间与「最可能分钟」、并列按分钟数(`core/rectification-decision.ts`、`credible-range.ts::unionStillValidRange`、`user-copy.ts::deliveryTurnNarration`)。用户要的是「用哪张盘解读」。
|
||
2. 不按问题域取盘:`ConversationFocus.domain`(`v9/tool-service.ts:155`)只用于采集,不决定目标分盘。
|
||
3. 没有「分盘不可判」的诚实出口:±30 以上仍给分钟区间。
|
||
4. 候选行已带 D1 / D9 / D10 层(`candidate_contrast.py:181` `signature`,`SIGNATURE_LAYERS = (d1, d9, d10, d24, d4, d12, md)`;`refinement_packet.py:198`),前端 `tool-service.ts` 行映射未解析,段级信息一直没被用。
|
||
|
||
## 决策记录(产品 2026-09-30)
|
||
|
||
- **D1 目标改为分盘上升段。** 交付物是「每张目标盘的上升星座 + 可信度档位」,分钟区间降为次要信息(仍展示,不再作主结论)。
|
||
- **D2 按问题域取盘。** 婚恋 → D1 + D9;事业 → D1 + D10;综合 / 报告 / 未指明 → D1 + D9 + D10。D12 等其他分盘不作目标、不展示推荐。
|
||
- **D3 可信度档位(研究单校准,raw 口径,头段占比 s)**:
|
||
- 窗口 ≤ ±10(≤ 21 分钟):s ≥ 0.6「较可信」;0.5 ≤ s < 0.6「倾向,备选也要看」;s < 0.5「按现有信息分不开」。
|
||
- 窗口 ≤ ±30:s ≥ 0.6「较可信」,否则「分不开」(不出「倾向」档)。
|
||
- 窗口 > ±30:D9 / D10 一律不给推荐,文案「只能确定 D1 上升 X;分盘解读需要更准的出生时间」。
|
||
- D1:头段 = 全窗唯一 → 「确定」;否则同上分档。
|
||
- **D4 不得用占比提前停。** 出题与停止条件不变:训练门开后只问点选卡,`refreshExhausted` 即出卡(沿用 BUG-1084 D1)。占比只决定档位。
|
||
- **D5 按段选题只在窗口 ≤ ±30 启用**;> ±30 沿用线上顺序。
|
||
- **D6 「不用校正」出口**:只有当目标盘集合里每张盘在全窗都只有 1 种上升时才触发(实际只会发生在只需 D1 的问题上);触发时直接出「盘型一致,不用校正」卡,不进采集。
|
||
- **D7 采用(adopt)落库分钟**:目标盘头段的交集中点;交集为空则按优先级 D1 > 领域盘 取头段中点;该分钟必须落在交付区间内,否则取区间内最近的分钟。采用 / 确认门、来源标签(BUG-690)不变。
|
||
- **不改**:引擎、11 张计分分盘、`MIN_SEPARATION_LEAD`、45 天闸门、七条采集线、卡片 ±2 与三次淘汰、训练门、留一件对照、`event_probes.py` 出题。
|
||
- **推翻**:`TASK-rectification-candidate-compare-columns`(交付卡一行三列定稿)与 `TASK-rectification-delivery-ui-simplify`(时间卡逐行直选)中以分钟为主的交付卡形态,本单起交付卡以盘型为主;分钟区间保留为折叠 / 次行。执行方在相关 BUG 防复发条下追加「2026-09-30 产品修订:见本任务书 D1」,不删原文。
|
||
|
||
## 硬红线
|
||
|
||
1. **回放红线**:实现后用 `scripts/research/varga_resolution_probe.py --stages m0,m1,m2` 对接生产段级汇总(T2 合同测试保证同口径),±10 / ±30 真值段保留 ≥ 76 / 76,头段 = 真值不低于研究文档 §4「按段」列(±10 D9 71 / D10 66;±30 D9 48 / D10 56);> ±30 交付卡不得出现 D9 / D10 推荐。任何一格变差即停,写 PROGRESS。
|
||
2. **段级汇总与研究脚本逐格一致**:前端 `core/segment-summary.ts` 对 ≥ 10 个 v5 案例的 golden 输入(真实引擎候选行 + 六题后分数)输出的头段 / 占比 / 段数与 `docs/research/varga_resolution_research_2026_09_30.json` `m1.by_radius.*.raw.per_case` 逐格相等。fixture 必须来自真实引擎响应(§7.4)。
|
||
3. 不放宽任何置信度边界;档位阈值只能取 D3 的值。
|
||
4. 前端:`tsc --noEmit` 0 错、`npm run lint` 0 error、`npm test`(Node 22,`/exec-daemon/node`)失败清单与基线逐条一致、新增失败 0;`next build` 后 `/` 仍 Static、首屏 gzip ±2%;`page.tsx` 不增长;改既有断言写「原值 / 新值 / 原因」。
|
||
5. Python:新端点模块有定向测试;`run_quality_gate.py --profile quick` 与基线逐条一致;`test_api_server_growth_contract.py` 绿;完整性门禁绿(冻结文件哈希不变)。
|
||
6. Skill / Agent 提示文本改动按 CHANGELOG 规则 bump,bump 后验证旧校正会话仍能打开(BUG-621)。
|
||
7. 隐私:fixture 只用 v5 公开名人或虚构盘;文档不写真机会话内容。
|
||
|
||
## 任务分解
|
||
|
||
- **T1 段扫描端点(BUG-1115,后端)**
|
||
- 新文件 `scripts/rectification_varga_segments_api.py`:输入出生日期 / 地点 / 时区 / 窗口 / 目标盘集合,逐分钟算 D1 / D9 / D10 上升(复用 `domain_calculation_service.compute_chart` + `varga.calc_all_vargas`,口径同研究 lib),输出各盘段表(段起止分钟、星座、长度)与「全窗唯一」标志;结果按窗口键缓存到 `api_scratch`。`jyotish_api_server.py` 只加一处薄注册。
|
||
- 验收:`tests/test_varga_segments_api.py`(跨午夜、±10/±30/±60、与 `varga_resolution_lib` 段切分逐分钟一致);api_server 行数不超 growth contract。
|
||
- **T2 段级汇总(BUG-1116,前端)**
|
||
- `tool-service.ts` 行映射解析 `signature` 的 d1 / d9 / d10(候选级,2 分钟步长);新增 `core/segment-summary.ts`:在 `buildInferenceState` 的分钟分数之上按段求和(raw:有效簇分数 ≥ 0、簇内均摊,与研究 lib 同算法),输出每张目标盘的段列表、头段、占比、剩余段数、真值段保留所需字段;`rectification-decision.ts` 的交付判断读取它给档位(D3),**不改**出卡时机(D4)。
|
||
- 验收:硬红线 2 的 golden 合同测试;单测覆盖 D3 三档 × 三档窗口 × D1「确定」;并列(两段占比相等)按先出现段并标 tie。
|
||
- **T3 按域取盘 + 「不用校正」出口(BUG-1116)**
|
||
- `ConversationFocus.domain` → 目标盘集合(D2);录入 / 开案后调 T1,D6 成立时直接出「盘型一致」卡(新卡,走 `finalizeSuccessfulTurnExit` 单一写入方,不得再造第二条出口),并把该判定写进案例 `checks`。
|
||
- 验收:表驱动测试七个领域 → 目标盘集合;D6 触发 / 不触发各一例;触发后不发采集题。
|
||
- **T4 交付卡与采用卡(BUG-1117,前端 + 文案)**
|
||
- `rectification-range-delivery.tsx`:主区按目标盘逐行「D9 上升:金牛(较可信 / 倾向 / 分不开),备选:白羊」;D1 行「确定」时不出备选;> ±30 只出 D1 行 + 一句诚实说明;分钟区间移到次行。`rectification-timeline.tsx` 的范围小字同步。
|
||
- `user-copy.ts`:`deliveryTurnNarration` / `rangeDeliveryIndistinct` 改为盘型口径;删除「最可能的分钟」主句;Agent 提示(`frontend/src/mastra/agentic-rectification.ts`)第二句改为「用了 M 道选择题,D9 上升较可信是 X」类句式;`VOICE.md`、`DESIGN.md` 同提交。
|
||
- 采用:按 D7 计算落库分钟;采用卡文案「改用 X 盘解读」;确认门不变。
|
||
- 验收:文案合同测试断言交付气泡不含「最可能」「吻合率」「补一件」;三档窗口 × 三种取盘策略的快照测试;采用分钟落在交付区间内的断言。
|
||
- **T5 按段选题(BUG-1116,前端,仅 ≤ ±30)**
|
||
- 新模块对 `event_probes` 返回的题池按段级信息增益重排(算法同研究 lib:中性候选按 ½ / ½),只改顺序不改题;> ±30 不启用。
|
||
- 验收:以 v5 golden 题池比对研究 JSON `m2` 的前六题顺序(≥ 10 例逐格一致);线上顺序回退开关(环境变量或 case 标志)。
|
||
- **T6 记录与回放**
|
||
- 回放:把生产段级汇总接到 `varga_resolution_probe.py`(`--posterior production` 之类开关,研究脚本可改),跑硬红线 1 六格,JSON 进 `docs/research/varga_resolution_impl_replay_2026_09_30.json`。
|
||
- `CHANGELOG.md`(用户可感知:交付改为「用哪张盘」+ 可信度;窗口过宽时诚实说明);`docs/BUG_HISTORY.md` 三条;`docs/testing/rectification-varga-resolution-20260930.md` 真机清单(至少:±10 窗口婚恋问题 → D1 + D9 两行;±60 窗口 → 只有 D1 行;只需 D1 且全窗一种 → 「不用校正」卡;采用后报告页盘型与卡片一致;旧校正会话可打开);`docs/tasks/PROGRESS-rectification-varga-resolution-20260930.md`;`docs/tasks/README.md` 状态板。
|
||
|
||
## 让步顺序
|
||
|
||
T2 > T4 > T1 > T3 > T5 > T6 之外的截图。**T2 + T4 + 回放红线缺一不可合入**;T5 可延后(延后时 PROGRESS 写明,研究文档 §4 的收益不计入本单验收);T1 / T3 延后时「不用校正」出口不上线、目标盘按综合三张。
|
||
|
||
## 开工前置命令
|
||
|
||
```bash
|
||
git fetch origin --prune
|
||
export PATH=/exec-daemon:$PATH && node -v # 22.x
|
||
git worktree add -b codex/rectification-varga-resolution-20260930 .worktrees/rectification-varga-resolution-20260930 origin/staging
|
||
cd .worktrees/rectification-varga-resolution-20260930/frontend && npm ci && ./node_modules/.bin/tsc --noEmit && npm run lint && npm test 2>&1 | tee /tmp/varga-impl-baseline.log
|
||
cd .. && export PYTHONHASHSEED=0 && python3 scripts/run_quality_gate.py --profile quick 2>&1 | tee /tmp/varga-impl-quick-baseline.log
|
||
python3 scripts/research/varga_resolution_probe.py --help
|
||
```
|
||
|
||
## BUG 编号
|
||
|
||
开工时核对 `docs/BUG_HISTORY.md` 最大号(写作时 `BUG-1105`;`1106`–`1114` 已被其他任务书预留)。本单:**BUG-1115**(段扫描端点 / 「不用校正」出口缺失)、**BUG-1116**(段级汇总、按域取盘、按段选题——目标函数是分钟)、**BUG-1117**(交付卡与采用卡以分钟为主、±30 以上无诚实出口)。号冲突顺延并在 PROGRESS 说明。关联 BUG-1084、BUG-1090、BUG-1091、BUG-1105。
|