diff --git a/.doc/audit/2026-09-13-document-revision-pg-id-remap.md b/.doc/audit/2026-09-13-document-revision-pg-id-remap.md index 41c0c798..985f691c 100644 --- a/.doc/audit/2026-09-13-document-revision-pg-id-remap.md +++ b/.doc/audit/2026-09-13-document-revision-pg-id-remap.md @@ -1,8 +1,8 @@ --- title: "首次生成 PG ID 未同步计数器导致 baseline 被误删" -status: in_progress +status: done created: 2026-09-13 -updated: 2026-09-13 +updated: 2026-09-14 severity: critical --- @@ -40,4 +40,8 @@ severity: critical ## 开放问题 -- 本轮不重跑真实 UI-03;不得标 E2E 通过或任务 `done` +- 无(本缺陷)。Round20 已在项目 6159 重跑 UI-03 PASS。Round19 归档不删。 + +## 关闭记录 + +工程修复合入 `dev@b258ab8`。验收:[../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md)。 diff --git a/.doc/audit/2026-09-13-document-revision-post-restart-final-snippet.md b/.doc/audit/2026-09-13-document-revision-post-restart-final-snippet.md index 5fe1a3f8..72a56ea9 100644 --- a/.doc/audit/2026-09-13-document-revision-post-restart-final-snippet.md +++ b/.doc/audit/2026-09-13-document-revision-post-restart-final-snippet.md @@ -1,8 +1,8 @@ --- title: "post-restart 断言了已过期的 UI-06 正文 marker" -status: in_progress +status: done created: 2026-09-13 -updated: 2026-09-13 +updated: 2026-09-14 severity: high --- @@ -45,4 +45,8 @@ getByText('UI06-mu0eq020') → element(s) not found ## 开放问题 -- 本轮不重跑真实 post-restart;不得标 UI-15 通过或任务 `done` +- 无(本缺陷)。Round20 `bodySnippet=A1-win-mu0gwiez`,post-restart PASS。失败归档不删。 + +## 关闭记录 + +[../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md) diff --git a/.doc/audit/2026-09-13-document-revision-runtime-404.md b/.doc/audit/2026-09-13-document-revision-runtime-404.md index 09484137..b2c73d97 100644 --- a/.doc/audit/2026-09-13-document-revision-runtime-404.md +++ b/.doc/audit/2026-09-13-document-revision-runtime-404.md @@ -1,10 +1,10 @@ --- title: "文档版本账本运行时 404 与修订链路失效现场审计" -status: in_progress +status: done created: 2026-09-13 -updated: 2026-09-13 +updated: 2026-09-14 severity: critical -# note: 工程侧 R1–R6 代码修复已在 fix/document-revision-runtime;剩余 blocker 为真实 PI 叙事与 orphan 上传、UI E2E 未占槽 +# note: Round20 真实 UI PASS 后运行时 404 链路关闭;剩余开放仅为 PI 叙事 fallback 与无关系统 blocker --- # 文档版本账本运行时 404 与修订链路失效现场审计 @@ -109,5 +109,9 @@ if (!target || target.governanceMode === 'freeform') { ## 开放问题 -1. 纯客户端上传且从未调用 freeform create 的文档:服务端无正文事实源 → bootstrap 需 PATCH/显式注册,或返回可操作的 empty/register 状态(禁止静默假账本)。 -2. PI Agent 叙事变更报告(业务含义、开放问题文案)需独立调用链;本轮以确定性 fallback 报告上线,叙事标 blocker。 +1. 纯客户端上传且从未调用 freeform create 的文档:服务端无正文事实源 → bootstrap 需 PATCH/显式注册,或返回可操作的 empty/register 状态(禁止静默假账本)。Round20 UI-16 验证的是已注册 `doc-free-*` 路径。 +2. PI Agent 叙事变更报告(业务含义、开放问题文案)需独立调用链;Round20 仍为确定性 fallback,**不得**宣称为完整 PI。 + +## 关闭记录(Round20) + +现场 404 / 未就绪 / 保存与 overlay 失效已在真实页面闭环。证据:[../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md)。项目 6159 / `doc_proj6159_intake` / V3/r2。历史失败资产不删。 diff --git a/.doc/audit/INDEX.md b/.doc/audit/INDEX.md index c12b46c7..37c977d4 100644 --- a/.doc/audit/INDEX.md +++ b/.doc/audit/INDEX.md @@ -17,9 +17,9 @@ **文件**: [2026-09-13-document-revision-runtime-404.md](./2026-09-13-document-revision-runtime-404.md) -**结论**: Wave0–6 合入后现场仍 404——账本仅内存、GET 无 bootstrap、freeform 跳过 PATCH、overlay 未装饰、agent 报告为静态假 JSON。 +**结论**: 原现场 404(账本仅内存、GET 无 bootstrap、freeform 跳过 PATCH、overlay 空壳、静态假 JSON)已在工程侧修复;**Round20 真实 UI PASS**(项目 6159,V3/r2)。change report 仍为 fallback,不冒充 PI 叙事。 -**整改**: [运行时整改方案](../remediation/2026-09-13-document-revision-runtime-remediation.md) · [short-term](../ops/short-term/2026-09-13-document-revision-runtime.md) +**整改**: [运行时整改方案](../remediation/2026-09-13-document-revision-runtime-remediation.md) · [short-term](../ops/short-term/2026-09-13-document-revision-runtime.md) · [Round20 报告](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md) ### 文档修改与智能体版本专项分析(2026-09-13) @@ -33,15 +33,15 @@ **文件**: [2026-09-13-document-revision-pg-id-remap.md](./2026-09-13-document-revision-pg-id-remap.md) -**结论**: 项目 6158 首次生成 PG 已写入 baseline snapshot=249、candidate id=175、output snapshot id=250、report id=175,但内存计数器未同步,临时 ID 覆盖并删除 baseline,commit `not found`。 +**结论**: 项目 6158 首次生成 PG 已写入 baseline snapshot=249、candidate id=175、output snapshot id=250、report id=175,但内存计数器未同步,临时 ID 覆盖并删除 baseline,commit `not found`。工程修复已合入;Round20 项目 6159 首次生成 UI-03 PASS。 -**整改**: [short-term](../ops/short-term/2026-09-13-document-revision-pg-id-remap.md) +**整改**: [short-term](../ops/short-term/2026-09-13-document-revision-pg-id-remap.md) · [Round20 报告](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md) **文件**: [2026-09-13-document-revision-post-restart-final-snippet.md](./2026-09-13-document-revision-post-restart-final-snippet.md) -**结论**: 第二次 post-restart 已恢复 V3/r2 与正文;失败只因 phase-state 仍断言 UI-06 marker,未写入 UI-13b A1 最终持久正文。 +**结论**: 第二次 post-restart 已恢复 V3/r2 与正文;当时失败只因 phase-state 仍断言 UI-06 marker。Round20 `bodySnippet=A1-win-mu0gwiez`,post-restart PASS。 -**整改**: [short-term](../ops/short-term/2026-09-13-document-revision-post-restart-final-snippet.md) +**整改**: [short-term](../ops/short-term/2026-09-13-document-revision-post-restart-final-snippet.md) · [Round20 报告](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md) **文件**: [2026-09-13-document-revision-post-restart-selector.md](./2026-09-13-document-revision-post-restart-selector.md) diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index 0b21c6fd..86f2aea2 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -1,13 +1,12 @@ # 当前焦点 -**更新**: 2026-09-13 -**production_ready**: no(DOCREV:6158 首次生成 PG 已落库但 commit not found;不执行 env-service 重建 / 不声称 E2E 通过) +**更新**: 2026-09-14 +**production_ready**: no(`CHAT-INTENT-STATE` 等无关 blocker 仍开放。文档账本运行时 UI Round20 **PASS**,不把 fallback change report 写成完整 PI,也不把本轮写成全仓可发布) ## 焦点 -1. **DOCREV-RT**: [文档账本 PG ID 重映射](short-term/2026-09-13-document-revision-pg-id-remap.md)(`fix/document-revision-pg-id-remap`;工程修复已提交,暂不合入;不声称 UI-03 通过) -2. **DOCREV-RT**: [post-restart 最终持久正文](short-term/2026-09-13-document-revision-post-restart-final-snippet.md)(已合入 `dev@fa6a033`) -3. **DOCREV-RT**: [质量修复子工作区契约](short-term/2026-09-13-document-revision-quality-repair-workspace-contract.md)(已合入 `dev@339e871`;仍 `in_progress`,待占槽重跑 UI-03) +1. **CHAT-INTENT**: [对话意图运行时状态](../audit/2026-09-13-conversation-intent-runtime-state.md)(`fix/conversation-intent-state`;与文档账本运行时无关) +2. **CHAT**: [对话历史刷新](../audit/2026-09-13-chat-history-refresh-disappears.md)(认领仍 `in_progress`;gap 行已 PASS,以代码/handoff 为准收敛) ## 并行认领 @@ -19,32 +18,34 @@ | Cursor-Auto | document-revision-runtime-ui03 | fix/document-revision-runtime-ui03 | - | docgov | done | | Cursor-Auto | document-revision-sse-idempotency | fix/document-revision-sse-idempotency | - | docgov | done | | Cursor-Auto | document-revision-active-doc-routing | fix/document-revision-active-doc-routing | - | docgov | done | -| Cursor-Auto | document-revision-quality-context | fix/document-revision-quality-context | - | docgov | in_progress | -| Cursor-Auto | document-revision-e2e-pending-flow | fix/document-revision-e2e-pending-flow | - | pending-report-ui | in_progress | -| Cursor-Auto | document-revision-e2e-reject-routing | fix/document-revision-e2e-reject-routing | - | document-revision-runtime-ui | in_progress | -| Cursor-Auto | document-revision-e2e-block-selector | fix/document-revision-e2e-block-selector | - | document-revision-block-selector | in_progress | -| Cursor-Auto | document-revision-e2e-save-selector | fix/document-revision-e2e-save-selector | - | document-revision-save-selector | in_progress | -| Cursor-Auto | document-revision-e2e-overlay-selector | fix/document-revision-e2e-overlay-selector | - | document-revision-overlay-selector | in_progress | -| Cursor-Auto | document-revision-e2e-overlay-transition | fix/document-revision-e2e-overlay-transition | - | document-revision-overlay-transition | in_progress | -| Cursor-Auto | document-revision-second-doc-routing-lease | fix/document-revision-second-doc-routing-lease | - | document-revision-second-doc-routing-lease | in_progress | -| Cursor-Auto | document-revision-prelim-output | fix/document-revision-pi-runner-module | - | document-revision-prelim-output | in_progress | -| Cursor-Auto | document-revision-editor-hydration-race | fix/document-revision-editor-hydration-race | - | document-revision-editor-hydration-race | in_progress | -| Cursor-Auto | document-revision-quality-repair-workspace-contract | fix/document-revision-quality-repair-workspace-contract | - | document-revision-quality-repair-workspace-contract | in_progress | -| Cursor-Auto | document-revision-fast-completion-observation | fix/document-revision-fast-completion-observation | - | document-revision-fast-completion-observation | in_progress | -| Cursor-Auto | document-revision-workflow-category-navigation | fix/document-revision-workflow-category-navigation | - | document-revision-workflow-category-navigation | in_progress | -| Cursor-Auto | document-revision-duty-cell-assertion | fix/document-revision-duty-cell-assertion | - | document-revision-duty-cell-assertion | in_progress | +| Cursor-Auto | document-revision-quality-context | fix/document-revision-quality-context | - | docgov | done | +| Cursor-Auto | document-revision-e2e-pending-flow | fix/document-revision-e2e-pending-flow | - | pending-report-ui | done | +| Cursor-Auto | document-revision-e2e-reject-routing | fix/document-revision-e2e-reject-routing | - | document-revision-runtime-ui | done | +| Cursor-Auto | document-revision-e2e-block-selector | fix/document-revision-e2e-block-selector | - | document-revision-block-selector | done | +| Cursor-Auto | document-revision-e2e-save-selector | fix/document-revision-e2e-save-selector | - | document-revision-save-selector | done | +| Cursor-Auto | document-revision-e2e-overlay-selector | fix/document-revision-e2e-overlay-selector | - | document-revision-overlay-selector | done | +| Cursor-Auto | document-revision-e2e-overlay-transition | fix/document-revision-e2e-overlay-transition | - | document-revision-overlay-transition | done | +| Cursor-Auto | document-revision-second-doc-routing-lease | fix/document-revision-second-doc-routing-lease | - | document-revision-second-doc-routing-lease | done | +| Cursor-Auto | document-revision-prelim-output | fix/document-revision-pi-runner-module | - | document-revision-prelim-output | done | +| Cursor-Auto | document-revision-editor-hydration-race | fix/document-revision-editor-hydration-race | - | document-revision-editor-hydration-race | done | +| Cursor-Auto | document-revision-quality-repair-workspace-contract | fix/document-revision-quality-repair-workspace-contract | - | document-revision-quality-repair-workspace-contract | done | +| Cursor-Auto | document-revision-fast-completion-observation | fix/document-revision-fast-completion-observation | - | document-revision-fast-completion-observation | done | +| Cursor-Auto | document-revision-workflow-category-navigation | fix/document-revision-workflow-category-navigation | - | document-revision-workflow-category-navigation | done | +| Cursor-Auto | document-revision-duty-cell-assertion | fix/document-revision-duty-cell-assertion | - | document-revision-duty-cell-assertion | done | | Cursor-Auto | document-revision-reviewer-duty-sync | fix/document-revision-reviewer-duty-sync | - | document-revision-reviewer-duty-sync | done | | Cursor-Auto | document-revision-post-restart-selector | fix/document-revision-post-restart-selector | - | document-revision-post-restart-selector | done | | Cursor-Auto | document-revision-post-restart-final-snippet | fix/document-revision-post-restart-final-snippet | - | document-revision-post-restart-final-snippet | done | -| Cursor-Auto | document-revision-pg-id-remap | fix/document-revision-pg-id-remap | - | document-revision | in_progress | +| Cursor-Auto | document-revision-pg-id-remap | fix/document-revision-pg-id-remap | - | document-revision | done | +| Cursor-Auto | document-revision-runtime | fix/document-revision-runtime-ui03 | - | docgov | done | +| Cursor-Auto | document-revision-runtime-ui-final-report | docs/document-revision-runtime-ui-final-report | - | document-revision-runtime-ui | done | -> 新任务开始前登记。`branch` 必须为 `feature/` 或 `fix/`,**禁止** `dev` / `test` / `main`。同一 `mutex` 同时仅一个 `in_progress`。 +> 新任务开始前登记。`branch` 必须为 `feature/` 或 `fix/`,**禁止** `dev` / `test` / `main`(本轮收口按用户指定使用 `docs/*`,只改文档)。同一 `mutex` 同时仅一个 `in_progress`。 ## 集成槽位 | holder | phase | since | scope | queue | |--------|-------|-------|-------|-------| -| Codex/Antigravity | e2e | 2026-09-13 | DOCREV-RT real UI on **schema 30**;SSE 断线/同 turn 409 现场保留 | Cursor-Auto (sse-idempotency 编码,待占槽冒烟) | +| idle | idle | 2026-09-14 | 文档账本运行时真实 UI Round20 已 PASS 并释放;他人合 `dev` + 容器验证须重新占槽 | — | **phase**: `idle` | `merging` | `smoke` | `e2e` @@ -54,7 +55,7 @@ | 环境 | 端口 | schema | 状态 | |------|------|--------|------| -| dev | 8080 | **30** | healthy(UI-03 现场) | +| dev | 8080 | **31** | healthy(Round20 项目 6159;本轮文档收口不 rebuild) | | test | 8081 | 25→27* | healthy | | main | 8000 | 25→27* | healthy(app + runner + DB) | @@ -68,7 +69,8 @@ | 测试报告 | [test-reports/](../test-reports/) | | Agent 手册 | [AGENTS.md](../../AGENTS.md) | | DOCREV ADR | [../adr/2026-09-13-document-version-boundary.md](../adr/2026-09-13-document-version-boundary.md) | -| DOCREV 测试 | [../test-reports/2026-09-13-document-revision-management-test-report.md](../test-reports/2026-09-13-document-revision-management-test-report.md) | +| DOCREV 管理测试 | [../test-reports/2026-09-13-document-revision-management-test-report.md](../test-reports/2026-09-13-document-revision-management-test-report.md) | +| DOCREV 运行时 UI Round20 | [../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md) | | SSE/幂等审计 | [../audit/2026-09-13-document-revision-sse-idempotency.md](../audit/2026-09-13-document-revision-sse-idempotency.md) | | 质量门禁自污染审计 | [../audit/2026-09-13-document-revision-quality-gate-self-pollution.md](../audit/2026-09-13-document-revision-quality-gate-self-pollution.md) | | 当前文档路由审计 | [../audit/2026-09-13-document-revision-active-doc-routing.md](../audit/2026-09-13-document-revision-active-doc-routing.md) | diff --git a/.doc/ops/checklists/2026-09-13-document-revision-pg-id-remap.md b/.doc/ops/checklists/2026-09-13-document-revision-pg-id-remap.md index 7306e81d..ae2a6c93 100644 --- a/.doc/ops/checklists/2026-09-13-document-revision-pg-id-remap.md +++ b/.doc/ops/checklists/2026-09-13-document-revision-pg-id-remap.md @@ -1,8 +1,8 @@ --- title: "PG ID 重映射收紧" -status: in_progress +status: done created: 2026-09-13 -updated: 2026-09-13 +updated: 2026-09-14 related_task: "2026-09-13-document-revision-pg-id-remap.md" --- @@ -15,9 +15,9 @@ related_task: "2026-09-13-document-revision-pg-id-remap.md" - [x] openTemplate / human / candidate / commit / noop event 全走 adopt - [x] 纯函数 + 高序列首次生成 PG 回归 - [x] `gofmt` / `go vet` / `go test -short ./...` -- [ ] 真实 UI-03(本轮不做) +- [x] 真实 UI-03:Round20 PASS(6159 / `doc_proj6159_intake` / V2/r0) ## 完成定义 - [x] 上述实现项有测试证据 -- [ ] 现场 UI-03 仍开放,不得标 done +- [x] 现场 UI-03 Round20 已通过;Round19 失败归档不删 diff --git a/.doc/ops/checklists/2026-09-13-document-revision-post-restart-final-snippet.md b/.doc/ops/checklists/2026-09-13-document-revision-post-restart-final-snippet.md index 3b122741..ef6b6dce 100644 --- a/.doc/ops/checklists/2026-09-13-document-revision-post-restart-final-snippet.md +++ b/.doc/ops/checklists/2026-09-13-document-revision-post-restart-final-snippet.md @@ -1,8 +1,8 @@ --- title: "post-restart 最终持久正文 snippet" -status: in_progress +status: done created: 2026-09-13 -updated: 2026-09-13 +updated: 2026-09-14 related_task: "2026-09-13-document-revision-post-restart-final-snippet.md" --- @@ -15,9 +15,9 @@ related_task: "2026-09-13-document-revision-post-restart-final-snippet.md" - [x] UI-13b 冲突断言完成后回写 `markerA1`;UI-15-pre 写出最终值 - [x] 不放宽/删除 post-restart body 断言 - [x] `npm test` / `npm run build` -- [ ] 真实 UI-15 post-restart(本轮不做) +- [x] 真实 UI-15 post-restart:Round20 PASS ## 完成定义 - [x] 上述实现项有单测或脚本证据 -- [ ] 现场 post-restart 仍开放,不得标 done +- [x] 现场 post-restart Round20 已通过;stale-snippet 失败归档不删 diff --git a/.doc/ops/checklists/2026-09-13-document-revision-runtime-ui-acceptance.md b/.doc/ops/checklists/2026-09-13-document-revision-runtime-ui-acceptance.md index 5bb1005e..c649ac64 100644 --- a/.doc/ops/checklists/2026-09-13-document-revision-runtime-ui-acceptance.md +++ b/.doc/ops/checklists/2026-09-13-document-revision-runtime-ui-acceptance.md @@ -1,8 +1,8 @@ --- title: "文档版本账本运行时 — Ubuntu Server 无头浏览器真实 UI 验收计划" -status: planned +status: done created: 2026-09-13 -updated: 2026-09-13 +updated: 2026-09-14 --- # 文档版本账本运行时 — Ubuntu Server 无头浏览器真实 UI 验收计划 @@ -88,24 +88,24 @@ RUN_UI_ACCEPTANCE=1 BASE_URL=http://127.0.0.1:8080 \ | ID | 步骤(仅 UI) | 期望页面现象 | 证据 | 判定 | |----|---------------|--------------|------|------| -| UI-01 | 管理员开通 B 后,tech-lead A **页面创建**项目并勾选成员 | 立项成员候选含 B;项目工作台三栏可见 | 截图 `01-project.png` | | -| UI-02 | 对话输入框发起真实任务(触发真实小队编排) | 助手流式回复;任务进度/文档 busy 可见;网络可见真实 agent 请求 | 截图 + trace | | -| UI-03 | 等待小队**首轮**完成,打开生成的受控文档 Tab | 右侧出现文档;版本工具条 `Vn`/`r*`(非「账本未就绪」) | 截图 `03-first-doc.png` | | -| UI-04 | 打开变更报告:工具条「变更报告」/「待确认报告」或版本历史「报告」 | **首轮**可见:摘要、**风险条目**、项目影响内容、各文档影响原因/建议、开放问题;加载失败显式错误非永久加载中;`fallback` 不得宣称为完整 PI | 截图 `04-first-report.png` | | -| UI-05 | 同项目再触发**二轮**更新生成(真实对话) | 低/中风险:新版本+报告;**高风险**:工具条显示「待确认报告」与 pending 徽章,**版本历史尚无新 V**,打开报告可见完整字段 | 截图 `05-second-report.png` | | -| UI-05a | 编制人对高风险候选点「确认提交」 | decision API `confirmed:true`;版本前进;pending 消失;历史出现带 `change_report_id` 的新版本 | 截图+网络 | | -| UI-05b | 编制人对高风险候选点「拒绝」 | 候选拒绝;pending 消失;版本号不前进;无权用户无确认/拒绝按钮或 decision 403 | 截图+网络 | | -| UI-06 | 双击块编辑 → 保存 → **硬刷新** | 无冲突时工具条 `r` **立即**递增(`revisionRefreshKey`);硬刷新后正文仍为保存内容 | 截图前后对比 | | -| UI-07 | 切换「纯净阅读」 | 块无琥珀/蓝色装饰底 | 截图 | | -| UI-08 | 切换「人工修改」 | 相对 baseline 的改动块琥珀底+下划线暗示 | 截图 | | -| UI-09 | 切换「全部变更」 | 相对上一版本/人工差异装饰;与 UI-07/08 **视觉可区分** | 三模式并排或连续截图 | | -| UI-10 | 「版本历史」+「比较」 | 抽屉列出版本;比较视图展示 hunk | 截图 | | -| UI-11 | **多文档**:同项目再生成/打开第二份受控文档 + **页面上传**附件 Tab | 多 Tab 可切换;各文档 revision-state 独立;附件可预览 | 截图 | | -| UI-12 | 用户 B 打开无权限项目文档 | 工具条/内容区拒绝或空状态,**不泄漏正文** | 截图 + 网络 403/404 | | -| UI-13 | A 与 B **双浏览器上下文**同时编辑同一文档 | 后写者冲突提示「刷新后重做」,不静默覆盖 | 双 context 截图 | | -| UI-14 | A 退出 → **重登录** → 打开同一文档 | revision-state 200;正文与 `r` 与退出前一致 | 截图 | | -| UI-15 | (集成槽内)**重启 app 容器**后再打开同一文档 | 账本与正文仍可恢复;非「未就绪」除非确无事实源 | 截图 + `docker restart` 日志摘录 | | -| UI-16 | 仅 IndexedDB、从未服务端注册的上传预览 | 清晰空状态/引导;**禁止**静默假 V1 | 截图 | | +| UI-01 | 管理员开通 B 后,tech-lead A **页面创建**项目并勾选成员 | 立项成员候选含 B;项目工作台三栏可见 | 截图 `01-project.png` | PASS | +| UI-02 | 对话输入框发起真实任务(触发真实小队编排) | 助手流式回复;任务进度/文档 busy 可见;网络可见真实 agent 请求 | 截图 + trace | PASS | +| UI-03 | 等待小队**首轮**完成,打开生成的受控文档 Tab | 右侧出现文档;版本工具条 `Vn`/`r*`(非「账本未就绪」) | 截图 `03-first-doc.png` | PASS | +| UI-04 | 打开变更报告:工具条「变更报告」/「待确认报告」或版本历史「报告」 | **首轮**可见:摘要、**风险条目**、项目影响内容、各文档影响原因/建议、开放问题;加载失败显式错误非永久加载中;`fallback` 不得宣称为完整 PI | 截图 `04-first-report.png` | PASS | +| UI-05 | 同项目再触发**二轮**更新生成(真实对话) | 低/中风险:新版本+报告;**高风险**:工具条显示「待确认报告」与 pending 徽章,**版本历史尚无新 V**,打开报告可见完整字段 | 截图 `05-second-report.png` | PASS | +| UI-05a | 编制人对高风险候选点「确认提交」 | decision API `confirmed:true`;版本前进;pending 消失;历史出现带 `change_report_id` 的新版本 | 截图+网络 | PASS | +| UI-05b | 编制人对高风险候选点「拒绝」 | 候选拒绝;pending 消失;版本号不前进;无权用户无确认/拒绝按钮或 decision 403 | 截图+网络 | PASS | +| UI-06 | 双击块编辑 → 保存 → **硬刷新** | 无冲突时工具条 `r` **立即**递增(`revisionRefreshKey`);硬刷新后正文仍为保存内容 | 截图前后对比 | PASS | +| UI-07 | 切换「纯净阅读」 | 块无琥珀/蓝色装饰底 | 截图 | PASS | +| UI-08 | 切换「人工修改」 | 相对当前 Version 的人工修订块琥珀底+下划线暗示 | 截图 | PASS | +| UI-09 | 切换「全部变更」 | 智能体+人工差异;仅人工时允许与 UI-08 相同 | 三模式并排或连续截图 | PASS | +| UI-10 | 「版本历史」+「比较」 | 抽屉列出版本;比较视图展示 hunk | 截图 | PASS | +| UI-11 | **多文档**:同项目再生成/打开第二份受控文档 + **页面上传**附件 Tab | 多 Tab 可切换;各文档 revision-state 独立;附件可预览 | 截图 | PASS | +| UI-12 | 用户 C 打开无权限项目(非成员) | 项目不可见,**不泄漏正文** | 截图 + 网络 403/404 | PASS | +| UI-13 | 拆为 13a reviewer 只读 + 13b A/A 同 r 冲突 | B 无正文编辑;A2 `409 DOCUMENT_HEAD_CONFLICT` 保留草稿 | 双 context 截图 | PASS | +| UI-14 | A 退出 → **重登录** → 打开同一文档 | revision-state 200;正文与 `r` 与退出前一致 | 截图 | PASS | +| UI-15 | (集成槽内)**重启 app 容器**后再打开同一文档 | 账本与正文仍可恢复;非「未就绪」除非确无事实源 | 截图 + `docker restart` 日志摘录 | PASS | +| UI-16 | 页面上传经 freeform 注册后打开;禁止 `doc-upload` 假账本 | 已注册 `doc-free-*` 工具条 V 可见;无 orphan revision-state | 截图 | PASS | --- @@ -156,5 +156,9 @@ RUN_UI_ACCEPTANCE=1 BASE_URL=http://127.0.0.1:8080 \ ## 7. 本轮状态 -- 计划已扩展(首轮/二轮报告、多文档附件、双上下文、重登录、容器重启、安装与失败标准)。 -- **本轮未执行**(不占集成槽、不 rebuild docker)。占槽后按 §0–§4 实录并写 test-report。 +- Round20(2026-09-14)真实页面验收 **PASS**:results JSON 21/21;Playwright main 18 passed / 1 post skipped;仅 restart app 后 post 1 passed / 18 skipped。 +- 项目 `UI验收-超声微创系统-mu0gwiez`(6159);intake `doc_proj6159_intake`;终态 V3/r2 / `A1-win-mu0gwiez`。 +- 报告:[../../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md](../../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md) +- Ubuntu 无头:官方 Playwright 1.63.0 noble 容器(无需 host 安装);`npx playwright install` 仅备选。 +- 工程门禁另栏:`go test -short` / `go vet` / web 333+30 / build PASS;`-race` 全包并行 **NOT PASS**(server TempDir flake)。 +- 全仓仍 `production_ready=no`(`CHAT-INTENT` 等)。 diff --git a/.doc/ops/handoffs/2026-09-13-document-revision-pg-id-remap.md b/.doc/ops/handoffs/2026-09-13-document-revision-pg-id-remap.md index 4abf184c..c612819e 100644 --- a/.doc/ops/handoffs/2026-09-13-document-revision-pg-id-remap.md +++ b/.doc/ops/handoffs/2026-09-13-document-revision-pg-id-remap.md @@ -1,35 +1,38 @@ --- -title: "PG ID 重映射:工程修复后交接" +title: "PG ID 重映射:Round20 后关闭" created: 2026-09-13 +updated: 2026-09-14 from: Cursor-Auto to: next-agent -status: open +status: done --- -# 交接:PG ID 重映射(暂不合入) +# 交接:PG ID 重映射(已合入并经 Round20 验证) ## 目标(下一位 Agent 应完成什么) -- 合入前占 CURRENT 集成槽位,再 `--no-ff` 合 `dev`;本轮禁止 merge / 重建容器 / 声称 E2E -- 真实 UI-03(项目 6158 同类首次生成)待占槽重跑 +- 不要重开本缺陷,除非新现场再次出现 `CommitAgentVersion` not found +- 不要改删 Round19 失败归档 +- 全仓焦点已离开文档运行时 UI;勿占用已释放的 DOCREV-RT 集成槽,除非新任务登记 ## 已完成 - 统一 `advanceID` / `nextFreeID` / `adopt*ID` -- 首次生成高序列碰撞:自动提交成功,V1 baseline 未丢,candidate committed,新 Service 可 hydration +- 隔离 PG 高序列首次生成:baseline 不丢、重启 hydration +- 合入 `dev@b258ab8` +- Round20 真实 UI-03:项目 6159 首次生成 V2/r0,不再 `docrevision: not found` ## 未完成 -- 真实 UI-03 -- 合入 `dev` +- 无(本缺陷)。PI 叙事 fallback 与 `CHAT-INTENT` 属其他条目 ## 认领 / 槽位状态 | 项 | 值 | |----|-----| -| mutex 已释放 | no(`document-revision` 仍 `in_progress`) | -| 集成槽位 holder | 他人 e2e;本任务未占槽 | -| branch | `fix/document-revision-pg-id-remap` | +| mutex 已释放 | yes | +| 集成槽位 holder | idle(运行时 UI 收口后释放) | +| branch | 已合入 `dev`(`merge: fix/document-revision-pg-id-remap`) | | worktree | - | ## 关键文件 @@ -42,16 +45,11 @@ status: open ## 如何验证 -```bash -go test -short ./internal/docrevision ./... -go vet ./... -# 隔离库(可选): -TEST_DATABASE_URL='...' go test ./internal/docrevision -count=1 -run 'HighSequenceFirstGen|AdoptSnapshot|PutSnapshotLocked' -``` +见 [../../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md](../../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md)。不要把 output snapshot 250 写成 candidate 250(6158 现场:candidate id=175、output snapshot id=250、report id=175)。 ## 风险 / Blocker -- 不得把 `ErrNotFound` 改成忽略;失败任务必须保持失败 +- 不得把 `ErrNotFound` 改成忽略 ## 相关链接 diff --git a/.doc/ops/handoffs/2026-09-13-document-revision-post-restart-final-snippet.md b/.doc/ops/handoffs/2026-09-13-document-revision-post-restart-final-snippet.md index 130e676a..f852cb38 100644 --- a/.doc/ops/handoffs/2026-09-13-document-revision-post-restart-final-snippet.md +++ b/.doc/ops/handoffs/2026-09-13-document-revision-post-restart-final-snippet.md @@ -1,61 +1,40 @@ --- -title: "post-restart 最终正文 snippet:编码后交接" +title: "post-restart 最终正文 snippet:Round20 后关闭" created: 2026-09-13 +updated: 2026-09-14 from: Cursor-Auto to: next-agent -status: open +status: done --- -# 交接:post-restart 最终正文 snippet(暂不合入) +# 交接:post-restart 最终正文 snippet(已验证) ## 目标(下一位 Agent 应完成什么) -- 不要改生产业务代码 -- 合入前占 CURRENT 集成槽位;禁止 merge / 重建容器 / 声称 post-restart 通过 -- 占槽后重跑 `UI_PHASE=post-restart`,断言应为 `A1-win-*` 而非 `UI06-*` +- 不要改删 `schema31-postrestart-stale-body-snippet-failure` +- 不要删除 post-restart `bodySnippet` 可见断言 +- 新 UI 轮次必须继续把 UI-13b A1 成功正文写入 phase-state ## 已完成 -- `durableBodySnippet` 纯函数:成功修订覆盖;冲突稿不入账 -- UI-13b 完成后与 UI-15-pre 同步 `phase-state.bodySnippet` -- post-restart 仍断言 `st.bodySnippet` 可见 +- `durableBodySnippet`:成功修订覆盖;冲突稿不入账 +- UI-13b / UI-15-pre 同步最终 marker +- Round20 post-restart:login / 项目 6159 / `revision-state` 200 / V3/r2 / `A1-win-mu0gwiez` ## 未完成 -- 真实 UI-15 post-restart -- 合入 `dev` +- 无(本缺陷) ## 认领 / 槽位状态 | 项 | 值 | |----|-----| -| mutex 已释放 | no(`document-revision-post-restart-final-snippet` 仍 `in_progress`) | -| 集成槽位 holder | 他人 e2e;本任务未占槽 | -| branch | `fix/document-revision-post-restart-final-snippet` | +| mutex 已释放 | yes | +| 集成槽位 holder | idle | +| branch | 已合入 `dev` | | worktree | - | -> 若 mutex 未释放,下一位须先在 CURRENT 认领或写 blocker。 - -## 关键文件 - -| 路径 | 说明 | -|------|------| -| `web/src/lib/durableBodySnippet.ts` | 持久正文状态链 | -| `web/e2e/document-revision-runtime.spec.ts` | UI-06 / UI-13b / UI-15-pre | - -## 如何验证 - -```bash -cd web && npm test && npm run build -``` - -## 风险 / Blocker - -- 不得改删 schema31 stale-body-snippet 归档 -- 不得删除 post-restart `bodySnippet` 可见断言 - ## 相关链接 -- CURRENT: [../CURRENT.md](../CURRENT.md) +- Test report: [../../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md](../../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md) - Task: [../short-term/2026-09-13-document-revision-post-restart-final-snippet.md](../short-term/2026-09-13-document-revision-post-restart-final-snippet.md) -- Checklist: [../checklists/2026-09-13-document-revision-post-restart-final-snippet.md](../checklists/2026-09-13-document-revision-post-restart-final-snippet.md) diff --git a/.doc/ops/short-term/2026-09-13-document-revision-pg-id-remap.md b/.doc/ops/short-term/2026-09-13-document-revision-pg-id-remap.md index b30a925c..4cdd311e 100644 --- a/.doc/ops/short-term/2026-09-13-document-revision-pg-id-remap.md +++ b/.doc/ops/short-term/2026-09-13-document-revision-pg-id-remap.md @@ -1,8 +1,8 @@ --- title: "文档账本 PG ID 与计数器重映射" -status: in_progress +status: done created: 2026-09-13 -updated: 2026-09-13 +updated: 2026-09-14 owner: Cursor-Auto branch: fix/document-revision-pg-id-remap worktree: "-" @@ -23,7 +23,7 @@ mutex: document-revision ## 非目标 -- 不 merge、不启停/重建容器、不跑/声称真实 UI E2E、不 push +- 本任务编码阶段不 merge / 不启停容器 / 不 push;Round20 验收见运行时 UI 报告 - 不删不改证据目录 - 不忽略 `ErrNotFound`,不伪造基线/报告 @@ -39,7 +39,7 @@ mutex: document-revision - [x] 占用 ID 不覆盖;adopt 只删同一对象 - [x] 高序列首次生成:自动提交、V2、candidate committed、baseline 未丢、重启 hydration -- [ ] 现场 UI-03(未跑) +- [x] 现场 UI-03:Round20 项目 6159 首次生成 V2/r0,任务 `run_1789343479579646533` 成功(相对 6158 candidate id=175 / output snapshot 250 的 not found) ## 相关链接 @@ -52,5 +52,6 @@ mutex: document-revision - 基线:`dev@fa6a033` - 验证:`gofmt`/`go vet` PASS;`go test -short ./...` PASS;隔离临时库 `HighSequenceFirstGen` PASS(拒绝 `agent_system_dev`,测完 DROP) -- 证据(只读):`.doc/test-reports/assets/2026-09-13-document-revision-runtime-ui/schema31-round19-ui03-advisor-briefing-docrevision-not-found/` -- **未跑真实 UI-03,不得标 done**;**不得 merge / 启停容器 / E2E / push** +- 失败归档(只读):`.doc/test-reports/assets/2026-09-13-document-revision-runtime-ui/schema31-round19-ui03-advisor-briefing-docrevision-not-found/` +- 验收:Round20 UI-03 PASS,见 [../../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md](../../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md) +- 工程修复已合入 `dev@b258ab8` diff --git a/.doc/ops/short-term/2026-09-13-document-revision-post-restart-final-snippet.md b/.doc/ops/short-term/2026-09-13-document-revision-post-restart-final-snippet.md index 1f9efbc5..c4f43ecb 100644 --- a/.doc/ops/short-term/2026-09-13-document-revision-post-restart-final-snippet.md +++ b/.doc/ops/short-term/2026-09-13-document-revision-post-restart-final-snippet.md @@ -1,8 +1,8 @@ --- title: "post-restart 期望正文须为最终持久 marker" -status: in_progress +status: done created: 2026-09-13 -updated: 2026-09-13 +updated: 2026-09-14 owner: Cursor-Auto branch: fix/document-revision-post-restart-final-snippet worktree: "-" @@ -25,7 +25,7 @@ mutex: document-revision-post-restart-final-snippet - 不改生产业务代码、不重跑真实 UI、不动容器、不 merge、不 push - 不改删 assets -- 不声称 post-restart / UI-15 通过 +- 不改删历史失败 assets;不声称全仓 `production_ready=yes` ## 步骤 @@ -34,13 +34,13 @@ mutex: document-revision-post-restart-final-snippet 3. [x] UI-13b 完成后与 UI-15-pre 写入最终 marker 4. [x] `npm test` / `npm run build` 5. [x] 原子提交 -6. [ ] 占槽后重跑 post-restart(本轮不做) +6. [x] Round20 `UI_PHASE=post-restart` PASS(V3/r2 / `A1-win-mu0gwiez`) ## 验收标准 - [x] 契约测试:A1 覆盖 UI06;A2 conflict 不覆盖 A1 - [x] post-restart 仍断言 `st.bodySnippet` 可见 -- [ ] 真实 UI-15 post-restart(未跑) +- [x] 真实 UI-15 post-restart:Round20 1 passed / 18 skipped;页面恢复 V3/r2/正文 ## 相关链接 @@ -51,6 +51,6 @@ mutex: document-revision-post-restart-final-snippet ## 证据 / 备注 - 基线:`dev@eb85b8a` -- 失败归档(只读):`.doc/test-reports/assets/2026-09-13-document-revision-runtime-ui/schema31-postrestart-stale-body-snippet-failure/` -- 现场 `phase-state`:`versionText=V3` `revisionText=r2` `bodySnippet=UI06-mu0eq020` -- **未跑真实 post-restart,不得标 done** +- 失败归档(只读):`.doc/test-reports/assets/2026-09-13-document-revision-runtime-ui/schema31-postrestart-stale-body-snippet-failure/`(当时 `bodySnippet=UI06-mu0eq020`) +- Round20 `phase-state`:`versionText=V3` `revisionText=r2` `bodySnippet=A1-win-mu0gwiez` +- 报告:[../../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md](../../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md) diff --git a/.doc/ops/short-term/2026-09-13-document-revision-runtime.md b/.doc/ops/short-term/2026-09-13-document-revision-runtime.md index 4d6ca355..55abd210 100644 --- a/.doc/ops/short-term/2026-09-13-document-revision-runtime.md +++ b/.doc/ops/short-term/2026-09-13-document-revision-runtime.md @@ -1,8 +1,8 @@ --- title: "文档版本账本运行时整改" -status: in_progress +status: done created: 2026-09-13 -updated: 2026-09-13 +updated: 2026-09-14 owner: Cursor-Auto branch: fix/document-revision-runtime-ui03 worktree: "-" @@ -42,8 +42,9 @@ mutex: docgov ## 验收标准 -- [x] 工程门禁与 UI 实战计划分栏;UI **本轮未执行** -- [x] 剩余 blocker(PI 叙事、orphan upload、UI E2E)写清且不可用假数据掩盖 +- [x] 工程门禁与 UI 实战计划分栏 +- [x] Round20 真实 UI **PASS**(见 [../../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md](../../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md)) +- [x] 剩余开放:PI 叙事仍为 fallback;orphan 禁止假 V1(UI-16 验证已注册路径);不可用假数据掩盖 ## 相关链接 @@ -91,15 +92,15 @@ UI-01/02 访问与成员落库门禁(2026-09-13):`go test ./internal/proje ### 用户 UI 实战验收 -见扩展 checklist(UI-01…UI-16)。Antigravity:UI-00/01/02 PASS;UI-03 FAIL(客户端未 sync + 选择器 + DB chk)→ 工程修复已落本分支,待重跑。 +Round20 **PASS**。见 [checklist](../checklists/2026-09-13-document-revision-runtime-ui-acceptance.md) 与 [test-report](../../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md)。项目 6159;UI-03 V2/r0;终态 V3/r2;post-restart 恢复最终正文 `A1-win-mu0gwiez`。 ### Blockers -- **DOCREV-RT-PI-NARRATIVE**:真实 PI 业务叙事摘要/风险解释(确定性 fallback 已可见,不得宣称为完整 PI) -- **DOCREV-RT-UPLOAD-ORPHAN**:仅 IndexedDB 上传、无服务端正文 → 禁止假 V1 -- **DOCREV-RT-UI-E2E**:需占集成槽 + 真实小队 + `npm run test:ui-acceptance` 无头 Playwright 实录(含 UI-03 重验) -- **DOCREV-RT-SCHEMA30-VOLUME**:goose 00030 对既有重复 `(session,client_turn)` / NULL idempotency 卷的迁移由合入前独立验证 -- **DOCREV-RT-USER-DIR-CROSS-DEVICE**:立项 `availableUsers` 仍依赖本机 `allUsers`/localStorage;非 admin 无成员目录 API;跨设备/新浏览器可能仍缺 B(见 [../../audit/2026-09-13-admin-user-directory-sync-ui01.md](../../audit/2026-09-13-admin-user-directory-sync-ui01.md)) +- **DOCREV-RT-PI-NARRATIVE**(仍开放):真实 PI 业务叙事摘要/风险解释未替代确定性 fallback;Round20 已可见 fallback 字段,不得宣称为完整 PI +- **DOCREV-RT-UPLOAD-ORPHAN**(约束仍在,UI-16 PASS):仅 IndexedDB、无服务端正文 → 禁止假 V1 +- **DOCREV-RT-UI-E2E**:**PASS**(Round20) +- **DOCREV-RT-SCHEMA30-VOLUME**:goose 00030 对既有重复卷的迁移仍属合入前独立验证残留 +- **DOCREV-RT-USER-DIR-CROSS-DEVICE**:跨设备/新浏览器可能仍缺成员候选(本轮同浏览器未暴露) ### Commits(历史) diff --git a/.doc/ops/short-term/2026-09-14-document-revision-runtime-ui-final-report.md b/.doc/ops/short-term/2026-09-14-document-revision-runtime-ui-final-report.md new file mode 100644 index 00000000..704a4b64 --- /dev/null +++ b/.doc/ops/short-term/2026-09-14-document-revision-runtime-ui-final-report.md @@ -0,0 +1,45 @@ +--- +title: "文档账本运行时 UI 最终报告收口" +status: done +created: 2026-09-14 +updated: 2026-09-14 +owner: Cursor-Auto +branch: docs/document-revision-runtime-ui-final-report +worktree: "-" +mutex: document-revision-runtime-ui +--- + +# 文档账本运行时 UI 最终报告收口 + +## 目标 + +在 `dev@b258ab8` 上只写文档,把 Round20 真实 UI 验收收口为 test-report,并释放运行时集成槽。 + +## 范围 + +- `.doc/test-reports/2026-09-14-document-revision-runtime-ui-test-report.md` +- management report、UI checklist、runtime / PG-id 文档、FEATURE-MATRIX、gap-matrix、CURRENT + +## 非目标 + +- 不改业务代码、不跑容器、不 push、不提交 assets +- 不引用 `phase-secrets.local.json` 内容 +- 不把全仓标 `production_ready=yes` + +## 步骤 + +1. [x] 从 `dev@b258ab8` 开 `docs/document-revision-runtime-ui-final-report` +2. [x] 按 results JSON 写 Input/Actual/Verdict/Duration +3. [x] 同步任务文档并释放集成槽 +4. [x] 原子 docs commit + +## 验收标准 + +- [x] 运行时范围 PASS/done +- [x] `production_ready` 仍为 no;`CHAT-INTENT` 保留 +- [x] 历史失败资产未改删 + +## 相关链接 + +- Test report: [../../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md](../../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md) +- Checklist: [../checklists/2026-09-13-document-revision-runtime-ui-acceptance.md](../checklists/2026-09-13-document-revision-runtime-ui-acceptance.md) diff --git a/.doc/remediation/2026-09-13-document-revision-pg-id-remap.md b/.doc/remediation/2026-09-13-document-revision-pg-id-remap.md index 43a7378c..a3b9649f 100644 --- a/.doc/remediation/2026-09-13-document-revision-pg-id-remap.md +++ b/.doc/remediation/2026-09-13-document-revision-pg-id-remap.md @@ -1,8 +1,8 @@ --- title: "同步 PG 返回 ID 与进程内计数器" -status: in_progress +status: done created: 2026-09-13 -updated: 2026-09-13 +updated: 2026-09-14 --- # 同步 PG 返回 ID 与进程内计数器 @@ -22,13 +22,13 @@ updated: 2026-09-13 | 波次 | 内容 | 验收 | |------|------|------| | Wave 0 | 统一 ID helper + 首次生成/多文档/重启 hydration 回归 | `gofmt` / `go vet` / `go test -short`;隔离 PG 碰撞用例 | -| Wave 1 | 占槽重跑真实 UI-03(本轮不做) | 任务成功且 V2/head 可见 | +| Wave 1 | 占槽重跑真实 UI-03 | Round20:6159 首次生成 V2/r0 PASS | ## 验收标准 - [x] 纯函数:占用 ID 跳过;adopt 不删其它对象 - [x] PG:高序列首次生成自动提交、V2/head、candidate committed、seed baseline 未丢、新 Service hydration -- [ ] 真实 UI-03(本轮不做) +- [x] 真实 UI-03:Round20 PASS(见 [../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md)) ## 相关链接 diff --git a/.doc/remediation/2026-09-13-document-revision-runtime-remediation.md b/.doc/remediation/2026-09-13-document-revision-runtime-remediation.md index 40bd887d..5bb3f491 100644 --- a/.doc/remediation/2026-09-13-document-revision-runtime-remediation.md +++ b/.doc/remediation/2026-09-13-document-revision-runtime-remediation.md @@ -1,8 +1,8 @@ --- title: "文档版本账本运行时持久化与修订链路整改" -status: in_progress +status: done created: 2026-09-13 -updated: 2026-09-13 +updated: 2026-09-14 --- # 文档版本账本运行时持久化与修订链路整改 @@ -43,10 +43,11 @@ Wave0–6 已合入 `dev` 并完成 schema 00028,但 ledger **未持久化** ## 验收标准 -- [x] `go vet ./...` 与 `go test -short ./...`(含 materialize / PATCH 顺序 / 授权)PASS(见 short-term 证据;每轮提交前复核) -- [x] 前端 vitest + `npm run build` PASS(见 short-term 证据) -- [x] 代码停在 `fix/document-revision-runtime`,**不**占集成槽、不 rebuild docker、不 push -- [x] UI 实战计划已扩展并与工程门禁分栏;**实战未跑**(待占槽) +- [x] `go vet ./...` 与 `go test -short ./...` PASS +- [x] 前端 vitest + `npm run build` PASS +- [x] UI 实战计划与工程门禁分栏 +- [x] Round20 真实 UI **PASS**:[../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md) +- [x] `DOCREV-RT-PI-NARRATIVE` 仍开放(fallback 可见,不冒充 PI);全仓 `production_ready=no` ## 相关链接 diff --git a/.doc/remediation/gap-matrix.md b/.doc/remediation/gap-matrix.md index b2834583..69093065 100644 --- a/.doc/remediation/gap-matrix.md +++ b/.doc/remediation/gap-matrix.md @@ -1,8 +1,8 @@ # 整改缺口复核矩阵(SSOT) -**更新**: 2026-09-13 +**更新**: 2026-09-14 **分支**: dev -**production_ready**: no(对话刷新恢复缺陷、CI 真实 PI E2E / 前端人工抽检未完成;main 本地冒烟已通过) +**production_ready**: no(`CHAT-INTENT-STATE` 等无关 blocker、CI 真实 PI 三工作流 E2E / 前端人工抽检未完成;文档账本运行时 UI Round20 已 PASS,不把 fallback 报告当成完整 PI) **协作焦点**: [../ops/CURRENT.md](../ops/CURRENT.md) **Agent 手册**: [AGENTS.md](../AGENTS.md) · [PROJECT.md](../PROJECT.md) @@ -60,13 +60,13 @@ | 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` | -| DOCREV-RUNTIME-404 | revision-state 404;账本内存丢失;块保存/overlay 无效;agent 假报告 | **FAIL** | [audit](../audit/2026-09-13-document-revision-runtime-404.md);`internal/docrevision/service.go` 仅 map | [remediation](./2026-09-13-document-revision-runtime-remediation.md) | -| DOCREV-PG-ID-REMAP | 首次生成 PG 已写 snapshot/candidate,commit 因内存误删 baseline 而 not found | **FIX-LANDED**(工程) | [audit](../audit/2026-09-13-document-revision-pg-id-remap.md);证据 `schema31-round19-ui03-advisor-briefing-docrevision-not-found`;`fix/document-revision-pg-id-remap` | 占槽真实 UI-03 重跑;不忽略 ErrNotFound;不删证据 | -| DOCREV-UI03-CLIENT-SYNC | 小队完成后右栏仍模板;UI-03 选择器误命中 Banner;`pending_author_confirmation` 撞 chk;重试重复建 run | **FIX-LANDED**(工程) | [audit](../audit/2026-09-13-controlled-doc-client-sync-ui03.md);分支 `fix/document-revision-runtime-ui03`:post-task sync、templateMatch intake 优先、goose 00030、Claim+idempotency | 合入前:schema30 **真实现卷**迁移独立验证;占槽真实 UI-03 重跑;勿把 stub 当验收 | -| DOCREV-SSE-IDEM-BUSY | SSE WriteTimeout 断线后同 turn 再 POST 误 409 DOC_BUSY + 重复聊天 | **FIX-LANDED**(工程) | [audit](../audit/2026-09-13-document-revision-sse-idempotency.md);证据 [assets/2026-09-13-document-revision-runtime-ui](../test-reports/assets/2026-09-13-document-revision-runtime-ui/);`fix/document-revision-sse-idempotency` | 占槽真实 UI-03 重跑;不删证据 | -| DOCREV-QUALITY-SELF-POLLUTE | 自检表引用禁词致 score=40 quality_failed;auto_repair 未启用;UI 映射 completed | **FIX-LANDED**(工程) | [audit](../audit/2026-09-13-document-revision-quality-gate-self-pollution.md);workspace `intake_1789308825666278807` output.md:204;同分支 | 占槽真实重跑;不删证据 | -| DOCREV-ACTIVE-DOC-ROUTING | UI-05「当前受控文档」被法规关键词改路由到 `feasibility_reg`,intake 无 pending | **FIX-LANDED**(工程) | [audit](../audit/2026-09-13-document-revision-active-doc-routing.md);证据 `schema30-ui05-active-doc-routing-failure`;`fix/document-revision-active-doc-routing` | 占槽真实 UI-05 重跑;**不改弱 E2E**;不删证据 | -| DOCREV-QUALITY-STATUS-FP | 行动计划表状态列「待续」被门禁当敷衍,两轮 repair 后 quality_failed 80 | **FIX-LANDED**(工程) | [audit](../audit/2026-09-13-document-revision-quality-status-false-positive.md);证据 `schema30-ui03-quality-status-false-positive`;`fix/document-revision-quality-context` | 占槽真实 UI-03 重跑;**不删禁词、不放宽正文**;不删证据 | +| DOCREV-RUNTIME-404 | revision-state 404;账本内存丢失;块保存/overlay 无效;agent 假报告 | **PASS** | [Round20 报告](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md);[audit](../audit/2026-09-13-document-revision-runtime-404.md) | 运行时 UI 已闭环。change report 仍为 fallback,不冒充 PI。历史失败目录不删 | +| DOCREV-PG-ID-REMAP | 首次生成 PG 已写 snapshot/candidate,commit 因内存误删 baseline 而 not found | **PASS** | [audit](../audit/2026-09-13-document-revision-pg-id-remap.md);Round19 归档 `schema31-round19-ui03-advisor-briefing-docrevision-not-found`(candidate id=175 / output snapshot 250,禁止写成 candidate 250);Round20 UI-03 V2/r0 | 已合入 `dev@b258ab8`;不忽略 ErrNotFound;不删证据 | +| DOCREV-UI03-CLIENT-SYNC | 小队完成后右栏仍模板;UI-03 选择器误命中 Banner;`pending_author_confirmation` 撞 chk;重试重复建 run | **PASS** | [audit](../audit/2026-09-13-controlled-doc-client-sync-ui03.md);Round20 UI-03 | 历史失败不删;勿把 stub 当验收 | +| DOCREV-SSE-IDEM-BUSY | SSE WriteTimeout 断线后同 turn 再 POST 误 409 DOC_BUSY + 重复聊天 | **PASS** | [audit](../audit/2026-09-13-document-revision-sse-idempotency.md);Round20 真实小队 202 | 不删证据 | +| DOCREV-QUALITY-SELF-POLLUTE | 自检表引用禁词致 score=40 quality_failed;auto_repair 未启用;UI 映射 completed | **PASS** | [audit](../audit/2026-09-13-document-revision-quality-gate-self-pollution.md);Round20 UI-03 完成 | 不删证据;不删禁词 | +| DOCREV-ACTIVE-DOC-ROUTING | UI-05「当前受控文档」被法规关键词改路由到 `feasibility_reg`,intake 无 pending | **PASS** | [audit](../audit/2026-09-13-document-revision-active-doc-routing.md);Round20 UI-05 pending 停在 intake V2 | **不改弱 E2E**;不删证据 | +| DOCREV-QUALITY-STATUS-FP | 行动计划表状态列「待续」被门禁当敷衍,两轮 repair 后 quality_failed 80 | **PASS** | [audit](../audit/2026-09-13-document-revision-quality-status-false-positive.md);Round20 UI-03 | **不删禁词、不放宽正文**;不删证据 | --- @@ -84,4 +84,4 @@ □ 前端:版本冲突刷新、终止 preview 人工抽检 ``` -**结论**: P0 授权、冷启动序列、Go 门禁、三环境本地冒烟已闭环;新增现场缺陷 `CHAT-HISTORY-REFRESH`。**发布 blocker 包括对话刷新恢复、CI 真实 PI E2E 与前端人工抽检**。 +**结论**: 文档账本运行时真实 UI Round20 **PASS**(见 [test-report](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md))。**发布 blocker 仍包括 `CHAT-INTENT-STATE`、CI 真实 PI 三工作流 E2E 与前端人工抽检**;`-race` 全包并行 TempDir flake 为测试基建残留。不得把 fallback change report 写成完整 PI 叙事。 diff --git a/.doc/status/FEATURE-MATRIX.md b/.doc/status/FEATURE-MATRIX.md index e360f6b3..35786925 100644 --- a/.doc/status/FEATURE-MATRIX.md +++ b/.doc/status/FEATURE-MATRIX.md @@ -1,6 +1,6 @@ # 模块与功能完成度(SSOT) -**更新**: 2026-09-13 +**更新**: 2026-09-14 **production_ready**: no **发布缺口**: [../remediation/gap-matrix.md](../remediation/gap-matrix.md) **协作焦点**: [../ops/CURRENT.md](../ops/CURRENT.md) @@ -21,11 +21,11 @@ | 工作流治理 | 三正式工作流 + 阶段门禁 | 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` | | 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 2026-09-13](../test-reports/2026-09-13-document-revision-management-test-report.md);[运行时审计](../audit/2026-09-13-document-revision-runtime-404.md);[PG ID 重映射](../audit/2026-09-13-document-revision-pg-id-remap.md);[ADR](../adr/2026-09-13-document-version-boundary.md) | **运行时 blocker**:首次生成 PG ID 未同步计数器会误删 baseline(工程修复在 `fix/document-revision-pg-id-remap`,未 UI 验收);overlay/freeform 保存缺口;见 [runtime remediation](../remediation/2026-09-13-document-revision-runtime-remediation.md) | `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` | | 三环境运维 | dev/test/main + 共享 KB | done | [PROJECT.md](../../PROJECT.md) §4;四环境 healthy | — | `infra` | -| CI / E2E | PG 集成 + 真实 PI E2E | partial | [gap-matrix BUG-08](../remediation/gap-matrix.md);[test pg-ci](../test-reports/2026-09-12-pg-ci-soak-e2e-test-report.md);[UI-13a reviewer 职责同步](../audit/2026-09-13-document-revision-reviewer-duty-sync.md) | CI `TEST_DATABASE_URL` 隔离库;post-restart 须断言最终持久正文(A1 覆盖 UI06,冲突稿不入账);产物与结果 JSON 按 UI_PHASE 分文件 | `ci` | +| CI / E2E | PG 集成 + 真实 PI E2E | partial | [gap-matrix BUG-08](../remediation/gap-matrix.md);[test pg-ci](../test-reports/2026-09-12-pg-ci-soak-e2e-test-report.md);[运行时 UI Round20](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md) | CI `TEST_DATABASE_URL` 隔离库仍缺;文档运行时真实 UI 已按 UI_PHASE 分文件且 post-restart 断言最终 A1 正文。`-race` 全包并行 TempDir flake 为基建残留 | `ci` | --- diff --git a/.doc/test-reports/2026-09-13-document-revision-management-test-report.md b/.doc/test-reports/2026-09-13-document-revision-management-test-report.md index 9f896477..ef56c00c 100644 --- a/.doc/test-reports/2026-09-13-document-revision-management-test-report.md +++ b/.doc/test-reports/2026-09-13-document-revision-management-test-report.md @@ -17,7 +17,7 @@ - OS: Linux;Go 1.27;内存 ledger(`-short`)+ 契约 fixture - 层级:Go unit/contract(`internal/docrevision`)、freedoc 回归、bizdev 编译链接 -- 真实 PI / Playwright 全链路:需在占集成槽位后对 `agent-dev` 补录(见后续证据目录) +- 真实 PI / Playwright 全链路:Round20 已在官方 Playwright 1.63.0 noble 容器补录,见 [2026-09-14-document-revision-runtime-ui-test-report.md](./2026-09-14-document-revision-runtime-ui-test-report.md) ## 四、 预期结果 (Expected Results) @@ -48,9 +48,10 @@ ok chat-agent-system/internal/docrevision ## 六、 自动化测试套件汇总 (Test Suite Execution) -本波次聚焦 DOCREV 相关包短测。全量 `go test -short ./...` 与真实 PI E2E 在合入 `dev` 占集成槽位时执行并追加本报告附件。 +本波次聚焦 DOCREV 相关包短测。全量 `go test -short ./...` 与真实 PI 页面 E2E 已在 Round20 收口,见 [运行时 UI 报告](./2026-09-14-document-revision-runtime-ui-test-report.md)(证据在 `assets/2026-09-13-document-revision-runtime-ui/`,本文件不重贴口令或 assets)。 ## 七、 测试结论与后续优化建议 (Conclusion & Next Steps) -- 内核、API、前端工具条与自由文档兼容已合入 feature 分支;FEATURE-MATRIX 标 `partial→` 本轮完成后更新为 done(能力代码齐,生产灰度与真实 PI 补录仍建议在集成槽位完成)。 -- 后续:影子写 flag 灰度、`TEST_DATABASE_URL` 迁移 00028 集成测、Playwright 双用户冲突与真实 PI change_report 验收。 +- 内核、API、前端工具条与自由文档兼容已合入;Round20 真实页面验收 **PASS**(项目 6159,终态 V3/r2 / `A1-win-mu0gwiez`)。 +- 模块仍标 `partial`:change report 为 `analysis_status=fallback`(真实 diff+lineage,不是完整 PI 叙事);全仓 `production_ready=no`(`CHAT-INTENT` 等无关 blocker)。 +- 后续:PI 叙事报告链路、CI `TEST_DATABASE_URL`、`-race` 全包 TempDir 基建。 diff --git a/.doc/test-reports/2026-09-14-document-revision-runtime-ui-test-report.md b/.doc/test-reports/2026-09-14-document-revision-runtime-ui-test-report.md new file mode 100644 index 00000000..064f48e7 --- /dev/null +++ b/.doc/test-reports/2026-09-14-document-revision-runtime-ui-test-report.md @@ -0,0 +1,336 @@ +# 文档版本账本运行时 UI 验收测试报告 + +**轮次**: Round20 +**日期**: 2026-09-14 +**判定(文档运行时范围)**: **PASS** +**整个系统 `production_ready`**: **no**(保留 `CHAT-INTENT` 等无关 blocker;本报告不把运行时 PASS 写成全仓可发布) + +> 证据只读根:`.doc/test-reports/assets/2026-09-13-document-revision-runtime-ui/` +> 本报告**不引用**本地 `phase-secrets.local.json` 的任何字段或内容;该文件不得提交。 +> 历史失败目录(`schema30-*` / `schema31-*` / `ui0*` 等)**只增不删**,不改写。 + +## 一、 测试背景 (Background) + +Wave 0–6 账本内核合入后,真实工作台仍表现为「账本未就绪」、保存无效、overlay 空转、变更报告是静态假 JSON。后续工程修复覆盖: + +1. 假 `doc-upload` / 模板槽误挂工具条,受控文档不同步; +2. 账本只在进程内 map,未 PG 持久化、GET 无 bootstrap; +3. 保存 ETag / hydration / 投影顺序错误; +4. overlay 未接到块样式; +5. 任务 SSE 断线后同 turn 409、路由被法规关键词带偏、质量门禁自污染; +6. 职责授权:reviewer 未写入 `document_records`、矩阵误判; +7. 最终:PG `RETURNING id` 未推进内存计数器,临时 ID 撞上 baseline 后无条件 `delete`,`CommitAgentVersion` `docrevision: not found`(项目 6158:baseline snapshot=249、**candidate id=175**、**output snapshot id=250**、**report id=175**,禁止把 250 写成 candidate)。 + +第 19 轮因此在首次生成失败。第 18 轮后 post-restart 曾因 `phase-state.bodySnippet` 仍是 UI-06 marker,而 UI-13b A1 已把最终正文写成 A1-win marker。Round20 在 `dev@b258ab8`(已含 PG ID remap 与最终持久 snippet)上重跑真实页面验收。 + +## 二、 测试目标 (Test Objectives) + +- 页面-only、无 API/DB fixture / `page.route` mock / stub 模型,真实 `pi-agent` + MiniMax; +- UI-00…UI-16(含 05a/05b、13a/13b、15-pre/15)全部页面可见且可判定; +- 高风险 pending:确认升 V、拒绝不升;人工保存升 r 且硬刷新保留;三 overlay 可区分(仅人工时 manual===all 允许); +- 多文档与页面上传独立账本;C 隔离;B reviewer 只读;A/A 409 保留冲突稿;重登/重启恢复最终持久正文; +- 诚实区分:正文与对话回复来自真实 PI;change report `analysis_status=fallback` 是真实 diff + lineage 的确定性分析,**不冒充 PI 叙事**。 + +## 三、 测试方案与环境 (Test Plan & Environment) + +| 项 | 值 | +|----|-----| +| OS | Ubuntu Server(无图形桌面 / headless) | +| 浏览器 | 官方 Playwright **1.63.0 noble** 容器;页面-only Chromium | +| 服务 | 官方 app 容器(本轮文档收口不重建、不启停) | +| Agent | 真实 PI,禁止 stub | +| 项目 | `UI验收-超声微创系统-mu0gwiez`(id **6159**) | +| 首份受控文档 | `doc_proj6159_intake`(用户初始需求收集表) | +| 首轮任务 | `run_1789343479579646533` | +| 第二份受控文档 | `doc_proj6159_prelim_design` | +| 页面上传 | `doc-free-1789344210423570738-182` | +| 账号(仅用户名,无口令) | A=`uia_mu0gwiez` B=`uib_mu0gwiez` C=`uic_mu0gwiez` | +| 终态 phase-state | `V3` / `r2` / `bodySnippet=A1-win-mu0gwiez` | +| 结果账本 | `ui-acceptance-results.json` **21** 条全部 PASS | +| Playwright main | **18 passed / 1 post skipped** | +| Playwright post | 仅 restart app 后 **1 passed / 18 skipped** | + +### 3.1 Ubuntu 无头方案 + +**本轮采用**:官方 Playwright 1.63.0 noble 容器跑 `web/e2e/document-revision-runtime.spec.ts`。宿主机**不必**安装 Chromium / 系统 so 库;也不必在宿主 `npx playwright install`。 + +**备选(未作为本轮执行路径)**:在 `web/` 执行 `npx playwright install --with-deps chromium`,仅当不能跑官方容器时使用。 + +两阶段(脚本不碰 docker;宿主只 restart app 一次): + +1. `RUN_UI_ACCEPTANCE=1 UI_PHASE=main` → `playwright-output-main` / `playwright-report-main` / `ui-acceptance-results.json` / `phase-state.json` +2. 宿主 restart **app**(不是整套 rebuild) +3. `RUN_UI_ACCEPTANCE=1 UI_PHASE=post-restart` → `playwright-output-post-restart` / `playwright-report-post-restart` / `ui-acceptance-results-post-restart.json` + +### 3.2 用例矩阵与决策流 + +| 决策 | 期望 | +|------|------| +| 高风险候选「确认提交」 | pending 消失,版本前进(本轮 V2→V3) | +| 高风险候选「拒绝」 | pending 消失,版本不前进(本轮保持 V3) | +| 人工保存成功 | `r` 立即 +1,硬刷新正文仍在 | +| A/A 同 r 后写 | `409 DOCUMENT_HEAD_CONFLICT`,后写编辑器保留草稿,成功方正文成为最终持久 marker | + +**三 overlay 语义(本轮实测)**: + +- **纯净阅读**:块无变更标记。Round20 抽样 92 块均为 `backgroundColor=rgba(0,0,0,0)`、`overlayKind` 空。 +- **人工修改**:相对**当前 Version** 的人工修订(琥珀底)。本轮 92 块带 `modify`/`move`,底色 `rgb(51, 41, 15)`。 +- **全部变更**:智能体差异 + 人工差异。本轮另含 `insert`,与「人工」可区分。 +- **仅人工时**:若 hunk 集合相同,允许 manual 与 all 视觉相同;不得因此判 FAIL。 + +### 3.3 证据清单(只读,不提交本报告附件目录) + +| 类型 | 路径 | +|------|------| +| main 结果 | `.../ui-acceptance-results.json`(21 PASS) | +| post 结果 | `.../ui-acceptance-results-post-restart.json`(UI-15 PASS) | +| 阶段状态 | `.../phase-state.json`(无口令) | +| 截图 | `.../screenshots/`(21 张 PNG) | +| 分离产物 | `playwright-output-main/`、`playwright-output-post-restart/`、`playwright-report-main/`、`playwright-report-post-restart/`(trace/video/html) | +| 历史失败 | 同根下 `schema30-*`、`schema31-*`、`ui0*`、`pre-auth-*`、`post-auth-*` 等 | + +## 四、 预期结果 (Expected Results) + +- 首轮真实小队完成后,intake 工具条 `V2/r0`,非「账本未就绪」; +- 变更报告面板可见风险、项目影响、文档影响原因/建议、开放问题;`fallback` 不得写成完整 PI; +- 二轮高风险:未确认保持 V2 + pending;确认后 V3;再一轮拒绝保持 V3; +- 人工保存 r0→r1 且硬刷新保留;UI-13b A1 成功后最终正文 `A1-win-mu0gwiez`、r2; +- 第二文档 `doc_proj6159_prelim_design` 与上传 `doc-free-*` 各自 revision-state 200; +- C 看不到项目;B 为 reviewer、无正文编辑/保存; +- 重登与 restart 后仍为 V3/r2/最终正文,`revision-state` / `versions` / `manual-overlay` / `content` 200。 + +## 五、 实际测试结果与判定 (Actual Results & Evaluation) + +下列 Input / Actual 摘自 `ui-acceptance-results.json` 与 post JSON,**不是**事后改写。Duration 为结果账本 `durationMs`。 + +### UI-00 管理员开通 A/B/C + +- **测试输入 (Input)**:admin UI 创建用户并完成首次口令重置(口令不入库、不写入本报告)。 +- **实际输出 (Actual Output)**:`users uia_mu0gwiez,uib_mu0gwiez,uic_mu0gwiez ready`。 +- **评价判定 (Evaluation / Verdict)**:PASS +- **性能与耗时 (Duration & Latency)**:6684 ms +- **截图**:`screenshots/UI-00-admin-logged-in.png` + +### UI-01 页面创建立项工作台 + +- **Input**:A 登录;创建项目 `UI验收-超声微创系统-mu0gwiez`;勾选成员 B。 +- **Actual Output**:模板提示可见;`doc-p` revision-state 计数=0;无 revision-state 404。 +- **Verdict**:PASS +- **Duration**:1121 ms +- **截图**:`screenshots/01-project.png` + +### UI-02 真实小队发任务 + +- **Input**:`请基于本项目编制首轮《用户需求》摸底文档,覆盖预期用途、关键性能与适用法规框架,直接生成受控交付物。` +- **Actual Output**:`POST /api/v1/tasks/runs` **202**;本轮助手 inflight。run=`run_1789343479579646533`。 +- **Verdict**:PASS(真实 PI 请求,非 stub) +- **Duration**:235 ms +- **截图**:`screenshots/UI-02-squad-started.png` + +### UI-03 首份受控文档账本 + +- **Input**:等待小队完成;打开 intake 服务端文档槽。 +- **Actual Output**:工具条 **V2/r0**;`docId=doc_proj6159_intake`;标题「用户初始需求收集表」。`GET .../revision-state|versions|manual-overlay` 与 `GET .../docgov/.../content` 均为 **200**。 +- **Verdict**:PASS(相对 Round19 `CommitAgentVersion` not found:本轮首次生成成功) +- **Duration**:188989 ms +- **截图**:`screenshots/03-first-doc.png` + +### UI-04 变更报告完整字段 + +- **Input**:点击「变更报告」;点「关闭」。 +- **Actual Output**:页面可见风险 / 项目影响 / 文档影响 / 开放问题;对话框关闭。`GET /api/v1/documents/doc_proj6159_intake/change-reports/182` **200**。 +- **Verdict**:PASS +- **Duration**:218 ms +- **诚实声明**:报告字段来自确定性 diff + lineage(`analysis_status=fallback`)。**不是**完整 PI 业务叙事;不得把可见摘要写成「PI 已完成风险解释」。 +- **截图**:`screenshots/04-first-report.png` + +### UI-05 高风险 pending(确认用例) + +- **Input**:`请按 YY/T、GB 9706.1 与 NMPA 注册法规要求,大幅改写当前受控文档中的风险管理与电气安全章节,引用具体条款并重写适用性结论(二轮高风险候选-确认用例)。` +- **Actual Output**:pending 徽章;版本仍为 **V2**。`POST /api/v1/tasks/runs` 202(run=`run_1789343671958285314`)。 +- **Verdict**:PASS(高风险未确认不进版本历史) +- **Duration**:180437 ms +- **截图**:`screenshots/05-second-report.png` + +### UI-05a 确认提交升 V3 + +- **Input**:点「待确认报告」;断言 pending 动作;点「确认提交」。 +- **Actual Output**:`risk=high`;decision ok;版本 **V3**。`GET change-reports/183` 200;`POST .../agent-candidates/183/decision` 200。 +- **Verdict**:PASS +- **Duration**:268 ms +- **截图**:`screenshots/UI-05a-confirmed.png` + +### UI-05b 拒绝不升版本 + +- **Input**:`请再次按医疗器械临床试验与注册检验法规,重写当前受控文档《用户初始需求收集表》中的电磁兼容与软件生存周期章节并给出条款级符合性判断(二轮高风险候选-拒绝用例)。`;点「待确认报告」;点「拒绝」。 +- **Actual Output**:`task_key=intake doc_id=doc_proj6159_intake`;rejected;版本仍为 **V3**。`GET change-reports/184` 200;`POST .../agent-candidates/184/decision` 200。 +- **Verdict**:PASS +- **Duration**:169617 ms +- **截图**:`screenshots/UI-05b-rejected.png` + +### UI-06 人工保存 + 硬刷新 + +- **Input**:双击块编辑 → 保存 → reload。 +- **Actual Output**:`r` **r0→r1**;marker 持久化。`PATCH .../content` 200。 +- **Verdict**:PASS +- **Duration**:1048 ms +- **截图**:`screenshots/UI-06-after-refresh.png` +- **后续覆盖**:此 marker 不是最终持久正文;UI-13b A1 成功后覆盖为 `A1-win-mu0gwiez`。 + +### UI-07 / UI-08 / UI-09 三 overlay + +三条结果键共享同一次取样(各记 2417 ms)。 + +- **Input**:切换纯净 / 人工 / 全部;抽样 `document-block` 计算样式。 +- **Actual Output**:`pure unmarked; manual/all marked; manual===all allowed when hunks match`。 + - 纯净:92/92 无标记; + - 人工:92/92 `modify|move`; + - 全部:92/92,额外出现 `insert`(本轮与人工可区分)。 +- **Verdict**:PASS / PASS / PASS +- **Duration**:2417 ms(共享) +- **截图**:`UI-07-pure.png`、`UI-08-manual.png`、`UI-09-all.png` + +### UI-10 版本历史比较 V1/V2 + +- **Input**:打开「版本历史」;选两个 V 为 A/B;点「比较 A/B」;历史自动关闭后再关比较。 +- **Actual Output**:`history entries=3; compared V1 vs V2; history auto-closed; compare closed`。`GET .../diff` 200。 +- **Verdict**:PASS +- **Duration**:441 ms +- **截图**:`screenshots/UI-10-history-compare.png` + +### UI-11 第二文档 + 页面上传 + +- **Input**:对话生成第二份受控文档;页面上传附件并发送以注册 freeform。 +- **Actual Output**:`用户初始需求收集表:V3/r1`;`系统初步设计方案:V2/r0`(`doc_proj6159_prelim_design`);`POST /api/v1/freeform-documents` **201**;`uploadedDocId=doc-free-1789344210423570738-182`。两份受控 + 上传的 revision-state/versions 200。 +- **Verdict**:PASS +- **Duration**:178358 ms +- **截图**:`screenshots/UI-11-multi-doc.png` + +### UI-12 C 隔离 + +- **Input**:登录 `uic_mu0gwiez`(非成员)。 +- **Actual Output**:项目 `UI验收-超声微创系统-mu0gwiez` 不可见。 +- **Verdict**:PASS(不泄漏正文) +- **Duration**:1278 ms +- **截图**:`screenshots/12-unauthorized-access.png` + +### UI-13a B reviewer 只读 + +- **Input**:B 登录;打开 intake;看权限矩阵并双击。 +- **Actual Output**:`duty=reviewer`;无编制人编辑提示;无保存编辑器。 +- **Verdict**:PASS +- **Duration**:1999 ms +- **截图**:`screenshots/UI-13a-reviewer-readonly.png` + +### UI-13b A/A 409 草稿保留 + +- **Input**:双窗同一 r/etag hydration;A2 先打开编辑器并填稿,A1 再保存,然后 A2 保存。 +- **Actual Output**:`base r=r1 etag=261:1`;A1 持久正文 **A1-win-mu0gwiez**;A2 `HTTP 409` `code=DOCUMENT_HEAD_CONFLICT`;A2 编辑器保留冲突稿。A1 `PATCH .../content` 200。 +- **Verdict**:PASS(冲突失败稿不得成为 phase-state 期望正文) +- **Duration**:2640 ms +- **截图**:`screenshots/UI-13b-conflict-A2.png` + +### UI-13 组合键 + +- **Input**:先 13a 再 13b。 +- **Actual Output**:`see UI-13a and UI-13b`;备注:B 是项目 reviewer,不得当正文编辑者。 +- **Verdict**:PASS +- **Duration**:2644 ms + +### UI-14 退出后重登 + +- **Input**:点「退出当前登录」;再以 A 登录。 +- **Actual Output**:账本 **V3/r2** 未变。`revision-state` 200。 +- **Verdict**:PASS +- **Duration**:1357 ms +- **截图**:`screenshots/UI-14-relogin.png` + +### UI-15-pre 重启前落盘 + +- **Input**:采集项目/状态后结束 main suite。 +- **Actual Output**:`state file written version=V3 revision=r2`。phase-state `bodySnippet=A1-win-mu0gwiez`(UI-13b 成功修订覆盖 UI-06 marker)。 +- **Verdict**:PASS +- **Duration**:74 ms +- **截图**:`screenshots/UI-15-pre-restart-evidence.png` +- **备注**:完整 UI-15 只在 `UI_PHASE=post-restart` 计 PASS。 + +### UI-16 已注册上传挂账本 + +- **Input**:分类=私密;打开精确 id `doc-free-1789344210423570738-182`。 +- **Actual Output**:pane 即该 id;工具条 V 可见;**无** `doc-upload` revision-state。 +- **Verdict**:PASS(禁止静默假 V1) +- **Duration**:383 ms +- **截图**:`screenshots/UI-16-registered-upload.png` + +### UI-15 post-restart(仅 restart app) + +- **Input**:A 页面登录;打开 `UI验收-超声微创系统-mu0gwiez`。 +- **Actual Output**:`version=V3 revision=r2`;页面恢复正文,无「账本未就绪」。`GET /api/v1/projects/6159/documents` 200;`doc_proj6159_intake` 的 `content` / `revision-state` / `versions` / `manual-overlay` 均为 **200**。Playwright post:**1 passed / 18 skipped**。 +- **Verdict**:PASS +- **Duration**:1445 ms +- **截图**:`screenshots/UI-15-post-restart.png` + +## 六、 自动化测试套件汇总 (Test Suite Execution) + +工程门禁**不能替代**上节真实 UI。下列为合入基线 `dev@b258ab8` 上已记录的工程结果(本轮文档收口不重跑容器)。 + +| 命令 | 结果 | +|------|------| +| `gofmt`(相关包) | PASS | +| `go vet ./...` | PASS | +| `go test -short ./...` | PASS | +| `cd web && npm test` | **333 + 30** PASS | +| `cd web && npm run build` | PASS | +| 隔离 PG:schema 1→31 高序列首次生成 / 重启 hydration | PASS;临时库已 DROP | +| `go test -race` 全仓并行一次 | **NOT PASS**:`internal/server` 出现 `TempDir directory not empty` flake | +| `go test -race` `./internal/docrevision` `./internal/bizdev` | PASS | +| 该 flake 单测 `-race -count=5` | PASS;日志可见 worker 可晚于 PASS 收尾(测试基建残留,不否定账本逻辑) | + +Playwright(官方容器,真实 PI): + +```text +results JSON: 21/21 PASS +main: 18 passed, 1 skipped (post) +post: 1 passed, 18 skipped +``` + +## 七、 测试结论与后续优化建议 (Conclusion & Next Steps) + +### 7.1 文档运行时范围 + +**PASS / done**。Round20 证明:首次生成可提交、高风险确认/拒绝、人工修订与冲突、三 overlay、多文档/上传、授权隔离、重登与 app restart 后 V3/r2/A1 正文可恢复。集成槽位应释放。 + +### 7.2 不得写成「全仓可发布」 + +- `CHAT-INTENT-STATE` 等**无关** blocker 仍使 `production_ready=no`; +- change report 仍是 **fallback**(真实 diff,不是假 JSON,也不是完整 PI 叙事); +- `-race` 全包并行 flake 属于测试基建,不回滚本结论,也不假装 race 全绿。 + +### 7.3 影响 + +| 范围 | 影响 | +|------|------| +| 项目 6159 | 真实立项 + 两轮高风险决策 + 人工冲突后的最终账本 | +| 文档 `doc_proj6159_intake` | 终态 V3/r2,正文 marker `A1-win-mu0gwiez` | +| `doc_proj6159_prelim_design` | 独立 V2/r0 | +| `doc-free-1789344210423570738-182` | 服务端注册后挂工具条,无 orphan `doc-upload` | +| 历史失败资产 | 仍用于根因追溯,禁止当本轮 FAIL | + +### 7.4 风险 + +- **high(产品)**:编制人必须理解 pending 确认才会升 Version;拒绝不会丢当前 V。 +- **medium(报告)**:用户若把 fallback 摘要当成「法规专家已审完」,会产生合规错觉——UI 与文档必须继续标明确定性分析。 +- **low(测试)**:server 包 TempDir 并行污染可在无关 PR 上闪红。 + +### 7.5 开放问题 + +1. `DOCREV-RT-PI-NARRATIVE`:业务叙事摘要 / 风险解释的真实 PI 链路仍未替代 fallback。 +2. 跨设备用户目录仍可能缺成员候选(本轮同浏览器 admin→A 未暴露)。 +3. 仅 IndexedDB、从未 `POST /freeform-documents` 的预览仍禁止静默假 V1(UI-16 验证的是已注册路径)。 +4. `go test -race` 全包并行 TempDir 清理顺序。 + +### 7.6 建议 + +- 合入本报告后保持 `production_ready=no`,焦点转到 `CHAT-INTENT` 等系统 blocker; +- 复跑无头 UI 继续用官方 Playwright noble 容器,宿主 `npx playwright install` 仅作备选; +- 不提交 assets、不提交/引用 `phase-secrets.local.json` 内容。