diff --git a/docs/tasks/README.md b/docs/tasks/README.md index d9f43ee6..76241d91 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -67,7 +67,7 @@ | `TASK-rectification-range-reading-20260906.md` | `PROGRESS-rectification-range-reading-20260906.md` | 可信区间成为一等公民:采用时落库 `adopted_credible_range`,报告 `read_report_candidate_range` 与聊天 `verified_chart(accepted)` 都改读它并接同一份 `birth_time_sensitivity`(现在报告读的是开工窗口,BUG-568);引擎 >15 分钟只取 3 样本改为 ≤31 逐分钟;采用旁白加「稳定 / 随分钟变」两句;`declared_birth_window` 复用 | 已验收通过(test:db 37/0 为执行方数字,本机无 Docker) | `814c924e`(BUG-568);两条迁移待应用 | | `TASK-rectification-unknown-time-20260906.md` | `PROGRESS-rectification-unknown-time-20260906.md` | 完全不知道出生时间的两段式路线:`stage=block_scan` 以 10 分钟步长扫 24 小时只做事件计分、出五时段四选卡(不写账本不采用),选定后进现有分钟流程;引擎加 `minute_step`;开场读 `birth_time_clue`;删 intake 劝退文案 | 已验收(带修复单:时段支持度按段长偏置,下午段先天 25%,P1) | `814c924e`;修复单 `TASK-rectification-capability-fix-20260907.md`(BUG-570) | | `TASK-rectification-capability-fix-20260907.md` | `PROGRESS-rectification-capability-fix-20260907.md` | 能力补齐修复单:答后旁白把 `range_start/range_end`(搜索窗口)当范围比较,每题都说「范围没变」;`block_scan` 五段支持度按段内原始分求和,长时段先天占优(24/24/36/30/30 个候选);`TRACK_LABEL` 音译与产品 Vimshottari/Narayana 口径不一;BLK-001 写到 `docs/BLOCKED.md` 应回根目录 | 已验收通过(P2:block_scan 15 s 壁钟断言在门禁里可能间歇红) | `517df002`(BUG-569~570);staging 未部署,需先 Migrate Staging Database | -| `TASK-rectification-declared-uncertainty-20260907.md` | `PROGRESS-rectification-declared-uncertainty-20260907.md` | 出生时间「有多确定」只在 intake 问一次:三档(医院记录 / 家人大概 ±15·30·60·120 / 时段或未知),校正窗口读档案(现在有钟点一律 ±15,声明值被忽略,BUG-571);吻合率 <60% 且代表分钟贴窗口边缘时出服务端一键放宽卡,放宽后重算并写回档案(BUG-572) | 待领取 | `codex/rectification-declared-uncertainty-20260907` | +| `TASK-rectification-declared-uncertainty-20260907.md` | `PROGRESS-rectification-declared-uncertainty-20260907.md` | 出生时间「有多确定」只在 intake 问一次:三档(医院记录 / 家人大概 ±15·30·60·120 / 时段或未知),校正窗口读档案(现在有钟点一律 ±15,声明值被忽略,BUG-571);吻合率 <60% 且代表分钟贴窗口边缘时出服务端一键放宽卡,放宽后重算并写回档案(BUG-572);窗口 >120 分钟先切三子段迭代到 ≤120 再进分钟(BUG-573);日级事件问一次可靠度;四个脚本化手测场景进 docs/testing | 待领取 | `codex/rectification-declared-uncertainty-20260907` | | `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-declared-uncertainty-20260907.md b/docs/tasks/TASK-rectification-declared-uncertainty-20260907.md index d27bd2cf..de25ca49 100644 --- a/docs/tasks/TASK-rectification-declared-uncertainty-20260907.md +++ b/docs/tasks/TASK-rectification-declared-uncertainty-20260907.md @@ -4,8 +4,9 @@ - 分支:`codex/rectification-declared-uncertainty-20260907` - 执行方:coding agent;验收:Claude - 涉及文件:`frontend/src/lib/birth-time-intake-model.ts`、`frontend/src/components/birth-time-intake.tsx`、`frontend/src/lib/account-profile-patch.ts`、`frontend/src/lib/rectification-agentic/v9/case-service.ts`、`decision-from-dossier.ts`、`core/rectification-decision.ts`、`method-followup.ts`、`answer-choice.ts`、`block-scan-answer.ts`(重算函数泛化)、`tool-service.ts`、`frontend/supabase/migrations/`(新 RPC)、`frontend/src/lib/rectification-agentic/user-copy.ts` -- 不改:Python 引擎、探针契约 `contracts/probe-question-v1.json`、采用/确认门、`page.tsx`、`jyotish_api_server.py` -- BUG 编号起点:**BUG-571**(开工时 `grep -o "^## BUG-5[0-9][0-9]" docs/BUG_HISTORY.md | tail -1` 复核) +- 涉及引擎:`scripts/rectification/api_service.py::block_scan`(泛化为任意子段)、`scripts/rectification/contracts.py`(可选 `blocks` 字段) +- 不改:探针契约 `contracts/probe-question-v1.json`、采用/确认门、`page.tsx`、`jyotish_api_server.py` +- BUG 编号:**BUG-571**(声明不确定度被忽略)、**BUG-572**(吻合率低不提议放宽)、**BUG-573**(选段后直接进 4~6 小时分钟网格)(开工时 `grep -o "^## BUG-5[0-9][0-9]" docs/BUG_HISTORY.md | tail -1` 复核) - 串行:在 `TASK-rectification-capability-fix-20260907.md`(已合入)之后;与其他校正单无并行 ## 0. 为什么做这件事 @@ -30,11 +31,14 @@ - 「家人记得大概时间」→ `approximate` + 一排按钮「差不多准 / 前后半小时 / 前后一小时 / 前后两小时」= ±15 / 30 / 60 / 120(校验从 {15,30,60} 扩到 {15,30,60,120}) - 「只知道大概时段,或完全不知道」→ 现有 `period_only` / `unknown` 分支不动 `family_exact` 不再出现在新用户选项里,存量档案仍合法,语义等同"差不多准"(±15)。 -2. **校正窗口读档案。** 有钟点时:`hospital_record` / `family_exact` → ±15(引擎边界,记录常按 5 或 15 分钟取整);`approximate` → ±max(15, 声明值),最大 ±120(241 分钟,引擎实测 4 小时 3 秒,仍走分钟阶段,不进时段扫描)。`period_only` / `unknown` 逻辑不变。 +2. **校正窗口读档案。** 有钟点时:`hospital_record` / `family_exact` → ±15(引擎边界,记录常按 5 或 15 分钟取整);`approximate` → ±max(15, 声明值),最大 ±120。**窗口宽度 > 120 分钟一律先进子段扫描(决策 7),≤ 120 分钟才进分钟网格。** `period_only` 四~六小时的时段窗口同样先切子段;`unknown` 仍先走五时段全日扫描,赢的时段再按决策 7 继续切。 3. **校正中唯一碰这个值的时机是证据说窗口错了**:训练门已开、`event_fit_rate.band = low` 且 `total ≥ 3`、代表分钟落在窗口边缘 3 分钟内、`stage=minute`、未采用、有钟点、本证据指纹下没拒过。满足即出**服务端一键卡**(不是模型问句):"按你说的经历,出生时间可能比家人记的偏得更多。放宽后再比一次?" A「放宽到前后 {下一档}」 B「放宽到前后 {再下一档}」 C「不放宽,按现在的范围继续」 D「说不好」。A/B 改窗口、重算、并把新偏移写回档案(来源改为 `approximate`);C/D 记 `declined_at_fingerprint`,同一批证据不再问。已是 ±120 的不出卡。 4. 放宽卡优先级高于区分卡:窗口都可能错的时候,先别在错窗口里出题。 5. 放宽不写证据账本、不进推断层;已答探针按 `semantic_key` 在新候选集上重放(`buildInferenceState` 现有行为),测试锁定。 6. 不动采用门、确认门、`MIN_SEPARATION_LEAD`、`_relative_support`;不动 `adopted_credible_range`(那是采用后的产物)。 +7. **窗口 > 120 分钟先切三段,迭代到 ≤ 120 分钟再进分钟。** 把 `block_scan` 泛化:请求可带 `blocks: [{label,start_time,end_time}]`,不带则用五个声明时段;子段 = 当前窗口等分三段(宽度不足 3 的取整到分钟),步长按窗口宽自适应(>360 分钟 10、>180 分钟 5、其余 2),支持度仍是"段内均值减窗口最低分"归一。选 A/B/C 把窗口改成该子段并再评估:仍 > 120 → 再出一张子段卡;≤ 120 → `stage=minute` 重算。D「说不好」= 再收一件经历后重比。每个 Case 最多连问 3 张子段卡,超过即按当前窗口进分钟阶段并在旁白写明"时段分不开,直接按分钟比"。 +8. **事件可靠度只问一次、只问日级事件。** 用户说到精确到日的经历时,随后的采集确认里多一句服务端口述:"这个日子是查过记录,还是凭记忆?"——答"查过"写 `date_reliability=high`,"凭记忆"写 `medium`,不答留空;月级、年级不问。这只影响 `date_quality` 门与精度权重,不改任何其他门。 +9. **脚本化手测场景进 `docs/testing/`**:范围(家人说两点到四点)、时段(只知道傍晚)、完全未知、以及"必须停下"的反例(日期地点经历都不确定)四个脚本,每个写期望观察点,供产品负责人在 staging 照着走。 ## 3. 硬红线 @@ -64,12 +68,22 @@ - 应用:`answer-choice.ts` 比照 `mutateCaseForBlockChoice`:A/B → RPC 改窗口 → 泛化 `rescoreMinuteAfterBlockAdvance` 为 `rescoreMinuteAfterWindowChange` 重算 → 调用现有账户资料 patch 路径把 `uncertainty_before/after` 写为新半径、`birth_time_source` 改 `approximate`(`hospital_record` 例外:档案不改,只改窗口,因为其校验固定 ±2);C/D → 写 `widen_declined_at_fingerprint`。 - 验收:新文件 `rectification-window-widen-20260907.test.ts`——(1) fit low + 代表分钟在边缘 → `nextAction=ask_window_widen`,卡四项齐;(2) fit low 但代表分钟在中间 → 不出卡;(3) 答 A → RPC 收到包含旧窗口的新范围、重算被触发、profile patch 收到新半径、已答探针数不变;(4) 答 C → 记指纹,同指纹下再评估不出卡,新证据到来后可再出;(5) 已 ±120 不出卡;(6) `hospital_record` 答 A 不改档案来源。`rectification-v9-database.test.ts` 加 RPC 用例(Docker)。 +### D5 子段扫描(决策 7;BUG-573:选定时段后直接进 4~6 小时分钟网格) +- 引擎:`contracts.py` 接收可选 `blocks`(1~5 段,每段起止 HH:MM,必须落在请求窗口内且不重叠);`api_service.block_scan` 在有 `blocks` 时按其聚合,否则沿用五时段;步长按窗口宽自适应(决策 7),`minute_step` 显式传入时以传入为准。`jyotish_api_server.py` 不改(同一端点)。 +- TS:`block-scan.ts` 的 `BlockScanBlock.period` 放宽为 `label`(五时段标签或 `sub_1/sub_2/sub_3`),选项文案用起止时间("04:00—05:59");`deriveRectificationOpenPlan` 与放宽卡(D3)落地新窗口后统一走 `stageForWindow(width)`:> 120 → `block_scan` + 三等分 `blocks`;≤ 120 → `minute`。`advance_agentic_rectification_case_from_block_scan` RPC 放开"必须是 00:00–23:59"的限制,改为"新窗口必须是当前窗口的子区间";`block_scan` 列记 `rounds` 计数,≥ 3 直接切 `minute`。 +- 验收:`test_rectification_v5_services.py`——三段 `blocks` 支持度和 100、等分网格三段各 33.3/33.3/33.4、越界或重叠段报错;TS `rectification-block-scan-*.test.ts`——±120 approximate 开 Case 为 block_scan 三子段;period_only 傍晚(18:00–22:59)先出三子段卡;选 A 后窗口 ≤ 120 切 minute;连问 3 张后强制 minute 并有旁白;unknown 五时段 → 赢段再切三段。 + +### D6 事件可靠度一问 + 脚本化手测场景(决策 8、9) +- `method-followup.ts` / `collect-prompt.ts`:账本新增 `datePrecision=day` 且 `date_reliability` 为空的事件时,下一轮口述题固定为服务端句"刚才那个日子是查过记录,还是凭记忆?",答案由意图分类映射 high / medium,写回该条证据(用现有证据修订链,不新造 RPC);每条事件只问一次,用户不答则跳过。 +- `docs/testing/rectification-scenarios-20260907.md`:四个脚本(范围 / 时段 / 完全未知 / 必须停下),每个含开场输入、3~5 条虚构经历、期望看到的卡与旁白、不得出现的内容(如全日窗口上出现分钟或采用卡)。 +- 验收:`rectification-collect-*.test.ts` 新增日级事件后下一问是可靠度句、月级不问、答"凭记忆"写 medium;`docs/testing` 文件存在且四场景齐。 + ### D4 记录 -- `docs/BUG_HISTORY.md` BUG-571、BUG-572;`CHANGELOG.md`;`PROGRESS-rectification-declared-uncertainty-20260907.md`;`docs/testing/rectification-declared-uncertainty-20260907.md`(真实环境:intake 选"家人记得大概时间 · 前后一小时"→ 进校正后顶部范围是 2 小时;说 3 件与该窗口明显不合的经历 → 出放宽卡 → 点 A 后范围变宽且设置页里的选项跟着变);`frontend/DESIGN.md`、`frontend/docs/VOICE.md`。 +- `docs/BUG_HISTORY.md` BUG-571、BUG-572、BUG-573;`CHANGELOG.md`;`PROGRESS-rectification-declared-uncertainty-20260907.md`;`docs/testing/rectification-declared-uncertainty-20260907.md`(真实环境:intake 选"家人记得大概时间 · 前后一小时"→ 进校正后顶部范围是 2 小时;说 3 件与该窗口明显不合的经历 → 出放宽卡 → 点 A 后范围变宽且设置页里的选项跟着变);`frontend/DESIGN.md`、`frontend/docs/VOICE.md`。 ## 5. 让步顺序 -D1 + D2 不可拆,先做;D3 其次(若一天内做不完,先落 RPC + 决策层 + 卡,写回档案可后置到同分支第二次提交并写明);D4 不可省。 +D1 + D2 + D5 是一组(窗口读档案与 >120 分钟切子段互相依赖),不可拆,先做;D3 其次(若做不完,先落 RPC + 决策层 + 卡,写回档案可后置并写明);D6 最后,可拆到同分支第三次提交;D4 不可省。 ## 6. 开工前置命令