diff --git a/docs/tasks/README.md b/docs/tasks/README.md index fecaa58a..6a4eab12 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -86,13 +86,14 @@ | `TASK-rectification-timeline-20260909.md` | — | 常驻吸顶时间轴:轴锁**当前**搜索窗口并随放宽缩放、时段/分钟两套标记、候选点二元编码不分置信度(BUG-560 blocked)、无 hover(BUG-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-602~603) | | `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-604~606,Skill 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-612~613);走查 `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-614~615) | -| `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-623~625,Skill 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-612~613) | +| `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-614~615) | +| `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-623~625,Skill 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-626~627) | | `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-629,Skill 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-631~632) | ### 聊天主链路与首页 diff --git a/docs/tasks/TASK-consultation-daily-empty-answer-20260909.md b/docs/tasks/TASK-consultation-daily-empty-answer-20260909.md index 210d9b3a..689f6871 100644 --- a/docs/tasks/TASK-consultation-daily-empty-answer-20260909.md +++ b/docs/tasks/TASK-consultation-daily-empty-answer-20260909.md @@ -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)" ``` + +## 验收(Claude,2026-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(英文前缀遇中文句起点切开)合理 | +| 真实环境 | 欠:首页点「深入看今日」得三节回答,见走查清单 | + +结论:通过。 diff --git a/docs/tasks/TASK-rectification-compare-card-polish-20260909.md b/docs/tasks/TASK-rectification-compare-card-polish-20260909.md index 443603b7..0bcbafab 100644 --- a/docs/tasks/TASK-rectification-compare-card-polish-20260909.md +++ b/docs/tasks/TASK-rectification-compare-card-polish-20260909.md @@ -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 ``` + +## 验收(Claude,2026-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 个缺口另立)。 diff --git a/docs/tasks/TASK-rectification-followups-20260909.md b/docs/tasks/TASK-rectification-followups-20260909.md new file mode 100644 index 00000000..4ae63daa --- /dev/null +++ b/docs/tasks/TASK-rectification-followups-20260909.md @@ -0,0 +1,34 @@ +# TASK · 验收补漏两条:申报时段拦截误伤带钟点的经历;by_time 只算 9 个候选(2026-09-09) + +- 基线:`origin/staging` @ `fef54b6e` +- 分支:`codex/rectification-followups-20260909`,基于 `origin/staging`;与 BUG-626~628 无重叠 +- 执行方: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:45–14:50"(裸范围,无语境) → 拦(intake 之后用户最常这样说)。 + +## 2. BUG-632(P2):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 +``` diff --git a/docs/tasks/TASK-rectification-history-open-20260909.md b/docs/tasks/TASK-rectification-history-open-20260909.md index a1fa1579..416fe190 100644 --- a/docs/tasks/TASK-rectification-history-open-20260909.md +++ b/docs/tasks/TASK-rectification-history-open-20260909.md @@ -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)" ``` + +## 验收(Claude,2026-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`)。 diff --git a/docs/tasks/TASK-rectification-window-cluster-cap-20260909.md b/docs/tasks/TASK-rectification-window-cluster-cap-20260909.md index c36ff545..7b0d74aa 100644 --- a/docs/tasks/TASK-rectification-window-cluster-cap-20260909.md +++ b/docs/tasks/TASK-rectification-window-cluster-cap-20260909.md @@ -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)" ``` + +## 验收(Claude,2026-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 个缺口另立)。 diff --git a/docs/tasks/TASK-rectification-yearless-probe-downgrade-20260909.md b/docs/tasks/TASK-rectification-yearless-probe-downgrade-20260909.md index 9c347000..8078c55f 100644 --- a/docs/tasks/TASK-rectification-yearless-probe-downgrade-20260909.md +++ b/docs/tasks/TASK-rectification-yearless-probe-downgrade-20260909.md @@ -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)" ``` + +## 验收(Claude,2026-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`)。