diff --git a/docs/tasks/README.md b/docs/tasks/README.md index b7f76f23..967b1cbd 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -260,6 +260,8 @@ | `TASK-rectification-varga-resolution-research-20260930.md` | `PROGRESS-rectification-varga-resolution-research-20260930.md` | **「盘型口径」研究(离线)**:打分层关闭后,把校正目标从分钟改为分盘上升段。v5 实测:±10 六题后 D1 单一 75/77,D9/D10 ≤2 种 68/63,多数=真值 88%/84%;±30 起分盘分不开。M0 入库段扫描与区间脚本、M1 段级汇总与阈值-准确率(留一法)、M2 按段选题、M3 按问题域取盘 + 「不用校正」比例、M4 实现单要点。不改引擎 / 常数 / 冻结文件;红线:真值段不被排除 ≥ 现在真值在区间比例 | 已验收(Claude 09-30:M0–M3 + 稳健性完整执行,复跑逐字节一致,红线逐格核对;盘型口径成立——±10 D9/D10 头段=真值 88%/86%、占比≥0.6 留一法 92%/90%,±30 约 1/4–1/3 用户可信,±60 分盘 blocked;提前停不过门;「不用校正」只对 D1 成立。另一会话 08:49 部分归档 bedb4d7b 已被取代并移除)→ 实现单待写 | 分支 `codex/rectification-varga-resolution-research-20260930`(BUG-1105) | | `TASK-rectification-varga-resolution-20260930.md` | — | **「盘型口径」实现单**:交付改为「每张目标盘的上升 + 可信度档位」(≤±10:≥0.6 较可信 / 0.5–0.6 倾向 / <0.5 分不开;≤±30 只有较可信或分不开;>±30 只给 D1);按问题域取盘(婚恋 D1+D9 / 事业 D1+D10 / 综合三张);段扫描端点 + 「盘型一致不用校正」出口;按段选题仅 ≤±30;不得用占比提前停;采用落库头段交集中点。不改引擎 / 常数 / 冻结文件。红线:回放 ±10/±30 真值段保留 76/76、头段命中不低于研究「按段」列;段级汇总与研究 JSON golden 逐格一致 | 已验收(Claude 10-01,经修复单 BUG-1132;分支 codex/rectification-varga-resolution-fix-20261001) | — | | `TASK-rectification-varga-resolution-fix-20261001.md` | — | **盘型口径修复单**:F1 开案 RPC 42501(推荐包装改 security invoker,禁补属主授权)、F2 Docker 真库全量 test:db + 旧会话可打开、F3 用 `--posterior production` 重生成正式回放文件(Claude 同命令已得差 0)、F4 研究 PG harness、F5 记录。部署须先迁移 | 已执行并验收(Claude 10-01 直接执行:开案 42501 修复、history/harness 改 V10 写轮次、迁移改名 20261001*、正式回放替换;真库替身全量与 staging 一致;真 Docker 复跑与真机待产品) | 基于 review/rectification-varga-resolution-20260930 ce9d669c | +| `TASK-rectification-message-cleanup-20261001.md` | — | **校正消息清理**:题干两遍(作废旧焦点仍打印题干 + 独立问题块再打印一次)→ 一屏一题干;证据轮正文改为「记下了 N 件事」+ 服务端清单可展开;校正结算后不显示「已完成 N 步」与「1.」泄漏。推翻 BUG-917 作废题留题干、VOICE 逐条复述 | 待领取 | BUG-1135~1137 | +| `TASK-rectification-chart-tier-caveats-20261001.md` | — | **报告与聊天标注判断不了的分盘**:采用后读 `active_birth_provenance`(segment-v1)→ 结果 `segment_summary` 档位,blocked/indistinct 的 D9/D10 在聊天 answer_policy 与一句说明、报告章节顶部提示 + 主题降级;旧资料逐字节不变;不改库、不改 consult/route.ts | 待领取 | BUG-1138~1139 | | `TASK-rectification-typed-event-scoring-research-20260929.md` | `PROGRESS-rectification-typed-event-research-20260929.md` | **打字经历按选择题规则计分(离线研究,不上线)**:计分通道不对称 + 已入账年份挡题;R0 学业质量题措辞 / 年精度显示成 1 月(冻结文件,需重新冻结) | 已验收(Claude 2026-09-29 合并验收:全量前端 4302/24 与基线同 24 条环境失败、tsc 0、lint 0 error、`/` Static、gzip +0.16%、快速门 pytest 1001 passed、两份回放复跑一致),待部署核对 | BUG-1088、1089 | | `TASK-report-reader-polish-20260929.md` | `PROGRESS-report-reader-polish-20260929.md` | **报告页打磨**:生成入口挪进页面主体(删标题栏按钮)、详情页到底部按钮(懒渲染一次到底)、导出按钮带文字、目录一级/二级分层、去掉「字段」与 RL/NL 缩写表头、状态列同义重复去重、报告表格淡底色、分块导出显示真实文件大小 | Claude 直接执行并自验(tsc 0、lint 0 error、全量 fail 与基线同 24 条、`/` Static、gzip +7 B、快速门 Python 1000 passed),已部署 staging `d7772011`,真机欠 | BUG-1092~1094 | | `TASK-report-english-edition-20260929.md` | `PROGRESS-report-english-edition-20260929.md` | **报告中英两版**:同一次引擎计算渲染 zh/en 两遍(不用模型翻译),瑜伽库 477 条补英文、模板与前端表头英文化;中文逐字节不变、英文零汉字、两版数字序列一致;阅读页 `?lang=en` 切换,导出当前语言 + 「问 AI 建议导出英文版」提示;旧报告不补英文 | Claude 直接执行(含两个 fork 子代理)并自验(tsc 0、lint 0 error、全量 fail 与基线同 24 条、`/` Static、gzip +0.06%、Python 定向全绿),已部署 staging `d7772011`,真机欠 | — | diff --git a/docs/tasks/TASK-rectification-chart-tier-caveats-20261001.md b/docs/tasks/TASK-rectification-chart-tier-caveats-20261001.md new file mode 100644 index 00000000..0c648447 --- /dev/null +++ b/docs/tasks/TASK-rectification-chart-tier-caveats-20261001.md @@ -0,0 +1,72 @@ +# TASK · 报告与聊天标注「判断不了的分盘」(2026-10-01) + +## 基线 + +- `origin/staging` @ `00420f89`(写作时 head;开工时以最新 `origin/staging` 为准)。盘型口径(BUG-1115~1117、1131)已在其中。 +- 分支 `codex/rectification-chart-tier-caveats-20261001`,工作树 `.worktrees/rectification-chart-tier-caveats-20261001`。 +- **串行 / 并行**:与 `TASK-rectification-message-cleanup-20261001.md` 文件不重叠,可并行。与 `TASK-consult-plain-answer-20261001.md`:本单**不改** `frontend/src/app/api/consult/route.ts`、`frontend/src/mastra/product-voice.ts`、`consultation-evidence-card.ts`、`consultation-thinking-plan.ts`;若确需改动这些文件,排在该单合入之后并在 PROGRESS 写明。 +- 不动冻结计分文件、引擎计分、盘型交付逻辑;**不改数据库结构**。 + +## 事故实证(产品 2026-10-01 对比旧版 / 新版时发现) + +Claude 用 v5 77 例回放「采纳推荐后读到的盘对不对」(`docs/research/varga_resolution_impl_replay_2026_09_30.json` 同口径;脚本见 PROGRESS): + +| 窗口 | 卡片对 D9 / D10 的说法 | 采用后存下分钟的 D9 / D10 对的例数 | +| --- | --- | --- | +| ±10 | 74 人给推荐(D9 对 65、D10 对 64),3 人「分不开」 | 68 / 66 | +| ±30 | 只对 18 / 24 人推荐,其余「分盘分不开」 | 50 / 52 | +| ±60 | 全部 blocked(「分盘解读需要更准的出生时间」) | 27 / 28 | + +卡片已经如实说「判断不了」,但**报告和聊天不读这个结论**,照样按存下的那一分钟读 D9 / D10 下结论。Claude 只读调研(`origin/staging` @ `a8820f2c`): + +- 报告:`lib/personal-report-route-core.ts::resolveReportBirthClock`(accepted / confirmed 用 `active_birth_time`)→ `resolveReportBirthTimeSensitivityInput` → 只传时分;长报告 `lib/personal-report-longform-birth.ts` 构造 `/api/professional_report_reference` 载荷,带 `birth_time_accuracy`、`candidate_range`、`time_source`,无分盘可判性;`lib/personal-report-generation.ts` 的 `birthTimePolicy` 是整份报告级标签,`demoteThemesMissingRequiredCharts` 已存在。 +- 聊天:`lib/consultation-route-service.ts`(`persistedConsultationMode`、`declaredBirthAccuracyFromProfile`、accepted 时 `loadCandidateRange`);`lib/consultation-birth-time-mode.ts::applyBirthTimeModeToWorkflowContext` 只对 `unverified_birth_time` 设 `birth_time_notice` / `answer_policy`。 +- 可用数据:采用时写入的 `profiles.active_birth_provenance` 已含 `contract: "segment-v1"`、`case_id`、`result_id`(`20261001010000_rectification_segment_adoption.sql`);每次服务端读资料都会带出(`lib/server-owned-birth-profile.ts`),但没人解析。分盘档位在该 result 的 `decision_receipt.inference_state.segment_summary.charts[].tier`。 + +## 根因 + +盘型口径只改了校正交付卡;采用后下游(报告、聊天)仍只拿一个分钟,不知道哪些分盘被判为不可判。旧版同样如此(旧版连卡片都不提示)。 + +## 决策记录(产品 2026-10-01) + +- **D1 数据源**:仅当 `active_birth_provenance.contract === "segment-v1"` 时,按其 `result_id` 读该次结果的 `segment_summary`;`tier ∈ {blocked, indistinct}` 的分盘记为「不可判分盘」。`tentative`(倾向)不标注。旧采用(非 segment-v1)、未校正资料、读取失败 → 行为与现在完全相同(读取失败要记服务端日志,不阻断报告 / 聊天)。 +- **D2 聊天**:不可判分盘进入 `answer_policy`(如 `unreliable_vargas: ["D9"]`)与一句 `birth_time_notice`;Agent 不得据这些分盘下结论;用户的问题主要依赖它(婚恋问 D9、事业问 D10)时,回答里用一句大白话说明「你的出生时间范围较宽,D9 判断不了,下面只看本命盘和大运」,不展开技术细节,不拒答。文案对照 `frontend/docs/VOICE.md`。 +- **D3 报告**:不可判分盘相关的章节 / 表格(该分盘的盘图、分盘解读段、依赖它的主题结论)顶部加一行固定提示「出生时间范围内这张盘的上升会变,这一节仅供参考」;依赖它的主题按现有 `demoteThemesMissingRequiredCharts` 降级。**不删除**分盘图与表(专业读者仍可看)。 +- **D4 不改数据库**:读已有字段;新增一个服务端读取 helper,报告与聊天共用。 +- **不做**:不改校正交付卡、不改采用规则(D7 已验证无更优变体)、不追溯修改已生成的旧报告(新生成才带提示)。 + +## 硬红线 + +1. 非 segment-v1 资料的报告载荷与聊天上下文**逐字节不变**(用虚构旧资料做 A/B 快照测试)。 +2. 读取失败不得让报告生成或聊天失败;不得在前端拿 `case_id` / `result_id` 直接查(服务端读,owner 校验)。 +3. 不改数据库结构;`npm run test:db` 若涉及新查询路径须真查(AGENTS §7.6;无 Docker 时写环境缺口并给产品本地清单)。 +4. Python 侧若需接收新字段(`professional_report_reference`),只加可选参数、不改既有输出;`run_quality_gate.py --profile quick` 与基线逐条一致;`jyotish_api_server.py` 不增长。 +5. 前端:tsc 0、lint 0 error、npm test 失败清单与基线逐名一致且名单 0 丢失、`/` Static、首屏 gzip ±2%。 +6. 隐私:fixture 只用公开名人或虚构盘;报告提示文案不含任何内部 id。 + +## 任务分解 + +- **T1 服务端读取 helper(BUG-1138)**:`lib/rectification-adopted-chart-tiers.ts`(命名可调):输入服务端资料行,输出 `{ unreliable: ("D9"|"D10"|"D1")[], source: "segment-v1" } | null`;owner 校验;单测覆盖 segment-v1 / 旧采用 / 未校正 / 结果缺失 / summary 损坏五种。 +- **T2 聊天接入(BUG-1138)**:在 `consultation-route-service.ts` 读资料处调用 T1,经 `consultation-birth-time-mode.ts` 写入 `answer_policy` 与 `birth_time_notice`;提示文本在 birth-time-mode 常量处新增,不改 `consult/route.ts`。验收:虚构 segment-v1 资料(D9 blocked)问婚恋 → 上下文含不可判 D9 与提示;旧资料上下文快照不变。 +- **T3 报告接入(BUG-1139)**:经 `resolveReportBirthTimeSensitivityInput` / `personal-report-longform-birth.ts` 传 `unreliable_vargas`;章节级提示与主题降级按 D3。验收:虚构 segment-v1 资料生成报告,D9 / D10 相关章节顶部有提示、图表仍在;旧资料载荷逐字节不变;长报告 Python 侧(如需)只加可选字段。 +- **T4 记录**:`docs/BUG_HISTORY.md`(BUG-1138~1139)、`CHANGELOG.md`、`frontend/docs/VOICE.md`(提示句)、`frontend/DESIGN.md`(报告章节提示样式)、`docs/testing/rectification-chart-tier-caveats-20261001.md` 真机清单(±60 窗口校正并采用 → 聊天问婚恋 → 看到一句说明;生成报告 → D9 章节有提示)、`docs/tasks/PROGRESS-rectification-chart-tier-caveats-20261001.md`、`docs/tasks/README.md`。 + +## 让步顺序 + +T1 > T2 > T3 > T4 之外的截图。T1 + T2 可先合入;T3 若涉及 Python 长报告改动较大,可拆后续单并在 PROGRESS 写明。 + +## 开工前置命令 + +```bash +git fetch origin --prune +export PATH=/exec-daemon:$PATH && node -v # 22.x +git worktree add -b codex/rectification-chart-tier-caveats-20261001 .worktrees/rectification-chart-tier-caveats-20261001 origin/staging +cd .worktrees/rectification-chart-tier-caveats-20261001/frontend && npm ci +./node_modules/.bin/tsc --noEmit && npm run lint +npm test 2>&1 | grep -E "^(not )?ok [0-9]+ - " | sed -E 's/^(not )?ok [0-9]+ - //' | sort > /tmp/tier-caveat-names-base.txt +cd .. && PYTHONHASHSEED=0 python3 scripts/run_quality_gate.py --profile quick 2>&1 | tail -5 +``` + +## BUG 编号 + +开工时核对 `docs/BUG_HISTORY.md` 最大号(写作时 `BUG-1131`;`1132`~`1134` 被 consult-plain-answer 预留,`1135`~`1137` 被 message-cleanup 预留)。本单:**BUG-1138**(聊天不读分盘可判性)、**BUG-1139**(报告不读分盘可判性)。号冲突顺延。关联 BUG-1115~1117、BUG-1131、BUG-690。 diff --git a/docs/tasks/TASK-rectification-message-cleanup-20261001.md b/docs/tasks/TASK-rectification-message-cleanup-20261001.md new file mode 100644 index 00000000..c30a5a99 --- /dev/null +++ b/docs/tasks/TASK-rectification-message-cleanup-20261001.md @@ -0,0 +1,93 @@ +# TASK · 生时校正消息清理:题干只出现一次 / 正文复述变短 / 去掉结算后的步骤回执(2026-10-01) + +## 基线 + +- `origin/staging` @ `00420f89`(写作时 head;开工时以最新 `origin/staging` 为准)。盘型口径(BUG-1115~1117、1131)已在其中。 +- 分支 `codex/rectification-message-cleanup-20261001`,工作树 `.worktrees/rectification-message-cleanup-20261001`。 +- **并行关系**:与 `TASK-rectification-chart-tier-caveats-20261001.md`(报告 / 聊天标注不可判分盘)文件不重叠,可并行;两单都会追加 `docs/BUG_HISTORY.md`、`CHANGELOG.md`、`frontend/DESIGN.md`,后合入者解冲突保留两侧。与 `TASK-consult-plain-answer-20261001.md` 不重叠。 +- 不动冻结计分文件(`sealed_holdout_rerun.py::PRODUCTION_FILES`)、引擎、出题、出卡时机、盘型交付逻辑。 + +## 事故实证 + +产品负责人 2026-09-29 staging 真机,一条校正回复呈现为: + +``` +已完成 3 步 +1. +记下了:2000年 随家人搬家、2006年 小学毕业、…、2025-02 工作开始不稳定。 +2024 年 1 月前后,你有过搬家或者长期住到外地的情况吗? +2024 年 1 月前后,你有过搬家或者长期住到外地的情况吗? +A. 明确发生且时间吻合 B. 发生过但程度较弱 C. 明确没有发生 D. 这段记不清楚 +``` + +2026-10-01 产品追问「为什么 Agent 输出下面要跟一个问题,这一部分怎么优化」。Claude 只读调研(`origin/staging` @ `a8820f2c`): + +| 块 | 渲染位置 | +| --- | --- | +| 步骤回执「已完成 N 步」 | `components/chat-message-row.tsx`(rectification 分支)→ `ConsultationRunTimeline`(`components/consultation-run-timeline.tsx` 的 `已完成 ${rows.length} 步`),行来自 `rectification-message-entry.tsx::rectificationTimelineRows` | +| 正文 | `ChatMessageContent`(`chat-message-row.tsx`) | +| 题干 | `rectification-message-entry.tsx` 的 `
{question.prompt}
`——**只要 `question` 存在且消息已结算就打印,即使嵌入卡为 null(作废 / 被替换的旧题)** | +| 选项 | `components/rectification-choice-card.tsx`(legend 是 sr-only,不另显示题目) | +| 独立问题块 | `components/rectification-question-gap-notices.tsx` 两处打印 `currentQuestion.prompt` + 嵌入卡 | + +题干可见位置共三处:正文(未剥净时)、消息内题干、独立问题块。 + +## 根因 + +1. **题干两遍(主因,待执行方 DOM 复现确认)**:最新消息挂着一道已作废 / 被替换的旧焦点,题干文字与新焦点相同。`rectification-message-entry.tsx` 对它仍打印题干(BUG-917 路径,无选项);`rectification-snapshot-messages.ts::placePersistedQuestion` 因焦点 id 不同把新题设为 `standalone`,`rectification-question-gap-notices.tsx` 再打印一次题干 + 选项 → 「题干、题干、选项」。`turn-question.ts::attachQuestionsToTurns` 同一轮多个焦点只保留最后一个,是可能的诱因。 +2. **次因(同时防住)**:`placePersistedQuestion` 把问题挂到最新已结算消息时**不剥正文里的题干**;正文剥离只在 `agent-run-attempt.ts`(焦点已绑本轮时)、`turn-question.ts`(GET)、`rectification-snapshot-messages.ts::mergeTurnQuestions`(turnId 命中时)三条路径做。 +3. **正文过长**:证据轮正文按提示要求逐条复述「记下了:年 月 事件、…」,开场一次说 12 件时整段占满屏幕,题目被挤到下面。 +4. **结算后步骤回执**:记录经历、重打分、出题是系统内部步骤,结算后折叠的「已完成 N 步」对用户无信息量;「1.」疑为列表序号泄漏(`globals.css` 已 `list-style: none`,需执行方定位)。 + +## 决策记录(产品 2026-10-01) + +- **D1 一屏一题干**:任一时刻屏幕上只有**当前有效焦点**打印题干;作废 / 被替换的旧焦点在消息上**什么都不显示**(不留半句题干,不显示「已作废」)。题干只能出现一次(`DESIGN.md` 现有规则不变,本单补代码守卫)。 + - **推翻**:BUG-917 中「作废题保留题干、去掉选项」的显示方式;执行方在该条防复发下追加「2026-10-01 产品修订:见本任务书 D1」,不删原文。 +- **D2 正文复述变短**:证据轮正文只说「记下了 N 件事」(N = 本轮实际入账件数);入账清单作为可展开的列表,**数据来自服务端证据记录**,不来自模型正文。N ≤ 2 时可直接列出两件,不折叠。 + - 推翻 `frontend/docs/VOICE.md` 与 Agent 提示中「证据轮正文只写一句复述『记下了:年 月 事件短语(、…)。』」的逐条复述要求,改为本条。 +- **D3 校正回复结算后不再显示「已完成 N 步」**:生成中的步骤进度(等待态)保留不变;结算后整块不渲染。只作用于生时校正,普通对话不变。 + - 推翻 `DESIGN.md` 中校正与普通对话「共享全部等待词汇」里**结算后回执**这一项;等待态共享不变。 +- **不做**:不改选项、不改题干写法(仍由 Agent 经 set-focus 写、服务端核对)、不改出题与计分、不改盘型交付卡。 + +## 硬红线 + +1. 不得再出现第二个问题渲染位置;不得手写第二个聊天输入框 / 滚动跟随 / 加载动画(AGENTS §6)。 +2. 刷新、历史打开、实时三条路径(实时流式、GET 重建、快照合并)都满足 D1;旧 Case(盘型口径之前、旧 Skill 版本)打开不报错、不丢选项(BUG-621)。 +3. 前端:tsc 0、lint 0 error、npm test 失败清单与开工基线逐名一致且基线测试名 0 丢失(按 `frontend/AGENTS.md` 的名单 diff)、`/` Static、首屏 gzip ±2%。 +4. 改既有断言写「原值 / 新值 / 原因」;按源码文本断言的合同测试先 grep(`frontend/tests/`、`tests/`)。 +5. Agent 提示改动按 CHANGELOG 规则记录;若改到 Skill 文本须 bump 并验证历史 Case 可打开。 +6. 隐私:测试 fixture 只用虚构数据;Bug 历史不写真机事件内容。 + +## 任务分解 + +- **T1 一屏一题干(BUG-1135)** + - 先写失败测试复现两种形状:(a) 最新消息带作废旧焦点 + 独立问题块的新焦点、题干文字相同 → 页面题干出现 2 次;(b) 正文末尾含题干句 + `placePersistedQuestion` 挂题 → 题干出现 2 次。DOM 级(渲染后数 `rectification-message-question__prompt` 与 `persisted-question` 中题干文本出现次数),不只断言数据结构。 + - 修:`rectification-message-entry.tsx` 只为当前有效焦点打印题干;`placePersistedQuestion` 挂题时同样剥正文题干句(复用 `collect-prompt.ts::stripQuestionSentences`,不新写正则);查清 `attachQuestionsToTurns` 同轮多焦点是否会让旧焦点落到最新消息,必要时只挂有效焦点。 + - 验收:(a)(b) 先红后绿;实时 / GET / 快照三路径表驱动断言「题干恰好 1 次」;BUG-917、BUG-1045、BUG-1046 的既有测试不放宽。 +- **T2 正文复述变短(BUG-1136)** + - 服务端:证据轮正文改为确定性的「记下了 N 件事」,N 与清单来自本轮入账证据(`agentic_rectification_evidence` 读模型 / 现有 dossier 投影),模型不再写复述;Agent 提示相应删去逐条复述要求。 + - 前端:清单作为该消息内可展开列表(默认折叠,N ≤ 2 直接显示),展开交互不新增加载动画。 + - 验收:一次说 12 件 → 正文一行 + 折叠清单 12 条,日期与精度显示与 `display_date_label` 一致;0 件入账(全被拒)时正文说明而非「记下了 0 件」;`VOICE.md` / `DESIGN.md` 同提交更新。 +- **T3 结算后不显示步骤回执 + 「1.」泄漏(BUG-1137)** + - 校正消息结算后不渲染 `ConsultationRunTimeline`;生成中保留。定位截图中「1.」来源并修。 + - 验收:结算 / 刷新 / 历史打开均无「已完成 N 步」;生成中步骤进度照常;普通对话回执不变(测试锁定)。 +- **T4 记录**:`docs/BUG_HISTORY.md`(BUG-1135~1137,检索 BUG-585 / 917 / 1045 / 1046 并在 1135 写「复发自」关联及旧防线为何未拦住)、`CHANGELOG.md`、`frontend/DESIGN.md`、`frontend/docs/VOICE.md`、`docs/testing/rectification-message-cleanup-20261001.md` 真机清单(开场一次说 10 件以上;答一题后出下一题;刷新;打开旧 Case)、`docs/tasks/PROGRESS-rectification-message-cleanup-20261001.md`、`docs/tasks/README.md`。 + +## 让步顺序 + +T1 > T3 > T2 > T4 之外的截图。T1 缺之不可合入。 + +## 开工前置命令 + +```bash +git fetch origin --prune +export PATH=/exec-daemon:$PATH && node -v # 22.x +git worktree add -b codex/rectification-message-cleanup-20261001 .worktrees/rectification-message-cleanup-20261001 origin/staging +cd .worktrees/rectification-message-cleanup-20261001/frontend && npm ci +./node_modules/.bin/tsc --noEmit && npm run lint +npm test 2>&1 | grep -E "^(not )?ok [0-9]+ - " | sed -E 's/^(not )?ok [0-9]+ - //' | sort > /tmp/msg-cleanup-names-base.txt +``` + +## BUG 编号 + +开工时核对 `docs/BUG_HISTORY.md` 最大号(写作时 `BUG-1131`;`1132`~`1134` 已被 `TASK-consult-plain-answer-20261001.md` 预留)。本单:**BUG-1135**(题干两遍)、**BUG-1136**(证据轮正文逐条复述过长)、**BUG-1137**(结算后步骤回执与「1.」泄漏)。号冲突顺延并在 PROGRESS 说明。关联 BUG-585、BUG-917、BUG-1045、BUG-1046、BUG-621。