Merge remote-tracking branch 'origin/staging' into codex/consult-career-yoga-functional-20261002
Independent Staging Quality Gate / validate (push) Successful in 15m8s
Independent Staging Quality Gate / publish (push) Successful in 3m37s

# Conflicts:
#	CHANGELOG.md
#	docs/BUG_HISTORY.md
This commit is contained in:
Jesse_Chen
2026-10-02 10:11:46 +08:00
18 changed files with 440 additions and 27 deletions
+31
View File
@@ -15842,3 +15842,34 @@
- 相关记录:BUG-1164、BUG-1132
- 复发自:无
- 修复版本:`codex/consult-career-yoga-functional-20261002`
## BUG-1178 | 一件未来日期或「今年」的经历让之后每次重新比较都失败,校正一直追问、不出时间卡
- 状态:resolved(2026-10-02 Claude 直接执行;真引擎 + 真库验证)
- 首次发现 / 最近更新:2026-10-02 / 2026-10-02
- 影响面:`v9/engine-client.ts::engineRequestBody`(score / diagnostics / block_scan / vedastro-validate 共用)、`mastra/rectification-v9-tools.ts`(record-evidence-batch、propose-evidence)、`v9/agent-run-support.ts` / `agent-run-attempt.ts` / `host-fallback.ts`(回复补句)、`user-copy.ts`。所有生时校正用户。
- 用户现象(staging 真机测试者):第一件经历把年份打成「2028 年借出一笔钱」,之后每轮回复都是「记下了:…这次没有重新比较,稍后再比一次。」,范围不动、不出时间卡,测试者「都不想回答了」。
- 触发条件:账本里有任何一件开始日期晚于今天的经历;或任何「今年 / 这个月」的经历(年 / 月精度的结束日 12-31 / 月底晚于今天);或完全在出生前的经历。
- 根因:引擎 `scripts/rectification/contracts.py` 要求每件经历的日期都在 [出生日, 今天] 内,否则整个请求 400(`events[i] dates must be between birth_date and today`)。前端证据入口与数据库都不校验日期上限,未来年份照常记下且确认;之后每次重算都把它带上,整次失败,回复走 rescoreSkipped 文案。本机真引擎实测:2028 年、今年(年精度)、本月(月精度)都 400,去年 200。
- 修复:(1) `boundEngineEventDates`:发给引擎前丢掉开始晚于上限(UTC 昨天,避免两端时钟差)或结束早于出生日的经历,其余裁进窗口;全部被丢则按既有 `no_scorable_evidence` 处理。已在账本里的未来经历不再挡住比较,该测试者的 Case 下一轮即可恢复。(2) 入口:record-evidence-batch 与 propose-evidence 对开始日期晚于今天(UTC)的项不写库,返回 `future_date`;回复由服务端追加「有一件事的日期在今天之后,这件先不算;如果年份打错了,直接告诉我正确的年份就行。」(3) 顺带修 batch 结果编号:已写入行的 `index` 改为模型原始条目序号(此前是写入序号,被拒条目在前时「记下了」复述会读错位置)。
- 验证:`frontend/tests/rectification-event-date-bounds-20261002.test.ts`(裁剪六种日期、请求体只带裁剪后事件且全部被丢时报 no_scorable_evidence、入口判定、batch 中 2099 项不写库且其余条目序号与复述正确、回复补句只出现一次;去掉裁剪时请求体用例红)。真引擎 + 本机 PG17:虚构案例账本中加入 2028 年与今年的经历后重算成功(修前引擎 400)。
- 防复发:任何发给引擎的事件都经 `engineRequestBody`;新增事件入口须做日期上限校验。旧版 `mastra/rectification-tools.ts`(仅 legacy session 引用)未改,记入进度。
- 相关记录:BUG-1084(打字事件不计分研究)、BUG-1179。
- 复发自:无
- 修复版本:`codex/rectification-post-adopt-verify-20261001`。
## BUG-1179 | 用户说「刚才年份打错了」改不了:更正工具要求问题焦点,Agent 也拿不到经历编号
- 状态:resolved(2026-10-02 Claude 直接执行;产品 10-02 选 A;真库验证;真实模型调用为环境缺口)
- 首次发现 / 最近更新:2026-10-02 / 2026-10-02
- 影响面:`mastra/rectification-v9-tools.ts::rectification-revise-evidence`、`v9/turn-decision.ts`(`relevant_evidence_summary`)、`mastra/agentic-rectification.ts`(提示规则)。
- 用户现象:测试者问「回答错了这个能返回吗」,产品答「目前不能」。实际上已有 `rectification-revise-evidence`,但用不上。
- 根因:(1) 工具 schema 强制 `focusId`,而随口更正一件打字经历时没有对应的问题焦点;(2) 修订后的新记录是 pending,要第二次调用确认才生效、才重算;(3) Agent 的经历摘要不带 `evidence_id`,无从指定改哪条;(4) 提示词没有「更正走修订、不要新记一条」的规则。
- 决策记录:产品 10-02 选 A——先做「改经历」:用户说出正确年份即改正并重新比较;「撤回上一道选择题」不做(选项 B 未选)。推翻 08-14 v10 运行时「修订必须绑定问题焦点」的约束,改由「quote 必须落在本轮用户原话里」(与新事件同一校验)保证改动来自用户本人。
- 修复:`focusId` 改为可选;有焦点走 `revise_..._v10`,无焦点走 `revise_agentic_rectification_evidence`(真库确认 service_role 可调用);随后在同一调用里 `confirm_..._v10` 确认新修订并重算,返回 rescore / range_after_rescore;quote 未落在本轮用户消息里→`quote_mismatch` 不写;更正后的日期仍在未来→`future_date` 不写。经历摘要带 `evidence_id` 并排除已被替代的记录;提示规则:用户更正之前说过的事走修订工具。
- 验证:`frontend/tests/rectification-v9-evidence.test.ts` 新增「无焦点更正:修订→确认、未落原话不写、未来日期不写」;三条既有合同用例按三栏改写(schema 允许省略 focusId 但仍须 evidenceId;修订后多一次确认)。本机 PG17:无焦点修订 + 确认后旧记录 superseded、新记录 confirmed。真实模型是否按新规则调用修订工具:本机无模型凭据,留待 staging 真机(`docs/testing/rectification-event-dates-20261002.md`)。
- 防复发:经历的任何改动必须带本轮用户原话;修订后立即生效,不得停在 pending 等第二次调用。
- 相关记录:BUG-1178。
- 复发自:无
- 修复版本:`codex/rectification-post-adopt-verify-20261001`。
@@ -0,0 +1,33 @@
# PROGRESS:经历日期越界卡死比较 + 更正经历(2026-10-02,BUG-1178~1179)
- 模式:直接执行(产品 10-02「两条修法需要修,改错选 A」)。
- 基线:`origin/staging` `8e978cab`;分支 `codex/rectification-post-adopt-verify-20261001`。
- BUG 编号:staging 任务书已预留 1174~1177(普通对话),本单用 1178~1179。
## 实证
staging 真机测试者:「2028 年借出一笔钱」(年份打错)后每轮「这次没有重新比较」,不出卡。本机真引擎同一请求:
| 追加的经历 | 引擎 |
| --- | --- |
| 2028 年(未来) | 400 `events[7] dates must be between birth_date and today` |
| 今年(年精度,止于 12-31) | 400 |
| 本月(月精度,止于月底) | 400 |
| 去年 | 200 |
## 改动
| 位置 | 改动 |
| --- | --- |
| `engine-client.ts` | `boundEngineEventDates`:发引擎前丢未来 / 出生前事件,裁剪越界日期(上限 UTC 昨天) |
| `rectification-v9-tools.ts` | batch / propose 拒收未来日期(`future_date`,不写库);batch 已写行 `index` 改用原始条目序号,复述按写入行读取;revise 工具 focus 可选、quote 须落本轮原话、修订后立即确认并重算 |
| `agent-run-*` / `host-fallback.ts` / `user-copy.ts` | 未来日期时服务端追加一句 |
| `turn-decision.ts` | 经历摘要带 `evidence_id`,排除 superseded |
| `agentic-rectification.ts` | 提示:用户更正走 revise-evidence |
## 验证
- 新测试 `rectification-event-date-bounds-20261002.test.ts` 5 条;`rectification-v9-evidence` 新增无焦点更正用例;三条合同用例三栏改写。
- 真库 + 真引擎:虚构案例账本加 2028 与今年经历后重算成功;无焦点修订 + 确认后旧记录 superseded。
- 环境缺口:真实模型是否按新提示调用修订工具,本机无模型凭据,见真机清单。
- 未改:`mastra/rectification-tools.ts`(仅旧版 `session.ts` 引用,非当前产品路径)同样直接发事件给引擎。
+1
View File
@@ -266,6 +266,7 @@
| `TASK-rectification-angle-timing-research-20261001.md` | `PROGRESS-rectification-angle-timing-research-20261001.md` | **角度类时间技法研究(离线)**:行运土木罗压本命上升 / 天顶度数、次限推运角、太阳弧角(1° ≈ 4 分钟出生时间),77 例 v5;乱序日期对照 ≥ 50 次必做、留一法、不得挤出真值;显著才叠加到六题后验比头段命中与区间宽度 | 已实现待验收(0/9 预登记检验显著,BUG-1141 closed_by_design;分支 codex/rectification-angle-timing-research-20261001,未推送) | BUG-1141 |
| (直接执行,无任务书) | `PROGRESS-rectification-segment-order-20261001.md` | **健康区分题写入失败(BUG-1143)+ 按盘型挑题默认开启(BUG-1144)**:区分类焦点把 `health_pressure` 原样写入、违反表约束、写入被吞后提前交付(BUG-672 同族);修后 77 例真库回放平均问题数 ±10 2.8→4.6、±30 3.6→5.4,D10 头段 ±30 39→52;按段选题 ≤61 分钟默认开,±30 D9 46→51、D10 52→55,真值段 76/76 | 已验收(Claude 10-01 直接执行) | 分支 codex/rectification-segment-order-20261001 |
| (直接执行,无任务书) | `PROGRESS-rectification-post-adopt-card-20261001.md` | **采用后核对题无按钮(BUG-1146)+ 盘型口径回复念分钟排名(BUG-1147)**:keep 分支丢探针身份致 GET 空卡(BUG-498 复发);采用接口不写轮次、只读运行被 60 秒交付窗口挡掉,题挂到上一题回复下;改为采用接口写「已采用 HH:MM。再核对一件过去的事。」轮次并挂题。盘型口径下去掉「领先 / 落后」、交付旁白不再说「分不开」、边界句只说一次 | 已验收(Claude 10-01 直接执行);真机回报后补修 BUG-1149(请求号非 uuid 被真库拒写)、BUG-1150(核对题作答 stale_probe),本机真库重放通过;BUG-1151 盘型报告去分钟排名(产品选 A);BUG-1153 交付正文连出两条(BUG-1149 引入的回归);BUG-1172 核对题答完说对不对得上(产品选 A);BUG-1173 盘型变化时说清并给「改用」(产品选 A);真机清单 `docs/testing/rectification-post-adopt-card-20261001.md` | 分支 codex/rectification-post-adopt-verify-20261001 |
| (直接执行,无任务书) | `PROGRESS-rectification-event-dates-20261002.md` | **经历日期越界卡死比较(BUG-1178)+ 更正经历(BUG-1179,产品选 A)**:未来年份或「今年 / 本月」经历让引擎整单 400,之后每轮「没有重新比较」、不出卡;发引擎前裁剪日期、入口拒收未来日期并告知;revise 工具免焦点、立即确认重算、quote 须落本轮原话 | 已实现(Claude 10-02 直接执行;真引擎 + 真库验证;真实模型调用待真机) | 分支 codex/rectification-post-adopt-verify-20261001 |
| `TASK-rectification-typed-event-scoring-research-20260929.md` | `PROGRESS-rectification-typed-event-research-20260929.md` | **打字经历按选择题规则计分(离线研究,不上线)**:计分通道不对称 + 已入账年份挡题;R0 学业质量题措辞 / 年精度显示成 1 月(冻结文件,需重新冻结) | 已验收关单(Claude 10-01:三类技法 9 项检验 0 显著,真值平均排位 0.49~0.59;Claude 补正对照——埋入信号排位 0.077、挪年 0.502——流程有效;BUG-1141 closed_by_design) | 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`,真机欠 | — |
@@ -0,0 +1,11 @@
# 真机清单:经历日期越界 + 更正经历(2026-10-02,BUG-1178~1179)
> staging 部署后,用自己的账号走一遍,经历用虚构的即可。
1. **已卡住的校正**:打开之前一直「没有重新比较」的那次校正,再说一件带年月的事。回复不再出现「这次没有重新比较」,范围或盘型应有变化;问够后会出时间卡。
2. **未来年份**:新开一次校正,说「2028 年换了工作」。回复说「有一件事的日期在今天之后,这件先不算;如果年份打错了,直接告诉我正确的年份就行」,不说「记下了:2028…」。
3. **今年的事**:说「今年 3 月搬家」。回复正常记下,后面照常比较,不出现「这次没有重新比较」。
4. **更正**:先说「2015 年借出一笔钱」,下一句说「刚才年份打错了,是 2018 年」。回复说已改成 2018 年;不应多出一条新的 2018 年记录;随后照常比较。
5. **旧校正会话**:从会话列表打开一个以前的校正会话,能打开、不报错。
有任何一项不符,截图发给 Claude。