diff --git a/.doc/archive/ops/2026-09-14-project143-controlled-content-404-diagnosis.md b/.doc/archive/ops/2026-09-14-project143-controlled-content-404-diagnosis.md new file mode 100644 index 00000000..71ae6c0a --- /dev/null +++ b/.doc/archive/ops/2026-09-14-project143-controlled-content-404-diagnosis.md @@ -0,0 +1,48 @@ +--- +title: "项目 143 受控文档正文 404 现场诊断" +status: done +created: 2026-09-14 +updated: 2026-09-14 +owner: Codex +branch: fix/project143-controlled-content-404-diagnosis +worktree: "-" +mutex: docgov-content-diagnosis +--- + +# 项目 143 受控文档正文 404 现场诊断 + +## 目标 + +定位已登录用户打开项目 143 时 `doc_proj143_intake` 正文接口返回 404 的当前根因,并形成可复核的整改边界。 + +## 范围 + +- 对照当前 dev 源码、数据库、工作区文件与既有真实 UI 证据。 +- 分析服务端 404 条件、前端 hydration 与重复请求条件。 +- 形成审计记录和整改建议;本轮不修改业务代码。 + +## 非目标 + +- 不恢复或覆盖用户文档数据。 +- 不以 API 探针或伪造数据替代后续真实浏览器验收。 +- 不继续纯软件项目自举方案实施。 + +## 步骤 + +1. [x] 核对项目 143 的项目、文档记录、账本与工作区事实源。 +2. [x] 核对正文 handler 的 404 分支和前端 hydration 重试条件。 +3. [x] 记录根因、影响范围、整改顺序和验收要求。 + +## 验收标准 + +- [x] 404 的直接原因与数据/代码证据相互印证。 +- [x] 明确区分历史项目数据缺口、当前能力回归和前端错误放大。 +- [x] 不宣称未执行的浏览器或真实 PI 结果。 + +## 相关链接 + +- Audit: [../../audit/2026-09-14-project143-controlled-content-404.md](../../audit/2026-09-14-project143-controlled-content-404.md) + +## 证据 / 备注 + +结论:文件存在;raw/canonical 哈希因 5 处 Markdown 双空格硬换行产生 10-byte 差异。该空格具有渲染语义,须保全原文修复。详见 Audit 与 Remediation。 diff --git a/.doc/audit/2026-09-14-project143-controlled-content-404.md b/.doc/audit/2026-09-14-project143-controlled-content-404.md new file mode 100644 index 00000000..00917399 --- /dev/null +++ b/.doc/audit/2026-09-14-project143-controlled-content-404.md @@ -0,0 +1,105 @@ +--- +title: "项目 143 受控文档正文因规范化哈希漂移返回 404" +status: done +created: 2026-09-14 +updated: 2026-09-14 +severity: critical +--- + +# 项目 143 受控文档正文因规范化哈希漂移返回 404 + +## 现象 + +已登录用户打开项目 143 后,页面无法加载 `doc_proj143_intake` 正文,并周期性出现: + +```text +GET /api/v1/docgov/documents/doc_proj143_intake/content 404 +自动拉取受控文档正文失败: fetch controlled document content failed: 404 +``` + +本轮未操作用户浏览器,也未执行真实 PI 或页面验收;上述 UI 现象来自用户现场。诊断仅对当前 dev 源码、PostgreSQL、容器挂载文件和既有真实 UI 证据做只读核对。 + +## 根因分析 + +### R1 — 文件存在,404 实际是哈希完整性冲突(直接原因) + +当前 dev 数据链如下: + +| 项 | 值 | +|---|---| +| project | `143`,active,workflow=`main` | +| document | `doc_proj143_intake`,非模板、drafting | +| work_dir | `/app/data/workspaces/bizdev/intake_1789270446856290128` | +| output.md | 存在,38,581 bytes | +| 文件原始 SHA-256 | `c97d749728bf5607a9117c29e45c0a165353f5bb8ba65532f21bda87232a988b` | +| `document_records.content_sha256` | `7e3c4954de0bd225ccde0c8494784d4275e7f29a517510f6a286ec004c35d490` | +| ledger head snapshot SHA-256 | 同上 `7e3c...d490`,38,571 bytes | + +`output.md` 有 5 行各保留 2 个 Markdown 尾随空格,共多 10 bytes。逐行去掉行尾空白后,文件 SHA-256 **精确等于**数据库记录和账本 head 的 `7e3c...d490`。这证明漂移由当前 canonicalizer 的行尾裁剪造成,而不是文件缺失;但 Markdown 的两个尾随空格表示硬换行,具有渲染语义,不能把两侧判为语义等价,也不能直接用账本 blob 覆盖原文件。 + +`internal/docgov/project_docs.go::ReadDocumentContent` 对文件原始字节计算 SHA,并与 `document_records.content_sha256` 比较;不等即报 `content sha256 mismatch`。`internal/server/project_doc_handlers.go::handleDocGovGetDocumentContent` 又把 `ReadDocumentContent` 的所有错误统一写成 HTTP 404,所以页面看到的是错误的 Not Found。 + +### R2 — revision bootstrap 改了数据库哈希,没有同步规范化文件(制造漂移) + +项目 143 的 `output.md` 于 2026-09-13 03:42 UTC 由真实小队落盘;账本 snapshot 66 于 10:32 UTC 才由旧文档首次 revision bootstrap 建立。 + +bootstrap 调用链: + +1. `bootstrapRevisionIfNeeded` 从 DocGov 文件读出 Markdown; +2. `EnsureBootstrap` / `OpenTemplateVersion` 调用 `CanonicalizeMarkdown`; +3. canonicalizer 会去掉每行尾随空格,包括 Markdown 有语义的双空格硬换行; +4. `openTemplatePGLocked` 将 canonical SHA 写入 snapshot、blob 和 `document_records.content_sha256`; +5. 该路径没有把 canonical blob 重新投影到 `output.md`。 + +结果是数据库与账本指向 38,571-byte canonical 内容,兼容文件仍为 38,581-byte raw 内容。旧项目一旦被 bootstrap,后续正文读取稳定失败。 + +### R3 — content 与 revision 并发 hydration 使首次行为存在竞态 + +`hydrateControlledDocumentContent` 用 `Promise.all` 同时请求 content 与 revision-state。对尚未建账本的旧文档: + +- content 若先读到旧 raw 哈希,可能首次成功; +- revision-state 随后 bootstrap 并把记录改成 canonical 哈希; +- 后续 content 立即或下一轮稳定 404。 + +既有真实 UI 资产已经记录过项目 143 的 `revision-state=200`、`content=404`;Round20 的 PASS 使用新项目 6159,不能覆盖项目 143 的旧数据迁移场景。 + +### R4 — 5 秒 lease 同步无变化也制造新数组,放大为重复 404 + +正文 hydration effect 依赖整个 `deliverables`。lease 轮询每 5 秒执行 `prev.map(...)` 并始终返回新数组,即使每个文档的 lease 均未变化。React 因引用变化重跑 hydration effect,持续请求同一已知失败正文。 + +因此控制台中的多次 404 不是多份正文丢失,而是一个后端一致性错误被前端无效状态更新周期性放大。 + +### R5 — 错误协议丢失可诊断信息 + +- 后端将记录不存在、文件不存在、文件为空、哈希冲突全部映射为 404。 +- `fetchControlledDocumentContent` 只抛出 HTTP status,不解析结构化错误码、message 或 correlation id。 +- 用户只能看到 `failed: 404`,无法区分可重试网络问题与必须修复的数据冲突。 + +## 影响范围 + +- **已确认受影响**:dev 项目 143 / `doc_proj143_intake`。 +- 对当前 dev 中可定位到现存 `output.md` 的 27 个非模板受控记录做只读比对:26 个 raw SHA 一致,只有项目 143 为 mismatch。 +- 数据库另有大量测试记录使用临时路径或空 `work_dir`;属于测试数据隔离/清理问题,不据此扩大本缺陷的用户数据范围。 +- 任何“旧文件含会被 canonicalizer 改写的内容、首次 bootstrap 只改数据库不投影文件”的文档都具有同类风险;不能仅手工修项目 143 后关闭代码缺陷。 + +## 严重度 + +`critical` — 用户正文实际存在却无法在 UI 查看;编辑、overlay、版本比较等后续能力均被正文 hydration 阻断,且错误码误导为不存在。 + +## 关联整改 + +- Remediation: [../remediation/2026-09-14-controlled-content-canonical-hash-remediation.md](../remediation/2026-09-14-controlled-content-canonical-hash-remediation.md) +- 既有账本审计: [2026-09-13-document-revision-runtime-404.md](./2026-09-13-document-revision-runtime-404.md) +- 既有真实 UI 报告: [../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md) + +## 证据 + +- 源码:`internal/docrevision/canonicalize.go`、`internal/docrevision/pg_mutate.go`、`internal/docgov/project_docs.go`、`internal/server/project_doc_handlers.go` +- 前端:`web/src/lib/controlledDocHydrate.ts`、`web/src/App.tsx` +- 数据库:`document_records.id=87`、`document_versions.id=59`、`document_snapshots.id=66` +- 历史 UI 资产:`.doc/test-reports/assets/2026-09-13-document-revision-runtime-ui/ui01-parent-directory-sync-failure/ui-acceptance-results.json` + +## 开放问题 + +- 尚未执行任何数据修复、代码修复、容器 rebuild 或浏览器重验。 +- 项目 143 可定位为 legacy canonicalization drift,但不能判定为渲染语义等价;修复须优先保全原文件,并以显式 migration repair 事件校正账本。 diff --git a/.doc/audit/INDEX.md b/.doc/audit/INDEX.md index bde27342..45c023d9 100644 --- a/.doc/audit/INDEX.md +++ b/.doc/audit/INDEX.md @@ -13,6 +13,14 @@ ## 核心文档(按阅读顺序推荐) +### 项目 143 受控正文 canonical hash 漂移(2026-09-14) + +**文件**: [2026-09-14-project143-controlled-content-404.md](./2026-09-14-project143-controlled-content-404.md) + +**结论**: 正文文件存在;revision bootstrap 去掉 5 行具有 Markdown 硬换行语义的双空格并把 canonical SHA 写入账本/DocGov,却未同步文件,正文读取将哈希冲突误报为 404;5 秒 lease no-op 更新又周期性重复 hydration。原文件必须保全,不能用旧 canonical blob 覆盖。 + +**整改**: [canonical hash 漂移整改计划](../remediation/2026-09-14-controlled-content-canonical-hash-remediation.md) + ### 文档版本账本运行时失效(2026-09-13) **文件**: [2026-09-13-document-revision-runtime-404.md](./2026-09-13-document-revision-runtime-404.md) diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index dd3f83c4..e96a66f8 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -12,6 +12,7 @@ | owner | task | branch | worktree | mutex | status | |-------|------|--------|----------|-------|--------| +| Codex | project143-controlled-content-404-diagnosis | fix/project143-controlled-content-404-diagnosis | - | docgov-content-diagnosis | done | | Codex | software-project-bootstrap-plan | feature/software-project-bootstrap-plan | - | workflow-design | done | | Cursor | chat-history-refresh-remediation | fix/chat-history-refresh | - | chat | in_progress | | Codex | conversation-intent-runtime-state | fix/conversation-intent-state | .worktrees/fix-conversation-intent-state | intent | in_progress | diff --git a/.doc/remediation/2026-09-14-controlled-content-canonical-hash-remediation.md b/.doc/remediation/2026-09-14-controlled-content-canonical-hash-remediation.md new file mode 100644 index 00000000..fee6a4ed --- /dev/null +++ b/.doc/remediation/2026-09-14-controlled-content-canonical-hash-remediation.md @@ -0,0 +1,85 @@ +--- +title: "受控正文 canonical hash 漂移与重复 hydration 整改计划" +status: planned +created: 2026-09-14 +updated: 2026-09-14 +--- + +# 受控正文 canonical hash 漂移与重复 hydration 整改计划 + +## 背景 + +现场审计:[项目 143 受控文档正文 404](../audit/2026-09-14-project143-controlled-content-404.md)。项目 143 的文件含 5 行 Markdown 双空格硬换行;bootstrap 的 canonicalizer 将其删除并把新 SHA 写入数据库/账本,却未同步文件,读取 API 再把完整性冲突误报为 404。双空格具有渲染语义,不能把该漂移当成可丢弃格式。 + +## 整改原则 + +1. 账本 head snapshot 是已建账本文档的权威正文;`output.md` 是兼容投影,不再成为并列真源。 +2. canonicalization 只能规范 LF、UTF-8 NFC、单个末尾换行等不改变 Markdown 语义的表示;禁止无条件裁剪行尾空格。 +3. 所有写路径使用同一语义保持的 canonical bytes 计算哈希、入账本、更新 DocGov 记录并投影文件。 +4. legacy 漂移和真实内容分叉均先保全双方;只有明确分类并留审计后才能修复,不得用旧账本 blob 静默覆盖原文件。 +5. 404 仅表示记录不存在;完整性错误必须用结构化错误暴露。 +6. 工程测试可直接查 API/DB;最终产品验收严格只以真实对话与浏览器页面可见结果签字。 + +## 实施波次 + +| 波次 | owner | 动作 | 完成判据 | +|---|---|---|---| +| W0 现场冻结 | Herdr / Cursor | 在独立 `fix/*` worktree 认领 `docgov`;保存项目 143 DB 行、snapshot/blob 元数据和原文件只读校验清单;不得先覆盖文件 | raw/canonical/head 三方 SHA 与 bytes 可复核 | +| W1 语义保持的规范化契约 | Cursor | 修改 `CanonicalizeMarkdown`:保留行尾空格等 Markdown 语义,只规范 LF/NFC/末尾换行;bootstrap、人工 PATCH、agent commit、backfill 全部传递同一 canonical bytes | hard-break/render golden test 不变;每条写路径完成后 `file_sha == record_sha == head_sha` | +| W2 权威读取与错误语义 | Cursor | 已有 ledger head 时,content API 从 head snapshot 返回正文;文件作为投影接受一致性监测。记录不存在才 404;缺文件/哈希冲突返回结构化 `DOCUMENT_CONTENT_PROJECTION_MISSING` / `DOCUMENT_CONTENT_INTEGRITY_MISMATCH`,含可重试/需管理员处理标志与 correlation id | handler 契约测试覆盖各错误分支;前端能显示真实原因 | +| W3 原子投影与恢复 | Cursor | ledger/DB 事务提交后,以临时文件 + fsync + rename 投影同一 bytes;投影失败保留可重试状态。增加幂等 reconciler/CLI:`raw==head` 通过;命中旧 destructive canonicalizer 仅分类为 `LEGACY_CANONICALIZATION_DRIFT`;其他差异分类为真实分叉,均禁止静默覆盖 | 故障注入后可恢复;双空格硬换行和真实分叉不被吞掉 | +| W4 项目 143 定向修复 | Cursor | 先备份原文件和 snapshot 66;以保留双空格的原文件建立显式 `migration_repair` snapshot/event,更新 head/record 后保持原文件不变。禁止把 snapshot 66 覆盖回文件,也禁止只改 DB hash | 143 三方 SHA 重新一致;原始 Markdown 与渲染保持;修复来源可审计 | +| W5 前端去重与可诊断错误 | Cursor | lease 同步无变化时返回原 `deliverables`;hydration 依赖缩小为 active doc 的稳定 fingerprint;同 doc/head 请求去重并中止过期请求;失败后仅显式重试或有界退避;解析服务端错误码并在文档区展示 | 空闲 30 秒不重复拉正文;显式重试恰好一次;错误 UI 可操作 | +| W6 工程门禁 | Cursor | Go 单测、PG 集成、前端单测/build;新增 legacy trailing-space、人工保存 trailing-space、bootstrap/restart、投影故障、真实分叉、lease no-op 等用例 | focused + `go vet ./...` + `go test -short ./...` + `npm test` + build PASS | +| W7 dev 集成 | Herdr / Cursor | 占 CURRENT 集成槽,merge dev,`env-service.sh dev rebuild`,确认 `/ready` schema 31+;不得用 restart 冒充部署新代码 | 新镜像运行且 smoke PASS | +| W8 真实 UI 实战 | Herdr / Antigravity | 使用真实浏览器页面和真实 PI/小队完成下列验收;API/DB 只作旁证,不得替代页面结果 | test report 逐项附 UI 可见证据;失败即不签字 | + +## Ubuntu Server 无头浏览器方案 + +优先复用已验证的官方镜像 `mcr.microsoft.com/playwright:v1.63.0-noble`,以 `--network host --ipc host` 运行仓库的 Chromium 页面测试,`BASE_URL=http://127.0.0.1:3100`。该方案无需在 Ubuntu Server 宿主安装浏览器。 + +仅当 Docker 浏览器镜像不可用时,才在 `web/` 执行 `npx playwright install --with-deps chromium` 安装宿主 Chromium 与系统依赖;安装动作和版本必须写入测试报告,不得静默切换执行环境。 + +## 真实 UI 验收矩阵(不得伪造) + +### A. 项目 143 旧数据恢复 + +1. 从登录页真实登录项目 143 的编制用户。 +2. 用页面进入项目对话并打开「用户初始需求收集表」。 +3. 页面须显示完整正文,而不是 loading/error skeleton;标题、正文片段、V/r 徽章均可见。 +4. 页面空闲 30 秒,正文不闪回 loading/error;不得依靠刷新碰运气。 +5. 双击真实正文块,输入唯一 marker,点击页面「保存修改」;页面须立即显示 r+1。 +6. 硬刷新、退出重登后 marker 与 r 均仍可见。 +7. 切换「纯净阅读 / 人工修改 / 全部变更」:纯净模式不着色,人工修改模式能定位本次 marker,对无 agent 变化的范围明确显示“无对应变更”,不能表现为按钮失效。 + +### B. 新项目完整生成链 + +1. 全部通过页面创建新项目、选择工作流、配置成员与职责;禁止 DB/API 直建测试对象。 +2. 在项目对话中输入真实业务需求,等待系统真实编排智能体小队并由真实 PI 生成文档。 +3. 页面必须能看到用户消息、助手阶段进度/最终回复、小队完成状态、生成的受控文档全文及 V/r。 +4. 再通过对话要求小队修改该文档;若出现高风险确认,必须在页面真实确认/拒绝,不得直接调 decision API。 +5. 页面必须展示实际 change report:摘要、文档影响、项目影响、风险、开放问题和分析状态;fallback 必须明确标识,不冒充 PI 叙事。 +6. 通过页面做人工块编辑并保存,验证三种 overlay、任意版本比较、通知入口与持久化。 + +### C. 持久性、并发与权限 + +1. 两个真实浏览器上下文以同一编制人打开同一修订,A 保存成功、B 后保存必须在页面出现 409 冲突提示且保留草稿。 +2. reviewer 登录后可读/批注但看不到正文保存能力;项目外用户在页面看不到项目和文档。 +3. app 重启后,仅通过页面重登恢复项目 143 与新项目的最终正文、V/r、overlay、报告与通知。 +4. 所有截图、视频、trace、页面可见文本和项目/doc/run 标识归档;不得提交账号密码、token 或 `phase-secrets.local.json` 内容。 + +## 必补工程测试 + +- legacy 文件含 Markdown hard-break 双空格:bootstrap 后 hard-break 仍存在、content 200、三方 SHA 一致。 +- human PATCH 输入尾随空格:账本、DocGov、文件一致,重启后仍可读。 +- agent commit / reject / retry:投影幂等,失败不假 200。 +- `legacyCanonical(raw)==head`:识别 destructive legacy drift,保留 raw 并追加 `migration_repair`,不得把旧 head 覆盖到文件。 +- 新 canonical 仍不一致:fail closed、保存双方、返回明确错误,绝不自动覆盖。 +- `ReadDocumentContent` 的 not-found / missing / empty / mismatch 分别映射正确状态码与 error code。 +- lease 列表无变化:React state 引用不变,hydration 不重复发起;显式 retry 单次请求。 + +## 发布门槛 + +- 项目 143 页面恢复只是定向修复,不足以关闭缺陷。 +- 代码门禁、PG 故障用例、143 旧数据 UI、新项目真实 PI 全链路、并发/权限/restart 全部 PASS 后,才可将 `DOC-CONTENT-CANONICAL-HASH-DRIFT` 标为 PASS。 +- 任一用例使用 stub、API 直写、伪造助手回复/文档/报告,整轮 UI 验收无效。 diff --git a/.doc/remediation/INDEX.md b/.doc/remediation/INDEX.md index ece77867..fdc6050f 100644 --- a/.doc/remediation/INDEX.md +++ b/.doc/remediation/INDEX.md @@ -3,6 +3,7 @@ | 文档 | 说明 | |------|------| | [gap-matrix.md](./gap-matrix.md) | 发布缺口 SSOT | +| [2026-09-14-controlled-content-canonical-hash-remediation.md](./2026-09-14-controlled-content-canonical-hash-remediation.md) | 项目 143 正文 canonical/raw 哈希漂移、错误语义与重复 hydration 整改 | | [2026-09-13-document-revision-reviewer-duty-sync.md](./2026-09-13-document-revision-reviewer-duty-sync.md) | UI-01 已分配 B=reviewer,受控文档 reviewer_id 硬编码 2,矩阵降为 viewer | | [2026-09-13-document-revision-duty-cell-assertion.md](./2026-09-13-document-revision-duty-cell-assertion.md) | UI-13a 整行 option 文案误判编制负责人,须读 select value/badge | | [2026-09-13-document-revision-workflow-category-navigation.md](./2026-09-13-document-revision-workflow-category-navigation.md) | UI-13a 停在私密分类,打开受控文档前必须先切流程受控 | diff --git a/.doc/remediation/gap-matrix.md b/.doc/remediation/gap-matrix.md index 01c43ef1..1aa8ded3 100644 --- a/.doc/remediation/gap-matrix.md +++ b/.doc/remediation/gap-matrix.md @@ -57,6 +57,7 @@ | ID | 描述 | 状态 | 证据 | 计划动作 | |---|---|---|---|---| +| DOC-CONTENT-CANONICAL-HASH-DRIFT | 旧受控文档 bootstrap 裁剪 Markdown 双空格硬换行并将 canonical SHA 写入账本/DocGov,但未同步文件;正文读取把完整性冲突误报 404,lease no-op 每 5 秒重复 hydration | **FAIL** | [audit](../audit/2026-09-14-project143-controlled-content-404.md);dev 项目 143 `record/head=7e3c...d490`、raw file=`c97d...988b`;差异为 5 处有语义的双空格 | [remediation](./2026-09-14-controlled-content-canonical-hash-remediation.md);Cursor 保全原文修复,Antigravity 真实 UI 验收 | | CHAT-HISTORY-REFRESH | 工作流激活后刷新,对话正文被阶段过滤器清空,但分类数量与锚点仍按全量返回 | **PASS** | [test-report](../test-reports/2026-09-13-chat-history-refresh-test-report.md);代码:`message_scope.go`、`chat_history_auth.go`、goose 00026/00027 | 真实 PI 刷新 E2E 待 dev 容器补录(自动化/PG 已 PASS) | | CHAT-INTENT-STATE | 真实会话被诊断探针污染;只读查询误启动文档写任务;错误动作与编辑状态刷新后丢失 | **FAIL** | [audit](../audit/2026-09-13-conversation-intent-runtime-state.md);dev `sess-p143-u9` / task run / lease 现场 | [remediation](./2026-09-13-conversation-intent-runtime-state-remediation.md) | | ENV-RESTART-SOURCE | `docker compose restart` 只重启旧镜像,健康检查无法证明合入代码已部署 | **PASS** | `env-service.sh rebuild` + 真实摘要重测 | 集成冒烟统一使用 `dev rebuild` | diff --git a/.doc/status/FEATURE-MATRIX.md b/.doc/status/FEATURE-MATRIX.md index b8a79566..413f6c79 100644 --- a/.doc/status/FEATURE-MATRIX.md +++ b/.doc/status/FEATURE-MATRIX.md @@ -21,7 +21,7 @@ | 工作流治理 | 三正式工作流 + 阶段门禁 | done | [remediation/three-workflows](../remediation/2026-09-12-three-workflows-strict-governance-remediation.md);[test 2026-09-12](../test-reports/2026-09-12-three-workflows-governance-remediation-test-report.md) | Phase2 设计器 partial | `workflow` | | 纯软件项目自举 | 软件项目创建、Bootstrap 基线、Delivery 迭代与受控工程交接 | planned | [详细设计](../system-design/2026-09-14-software-project-bootstrap-workflow.md);[现状调研](../ops/research/2026-09-14-software-project-bootstrap-current-state.md);[验收计划](../ops/checklists/2026-09-14-software-project-bootstrap-acceptance.md) | 当前仅完成方案;目录/模板/执行器/创建向导/真实 PI UI 均未实施。受控代码执行单列后续 Epic | `workflow-design` | | IAM / 鉴权 | 项目级 API 鉴权 + RBAC | partial | [audit/authorization](../audit/authorization-matrix-v2.md);[刷新恢复专项审计](../audit/2026-09-13-chat-history-refresh-disappears.md) | 历史读取端点补统一会话 owner + 阶段授权;旧 API 410 标注(BUG-11 partial) | `authz` | -| 文档治理 | 法定文档生命周期 + 租约 | done | [test docgov](../test-reports/2026-09-08-docgov-lifecycle-and-claiming-framework-test-report.md) | — | `docgov` | +| 文档治理 | 法定文档生命周期 + 租约 + 受控正文读取 | partial | [test docgov](../test-reports/2026-09-08-docgov-lifecycle-and-claiming-framework-test-report.md);[项目 143 正文 404 审计](../audit/2026-09-14-project143-controlled-content-404.md) | 生命周期/租约既有能力保留;旧文档 canonical/raw 哈希漂移会使正文读取误报 404,待整改与真实 UI 重验 | `docgov` | | 文档版本与修改认知 | 智能体版本边界、人工修订标记、任意版本比较、变更报告与负责人通知 | partial | [管理测试](../test-reports/2026-09-13-document-revision-management-test-report.md);[运行时 UI Round20](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md);[运行时审计](../audit/2026-09-13-document-revision-runtime-404.md);[ADR](../adr/2026-09-13-document-version-boundary.md) | **运行时 UI PASS**(6159 / V3/r2)。仍 `partial`:change report=`fallback`(真实 diff+lineage,非完整 PI 叙事)。系统级 `CHAT-INTENT` 见 gap-matrix | `docgov` | | 前端工作台 | 三栏 + 块文档 + SSE | partial | [test workbench](../test-reports/2026-09-08-three-column-workbench-and-block-document-test-report.md);[现场专项审计](../audit/2026-09-13-conversation-intent-runtime-state.md) | 错误卡片/任务进度/文档 busy 状态刷新恢复与人工抽检待完成 | `web` | | PI Runner / 配置链 | pi-agent + MiniMax 真实链路 | done | [test piagent](../test-reports/2026-09-13-codex-audit-p0-remediation-test-report.md);[container-env](../test-reports/2026-09-13-container-env-configuration-test-report.md) | — | `pi-agent` |