docs(ops): close Wave 3 test-debt-blindspots (S-1/S-2/S-4/S-5)

Archive isolated PG reconcile evidence, mark gap-matrix debt closed, and
release the integration slot for Wave 4 hardening.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
weichen
2026-09-18 03:02:59 +00:00
co-authored by Cursor
parent 17f430b267
commit 2ebf6adb2d
14 changed files with 1050 additions and 7 deletions
+3 -2
View File
@@ -5,7 +5,7 @@
## 焦点
1. **系统体检整改**:Wave 0–2 **done**;下一波 Wave 3(测试债与盲区 S-1/S-2/S-4/S-5)
1. **系统体检整改**:Wave 0–3 **done**;下一波 Wave 4(隐患加固 R-1~R-8)
2. **rdev 模板深度 / document-author-only**:已合入 `origin/dev`;未晋升 test/main
3. **红线**:禁止整支 merge FAV;不默认升 `MULTI_INTENT_PLAN_TIER=full`;`SEMANTIC_SUMMARY_REPLACE` 不随 W2 开启;FAV live 观察窗证据驱动;`FAV_DEGRADED_READ=false`;项目 143 只读
@@ -13,6 +13,7 @@
| owner | task | branch | worktree | mutex | status |
|-------|------|--------|----------|-------|--------|
| Cursor-Auto | 2026-09-18-wave3-test-debt-blindspots | fix/wave3-test-debt-blindspots | - | test-debt | done |
| Cursor-Auto | 2026-09-18-wave2-config-flag-align | fix/wave2-config-flag-align | - | infra | done |
| Cursor | 2026-09-18-wave1-main-env-fix | fix/wave1-main-env-fix | - | infra | done |
| Cursor | 2026-09-18-wave0-p0-bug-fixes | fix/wave0-p0-sse-chat-cache-bugs | - | chat + web | done |
@@ -134,7 +135,7 @@
| holder | phase | since | scope | queue |
|--------|-------|-------|-------|-------|
| - | idle | 2026-09-18 | Wave 2 config flag align 已合入并三环境冒烟 PASS(见 [test-report](../test-reports/2026-09-18-wave2-config-flag-align-test-report.md)) | - |
| - | idle | 2026-09-18 | Wave 3 test-debt 已合入(见 [test-report](../test-reports/2026-09-18-wave3-test-debt-blindspots-test-report.md)) | - |
**phase**: `idle` | `merging` | `smoke` | `e2e`
@@ -0,0 +1,46 @@
---
title: "Wave 3:测试债与盲区(S-1/S-2/S-4/S-5)"
status: done
created: 2026-09-18
updated: 2026-09-18
owner: Cursor-Auto
branch: fix/wave3-test-debt-blindspots
worktree: "-"
mutex: test-debt
---
# Wave 3:测试债与盲区
## 目标
关闭 `TestReconcile_LegacyRepair_PG` 工程测试债;清理永久跳过死代码;统一 E2E 脚本入口;推广 409/结构化错误信封复用。
## 范围
- S-1 / S-2 / S-4 / S-5(按 Sonnet 计划默认决策)
## 非目标
- 不升 MULTI_INTENT_PLAN_TIER;不接线 REPLACE;不改 FAV;项目 143 只读
- 不改后端 httpx 信封整体迁移;不统一 INTENT_DUAL_TAB
## 步骤
1. [x] Sonnet 5 计划
2. [x] S-1 隔离 PG 5436 跑一次并归档
3. [x] S-2 删死跳过 + plan_owner 说明
4. [x] S-4 e2e scripts + 退役 document-revision.spec
5. [x] S-5 信封复用 + 单测
6. [x] 文档闭环 + 合入本地 dev
## 验收标准
- [x] reconcile PG PASS 证据
- [x] playwright --list = 29 tests / 8 files
- [x] npm test / go test -short 全绿
- [x] gap-matrix 测试债关闭;remediation Wave 3 done
## 相关链接
- Plan agent: [Wave 3 Sonnet 计划](51987049-b338-41a7-84f4-2c97e3655d85)
- Test report: [.doc/test-reports/2026-09-18-wave3-test-debt-blindspots-test-report.md](../../test-reports/2026-09-18-wave3-test-debt-blindspots-test-report.md)
@@ -30,7 +30,7 @@ updated: 2026-09-17
| **Wave 0:P0 确认 bug** | B-1/B-2:`handleChatStream` 与 `handleRunTaskStream` 接 `extendSSEWriteDeadline` + 心跳(复用 sse.go:52-64 既有机制);run/stream 支持 `after_seq` 续订(重连走既有 `GET .../events?after_seq=`)。B-3:Decode 失败返回 400。B-4:CreateAndStart/Subscribe 前置到 Flush 之前(对齐 chat 路径)。B-5:useChatWindow 全部写入统一带 `userId` 前缀,LRU 驱逐完整 cache key。B-6:`applyRestoredFileRaw` 函数式合并 | **done**(2026-09-18):[test-report](../test-reports/2026-09-18-wave0-p0-bug-fixes-test-report.md);合入 `dev` merge `fix/wave0-p0-sse-chat-cache-bugs`;dev rebuild + health/ready PASS;真 PI SSE 心跳证据归档 |
| **Wave 1:main 环境修正(critical)** | E-1:app/events 统一 `ENV=main`。E-2:app `depends_on events: service_healthy`(events 同步迁移后再启 app)。E-5:`Env==""` 不再视同 dev。附带:events 补齐 `validateProductionSecrets` 所需口令以免 Restarting | **done**(2026-09-18):[test-report](../test-reports/2026-09-18-wave1-main-env-fix-test-report.md);main health `env=main` + `schema_version=52`;consumer modes 仍 off |
| **Wave 2:配置与灰度入口对齐** | E-3:三环境声明 `MULTI_INTENT_PLAN_TIER`+U9–U12(legacy/false);A-4:test/main 补 SHADOW/NARRATIVE。E-4:删除 `CURSOR_RUNNER_URL`+cursor-agent。E-6:main `SEED_DEMO_USERS=false`。E-7:非法 `INTENT_V2_DECISION_TIER`→`none`。E-9:评估不改 initdb | **done**(2026-09-18):[test-report](../test-reports/2026-09-18-wave2-config-flag-align-test-report.md);三环境 env 抽检 + health/ready PASS |
| **Wave 3:测试债与盲区** | S-1:申请隔离 PG(docker 单发 5436),执行 `TestReconcile_LegacyRepair_PG` 一次并归档报告,关闭 gap-matrix 测试债。S-2:删除 `taskstream_test.go:189` 死跳过;`plan_owner_test.go:125` 补说明或修复。S-4:统一 E2E 入口——`web/package.json` 为 9 个 spec 各配 script 或统一 flag 约定(消除 `DOCREV_E2E_BASE_URL` 与 `RUN_UI_ACCEPTANCE` 双口径);README/e2e 注释同步。S-5:409 信封复用推广到 projectMembers/freeformDoc/taskRuns/chatSessions(复用 projectSettingsError 解析器) | 隔离 PG 测试报告归档 `.doc/test-reports/`;`playwright test --list` 输出与门禁矩阵一致;409 负例单测覆盖 4 个 API 封装 |
| **Wave 3:测试债与盲区** | S-1:隔离 PG(5436) 跑 `TestReconcile_LegacyRepair_PG`。S-2:删 taskstream 死跳过;plan_owner 重定向说明。S-4:每 spec npm 脚本;退役 `document-revision.spec`(消灭 DOCREV_E2E_BASE_URL)。S-5:`projectSettingsError` 复用到 members/freeform/taskRuns/chatSessions | **done**(2026-09-18):[test-report](../test-reports/2026-09-18-wave3-test-debt-blindspots-test-report.md);playwright list 29/8;reconcile PG PASS |
| **Wave 4:隐患加固(可与 Wave 0–3 并行认领,mutex 不冲突时)** | R-1:`getOrCreateSession` 增 owner 绑定校验(session 创建时记录 owner,后续请求校验,不匹配 403)。R-2:18 处 `rows.Next()` 循环补 `rows.Err()` 检查。R-3:dispatcher Handlers 读路径加 RLock(或注释冻结「仅启动期注册」并加 archtest 约束)。R-4:`memTurns` 加 TTL/容量淘汰。R-5:pg_store JSONB 反序列化错误改为显式报错。R-6:后台 ticker 纳入 Shutdown;vault Drain 错误上报告警。R-7/R-8:SSE 重连 401/404 fail-fast、逐帧容错;登出 abort 在途流 | R-1 跨用户会话负例测试 PASS(补 PG + 内存双实现);R-2 `go vet`+单测;R-7 前端单测模拟 401 立即抛出 |
| **Wave 5:死代码与机制收口(需逐项决策,不擅自删)** | X-1:`SEMANTIC_FALLBACK_ENABLED` 删除或接线(先决策语义兜底是否还需要)。X-2:`SEMANTIC_SUMMARY_REPLACE` 维持未接线但补注释说明为刻意封存(与红线一致)。X-3:00048 三表消费方接线评估(并入 W5b SWBOOT-10 或标记 deferred)。X-4:system_settings 6 键逐一接消费方或从白名单移除(系统管理台二期范围)。X-5:前端死组件/死 API 删除(DocumentNotificationList、WorkflowPrerequisiteBanner、SettingsModal、activateWorkflow、saveMessages)或明确保留理由 | 每项有决策记录(ADR 或 short-term 决议段);删除后 `npm run build`/`go build` 全绿 |
| **Wave 6:文档漂移修复** | D-1:PU8 四份契约文件状态改 done 并归档。D-2:modular-monolith ADR 状态更新为 accepted。D-3:两个 INDEX 末行已在本审计修正(复核即可)。D-4:handoff 回标已被覆盖。D-5:backlog D3/D7 同步最新状态。D-6:PROJECT.md §9「剩余 blocker」段与 gap-matrix 对齐或删除 | 漂移清单逐项回链;`.doc/audit/INDEX.md`、`remediation/INDEX.md` 与 FEATURE-MATRIX 三方口径一致 |
@@ -42,8 +42,8 @@ updated: 2026-09-17
- [x] main 环境:ENV 语义统一核验记录 + schema 已升(实测 52)+ 事件链路无双写证据(modes 仍 off)(Wave 1,[报告](../test-reports/2026-09-18-wave1-main-env-fix-test-report.md))
- [x] SSE 长回合心跳接线:真 PI 静默期 `: heartbeat` + 短 WriteTimeout 单测跨越(Wave 0)
- [x] Wave 2 配置声明对齐:三环境 compose diff 复核 + 容器 env 抽检 + go test 全绿(E-3/E-4/E-6/E-7 完成;E-9 评估结论已记录,不改代码)([报告](../test-reports/2026-09-18-wave2-config-flag-align-test-report.md))
- [ ] `TestReconcile_LegacyRepair_PG` 报告归档,gap-matrix 测试债行关闭(Wave 3)
- [ ] `playwright test --list` 与门禁文档一致(Wave 3)
- [x] `TestReconcile_LegacyRepair_PG` 报告归档,gap-matrix 测试债行关闭(Wave 3)
- [x] `playwright test --list` 与门禁文档一致(Wave 3)
- [ ] 跨用户会话挂靠负例测试入库(Wave 4)
- [ ] X-1~X-5 每项有决策记录(Wave 5)
- [ ] D-1~D-6 全部回链关闭(Wave 6)
+1 -1
View File
@@ -63,7 +63,7 @@
| ID | 描述 | 状态 | 证据 | 计划动作 |
|---|---|---|---|---|
| WORKFLOW-PLAN-FROZEN-OPTIONAL-DUTIES | active 项目仍展示可编辑职责表单,409 提示在长表单视口外;现有规划又不支持非必需文档“三权全空”,且后端缺少职责人在任成员复核 | **PASS(设置页)** | [audit](../audit/2026-09-14-workflow-plan-409-frozen-and-optional-duties.md);[test-report](../test-reports/2026-09-14-workflow-plan-409-frozen-and-optional-duties-test-report.md)。项目 143 只读 frozen、A full+none 激活、B partial 不发 PUT、C 零治理拒绝、双标签转 frozen、成员无配置入口、刷新后 143 仍 frozen | 设置页矩阵 PASS;真实 PI full/none 长链已另签 [Wave2 报告](../test-reports/2026-09-16-wave2-real-pi-evidence-test-report.md) |
| DOC-CONTENT-CANONICAL-HASH-DRIFT | 旧受控文档 bootstrap 裁剪 Markdown 双空格硬换行并将 canonical SHA 写入账本/DocGov,但未同步文件;正文读取把完整性冲突误报 404,lease/list sync 又放大并制造刷新后加载死锁 | **PASS(真实 UI)** | [audit](../audit/2026-09-14-project143-controlled-content-404.md);[UI report](../test-reports/2026-09-14-controlled-content-ui-acceptance.md)。代码已合 dev、schema 32、项目 143 定向 `migration_repair`;项目 143 `clean-run3` 与新项目 `full-chain-final` 主链及 restart 全部纯页面 PASS,目标 404=0 | [remediation](./2026-09-14-controlled-content-canonical-hash-remediation.md)。隔离 `TestReconcile_LegacyRepair_PG` 未执行,按用户“本轮只允许页面测试”的边界保留为工程测试债,不作为本轮 UI PASS 的替代证据 |
| DOC-CONTENT-CANONICAL-HASH-DRIFT | 旧受控文档 bootstrap 裁剪 Markdown 双空格硬换行并将 canonical SHA 写入账本/DocGov,但未同步文件;正文读取把完整性冲突误报 404,lease/list sync 又放大并制造刷新后加载死锁 | **PASS(真实 UI)** | [audit](../audit/2026-09-14-project143-controlled-content-404.md);[UI report](../test-reports/2026-09-14-controlled-content-ui-acceptance.md)。代码已合 dev、schema 32、项目 143 定向 `migration_repair`;项目 143 `clean-run3` 与新项目 `full-chain-final` 主链及 restart 全部纯页面 PASS,目标 404=0 | [remediation](./2026-09-14-controlled-content-canonical-hash-remediation.md)。Wave 3(2026-09-18)已在隔离 docker PG(5436)执行 `TestReconcile_LegacyRepair_PG` 一次并 PASS,工程测试债关闭,见 [test-report](../test-reports/2026-09-18-wave3-test-debt-blindspots-test-report.md) |
| CHAT-HISTORY-REFRESH | 工作流激活后刷新,对话正文被阶段过滤器清空,但分类数量与锚点仍按全量返回 | **PASS** | [test-report](../test-reports/2026-09-13-chat-history-refresh-test-report.md);活验 [live.json](../test-reports/assets/2026-09-15-chat-history-refresh-live/live.json)(项目 6252,window=categories=2,guest 403);代码:`message_scope.go`、`chat_history_auth.go`、goose 00026/00027 | 闲聊刷新已补。发布门禁「激活后文档任务 + 重登/重启」仍开放,不回退本 gap |
| CHAT-INTENT-STATE | 真实会话被诊断探针污染;只读查询误启动文档写任务;错误动作与编辑状态刷新后丢失 | **PASS** | [audit](../audit/2026-09-13-conversation-intent-runtime-state.md);[test-report](../test-reports/2026-09-13-conversation-intent-runtime-state-test-report.md);双标签活验项目 **6275** / `sess-p6275-u10`(`live.json` + Docker 截图)。**不**删除 `sess-p143-u9` 历史探针 | [remediation](./2026-09-13-conversation-intent-runtime-state-remediation.md)。Wave 3–4 浏览器门已签;诊断污染消息仍不擅自删除 |
| ENV-RESTART-SOURCE | `docker compose restart` 只重启旧镜像,健康检查无法证明合入代码已部署 | **PASS** | `env-service.sh rebuild` + 真实摘要重测 | 集成冒烟统一使用 `dev rebuild` |
+1 -1
View File
@@ -80,7 +80,7 @@
| Intent L1 | partial(混入 U9–U12) | done | U9–U12 → 多意图扩面 | 是(双标签 + 分流 + U1–U3) |
| Chat/ctxmgr | partial(混入语义摘要 D5 误标) | done | D3 摘要行;D7 治理行 | 是(B3 项目 6359) |
| Document revision | partial(混入完整 PI 叙事) | done | PI change-report 叙事行 | 是(Round20;fallback 为声明行为) |
| Frontend workbench | partial(缺口栏已空) | done | 其他 409 信封复用 → backlog | 是(B4 项目 6363) |
| Frontend workbench | partial(缺口栏已空) | done | Wave 3 已收口 projectMembers/freeformDoc/taskRuns/chatSessions 结构化错误信封复用 | 是(B4 项目 6363) |
| 可靠事件 | partial(与 FAV 混行) | done | FAV 独立 deferred | 是(E0–E2 + shared live) |
---
@@ -0,0 +1,82 @@
# Wave 3:测试债与盲区测试报告
## 一、 测试背景 (Background)
体检确认 `TestReconcile_LegacyRepair_PG` 从未在隔离 PG 上执行(S-1);两处永久跳过(S-2);E2E 9 个 spec 仅 1 个有 npm 脚本且存在 `DOCREV_E2E_BASE_URL` 双口径(S-4);前端多处 API 对 409/结构化错误裸抛 Error(S-5)。
## 二、 测试目标 (Test Objectives)
- 隔离 PG(5436) 跑通 LegacyRepair 一次并归档
- 删除死跳过;plan_owner 重定向说明补齐
- `playwright test --list` = 29 tests / 8 files;每 spec 有脚本
- projectMembers/freeformDoc/taskRuns/chatSessions 复用 `projectSettingsError` 并有负例单测
## 三、 测试方案与环境 (Test Plan & Environment)
- 分支:`fix/wave3-test-debt-blindspots` ← 本地 `dev@423f7e7`
- 隔离 PG:`pgvector/pgvector:pg16` 映射 5436,测完销毁并 `unset TEST_DATABASE_URL`
- 前端:`npm test` / `npm run build` / `npx playwright test --list`
- 证据:`.doc/test-reports/assets/2026-09-18-wave3-test-debt-blindspots/`
## 四、 预期结果 (Expected Results)
| 项 | 预期 |
|----|------|
| S-1 | goose→52 + `PASS: TestReconcile_LegacyRepair_PG` |
| S-2 | TaskStream 3 PASS 0 SKIP;plan_owner 仍 SKIP 但注释说明导入环 |
| S-4 | 29 tests / 8 files;无 `DOCREV_E2E_BASE_URL` |
| S-5 | 相关 API 单测 PASS;`npm test` 全绿 |
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
### 5.1 S-1 隔离 PG
见 `assets/.../go-test-reconcile-pg.txt`:
```
goose: successfully migrated database to version: 52
--- PASS: TestReconcile_LegacyRepair_PG (0.37s)
```
**判定**:PASS
### 5.2 S-2
```
--- SKIP: TestTaskGenerateRealPIStopGate(redirect 说明已补)
--- PASS: TestTaskStream_TransientInjection_DeadPiAgent
--- PASS: TestTaskStream_SoftFailure_ClassifiedResumable
--- PASS: TestTaskStream_MaterialsInjection
```
**判定**:PASS
### 5.3 S-4
```
Total: 29 tests in 8 files
```
**判定**:PASS(退役 `document-revision.spec.ts`)
### 5.4 S-5
`npm test`:402 pass + vitest 32 pass;含 DOC_BUSY / CONCURRENCY_CONFLICT / members / chatSessions 负例。
**判定**:PASS
### 5.5 全量回归
`go vet ./...` + `go test -short ./...` 全绿(见 `go-test-short.txt`)。
## 六、 自动化测试套件汇总 (Test Suite Execution)
- Go short:全绿
- Web:`npm test` 全绿;`npm run build` 成功
- Playwright list:29/8
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
- Wave 3 达到合并标准;gap-matrix DOC-CONTENT 工程测试债关闭。
- 下一波 Wave 4:隐患加固 R-1~R-8。
- 后端 `error_code`→统一 `httpx.Write` 仍属独立 remediation,不在本波。
@@ -0,0 +1 @@
{"status":"ok","env":"dev","agent_backend":"pi-agent","version":"v1.0","shared_kb_port":5432,"kb_ready":true,"database_ready":true,"schema_version":52,"schema_ready":true,"task_store_ready":true}
@@ -0,0 +1,5 @@
=== RUN TestTaskGenerateRealPIStopGate
plan_owner_test.go:129: redirect: run TestMultiIntentU8_RealPI_ConfirmGenerate_PG with TEST_DATABASE_URL + runner
--- SKIP: TestTaskGenerateRealPIStopGate (0.00s)
PASS
ok chat-agent-system/internal/app 0.004s
@@ -0,0 +1,14 @@
=== RUN TestTaskStream_TransientInjection_DeadPiAgent
2026/09/18 03:01:42 [kb] offline=true reason=empty_kb_db_password detail=config: KB_DB_PASSWORD is empty; provide it in root .env (layered with configs/.env.{ENV}) or process environment
{"time":"2026-09-18T03:01:42.246819372Z","level":"INFO","msg":"taskrun_status_transition","run_id":"run_1789700502245333756","status":"failed","workspace_id":"/tmp/TestTaskStream_TransientInjection_DeadPiAgent4118796318/001/workspaces/bizdev/intake_1789700502245392744","error":"step step_01_organize failed: pi remote runner call failed: Post \"http://127.0.0.1:1/v1/run\": dial tcp 127.0.0.1:1: connect: connection refused"}
--- PASS: TestTaskStream_TransientInjection_DeadPiAgent (0.12s)
=== RUN TestTaskStream_SoftFailure_ClassifiedResumable
{"time":"2026-09-18T03:01:42.247185161Z","level":"INFO","msg":"[kb] offline=true reason=empty_kb_db_password detail=config: KB_DB_PASSWORD is empty; provide it in root .env (layered with configs/.env.{ENV}) or process environment"}
{"time":"2026-09-18T03:01:42.367560797Z","level":"INFO","msg":"taskrun_status_transition","run_id":"run_1789700502364855997","status":"failed","workspace_id":"/tmp/TestTaskStream_SoftFailure_ClassifiedResumable3905120337/001/workspaces/bizdev/intake_1789700502364947735","error":"step step_01_organize failed: typed result rejected"}
--- PASS: TestTaskStream_SoftFailure_ClassifiedResumable (0.12s)
=== RUN TestTaskStream_MaterialsInjection
{"time":"2026-09-18T03:01:42.368028583Z","level":"INFO","msg":"[kb] offline=true reason=empty_kb_db_password detail=config: KB_DB_PASSWORD is empty; provide it in root .env (layered with configs/.env.{ENV}) or process environment"}
{"time":"2026-09-18T03:01:42.49039527Z","level":"INFO","msg":"taskrun_status_transition","run_id":"run_1789700502486605432","status":"completed","workspace_id":"/tmp/TestTaskStream_MaterialsInjection3867346817/001/workspaces/bizdev/intake_1789700502486703409","error":""}
--- PASS: TestTaskStream_MaterialsInjection (0.12s)
PASS
ok chat-agent-system/internal/server 0.370s
@@ -0,0 +1,57 @@
=== RUN TestReconcile_LegacyRepair_PG
2026/09/18 02:59:05 OK 00001_baseline.sql (61.75ms)
2026/09/18 02:59:05 OK 00002_2026-09-09-doc-edit-lease.sql (2.84ms)
2026/09/18 02:59:05 OK 00003_2026-09-09-uq-context-memory-chunk-hash.sql (1.93ms)
2026/09/18 02:59:05 OK 00004_2026-09-10-chat-daily-digests-and-search.sql (1.04ms)
2026/09/18 02:59:05 OK 00005_2026-09-10-chat-messages-day-window.sql (975.81µs)
2026/09/18 02:59:05 OK 00006_2026-09-11-chat-read-positions.sql (581.01µs)
2026/09/18 02:59:05 OK 00007_2026-09-11-chat-turns.sql (507.12µs)
2026/09/18 02:59:05 OK 00008_2026-09-11-freeform-documents.sql (8.85ms)
2026/09/18 02:59:05 OK 00009_2026-09-11-message-export-policy.sql (3.64ms)
2026/09/18 02:59:05 OK 00010_2026-09-11-project-workflows-and-lineage.sql (15.65ms)
2026/09/18 02:59:05 OK 00011_2026-09-11-seed-ten-projects.sql (10.4ms)
2026/09/18 02:59:05 OK 00012_2026-09-11-seed-ten-projects-chat.sql (44.21ms)
2026/09/18 02:59:05 OK 00013_2026-09-11-task-run-lineage.sql (1.65ms)
2026/09/18 02:59:05 OK 00014_project_members.sql (3.94ms)
2026/09/18 02:59:05 OK 00015_2026-09-12-iam-core.sql (18.27ms)
2026/09/18 02:59:05 OK 00016_2026-09-12-workflow-definitions-and-templates.sql (12.1ms)
2026/09/18 02:59:05 OK 00017_2026-09-12-project-workflow-instances.sql (15.99ms)
2026/09/18 02:59:05 OK 00018_2026-09-12-outbox-notifications-stage-advance.sql (9.27ms)
2026/09/18 02:59:05 OK 00019_2026-09-12-task-runs-events.sql (5.46ms)
2026/09/18 02:59:05 OK 00020_2026-09-12-task-run-worker-lease.sql (1.27ms)
2026/09/18 02:59:05 OK 00021_2026-09-12-iam-hardening.sql (2.84ms)
2026/09/18 02:59:05 OK 00022_2026-09-12-workflow-schema-v2.sql (1.98ms)
2026/09/18 02:59:05 OK 00023_2026-09-12-instance-integrity.sql (1.12ms)
2026/09/18 02:59:05 OK 00024_2026-09-12-workflow-catalog-governance.sql (6.65ms)
2026/09/18 02:59:05 OK 00025_2026-09-13-sync-seed-sequences.sql (915.48µs)
2026/09/18 02:59:05 OK 00026_2026-09-13-chat-message-scope.sql (2.67ms)
2026/09/18 02:59:05 OK 00027_2026-09-13-chat-message-scope-backfill.sql (2.29ms)
2026/09/18 02:59:05 OK 00028_2026-09-13-document-revisions.sql (16.09ms)
2026/09/18 02:59:05 OK 00029_2026-09-13-freeform-client-key.sql (1.16ms)
2026/09/18 02:59:05 OK 00030_2026-09-13-task-run-pending-author-confirmation.sql (1.01ms)
2026/09/18 02:59:05 OK 00031_2026-09-13-project-member-document-duty.sql (1.76ms)
2026/09/18 02:59:05 OK 00032_2026-09-14-document-revision-migration-repair.sql (694.9µs)
2026/09/18 02:59:05 OK 00033_2026-09-14-task-run-blocked-pending-governance.sql (519.23µs)
2026/09/18 02:59:05 OK 00034_2026-09-14-workspace-lease-fencing.sql (517.29µs)
2026/09/18 02:59:05 OK 00035_2026-09-14-durable-event-delivery.sql (5.53ms)
2026/09/18 02:59:05 OK 00036_2026-09-14-final-artifact-vault.sql (8.93ms)
2026/09/18 02:59:05 OK 00037_2026-09-15-task-run-manifests.sql (2.43ms)
2026/09/18 02:59:05 OK 00038_2026-09-15-dataset-lifecycle.sql (8.22ms)
2026/09/18 02:59:05 OK 00039_2026-09-15-event-inventory-and-principals.sql (5.94ms)
2026/09/18 02:59:05 OK 00040_2026-09-15-event-dispatcher.sql (6.57ms)
2026/09/18 02:59:05 OK 00041_2026-09-15-notification-visible-outcome.sql (1.27ms)
2026/09/18 02:59:05 OK 00042_2026-09-15-workflow-advance-outcome.sql (892.49µs)
2026/09/18 02:59:05 OK 00043_2026-09-15-projection-outcome.sql (2.02ms)
2026/09/18 02:59:05 OK 00044_2026-09-15-intent-plans.sql (10.62ms)
2026/09/18 02:59:05 OK 00045_2026-09-16-intent-plan-projection.sql (3.61ms)
2026/09/18 02:59:05 OK 00046_2026-09-16-retire-demo-ten-projects.sql (997.96µs)
2026/09/18 02:59:05 OK 00047_2026-09-16-retire-demo-ten-project-sessions.sql (419.52µs)
2026/09/18 02:59:05 OK 00048_2026-09-16-software-project-bootstrap-fields.sql (11.91ms)
2026/09/18 02:59:05 OK 00049_2026-09-17-system-settings.sql (1.49ms)
2026/09/18 02:59:05 OK 00050_2026-09-17-workflow-author-only-policy.sql (2.25ms)
2026/09/18 02:59:05 OK 00051_2026-09-17-activation-token-author-only-revision.sql (335.77µs)
2026/09/18 02:59:05 OK 00052_2026-09-17-document-duty-locked.sql (657.03µs)
2026/09/18 02:59:05 goose: successfully migrated database to version: 52
--- PASS: TestReconcile_LegacyRepair_PG (0.37s)
PASS
ok chat-agent-system/internal/docrevision 0.370s
@@ -0,0 +1,67 @@
? chat-agent-system/cmd/artifact-vault [no test files]
ok chat-agent-system/cmd/bizdev-cli 2.157s
? chat-agent-system/cmd/dataset [no test files]
ok chat-agent-system/cmd/document-content-reconcile 0.008s
? chat-agent-system/cmd/document-revision-backfill [no test files]
? chat-agent-system/cmd/engineering-dashboard [no test files]
? chat-agent-system/cmd/eventmode [no test files]
? chat-agent-system/cmd/events [no test files]
? chat-agent-system/cmd/recategorize [no test files]
? chat-agent-system/cmd/server [no test files]
ok chat-agent-system/internal/agent 3.599s
ok chat-agent-system/internal/app 0.031s
ok chat-agent-system/internal/app/chatflow 0.008s
ok chat-agent-system/internal/app/docadvance 0.008s
ok chat-agent-system/internal/app/docflow 0.008s
ok chat-agent-system/internal/app/docnotify 0.008s
ok chat-agent-system/internal/app/docproject 0.007s
ok chat-agent-system/internal/app/fav 0.007s
ok chat-agent-system/internal/app/intentflow 0.032s
ok chat-agent-system/internal/app/stageflow 0.009s
ok chat-agent-system/internal/app/uow 0.006s
ok chat-agent-system/internal/archtest 0.211s
ok chat-agent-system/internal/artifactvault 0.005s
ok chat-agent-system/internal/auth 0.986s
ok chat-agent-system/internal/authz 0.014s
ok chat-agent-system/internal/bizdev 0.155s
ok chat-agent-system/internal/chat 0.020s
ok chat-agent-system/internal/config 0.007s
ok chat-agent-system/internal/coordinator 0.014s
ok chat-agent-system/internal/ctxmgr 0.096s
ok chat-agent-system/internal/dataset 0.004s
ok chat-agent-system/internal/db 0.007s
ok chat-agent-system/internal/doccontent 0.003s
ok chat-agent-system/internal/docduty 0.004s
ok chat-agent-system/internal/docgov 0.031s
ok chat-agent-system/internal/docquery 0.005s
ok chat-agent-system/internal/docrevision 0.010s
ok chat-agent-system/internal/engineeringdashboard 0.011s
ok chat-agent-system/internal/events 0.007s
ok chat-agent-system/internal/freedoc 0.028s
ok chat-agent-system/internal/fsutil 0.003s
ok chat-agent-system/internal/httpx 0.005s
ok chat-agent-system/internal/intent 0.027s
ok chat-agent-system/internal/kb 0.013s
ok chat-agent-system/internal/maturity 0.003s
ok chat-agent-system/internal/notification 0.094s
? chat-agent-system/internal/observability [no test files]
ok chat-agent-system/internal/projectcontext 0.006s
ok chat-agent-system/internal/projectinstance 0.006s
ok chat-agent-system/internal/projectworkflow 0.006s
ok chat-agent-system/internal/quote 0.011s
ok chat-agent-system/internal/replyexport 0.003s
ok chat-agent-system/internal/server 13.768s
ok chat-agent-system/internal/squad 0.029s
ok chat-agent-system/internal/storage 0.014s
ok chat-agent-system/internal/stream 0.003s
ok chat-agent-system/internal/stream/transport 0.002s
ok chat-agent-system/internal/swboot 0.002s
ok chat-agent-system/internal/sysadmin 0.003s
ok chat-agent-system/internal/taskrun 0.195s
ok chat-agent-system/internal/template 0.740s
ok chat-agent-system/internal/upload 0.003s
? chat-agent-system/internal/workflow [no test files]
ok chat-agent-system/internal/workflow/runtime 0.003s
ok chat-agent-system/internal/workflowdef 0.004s
ok chat-agent-system/internal/workspace 0.003s
? chat-agent-system/templates [no test files]
@@ -0,0 +1,236 @@
> shuimu-workbench@1.0.0 build
> tsc && vite build && node scripts/precompress-dist.mjs
vite v7.3.6 building client environment for production...
transforming...
✓ 4123 modules transformed.
rendering chunks...
computing gzip size...
dist/index.html 0.72 kB │ gzip: 0.45 kB
dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff 4.42 kB
dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 4.93 kB
dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 5.21 kB
dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 5.47 kB
dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff 5.98 kB
dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff 6.19 kB
dist/assets/KaTeX_Size1-Regular-C195tn64.woff 6.50 kB
dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 6.91 kB
dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 6.91 kB
dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf 7.59 kB
dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff 7.66 kB
dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff 7.72 kB
dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 9.64 kB
dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 10.34 kB
dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf 10.36 kB
dist/assets/KaTeX_Script-Regular-D5yQViql.woff 10.59 kB
dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 11.32 kB
dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 11.35 kB
dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf 11.51 kB
dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 12.03 kB
dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 12.22 kB
dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf 12.23 kB
dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff 12.32 kB
dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf 12.34 kB
dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf 12.37 kB
dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff 13.21 kB
dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff 13.30 kB
dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 13.57 kB
dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff 14.11 kB
dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff 14.41 kB
dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff 16.03 kB
dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 16.40 kB
dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 16.44 kB
dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf 16.65 kB
dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 16.78 kB
dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 16.99 kB
dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff 18.67 kB
dist/assets/KaTeX_Math-Italic-DA0__PXp.woff 18.75 kB
dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff 19.41 kB
dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf 19.44 kB
dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf 19.57 kB
dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf 19.58 kB
dist/assets/KaTeX_Main-Italic-BMLOBm91.woff 19.68 kB
dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf 22.36 kB
dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf 24.50 kB
dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 25.32 kB
dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 26.27 kB
dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf 27.56 kB
dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 28.08 kB
dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff 29.91 kB
dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff 30.77 kB
dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf 31.20 kB
dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf 31.31 kB
dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf 32.97 kB
dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff 33.52 kB
dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf 33.58 kB
dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf 51.34 kB
dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf 53.58 kB
dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf 63.63 kB
dist/assets/index-BYHTgAJJ.css 36.82 kB │ gzip: 10.03 kB
dist/assets/channel-BU0U2mrE.js 0.11 kB │ gzip: 0.12 kB
dist/assets/init-Gi6I4Gst.js 0.15 kB │ gzip: 0.13 kB
dist/assets/chunk-2Q5K7J3B-BrRJiyRC.js 0.19 kB │ gzip: 0.16 kB
dist/assets/chunk-JWPE2WC7-BbB8JYyB.js 0.22 kB │ gzip: 0.17 kB
dist/assets/chunk-XXDRQBXY-DeebxiEq.js 0.22 kB │ gzip: 0.20 kB
dist/assets/chunk-5VM5RSS4-DH71ojHD.js 0.36 kB │ gzip: 0.27 kB
dist/assets/stateDiagram-v2-MP3YSRHH-CTPd6I2k.js 0.39 kB │ gzip: 0.28 kB
dist/assets/classDiagram-ZZMXUADV-BRi1WSSl.js 0.43 kB │ gzip: 0.30 kB
dist/assets/classDiagram-v2-VYDZK3BY-BRi1WSSl.js 0.43 kB │ gzip: 0.30 kB
dist/assets/chunk-POPQ4Y6H-F1eUCQUt.js 0.50 kB │ gzip: 0.36 kB
dist/assets/swimlanesDiagram-VR7AAH4N-C_Ma8_WN.js 0.51 kB │ gzip: 0.35 kB
dist/assets/infoDiagram-27XIBGKW-CptwKA52.js 0.55 kB │ gzip: 0.38 kB
dist/assets/sizeCapture-INFHLROL-ttVBeEmx.js 0.90 kB │ gzip: 0.51 kB
dist/assets/ordinal-Cboi1Yqb.js 1.19 kB │ gzip: 0.57 kB
dist/assets/railroadDiagram-O6MQD6OU-D_cuFmOe.js 1.57 kB │ gzip: 0.74 kB
dist/assets/abnfDiagram-VCTEODGH-CmO9Yw3i.js 1.77 kB │ gzip: 0.87 kB
dist/assets/chunk-F27PBJKO-CU0eGPkO.js 1.88 kB │ gzip: 0.83 kB
dist/assets/pegDiagram-XKGWAZYB-CvrplaV8.js 1.92 kB │ gzip: 0.90 kB
dist/assets/ebnfDiagram-PWID7BFC-D2Vt6aU-.js 1.97 kB │ gzip: 0.86 kB
dist/assets/arc-DmxstecQ.js 3.43 kB │ gzip: 1.48 kB
dist/assets/diagram-Z3DM3KII-DUS12Pj1.js 4.18 kB │ gzip: 1.82 kB
dist/assets/defaultLocale-DX6XiGOO.js 4.69 kB │ gzip: 2.18 kB
dist/assets/linear-CZN4dYL9.js 5.65 kB │ gzip: 2.30 kB
dist/assets/diagram-UQ7AKVKN-XeKXP9hN.js 6.04 kB │ gzip: 2.60 kB
dist/assets/pieDiagram-E7YTZNPT-nPjKT_2q.js 6.26 kB │ gzip: 2.60 kB
dist/assets/diagram-S7CK7UJ4-KQlOFv-j.js 8.18 kB │ gzip: 3.66 kB
dist/assets/cynefinDiagram-5FMLGOSQ-4jpqDyHD.js 10.06 kB │ gzip: 3.61 kB
dist/assets/stateDiagram-D77RDMKH-D8z_5wV8.js 10.33 kB │ gzip: 3.61 kB
dist/assets/dagre-GXQ25YYZ-CDTkvl4M.js 10.64 kB │ gzip: 4.01 kB
dist/assets/diagram-VSXAHHWV-C4qsb062.js 10.68 kB │ gzip: 4.11 kB
dist/assets/chunk-SVP7TREG-DvAL8o3E.js 15.73 kB │ gzip: 4.41 kB
dist/assets/diagram-VX7I27RA-qAGIKB86.js 15.92 kB │ gzip: 5.68 kB
dist/assets/ishikawaDiagram-5VMMS53U-VJOyh3e4.js 17.43 kB │ gzip: 6.62 kB
dist/assets/kanban-definition-UXKFOSKX-wobvSbOw.js 20.26 kB │ gzip: 7.18 kB
dist/assets/mindmap-definition-YA3MSWOX-C8Q9dvOK.js 23.14 kB │ gzip: 7.80 kB
dist/assets/sankeyDiagram-P5KCCOFB-DXwsYDQi.js 23.16 kB │ gzip: 8.54 kB
dist/assets/journeyDiagram-3NMN7TZE-CqGR23gX.js 23.54 kB │ gzip: 8.33 kB
dist/assets/wardleyDiagram-VM6X3IG4-DHyRRN95.js 25.47 kB │ gzip: 6.77 kB
dist/assets/gitGraphDiagram-WWUBYQGX-CT_yETct.js 29.38 kB │ gzip: 8.68 kB
dist/assets/erDiagram-RLTQ6QDP-sCxe6Q38.js 30.76 kB │ gzip: 10.57 kB
dist/assets/timeline-definition-24CTP7MA-DPJkKbyY.js 30.79 kB │ gzip: 10.13 kB
dist/assets/requirementDiagram-BXWQKSXE-CDfucG1b.js 30.97 kB │ gzip: 9.71 kB
dist/assets/quadrantDiagram-AXDQQJYC-DbMVE9Gd.js 33.98 kB │ gzip: 9.96 kB
dist/assets/layout-Bviwq0iM.js 35.43 kB │ gzip: 12.74 kB
dist/assets/chunk-IMKFNOWR-DwxAWDJr.js 38.07 kB │ gzip: 12.51 kB
dist/assets/blockDiagram-I7D4REHJ-C5UUB1D3.js 41.72 kB │ gzip: 13.56 kB
dist/assets/vennDiagram-4TSXK5OY-9GW76nJr.js 41.93 kB │ gzip: 15.67 kB
dist/assets/xychartDiagram-S5SC5T6Z-DDk6Gun7.js 44.47 kB │ gzip: 12.58 kB
dist/assets/chunk-TICWLB2K-BHQH33V8.js 49.17 kB │ gzip: 15.74 kB
dist/assets/flowDiagram-HODETNUW-Cw7thQvJ.js 61.84 kB │ gzip: 19.87 kB
dist/assets/c4Diagram-7LVT6UL2-DlzAJv6o.js 65.44 kB │ gzip: 18.77 kB
dist/assets/ganttDiagram-EL5Y4UJY-iciq8lZO.js 69.66 kB │ gzip: 23.54 kB
dist/assets/cose-bilkent-JH36ORCC-BMviVy7P.js 81.66 kB │ gzip: 22.46 kB
dist/assets/swimlanes-42K2YHIH-Dtpm931N.js 115.76 kB │ gzip: 42.49 kB
dist/assets/sequenceDiagram-WJ2MYXX4-COmJJ-iZ.js 116.93 kB │ gzip: 31.11 kB
dist/assets/architectureDiagram-5GKGNRK7-DtCJl9Cg.js 151.79 kB │ gzip: 43.13 kB
dist/assets/katex-HP8lGamR.js 261.31 kB │ gzip: 77.57 kB
dist/assets/cytoscape.esm-BB4DxJjf.js 443.04 kB │ gzip: 141.98 kB
dist/assets/cynefin-OW5HDTMX-CZKzay6A.js 687.91 kB │ gzip: 154.14 kB
dist/assets/index-BRQo931A.js 2,828.45 kB │ gzip: 805.36 kB
(!) Some chunks are larger than 500 kB after minification. Consider:
- Using dynamic import() to code-split the application
- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks
- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.
✓ built in 7.56s
precompress: 49 candidate(s) under /home/weichen/projects/Agent-System/web/dist
br assets/abnfDiagram-VCTEODGH-CmO9Yw3i.js 1774 → 799 (−55.0%)
gzip assets/abnfDiagram-VCTEODGH-CmO9Yw3i.js 1774 → 878 (−50.5%)
br assets/arc-DmxstecQ.js 3434 → 1287 (−62.5%)
gzip assets/arc-DmxstecQ.js 3434 → 1451 (−57.7%)
br assets/architectureDiagram-5GKGNRK7-DtCJl9Cg.js 151788 → 36890 (−75.7%)
gzip assets/architectureDiagram-5GKGNRK7-DtCJl9Cg.js 151788 → 42821 (−71.8%)
br assets/blockDiagram-I7D4REHJ-C5UUB1D3.js 41722 → 11936 (−71.4%)
gzip assets/blockDiagram-I7D4REHJ-C5UUB1D3.js 41722 → 13449 (−67.8%)
br assets/c4Diagram-7LVT6UL2-DlzAJv6o.js 65438 → 15139 (−76.9%)
gzip assets/c4Diagram-7LVT6UL2-DlzAJv6o.js 65438 → 18661 (−71.5%)
br assets/chunk-F27PBJKO-CU0eGPkO.js 1876 → 732 (−61.0%)
gzip assets/chunk-F27PBJKO-CU0eGPkO.js 1876 → 826 (−56.0%)
br assets/chunk-IMKFNOWR-DwxAWDJr.js 38069 → 10969 (−71.2%)
gzip assets/chunk-IMKFNOWR-DwxAWDJr.js 38069 → 12426 (−67.4%)
br assets/chunk-SVP7TREG-DvAL8o3E.js 15728 → 3960 (−74.8%)
gzip assets/chunk-SVP7TREG-DvAL8o3E.js 15728 → 4412 (−71.9%)
br assets/chunk-TICWLB2K-BHQH33V8.js 49171 → 13029 (−73.5%)
gzip assets/chunk-TICWLB2K-BHQH33V8.js 49171 → 15642 (−68.2%)
br assets/cose-bilkent-JH36ORCC-BMviVy7P.js 81662 → 19567 (−76.0%)
gzip assets/cose-bilkent-JH36ORCC-BMviVy7P.js 81662 → 22374 (−72.6%)
br assets/cynefin-OW5HDTMX-CZKzay6A.js 687914 → 124578 (−81.9%)
gzip assets/cynefin-OW5HDTMX-CZKzay6A.js 687914 → 153070 (−77.7%)
br assets/cynefinDiagram-5FMLGOSQ-4jpqDyHD.js 10062 → 3227 (−67.9%)
gzip assets/cynefinDiagram-5FMLGOSQ-4jpqDyHD.js 10062 → 3599 (−64.2%)
br assets/cytoscape.esm-BB4DxJjf.js 443036 → 119602 (−73.0%)
gzip assets/cytoscape.esm-BB4DxJjf.js 443036 → 141741 (−68.0%)
br assets/dagre-GXQ25YYZ-CDTkvl4M.js 10641 → 3663 (−65.6%)
gzip assets/dagre-GXQ25YYZ-CDTkvl4M.js 10641 → 4026 (−62.2%)
br assets/defaultLocale-DX6XiGOO.js 4688 → 2012 (−57.1%)
gzip assets/defaultLocale-DX6XiGOO.js 4688 → 2166 (−53.8%)
br assets/diagram-S7CK7UJ4-KQlOFv-j.js 8182 → 3328 (−59.3%)
gzip assets/diagram-S7CK7UJ4-KQlOFv-j.js 8182 → 3662 (−55.2%)
br assets/diagram-UQ7AKVKN-XeKXP9hN.js 6044 → 2348 (−61.2%)
gzip assets/diagram-UQ7AKVKN-XeKXP9hN.js 6044 → 2598 (−57.0%)
br assets/diagram-VSXAHHWV-C4qsb062.js 10681 → 3766 (−64.7%)
gzip assets/diagram-VSXAHHWV-C4qsb062.js 10681 → 4135 (−61.3%)
br assets/diagram-VX7I27RA-qAGIKB86.js 15922 → 5150 (−67.7%)
gzip assets/diagram-VX7I27RA-qAGIKB86.js 15922 → 5691 (−64.3%)
br assets/diagram-Z3DM3KII-DUS12Pj1.js 4176 → 1629 (−61.0%)
gzip assets/diagram-Z3DM3KII-DUS12Pj1.js 4176 → 1804 (−56.8%)
br assets/ebnfDiagram-PWID7BFC-D2Vt6aU-.js 1970 → 785 (−60.2%)
gzip assets/ebnfDiagram-PWID7BFC-D2Vt6aU-.js 1970 → 867 (−56.0%)
br assets/erDiagram-RLTQ6QDP-sCxe6Q38.js 30755 → 9147 (−70.3%)
gzip assets/erDiagram-RLTQ6QDP-sCxe6Q38.js 30755 → 10519 (−65.8%)
br assets/flowDiagram-HODETNUW-Cw7thQvJ.js 61840 → 16365 (−73.5%)
gzip assets/flowDiagram-HODETNUW-Cw7thQvJ.js 61840 → 19712 (−68.1%)
br assets/ganttDiagram-EL5Y4UJY-iciq8lZO.js 69656 → 20697 (−70.3%)
gzip assets/ganttDiagram-EL5Y4UJY-iciq8lZO.js 69656 → 23406 (−66.4%)
br assets/gitGraphDiagram-WWUBYQGX-CT_yETct.js 29382 → 7765 (−73.6%)
gzip assets/gitGraphDiagram-WWUBYQGX-CT_yETct.js 29382 → 8676 (−70.5%)
br assets/index-BRQo931A.js 2828454 → 625162 (−77.9%)
gzip assets/index-BRQo931A.js 2828454 → 797961 (−71.8%)
br assets/index-BYHTgAJJ.css 36824 → 8557 (−76.8%)
gzip assets/index-BYHTgAJJ.css 36824 → 9952 (−73.0%)
br assets/ishikawaDiagram-5VMMS53U-VJOyh3e4.js 17434 → 5996 (−65.6%)
gzip assets/ishikawaDiagram-5VMMS53U-VJOyh3e4.js 17434 → 6611 (−62.1%)
br assets/journeyDiagram-3NMN7TZE-CqGR23gX.js 23536 → 7526 (−68.0%)
gzip assets/journeyDiagram-3NMN7TZE-CqGR23gX.js 23536 → 8315 (−64.7%)
br assets/kanban-definition-UXKFOSKX-wobvSbOw.js 20256 → 6411 (−68.4%)
gzip assets/kanban-definition-UXKFOSKX-wobvSbOw.js 20256 → 7151 (−64.7%)
br assets/katex-HP8lGamR.js 261313 → 63694 (−75.6%)
gzip assets/katex-HP8lGamR.js 261313 → 77109 (−70.5%)
br assets/layout-Bviwq0iM.js 35429 → 11550 (−67.4%)
gzip assets/layout-Bviwq0iM.js 35429 → 12741 (−64.0%)
br assets/linear-CZN4dYL9.js 5654 → 2116 (−62.6%)
gzip assets/linear-CZN4dYL9.js 5654 → 2311 (−59.1%)
br assets/mindmap-definition-YA3MSWOX-C8Q9dvOK.js 23140 → 7004 (−69.7%)
gzip assets/mindmap-definition-YA3MSWOX-C8Q9dvOK.js 23140 → 7775 (−66.4%)
br assets/ordinal-Cboi1Yqb.js 1189 → 497 (−58.2%)
gzip assets/ordinal-Cboi1Yqb.js 1189 → 574 (−51.7%)
br assets/pegDiagram-XKGWAZYB-CvrplaV8.js 1921 → 802 (−58.3%)
gzip assets/pegDiagram-XKGWAZYB-CvrplaV8.js 1921 → 909 (−52.7%)
br assets/pieDiagram-E7YTZNPT-nPjKT_2q.js 6259 → 2382 (−61.9%)
gzip assets/pieDiagram-E7YTZNPT-nPjKT_2q.js 6259 → 2610 (−58.3%)
br assets/quadrantDiagram-AXDQQJYC-DbMVE9Gd.js 33975 → 8514 (−74.9%)
gzip assets/quadrantDiagram-AXDQQJYC-DbMVE9Gd.js 33975 → 9855 (−71.0%)
br assets/railroadDiagram-O6MQD6OU-D_cuFmOe.js 1571 → 662 (−57.9%)
gzip assets/railroadDiagram-O6MQD6OU-D_cuFmOe.js 1571 → 739 (−53.0%)
br assets/requirementDiagram-BXWQKSXE-CDfucG1b.js 30965 → 8224 (−73.4%)
gzip assets/requirementDiagram-BXWQKSXE-CDfucG1b.js 30965 → 9637 (−68.9%)
br assets/sankeyDiagram-P5KCCOFB-DXwsYDQi.js 23163 → 7810 (−66.3%)
gzip assets/sankeyDiagram-P5KCCOFB-DXwsYDQi.js 23163 → 8545 (−63.1%)
br assets/sequenceDiagram-WJ2MYXX4-COmJJ-iZ.js 116927 → 25723 (−78.0%)
gzip assets/sequenceDiagram-WJ2MYXX4-COmJJ-iZ.js 116927 → 30935 (−73.5%)
br assets/stateDiagram-D77RDMKH-D8z_5wV8.js 10326 → 3309 (−68.0%)
gzip assets/stateDiagram-D77RDMKH-D8z_5wV8.js 10326 → 3604 (−65.1%)
br assets/swimlanes-42K2YHIH-Dtpm931N.js 115756 → 36607 (−68.4%)
gzip assets/swimlanes-42K2YHIH-Dtpm931N.js 115756 → 42151 (−63.6%)
br assets/timeline-definition-24CTP7MA-DPJkKbyY.js 30794 → 9110 (−70.4%)
gzip assets/timeline-definition-24CTP7MA-DPJkKbyY.js 30794 → 10123 (−67.1%)
br assets/vennDiagram-4TSXK5OY-9GW76nJr.js 41926 → 13978 (−66.7%)
gzip assets/vennDiagram-4TSXK5OY-9GW76nJr.js 41926 → 15621 (−62.7%)
br assets/wardleyDiagram-VM6X3IG4-DHyRRN95.js 25467 → 6070 (−76.2%)
gzip assets/wardleyDiagram-VM6X3IG4-DHyRRN95.js 25467 → 6736 (−73.6%)
br assets/xychartDiagram-S5SC5T6Z-DDk6Gun7.js 44474 → 11029 (−75.2%)
gzip assets/xychartDiagram-S5SC5T6Z-DDk6Gun7.js 44474 → 12519 (−71.9%)
br fonts/OFL.txt 4474 → 1437 (−67.9%)
gzip fonts/OFL.txt 4474 → 1980 (−55.7%)
precompress: wrote 49 .br and 49 .gz
@@ -0,0 +1,501 @@
> shuimu-workbench@1.0.0 test
> tsx --test "src/**/!(*InteractiveCard*|*chatWindowArtifact*|*deliverableSync*).test.ts" && vitest run src/components/chat/InteractiveCard.test.ts src/components/chat/chatWindowArtifact.test.ts src/components/chat/deliverableSync.test.ts
✔ AuthClient: 基础登录与 .env 超级管理员鉴权 (2.034199ms)
✔ AuthClient: 自主注册受控流程(仅填用户名密码姓名,职位强制绑定访客待指派) (0.546764ms)
✔ AuthClient: 开启注册需审批时,注册账号处于待审状态并禁止登录 (0.713809ms)
✔ AuthClient: 管理员创建账号必须在首次登录修改密码 (0.362569ms)
✔ mapUserAccount: snake_case Go contract → camelCase (3.250703ms)
✔ mapUserAccount: prefers snake_case when both present (0.230133ms)
✔ mapLoginResult + mapMeResult map nested user and top-level must_change_password (0.98476ms)
✔ mapUserAccountList maps admin users list (0.439726ms)
✔ AuthClient.login + fetchMe map real snake_case wire payloads (31.163394ms)
✔ shouldAutoRetryChat: disabled until idempotency (0.994961ms)
✔ shouldAutoRetryTask: transient only, max 2 (0.219673ms)
✔ shouldAutoRetryTask: document busy never retries (0.134136ms)
✔ shouldAutoRetry alias delegates to task path (0.177825ms)
✔ autoRetryDelayMs: 1s then 2s (0.137256ms)
✔ fallbackErrorClass: network → transient, workspace → resumable (0.160915ms)
✔ upsertChatSession surfaces safe INTERNAL envelope instead of raw JSON text (28.394537ms)
✔ parseSSEChunk: parses event and data lines (1.147526ms)
✔ parseSSEChunk: keeps incomplete frame in rest (0.280022ms)
✔ parseSSEChunk: flush parses final frame without trailing delimiter (0.308231ms)
✔ parseSSEChunk: ignores heartbeat comments and keeps last id (0.195585ms)
▶ docgov lifecycle API client
✔ claimDocument posts to /api/v1/docgov/claim with author role (26.020368ms)
✔ submitForReview posts to /api/v1/docgov/submit-review (3.961062ms)
✔ reviewDecision posts action and optional reason (1.02857ms)
✔ approverDecision posts action and rollback_to (1.69846ms)
✔ proposeModification posts to /api/v1/docgov/proposal (1.907293ms)
✔ decideModificationProposal posts to /api/v1/docgov/proposal/decide (0.873284ms)
✔ docgov lifecycle API client (37.001941ms)
✔ updateFreeformDoc exposes CONCURRENCY_CONFLICT on 409 (31.68295ms)
✔ addProjectMember exposes structured ProjectSettingsApiError on 403 (20.304557ms)
✔ updateProjectMember surfaces safe INTERNAL message on 500 duty-sync failure (1.955283ms)
▶ projectSettingsError
✔ keeps status, code, message and issues on PLAN_FROZEN (2.118127ms)
✔ maps revision and concurrent conflicts to distinct recovery (0.208044ms)
✔ joins validation issues but still keeps typed codes (0.227973ms)
✔ prefers envelope code over legacy error field (0.194604ms)
✔ unwraps nested business JSON inside VERSION_CONFLICT envelope (0.199834ms)
✔ maps bare VERSION_CONFLICT envelope to retry_after_switch (0.157235ms)
✔ retains the local draft when a late tab hits PLAN_FROZEN (0.142606ms)
✔ prefers error_code over legacy bare error string (DOC_BUSY) (0.31175ms)
✔ projectSettingsError (5.734349ms)
✔ Project workflow types validation (1.327901ms)
✔ createTaskRun exposes DOC_BUSY detail without a retryable run (26.729047ms)
✔ parseSSEChunk tracks id seq for after_seq reconnect (3.311952ms)
✔ subscribeTaskRunEvents reconnects on EOF with advancing after_seq (2.249163ms)
✔ readTaskRunSSEOnce marks non-terminal EOF for reconnect (0.515205ms)
✔ buildTaskRequest: maps five project fields + task_key + user identity (1.184335ms)
✔ buildTaskRequest: omits optional fields when absent (0.208253ms)
✔ buildTaskRequest: includes materials when provided and non-empty (1.32871ms)
✔ buildResumeRequest: adds work_dir on top of task request (0.195254ms)
✔ buildTaskRequest: canonicalizes legacy doc-p doc_id (0.267802ms)
✔ buildTaskRequest: UI-05 pinned intake keeps task_key + doc_proj6109_intake (0.169565ms)
✔ buildResumeRequest: forwards add_steps when provided (0.148006ms)
✔ CategoryDock: 渲染顶部 🔔 未读提醒项及角标数字 (19.311767ms)
✔ CategoryDock: isAllReadCompleted 为 true 时渲染完成态提示 (2.877615ms)
✔ CategoryDock: 0 未读时不渲染红色未读角标 (2.624412ms)
✔ CategoryDock: 分类项包含依次跳转与遍历提示信息 (2.68152ms)
✔ InputArea keeps draft when send preflight fails (1.270642ms)
✔ InputArea clears draft only after accepted send (0.573713ms)
✔ InputArea shows thinking block message (0.182355ms)
✔ InputArea keeps draft when attachment registration fails (0.289551ms)
✔ isTemplateOnly 交付物应正确识别为初始模板展示态 (0.891524ms)
✔ 左侧栏鼠标严密绝对跟随与夹紧测试 (Left Rail Exact Pointer Following & Clamping) (0.869095ms)
✔ 右侧栏鼠标严密绝对跟随与反向位移测试 (Right Rail Exact Pointer Following & Inverted Delta) (0.196544ms)
✔ detects legacy mock and neuropulse/ten-projects ids (0.867854ms)
✔ detects colliding demo project ids (0.225914ms)
✔ applyRestoredFileRaw: 以 prev 为权威,只补丁缺失 fileRaw,不丢新增条目 (1.419408ms)
✔ applyRestoredFileRaw: 无可用 fileRaw 时返回同一引用 (0.258752ms)
✔ 每人独立私聊:同一项目不同用户拥有不同 sessionId (1.089598ms)
✔ 左侧会话列表按当前用户过滤,不可见他人私聊 (0.304431ms)
✔ 消息严格归属各自私聊 session,无跨用户混聊 (2.554115ms)
✔ 切换用户时 resolve 到该用户同项目私聊会话 (0.366169ms)
✔ resolve 优先有消息的私聊,跳过空壳 sess-p{N}-u{id} (0.620421ms)
✔ ensurePrivateSessionsForUser 为缺失用户补齐空私聊 (0.6765ms)
✔ 多项目会话消息隔离测试仍成立(endo vs ultrasound) (0.399178ms)
✔ window cache LRU: 驱逐带 userId 前缀的完整 cache key,不留孤儿条目 (1.007ms)
✔ window cache: 读写同一 userId 前缀,跨用户不串读 (0.229293ms)
✔ parseAnchorHash: 正确解析标准深链 hash (2.177045ms)
✔ formatAnchorHash: 正确构造深链格式 (0.206664ms)
✔ navigateToAnchor: 快路径直接命中 DOM 节点 (0.528235ms)
✔ navigateToAnchor: 慢路径拉取分片后命中 (80.910047ms)
✔ resolveTurnAnchorId: 方案 A 轮次归一化测试 (0.485246ms)
✔ 全链路场景 1: 用户自主受控注册(仅填用户名/密码/姓名,职位严格绑定访客待指派) (1.66765ms)
✔ 全链路场景 2: 系统准入策略(关闭自主注册与开启强制审批流转) (0.962862ms)
✔ 全链路场景 3: 管理员开通账号首次强制改密闭环 (1.570374ms)
✔ 全链路场景 4: 环境标识随登录会话返回(dev/test/main) (0.261912ms)
✔ cleanHeadingContent: 手工多级序号前缀清洗与专业词汇保护 (1.446307ms)
✔ 标题多层级自动编号:单 H1 文档总标题自适应模式 (1 -> 1.1 -> 1.1.1) (0.487195ms)
✔ 标题多层级自动编号:多 H1 标准大章模式 (0.234963ms)
✔ 跨章节图、表、公式多级按章重编号测试 (表 1-1, 表 2-1, 图 3-1, 式 (4-1)) (0.235353ms)
✔ 有序列表与无序列表编号与渲染功能测试 (2.285072ms)
✔ 动态块操作闭环重编号验证 (Insert, Move, Delete) (0.239673ms)
✔ findMatchingBlockForReview: 能够精准按审查关键词(电气安全/EMC/竞品)定位段落块 (1.084587ms)
✔ findMatchingBlockForReview: 能够按外部指定 hint 线索精确命中目标块 (1.023459ms)
✔ createRejectConfirmationCard: 生成合规危险级驳回门禁卡片 (0.68659ms)
✔ isAffirmativeResponse: 准确识别双轨交互中的肯定意图输入 (0.238043ms)
✔ findLastActiveCard: 正确在会话历史中提取最新的待决策卡片 (0.209104ms)
✔ decrementActiveCardsTtl: 多轮对话超时递减与自动失效归档 (0.176705ms)
✔ applyConfirmRejectToDoc & applyUndoRejectToDoc: 驳回挂载批注与60s窗口期撤销完整闭环 (0.34294ms)
✔ resolveCardInMessages & cancelCardInMessages: 消息流中卡片终态沉淀 (0.190015ms)
✔ classifyRejectUtterance: 询问原因 → QUERY_REJECT_REASON (1.526025ms)
✔ classifyRejectUtterance: 明确执行 → EXECUTE_REJECT (0.197874ms)
✔ classifyRejectUtterance: 模糊 → OTHER (0.227713ms)
✔ resolveDocGovCard: 编制人查询 → 信息卡且无 confirm_reject (1.756368ms)
✔ resolveDocGovCard: 审核人执行 + reviewing → 确认卡 (0.560554ms)
✔ resolveDocGovCard: 编制人误说执行驳回 → 无权纯文本 (0.190124ms)
✔ resolveDocGovCard: 批准人 + approving → 终审确认卡 (0.159875ms)
✔ resolveDocGovCard: 编制人 OTHER → 引导查询无危险按钮 (0.110746ms)
✔ canConfirmReject: 仅审核/批准 (0.149846ms)
✔ deriveFallbackCategory identifies categories correctly (0.881484ms)
✔ enrichMessagesWithCategories backfills categories without overwriting existing ones (0.310071ms)
✔ Markdown ➔ Block AST 解析测试 (标题自适应编号与图表公式全链路) (4.233044ms)
✔ 动态重编号引擎测试 (多 H1 规范章节重排验证) (0.479196ms)
✔ Block AST ➔ Markdown 双向无损往返还原测试 (0.720528ms)
✔ 三层交付物多用户隐私绝对隔离测试 (Multi-user Strict Privacy Isolation) (1.457446ms)
✔ 一键共享至项目参考库流转测试 (Promote to Shared Reference Test) (0.31269ms)
✔ 撤回共享恢复私有草稿测试 (Revoke Shared Reference Test) (0.605442ms)
✔ 受控工作流纯净性红线检验 (Workflow Purity Security Red Line) (0.224294ms)
✔ isSameMessage: clientTurnId match (0.973431ms)
✔ isSameMessage: serverId match without turn (0.224513ms)
✔ filterPendingLiveMessages: real temp vs server id (0.210714ms)
✔ mergeLiveOverHistory preserves server id from live (0.171645ms)
✔ applyPhaseEvent: appends first phase as running node (1.036569ms)
✔ applyPhaseEvent: completes predecessors when a new phase arrives (0.211994ms)
✔ applyPhaseEvent: same phase refreshes label in place (no duplicate node) (0.196464ms)
✔ applyPhaseEvent: unknown phase falls back to hourglass meta (0.109347ms)
✔ applyPhaseEvent: prefers backend message over short label (0.107677ms)
✔ applyPhaseEvent: step_completed closes running entry without appending (0.123596ms)
✔ applyPhaseEvent: stage_completed closes entries (0.111697ms)
✔ applyPhaseEvent: task_failed appends warning node (0.116246ms)
✔ applyPhaseEvent: decorates label with step index / total steps (0.118057ms)
✔ applyPhaseEvent: repeated step_executing with step_index gets separate nodes (0.233463ms)
✔ applyPhaseEvent: ignores event without phase payload (0.079978ms)
✔ applyPhaseEvent: step_failed marks running entry as failed (keeps step label) (0.110967ms)
✔ applyPhaseEvent: step_failed appends failed node when no running entry exists (0.096467ms)
✔ applyPhaseEvent: retry of a failed step resets it to running (0.104077ms)
✔ PLAN_CONFIRM 卡片来自 PlanView 且不触达 AST (1.132557ms)
✔ 409 冲突把卡片标为 outdated 并换上最新 revision (0.247232ms)
✔ GET reconcile 用权威 PlanView 覆盖本地 executing,不假装成功 (0.203974ms)
✔ 过期计划映射 expired (0.124597ms)
✔ 非计划卡不被误判 (0.149846ms)
✔ 集成验证:项目切换时交付物严格隔离,新建项目即刻包含 7 份模板副本 (4.72263ms)
✔ 集成验证:三层隐私与项目物理隔离双重约束 (2.0206ms)
✔ 用例 1: DEFAULT_ROLES 包含 5 种默认角色且具备预期权限 (0.904913ms)
✔ 用例 2: 系统管理员 (ADMIN) 与具备 perm:manage 用户的通配豁免特权 (0.208344ms)
✔ 用例 3: 常规工作流基线可见性 (workflow:view_all) 判定 (0.181694ms)
✔ 用例 4: 单文档覆盖 - designated_only (仅编制/审核/批准人可见,其他用户被精确拦截) (0.123686ms)
✔ 用例 5: 单文档覆盖 - role_whitelist (仅白名单内角色可见,其他角色被精确拦截) (0.147296ms)
✔ 用例 6: 单文档覆盖 - public (放宽可见性,无 workflow:view_all 权限的访客也能查阅) (0.088438ms)
✔ 用例 7: 私密文档隔离强红线 (category === private 无论任何管理员或单文档覆盖,非创建者绝对不可见) (0.221623ms)
✔ 用例 8: 核心业务动作权限拦截判定 (canPerformDocAction & hasPermission) (0.149816ms)
✔ 用例 9: filterVisibleDeliverablesWithRBAC 能够批处理过滤大盘交付物 (1.01168ms)
✔ 集成场景 1: 动态新增合规审计员角色,并配置其仅能查阅特定单文档覆盖 (1.965932ms)
✔ 集成场景 2: 服务端 capabilities 变更后权限即刻生效 (0.251343ms)
✔ 集成场景 3: 单文档覆盖 designated_only 严格收紧与撤回恢复全流程 (0.256982ms)
✔ renderInlineMarkdown: renders bold, italic, strikethrough (1.01895ms)
✔ renderInlineMarkdown: escapes raw HTML tags to prevent XSS (0.429787ms)
✔ renderInlineMarkdown: blocks javascript: link hrefs (0.126306ms)
✔ renderInlineMarkdown: renders inline code and preserved line breaks (0.197234ms)
✔ renderInlineMarkdown: renders headings lists and tables for chat replies (0.376799ms)
✔ sanitizeMermaidCode: auto wraps unquoted labels containing brackets or comparison operators (0.303171ms)
(node:193515) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.
(Use `node --trace-warnings ...` to show where the warning was created)
✔ DOCX 渲染器行内文本与公式解析测试 (parseInlineContent) (6.312783ms)
✔ DOCX 渲染器 LaTeX 原生 OMML 转换引擎测试 (latexToOmml) (2.69041ms)
✔ DOCX 渲染器 Mermaid 语法净化与容错测试 (sanitizeMermaidCode) (0.290272ms)
✔ DOCX 渲染器 SVG 净化防 Canvas 污染测试 (cleanSvgForCanvas) (0.369509ms)
✔ DOCX 渲染器全量编译测试 (buildDocxModel & exportDocumentToDocx) (48.761152ms)
✔ XLSX 渲染器多表提取与工作簿编译测试 (buildXlsxWorkbook & exportDocumentToXlsx) (5.995472ms)
▶ Reply Document IR & Export Engine
✔ deriveReplyTitle and sanitizeFilename derive title and safe file name (1.163185ms)
✔ deriveReplyTitle handles text without heading (0.208954ms)
✔ parseReplyMarkdown parses headers, lists, code, and tables (1.901133ms)
✔ renderClipboardHtml renders self-contained styling for office tools (0.497565ms)
✔ renderClipboardHtml converts LaTeX formulas to native MathML for Word/Office (3.075419ms)
✔ renderPlainText strips formatting cleanly (0.452687ms)
✔ serializeMarkdown round-trips to valid markdown (0.297191ms)
✔ stripUnsafeHtml strips script tags and dangerous event handlers (0.428898ms)
✔ Reply Document IR & Export Engine (9.209457ms)
✔ createProjectTemplateDeliverables: 必须精确生成 7 份全生命周期受控文档副本 (4.270323ms)
✔ resolveRequirementsTaskKey prefers intake for 初始需求表 (1.531514ms)
✔ resolveRequirementsTaskKey selects user_requirements for explicit URS (0.218124ms)
✔ UI-02 first-round prompt with 首轮+用户需求+摸底 must be intake not user_requirements (0.783826ms)
✔ 首轮 / 需求摸底 / 摸底 beat bare 用户需求 (0.160975ms)
✔ bare 用户需求 without V0.1 markers stays user_requirements (0.124797ms)
✔ matchTemplateDeliverable uses intake key when pool only has URS template (0.165735ms)
✔ resolveTaskTemplateForMessage keeps intake key with URS-only pool (0.200384ms)
✔ matchTemplateDeliverable prefers intake when both templates exist (0.156096ms)
✔ read-only request does not start a document task: 总结一下用户初始需求表 (1.059559ms)
✔ read-only request does not start a document task: 查看用户初始需求表 (0.212343ms)
✔ read-only request does not start a document task: 用户初始需求表现在谁在编辑 (0.790577ms)
✔ read-only request does not start a document task: 分析一下用户需求表里的风险 (0.098577ms)
✔ read-only request does not start a document task: 用户初始需求表 (0.628012ms)
✔ explicit write action still starts intake (0.152685ms)
✔ explicit update action still starts URS (0.206134ms)
✔ UI-05 prompt without active doc still keyword-routes to feasibility_reg (0.316581ms)
✔ UI-05 prompt + registered intake pins intake and doc_proj6109_intake (0.308181ms)
✔ read-only current-doc request does not start a task (0.079858ms)
✔ template-only active slot is not pinned; keywords still apply (0.123216ms)
✔ explicit named deliverable can switch away from active intake (0.301551ms)
✔ domain 注册法规 without current-doc deixis still routes feasibility_reg (0.108417ms)
✔ mismatched title vs docId suffix prefers docId taskKey (0.125726ms)
✔ deixis 当前文档 pins registered intake (0.130916ms)
✔ deixis 本文件 pins registered intake (0.065358ms)
✔ deixis 这份文档 pins registered intake (0.054238ms)
✔ deixis 本文档 pins registered intake (0.057938ms)
✔ deixis 本受控文档 pins registered intake (0.057258ms)
✔ no active doc does not invent a pin (0.115167ms)
✔ UI-11 named 系统设计输入 beats negated 需求 background (0.098547ms)
✔ mixed generate-design + do-not-cover-requirements stays prelim_design (0.076247ms)
✔ current-doc pin still wins when no other deliverable is named (0.088977ms)
▶ document revision overlay modes
✔ pure hides all decorations (0.823366ms)
✔ manual only marks human hunks (0.131146ms)
✔ all marks human and agent differently (0.093927ms)
✔ same human hunk stays amber in manual and all (no pairwise style guarantee) (0.285922ms)
✔ exposes needs-content error code for empty orphan docs (0.118026ms)
✔ matches overlay hunks by section or text when ids differ (0.368539ms)
✔ aligns client block ids from head_block_map by order (0.224733ms)
✔ document revision overlay modes (3.151246ms)
▶ toolbar refresh + report entry reachability
✔ pickLatestChangeReportId prefers highest version with report (0.304231ms)
✔ first squad run alone still exposes a reachable report id (0.145636ms)
✔ second squad run keeps both history report entries and latest shortcut (0.182305ms)
✔ revisionRefreshKey is an independent refresh signal from docId (0.115317ms)
✔ toolbar refresh + report entry reachability (1.039689ms)
▶ change report view model
✔ surfaces risk items, project impact, doc impacts with advice, and open questions (0.733489ms)
✔ marks complete analysis as PI narrative vs factual fields (0.68603ms)
✔ preferReportId prioritizes pending over committed latest (0.102347ms)
✔ change report view model (1.670841ms)
▶ revisionToolbarMount
✔ exposes clear non-error template preview hint copy (1.02621ms)
✔ template doc-p + isTemplateOnly=true does not mount (0.231324ms)
✔ legacy doc-001 does not mount (0.230013ms)
✔ unregistered doc-upload orphan does not mount (must register first) (0.197194ms)
✔ server-registered upload (doc-free) and freeform mount (0.214103ms)
✔ canonical doc_proj and generated non-template doc-p mount (0.163635ms)
✔ revisionToolbarMount (3.345851ms)
✔ useChatWindow: 所有 saveSessionWindowCache 调用必须传入 userId (1.113457ms)
✔ window fetch race: stale response ignored by generation (3.307542ms)
✔ mapRecordToMessage: 正确映射服务端消息记录为前端 ChatMessage (1.67179ms)
✔ refresh window: 空 messages 日桶不算有效窗口 (0.260122ms)
✔ mapRawBucket: 正确映射服务端按日分片桶 (0.247113ms)
✔ Category navigation: chip 选中后准确匹配目标分类最新轮次并触发归一化定位 (0.273752ms)
✔ turn runtime: session A stream survives session B switch (0.884393ms)
✔ syncAdminUserDirectories calls local reload then parent onRefreshUsers (1.381709ms)
✔ syncAdminUserDirectories fails closed when onRefreshUsers is a dead/missing prop (0.597542ms)
✔ syncAdminUserDirectories surfaces parent refresh errors (no silent swallow) (0.242903ms)
✔ afterProjectMemberPersisted syncs members then refreshes workflow docs (1.575113ms)
✔ afterProjectMemberPersisted does not refresh when member sync fails (0.67772ms)
▶ blockEditorDialogPolicy
✔ pins an accessible dialog label and exact save name (0.634751ms)
✔ rejects page-wide fuzzy /保存/ that would hit private-library buttons (0.253823ms)
✔ blockEditorDialogPolicy (1.781807ms)
▶ resolveSaveTargetBlock
✔ keeps the editor and does not fake success when the block id is gone (0.875944ms)
✔ never retargets another block that happens to share the same content (0.930772ms)
✔ resolveSaveTargetBlock (3.474337ms)
▶ editor session document binding
✔ fail-closes when activeDocId drifts away from the opened editor doc (2.279142ms)
✔ accepts a save only when the editor is still bound to the active doc (0.202444ms)
✔ blocks switching documents while the editor is open (0.262452ms)
✔ editor session document binding (3.211005ms)
▶ interpretBlockSaveError
✔ 409 keeps the draft in the editor (1.272222ms)
✔ other PATCH failures also keep the editor (0.531114ms)
✔ interpretBlockSaveError (2.36762ms)
▶ blockedGovernanceCopy
✔ recognizes blocked run status and fixed hint, not generation success (0.624891ms)
✔ blockedGovernanceCopy (1.398298ms)
▶ commentPolicy
✔ lets author/reviewer/approver annotate and keeps their comment role (1.027209ms)
✔ keeps viewer read-only: no add entry and no reviewer/approver cast (0.192985ms)
✔ commentPolicy (2.478727ms)
▶ controlledContentInvalidation
✔ hydrate success then late list_sync keeps cache/ready and does not bump resume (1.67773ms)
✔ post_task invalidation drops active cache and requires a new hydrate epoch (0.249542ms)
✔ editor open / save epoch keeps draft and rejects a stale GET after PATCH (0.491675ms)
✔ never drops the active doc without signaling rehydrate (0.134696ms)
✔ candidate helper keeps template / doc-001 / freeform / upload out of wipe lists (0.481595ms)
✔ dropRecordKeys is a no-op when ids are absent (0.121536ms)
✔ controlledContentInvalidation (4.467157ms)
▶ controlledDocHydrate
✔ shouldLoadControlledContent when non-template workflow doc (1.180875ms)
✔ shouldLoadControlledContent rejects local legacy/mock ids like doc-001 (0.167285ms)
✔ shouldLoadControlledContent keeps canonical, freeform-off, and template preview rules (0.162735ms)
✔ hydrateControlledDocumentContent never requests content/revision for doc-001 (0.272702ms)
✔ hydrateControlledDocumentContent never requests for template preview or registered freeform (0.147615ms)
✔ shouldLoadControlledContent stays inside toolbar server-backed eligibility (0.189674ms)
✔ resolveCanonicalDocId maps doc-p56-intake to doc_proj56_intake (0.532884ms)
✔ canonicalDocIdForTask maps doc-p56-research to doc_proj56_research (0.267122ms)
✔ hydrate treats projection missing as ledger content, not 404 (1.774877ms)
✔ attaches hydrate ETag as PATCH baseline and ignores a later GET (1.050309ms)
✔ rejects hydrate when revision-state network or 5xx fails (0.66096ms)
✔ aligns markdownToBlockAST random ids onto revision-state head_block_map (1.733939ms)
✔ leaves Math.random ids when head_block_map is omitted (why gate + fail-closed remain) (0.877414ms)
✔ rejects controlled hydrate on NOT_FOUND or NEEDS_CONTENT (0.299421ms)
✔ fingerprint stays stable when only object identity changes (0.122136ms)
✔ dedupes in-flight hydrate for the same doc fingerprint (0.246292ms)
✔ aligned late hydrate still cannot overwrite a PATCH-success baseline (0.429968ms)
✔ controlledDocHydrate (12.4711ms)
✔ createClientTurnId uses randomUUID when available (0.849025ms)
✔ createClientTurnId falls back to getRandomValues UUID v4 (0.508615ms)
✔ createClientTurnId throws when no secure random API exists (0.418307ms)
✔ selectNonCreatorInitialMembers skips creator only (1.489196ms)
✔ buildManagedMemberUpsertPayload sends document_duty on add/update/restore (0.272792ms)
✔ buildInitialMemberUpsertPayload maps reviewer UI role to member API role (0.157546ms)
✔ persistInitialProjectMembers awaits each add and stops on failure (2.253973ms)
✔ ensureCreatedProjectWithMembers skips recreate on bootstrap id and retries members (0.778967ms)
✔ beginCreateProjectSubmit rejects concurrent second entry until end (31.154445ms)
✔ resolveCreateProjectSubmitPhase uses bootstrap to choose syncing label (0.399628ms)
✔ createProjectSubmitButtonLabel and close block while submitting (0.234703ms)
✔ shouldCloneMedicalTemplates skips the 7-pack for software domain (0.158606ms)
▶ resolveCurrentDocRole
✔ resolves A as author by authoritative user id (0.726319ms)
✔ does not promote reviewer B or stranger to author (0.146886ms)
✔ resolves real USER_B id as reviewer and never name-promotes placeholder 2 (0.127356ms)
✔ fail-closes unknown identity to viewer even if projectPermission says author (0.105207ms)
✔ matches name only for legacy local docs without duty ids (0.103057ms)
✔ does not name-promote when server controlled duties are zero ids (0.104037ms)
✔ resolveCurrentDocRole (2.385589ms)
▶ currentProjectRestore
✔ rejects empty project names (1.106127ms)
✔ rejects page-wide project name when banner and sidebar both match (0.212644ms)
✔ scopes the visible entry to complementary exact title (0.703189ms)
✔ scopes the current project assertion to banner exact text (0.167655ms)
✔ currentProjectRestore (3.294692ms)
▶ deliverableLeaseSync
✔ returns the same array reference when leases are unchanged (0.67409ms)
✔ returns a new array only when a lease actually changes (0.196794ms)
✔ deliverableLeaseSync (1.980591ms)
▶ docGovActionVisibility
✔ hides all approval actions on unmanaged docs (0.68914ms)
✔ gates separated duties by user id, not folded role label (0.160495ms)
✔ author_only: same user holds all three duties and sees all actions (0.105077ms)
✔ author_only: non-duty user sees no actions (0.077288ms)
✔ docGovActionVisibility (1.944413ms)
▶ documentBlockDomAttrs
✔ marks a real DocumentBlock in pure mode without overlay kind (0.747818ms)
✔ keeps the same stable attrs when overlay is later attached separately (0.205174ms)
✔ documentBlockDomAttrs (1.860125ms)
▶ durableBodySnippet
✔ rejects empty persisted snippets (0.938043ms)
✔ lets a later successful revision replace the old snippet (0.184145ms)
✔ does not promote a conflict-failed draft to the expected body (0.104767ms)
✔ durableBodySnippet (2.144007ms)
▶ dutyCellAssertion
✔ parses author, reviewer, and viewer from select value or badge role (0.891724ms)
✔ must not infer author from a row whose option labels include 编制负责人 (0.471676ms)
✔ accepts only a disabled non-assignable reviewer select (0.134366ms)
✔ rejects an enabled reviewer select when the reviewer cannot assign leads (0.114066ms)
✔ rejects canAssignLead=true even if the reviewer select is disabled (0.087937ms)
✔ rejects viewer, author, approver, and unknown values for USER_B (0.201634ms)
✔ dutyCellAssertion (3.093108ms)
▶ decideHydrationApply
✔ applies only when gen, doc, save epoch match and editor is closed (0.812346ms)
✔ rejects a response for another document (0.142636ms)
✔ rejects a superseded generation (0.115787ms)
✔ decideHydrationApply (1.825136ms)
▶ createEditorHydrationGate
✔ does not start a new hydrate while the editor is open (UI-06 fill-window GET) (0.569033ms)
✔ deferred hydrate that resolves after the editor opens does not replace the session (0.240113ms)
✔ covers hydrate resolving between fill and save (0.189724ms)
✔ asks for a hydrate resume after editor_open blocked the first apply (0.162015ms)
✔ asks for a hydrate resume when beginHydration is skipped while editing (0.133576ms)
✔ requestHydrationResume is consumed once after a protected edit session (0.127416ms)
✔ late hydrate after a successful PATCH does not roll back the new baseline (0.154706ms)
✔ createEditorHydrationGate (2.985541ms)
✔ mergeSessionUser prefers session identity over stale catalog entry (1.206564ms)
▶ playwrightPhaseArtifacts
✔ defaults unknown or empty UI_PHASE to main (0.596423ms)
✔ keeps post-restart distinct from main so the second run cannot overwrite traces (0.167465ms)
✔ keeps main results at the historical filename and isolates post-restart recordPass (0.092747ms)
✔ shares phase-state and secrets across phases (0.063188ms)
✔ playwrightPhaseArtifacts (1.990091ms)
✔ resolvePostTaskActiveDocId prefers server doc_proj for taskKey (1.238863ms)
✔ resolvePostTaskActiveDocId honors preferred server doc id (0.299231ms)
✔ shouldSwitchTemplateSlotToServer when active is local template slot (0.225523ms)
✔ pollUntilPostTaskServerDoc retries until same taskKey server doc appears (0.65511ms)
✔ pollUntilPostTaskServerDoc returns null after maxAttempts without relying on setState (0.384049ms)
✔ mapServerProjectToProjectInfo maps creator and preserves local members (0.687079ms)
✔ mergeProjectLists drops local-only demo seed projects by default (0.292231ms)
✔ mergeProjectLists can retain local-only demo when explicitly opted in (0.113797ms)
✔ documentDutyFromMemberRole maps UI reviewer and creator (0.762377ms)
✔ exclusiveMemberRoleChange keeps a single reviewer (0.228733ms)
✔ memberRoleFromDocumentDuty does not invent reviewer from access role (0.139236ms)
✔ toApiProjectRole maps doc roles to member and creator to owner (0.734378ms)
✔ fromApiProjectRole maps owner to creator for project creator (0.169205ms)
✔ mapApiMemberToProjectMember builds UI record (0.286971ms)
▶ projectSettingsDuties
✔ toggles full to none by atomically clearing duties (1.104327ms)
✔ blocks partial saves and locates required/governance issue codes (0.35257ms)
✔ allows an all-none configurable draft without three members (0.145796ms)
✔ requires three members once any document is managed (0.824536ms)
✔ resolves author_only to A/A/A without three-member requirement (0.299091ms)
✔ rejects author_only without author or with conflicting reviewers (0.171585ms)
✔ mixed full + author_only still requires three members for the full doc (0.113477ms)
✔ toggleAuthorOnly clears review/approve slots and restores on disable (0.144466ms)
✔ projectSettingsDuties (4.213264ms)
▶ projectSettingsMode
✔ enters frozen when can_edit_plan is false or the project is active (0.66885ms)
✔ stays planning only for an editable draft (0.144075ms)
✔ lists enabled duties for the frozen snapshot and skips disabled tasks (0.742178ms)
✔ keeps the local draft after PLAN_FROZEN refresh and switches to frozen (0.156575ms)
✔ projectSettingsMode (2.731539ms)
▶ revisionEtag
✔ uses stale hydrate ETag for PATCH and never the latest GET (0.527664ms)
✔ does not invent 0:0 when controlled hydrate misses etag or errors (0.140626ms)
✔ refuses controlled save without a hydrate ETag (0.393338ms)
✔ allows freeform bootstrap 0:0 only (0.098847ms)
✔ revisionEtag (1.979661ms)
▶ saveControlledBlockEdit
✔ successful save calls PATCH once with bound docId, hydrate ETag, body and client_block_map (1.746718ms)
✔ does not PATCH when editorDocId and activeDocId diverge (0.158485ms)
✔ does not PATCH on stale block id and keeps the draft (0.099717ms)
✔ 409 does not close the editor or drop the draft (0.567033ms)
✔ network errors do not close the editor or drop the draft (0.216564ms)
✔ saveControlledBlockEdit (3.70734ms)
✔ parseProjectIdFromSessionId decodes sess-p{id}-u{user} (0.894913ms)
✔ resolveSessionProjectId prefers explicit id then session id encoding (0.197115ms)
✔ mapServerSessionToProjectSession fills project metadata (0.595552ms)
✔ mergeSessionLists keeps local stage while applying server counts (0.192965ms)
▶ squadCompletionObservation
✔ accepts a directly completed adjacent assistant without requiring inflight (0.812386ms)
✔ accepts a turn that passed through inflight then completed (0.172555ms)
✔ rejects error terminals, missing correspondence, and visible errors (0.152685ms)
✔ keeps waiting while still inflight and does not treat inflight as success (0.131586ms)
✔ squadCompletionObservation (2.297622ms)
✔ resolveReconnectRunId prefers explicit opts and ignores attempt without opts (0.618252ms)
✔ shouldSubscribeExistingRun only for in-flight statuses (0.142306ms)
✔ isRemoteTaskTerminal covers confirmation and quality_failed (0.084658ms)
✔ nextAttemptOpts carries retained runId for reconnect without new POST (0.079878ms)
▶ uploadFreeformRegister
✔ buildUploadClientKey prefers explicit hint then doc-upload stamp (1.475666ms)
✔ registerUploadAttachments hard-fails without creating orphan on API error (11.151259ms)
✔ registerUploadAttachments rejects local doc-upload id from server (0.308221ms)
✔ registerUploadAttachments returns server doc-free ids and freeform facts (0.480816ms)
✔ deliverableFromFreeformUpload maps server id and upload facts (0.152796ms)
✔ uploadFreeformRegister (14.732962ms)
▶ workflowCategoryNavigation
✔ private menu cannot see doc_proj* so it must switch to workflow before exact select (1.255773ms)
✔ fail-closes when the workflow menu is showing but the exact doc is missing (0.187644ms)
✔ label and taskKey opens always require the workflow category (0.077478ms)
✔ workflowCategoryNavigation (2.263063ms)
▶ no external Google Fonts on login shell
✔ index.html has no fonts.googleapis / fonts.gstatic (0.563684ms)
✔ styles reference self-hosted fonts.css (0.206844ms)
✔ no external Google Fonts on login shell (1.408128ms)
▶ 用户上传文档多格式在线预览体系与渲染分流测试
✔ 1. 上传附件时正确注入 sourceType: "uploaded_file" 与完整 fileMeta 元数据 (0.654511ms)
✔ 2. 扩展名分类规则准确分发至对应的高保真渲染器类型 (0.174895ms)
✔ 3. 受控工作流交付物严格隔离:绝不命中 FilePreviewPanel,保持 BlockRenderer 纯净 (0.108977ms)
✔ 4. 上传文档支持受控流转:从个人私密一键共享至项目参考库后,在线预览依然可用且权限标态正确 (0.094037ms)
✔ 用户上传文档多格式在线预览体系与渲染分流测试 (1.841435ms)
▶ 项目立项、成员职责分配与退出留痕治理测试套件
✔ 1. 默认项目库包含完整元数据与法定三权成员 (active 状态) (0.450287ms)
✔ 2. 跨用户会话可见性严格隔离:未加入成员完全不可见 (0.187594ms)
✔ 3. 创建者添加新成员并分配职责后,新成员即刻可见该项目会话 (0.109617ms)
✔ 4. 中途加入后期退出 (exited):保留项目会话但标记已退出只读留痕 (0.105847ms)
✔ 5. 超级管理员 (ADMIN) 享有全量通配可见与管理兜底特权 (0.081007ms)
✔ 项目立项、成员职责分配与退出留痕治理测试套件 (1.773327ms)
▶ 新建项目工程文档模板质量与纯净性保障套件(对标官方参考系统)
✔ 1. 必须精确生成 7 份官方全流程受控工作流模板且标记纯净 (0.563873ms)
✔ 2. 杜绝旧项目 CUSA-NeuroPulse 串号泄露,动态注入新项目信息 (0.566783ms)
✔ 3. 严格对标参考系统模板规范要素,绝非 3 行残缺摘要 (0.33153ms)
✔ 4. 缓存丢失场景下即时自愈重建 AST 能力验证 (0.218554ms)
✔ 新建项目工程文档模板质量与纯净性保障套件(对标官方参考系统) (4.72805ms)
▶ 用户上传文档私密归档与共享流转测试
✔ 10 个评审项目均包含已共享的 URS 交付物与 AST,支持跨角色合规查阅且会话均以 assistant 闭环 (1.193724ms)
✔ 用户上传附件自动生成私密交付物并在 AST 中建立隔离,支持流转至项目参考库 (1.68991ms)
✔ 单轮对话支持一次上传多个文档(上限5个),批量生成私密交付物并遵循数量约束 (0.566183ms)
✔ 用户上传文档私密归档与共享流转测试 (4.193945ms)
▶ 工作流切换与消息展示时序测试套件
✔ 1. 当存在历史 seed 消息且追加新实时消息时,新消息必须严格沉淀在末尾 (0.618261ms)
✔ 2. 切回项目时相同正文不应因 temp/server id 差异重复展示 (0.127157ms)
✔ 工作流切换与消息展示时序测试套件 (1.34515ms)
✔ DeliverableItem 必须包含 projectId 与 isTemplateOnly 属性 (0.489505ms)
ℹ tests 402
ℹ suites 36
ℹ pass 402
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 925.732052
RUN v5.0.0 /home/weichen/projects/Agent-System/web
(node:193983) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.
(Use `node --trace-warnings ...` to show where the warning was created)
Test Files 3 passed (3)
Tests 32 passed (32)
Start at 03:01:36
Duration 554ms (import 50%, transform 44%, tests 5%, worker 1%)
@@ -0,0 +1,33 @@
Listing tests:
[chromium] › admin-console.spec.ts:22:1 › admin console smoke: enter, nav renders, exit back to workbench
[chromium] › controlled-document-reload.spec.ts:200:3 › controlled document reload M1 live › project 143 content is 200 with consistency; anonymous is 401; unknown is 404
[chromium] › controlled-document-reload.spec.ts:266:3 › controlled document reload M1 live › non-member GET of project 143 is the same 404 as unknown
[chromium] › controlled-document-reload.spec.ts:310:3 › controlled document reload M1 live › new project PI compile then reload keeps ledger markdown
[chromium] › controlled-document-reload.spec.ts:443:3 › controlled document reload M1 live › cross-project and wrong-stage GET stay DOCUMENT_NOT_FOUND
[chromium] › conversation-intent-dual-tab.spec.ts:36:3 › conversation intent dual-tab busy › tab B shows busy without reload and keeps empty actions
[chromium] › document-revision-runtime.spec.ts:629:3 › document-revision-runtime UI @post-restart › UI-15 restore after container restart (page login only)
[chromium] › document-revision-runtime.spec.ts:690:3 › document-revision-runtime UI acceptance › UI-00 bootstrap: admin creates A/B/C via page
[chromium] › document-revision-runtime.spec.ts:750:3 › document-revision-runtime UI acceptance › UI-01 login A → page create project → template hint, no revision-state for doc-p
[chromium] › document-revision-runtime.spec.ts:809:3 › document-revision-runtime UI acceptance › UI-02 send real squad task
[chromium] › document-revision-runtime.spec.ts:856:3 › document-revision-runtime UI acceptance › UI-03 wait first round; open controlled doc with V/r
[chromium] › document-revision-runtime.spec.ts:893:3 › document-revision-runtime UI acceptance › UI-04 open change report with full fields
[chromium] › document-revision-runtime.spec.ts:922:3 › document-revision-runtime UI acceptance › UI-05 high-risk candidate #1 pending (version must not advance)
[chromium] › document-revision-runtime.spec.ts:947:3 › document-revision-runtime UI acceptance › UI-05a confirm high-risk candidate → version advances
[chromium] › document-revision-runtime.spec.ts:992:3 › document-revision-runtime UI acceptance › UI-05b second high-risk candidate → reject; version stays
[chromium] › document-revision-runtime.spec.ts:1041:3 › document-revision-runtime UI acceptance › UI-06 edit block → save → hard refresh persists r bump
[chromium] › document-revision-runtime.spec.ts:1072:3 › document-revision-runtime UI acceptance › UI-07/08/09 overlay modes differ in computed styles
[chromium] › document-revision-runtime.spec.ts:1113:3 › document-revision-runtime UI acceptance › UI-10 version history + compare
[chromium] › document-revision-runtime.spec.ts:1149:3 › document-revision-runtime UI acceptance › UI-11 chat second controlled doc + page upload attachment
[chromium] › document-revision-runtime.spec.ts:1246:3 › document-revision-runtime UI acceptance › UI-12 user C (not a member) must not see project
[chromium] › document-revision-runtime.spec.ts:1271:3 › document-revision-runtime UI acceptance › UI-13a reviewer B has no body-edit affordance
[chromium] › document-revision-runtime.spec.ts:1315:3 › document-revision-runtime UI acceptance › UI-13b two author-A contexts conflict on same revision
[chromium] › document-revision-runtime.spec.ts:1429:3 › document-revision-runtime UI acceptance › UI-14 logout via UI then login again
[chromium] › document-revision-runtime.spec.ts:1457:3 › document-revision-runtime UI acceptance › UI-15 phase-main: write evidence then exit (host restarts docker before post-restart run)
[chromium] › document-revision-runtime.spec.ts:1489:3 › document-revision-runtime UI acceptance › UI-16 registered upload uses server doc-free ledger (no doc-upload orphan)
[chromium] › governance-action-level-authz.spec.ts:57:3 › governance action-level authz › real page matrix G5
[chromium] › intent-plan-cards.spec.ts:292:3 › intent-plan PLAN_CONFIRM dual-tab › dual-tab confirm mutual exclusion + reload/relogin matches PG
[chromium] › project143-regression.spec.ts:272:3 › Project 143 Regression UI Acceptance › full sequential verification of Project 143 (A1-A7)
[chromium] › workflow-plan-409-frozen-duties.spec.ts:93:3 › workflow-plan 409 frozen + optional duties › real page matrix
Total: 29 tests in 8 files
Error: EACCES: permission denied, open '/home/weichen/projects/Agent-System/.doc/test-reports/assets/2026-09-14-controlled-content-ui-acceptance/playwright-report-main/index.html'