diff --git a/docs/tasks/README.md b/docs/tasks/README.md index abe9ba4b..0b56c532 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -89,7 +89,7 @@ | `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),不改迁移 | 待执行 | `codex/rectification-history-open-20260909`(BUG-621) | -| `TASK-rectification-window-cluster-cap-20260909.md` | `PROGRESS-rectification-window-cluster-cap-20260909.md` | **P0** 真实用户:一小时窗口分 17 个签名簇,`select_signature_representatives` 按时间取前 12 个,14:40 之后整簇丢弃(本机复现表);区间按代表分钟跨度而非簇覆盖;中途说出真实时段无意图无 RPC,助手口头答应未改;intake 无自定义小范围 | 待执行 | `codex/rectification-window-cluster-cap-20260909`(BUG-623~625,Skill 10.0.20) | +| `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) | ### 聊天主链路与首页 diff --git a/docs/tasks/TASK-rectification-window-cluster-cap-20260909.md b/docs/tasks/TASK-rectification-window-cluster-cap-20260909.md index 60fe2bd5..c36ff545 100644 --- a/docs/tasks/TASK-rectification-window-cluster-cap-20260909.md +++ b/docs/tasks/TASK-rectification-window-cluster-cap-20260909.md @@ -36,7 +36,7 @@ 引擎候选只带 `time`(簇里分数最高的那一分钟),不带簇成员;推断层 `cluster_range` 是用换升时刻在代表分钟之间重新聚的,多数是单分钟;`credible-range.ts` 取 still-valid 候选的 `cluster_range` 与 `time` 的跨度。于是即便 14:40–14:45 这一簇活着,若代表分钟是 14:40,区间右端也只写到 14:40,簇内其余五分钟被"视觉淘汰"。 -### 2.3 BUG-625(P1):中途申报更窄时段无人接,助手还口头答应 +### 2.3 BUG-625(P1):中途说出时段时助手口头答应改窗口,但什么都没改 没有"申报时间段"意图;没有把窗口改窄的 RPC(`widen_agentic_rectification_case_window` 要求 `v_new_width > v_old_width`);模型在采集焦点下收到这句话就自己"答应"了。intake 的"家人记得大概时间"只能选 ±15 / ±30 / ±60 / ±120,知道 14:45–14:50 这种小范围的用户没有地方填(`customDeclaredRange` 只给 `period_only`)。 @@ -44,23 +44,23 @@ 1. **去掉按时间截断。** `select_signature_representatives` 不再 `break`;`MAX_PUBLIC_CLUSTERS` 改为安全上限 64(±120 窗口 241 分钟实测簇数写进度记录);若真超过 64,按**分数**合并相邻低分簇,不丢尾部。公开候选数变多(一小时 ≈17)不影响四选项合同:探针的 `candidate_ids` 本来就是分钟集合。 2. **候选带簇成员。** `build_candidate_decisions` 每个候选加 `cluster_times: [HH:MM…]`(连续分钟段可写 `cluster_start/cluster_end`);`inference-adapter.ts` 把它作为 `cluster_range` 的来源(换升聚类只作退化兜底);`credible-range.ts` 的区间 = still-valid 簇覆盖的并集跨度。时间轴的实心/空心点仍按候选(代表分钟)画,簇范围只影响区间带。 -3. **中途申报时段 → 服务端卡片,不进模型。** `route.ts` 自由文本分支前置一个确定性解析:识别 `HH:MM–HH:MM`、"14 点 45 到 14 点 50"、"14:45 左右" 这类表述 → 不调分类器,直接持久化一张选择卡:题干"把搜索范围改成 14:45–14:50?",选项 A「改成这个范围」/ B「保持现在的范围」(两选项,不是四选项探针,用 `choice_kind = window_declare`,走 BUG-572 放宽卡同一渲染路径)。A:新 RPC `set_agentic_rectification_case_window(p_start, p_end)`——允许收窄或放宽,但必须落在 intake 窗口内(或与之相交时取交集)、宽度 ≥3 分钟、Case 未采用未终止;使结果失效,`rescoreMinuteAfterWindowChange({keepAnswers:false})`。宽度 ≤5 时下一步直接进交付(现有门允许)。 +3. **中途说出时间段:不改窗口,固定回一句,不进模型。**(产品 2026-09-09 否决了"确认卡改窗口"的方案:让用户口头改范围,校正就没有意义。)`route.ts` 自由文本分支前置确定性解析(`HH:MM–HH:MM`、"14 点 45 到 14 点 50"、"14:45 左右"等),命中即持久化一条固定回复:"搜索范围是开始时按你的资料定的,校正过程中不改。想按别的时间段重来,请先到资料里改出生时间,再新建一次校正。"当前焦点保持不变(点选题继续挂着)。不新增 RPC、不新增迁移。 4. **模型不得口头承认改时间。** SKILL.md §4 加一句:"用户说出出生时间或时段时,不得回答『以你说的为准』或改写搜索窗口;服务端会出确认卡。"并在 `agent-run` 的正文守卫里把"以你说的…为准"列入机器词表删除。 -5. **intake 加自定义范围。** "家人记得大概时间"下方增加"我知道一个更小的范围":两个时钟选择器 → `customDeclaredRange`,宽度 3–241 分钟;这条路仍是 `minute` 阶段(不是 `period_only` 的时段扫描)。 -6. 不动淘汰阈值、`SCORE_DELTA`、采用/确认门、`_relative_support`、`minute_step`。**新迁移需要 `npm run test:db`(Docker)**:执行方无 Docker 时写 `BLOCKED.md`,DB 用例照写,验收时由我在有 Docker 的环境跑或标环境缺口,不得写成通过。 +5. **intake 自定义范围(可选,等产品答复)。** 这是开始前的申报,不是中途改窗口;"家人记得大概时间"下方可加"我知道一个更小的范围"(两个时钟选择器 → `customDeclaredRange`,宽度 3–241 分钟,仍是 `minute` 阶段)。产品若认为申报越窄校正越无意义,此条删除。 +6. 不动淘汰阈值、`SCORE_DELTA`、采用/确认门、`_relative_support`、`minute_step`。本单**不新增迁移**(决策 3 改为固定回复后不再需要收窄 RPC)。 ## 4. 任务分解 - 4.1 BUG-623:改 `select_signature_representatives`;`tests/test_rectification_v5_services.py` 加"14:00–15:00 虚构盘 17 簇全部保留、候选含 14:46–14:51 簇的代表";用本单 §1 表格做回归夹具(虚构盘,不含真实资料)。 - 4.2 BUG-624:`cluster_times` 贯通到 `credible_range`;用例——簇 14:40–14:45 存活、代表 14:40 → 区间右端 14:45。 -- 4.3 BUG-625:解析器 + 卡片 + RPC + 重算;用例——点选焦点下输入"我的出生时间是 14 点 45 到 14 点 50"→ 出现两选项卡、无模型调用;选 A → `candidate_range` 变 14:45–14:50、旧结果 `invalidated_at` 非空、compare 一次、答题账本清空;范围超出 intake 窗口 → 取交集并在卡片题干写明;已采用 Case → 卡片不出、回执"已采用的校正不能再改范围"。 +- 4.3 BUG-625:解析器 + 固定回复;用例——点选焦点下输入"我的出生时间是 14 点 45 到 14 点 50"→ 落库固定回复、无模型调用、`candidate_range` 不变、焦点不变;采集焦点下同样;"14:47 左右"同样命中;不含时间的普通句子不命中。 - 4.4 决策 4:Skill 10.0.20(只加一句);`agent-voice-copy-contract` 收禁用短语。 -- 4.5 决策 5:intake 自定义范围;`birth-time-intake*.test.ts` 三栏。 +- 4.5 决策 5:等产品答复后再做;做则 `birth-time-intake*.test.ts` 三栏。 - 4.6 记录:BUG-623(P0,关联 BUG-560 校准记录:以前的"分钟级≈随机"结论是在 ±15 窗口上得出,一小时窗口还叠加了截断)、BUG-624、BUG-625;`CHANGELOG.md`;`PROGRESS-…`;`docs/testing/` 加"±30 窗口下候选必须覆盖整窗;中途说出时段必须出确认卡;助手不得口头答应改时间"。 ## 5. 让步顺序 -4.1 当天必做并部署(一行改动止血);4.2、4.3 必做;4.4 随 4.3;4.5 可后置为 P2;4.6 不可省。 +4.1 当天必做并部署(一行改动止血);4.2、4.3 必做;4.4 随 4.3;4.5 等产品;4.6 不可省。 ## 6. 给当前这位用户的临时办法(产品可直接转告)