fix(rectification): equal-weight collect, year-cue questions, classifier no/unsure (BUG-641–643)
Ask finance and health like other domains, put year-cued collect questions first, and let the classifier distinguish decline vs skip. Skill 10.0.22. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+51
-3
@@ -8329,15 +8329,15 @@
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-04
|
||||
- 最近更新:2026-09-04
|
||||
- 最近更新:2026-09-10
|
||||
- 影响面:`collectionYearFields`、`spokenFollowupForUser` 对 `collect_method_evidence`
|
||||
- 用户现象:家庭采集题写成「某年前后,家里如果有结婚、添丁或住院这类事,记得大概哪年就行。」既指定了年份又让用户报年份。
|
||||
- 触发条件:家庭轮转把 dated 探针的 `year_label` 拼进 `USER_COLLECT_QUESTION.family`。
|
||||
- 根因:`68f0759e` 为 BUG-414/418「带年份的口语问、不出无年份分盘选择卡」把 dated 探针年份塞进采集口语。`USER_COLLECT_QUESTION.family` 本身以「记得大概哪年就行」结尾,拼在一起自相矛盾。本单只去年份前缀。家人拒答后若还有未问的财务/搬家/健康/职业采集,不得直接给结果——见 BUG-546(推翻本条原先「出采用卡不是缺陷」的收口)。
|
||||
- 修复:采集口语不再拼「某年前后,」。`probe_year` / `semantic_key` 仍留给计分与去重。不出无年份分盘选择卡的半边保留。
|
||||
- 验证:家庭采集口语等于 `USER_COLLECT_QUESTION.family`,同时 `probe_year > 0`。答完最后一道区分题后仍落家庭采集焦点,旁白不含探针年份。BUG-418 无年份分盘卡测试仍过。
|
||||
- 防复发:`collect_method_evidence` 口语不得加年份前缀。不得为去前缀而丢掉 `probe_year` 或放回无年份分盘选择卡。
|
||||
- 相关记录:BUG-414、BUG-418、BUG-546
|
||||
- 防复发:采集口语不得既指定年份又说「记得大概哪年就行」。**口径被 BUG-642 改为带线索模板**:有 `probe_year` 时用「某年前后有没有…别的年份也行」;无线索模板仍用「记得大概哪年就行」。不得为去前缀而丢掉 `probe_year` 或放回无年份分盘选择卡抢在采集前面。
|
||||
- 相关记录:BUG-414、BUG-418、BUG-546、BUG-642
|
||||
- 复发自:无
|
||||
- 修复版本:待发布
|
||||
|
||||
@@ -9957,6 +9957,54 @@
|
||||
- 复发自:无
|
||||
- 修复版本:待发布
|
||||
|
||||
## BUG-641 | 财务与健康被写成「只有主动说才问」,服务器却会主动采集
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-10
|
||||
- 最近更新:2026-09-10
|
||||
- 影响面:`skills/jyotish-birth-time-rectification/SKILL.md`、`conversation-strategy.md`、`scripts/rectification/event_probes.py`、Skill 10.0.22
|
||||
- 用户现象:Skill 写财务/健康只有用户主动说才问,实际对话里服务器仍会问钱和身体;Python 采集探针又不给这两域年份线索。
|
||||
- 触发条件:新校正走到方法覆盖采集;账本只有学业/感情时看 `evidence_collection_probes`。
|
||||
- 根因:三处口径各自为政。Skill L84 与 conversation-strategy 写 volunteer-only;TS `DATED_COLLECT_ORDER` 自 BUG-462 起含 finance;Python `VOLUNTEER_ONLY` 把 finance / health_pressure 挡在 `missing_collection_domains` 和 `evidence_collection_probes` 外。
|
||||
- 修复:Skill 10.0.22 改为财务、健康与其他领域同权,服务器按 `method_followup_plan.next_followup` 主动问。删除 `VOLUNTEER_ONLY`。`MAX_COLLECTION_PROBES` 3→7,避免学业+感情账本被前三个领域占满后发不出财务/健康。历史 10.0.21 包冻结,`resolveExactSkillPackage` 仍能打开。
|
||||
- 验证:`tests/test_rectification_event_probes.py` 学业+感情账本含 finance 与 health_pressure;`frontend/tests/skill-registry.test.ts` 10.0.21 精确解析;live SKILL.md 与 `versions/10.0.22` 逐字节相等。
|
||||
- 防复发:现行 Skill / 10.0.22 不得再写「主动说才问」。不得把冻结历史包改写成新口径。不得把 `.workbuddy` 镜像当运行主仓。
|
||||
- 相关记录:BUG-462、BUG-621、BUG-642
|
||||
- 复发自:无
|
||||
- 修复版本:待发布
|
||||
|
||||
## BUG-642 | 带年份线索的采集题被整句去前缀,无年份性格卡还能抢在采集前面
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-10
|
||||
- 最近更新:2026-09-10
|
||||
- 影响面:`user-copy.ts`、`spokenFollowupForUser`、`nextDatedCollectFollowup`、方法覆盖链
|
||||
- 用户现象:家人采集题号带 2021,题干却没有年份;同领域无年份性格卡可以抢在带线索采集题前面。
|
||||
- 触发条件:`evidence_collection_probes` 给出 `age_band` 年份;同域还有 D12 等无年份对照。
|
||||
- 根因:BUG-539 因「某年前后…记得大概哪年就行」自相矛盾而把年份前缀整句删掉。`sameDomainYearlessCard` 在感情/事业/家人未覆盖时优先于采集。
|
||||
- 修复:采集题拆成无线索模板与带线索模板。有 `probe_year` 时写成「家里在 2021 年前后有没有…有就说个大概年月,别的年份也行。」不得同时出现「记得大概哪年就行」。未覆盖的感情/事业/家人先采集;`nextDatedCollectFollowup` 在 `DATED_COLLECT_ORDER` 内先排有年份线索的领域。带年月区分点选题仍在一切采集之前。
|
||||
- 验证:`rectification-spoken-collect` / `rectification-eight-method` / `rectification-collect-stall`:家人 2021 采集口语含「2021 年前后」、不含「记得大概哪年就行」;感情/事业/家人未覆盖时 `next_followup` 是采集而不是无年份性格卡;existence 类 D12 仍记 `yearless_ungrounded_contrast`,没有单独的「拒答后出 D12 风格卡」用例。无 `probe_year` 用无线索模板。
|
||||
- 防复发:有线索的采集口语必须带「某年前后」且允许别的年份。无线索模板不得带年份。不得让同域无年份性格卡抢在该域采集之前。
|
||||
- 相关记录:BUG-539、BUG-418、BUG-629、BUG-641
|
||||
- 复发自:BUG-539(整句去前缀把回忆线索一并删掉)
|
||||
- 修复版本:待发布
|
||||
|
||||
## BUG-643 | 「没有 / 记不清」靠原字匹配,分类器分不出「没有」和「先放着」
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-10
|
||||
- 最近更新:2026-09-10
|
||||
- 影响面:`turn-intent-classifier.ts`、`POST /api/rectification/agent`、`expectedWriteFromCollectIntent`
|
||||
- 用户现象:只有整句等于「没有」或「记不清」才走跳过;「不记得了」「忘了」落到 Agent。采集题分类器只教了 `no`。用户用带年月的事回答采集题时,`expectedWrite` 仍是 none,BUG-635 守卫只剩正文「记下了」。
|
||||
- 触发条件:采集焦点下打「没有」「不记得了」「2018 年 3 月开始欠债」。
|
||||
- 根因:`isCollectDeclineUtterance` / `isCollectSkipUtterance` 去掉句末标点后要求整句相等。`shouldDeclineCollectFocus` 只认 `no`。`expectedWriteFromCollectIntent` 不把 collect 焦点上的 yes/weak_yes 当写入。
|
||||
- 修复:删除两个原字匹配函数和路由短路。分类器:没有→`no`(declined),记不清→`unsure`(skipped),带年月直接回答采集题→`yes` 且 `expectedWrite=evidence`。`collectFocusCloseStatus` 走既有 `applyCollectFocusDenial`。分类器失败记 `collectIntent=unclassified`,不做关键词兜底。
|
||||
- 验证:`rectification-turn-intent-classifier.test.ts`、`rectification-spoken-collect.test.ts`、`rectification-unwritten-evidence.test.ts`(collect + yes + 无写入 → 重试)。源码合同:route 与 classifier 不再引用那两个函数。
|
||||
- 防复发:采集跳过/没有不得用正则或词表。collect 焦点 yes/weak_yes 必须 `expectedWrite=evidence`。分类器 null 不得回退到关键词。
|
||||
- 相关记录:BUG-605、BUG-626、BUG-635
|
||||
- 复发自:无
|
||||
- 修复版本:待发布
|
||||
|
||||
## BUG-644 | 被顶替的采集题号永久占位,落库撞号后当成已问过并断流
|
||||
|
||||
- 状态:resolved
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
# PROGRESS · 采集语义三改(2026-09-10)
|
||||
|
||||
工作树:`.worktrees/rectification-collect-semantics-20260910`
|
||||
分支:`codex/rectification-collect-semantics-20260910`
|
||||
任务书:`docs/tasks/TASK-rectification-collect-semantics-20260910.md`
|
||||
基线:任务书写 `82eb3b79`;开工接到 `origin/staging` @ `71eaeb2e`(BUG-635~640、BUG-644/645 已在其上)。
|
||||
|
||||
## 开工回执
|
||||
|
||||
- 编号 **BUG-641 / 642 / 643**。当时 `docs/BUG_HISTORY.md` 最大号是 645,但 641~643 未占用,按任务书使用。
|
||||
- 顺序:T1 Skill 10.0.22 + 去掉 `VOLUNTEER_ONLY` → T2 带线索模板与采集优先 → T3 分类器 no/unsure + collect yes 的 `expectedWrite` → T4 记录。
|
||||
|
||||
## 已完成
|
||||
|
||||
- **T1 / BUG-641**:Skill L84 与 `conversation-strategy.md` 改为同权采集。删除 `VOLUNTEER_ONLY`。`MAX_COLLECTION_PROBES` 3→7。live `SKILL.md` 与 `versions/10.0.22/SKILL.md` 逐字节相等。sha256 `e3765b20ce6b49a5c7c9ed6b0a8caacc6fc4b8a16a127b93bd92c537330a54e2`。10.0.21 仍 deprecated,`resolveExactSkillPackage` 可打开。
|
||||
- **T2 / BUG-642**:`COLLECT_QUESTION_YEAR_CUE` / `collectQuestionForDomain`。`nextDatedCollectFollowup` 先排有 `evidence_collection_probes` 年份线索的领域。未覆盖感情/事业/家人先采集,不再 `sameDomainYearlessCard` 抢跑。existence 类 D12 仍 `yearless_ungrounded_contrast`。带年月区分点选题顺序未改。
|
||||
- **T3 / BUG-643**:删除 `isCollectDeclineUtterance` / `isCollectSkipUtterance`。`collectFocusCloseStatus`:`no`→declined,`unsure`→skipped。分类器失败记 `collectIntent=unclassified`。collect 焦点 `yes`/`weak_yes` → `expectedWrite="evidence"`。
|
||||
- **T4**:BUG-641~643、BUG-539 补口、CHANGELOG、本文件、任务表待验收、走查第 16~18 条、`VOICE.md` 带线索对照行。
|
||||
|
||||
## 三栏(既有断言)
|
||||
|
||||
| 位置 | 原值 | 新值 | 原因 |
|
||||
| --- | --- | --- | --- |
|
||||
| Skill 当前钉 | 10.0.21 / sha256 `3ced1073…` | 10.0.22 / `e3765b20…` | 改 SKILL.md 必须升版 |
|
||||
| Skill L84 / conversation-strategy | 「财务与健康只有用户主动说才问,仍可计分。」 | 「财务、健康与其他领域同权:服务器按 next_followup 主动问,用户说了就记、就计分。」 | 决策 1 |
|
||||
| Python `VOLUNTEER_ONLY` | `{finance, health_pressure}` | 删除 | 决策 1 |
|
||||
| `MAX_COLLECTION_PROBES` | 3 | 7 | 学业+感情账本仍要发出 finance / health_pressure |
|
||||
| 家人采集口语(有 2021 线索) | `USER_COLLECT_QUESTION.family`(「记得大概哪年就行」) | 「家里在 2021 年前后有没有…别的年份也行。」 | 推翻 BUG-539 整句去前缀,保留矛盾禁令 |
|
||||
| 家人未覆盖 + D12 | `sameDomainYearlessCard("family")` 可抢采集 | 感情/事业/家人未覆盖先采集;existence 类 D12 仍记 `yearless_ungrounded_contrast`,没有「拒答后立刻出 D12 风格卡」断言 | 决策 2 |
|
||||
| 采集「没有 / 记不清」 | `isCollectDeclineUtterance` / `isCollectSkipUtterance` 整句相等即短路 | 分类器 `no`/`unsure` → `collectFocusCloseStatus` | 决策 3 |
|
||||
| collect 焦点 yes/weak_yes 的 `expectedWrite` | `"none"`(只靠「记下了」文字) | `"evidence"` | BUG-635 验收补漏 |
|
||||
|
||||
## 验收命令(实测)
|
||||
|
||||
工作树 `codex/rectification-collect-semantics-20260910`,相对 `origin/staging` @ `71eaeb2e`。
|
||||
|
||||
| 命令 | 结果 |
|
||||
| --- | --- |
|
||||
| `.venv/bin/python -m pytest tests -k "event_probes or collection" -q` | **45 passed / 0 fail**(collect-only:event_probes 35 + oracle collection 8 + discriminator 1 + tajika 1) |
|
||||
| `cd frontend && ls tests/rectification-*.test.ts tests/skill-registry.test.ts tests/agent-voice-copy-contract.test.ts \| grep -v database \| xargs ./node_modules/.bin/tsx --test` | **1156 pass / 0 fail**(17.7s)。同类 glob 在 yearless 单曾记 1087;本 SHA 含 BUG-635~640、644/645 及本单新增用例。 |
|
||||
| `cd frontend && ./node_modules/.bin/tsc --noEmit` | **0 error** |
|
||||
| `cd frontend && npm run lint` | **0 error**,113 warning(既有债务;本单未做无关清理) |
|
||||
| `git diff --check` | 干净 |
|
||||
| `python3 scripts/run_quality_gate.py --profile quick --skip-frontend-runtime` | **Quality gate passed.** 核心 pytest **731 passed / 1 skipped / 0 fail**(312s)。未带全量 `npm test`。 |
|
||||
| `cd frontend && npm run build` | **blocked**:Turbopack `node_modules` 软链指到 worktree 外(`../../../frontend/node_modules`)。未核首页 Static / gzip。 |
|
||||
|
||||
## 环境缺口
|
||||
|
||||
- 无 Docker:未跑 `npm run test:db`。
|
||||
- 无登录态、无 Chrome:走查第 16~18 条未做。部署后须先打开 10.0.21 历史校正。
|
||||
- `next build` 在本 worktree 因 `node_modules` 软链被 Turbopack 拒绝;未核首页 Static / gzip。
|
||||
- `grep -n "主动说才问" skills/` 在冻结历史包(≤10.0.21)仍有命中;live + `versions/10.0.22` 为空。不得改历史包哈希。
|
||||
|
||||
## 未做
|
||||
|
||||
- 未提升 `main`。
|
||||
- 未改点选题四选项合同、采用门、holdout 计分。
|
||||
@@ -97,7 +97,7 @@
|
||||
| `TASK-rectification-evidence-turn-empty-answer-20260910.md` | `PROGRESS-rectification-evidence-turn-empty-answer-20260910.md` | 证据轮模型无正文被判整轮失败:证据、评分、下一问都已落库却只剩『没有拿到下一个问题』(BUG-633);答题旁白只说『范围没变』、时间线写死『还在收窄』(BUG-634) | 待验收 |
|
||||
| `TASK-rectification-unwritten-evidence-claim-20260910.md` | `PROGRESS-rectification-unwritten-evidence-claim-20260910.md` | 证据轮模型只说『记下了』却没调 batch、没设下一问,财务一件静默丢失、流程停在原题且照常扣点(BUG-635);校正流不识别 Mastra schema 拒绝信封,会把被拒的 batch 报成 completed(BUG-636) | 已验收通过(2026-09-10,Claude;环境缺口:`next build` / 真人走查) | `codex/rectification-unwritten-evidence-claim-20260910` |
|
||||
| `TASK-rectification-latent-audit-20260910.md` | `PROGRESS-rectification-latent-audit-20260910.md` | 顺带审计:账本派生同年键误杀 `known_event_quality`(BUG-637,BUG-389 复发);双轨一致性按 31 分钟逐分判冲突并降置信度、与报告两套口径(BUG-638);不可分宽度按簇代表分钟少算(BUG-639);引擎与推断层两套代表分钟、回执宫位表不是卡片那一分钟(BUG-640);另 8 条观察项 | 已验收通过(2026-09-10,Claude;环境缺口:`next build` / 真人走查) | `codex/rectification-unwritten-evidence-claim-20260910` |
|
||||
| `TASK-rectification-collect-semantics-20260910.md` | `PROGRESS-rectification-collect-semantics-20260910.md` | 产品决策三改:Skill 去掉「财务/健康只有主动说才问」并清空 Python `VOLUNTEER_ONLY`,升 10.0.22(BUG-641);带年份线索的采集题优先、题干带线索不矛盾,推翻 BUG-539 的整句去前缀(BUG-642);删掉「没有/记不清」原字匹配,分类器分 no/unsure 两类(BUG-643) | 待执行 | `codex/rectification-collect-semantics-20260910` |
|
||||
| `TASK-rectification-collect-semantics-20260910.md` | `PROGRESS-rectification-collect-semantics-20260910.md` | 产品决策三改:Skill 去掉「财务/健康只有主动说才问」并清空 Python `VOLUNTEER_ONLY`,升 10.0.22(BUG-641);带年份线索的采集题优先、题干带线索不矛盾,推翻 BUG-539 的整句去前缀(BUG-642);删掉「没有/记不清」原字匹配,分类器分 no/unsure 两类(BUG-643) | 待验收 | `codex/rectification-collect-semantics-20260910` |
|
||||
| `TASK-rectification-superseded-focus-duplicate-20260910.md` | `PROGRESS-rectification-superseded-focus-duplicate-20260910.md` | P0:一轮两次 batch 让感情采集题被顶替成 superseded 行;题号唯一约束含已结束行、汇总只聚合 declined/skipped,计划层看不见→撞号 `duplicate_focus` 被当「已问过」→出口误走交付旁白无卡(BUG-644);交付口吻与 `can_adopt=false` 矛盾(BUG-645) | 待验收(环境缺口:`next build` / 真人走查) | `a3a51c32`(BUG-644/645) |
|
||||
|
||||
### 聊天主链路与首页
|
||||
|
||||
@@ -221,3 +221,35 @@
|
||||
- 要么助手说「这件我还没记上。请再说一次大概年月和发生的事。」并再显示财务题
|
||||
- **不得出现**:助手只说「记下了:…」而证据数不变、下面没有问题
|
||||
|
||||
## 16. 财务采集题「没有」与「不记得了」回执不同
|
||||
|
||||
资料与开场同第 0 条。虚构经历。新 Case 走到财务采集题。
|
||||
|
||||
先回「没有」,记下回执后如有需要可新开一次,再走到财务题回「不记得了」。
|
||||
|
||||
期望:
|
||||
|
||||
- 「没有」看到「记下了,这方面先跳过。」
|
||||
- 「不记得了」看到「记下了,这题先放着。」
|
||||
- 不得只在整句恰好等于「没有」或「记不清」时才有回执
|
||||
|
||||
## 17. 家人采集题带年份线索,别的年份也能答
|
||||
|
||||
资料与开场同第 0 条。虚构经历。走到家人采集题。
|
||||
|
||||
期望:
|
||||
|
||||
- 题干含「某年前后有没有…」,例如「家里在 2021 年前后有没有结婚、添丁或住院?有就说个大概年月,别的年份也行。」
|
||||
- 不得同时出现「记得大概哪年就行」
|
||||
- 用另一个年份回答(例如 2018 年家里有人住院)可以记上,不得被题干年份挡掉
|
||||
|
||||
## 18. 打开绑定 10.0.21 的历史校正
|
||||
|
||||
从历史对话打开一个创建时绑定 Skill 10.0.21 的生时校正。
|
||||
|
||||
期望:
|
||||
|
||||
- 能打开,不要求等于当前 10.0.22
|
||||
- 错误若出现,画在被点的那一行下面,不像没点到
|
||||
- **部署后先做这一条**(BUG-621)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user