Files
Jyotisha/docs/tasks/PROGRESS-report-chart-cap-20260904.md
T
Jesse_Chen a75929c139
Independent Staging Quality Gate / validate (push) Successful in 12m42s
Independent Staging Quality Gate / publish (push) Successful in 1m56s
fix(report): keep actionNotes within the document cap at assemble
Five-theme personal_full still failed final parse after the charts cap
fix because writer output exceeded actionNotes.max(24). Truncate at
assemble; do not raise the schema cap.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-04 22:22:38 +08:00

4.5 KiB
Raw Blame History

PROGRESS · BUG-535 文档 charts 上限绑定 CHART_IDS2026-09-04

工作树:/Users/jesse/Downloads/Copse/astrology/.worktrees/report-chart-cap-20260904 分支:codex/report-chart-cap-20260904 基线:任务书写 e674cd38;开工 origin/staging HEAD 为 d2955c62(含本任务书 40387ff9)。 任务书:仓库根 TASK-report-chart-cap-20260904.md 未改 .gitea/workflows/**,不提升 main,未放宽字段级校验,未改 v1 charts.max(3)

任务 状态 BUG
1 上限绑定 + 消费点核对 + 回归 完成 BUG-535
2 终稿 parse path 日志 完成 BUG-535
3 部署后真实 personal_full 进行中:第一次仍失败;parsePaths 指出 actionNotes.too_big,装配已按合同上限截断,待再部署 BUG-535

实现要点

  • v2 文档 charts.max(CHART_IDS.length),单一真源,不写裸数字 9。
  • 装配侧 assembleReportDocumentV2 的允许分盘集合改为 new Set(CHART_IDS)DOCUMENT_VARGA_CHART_IDSCHART_IDS 去掉 D1 派生。
  • 装配把 actionNotes 截到 REPORT_DOCUMENT_V2_ACTION_NOTES_MAX24),不放宽 schema。staging 第一次五章写完后又 final_parse_rejectedparsePaths 只有 actionNotes/too_big
  • 终稿 safeParseServerReportDocument 失败时,generation_failed 增加 parsePaths: [{path, code}]。只记路径与 zod/guard 代号,不记 message、不记正文或 hash 值。
  • JSON Schema maxItems / chart enum、Python CHART_IDSlen(CHART_IDS) 与 TS 对齐(合同三份真源)。冻结 skill 包 6.9.14 / 6.9.15 未动。

消费点核对(红线 3

结论
personal-report-contract.ts z.enum(CHART_IDS) + charts.max 上限已绑定 CHART_IDS.length;枚举本来就是 9 个
REQUIRED_THEME_CHARTS 按主题要哪些分盘,不是张数上限;未改
personal-report-generation.ts DOCUMENT_VARGA_CHART_IDS 已改为从 CHART_IDS 去掉 D1
同文件装配 Set([...]) 已改为 Set(CHART_IDS)
canonicalDocumentVargaChartId 正则 引擎别名提取,不是计数上限;当前覆盖 D2/D6/D8/D9/D10/D11/D24/D30
report-evidence-bundle-v2.ts charts.max(24) bundle 上限 24,大于文档 9,无脱节
personal-report-document-view.tsx 按数组渲染,无硬编码 6
personal-report-route-core.ts themes.max(6) 主题数不是分盘数
report-theme-evidence-plan.ts health chartIds 证据计划,不是文档张数
contracts/personal-report/report-document.v2.schema.json maxItems: 6 且 enum 缺 D6/D8/D30;已对齐,测试锁 maxItems === CHART_IDS.length
scripts/personal_report_contract.py 原 enum 6 个、硬编码 else 6;已 len(CHART_IDS) 且补 D6/D8/D30
skills/.../6.9.146.9.15 的合同副本 冻结包,仍是历史 v1 三盘;未改

测试

  • 9 张全枚举文档过 safeParseServerReportDocument
  • 超过 CHART_IDS.lengthtoo_big
  • 四主题既有用例不回归
  • 五主题(含 health)分章管线 READY,文档 charts 正好 9 张、blocked 为空
  • 五主题每章 6 条行动仍 READYactionNotes.length === 24
  • final_parse_rejected 日志含 thematicNarrative.0.title / too_big,不含超长标题正文
  • Python test_v2_accepts_full_chart_ids_set

门禁输出

  • ./node_modules/.bin/tsc --noEmit0
  • npm run lint0 error / 74 warning(既有,未动)
  • 定向:personal-report-contract + personal-report-generation-v2 + personal-report-api110 pass / 0 fail(含新增 9 图 parse、五主题 READY、超限 too_big、parsePaths 日志)
  • .venv/bin/python -m pytest tests/test_personal_report_contract.py40 pass(含 test_v2_accepts_full_chart_ids_set
  • 定向补跑 generation-v2 + contract56 pass(含 actionNotes 截断)
  • 全量 npm testDocker 库测争用超时(database-* 与部分会起 Postgres 的套件),与既有环境缺口同类;与本单无关
  • next build:本单未改 UI/路由,未跑

任务 3 第一次(health d4627a50,含 61194690

request 31025c495× consultation_workflow 200;五章 ready;摘要 stop。终稿仍 final_parse_rejected。日志 parsePaths: [{path:"actionNotes", code:"too_big"}]——charts 上限已不是这条失败原因。未放宽 actionNotes.max(24),装配截断到该上限后再验。

让步

无。JSON Schema 的 charts maxItems 只能写数字,用合同测试把它锁到 CHART_IDS.lengthactionNotes 合同上限未放宽。