fix(report): name final-parse guards and scrub blocked wording
Five-theme assemble cleared the chart and actionNotes caps, then failed three anonymous guards. Log field path plus kind only, and strip deterministic phrases from sections the producer already marked blocked. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+2
-2
@@ -8270,8 +8270,8 @@
|
||||
- 用户现象:报告中心显示生成失败。错误码 `report_schema_invalid`,日志 `innerReason=final_parse_rejected`。五章其实都已写完。
|
||||
- 触发条件:accepted 生时、默认五主题、staging @ `e27d5dc5`。干净 attempt 1 与此前被租约打断后恢复的 attempt 都复现。
|
||||
- 根因:`c2f23131` 把 `CHART_IDS` 扩到 9 个(加 D6/D8/D30),文档 v2 仍 `charts.max(6)`。分盘提取修好后,五主题装配 9 张图,终稿 parse 拒绝。四主题一直 ≤6 所以从未踩中。
|
||||
- 修复:v2 `charts.max(CHART_IDS.length)`;JSON Schema / Python 合同同步;装配允许集改为 `CHART_IDS`。`final_parse_rejected` 日志增加 `parsePaths`(仅 path + code)。装配把 `actionNotes` 截到合同上限 24,不放宽 schema。
|
||||
- 验证:合同测试 9 图过 parse;五主题分章夹具 READY;每章 6 条行动仍 READY 且 notes=24。staging @ `d4627a50` request `31025c49`:五章 ready 后 `parsePaths=actionNotes/too_big`(charts 已不是原因)。截断修复待再部署。
|
||||
- 修复:v2 `charts.max(CHART_IDS.length)`;JSON Schema / Python 合同同步;装配允许集改为 `CHART_IDS`。`final_parse_rejected` 日志增加 `parsePaths`(仅 path + code)。装配把 `actionNotes` 截到合同上限 24,不放宽 schema。guard 失败改为字段路径 + 种类。blocked 段去掉确定性用语。
|
||||
- 验证:合同测试 9 图过 parse;五主题分章夹具 READY;每章 6 条行动仍 READY 且 notes=24。staging request `31025c49`:`actionNotes/too_big`。`a75929c1` request `f10daf6d`:三条匿名 guard。路径代号与 blocked 清洗待再部署。
|
||||
- 防复发:上限必须绑定 `CHART_IDS.length`,不得再写裸 6/9。扩枚举必须同时改 Zod / JSON Schema enum / Python `CHART_IDS`。终稿失败必须带 parse path。
|
||||
- 相关记录:BUG-526、BUG-534;引入半拉子改动的提交 `c2f23131`
|
||||
- 复发自:无
|
||||
|
||||
@@ -10,14 +10,15 @@
|
||||
| --- | --- | --- |
|
||||
| 1 上限绑定 + 消费点核对 + 回归 | 完成 | BUG-535 |
|
||||
| 2 终稿 parse path 日志 | 完成 | BUG-535 |
|
||||
| 3 部署后真实 personal_full | 进行中:第一次仍失败;parsePaths 指出 `actionNotes.too_big`,装配已按合同上限截断,待再部署 | BUG-535 |
|
||||
| 3 部署后真实 personal_full | 进行中:第二次 charts/actionNotes 已过;3 条匿名 guard。已补 guard 路径代号,并在降级段去掉确定性用语,待再部署 | BUG-535 |
|
||||
|
||||
## 实现要点
|
||||
|
||||
- v2 文档 `charts.max(CHART_IDS.length)`,单一真源,不写裸数字 9。
|
||||
- 装配侧 `assembleReportDocumentV2` 的允许分盘集合改为 `new Set(CHART_IDS)`;`DOCUMENT_VARGA_CHART_IDS` 从 `CHART_IDS` 去掉 `D1` 派生。
|
||||
- 装配把 `actionNotes` 截到 `REPORT_DOCUMENT_V2_ACTION_NOTES_MAX`(24),**不放宽** schema。staging 第一次五章写完后又 `final_parse_rejected`,`parsePaths` 只有 `actionNotes`/`too_big`。
|
||||
- 终稿 `safeParseServerReportDocument` 失败时,`generation_failed` 增加 `parsePaths: [{path, code}]`。只记路径与 zod/guard 代号,不记 `message`、不记正文或 hash 值。
|
||||
- 终稿 `safeParseServerReportDocument` 失败时,`generation_failed` 增加 `parsePaths: [{path, code}]`。只记路径与 zod/guard 代号,不记 `message`、不记正文或 hash 值。合同 guard 不再一律写成 `(guard)/guard`,而是字段路径 + 种类。
|
||||
- 装配后的 `applyReportGuard` 把章节标成 blocked 时,会去掉「一定会」这类确定性用语,并让 `currentPhase` 跟 timing 章一致。**不放宽** parse 侧字段校验。
|
||||
- JSON Schema `maxItems` / chart `enum`、Python `CHART_IDS` 与 `len(CHART_IDS)` 与 TS 对齐(合同三份真源)。冻结 skill 包 `6.9.14` / `6.9.15` 未动。
|
||||
|
||||
## 消费点核对(红线 3)
|
||||
@@ -45,6 +46,7 @@
|
||||
- 五主题(含 health)分章管线 READY,文档 charts 正好 9 张、blocked 为空
|
||||
- 五主题每章 6 条行动仍 READY,`actionNotes.length === 24`
|
||||
- `final_parse_rejected` 日志含 `thematicNarrative.0.title` / `too_big`,不含超长标题正文
|
||||
- guard 失败日志含字段路径与种类(如 `requestedThemes`/`theme_coverage`、`actionNotes[0].note`/`forbidden_medical_diagnosis`),不含违规正文
|
||||
- Python `test_v2_accepts_full_chart_ids_set`
|
||||
|
||||
## 门禁输出
|
||||
@@ -53,7 +55,7 @@
|
||||
- `npm run lint`:0 error / 74 warning(既有,未动)
|
||||
- 定向:`personal-report-contract` + `personal-report-generation-v2` + `personal-report-api`:**110 pass / 0 fail**(含新增 9 图 parse、五主题 READY、超限 too_big、parsePaths 日志)
|
||||
- `.venv/bin/python -m pytest tests/test_personal_report_contract.py`:**40 pass**(含 `test_v2_accepts_full_chart_ids_set`)
|
||||
- 定向补跑 generation-v2 + contract:**56 pass**(含 actionNotes 截断)
|
||||
- 定向补跑 contract + generation + generation-v2:**96 pass**(含 guard 路径代号、blocked 段去掉「一定会」)
|
||||
- 全量 `npm test`:Docker 库测争用超时(`database-*` 与部分会起 Postgres 的套件),与既有环境缺口同类;与本单无关
|
||||
- `next build`:本单未改 UI/路由,未跑
|
||||
|
||||
@@ -61,6 +63,10 @@
|
||||
|
||||
request `31025c49`:5× `consultation_workflow` 200;五章 ready;摘要 `stop`。终稿仍 `final_parse_rejected`。日志 `parsePaths: [{path:"actionNotes", code:"too_big"}]`——charts 上限已不是这条失败原因。未放宽 `actionNotes.max(24)`,装配截断到该上限后再验。
|
||||
|
||||
### 任务 3 第二次(health `a75929c1`)
|
||||
|
||||
request `f10daf6d`:五章 ready。终稿 `final_parse_rejected`,`parsePaths` 三条都是 `(guard)/guard`。charts 与 actionNotes 已过。日限默认 5 当天用满,staging 进程临时读 8(下次正式部署前 env 文件置回 8,验收后再恢复 5)。未放宽 schema。
|
||||
|
||||
## 让步
|
||||
|
||||
无。JSON Schema 的 charts `maxItems` 只能写数字,用合同测试把它锁到 `CHART_IDS.length`。`actionNotes` 合同上限未放宽。
|
||||
|
||||
Reference in New Issue
Block a user