fix(rectification): exhaustion exit, explain layer, range reading, unknown-time scan (BUG-565–568)
Keep askable cards after exhaustion, explain each probe, read the adopted credible range in reports and chat, and compare declared periods before the minute grid when the clock is unknown. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
# Blocked work
|
||||
|
||||
本文件记录当前无法在本仓内闭环、也不得标成通过的验证。新条目追加在表后。不写姓名、出生资料或完整请求体。
|
||||
|
||||
## 条目
|
||||
|
||||
### BLK-001 · 长对话本地收窄后 VedAstro 调用窗口与断言不一致
|
||||
|
||||
- 状态:blocked(基线即失败,非 BUG-565~567 引入)
|
||||
- 首次记录:2026-09-06
|
||||
- 测试:`tests/test_active_rectification_api.py::test_long_real_conversation_reaches_vedastro_after_local_range_is_narrow`
|
||||
- 复现:
|
||||
|
||||
```bash
|
||||
.venv/bin/python -m pytest -q tests/test_active_rectification_api.py::test_long_real_conversation_reaches_vedastro_after_local_range_is_narrow --tb=line
|
||||
```
|
||||
|
||||
- 失败断言:`result["winning_segment"]` 期望 `start_time=05:07`、`end_time=05:08`、`representative_time=05:07`、`width_minutes=2`;实测 `04:16` / `04:16` / `04:16` / `width_minutes=1`。
|
||||
- 已知同样失败的 SHA:`e2f4b55c`(父任务书验收段已复跑);本工作树 `43a26a3c`(文档头,Python 与 `origin/staging` 一致)同样失败。测试首次出现于 `3ca30ed7`。未做完整二分:父任务已证明早于 BUG-558~560。
|
||||
- 本单范围:只记录。不改引擎、不改门槛、不改断言来让它变绿。
|
||||
- 相关:BUG-560 根因升级(分钟级原始分区分力≈随机);`docs/tasks/TASK-rectification-convergence-exit-20260906.md` 验收段。
|
||||
@@ -8670,6 +8670,7 @@
|
||||
- 用户现象:多件带年月经历之后,公开候选相对支持度仍是 7–9,范围几乎不收;之后只靠点选卡 ±2 推分,问尽仍收不窄。
|
||||
- 触发条件:公开最多 12 个簇代表按原始分正比例把 100 分掉;原始分底座远大于事件极差。
|
||||
- 根因:`_relative_support` 按原始分正比例归一。`TASK-rectification-provisional-adopt-20260901.md` §2 已看到 lead 停在约 5,当时只改门、四个常数不动,没有改 prior 尺度。
|
||||
- 根因升级(2026-09-06):校准门「覆盖 ≥ 旧方案 − 1 且中位宽度更窄」设计有缺陷。旧方案 proportional 在 20 例公开 holdout 上中位宽度 21 分钟 = 整个候选窗口(半径 10),覆盖 17/20 只是因为不收窄。先验一旦按引擎原始分拉尖(offset),真实分钟落在领先集合里只有 12/20(中位宽 10),与随机取 10 分钟(≈48%)相当。引擎原始分在分钟级几乎没有区分力;现有八法计分不足以在 20 分钟窗口内可靠收窄。「收敛」只能来自用户答题和更强的引擎证据,不能靠换尺度。本条状态保持 blocked,未启用新尺度。
|
||||
- 修复:实现 offset(分−全网格最低分)与 softmax,由校准脚本在 20 例公开 holdout 上比覆盖与中位宽度。合入门:覆盖 ≥ 旧方案 − 1 且中位宽度更窄。实测无方案过门(offset 覆盖 12/20 < 16;softmax T=2 中位宽度 21 不小于旧值 21)。默认仍 `proportional`,`POLICY_VERSION` / `ALGORITHM_VERSION` 不 bump,旧 Case 不因此自动重算。
|
||||
- 验证:`scripts/rectification_prior_calibration.py` holdout 表见进度记录;`tests/test_rectification_relative_support.py` 锁定默认 proportional,并断言显式 offset 在拉开的格子上领先不差于 proportional。
|
||||
- 防复发:不得在校准门未过时启用 offset/softmax 或 bump 政策版本。不得改 `MIN_SEPARATION_LEAD=8` 或采用/确认/熔断常数来「先让分看起来够」。
|
||||
@@ -8741,4 +8742,68 @@
|
||||
- 复发自:BUG-561(`cfcd369d` 的 heading-ensure 只覆盖空包缺席,未覆盖成功路径漏标题)
|
||||
- 修复版本:`e4d16b75`
|
||||
|
||||
## BUG-565 | 穷尽门槛句每个回合写成两条相同助手消息
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-06
|
||||
- 最近更新:2026-09-06
|
||||
- 影响面:`persistExhaustionCollect`、`finalizeSuccessfulTurnExit`、`runV9AgentTurn` opening/evidence、`applyRectificationChoice` 点选路径、`/api/rectification/agent`
|
||||
- 用户现象:方法覆盖完成、无剩余采集、引擎采用门关闭时,同一段「范围已经收到…还差带月份的经历」连出两三遍。
|
||||
- 触发条件:A4 用例 2 形状上 `finalizeSuccessfulTurnExit({ action: "message" })`、`action: "evidence"` 经 agent-run,或点选最后一张关闭天花板的卡。
|
||||
- 根因:门槛翻译句被当成独立消息。`persistExhaustionCollect` 自己 `persistV9DeterministicTurn`(`requestId: randomUUID()`)写第 1 条;`inspectNonTerminalTurnExit.satisfied` 不认门槛句为载体,再写第 2 条。opening/evidence 在 finalize 前还会先 idle 一次。点选路径一条独立门槛消息,又把同一句拼进「已记录你的选择」。
|
||||
- 修复:门槛句是回合正文,写入方只能有一个。`persistExhaustionCollect` 只返回 `{ hostNarration, terminalNote: true, persisted: false }`,不再写 turn。idle 返回 `terminalNote` 且本回合尚未写过门槛时,由 `finalizeSuccessfulTurnExit` / agent-run / route 用幂等 `requestId` 写一次并跳过非终止修复。点选路径只把门槛句并入该回合正文。
|
||||
- 验证:`frontend/tests/rectification-exhaustion-exit-20260906.test.ts`:message finalize、evidence agent-run、最后一张卡各计 1 次含门槛句的助手 append;A4 用例 2 后再调 `ensureNonTerminalTurnExit`,append 不增加。非 DB 校正套件 910/910。
|
||||
- 防复发:`persistExhaustionCollect` 不得再调用 `persistV9DeterministicTurn`。门槛 `requestId` 必须可幂等。`inspectNonTerminalTurnExit` 必须把穷尽态视为已交付。
|
||||
- 相关记录:BUG-558、BUG-566
|
||||
- 复发自:BUG-558(穷尽交付把门槛句做成独立消息,出口修复未锁单一写入方)
|
||||
- 修复版本:待合入 `origin/staging`(`codex/rectification-convergence-exit-fix-20260906`)
|
||||
|
||||
## BUG-566 | 穷尽分支排在问题持久化之前,吞掉仍可问的区分卡和 holdout
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-06
|
||||
- 最近更新:2026-09-06
|
||||
- 影响面:`persistNextInterviewIfIdle`、`isExhaustedGateState`、决策层 `ask_candidate_discriminator` / `ask_holdout_validation`
|
||||
- 用户现象:引擎采用门关闭(例如 `low_date_quality`)后,聊天只剩门槛句,不再出现还能分开候选的选择题或盘外核对。
|
||||
- 触发条件:无剩余采集、方法覆盖完成、`canAdopt=false`,但决策层仍给出可渲染区分卡或 holdout 题。
|
||||
- 根因:idle 穷尽分支只看「无剩余采集且不可采用」,不看 `decision.nextAction`,排在 `persistNextInterviewAfterChoice` 之前。
|
||||
- 修复:抽 `isExhaustedGateState`。idle 穷尽分支额外要求 `nextAction ∈ {offer_provisional_range, complete_with_range, ask_fact_collection}`。区分卡 / holdout 照常持久化。`inspectNonTerminalTurnExit` 与 idle 共用穷尽态判定。
|
||||
- 验证:同测试文件:关闭天花板但留一条可渲染探针 → 持久化区分卡焦点,无门槛句;holdout 仍开 → 持久化 holdout,无门槛句。
|
||||
- 防复发:不得把穷尽门槛排在 `ask_candidate_discriminator` / `ask_holdout_validation` 之前。不得重新引入 `USER_COLLECT_QUESTION.other` 兜底。
|
||||
- 相关记录:BUG-558、BUG-565
|
||||
- 复发自:BUG-558(穷尽交付分支未白名单 nextAction)
|
||||
- 修复版本:待合入 `origin/staging`(`codex/rectification-convergence-exit-fix-20260906`)
|
||||
|
||||
## BUG-567 | 范围小字伪装成停止按钮,文案仍是状态句
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-06
|
||||
- 最近更新:2026-09-06
|
||||
- 影响面:`RectificationReadonlyRange`、口述采集停止按钮、`frontend/DESIGN.md`
|
||||
- 用户现象:范围一行写着「目前范围 …–…,还在收窄」,看起来不可点,点了却等于「先这样」。同一屏下方已有明确停止按钮。
|
||||
- 触发条件:口述采集或只读范围可见时。
|
||||
- 根因:BUG-558 A3 把只读范围改成 `<button>` 并挂 `onStop`,文案未改成动作句。
|
||||
- 修复:范围行还原为 `<p role="status">`,删除 `onStop`。口述采集输入框上方的「先这样,先看当前范围」按钮保留。
|
||||
- 验证:源扫描断言范围函数没有 `onStop` / `<button`,口述停止按钮仍用 `CHOICE_STOP_LABEL`。
|
||||
- 防复发:`RectificationReadonlyRange` 不得再渲染成按钮或接受停止回调。
|
||||
- 相关记录:BUG-558
|
||||
- 复发自:BUG-558(A3 把范围小字做成第二个停止入口)
|
||||
- 修复版本:待合入 `origin/staging`(`codex/rectification-convergence-exit-fix-20260906`)
|
||||
|
||||
## BUG-568 | 报告与聊天按开工搜索窗口读盘,没用采用时的可信区间
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-06
|
||||
- 最近更新:2026-09-06
|
||||
- 影响面:`read_report_candidate_range`、采用 RPC、`consultation-route-service` `verified_chart`、`jyotish_engine._candidate_minutes`、采用旁白
|
||||
- 用户现象:采用一段 10~30 分钟可信区间后,个人报告的出生时间敏感度仍按开工搜索窗口分层;聊天把代表分钟当成精确出生分钟排盘。
|
||||
- 触发条件:校正采用成功后打开报告或新建 `verified_chart` 咨询。
|
||||
- 根因:采用 RPC 只写代表分钟,不落库可信区间。报告 RPC 读开工 `candidate_range`。引擎窗口超过 15 分钟只取 3 个样本。聊天 `accepted` 不传区间。
|
||||
- 修复:采用写入 `adopted_credible_range`,不改开工 `candidate_range`。报告 RPC 优先读采用区间。≤31 分钟逐分钟采样,更宽等距 31 点。采用旁白追加服务端「稳定 / 随分钟变」两句。`accepted` 咨询按 `provisional` + 区间读盘;`confirmed` 不变。声明时段咨询复用同一分层并标明粗看。
|
||||
- 验证:`frontend/tests/adopted-credible-range-migration.test.ts`、`frontend/tests/rectification-range-reading-20260906.test.ts`、采用旁白范围读盘用例、`tests/test_flexible_birth_time_engine.py` 27/60 分钟采样。Docker `test:db` 见测试说明;无 Docker 时不得标通过。
|
||||
- 防复发:采用不得改写 `candidate_range`。报告窗口必须先读 `adopted_credible_range`。`flexible_birth_time_profile` 上限 31。稳定/敏感句不得由模型补写。
|
||||
- 相关记录:BUG-560
|
||||
- 复发自:无
|
||||
- 修复版本:待合入 `origin/staging`(`codex/rectification-convergence-exit-fix-20260906`)
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
# PROGRESS · 生时校正穷尽出口修复(2026-09-06)
|
||||
|
||||
工作树:`.worktrees/rectification-convergence-exit-fix-20260906`
|
||||
分支:`codex/rectification-convergence-exit-fix-20260906`(跟踪 `origin/staging`)
|
||||
基线:`origin/staging` @ `b938c76a`;工作树文档头 `43a26a3c`
|
||||
|
||||
未改 `SKILL.md`(仍 10.0.14)、未改引擎、未改任何门槛数值。未重新引入 `USER_COLLECT_QUESTION.other` 兜底。未把 `.venv` 加入提交。
|
||||
|
||||
本单状态:**待验收**。BUG-565 / 566 / 567 已实现;BUG-560 保持 blocked 并补根因升级。
|
||||
|
||||
| 任务 | 状态 | BUG |
|
||||
| --- | --- | --- |
|
||||
| 5.1 单一写入方 | 完成 | BUG-565 |
|
||||
| 5.2 穷尽态视为已交付 | 完成 | BUG-565 |
|
||||
| 5.3 穷尽分支不吞题 | 完成 | BUG-566 |
|
||||
| 5.4 范围小字还原 + 记录 | 完成 | BUG-567;BUG-560 根因升级;`docs/BLOCKED.md` BLK-001 |
|
||||
|
||||
## 实现要点
|
||||
|
||||
- `persistExhaustionCollect` 门槛分支不再 `persistV9DeterministicTurn`,只返回 `{ hostNarration, terminalNote: true, persisted: false }`。
|
||||
- 共用 `isExhaustedGateState({ remainingCollect, methods, canAdopt, accepted })`。`inspectNonTerminalTurnExit.satisfied` 认穷尽态。
|
||||
- idle 穷尽分支额外要求 `nextAction ∈ {offer_provisional_range, complete_with_range, ask_fact_collection}`。`ask_candidate_discriminator` / `ask_holdout_validation` 即使 `!followup` 也不落入门槛,落到 `persistNextInterviewAfterChoice`。
|
||||
- `finalizeSuccessfulTurnExit`:`terminalNote` 且本回合尚未写门槛时写一次(幂等 `requestId`),并跳过 `ensureNonTerminalTurnExit`。agent-run opening/evidence 先写并把 `askedTurnId` 传给 finalize。`completedMessageResponse` 带上 `x-rectification-turn-id`。
|
||||
- 点选:`persistApplied` 在 `EXHAUSTION_DELIVERY_ACTIONS` 时仍走 `persistNextInterviewAfterChoice`,把门槛句拼进该回合正文。`shouldContinueAfterStructuredChoice` 对 offer/complete 仍为 false(UI 不等下一问)。
|
||||
- `RectificationReadonlyRange` 回到 `<p role="status">`。口述停止按钮保留。
|
||||
|
||||
### 既有断言改动
|
||||
|
||||
| 文件 | 原值 | 新值 | 原因 |
|
||||
| --- | --- | --- | --- |
|
||||
| `rectification-exhaustion-exit` 源扫描 | 口述停止按钮和范围小字共用 `CHOICE_STOP_LABEL` / `onStop` | 仅口述态 `.rectification-collect-stop` 使用该文案;范围行是 status 句,没有 `onStop` / `<button` | BUG-567 |
|
||||
| BUG-558 三个形状用例 | 未改断言 | 仍通过;关闭天花板夹具去掉 holdout 事件,避免白名单后 idle 去问 holdout | 白名单后 A4 用例 2 才仍是门槛 |
|
||||
|
||||
## 测试
|
||||
|
||||
| 命令 | 结果 |
|
||||
| --- | --- |
|
||||
| 非 DB `tests/rectification-*.test.ts` + `agent-voice-copy-contract.test.ts` | **910 pass / 0 fail**(解释层叠上后 917) |
|
||||
| `npx tsc --noEmit` | 0 错 |
|
||||
| `npm run lint` | 0 error / 81 warning(既有 warning,未清) |
|
||||
| `.venv/bin/python -m pytest tests/test_active_rectification_api.py::test_long_real_conversation_reaches_vedastro_after_local_range_is_narrow` | 失败:`winning_segment` 04:16 / 宽 1 vs 期望 05:07–05:08 / 宽 2。基线 `e2f4b55c` 同样失败。见 `docs/BLOCKED.md` BLK-001。 |
|
||||
|
||||
排除 `rectification-*-database.test.ts`。ERR-011:验收命令用 `.venv/bin/python -m pytest`。未改 `page.tsx`。
|
||||
|
||||
随本分支推 `origin/staging`。后续 explain-layer / range-reading / unknown-time 叠在同一提交。
|
||||
@@ -0,0 +1,33 @@
|
||||
# PROGRESS · 生时校正过程解释层(2026-09-06)
|
||||
|
||||
工作树:`.worktrees/rectification-convergence-exit-fix-20260906`
|
||||
分支:`codex/rectification-convergence-exit-fix-20260906`(叠在 BUG-565~567 之后)
|
||||
基线:`origin/staging` @ `b938c76a`;文档头 `43a26a3c`
|
||||
|
||||
未改 `SKILL.md`、未改 `contracts/probe-question-v1.json`、未改任何门、未改 `page.tsx`。
|
||||
|
||||
本单状态:**待验收**。
|
||||
|
||||
| 任务 | 状态 |
|
||||
| --- | --- |
|
||||
| B3 步骤条 | 完成 |
|
||||
| B1 卡片 why_user / answer_impact | 完成 |
|
||||
| B2 答后旁白 | 完成 |
|
||||
| B4 记录 | 完成 |
|
||||
|
||||
## 实现要点
|
||||
|
||||
- `probe-explain.ts` 纯函数:`{period} 这段经历能把当前 n 段候选分成两组(毗湿奴多利、那罗延)`;varga_style 写「这题对照 D9/D10 的类型差异」。A/B/C 来自 `expected_outcomes` 的 supports/conflicts,口径是区间「04:31–04:39 这段」。D 固定「不计分,换一题」。
|
||||
- `composeChoiceNarration` 在传入 `score_deltas` 聚合与范围前后值时拼「领先 / 落后」和「范围从 X 收到 Y / 范围没变」。unsure / 跳过仍是「这题先不计分」。
|
||||
- `step-state.ts` 从 `nextAction` / 方法覆盖 / `stopReason` / 是否已采用派生四段。Case GET 投影 `step_state`;聊天在输入框上方渲染 `.rectification-step-state`。
|
||||
- `case-service.ts` 再导出 `projectRectificationStepState`。Case 行视图仍是数据库列;完整快照在 `interview-state.ts` 与 GET。
|
||||
|
||||
## 测试
|
||||
|
||||
| 命令 | 结果 |
|
||||
| --- | --- |
|
||||
| 非 DB `tests/rectification-*.test.ts` + `agent-voice-copy-contract.test.ts` | **917 pass / 0 fail** |
|
||||
| `npx tsc --noEmit` | 0 错 |
|
||||
| `npm run lint` | 0 error |
|
||||
|
||||
`contracts/probe-question-v1.json` 未改。随本分支推 `origin/staging`。
|
||||
@@ -0,0 +1,36 @@
|
||||
# PROGRESS · 生时校正可信区间成为一等公民(2026-09-06)
|
||||
|
||||
工作树:`.worktrees/rectification-convergence-exit-fix-20260906`
|
||||
分支:`codex/rectification-convergence-exit-fix-20260906`(叠在 BUG-565~567 与 explain-layer 之后)
|
||||
基线:`origin/staging` @ `b938c76a`;文档头 `43a26a3c`
|
||||
|
||||
未改 `SKILL.md`、未改 `contracts/probe-question-v1.json`、未改采用/确认门、未改 `page.tsx`。`jyotish_api_server.py` 只加了 `/api/rectification/v5/range_reading` 薄注册。
|
||||
|
||||
本单状态:**待验收**。BUG-568。
|
||||
|
||||
| 任务 | 状态 |
|
||||
| --- | --- |
|
||||
| A1 采用落库 `adopted_credible_range`,报告 RPC 优先读它 | 完成 |
|
||||
| A2 引擎 ≤31 逐分钟,>31 等距 31 点 | 完成 |
|
||||
| A3 `verified_chart(accepted)` 聊天接同一份敏感度 | 完成 |
|
||||
| A4 采用旁白稳定/随分钟变两句 + `range_reading` | 完成 |
|
||||
| A5 `declared_birth_window` 粗看复用 | 完成 |
|
||||
| A6 记录 | 完成 |
|
||||
|
||||
## 实现要点
|
||||
|
||||
- 迁移 `20260906020000_adopted_credible_range.sql`:加列;先 DROP 五参采用函数再 CREATE 六参 `p_credible_range jsonb`。采用写 `adopted_credible_range`,不改 `candidate_range`。`read_report_candidate_range` 仍只返回 `{start_time,end_time}`。
|
||||
- `flexible_birth_time_profile` 上限从 15 提到 31,错误码改为 `candidate_count_must_be_two_to_thirty_one`。任务书按 2~31 上限写;仓库原先是 15。
|
||||
- 采用旁白在 `validateAdoptNarration` 之后追加两句;引擎不可用则省略,不报错。
|
||||
- `confirmed` 不附区间。`accepted` 才带 `birth_time_accuracy=provisional` + `candidate_range`。
|
||||
|
||||
## 测试
|
||||
|
||||
见 `docs/testing/rectification-range-reading-20260906.md`。
|
||||
|
||||
本工作树隔离验收:
|
||||
|
||||
- 非 DB `rectification-*.test.ts` + `agent-voice-copy-contract`(排除 database):931 pass / 0 fail
|
||||
- Docker `frontend` `npm run test:db`:本单当时 **36 pass / 0 fail**(约 310s)。unknown-time 叠入 `database-rectification-block-scan.test.ts` 后,同一工作树再单独跑为 **37 pass / 0 fail**(约 214s)。
|
||||
- `./node_modules/.bin/tsc --noEmit`:0
|
||||
- `./node_modules/.bin/eslint --quiet src tests`:0 error
|
||||
@@ -0,0 +1,39 @@
|
||||
# PROGRESS · 完全不知道出生时间时先比时段(2026-09-06)
|
||||
|
||||
工作树:`.worktrees/rectification-convergence-exit-fix-20260906`
|
||||
分支:`codex/rectification-convergence-exit-fix-20260906`(叠在 BUG-565~567、explain-layer、range-reading 之后)
|
||||
基线:`origin/staging` @ `b938c76a`;文档头 `43a26a3c`
|
||||
|
||||
未改 `SKILL.md`(`stage` 不是 Case status,不 bump 10.0.15)、未改 `contracts/probe-question-v1.json`、未改采用/确认门、未改 `page.tsx`。`jyotish_api_server.py` 只加了 `/api/rectification/v5/block_scan` 薄注册。
|
||||
|
||||
本单状态:**待验收**。
|
||||
|
||||
| 任务 | 状态 |
|
||||
| --- | --- |
|
||||
| C1 引擎 `minute_step` + `block_scan` | 完成 |
|
||||
| C2 Case `stage` / `block_scan` 列与 RPC;unknown 开全日窗 | 完成 |
|
||||
| C3 采集门槛后出时段卡;选 A/B/C 进分钟;D 再采集;intake / 开场线索 | 完成 |
|
||||
| C4 记录 | 完成 |
|
||||
|
||||
## 实现要点
|
||||
|
||||
- 引擎请求可选 `minute_step` 1–15,默认 1。`minute_step=1` 输出与改前一致。`block_scan` 以 10 分钟步长扫 24 小时,只聚合五段相对支持,不写探针、不出分钟卡。
|
||||
- Case 打开:`birth_time_source=unknown` 且无填报钟点 → `candidate_range=00:00–23:59`、`stage=block_scan`。有填报钟点仍走分钟。
|
||||
- 时段比较门槛用带年月经历 3 件、领域 2 个,不用训练/holdout 门(holdout 预留会把 3 件事收成 2 件训练,永远不出卡)。
|
||||
- 四选卡 A/B/C 是支持最高的三段;选中后 `advance_agentic_rectification_case_from_block_scan` 把窗口改成该时段并切 `stage=minute`。D / 说不好只写 `declined_at_fingerprint`,不采用、不停止会话。
|
||||
- `block_scan` 阶段 `can_adopt` / `selection_allowed` 恒 false;latest_result 不投影分钟候选。家人 `birth_time_clue` 只进开场旁白,改不了搜索窗口。
|
||||
- intake「完全不清楚」改为可以直接开始校正,先从记得的经历比出大致时段;删劝退句。
|
||||
|
||||
## 测试
|
||||
|
||||
见 `docs/testing/rectification-unknown-time-20260906.md`。
|
||||
|
||||
本工作树隔离验收:
|
||||
|
||||
- 非 DB `rectification-*.test.ts` + `agent-voice-copy-contract`(排除 database):**931 pass / 0 fail**
|
||||
- `.venv/bin/python -m pytest tests/test_rectification_v5_services.py -q`:**31 pass / 0 fail**
|
||||
- `./node_modules/.bin/tsc --noEmit`:0
|
||||
- `./node_modules/.bin/eslint --quiet src tests`:0 error
|
||||
- Docker `frontend` `npm run test:db`(单独跑,约 214s):**37 pass / 0 fail**。中间曾因 `||` 拼布尔得到 `true:f:f:true` 失败 1 条;改成 `concat_ws` 后全量重跑通过。
|
||||
|
||||
随本分支推 `origin/staging`。
|
||||
@@ -62,10 +62,10 @@
|
||||
| `TASK-session-title-guard-fix-20260906.md` | `PROGRESS-session-title-guard-fix-20260906.md` | BUG-553 修复单:`consult/route.ts` 标题守卫比较的是 RPC 前快照,`append_consultation_question` 已改写标题,守卫恒 0 行,模型标题只靠客户端 PATCH 落库 | 待验收 | `codex/session-title-guard-fix-20260906`(BUG-557) |
|
||||
| `TASK-rectification-collect-vs-offer-consistency-20260905.md` | `PROGRESS-rectification-collect-vs-offer-consistency-20260905.md` | 带年份采集没问完就出采用卡 + 报告,同一轮又被搬家采集题把卡挤掉:决策层判 `adopt_representative` 而计划层仍有 dated 采集(BUG-546 只修了一半);改为剩余采集未完保持 `collect_evidence`,出牌轮才出卡写报告 | 已验收通过 `ca4e2408`(2026-09-05;staging 部署仍停在 `afd14948`,`deploy-staging` 自 `c295b853` 起连续失败,先解决 `bab07187` 的待迁移) | `codex/rectification-collect-vs-offer-consistency-20260905`(BUG-550) |
|
||||
| `TASK-rectification-convergence-exit-20260906.md` | `PROGRESS-rectification-convergence-exit-20260906.md` | 采集问完落到「也可以再说一件事」无出口(非收敛出牌/非终止修复兜底 `other`)、同年月多领域拆题与同域同年重复问、`relative_support` 正比例归一把引擎证据压平成 7–9 使 lead 8 不可达;改为穷尽即交付 + 口述态停止按钮、同年月合并为「发生了什么」四选卡 + 同域同年去重 + 性格题须锚点、prior 按 (分−窗口最低分) 归一并过 20 例公开 holdout 校准门 | 已验收(部分完成:B2 合并卡未做、C 校准未过门未启用;1 P1 + 2 P2 见修复单) | `150d7ef1` / `3a9ae736` / `62afa521`(BUG-558~560,已合入 staging)|
|
||||
| `TASK-rectification-convergence-exit-fix-20260906.md` | `PROGRESS-rectification-convergence-exit-fix-20260906.md` | BUG-558 修复单:门槛翻译句每回合写 2~3 条相同助手消息(`persistExhaustionCollect` 自己写 turn + 非终止修复再写一次)、穷尽分支排在问题持久化前吞掉可渲染区分卡/holdout 题、范围小字变按钮但文案仍是状态句;并把校准结论(引擎原始分分钟级区分力≈随机)写进 BUG-560 与 BLOCKED | 待领取 | `codex/rectification-convergence-exit-fix-20260906`(BUG-565~567) |
|
||||
| `TASK-rectification-explain-layer-20260906.md` | `PROGRESS-rectification-explain-layer-20260906.md` | 过程解释层(对照上游 yinduzhanxing 旧工作台唯一领先的业务层):每张卡服务端生成「为什么问这题」与 A/B/C/D「答了会怎样」、答后旁白改成「哪段升降 + 范围从 X 收到 Y」、每轮步骤条「第 N 步 / 为什么 / 下一步」;不做双视图 | 待领取(串行:在 exit-fix 之后、range-reading 之前) | `codex/rectification-explain-layer-20260906` |
|
||||
| `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` 复用 | 待领取(串行:在 explain-layer 之后) | `codex/rectification-range-reading-20260906`(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 劝退文案 | 待领取(串行:在 range-reading 之后) | `codex/rectification-unknown-time-20260906` |
|
||||
| `TASK-rectification-convergence-exit-fix-20260906.md` | `PROGRESS-rectification-convergence-exit-fix-20260906.md` | BUG-558 修复单:门槛翻译句每回合写 2~3 条相同助手消息(`persistExhaustionCollect` 自己写 turn + 非终止修复再写一次)、穷尽分支排在问题持久化前吞掉可渲染区分卡/holdout 题、范围小字变按钮但文案仍是状态句;并把校准结论(引擎原始分分钟级区分力≈随机)写进 BUG-560 与 BLOCKED | 待验收 | `codex/rectification-convergence-exit-fix-20260906`(BUG-565~567) |
|
||||
| `TASK-rectification-explain-layer-20260906.md` | `PROGRESS-rectification-explain-layer-20260906.md` | 过程解释层(对照上游 yinduzhanxing 旧工作台唯一领先的业务层):每张卡服务端生成「为什么问这题」与 A/B/C/D「答了会怎样」、答后旁白改成「哪段升降 + 范围从 X 收到 Y」、每轮步骤条「第 N 步 / 为什么 / 下一步」;不做双视图 | 待验收 | 叠在 `codex/rectification-convergence-exit-fix-20260906` |
|
||||
| `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` 复用 | 待验收 | 叠在 `codex/rectification-convergence-exit-fix-20260906`(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 劝退文案 | 待验收 | 叠在 `codex/rectification-convergence-exit-fix-20260906` |
|
||||
| `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) |
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
给产品负责人。不要把真实案例里的年份、事件或候选分钟写进任何记录。
|
||||
|
||||
对应 BUG-558 / BUG-559 / BUG-560。测之前先做第 0 条。本单 **部分完成**:同年月合并卡(B2)未做;相对支持度换尺度未过校准门,线上仍是正比例归一。
|
||||
对应 BUG-558 / BUG-559 / BUG-560,以及修复单 BUG-565 / BUG-566 / BUG-567。测之前先做第 0 条。父单 **部分完成**:同年月合并卡(B2)未做;相对支持度换尺度未过校准门,线上仍是正比例归一。
|
||||
|
||||
## 0. 确认测的是新版本
|
||||
|
||||
@@ -12,18 +12,19 @@
|
||||
|
||||
新建生时校正,按任务书事故路径走完带年份采集和职业(可说「没有」跳过家人)。不要期待再出现「也可以再说一件你记得大概时间的事」。
|
||||
|
||||
- ✅ 预期:出现可点的候选时间卡,或一句能照做的门槛说明(例如还差带月份的经历)。口述采集时输入框上方有「先这样,先看当前范围」。
|
||||
- ❌ 失败:最后一问仍是「也可以再说一件你记得大概时间的事」;或只有不可点的范围小字、没有下一步。
|
||||
- ✅ 预期:出现可点的候选时间卡,或一句能照做的门槛说明(例如还差带月份的经历)。**门槛句在同一回合只出现一次**,刷新后也不应叠出第二段相同说明。口述采集时输入框上方有「先这样,先看当前范围」。
|
||||
- ❌ 失败:最后一问仍是「也可以再说一件你记得大概时间的事」;或只有不可点的范围小字、没有下一步;或同一段门槛说明连出两遍。
|
||||
- 若还能点开区分卡或盘外核对:应继续问那些题,而不是用门槛句顶替。
|
||||
|
||||
## 2. 口述采集可以先停下来看范围(P0)
|
||||
|
||||
任一口述采集题(家人 / 钱 / 搬家等)出现时:
|
||||
|
||||
1. 看输入框上方是否有「先这样,先看当前范围」。
|
||||
2. 点它,或点范围那一行小字。
|
||||
2. 点该按钮。范围那一行小字(「目前范围 …–…,还在收窄」)不可点。
|
||||
|
||||
- ✅ 预期:两处都可点,动作相同,进入已停并给出当前范围;不是红色报错。
|
||||
- ❌ 失败:口述态没有该按钮;或范围小字不可点;或点了之后仍停在采集题。
|
||||
- ✅ 预期:只有输入框上方的按钮可点,进入已停并给出当前范围;不是红色报错。范围小字仍是状态句。
|
||||
- ❌ 失败:口述态没有该按钮;或范围小字变成按钮;或点了按钮之后仍停在采集题。
|
||||
|
||||
## 3. 同一领域同一年不再问第二次(P0)
|
||||
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
# Staging 人肉复核 · 过程解释层(2026-09-06)
|
||||
|
||||
给产品负责人。不要把真实案例里的年份、事件或候选分钟写进任何记录。
|
||||
|
||||
对应 `TASK-rectification-explain-layer-20260906.md`。测之前先做第 0 条。
|
||||
|
||||
## 0. 确认测的是新版本
|
||||
|
||||
浏览器打开 `https://staging.jyotisha.chat/api/health`,看 `deployment.gitCommit` 前 8 位是否等于本单合入 staging 后的提交。不一致 = 先别测。
|
||||
|
||||
## 1. 每张选择题能展开「为什么问这题」
|
||||
|
||||
走到会出现 A/B/C/D 卡的那一轮。
|
||||
|
||||
- ✅ 预期:题干下方有可点开的「为什么问这题」。展开后能看到年月或 D9/D10,以及「分成两组」或「类型差异」。没有「概率 / 置信度 / 确定」。
|
||||
- ❌ 失败:没有折叠说明;或说明仍是给模型看的「时间范围锁定…语义目标是…」。
|
||||
|
||||
## 2. 答完一题能看见哪段升降和范围变化
|
||||
|
||||
点 A 或 B。
|
||||
|
||||
- ✅ 预期:助手旁白仍以「已记录你的选择」开头,并写哪段领先/落后;范围变了就写「范围从 … 收到 …」,没变就写「范围没变」。点 D 仍是「这题先不计分,换一件事问」。
|
||||
- ❌ 失败:仍只有「并更新了候选比较」;或范围没变却写成收窄。
|
||||
|
||||
## 3. 每轮顶部有第 N 步 / 原因 / 下一步
|
||||
|
||||
看输入框上方。口述采集时,步骤句在「先这样,先看当前范围」按钮左侧同一区域。
|
||||
|
||||
- ✅ 预期:始终能看到「第 N 步」和一句下一步。采集阶段是第 1 步,选择题阶段是第 2 步,问完给结果是第 3 步,采用后是第 4 步。
|
||||
- ❌ 失败:没有步骤条;或步骤条出现「概率 / 置信度 / 确定」。
|
||||
@@ -0,0 +1,37 @@
|
||||
# Staging 人肉复核 · 采用后按可信区间读盘(2026-09-06)
|
||||
|
||||
给产品负责人。不要把真实案例里的年份、事件或候选分钟写进任何记录。
|
||||
|
||||
对应 `TASK-rectification-range-reading-20260906.md` / BUG-568。测之前先做第 0 条。
|
||||
|
||||
## 0. 确认测的是新版本
|
||||
|
||||
浏览器打开 `https://staging.jyotisha.chat/api/health`,看 `deployment.gitCommit` 前 8 位是否等于本单合入 staging 后的提交。不一致 = 先别测。
|
||||
|
||||
## 1. 采用后报告窗口等于当时的「目前范围」(P0)
|
||||
|
||||
走完一次校正并采用。打开个人报告,找到出生时间敏感度那一节。
|
||||
|
||||
- ✅ 预期:窗口起止等于采用那一刻聊天里的「目前范围」,不是填报时间 ±15 分钟的开工搜索窗。
|
||||
- ❌ 失败:窗口仍是开工搜索窗,或写成已经确认的唯一分钟。
|
||||
|
||||
## 2. 采用旁白有稳定 / 随分钟变两句(P0)
|
||||
|
||||
看采用那一轮助手正文。
|
||||
|
||||
- ✅ 预期:八法/结果之后多两句,说明这段里哪些主题判断稳定、哪些会随分钟变,并出现「不是已确认的唯一出生分钟」。
|
||||
- ❌ 失败:只有代表分钟;或出现「已确认唯一出生分钟」;或这两句与服务端主题对不上(模型自编)。
|
||||
|
||||
## 3. 采用后新建对话,婚恋/学业按范围读(P0)
|
||||
|
||||
采用后新建普通咨询,问婚恋或学业类问题。
|
||||
|
||||
- ✅ 预期:回答里对会随分钟变的主题用范围口径,不把代表分钟写成唯一出生时间。
|
||||
- ❌ 失败:把采用分钟当成已确认精确时间,并给出精确到日的应期。
|
||||
|
||||
## 4. 声明时段咨询标明粗看(P1)
|
||||
|
||||
用只知道出生时段、没做校正的资料问一句方向题。
|
||||
|
||||
- ✅ 预期:系统说明或回答里能看到这是时段、不是单一分钟,并有「这只是粗看」。
|
||||
- ❌ 失败:把时段中点或探针钟点写成出生分钟。
|
||||
@@ -0,0 +1,44 @@
|
||||
# Staging 人肉复核 · 完全不知道出生时间时先比时段(2026-09-06)
|
||||
|
||||
给产品负责人。不要把真实案例里的年份、事件或候选分钟写进任何记录。
|
||||
|
||||
对应 `TASK-rectification-unknown-time-20260906.md`。测之前先做第 0 条。
|
||||
|
||||
## 0. 确认测的是新版本
|
||||
|
||||
浏览器打开 `https://staging.jyotisha.chat/api/health`,看 `deployment.gitCommit` 前 8 位是否等于本单合入 staging 后的提交。不一致 = 先别测。
|
||||
|
||||
## 1. 完全不清楚可以直接开始校正(P0)
|
||||
|
||||
资料里出生时间选「完全不清楚」,保存后从首页或资料进入生时校正。
|
||||
|
||||
- ✅ 预期:说明是「可以直接开始生时校正:先从你记得的经历比出大致时段。」没有「以后再做」,也没有把你劝去另选一段时间范围。
|
||||
- ❌ 失败:仍出现劝退;或一上来就给分钟候选卡 / 采用按钮。
|
||||
|
||||
## 2. 先说三件带年月的不同领域经历,出现时段卡(P0)
|
||||
|
||||
开校正后用口述说三件记得年月的事,至少两个领域(例如升学、搬家、感情,不要用真实资料里的原句)。
|
||||
|
||||
- ✅ 预期:出现四选卡,问哪一段更像出生时段(清晨 / 上午 / 下午 / 傍晚或夜里这类)。没有「更像 X 点」,没有采用。输入框上方是「第 1 步·比较时段」。
|
||||
- ❌ 失败:仍在问经历却已经给出分钟或采用卡;或时段卡上写了代表分钟。
|
||||
|
||||
## 3. 选定一段后进入分钟流程(P0)
|
||||
|
||||
在时段卡上选 A、B 或 C 中的一段。
|
||||
|
||||
- ✅ 预期:旁白说明已选定出生时段,接下来只在这一段里按分钟比较。目前范围变成该时段(不超过大约 6 小时),不再是 00:00–23:59。之后才可能出现分钟区分题。
|
||||
- ❌ 失败:范围仍是全日;或选定后立刻采用某个分钟。
|
||||
|
||||
## 4. 说不好会再收经历,不会结束校正(P1)
|
||||
|
||||
另开一次 unknown 校正,出时段卡后选 D「说不好 / 都不像」。
|
||||
|
||||
- ✅ 预期:回到采集,请再说一件带年份的经历;会话还在,没有采用、没有「先这样看当前范围」当成结束。
|
||||
- ❌ 失败:校正被关掉,或直接给出分钟卡。
|
||||
|
||||
## 5. 家人线索只是旁白(P1)
|
||||
|
||||
资料里「完全不清楚」但填了家人记得的时段线索,再开校正。
|
||||
|
||||
- ✅ 预期:开场旁白可以提到这条线索;搜索窗口仍是全日,直到你在时段卡上点选。
|
||||
- ❌ 失败:没有点选就把窗口收成家人说的那一段。
|
||||
Reference in New Issue
Block a user