docs(tasks): varga sensitivity weighting, and birth-time provenance labels
与上游流程对照补两处。①精度研究单加 M1b:上游有一张分盘分钟敏感度表 (D60=2 / D30=4 / D24=5 / D9=13.3 / D1=120 分钟换一次上升),而本仓 11 张分盘 等权再除以 22(且没有 D60)——20 分钟窗里 D30 和 D2 同分量,分辨率最高的盘被 稀释。测 V1 反比配权 / V2 按窗宽选盘 / V3 加 D60,并报过拟合风险。 ②新任务书 BUG-690:录入已收 birth_time_source 三类,但校正链只用过一次, 推算值与医院记录等同对待、输出直称「你的出生时间」。接进投影并按来源分档措辞; 医院记录与校正结果冲突时怎么说挂给产品。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
This commit is contained in:
co-authored by
Claude Fable 5
parent
3314de2ad9
commit
b56147e524
@@ -186,6 +186,8 @@
|
||||
|
||||
| `TASK-rectification-tiebreak-hold-exit-fix-20260914.md` | `PROGRESS-rectification-tiebreak-hold-exit-20260914.md` | **P0 回归修复单**:BUG-686 的风格题前置把耗尽与收口路径的交付也压住了,`npm test` 由 27 红涨到 33(6 条「该交付却不交付」)。后续 `6fd7925a` 只改断言把它们改绿:4 条文案放宽可接受,2 条实质弱化(「恰好一条交付闸」退化成短路、参考题确认语被算作出口载体)必须恢复;行为层根因未动。hold 要带出口、不得作用于 exhausted/closed-ceiling,最多 hold 一次(BUG-688)。尚未部署,未影响线上 | 待验收 | `codex/rectification-tiebreak-hold-exit-20260914` |
|
||||
|
||||
| `TASK-rectification-birth-time-provenance-20260914.md` | `PROGRESS-rectification-birth-time-provenance-20260914.md` | 与上游流程对照发现的缺口(上游 R2):录入时已问「医院记录 / 家人记得大概 / 只知道时段」并落库 `birth_time_source`,但整条校正链只在放宽窗口时用过一次,决策与文案一律不看它——家人推算的时间和出生证在系统里等同对待,输出还直接称「你的出生时间」。本单把来源标签接进投影并分档措辞(BUG-690) | 待执行 | `codex/rectification-birth-time-provenance-20260914` |
|
||||
|
||||
| `TASK-rectification-precision-adaptive-boundary-research-20260914.md` | `PROGRESS-rectification-precision-gate-research-20260914.md` | **研究单**:出题闸门 `MIN_BOUNDARY_DAYS=45`(刷新 30)不看证据精度,而出生时间每差 1 分钟大运边界只平移约 1.1 天——20 分钟窗内的候选边界全挤在三周内被整批丢掉,这就是「六题后出不来题」的算术原因。量闸门按年/月/日分档(G0–G4)的收益,并必测答错容忍度(±3/±7/±14 天偏移下真值是否被挤出) | 待执行 | `codex/rectification-precision-gate-research-20260914` |
|
||||
|
||||
| `TASK-rectification-open-collect-invite-20260914.md` | `PROGRESS-rectification-open-collect-invite-20260914.md` | **P0**:固定七条采集线问完后只说「能问的都问完了」,用户不知道还能补经历、也不知道补了有用;而两轮研究证明补带年月经历是唯一有效手段。产品拍板:交付卡照出 + 卡上给不限领域的补充邀请(举七条线之外的例子),补完必须可见生效(BUG-689) | 待执行 | `codex/rectification-open-collect-invite-20260914` |
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
# TASK · 报上来的出生时间是「记录」还是「推算」,必须一路带着标签 — 2026-09-14
|
||||
|
||||
- 基线:`origin/staging` @ `3314de2a`(代码 `963c147c`,staging 已部署)。
|
||||
- 分支:`codex/rectification-birth-time-provenance-20260914`,worktree `.worktrees/rectification-birth-time-provenance-20260914`。
|
||||
- 关联:上游 `docs/research/rectification_process_v2_guardrails_2026_09_04.md` 的 **R2 时间值 provenance 标签化**(2026-09-14 与上游流程对照时发现本仓缺口);BUG-689(补经历邀请);`references/candidate-comparison.md` 的 candidate / accepted / confirmed 三层。
|
||||
- 串行:改文案层与决策投影一处,不改打分与判据;与在途的两份研究单无文件重叠。
|
||||
|
||||
## 1. 问题
|
||||
|
||||
上游从一次真实闭环复盘里固化了一条硬规则(R2):**任何出生时间引用必须带来源标签,推算值不得当作已证实真值参与裁决。** 他们分四类:`recorded_time`(出生记录原件)/ `provisional_time`(档案沿用推算值)/ `rectified_window`(校时收敛窗)/ `representative_time`(窗内代表值)。
|
||||
|
||||
本仓的现状是「收了但没用」:
|
||||
|
||||
- 录入时**确实问过**(`frontend/src/lib/birth-time-intake-model.ts:100`):`hospital_record`(有出生证或医院记录,精确到分钟)/ `approximate`(家人记得大概时间)/ `period_only`(只知道大概时段或完全不知道),落库为 `agentic_rectification_cases.birth_time_source`,Dossier 里是 `case.birthTimeSource`(`v9/tool-service.ts:480`)。
|
||||
- 但整条校正链里**只用过一次**:`v9/block-scan-answer.ts:117`,仅用来决定放宽窗口后要不要把 source 改写成 `approximate`。
|
||||
- 决策、交付文案、采用流程、报告一律不看它。`case.reportedBirthTime` 被当锚点参与出题与比较(`decision-from-dossier.ts:743` 一带),**不区分它是医院记录还是家人回忆**。
|
||||
|
||||
后果:一个家里人事后推算的时间,和一个出生证上的分钟,在系统眼里一模一样;输出里也可能把前者直接称作「你的出生时间」。这既不诚实,也让用户无法判断该信谁。
|
||||
|
||||
## 2. 决策记录
|
||||
|
||||
| 决策 | 内容 |
|
||||
| --- | --- |
|
||||
| D1 | **三类来源在表达上必须区分。** `hospital_record` → 可称「你的出生记录时间」;`approximate` → 只能称「你填的大概时间」/「家人记得的时间」;`period_only` → 只能称「你给的时间段」。任何输出(旁白、卡片、报告、采用确认)都不得把后两类称作「你的出生时间」。 |
|
||||
| D2 | **校正产物自己也要带标签。** 交付区间是 `rectified_window`,代表分钟是 `representative_time`,采用之后是 `accepted`(本仓既有语义,不新造词)。**不得**把代表分钟说成「已确认的出生分钟」——这条是既有红线(BUG-587 一线),本单把它和来源标签统一成一套说法。 |
|
||||
| D3 | **推算值不得单独充当裁决锚点。** 若 `birth_time_source !== "hospital_record"`,`reportedBirthTime` 只能作为搜索窗中心与展示参照,不得在任何文案里表述为「与你的出生时间一致 / 不一致」——应表述为「与你填的大概时间相差 N 分钟」。打分与出题逻辑本单**不动**(窗口中心本来就该用它)。 |
|
||||
| D4 | **`hospital_record` 与校正结果冲突时怎么说,本单不擅自定。** 若用户有医院记录、而校正区间不含该分钟,属于产品判断(以记录为准?以证据为准?并列呈现?)。本单只做到「如实并列陈述两者与差值」,不给倾向性结论,并在进度记录里把这个问题挂给产品负责人。 |
|
||||
| D5 | 不改打分、不改判据、不改置信度与确认门控、不动数据库结构(`birth_time_source` 字段已存在)。 |
|
||||
|
||||
## 3. 硬红线
|
||||
|
||||
1. `tsc --noEmit` 0 错;`npm run lint` 0 error;`npm test` 失败数 = 基线 27 条;`next build` 通过且 `/` 仍 `○ Static`。
|
||||
2. 新文案对照 `frontend/docs/VOICE.md`;改 UI 的提交同时更新 `frontend/DESIGN.md`。
|
||||
3. 不得因为要显示来源而在界面上暴露多余入口(产品偏好:多余入口宁可删除也不修)。
|
||||
4. 不得把 `period_only` 的用户逼着补一个具体钟点。
|
||||
|
||||
## 4. 任务分解
|
||||
|
||||
### 任务 1 · 把来源标签接进投影(P0)
|
||||
|
||||
- `case.birthTimeSource` 进 `decideFromDossier` 的公开投影与 GET 快照(字段名沿用 `birth_time_source`),供文案层使用;缺失时按 `approximate` 处理(保守)。
|
||||
- 验收标准:行为单测——三种 source 各自在快照里可见;缺失时落到 `approximate`。
|
||||
|
||||
### 任务 2 · 文案分档(P0)
|
||||
|
||||
- 交付卡、采用确认、旁白里所有指代"用户报的那个时间"的地方,按 D1 分档措辞;所有指代校正产物的地方按 D2 用既有三层词。
|
||||
- 与填报时间比较时,按 D3 改成「与你填的大概时间相差 N 分钟」。
|
||||
- 验收标准:
|
||||
- 行为单测:`approximate` / `period_only` 的案子,交付与采用路径产出的文本**不含**「你的出生时间」这类表述(用正则锁)。
|
||||
- 行为单测:`hospital_record` 的案子,文本可以出现「出生记录时间」,且同时给出与校正区间的差值。
|
||||
- 既有文案合同测试(`agent-voice-copy-contract.test.ts` 一线)同步补这三条。
|
||||
|
||||
### 任务 3 · Skill 侧口径(P1)
|
||||
|
||||
- `skills/jyotish-birth-time-rectification/references/candidate-comparison.md` 增补一节「出生时间来源标签」,把 D1/D2/D3 写成 Agent 必须遵守的表达规则;Skill 版本按是否改用户可见话术决定是否 bump,bump 了要在 `CHANGELOG.md` 写明。
|
||||
- 验收标准:`skill-registry` 相关测试通过;若 bump,旧 Case 仍绑旧版本(BUG-621 的教训:bump 后必须验历史 Case 还能打开)。
|
||||
|
||||
### 任务 4 · 记录
|
||||
|
||||
- `docs/BUG_HISTORY.md` 新增 **BUG-690**(`resolved`):现象写「家人推算的出生时间在系统里和医院记录等同对待,输出也直接称『你的出生时间』」;防复发条:**`birth_time_source` 不是录入时的一次性字段,任何指代出生时间的输出都必须按它分档;推算值不得表述为已证实的出生时间。**
|
||||
- `CHANGELOG.md` 一行;`PROGRESS-rectification-birth-time-provenance-20260914.md`(把 D4 那个产品问题挂在这里);`docs/testing/` 清单:三种来源各走一遍,检查措辞。
|
||||
|
||||
## 5. 让步顺序
|
||||
|
||||
1. 任务 1、2 必做。
|
||||
2. 任务 3 若 Skill bump 牵连面大,可只改 references 不 bump,在进度记录里说明。
|
||||
|
||||
## 6. 开工前置命令
|
||||
|
||||
```bash
|
||||
git fetch origin --prune
|
||||
git worktree add -b codex/rectification-birth-time-provenance-20260914 \
|
||||
.worktrees/rectification-birth-time-provenance-20260914 origin/staging
|
||||
cd .worktrees/rectification-birth-time-provenance-20260914
|
||||
ln -s /workspace/Jyotisha/.venv .venv
|
||||
cd frontend && npm ci
|
||||
```
|
||||
|
||||
开工前读:`frontend/src/lib/birth-time-intake-model.ts:100`(三类来源的原始定义)、`frontend/docs/VOICE.md`、`docs/BUG_HISTORY.md` 的 BUG-587、BUG-621。
|
||||
|
||||
## 7. BUG 编号起点
|
||||
|
||||
- 起点 **BUG-690**(当前最大号 688;689 已被 `TASK-rectification-open-collect-invite-20260914.md` 预留)。
|
||||
@@ -60,6 +60,29 @@ if one.year == two.year and abs((one - two).days) < threshold: # MIN_BOUNDARY_
|
||||
|
||||
指标沿用既有五项 + 两项新的:真实分钟命中率、**真值落在交付区间的比例(不得下降)**、区间宽度中位、并列率、每轮熵降;新增 **出题数**(每例新增几道)与 **每道题的区分力**(真值簇能否落到 yes/no 一侧且另一侧还有候选)。
|
||||
|
||||
### M1b · 分盘按分钟敏感度配权(上游对照新增)
|
||||
|
||||
上游 `jyotish-app/rectification-engine.js` 开头有一张**分盘分钟敏感度表**(每张盘多少分钟换一次上升):
|
||||
|
||||
| 分盘 | D1 | D9 | D10 | D12 | D4 | D24 | D30 | D60 |
|
||||
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
|
||||
| 换一次需要(分钟) | 120 | 13.3 | 12 | 10 | 7.5 | 5 | 4 | **2** |
|
||||
|
||||
本仓没有等价物:`scripts/active_rectification_event_engine.py:454` 计分用 D2/D3/D4/D5/D7/D9/D10/D11/D12/D24/D30 共 11 张(**没有 D60**),而 `:231` 是 `points += weight / (2 * len(varga_charts))`——**全部等权再除以 22**。于是在 20 分钟窗口里,每 4 分钟换一次的 D30 和一小时才换一次的 D2 拿到相同分量:**分辨率最高的盘被分辨率最低的盘稀释**。上一轮 R1 只整体调过除数,从未按每张盘的敏感度配权,这是没测过的角度。
|
||||
|
||||
测这三档(与 M1 的闸门档位正交,先各自单测再组合):
|
||||
|
||||
| 编号 | 改法 |
|
||||
| --- | --- |
|
||||
| V1 | 权重与敏感度成反比:`weight × (window_minutes / varga_minutes)` 上限截断,`varga_minutes` 取上表 |
|
||||
| V2 | 只给"在当前窗口内至少变化一次"的分盘计分,其余不计(等价于按窗宽动态选盘) |
|
||||
| V3 | V2 基础上加入 **D60**(每 2 分钟换一次),仅在窗口 ≤10 分钟时启用 |
|
||||
|
||||
额外要报的两项:
|
||||
|
||||
- **过拟合风险**:上游决策树明确写 D30/D60「最后谨慎使用」。对 V3 必须报告真值覆盖率与 ±7 天记错偏移下的表现;覆盖率下降或挤出真值一律不推荐。
|
||||
- **每张盘的实际贡献**:统计各分盘在 20 例上触发计分的次数与对头名变化的贡献,用来判断 11 张盘里有没有纯噪声项。
|
||||
|
||||
### M2 · 答错容忍度(必做,这是本单最大的风险)
|
||||
|
||||
日精度门槛越低,越依赖用户记准日子。模拟用户记错:把日精度事件的日期**随机偏移 ±3 / ±7 / ±14 天**,各跑一遍,统计:
|
||||
@@ -75,7 +98,7 @@ if one.year == two.year and abs((one - two).days) < threshold: # MIN_BOUNDARY_
|
||||
|
||||
## 3. 交付
|
||||
|
||||
- `scripts/research/precision_gate_sweep.py`(新,离线,不接生产)+ `docs/research/precision_gate_2026_09_14.md` / `.json`。
|
||||
- `scripts/research/precision_gate_sweep.py`(新,离线,不接生产)+ `docs/research/precision_gate_2026_09_14.md` / `.json`。M1b 的结果同文件单列一节。
|
||||
- 口径声明与前两轮一致(ayanamsa `raman`、node mode `mean`),不得与上游 true-node 数字直接比。
|
||||
- 结论只允许三种:**有收益**(命中率上升或宽度下降,真值覆盖率不降,且 ±7 天偏移下不挤出)→ 立实现单并给推荐档位;**无收益** → 关闭;**不确定** → 说明缺什么。
|
||||
- 不得改 `scripts/rectification/event_probes.py` 的线上默认值。
|
||||
|
||||
Reference in New Issue
Block a user