docs(audit): diagnose project143 document content 404

This commit is contained in:
weichen
2026-09-14 01:47:21 +00:00
parent 79d2676bbf
commit f80e7a1ea1
8 changed files with 250 additions and 1 deletions
@@ -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。
@@ -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 事件校正账本。
+8
View File
@@ -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)
+1
View File
@@ -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 |
@@ -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 验收无效。
+1
View File
@@ -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 停在私密分类,打开受控文档前必须先切流程受控 |
+1
View File
@@ -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` |
+1 -1
View File
@@ -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` |