docs(tasks): accept BUG-612/613, 614/615, 621, 623~625, 629 on fef54b6e; followups brief (BUG-631/632)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0193vBv6w5MV2cifdTUu9H5P
This commit is contained in:
Jesse_Chen
2026-09-09 16:55:57 +00:00
co-authored by Claude Fable 5.1
parent fef54b6e42
commit 2de2aa0b71
7 changed files with 135 additions and 5 deletions
+6 -5
View File
@@ -86,13 +86,14 @@
| `TASK-rectification-timeline-20260909.md` | — | 常驻吸顶时间轴:轴锁**当前**搜索窗口并随放宽缩放、时段/分钟两套标记、候选点二元编码不分置信度(BUG-560 blocked)、无 hoverBUG-575)、只读不可采用。实现用第三个 grid 行而非 `position: sticky``useConversationScrollAnchor` 一行不改;条高固定是正确性要求;吸顶条只留区间与宽度两个元素 | 已验收通过;宽度口径与空心点两处未通过→修复单 | `ce91a0d2` |
| `TASK-rectification-timeline-fix-20260909.md` | `PROGRESS-rectification-timeline-fix-20260909.md` | 时间轴修复单:宽度读数改含两端分钟数(与 BUG-593 报告/卡片一致);标记改读推断层候选全集,被淘汰分钟留在原地变空心(客户端投影只含 active,DESIGN §10 描述在真实数据下画不出) | 已验收通过 | `92e3d5e7`BUG-602603 |
| `TASK-rectification-conversation-economy-20260909.md` | `PROGRESS-rectification-conversation-economy-20260909.md` | 对照竞品后产品拍板三条:开场三句讲做法 + 一次收多件(推翻 opening brief「不要一次说完/不举例」与 SKILL L52);采集题「没有 / 记不清」按钮(不做示例骨架条);每轮只留一句(方法句进活动记录、点选旁白去领先落后、证据轮正文一句复述 + 服务端裁剪);Skill 10.0.19 | 已验收通过(2 条 P3 备注) | `aa7ccb30` + `1453fb16`BUG-604606Skill 10.0.19 |
| `TASK-consultation-daily-empty-answer-20260909.md` | `PROGRESS-consultation-daily-empty-answer-20260909.md` | 首页「深入看今日」计算完成却 `empty_answer`:入口定的 `timing` 被模型改成 `general``canonicalDomainPlan` 以模型为准),分段写作标题与今日格式错位,分段 `maxSteps=1` 且工具仍可调 → 模型在分段里再调工具、零正文;思考流按 chunk 过滤漏出缺词英文 | 验收 | `codex/consultation-daily-empty-answer-20260909`BUG-612613);走查 `docs/testing/consultation-daily-empty-answer-20260909.md` |
| `TASK-rectification-compare-card-polish-20260909.md` | `PROGRESS-rectification-compare-card-polish-20260909.md` | 三列卡两列经历对照 0、三列无未来窗:引擎按引擎前三算 by_time,卡片按推断前三查表,键不匹配(BUG-614);交付旁白被 BUG-606 裁成一句(BUG-615);设计减法:相同性格句只写一次、经历对照说人话、删小标题、右栏本命宫位改北印星盘、换升时刻默认折叠 | 验收 | `codex/rectification-compare-card-polish-20260909`BUG-614615 |
| `TASK-rectification-history-open-20260909.md` | `PROGRESS-rectification-history-open-20260909.md` | 历史生时校正打不开:`open_agentic_rectification_case_v2` 把 Case 绑定 Skill 身份与当前注册版本做相等比较,两天内 10.0.15→10.0.19 五次 bump 让所有旧 Case 被拒;错误码未映射成 500;错误只画在首页卡下 → 表现为点了没反应。决策:session 打开用绑定身份(v1 取 Case → 读身份 → 注册表核验 → v2),不改迁移 | 验收 | `a31a5e24`BUG-621 |
| `TASK-rectification-window-cluster-cap-20260909.md` | `PROGRESS-rectification-window-cluster-cap-20260909.md` | **P0** 真实用户:一小时窗口分 17 个签名簇,`select_signature_representatives` 按时间取前 12 个,14:40 之后整簇丢弃(本机复现表);区间按代表分钟跨度而非簇覆盖;中途说出真实时段时助手口头答应却未改 → 改为固定回复"范围开始时按资料定、中途不改"(产品否决口头改范围);intake 自定义范围等产品答复 | 验收 | `codex/rectification-window-cluster-cap-20260909`BUG-623625Skill 10.0.20);走查 `docs/testing/rectification-window-cluster-cap-20260909.md` |
| `TASK-consultation-daily-empty-answer-20260909.md` | `PROGRESS-consultation-daily-empty-answer-20260909.md` | 首页「深入看今日」计算完成却 `empty_answer`:入口定的 `timing` 被模型改成 `general``canonicalDomainPlan` 以模型为准),分段写作标题与今日格式错位,分段 `maxSteps=1` 且工具仍可调 → 模型在分段里再调工具、零正文;思考流按 chunk 过滤漏出缺词英文 | 验收通过 | `17b36f3a`BUG-612613 |
| `TASK-rectification-compare-card-polish-20260909.md` | `PROGRESS-rectification-compare-card-polish-20260909.md` | 三列卡两列经历对照 0、三列无未来窗:引擎按引擎前三算 by_time,卡片按推断前三查表,键不匹配(BUG-614);交付旁白被 BUG-606 裁成一句(BUG-615);设计减法:相同性格句只写一次、经历对照说人话、删小标题、右栏本命宫位改北印星盘、换升时刻默认折叠 | 验收通过(by_time 只算 9 个 → BUG-632 | BUG-614615 |
| `TASK-rectification-history-open-20260909.md` | `PROGRESS-rectification-history-open-20260909.md` | 历史生时校正打不开:`open_agentic_rectification_case_v2` 把 Case 绑定 Skill 身份与当前注册版本做相等比较,两天内 10.0.15→10.0.19 五次 bump 让所有旧 Case 被拒;错误码未映射成 500;错误只画在首页卡下 → 表现为点了没反应。决策:session 打开用绑定身份(v1 取 Case → 读身份 → 注册表核验 → v2),不改迁移 | 验收通过 | `a31a5e24`BUG-621 |
| `TASK-rectification-window-cluster-cap-20260909.md` | `PROGRESS-rectification-window-cluster-cap-20260909.md` | **P0** 真实用户:一小时窗口分 17 个签名簇,`select_signature_representatives` 按时间取前 12 个,14:40 之后整簇丢弃(本机复现表);区间按代表分钟跨度而非簇覆盖;中途说出真实时段时助手口头答应却未改 → 改为固定回复"范围开始时按资料定、中途不改"(产品否决口头改范围);intake 自定义范围等产品答复 | 验收通过(申报拦截误伤经历 → BUG-631;intake 自定义范围等产品) | `6008c07c`BUG-623625Skill 10.0.20 |
| `TASK-rectification-skipped-health-deadend-20260909.md` | `PROGRESS-rectification-skipped-health-deadend-20260909.md` | 真实用户:健康题「记不清」后职业答完即断(『没有拿到下一个问题』):holdout 的 `declined` 未归并 health/health_pressure,把跳过的健康线再问一次,撞同 id 焦点 `duplicate_focus` 静默;出口闸门把 `exhausted` 当已交付不修复;『重新加载』只重取快照 | 待执行 | `codex/rectification-skipped-health-deadend-20260909`BUG-626627 |
| `TASK-rectification-domain-alias-audit-20260909.md` | `PROGRESS-rectification-domain-alias-audit-20260909.md` | 领域命名审计:健康线 `health`(账本/焦点)与 `health_pressure`(计划/引擎)在十处比较里六处未归并(holdout declined、reverse-verify、conflict probes、probeYearAlreadyCovered、引擎 oos_blind_prompts / _event_years / volunteered);职业线焦点存为 `other` 只靠 questionId 兜底。其余六领域三层同名无问题。决策:TS/Python 各一个归并函数 + 源码合同禁字面量比较 | 待执行 | `codex/rectification-domain-alias-audit-20260909`BUG-628 |
| `TASK-rectification-yearless-probe-downgrade-20260909.md` | `PROGRESS-rectification-yearless-probe-downgrade-20260909.md` | 产品拍板:无年月性格题(D9/D10 风格、月宿边界)降级为平局裁决——带年月题问完且候选仍分不开才问,分值减半(±1)、不计淘汰,报告标「参考」;三列卡性格描述不动;新增离线命中率测量脚本 + 导出 SQL(有出生证用户,聚合);Skill 10.0.21 | 验收 | `codex/rectification-yearless-probe-downgrade-20260909`BUG-629 |
| `TASK-rectification-yearless-probe-downgrade-20260909.md` | `PROGRESS-rectification-yearless-probe-downgrade-20260909.md` | 产品拍板:无年月性格题(D9/D10 风格、月宿边界)降级为平局裁决——带年月题问完且候选仍分不开才问,分值减半(±1)、不计淘汰,报告标「参考」;三列卡性格描述不动;新增离线命中率测量脚本 + 导出 SQL(有出生证用户,聚合);Skill 10.0.21 | 验收通过 | `fef54b6e`BUG-629Skill 10.0.21 |
| `TASK-rectification-followups-20260909.md` | `PROGRESS-rectification-followups-20260909.md` | 验收补漏:申报时段拦截只看钟点样式,带钟点的经历(『20:00 左右分手』『3 点到 5 点被车撞』)会被吞(BUG-631);by_time 只算引擎前 9 个候选,一小时窗 17 个候选时卡片列写『还没对照』(BUG-632) | 待执行 | `codex/rectification-followups-20260909`BUG-631632 |
### 聊天主链路与首页
@@ -54,3 +54,22 @@ 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/consultation-*.test.ts tests/public-thinking*.test.ts tests/agent-*.test.ts 2>/dev/null | xargs npx tsx --test 2>&1 | grep -E "^# (tests|pass|fail)"
```
## 验收(Claude2026-09-09`origin/staging` @ `fef54b6e`staging 已部署同 SHA
| 门 | 结果 |
| --- | --- |
| tsc | 0 错 |
| lint | 0 error / 108 warning |
| 前端 rectification + consultation + session + home-bootstrap + public-thinking + voice + skill-registry(非 DB | 1400 / 0 |
| Python v5_services + event_probes + growth contract | 76 passed |
| 项 | 结论 |
| --- | --- |
| 4.1 入口钉死领域 | 通过。`pinsConsultationDomains(entrypoint)` 时只执行路由 theme,模型改写记 `planOverrideIgnored` |
| 4.2 今日三节标题 | 通过。`dailyConsultationThinkingPlan`,且 `getJyotishAgent` 在今日入口换成 daily 标题规则(额外做,合理) |
| 4.3 分段禁用工具 + 空段重试 | 通过。`toolChoice: "none"``section-empty-retry` |
| 4.4 思考流按句过滤 | 通过。`createPublicThinkingSanitizer`;偏离 2(英文前缀遇中文句起点切开)合理 |
| 真实环境 | 欠:首页点「深入看今日」得三节回答,见走查清单 |
结论:通过。
@@ -61,3 +61,22 @@ 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_v5_services.py -q
```
## 验收(Claude2026-09-09`origin/staging` @ `fef54b6e`staging 已部署同 SHA
| 门 | 结果 |
| --- | --- |
| tsc | 0 错 |
| lint | 0 error / 108 warning |
| 前端 rectification + consultation + session + home-bootstrap + public-thinking + voice + skill-registry(非 DB | 1400 / 0 |
| Python v5_services + event_probes + growth contract | 76 passed |
| 项 | 结论 |
| --- | --- |
| BUG-614 | 通过,但留一个缺口:`column_times_for_compare(limit=9)`。BUG-623 之后一小时窗口有 17 个候选,±120 最多 64 个,by_time 仍只算 9 个;推断层前三若不在引擎前九里,卡片会显示"这一分钟还没对照"(诚实,但丢信息)。写进 `TASK-rectification-followups-20260909.md` |
| BUG-615 | 通过。交付轮 ≤3 句、证据轮 1 句;补一条 `answer.delta replace` 让气泡与落库一致(偏离 5 合理) |
| 卡片减法 | 通过。共有句提卡顶、`fit_line` / `window_line`、无小标题、禁用"强相关/有关联/弱关联" |
| 右栏 | 通过。`VedicChartSvg` 北印星盘,宫位表与换升时刻默认折叠 |
| 真实环境 | 欠:三列卡与右栏像素 |
结论:通过(1 个缺口另立)。
@@ -0,0 +1,34 @@
# TASK · 验收补漏两条:申报时段拦截误伤带钟点的经历;by_time 只算 9 个候选(2026-09-09
- 基线:`origin/staging` @ `fef54b6e`
- 分支:`codex/rectification-followups-20260909`,基于 `origin/staging`;与 BUG-626628 无重叠
- 执行方:coding agent;验收:Claude
- 涉及文件:`frontend/src/lib/rectification-agentic/v9/declared-window-utterance.ts``frontend/src/app/api/rectification/agent/route.ts` L272、`scripts/rectification/refinement_packet.py::column_times_for_compare`
- BUG 编号起点:**BUG-631**`docs/BUG_HISTORY.md` 当前最大 BUG-630
- 优先级:**P1**(第一条会吞掉用户的经历)
## 1. BUG-631(P1):申报时段拦截只看钟点样式,不看语境
`parseDeclaredBirthWindow` 匹配 `HH:MM` / `X 点 Y 分``到 / 至 / -``左右 / 前后`。用户报经历时常带钟点:"2024 年 8 月 8 日 20:00 左右分手""下午 3 点到 5 点被车撞""2019 年 10 月 23 日 9 点半入职"。这些都会在 `route.ts` L272 被拦成"申报出生时段",回固定句、不进模型、证据不落库。
决策:命中钟点样式后再加两道门——(a) 句中含出生语境词(出生 / 生的 / 生于 / 出生时间 / 时辰 / 几点生 / 钟点是)才算申报;(b) 句中含年月日(`\d{4}\s*年``\d{1,2}\s*月``\d{1,2}\s*日`)且无出生语境词 → 一律当经历,不拦。用例:上面三句 → 不拦;"我的出生时间是 14 点 45 到 14 点 50""我是 14:47 左右生的" → 拦;"14:4514:50"(裸范围,无语境) → 拦(intake 之后用户最常这样说)。
## 2. BUG-632P2):by_time 只算引擎前 9 个候选
BUG-623 后引擎候选最多 64 个(一小时 17 个)。`column_times_for_compare(limit=9)` 只给前 9 个算经历对照与未来窗;推断层前三若不在其中,卡片列写"这一分钟还没对照"。决策:`limit` 改为候选全集(≤64);经历对照是字典查表,未来窗每分钟一次 Dasha 时间线,`column_compare_ms` 写进度记录,若 64 个超 3 秒则只对推断层 active 候选算(TS 把 active 列表作为 `column_times` 传入)。用例:17 候选 → by_time 17 键;`column_compare_ms` 断言上限。
## 3. 记录
BUG-631(关联 BUG-625)、BUG-632(关联 BUG-614 / 623);`CHANGELOG.md``PROGRESS-rectification-followups-20260909.md`;走查清单加"报经历带钟点不得被当成申报时段"。
## 4. 开工前置命令
```bash
git fetch origin --prune
git worktree add -b codex/rectification-followups-20260909 .worktrees/rectification-followups-20260909 origin/staging
cd .worktrees/rectification-followups-20260909
ln -s /workspace/Jyotisha/frontend/node_modules frontend/node_modules
ln -s /workspace/Jyotisha/.venv .venv
cd frontend && npx tsx --test tests/rectification-declared-window*.test.ts tests/rectification-v9-agent.test.ts 2>&1 | grep -E "^# (tests|pass|fail)"
cd .. && .venv/bin/python -m pytest tests/test_rectification_v5_services.py -q
```
@@ -46,3 +46,22 @@ 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/skill-registry*.test.ts tests/home-bootstrap*.test.ts | grep -v database | xargs npx tsx --test 2>&1 | grep -E "^# (tests|pass|fail)"
```
## 验收(Claude2026-09-09`origin/staging` @ `fef54b6e`staging 已部署同 SHA
| 门 | 结果 |
| --- | --- |
| tsc | 0 错 |
| lint | 0 error / 108 warning |
| 前端 rectification + consultation + session + home-bootstrap + public-thinking + voice + skill-registry(非 DB | 1400 / 0 |
| Python v5_services + event_probes + growth contract | 76 passed |
| 项 | 结论 |
| --- | --- |
| 决策 1 | 通过。session 打开 = v1 取 Case → 读绑定身份 → `resolveExactSkillPackage` 核验 → 用绑定身份调 v2;不在注册表 → `skill_identity_missing` |
| 决策 2 | 通过。`agentic_rectification_skill_identity_mismatch` → 409 |
| 决策 3 | 通过。错误绑在被点会话行下(`.session-open-error`),起始卡不重复 |
| 进度记录里"全仓 lint 4 error" | 当时是别处的既有错误,现头 `npm run lint` 0 error,已消 |
| 真实环境 | 欠:登录后从历史打开 9 月 3 日的 Case |
结论:通过(实现 `a31a5e24`)。
@@ -78,3 +78,22 @@ ln -s /workspace/Jyotisha/.venv .venv
cd frontend && ./node_modules/.bin/tsc --noEmit; npm run lint 2>&1 | tail -1
ls tests/rectification-*.test.ts tests/birth-time-intake*.test.ts | grep -v database | xargs npx tsx --test 2>&1 | grep -E "^# (tests|pass|fail)"
```
## 验收(Claude2026-09-09`origin/staging` @ `fef54b6e`staging 已部署同 SHA
| 门 | 结果 |
| --- | --- |
| tsc | 0 错 |
| lint | 0 error / 108 warning |
| 前端 rectification + consultation + session + home-bootstrap + public-thinking + voice + skill-registry(非 DB | 1400 / 0 |
| Python v5_services + event_probes + growth contract | 76 passed |
| 项 | 结论 |
| --- | --- |
| BUG-623 | 通过。本机同一虚构盘复核:14:00–15:00 → 17 簇全部保留、最后一分钟 15:00;±120 实测 64/66 簇按相邻低分合并,窗口两端仍在 |
| BUG-624 | 通过。候选带 `cluster_times / cluster_start / cluster_end``engineClusterRange` 优先于换升聚类 |
| BUG-625 | 通过,但留一个缺口:`parseDeclaredBirthWindow` 只认钟点样式(`HH:MM``X 点 Y``左右 / 前后``到 / 至`),不看有没有"出生"语境。用户报经历时带钟点("2024 年 8 月 8 日 20:00 左右分手""下午 3 点到 5 点被车撞")会被当成申报时段拦截,证据丢失。写进 `TASK-rectification-followups-20260909.md` |
| Skill 10.0.20 | 通过。§4 禁"以你说的为准",词表收录 |
| 4.5 intake 自定义范围 | 未做,等产品(正确) |
结论:通过(1 个缺口另立)。
@@ -50,3 +50,22 @@ ln -s /workspace/Jyotisha/.venv .venv
cd frontend && ./node_modules/.bin/tsc --noEmit; npm run lint 2>&1 | tail -1
ls tests/rectification-*.test.ts tests/skill-registry.test.ts | grep -v database | xargs npx tsx --test 2>&1 | grep -E "^# (tests|pass|fail)"
```
## 验收(Claude2026-09-09`origin/staging` @ `fef54b6e`staging 已部署同 SHA
| 门 | 结果 |
| --- | --- |
| tsc | 0 错 |
| lint | 0 error / 108 warning |
| 前端 rectification + consultation + session + home-bootstrap + public-thinking + voice + skill-registry(非 DB | 1400 / 0 |
| Python v5_services + event_probes + growth contract | 76 passed |
| 项 | 结论 |
| --- | --- |
| 3.2 权重 | 通过。`PROBE_WEIGHT.yearless = 0.5`,性格题不递增 `strong_conflict_count``kind = tie_break``asInferenceState` 接受 `tie_break`DB 触发器对非 informative/low_information 的 kind 不写 `round_kind`,不撞 CHECK(已核 `20260826010000` L60 |
| 3.1 计划层 | 通过。带年月题可问时 `yearless_deferred`;≥2 候选未分开才问;锚点保留 |
| 3.3 报告 / Skill 10.0.21 | 通过。审计表 `reference` 行;快照与 registry 一致 |
| 3.4 离线测量 | 通过。脚本 + 单测 + 导出 SQL 文档;命中率数字待你在有库环境跑 |
| 带年月题不变 | 通过。`rectification-probe-replay-loss-20260908.test.ts` 未改断言 |
结论:通过(实现 `fef54b6e`)。