feat: add persistent personal report document v2
This commit is contained in:
+3
-3
@@ -3192,8 +3192,8 @@
|
||||
- 用户现象:完整报告即使请求多个主题也只执行一次 `general`,专题报告只使用首个主题;写作 Agent 只能获得缺少 Claim Card、Blocked Section 和执行账本的 `ReportEvidencePacket v1`,因此内容短、主题证据不足,且 accepted 时间曾通过零宽候选区间表达。
|
||||
- 触发条件:创建包含多个 requested themes 的 `personal_full` 报告;请求 wealth 等需要专题分盘/技法但证据未闭合的报告;或使用 accepted 出生时间生成报告。
|
||||
- 根因:报告路由把所有完整报告折叠到单次 `general` workflow,旧 packet 仅提供窄化盘面与技法状态,没有服务器持有的主题 Claim Graph、最低证据计划、blocked coverage、execution receipt 与规范化 hash;Agent 又被禁止自行推算未提供事实。
|
||||
- 修复:新增 `ReportEvidenceBundle v2`、主题最低证据计划、规范化 hash 与强引用校验;路由按 requested themes 分别运行 workflow,并把缺失专题证据表示为 Blocked Section,而不是伪造已执行技法或让部分 blocked 主题拖垮整份报告。Agent 仅接收安全投影后的 Bundle;服务器继续通过兼容层组装现有 ReportDocument v1。accepted 状态改为 `accepted_directional_only`,Bundle 不生成 `candidateRange`;缺失 D2/D11 等证据只能生成 `blocked + executed=false` receipt。
|
||||
- 验证:个人报告 API/生成聚焦回归 77 passed、0 failed,覆盖多主题运行、每主题 Claim Card/Blocked Section、部分 blocked 仍 ready、引用闭合、consensus 降级、accepted 无假 candidate range、wealth 缺 D2/D11 不得升级、Bundle hash 稳定、直接恶意 Bundle 自由文本绕过被拒绝与敏感信息不泄露;目标 ESLint 0 error/0 warning,`git diff --check` 通过。全库 `tsc --noEmit` 仅剩 5 个既有无关测试错误:`production-data-migration.test.ts` 两处 fixture 字段缺失、`staging-backend-workflows.test.ts` 三处低 target 正则 flag。
|
||||
- 防复发:每个 requested theme 必须且只能由 Claim Card 或 Blocked Section 覆盖;未执行或 blocked/partial 技法不得升级为 verified/consensus;Agent 不得接收 raw workflow、坐标、内部路径、secret、聊天历史或工具轨迹;Bundle hash 必须由服务器对规范化且排除自身 hash 的内容计算。
|
||||
- 修复:新增 `ReportEvidenceBundle v2`、主题最低证据计划、规范化 hash 与强引用校验;路由按 requested themes 分别运行 workflow,并把缺失专题证据表示为 Blocked Section,而不是伪造已执行技法或让部分 blocked 主题拖垮整份报告。服务器从 Bundle 生成确定性的 section plan,writer 只能填写计划允许且引用闭合的章节,再由服务器 guard 规范化为 `ReportDocument v2`;新建报告固定写入 v2,读取端保持 v1/v2 双读。生产创建路径不再依赖 Next.js `after()`,改为由数据库原子创建的持久化 job 与 lease worker 执行,覆盖 heartbeat、bounded retry、historical generating backfill、expired-lease recovery、幂等 request identity 和进程重启续跑;job migration 使用唯一版本 `20260814040000`。ready 与 failed 两种终态都通过 exact-live-lease RPC 在同一事务更新 report/job,且 complete/fail 在取得 job 行锁后才读取 lease 校验时间;final-attempt lease 过期会原子收敛为 `report=failed/job=failed` 并释放用户生成槽位。`scheduleRetry()` 耗尽预算时保留 live lease 交给失败 RPC 收敛;若 report 已 ready 而 job ready 对账遇到临时存储错误,则返回 `reconcile_deferred` 并保持 report ready、job running,绝不把 ready 报告降级为 failed。authenticated 对 job 保持 select-only,完成 RPC 仅授予 `service_role`;writer 与单次 repair retry 均接收 worker AbortSignal。accepted 状态改为 `accepted_directional_only`,Bundle 不生成 `candidateRange`;缺失 D2/D11 等证据只能生成 `blocked + executed=false` receipt。Web renderer 继续只消费结构化文档和真实 chart data,并使用浏览器原生打印,不接受模型生成 HTML/CSS/SVG。
|
||||
- 验证:个人报告合同、planner/writer、API、entry、job state/service/worker、renderer/export、migration 与 Skill registry 完整聚焦回归 247 passed、0 failed;Python 报告合同与 Skill package 41 passed、0 failed;目标 ESLint 0 error/0 warning,`git diff --check` 通过。真实本地 PostgreSQL 已成功应用两个 PR-6 migration,聚焦 smoke 1 passed、0 failed,覆盖 historical generating backfill、authenticated owner 删除拒绝、错误 lease 对 ready/failed 均不写入、正确 lease 原子完成 ready/failed、final-attempt 历史 ready/job-running split recovery、final-attempt generating/running 原子 failed/failed,以及失败后可创建新的 generating/queued 报告。migration 唯一性检查只剩基础分支既有的 `20260806010000_admin_rbac.sql` / `20260806010000_personal_reports.sql` 冲突;全库数据库业务测试仍在既有 Rectification V10 场景因 `service_role` 无权执行 `accept_agentic_rectification_candidate` 失败,该权限问题不属于本条报告修复。全库 `tsc --noEmit` 仅剩 5 个既有无关测试错误:`production-data-migration.test.ts` 两处 fixture 字段缺失、`staging-backend-workflows.test.ts` 三处低 target 正则 flag。pre-work 仅剩既有 fragment candidate 计数断言 `4 >= 0 + 23` 失败。
|
||||
- 防复发:每个 requested theme 必须且只能由 Claim Card 或 Blocked Section 覆盖;未执行或 blocked/partial 技法不得升级为 verified/consensus;Agent 不得接收 raw workflow、坐标、内部路径、secret、聊天历史或工具轨迹;Bundle hash 必须由服务器对规范化且排除自身 hash 的内容计算。报告文档、job 状态和日志不得写入用户资料、密钥、内部 URL 或模型自由生成的 HTML/CSS/SVG;不得把本地测试结果虚构为 staging 或生产验收。
|
||||
- 相关记录:BUG-152、BUG-159
|
||||
- 修复版本:本次功能分支提交(精确 SHA 以提交与远程分支核对结果为准;未合并 staging,未部署)
|
||||
|
||||
Reference in New Issue
Block a user