diff --git a/.doc/test-reports/assets/2026-09-16-matrix-deep-test/arch-check.txt b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/arch-check.txt new file mode 100644 index 00000000..48a0e35b --- /dev/null +++ b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/arch-check.txt @@ -0,0 +1,6 @@ +arch-check mode=block +boundaries=/home/weichen/projects/Agent-System/.doc/system-design/module-boundaries.yaml +ok chat-agent-system/internal/archtest 0.138s +ok chat-agent-system/internal/archtest 0.134s +arch-check block: production gate passed +arch_exit=0 diff --git a/.doc/test-reports/assets/2026-09-16-matrix-deep-test/bundle.txt b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/bundle.txt new file mode 100644 index 00000000..cd9c6e9f --- /dev/null +++ b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/bundle.txt @@ -0,0 +1,139 @@ +Building fresh web dist (demo seeds OFF)... + +> shuimu-workbench@1.0.0 build +> tsc && vite build + +vite v7.3.6 building client environment for production... +transforming... +✓ 4112 modules transformed. +rendering chunks... +computing gzip size... +dist/index.html 0.89 kB │ gzip: 0.52 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-DhpBfxvE.css 35.50 kB │ gzip: 9.76 kB +dist/assets/channel-YUCiLyJ5.js 0.11 kB │ gzip: 0.12 kB +dist/assets/init-Gi6I4Gst.js 0.15 kB │ gzip: 0.13 kB +dist/assets/chunk-2Q5K7J3B-Cp_1aGcV.js 0.19 kB │ gzip: 0.16 kB +dist/assets/chunk-JWPE2WC7-CFAlzDTt.js 0.22 kB │ gzip: 0.17 kB +dist/assets/chunk-XXDRQBXY-B1wR5UIw.js 0.22 kB │ gzip: 0.20 kB +dist/assets/chunk-5VM5RSS4-C1TvNbDe.js 0.36 kB │ gzip: 0.27 kB +dist/assets/stateDiagram-v2-MP3YSRHH-3fUIqYL7.js 0.39 kB │ gzip: 0.29 kB +dist/assets/classDiagram-ZZMXUADV-BWt18f7X.js 0.43 kB │ gzip: 0.30 kB +dist/assets/classDiagram-v2-VYDZK3BY-BWt18f7X.js 0.43 kB │ gzip: 0.30 kB +dist/assets/chunk-POPQ4Y6H-LoS5Tfde.js 0.50 kB │ gzip: 0.35 kB +dist/assets/swimlanesDiagram-VR7AAH4N-Dj72rso7.js 0.51 kB │ gzip: 0.35 kB +dist/assets/infoDiagram-27XIBGKW-DCaRHXpS.js 0.55 kB │ gzip: 0.38 kB +dist/assets/sizeCapture-INFHLROL-WvhY4LXO.js 0.90 kB │ gzip: 0.51 kB +dist/assets/ordinal-Cboi1Yqb.js 1.19 kB │ gzip: 0.57 kB +dist/assets/railroadDiagram-O6MQD6OU-BKky8rBB.js 1.57 kB │ gzip: 0.74 kB +dist/assets/abnfDiagram-VCTEODGH-DH9p93NG.js 1.77 kB │ gzip: 0.87 kB +dist/assets/chunk-F27PBJKO-yW3jT8qq.js 1.88 kB │ gzip: 0.83 kB +dist/assets/pegDiagram-XKGWAZYB-CF4TQ3Dl.js 1.92 kB │ gzip: 0.90 kB +dist/assets/ebnfDiagram-PWID7BFC-XoOoOoe6.js 1.97 kB │ gzip: 0.86 kB +dist/assets/arc-D3bCILD0.js 3.43 kB │ gzip: 1.48 kB +dist/assets/diagram-Z3DM3KII-B_ADGUY4.js 4.18 kB │ gzip: 1.81 kB +dist/assets/defaultLocale-DX6XiGOO.js 4.69 kB │ gzip: 2.18 kB +dist/assets/linear-Cf6ZEJ9k.js 5.65 kB │ gzip: 2.31 kB +dist/assets/diagram-UQ7AKVKN-Dq_uUgpS.js 6.04 kB │ gzip: 2.60 kB +dist/assets/pieDiagram-E7YTZNPT-Btb_v7CU.js 6.26 kB │ gzip: 2.60 kB +dist/assets/diagram-S7CK7UJ4-D1xFKY8l.js 8.18 kB │ gzip: 3.66 kB +dist/assets/cynefinDiagram-5FMLGOSQ-CduADy4V.js 10.06 kB │ gzip: 3.61 kB +dist/assets/stateDiagram-D77RDMKH-BxhdNYdS.js 10.33 kB │ gzip: 3.61 kB +dist/assets/dagre-GXQ25YYZ-D9RgBJh-.js 10.64 kB │ gzip: 4.01 kB +dist/assets/diagram-VSXAHHWV-COisjeqg.js 10.68 kB │ gzip: 4.11 kB +dist/assets/chunk-SVP7TREG-BQ76_pRe.js 15.73 kB │ gzip: 4.41 kB +dist/assets/diagram-VX7I27RA-DL_ZhhnY.js 15.92 kB │ gzip: 5.68 kB +dist/assets/ishikawaDiagram-5VMMS53U-X2RWjgnx.js 17.43 kB │ gzip: 6.62 kB +dist/assets/kanban-definition-UXKFOSKX-CZ5ioKdv.js 20.26 kB │ gzip: 7.18 kB +dist/assets/mindmap-definition-YA3MSWOX-DTTTfydG.js 23.14 kB │ gzip: 7.80 kB +dist/assets/sankeyDiagram-P5KCCOFB-BhAwVgwx.js 23.16 kB │ gzip: 8.54 kB +dist/assets/journeyDiagram-3NMN7TZE-BRzATStt.js 23.54 kB │ gzip: 8.33 kB +dist/assets/wardleyDiagram-VM6X3IG4-BOZsFnU-.js 25.47 kB │ gzip: 6.77 kB +dist/assets/gitGraphDiagram-WWUBYQGX-C0_dKJju.js 29.38 kB │ gzip: 8.68 kB +dist/assets/erDiagram-RLTQ6QDP-Bn3j6ajH.js 30.76 kB │ gzip: 10.57 kB +dist/assets/timeline-definition-24CTP7MA-BXwtim3P.js 30.79 kB │ gzip: 10.13 kB +dist/assets/requirementDiagram-BXWQKSXE-Be7LLRur.js 30.97 kB │ gzip: 9.70 kB +dist/assets/quadrantDiagram-AXDQQJYC-sYmnlx5c.js 33.98 kB │ gzip: 9.96 kB +dist/assets/layout-BBA9sCju.js 35.43 kB │ gzip: 12.74 kB +dist/assets/chunk-IMKFNOWR-CQbC2wF9.js 38.07 kB │ gzip: 12.51 kB +dist/assets/blockDiagram-I7D4REHJ-DubqVycP.js 41.72 kB │ gzip: 13.56 kB +dist/assets/vennDiagram-4TSXK5OY-CBt0jGDF.js 41.93 kB │ gzip: 15.67 kB +dist/assets/xychartDiagram-S5SC5T6Z-CqmuB8Ic.js 44.47 kB │ gzip: 12.58 kB +dist/assets/chunk-TICWLB2K-CbQpdxty.js 49.17 kB │ gzip: 15.74 kB +dist/assets/flowDiagram-HODETNUW-D6ULMOkO.js 61.84 kB │ gzip: 19.87 kB +dist/assets/c4Diagram-7LVT6UL2-Dy-BA8ey.js 65.44 kB │ gzip: 18.77 kB +dist/assets/ganttDiagram-EL5Y4UJY-CTWFJimm.js 69.66 kB │ gzip: 23.54 kB +dist/assets/cose-bilkent-JH36ORCC-crpHcJa8.js 81.66 kB │ gzip: 22.46 kB +dist/assets/swimlanes-42K2YHIH-C-I9BHlP.js 115.76 kB │ gzip: 42.49 kB +dist/assets/sequenceDiagram-WJ2MYXX4-DHyVDyhS.js 116.93 kB │ gzip: 31.11 kB +dist/assets/architectureDiagram-5GKGNRK7-B7ijxLOx.js 151.79 kB │ gzip: 43.12 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-BV1-mtln.js 687.91 kB │ gzip: 154.14 kB +dist/assets/index-BT80OB_W.js 2,798.14 kB │ gzip: 796.79 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.44s +PASS: prod bundle scan (/home/weichen/projects/Agent-System/web/dist) +bundle_exit=0 diff --git a/.doc/test-reports/assets/2026-09-16-matrix-deep-test/dev-health.json b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/dev-health.json new file mode 100644 index 00000000..eb900fa7 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/dev-health.json @@ -0,0 +1 @@ +{"status":"ok","env":"dev","agent_backend":"pi-agent","version":"v1.0","shared_kb_port":5432,"database_ready":true,"schema_version":47,"schema_ready":true,"task_store_ready":true} diff --git a/.doc/test-reports/assets/2026-09-16-matrix-deep-test/dev-ready.json b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/dev-ready.json new file mode 100644 index 00000000..eb900fa7 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/dev-ready.json @@ -0,0 +1 @@ +{"status":"ok","env":"dev","agent_backend":"pi-agent","version":"v1.0","shared_kb_port":5432,"database_ready":true,"schema_version":47,"schema_ready":true,"task_store_ready":true} diff --git a/.doc/test-reports/assets/2026-09-16-matrix-deep-test/governance-pg-verbose.txt b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/governance-pg-verbose.txt new file mode 100644 index 00000000..a6dae222 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/governance-pg-verbose.txt @@ -0,0 +1,12 @@ +=== RUN TestE2E_WorkflowGovernance_CompleteAndReplan +2026/09/16 05:16:31 goose: no migrations to run. current version: 47 +2026/09/16 05:16:31 goose: no migrations to run. current version: 47 +2026/09/16 05:16:31 [kb] 无法连接到 PostgreSQL 知识库 (postgres://:@:0/?sslmode=disable): cannot parse `postgres://:xxxxx@:0/?sslmode=disable`: invalid port (outside range), 将降级运行在离线模式 +--- PASS: TestE2E_WorkflowGovernance_CompleteAndReplan (0.31s) +=== RUN TestWorkflowGovernance_PG_ActivateApproveAdvanceChain +{"time":"2026-09-16T05:16:31.591340083Z","level":"INFO","msg":"goose: no migrations to run. current version: 47"} +{"time":"2026-09-16T05:16:31.601328207Z","level":"INFO","msg":"goose: no migrations to run. current version: 47"} +{"time":"2026-09-16T05:16:31.604853082Z","level":"INFO","msg":"[kb] 无法连接到 PostgreSQL 知识库 (postgres://:@:0/?sslmode=disable): cannot parse `postgres://:xxxxx@:0/?sslmode=disable`: invalid port (outside range), 将降级运行在离线模式"} +--- PASS: TestWorkflowGovernance_PG_ActivateApproveAdvanceChain (0.35s) +PASS +ok chat-agent-system/internal/server 0.663s diff --git a/.doc/test-reports/assets/2026-09-16-matrix-deep-test/governance-pg.txt b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/governance-pg.txt new file mode 100644 index 00000000..91887272 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/governance-pg.txt @@ -0,0 +1,2 @@ +ok chat-agent-system/internal/server 1.069s +gov_exit=0 diff --git a/.doc/test-reports/assets/2026-09-16-matrix-deep-test/live-8080.json b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/live-8080.json new file mode 100644 index 00000000..16eb57f9 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/live-8080.json @@ -0,0 +1,134 @@ +{ + "started": "2026-09-16T05:18:16", + "base": "http://127.0.0.1:8080", + "project_id": 6367, + "session_id": "sess-p6367-u11", + "overall": "PASS", + "cases": [ + { + "id": "health", + "verdict": "PASS", + "http": 200, + "duration_ms": 6, + "output": { + "env": "dev", + "schema": 47, + "backend": "pi-agent" + } + }, + { + "id": "login", + "verdict": "PASS", + "output": { + "owner_id": 11, + "reviewer_id": 12, + "approver_id": 9, + "guest_id": 13, + "note": "zhanggong disabled; used lizhuguan" + } + }, + { + "id": "demo_projects_absent", + "verdict": "PASS", + "http": 200, + "duration_ms": 3, + "output": { + "count": 7, + "polluted": [] + } + }, + { + "id": "create_project", + "verdict": "PASS", + "http": 201, + "duration_ms": 20, + "output": { + "project_id": 6367, + "snip": "{\"id\":6367,\"code\":\"mtx-051808\",\"name\":\"矩阵深度抽检-051808\",\"customer_name\":\"\",\"device_type\":\"超声软组织手术吸引设备\",\"intended_use\":\"mat" + } + }, + { + "id": "demo_docs_clean", + "verdict": "PASS", + "http": 200, + "output": { + "doc_count": 0, + "mock_ids": [] + } + }, + { + "id": "real_pi_chat", + "verdict": "PASS", + "http": 200, + "duration_ms": 8101, + "output": { + "snip": "好的,已记住——本项目是**超声软组织吸引设备**(即超声软组织手术吸引设备)的立项摸底。\n\n后续需要我帮您梳理立项摸底清单、竞品画像框架或研发排期草案时,随时说一声就好。" + } + }, + { + "id": "window_categories", + "verdict": "PASS", + "http": 200, + "duration_ms": 3, + "output": { + "window_msgs": 2, + "category_total": null, + "cat_http": 200 + } + }, + { + "id": "guest_403", + "verdict": "PASS", + "http": 403, + "duration_ms": 0, + "output": { + "error_code": "SESSION_FORBIDDEN" + } + }, + { + "id": "save_plan", + "verdict": "PASS", + "http": 200, + "duration_ms": 5, + "output": { + "snip": "{\"project_id\":6367,\"lifecycle_status\":\"planning\",\"active_workflow_key\":\"\",\"workflow_selection_version\":1,\"workflow_plan_revision\":1,\"plan\":{\"workflow_definition_key\":\"main\",\"workflow_version\":2,\"workf" + } + }, + { + "id": "version_conflict_409", + "verdict": "PASS", + "http": 409, + "duration_ms": 1, + "output": { + "business_code": "ERR_CONCURRENT_SWITCH" + } + }, + { + "id": "activate", + "verdict": "PASS", + "http": 200, + "duration_ms": 3, + "output": { + "preview_http": 200, + "snip": "" + } + }, + { + "id": "termination_preview", + "verdict": "PASS", + "http": 200, + "duration_ms": 1, + "output": { + "instance_id": 262, + "can_terminate": true, + "keys": [ + "instance_id", + "pending_documents", + "in_progress_task_runs", + "can_terminate", + "impact" + ] + } + } + ] +} \ No newline at end of file diff --git a/.doc/test-reports/assets/2026-09-16-matrix-deep-test/modules.txt b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/modules.txt new file mode 100644 index 00000000..6cf8e93f --- /dev/null +++ b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/modules.txt @@ -0,0 +1,46 @@ +=== intent/intent-plan === +ok chat-agent-system/internal/intent 0.019s +ok chat-agent-system/internal/coordinator 0.006s +ok chat-agent-system/internal/app/intentflow 0.008s +ok chat-agent-system/internal/app 0.005s +ok chat-agent-system/internal/events 0.004s +ok chat-agent-system/internal/server 2.161s +intent_exit=0 +=== chat === +ok chat-agent-system/internal/ctxmgr 0.083s +ok chat-agent-system/internal/app/chatflow 0.004s +ok chat-agent-system/internal/chat 0.012s +chat_exit=0 +=== squad === +ok chat-agent-system/internal/squad 0.023s +squad_exit=0 +=== workflow/authz/docgov/docrevision === +ok chat-agent-system/internal/projectinstance 0.003s +ok chat-agent-system/internal/workflowdef 0.002s +ok chat-agent-system/internal/auth 0.767s +ok chat-agent-system/internal/authz 0.002s +ok chat-agent-system/internal/docgov 0.015s +ok chat-agent-system/internal/docrevision 0.005s +waf_exit=0 +=== pi-agent === +ok chat-agent-system/internal/agent 3.459s +agent_go_exit=0 +✔ withResultV1 is additive and strips stderr (1.00996ms) +✔ typedErrorCode is allowlisted and ignores raw stderr (0.167475ms) +✔ path escape members are omitted (0.66168ms) +ℹ tests 3 +ℹ suites 0 +ℹ pass 3 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 52.254759 +agent_node_exit=0 +=== events E0-E2 === +ok chat-agent-system/internal/events 0.004s +ok chat-agent-system/internal/app/docnotify 0.003s +ok chat-agent-system/internal/app/docadvance 0.003s +ok chat-agent-system/internal/app/docproject 0.003s +ok chat-agent-system/internal/app/docflow 0.003s +events_exit=0 diff --git a/.doc/test-reports/assets/2026-09-16-matrix-deep-test/npm.txt b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/npm.txt new file mode 100644 index 00000000..83aa3f1a --- /dev/null +++ b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/npm.txt @@ -0,0 +1,472 @@ + +> 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 超级管理员鉴权 (1.995041ms) +✔ AuthClient: 自主注册受控流程(仅填用户名密码姓名,职位强制绑定访客待指派) (0.467176ms) +✔ AuthClient: 开启注册需审批时,注册账号处于待审状态并禁止登录 (0.528284ms) +✔ AuthClient: 管理员创建账号必须在首次登录修改密码 (0.323461ms) +✔ mapUserAccount: snake_case Go contract → camelCase (1.033499ms) +✔ mapUserAccount: prefers snake_case when both present (0.197924ms) +✔ mapLoginResult + mapMeResult map nested user and top-level must_change_password (0.902823ms) +✔ mapUserAccountList maps admin users list (0.223613ms) +✔ AuthClient.login + fetchMe map real snake_case wire payloads (26.144283ms) +✔ shouldAutoRetryChat: disabled until idempotency (0.912833ms) +✔ shouldAutoRetryTask: transient only, max 2 (0.194784ms) +✔ shouldAutoRetryTask: document busy never retries (0.110757ms) +✔ shouldAutoRetry alias delegates to task path (0.130287ms) +✔ autoRetryDelayMs: 1s then 2s (0.135606ms) +✔ fallbackErrorClass: network → transient, workspace → resumable (0.117457ms) +✔ parseSSEChunk: parses event and data lines (1.061658ms) +✔ parseSSEChunk: keeps incomplete frame in rest (0.276232ms) +✔ parseSSEChunk: flush parses final frame without trailing delimiter (0.226903ms) +✔ parseSSEChunk: ignores heartbeat comments and keeps last id (0.175014ms) +▶ projectSettingsError + ✔ keeps status, code, message and issues on PLAN_FROZEN (1.468706ms) + ✔ maps revision and concurrent conflicts to distinct recovery (0.147115ms) + ✔ joins validation issues but still keeps typed codes (0.136046ms) + ✔ prefers envelope code over legacy error field (0.093017ms) + ✔ unwraps nested business JSON inside VERSION_CONFLICT envelope (0.174915ms) + ✔ maps bare VERSION_CONFLICT envelope to retry_after_switch (0.097887ms) + ✔ retains the local draft when a late tab hits PLAN_FROZEN (0.085587ms) +✔ projectSettingsError (3.200045ms) +✔ Project workflow types validation (1.156985ms) +✔ createTaskRun exposes DOC_BUSY detail without a retryable run (24.052076ms) +✔ parseSSEChunk tracks id seq for after_seq reconnect (0.385119ms) +✔ subscribeTaskRunEvents reconnects on EOF with advancing after_seq (4.695911ms) +✔ readTaskRunSSEOnce marks non-terminal EOF for reconnect (0.588273ms) +✔ buildTaskRequest: maps five project fields + task_key + user identity (1.133977ms) +✔ buildTaskRequest: omits optional fields when absent (0.215383ms) +✔ buildTaskRequest: includes materials when provided and non-empty (1.074518ms) +✔ buildResumeRequest: adds work_dir on top of task request (0.225603ms) +✔ buildTaskRequest: canonicalizes legacy doc-p doc_id (0.325181ms) +✔ buildTaskRequest: UI-05 pinned intake keeps task_key + doc_proj6109_intake (0.237933ms) +✔ buildResumeRequest: forwards add_steps when provided (0.197414ms) +✔ CategoryDock: 渲染顶部 🔔 未读提醒项及角标数字 (12.675113ms) +✔ CategoryDock: isAllReadCompleted 为 true 时渲染完成态提示 (3.480557ms) +✔ CategoryDock: 0 未读时不渲染红色未读角标 (6.254924ms) +✔ CategoryDock: 分类项包含依次跳转与遍历提示信息 (2.735299ms) +✔ InputArea keeps draft when send preflight fails (1.230894ms) +✔ InputArea clears draft only after accepted send (0.573333ms) +✔ InputArea shows thinking block message (0.159615ms) +✔ InputArea keeps draft when attachment registration fails (0.247173ms) +✔ isTemplateOnly 交付物应正确识别为初始模板展示态 (0.754627ms) +✔ 左侧栏鼠标严密绝对跟随与夹紧测试 (Left Rail Exact Pointer Following & Clamping) (0.714469ms) +✔ 右侧栏鼠标严密绝对跟随与反向位移测试 (Right Rail Exact Pointer Following & Inverted Delta) (0.165045ms) +✔ detects legacy mock and neuropulse/ten-projects ids (1.01564ms) +✔ detects colliding demo project ids (0.206664ms) +✔ 每人独立私聊:同一项目不同用户拥有不同 sessionId (0.709639ms) +✔ 左侧会话列表按当前用户过滤,不可见他人私聊 (0.291942ms) +✔ 消息严格归属各自私聊 session,无跨用户混聊 (0.67632ms) +✔ 切换用户时 resolve 到该用户同项目私聊会话 (0.265232ms) +✔ resolve 优先有消息的私聊,跳过空壳 sess-p{N}-u{id} (0.33197ms) +✔ ensurePrivateSessionsForUser 为缺失用户补齐空私聊 (0.281082ms) +✔ 多项目会话消息隔离测试仍成立(endo vs ultrasound) (0.196574ms) +✔ parseAnchorHash: 正确解析标准深链 hash (1.761548ms) +✔ formatAnchorHash: 正确构造深链格式 (0.185855ms) +✔ navigateToAnchor: 快路径直接命中 DOM 节点 (0.426987ms) +✔ navigateToAnchor: 慢路径拉取分片后命中 (81.596677ms) +✔ resolveTurnAnchorId: 方案 A 轮次归一化测试 (0.579223ms) +✔ 全链路场景 1: 用户自主受控注册(仅填用户名/密码/姓名,职位严格绑定访客待指派) (1.572433ms) +✔ 全链路场景 2: 系统准入策略(关闭自主注册与开启强制审批流转) (0.957642ms) +✔ 全链路场景 3: 管理员开通账号首次强制改密闭环 (0.3251ms) +✔ 全链路场景 4: 环境标识随登录会话返回(dev/test/main) (0.295291ms) +✔ cleanHeadingContent: 手工多级序号前缀清洗与专业词汇保护 (0.962552ms) +✔ 标题多层级自动编号:单 H1 文档总标题自适应模式 (1 -> 1.1 -> 1.1.1) (0.305551ms) +✔ 标题多层级自动编号:多 H1 标准大章模式 (0.141016ms) +✔ 跨章节图、表、公式多级按章重编号测试 (表 1-1, 表 2-1, 图 3-1, 式 (4-1)) (0.120746ms) +✔ 有序列表与无序列表编号与渲染功能测试 (1.520405ms) +✔ 动态块操作闭环重编号验证 (Insert, Move, Delete) (0.186174ms) +✔ findMatchingBlockForReview: 能够精准按审查关键词(电气安全/EMC/竞品)定位段落块 (1.295541ms) +✔ findMatchingBlockForReview: 能够按外部指定 hint 线索精确命中目标块 (0.233673ms) +✔ createRejectConfirmationCard: 生成合规危险级驳回门禁卡片 (0.601753ms) +✔ isAffirmativeResponse: 准确识别双轨交互中的肯定意图输入 (0.221293ms) +✔ findLastActiveCard: 正确在会话历史中提取最新的待决策卡片 (0.216604ms) +✔ decrementActiveCardsTtl: 多轮对话超时递减与自动失效归档 (0.173525ms) +✔ applyConfirmRejectToDoc & applyUndoRejectToDoc: 驳回挂载批注与60s窗口期撤销完整闭环 (0.296501ms) +✔ resolveCardInMessages & cancelCardInMessages: 消息流中卡片终态沉淀 (0.187264ms) +✔ classifyRejectUtterance: 询问原因 → QUERY_REJECT_REASON (0.930912ms) +✔ classifyRejectUtterance: 明确执行 → EXECUTE_REJECT (0.166615ms) +✔ classifyRejectUtterance: 模糊 → OTHER (0.180014ms) +✔ resolveDocGovCard: 编制人查询 → 信息卡且无 confirm_reject (0.746558ms) +✔ resolveDocGovCard: 审核人执行 + reviewing → 确认卡 (1.254603ms) +✔ resolveDocGovCard: 编制人误说执行驳回 → 无权纯文本 (0.166465ms) +✔ resolveDocGovCard: 批准人 + approving → 终审确认卡 (0.168425ms) +✔ resolveDocGovCard: 编制人 OTHER → 引导查询无危险按钮 (0.107177ms) +✔ canConfirmReject: 仅审核/批准 (0.130966ms) +✔ deriveFallbackCategory identifies categories correctly (0.977831ms) +✔ enrichMessagesWithCategories backfills categories without overwriting existing ones (0.285522ms) +✔ Markdown ➔ Block AST 解析测试 (标题自适应编号与图表公式全链路) (2.498745ms) +✔ 动态重编号引擎测试 (多 H1 规范章节重排验证) (2.100378ms) +✔ Block AST ➔ Markdown 双向无损往返还原测试 (0.554304ms) +✔ 三层交付物多用户隐私绝对隔离测试 (Multi-user Strict Privacy Isolation) (1.082668ms) +✔ 一键共享至项目参考库流转测试 (Promote to Shared Reference Test) (0.271372ms) +✔ 撤回共享恢复私有草稿测试 (Revoke Shared Reference Test) (0.564424ms) +✔ 受控工作流纯净性红线检验 (Workflow Purity Security Red Line) (0.32681ms) +✔ isSameMessage: clientTurnId match (1.109737ms) +✔ isSameMessage: serverId match without turn (0.167865ms) +✔ filterPendingLiveMessages: real temp vs server id (0.139175ms) +✔ mergeLiveOverHistory preserves server id from live (0.129527ms) +✔ applyPhaseEvent: appends first phase as running node (1.064778ms) +✔ applyPhaseEvent: completes predecessors when a new phase arrives (0.208124ms) +✔ applyPhaseEvent: same phase refreshes label in place (no duplicate node) (0.216274ms) +✔ applyPhaseEvent: unknown phase falls back to hourglass meta (0.114496ms) +✔ applyPhaseEvent: prefers backend message over short label (0.099547ms) +✔ applyPhaseEvent: step_completed closes running entry without appending (1.024819ms) +✔ applyPhaseEvent: stage_completed closes entries (0.124956ms) +✔ applyPhaseEvent: task_failed appends warning node (0.113747ms) +✔ applyPhaseEvent: decorates label with step index / total steps (0.155515ms) +✔ applyPhaseEvent: repeated step_executing with step_index gets separate nodes (0.237263ms) +✔ applyPhaseEvent: ignores event without phase payload (0.122346ms) +✔ applyPhaseEvent: step_failed marks running entry as failed (keeps step label) (0.130266ms) +✔ applyPhaseEvent: step_failed appends failed node when no running entry exists (0.125276ms) +✔ applyPhaseEvent: retry of a failed step resets it to running (0.097697ms) +✔ PLAN_CONFIRM 卡片来自 PlanView 且不触达 AST (1.01759ms) +✔ 409 冲突把卡片标为 outdated 并换上最新 revision (0.243463ms) +✔ GET reconcile 用权威 PlanView 覆盖本地 executing,不假装成功 (0.207094ms) +✔ 过期计划映射 expired (0.151796ms) +✔ 非计划卡不被误判 (0.085737ms) +✔ 集成验证:项目切换时交付物严格隔离,新建项目即刻包含 7 份模板副本 (4.991482ms) +✔ 集成验证:三层隐私与项目物理隔离双重约束 (1.410598ms) +✔ 用例 1: DEFAULT_ROLES 包含 5 种默认角色且具备预期权限 (1.231943ms) +✔ 用例 2: 系统管理员 (ADMIN) 与具备 perm:manage 用户的通配豁免特权 (0.245832ms) +✔ 用例 3: 常规工作流基线可见性 (workflow:view_all) 判定 (0.271472ms) +✔ 用例 4: 单文档覆盖 - designated_only (仅编制/审核/批准人可见,其他用户被精确拦截) (1.962741ms) +✔ 用例 5: 单文档覆盖 - role_whitelist (仅白名单内角色可见,其他角色被精确拦截) (0.274252ms) +✔ 用例 6: 单文档覆盖 - public (放宽可见性,无 workflow:view_all 权限的访客也能查阅) (0.126076ms) +✔ 用例 7: 私密文档隔离强红线 (category === private 无论任何管理员或单文档覆盖,非创建者绝对不可见) (0.138626ms) +✔ 用例 8: 核心业务动作权限拦截判定 (canPerformDocAction & hasPermission) (0.173525ms) +✔ 用例 9: filterVisibleDeliverablesWithRBAC 能够批处理过滤大盘交付物 (0.885453ms) +✔ 集成场景 1: 动态新增合规审计员角色,并配置其仅能查阅特定单文档覆盖 (0.969342ms) +✔ 集成场景 2: 服务端 capabilities 变更后权限即刻生效 (0.180845ms) +✔ 集成场景 3: 单文档覆盖 designated_only 严格收紧与撤回恢复全流程 (0.216884ms) +✔ renderInlineMarkdown: renders bold, italic, strikethrough (1.00806ms) +✔ renderInlineMarkdown: escapes raw HTML tags to prevent XSS (0.437667ms) +✔ renderInlineMarkdown: blocks javascript: link hrefs (0.145766ms) +✔ renderInlineMarkdown: renders inline code and preserved line breaks (0.227353ms) +✔ renderInlineMarkdown: renders headings lists and tables for chat replies (0.34343ms) +✔ sanitizeMermaidCode: auto wraps unquoted labels containing brackets or comparison operators (0.283632ms) +(node:4027631) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided. +(Use `node --trace-warnings ...` to show where the warning was created) +✔ DOCX 渲染器行内文本与公式解析测试 (parseInlineContent) (5.096649ms) +✔ DOCX 渲染器 LaTeX 原生 OMML 转换引擎测试 (latexToOmml) (2.504616ms) +✔ DOCX 渲染器 Mermaid 语法净化与容错测试 (sanitizeMermaidCode) (0.288952ms) +✔ DOCX 渲染器 SVG 净化防 Canvas 污染测试 (cleanSvgForCanvas) (0.34609ms) +✔ DOCX 渲染器全量编译测试 (buildDocxModel & exportDocumentToDocx) (60.494434ms) +✔ XLSX 渲染器多表提取与工作簿编译测试 (buildXlsxWorkbook & exportDocumentToXlsx) (6.085679ms) +▶ Reply Document IR & Export Engine + ✔ deriveReplyTitle and sanitizeFilename derive title and safe file name (1.00806ms) + ✔ deriveReplyTitle handles text without heading (0.263112ms) + ✔ parseReplyMarkdown parses headers, lists, code, and tables (1.897594ms) + ✔ renderClipboardHtml renders self-contained styling for office tools (0.514334ms) + ✔ renderClipboardHtml converts LaTeX formulas to native MathML for Word/Office (3.559075ms) + ✔ renderPlainText strips formatting cleanly (0.436737ms) + ✔ serializeMarkdown round-trips to valid markdown (0.34021ms) + ✔ stripUnsafeHtml strips script tags and dangerous event handlers (0.474656ms) +✔ Reply Document IR & Export Engine (10.511258ms) +✔ createProjectTemplateDeliverables: 必须精确生成 7 份全生命周期受控文档副本 (4.683551ms) +✔ resolveRequirementsTaskKey prefers intake for 初始需求表 (1.325751ms) +✔ resolveRequirementsTaskKey selects user_requirements for explicit URS (0.166045ms) +✔ UI-02 first-round prompt with 首轮+用户需求+摸底 must be intake not user_requirements (0.700139ms) +✔ 首轮 / 需求摸底 / 摸底 beat bare 用户需求 (0.130106ms) +✔ bare 用户需求 without V0.1 markers stays user_requirements (0.120147ms) +✔ matchTemplateDeliverable uses intake key when pool only has URS template (0.163975ms) +✔ resolveTaskTemplateForMessage keeps intake key with URS-only pool (0.162786ms) +✔ matchTemplateDeliverable prefers intake when both templates exist (0.752757ms) +✔ read-only request does not start a document task: 总结一下用户初始需求表 (0.275072ms) +✔ read-only request does not start a document task: 查看用户初始需求表 (0.167355ms) +✔ read-only request does not start a document task: 用户初始需求表现在谁在编辑 (0.713008ms) +✔ read-only request does not start a document task: 分析一下用户需求表里的风险 (0.082938ms) +✔ read-only request does not start a document task: 用户初始需求表 (0.569833ms) +✔ explicit write action still starts intake (0.123747ms) +✔ explicit update action still starts URS (0.173725ms) +✔ UI-05 prompt without active doc still keyword-routes to feasibility_reg (0.281542ms) +✔ UI-05 prompt + registered intake pins intake and doc_proj6109_intake (0.281211ms) +✔ read-only current-doc request does not start a task (0.110036ms) +✔ template-only active slot is not pinned; keywords still apply (0.101387ms) +✔ explicit named deliverable can switch away from active intake (0.254003ms) +✔ domain 注册法规 without current-doc deixis still routes feasibility_reg (0.084247ms) +✔ mismatched title vs docId suffix prefers docId taskKey (0.088707ms) +✔ deixis 当前文档 pins registered intake (0.092458ms) +✔ deixis 本文件 pins registered intake (0.045979ms) +✔ deixis 这份文档 pins registered intake (0.044009ms) +✔ deixis 本文档 pins registered intake (0.040988ms) +✔ deixis 本受控文档 pins registered intake (0.042559ms) +✔ no active doc does not invent a pin (0.087408ms) +✔ UI-11 named 系统设计输入 beats negated 需求 background (0.071368ms) +✔ mixed generate-design + do-not-cover-requirements stays prelim_design (0.055729ms) +✔ current-doc pin still wins when no other deliverable is named (0.069938ms) +▶ document revision overlay modes + ✔ pure hides all decorations (1.00319ms) + ✔ manual only marks human hunks (0.164295ms) + ✔ all marks human and agent differently (0.127556ms) + ✔ same human hunk stays amber in manual and all (no pairwise style guarantee) (0.288191ms) + ✔ exposes needs-content error code for empty orphan docs (0.119987ms) + ✔ matches overlay hunks by section or text when ids differ (0.379089ms) + ✔ aligns client block ids from head_block_map by order (0.368419ms) +✔ document revision overlay modes (3.672621ms) +▶ toolbar refresh + report entry reachability + ✔ pickLatestChangeReportId prefers highest version with report (0.473166ms) + ✔ first squad run alone still exposes a reachable report id (0.397829ms) + ✔ second squad run keeps both history report entries and latest shortcut (0.926382ms) + ✔ revisionRefreshKey is an independent refresh signal from docId (0.134596ms) +✔ toolbar refresh + report entry reachability (2.423028ms) +▶ change report view model + ✔ surfaces risk items, project impact, doc impacts with advice, and open questions (0.737078ms) + ✔ preferReportId prioritizes pending over committed latest (0.595622ms) +✔ change report view model (1.471876ms) +▶ revisionToolbarMount + ✔ exposes clear non-error template preview hint copy (0.970381ms) + ✔ template doc-p + isTemplateOnly=true does not mount (0.218523ms) + ✔ legacy doc-001 does not mount (0.222983ms) + ✔ unregistered doc-upload orphan does not mount (must register first) (0.203474ms) + ✔ server-registered upload (doc-free) and freeform mount (0.194614ms) + ✔ canonical doc_proj and generated non-template doc-p mount (0.171255ms) +✔ revisionToolbarMount (3.38832ms) +✔ window fetch race: stale response ignored by generation (0.965092ms) +✔ mapRecordToMessage: 正确映射服务端消息记录为前端 ChatMessage (1.3631ms) +✔ refresh window: 空 messages 日桶不算有效窗口 (0.175505ms) +✔ mapRawBucket: 正确映射服务端按日分片桶 (0.143685ms) +✔ Category navigation: chip 选中后准确匹配目标分类最新轮次并触发归一化定位 (0.171244ms) +✔ turn runtime: session A stream survives session B switch (0.604902ms) +✔ syncAdminUserDirectories calls local reload then parent onRefreshUsers (1.509885ms) +✔ syncAdminUserDirectories fails closed when onRefreshUsers is a dead/missing prop (0.635911ms) +✔ syncAdminUserDirectories surfaces parent refresh errors (no silent swallow) (0.280641ms) +✔ afterProjectMemberPersisted syncs members then refreshes workflow docs (1.755678ms) +✔ afterProjectMemberPersisted does not refresh when member sync fails (0.532184ms) +▶ blockEditorDialogPolicy + ✔ pins an accessible dialog label and exact save name (0.841485ms) + ✔ rejects page-wide fuzzy /保存/ that would hit private-library buttons (0.307371ms) +✔ blockEditorDialogPolicy (2.171536ms) +▶ resolveSaveTargetBlock + ✔ keeps the editor and does not fake success when the block id is gone (0.723128ms) + ✔ never retargets another block that happens to share the same content (0.718658ms) +✔ resolveSaveTargetBlock (2.541904ms) +▶ editor session document binding + ✔ fail-closes when activeDocId drifts away from the opened editor doc (0.209393ms) + ✔ accepts a save only when the editor is still bound to the active doc (0.140885ms) + ✔ blocks switching documents while the editor is open (0.160485ms) +✔ editor session document binding (0.833666ms) +▶ interpretBlockSaveError + ✔ 409 keeps the draft in the editor (0.232513ms) + ✔ other PATCH failures also keep the editor (0.236993ms) +✔ interpretBlockSaveError (0.694559ms) +▶ blockedGovernanceCopy + ✔ recognizes blocked run status and fixed hint, not generation success (0.68284ms) +✔ blockedGovernanceCopy (1.501155ms) +▶ commentPolicy + ✔ lets author/reviewer/approver annotate and keeps their comment role (0.754708ms) + ✔ keeps viewer read-only: no add entry and no reviewer/approver cast (0.143735ms) +✔ commentPolicy (1.845556ms) +▶ controlledContentInvalidation + ✔ hydrate success then late list_sync keeps cache/ready and does not bump resume (1.501406ms) + ✔ post_task invalidation drops active cache and requires a new hydrate epoch (0.234723ms) + ✔ editor open / save epoch keeps draft and rejects a stale GET after PATCH (0.380079ms) + ✔ never drops the active doc without signaling rehydrate (0.131047ms) + ✔ candidate helper keeps template / doc-001 / freeform / upload out of wipe lists (0.416848ms) + ✔ dropRecordKeys is a no-op when ids are absent (0.111197ms) +✔ controlledContentInvalidation (3.930263ms) +▶ controlledDocHydrate + ✔ shouldLoadControlledContent when non-template workflow doc (0.975202ms) + ✔ shouldLoadControlledContent rejects local legacy/mock ids like doc-001 (0.209814ms) + ✔ shouldLoadControlledContent keeps canonical, freeform-off, and template preview rules (0.157935ms) + ✔ hydrateControlledDocumentContent never requests content/revision for doc-001 (0.33429ms) + ✔ hydrateControlledDocumentContent never requests for template preview or registered freeform (0.138206ms) + ✔ shouldLoadControlledContent stays inside toolbar server-backed eligibility (0.181635ms) + ✔ resolveCanonicalDocId maps doc-p56-intake to doc_proj56_intake (0.271331ms) + ✔ canonicalDocIdForTask maps doc-p56-research to doc_proj56_research (0.155545ms) + ✔ hydrate treats projection missing as ledger content, not 404 (1.439947ms) + ✔ attaches hydrate ETag as PATCH baseline and ignores a later GET (1.035789ms) + ✔ rejects hydrate when revision-state network or 5xx fails (0.621892ms) + ✔ aligns markdownToBlockAST random ids onto revision-state head_block_map (1.815297ms) + ✔ leaves Math.random ids when head_block_map is omitted (why gate + fail-closed remain) (0.409868ms) + ✔ rejects controlled hydrate on NOT_FOUND or NEEDS_CONTENT (0.262602ms) + ✔ fingerprint stays stable when only object identity changes (0.411477ms) + ✔ dedupes in-flight hydrate for the same doc fingerprint (0.271882ms) + ✔ aligned late hydrate still cannot overwrite a PATCH-success baseline (0.436167ms) +✔ controlledDocHydrate (11.673493ms) +✔ createClientTurnId uses randomUUID when available (0.801476ms) +✔ createClientTurnId falls back to getRandomValues UUID v4 (0.422888ms) +✔ createClientTurnId throws when no secure random API exists (0.377459ms) +✔ selectNonCreatorInitialMembers skips creator only (1.384889ms) +✔ buildManagedMemberUpsertPayload sends document_duty on add/update/restore (0.209053ms) +✔ buildInitialMemberUpsertPayload maps reviewer UI role to member API role (0.129297ms) +✔ persistInitialProjectMembers awaits each add and stops on failure (0.467736ms) +✔ ensureCreatedProjectWithMembers skips recreate on bootstrap id and retries members (1.66308ms) +✔ beginCreateProjectSubmit rejects concurrent second entry until end (31.01785ms) +✔ resolveCreateProjectSubmitPhase uses bootstrap to choose syncing label (0.521255ms) +✔ createProjectSubmitButtonLabel and close block while submitting (0.176264ms) +▶ resolveCurrentDocRole + ✔ resolves A as author by authoritative user id (0.730168ms) + ✔ does not promote reviewer B or stranger to author (0.156975ms) + ✔ resolves real USER_B id as reviewer and never name-promotes placeholder 2 (0.144165ms) + ✔ fail-closes unknown identity to viewer even if projectPermission says author (0.138776ms) + ✔ matches name only for legacy local docs without duty ids (0.111857ms) + ✔ does not name-promote when server controlled duties are zero ids (0.128906ms) +✔ resolveCurrentDocRole (2.618612ms) +▶ currentProjectRestore + ✔ rejects empty project names (0.765087ms) + ✔ rejects page-wide project name when banner and sidebar both match (0.232303ms) + ✔ scopes the visible entry to complementary exact title (0.829836ms) + ✔ scopes the current project assertion to banner exact text (0.236433ms) +✔ currentProjectRestore (3.03326ms) +▶ deliverableLeaseSync + ✔ returns the same array reference when leases are unchanged (0.698939ms) + ✔ returns a new array only when a lease actually changes (0.205023ms) +✔ deliverableLeaseSync (1.972472ms) +▶ docGovActionVisibility + ✔ hides all approval actions on unmanaged docs (0.642991ms) + ✔ gates full docs by currentRole and denies creator who is not author (0.149815ms) +✔ docGovActionVisibility (1.653911ms) +▶ documentBlockDomAttrs + ✔ marks a real DocumentBlock in pure mode without overlay kind (0.635621ms) + ✔ keeps the same stable attrs when overlay is later attached separately (0.160695ms) +✔ documentBlockDomAttrs (1.696249ms) +▶ durableBodySnippet + ✔ rejects empty persisted snippets (0.834965ms) + ✔ lets a later successful revision replace the old snippet (0.184845ms) + ✔ does not promote a conflict-failed draft to the expected body (0.094617ms) +✔ durableBodySnippet (2.088838ms) +▶ dutyCellAssertion + ✔ parses author, reviewer, and viewer from select value or badge role (1.050019ms) + ✔ must not infer author from a row whose option labels include 编制负责人 (0.606802ms) + ✔ accepts only a disabled non-assignable reviewer select (0.178935ms) + ✔ rejects an enabled reviewer select when the reviewer cannot assign leads (0.141976ms) + ✔ rejects canAssignLead=true even if the reviewer select is disabled (0.104107ms) + ✔ rejects viewer, author, approver, and unknown values for USER_B (0.240222ms) +✔ dutyCellAssertion (3.789288ms) +▶ decideHydrationApply + ✔ applies only when gen, doc, save epoch match and editor is closed (1.114307ms) + ✔ rejects a response for another document (0.129927ms) + ✔ rejects a superseded generation (0.074477ms) +✔ decideHydrationApply (2.174136ms) +▶ createEditorHydrationGate + ✔ does not start a new hydrate while the editor is open (UI-06 fill-window GET) (0.33025ms) + ✔ deferred hydrate that resolves after the editor opens does not replace the session (0.154475ms) + ✔ covers hydrate resolving between fill and save (0.831215ms) + ✔ asks for a hydrate resume after editor_open blocked the first apply (0.183755ms) + ✔ asks for a hydrate resume when beginHydration is skipped while editing (0.098577ms) + ✔ requestHydrationResume is consumed once after a protected edit session (0.101547ms) + ✔ late hydrate after a successful PATCH does not roll back the new baseline (0.221663ms) +✔ createEditorHydrationGate (2.317701ms) +✔ mergeSessionUser prefers session identity over stale catalog entry (1.33126ms) +▶ playwrightPhaseArtifacts + ✔ defaults unknown or empty UI_PHASE to main (0.961422ms) + ✔ keeps post-restart distinct from main so the second run cannot overwrite traces (0.237433ms) + ✔ keeps main results at the historical filename and isolates post-restart recordPass (0.231943ms) + ✔ shares phase-state and secrets across phases (0.157155ms) +✔ playwrightPhaseArtifacts (2.775488ms) +✔ resolvePostTaskActiveDocId prefers server doc_proj for taskKey (5.135667ms) +✔ resolvePostTaskActiveDocId honors preferred server doc id (0.248052ms) +✔ shouldSwitchTemplateSlotToServer when active is local template slot (0.220503ms) +✔ pollUntilPostTaskServerDoc retries until same taskKey server doc appears (0.492325ms) +✔ pollUntilPostTaskServerDoc returns null after maxAttempts without relying on setState (0.259652ms) +✔ mapServerProjectToProjectInfo maps creator and preserves local members (0.862764ms) +✔ mergeProjectLists drops local-only demo seed projects by default (0.307481ms) +✔ mergeProjectLists can retain local-only demo when explicitly opted in (0.257142ms) +✔ documentDutyFromMemberRole maps UI reviewer and creator (0.961031ms) +✔ exclusiveMemberRoleChange keeps a single reviewer (0.253383ms) +✔ memberRoleFromDocumentDuty does not invent reviewer from access role (0.304451ms) +✔ toApiProjectRole maps doc roles to member and creator to owner (0.710619ms) +✔ fromApiProjectRole maps owner to creator for project creator (0.134726ms) +✔ mapApiMemberToProjectMember builds UI record (0.138356ms) +▶ projectSettingsDuties + ✔ toggles full to none by atomically clearing duties (1.431477ms) + ✔ blocks partial saves and locates required/governance issue codes (0.424337ms) + ✔ allows an all-none configurable draft without three members (1.276902ms) + ✔ requires three members once any document is managed (0.169765ms) +✔ projectSettingsDuties (4.785338ms) +▶ projectSettingsMode + ✔ enters frozen when can_edit_plan is false or the project is active (0.908493ms) + ✔ stays planning only for an editable draft (0.192724ms) + ✔ lists enabled duties for the frozen snapshot and skips disabled tasks (0.810526ms) + ✔ keeps the local draft after PLAN_FROZEN refresh and switches to frozen (0.154905ms) +✔ projectSettingsMode (3.222635ms) +▶ revisionEtag + ✔ uses stale hydrate ETag for PATCH and never the latest GET (0.893634ms) + ✔ does not invent 0:0 when controlled hydrate misses etag or errors (0.173455ms) + ✔ refuses controlled save without a hydrate ETag (0.544853ms) + ✔ allows freeform bootstrap 0:0 only (0.292201ms) +✔ revisionEtag (3.124147ms) +▶ saveControlledBlockEdit + ✔ successful save calls PATCH once with bound docId, hydrate ETag, body and client_block_map (2.093777ms) + ✔ does not PATCH when editorDocId and activeDocId diverge (0.175035ms) + ✔ does not PATCH on stale block id and keeps the draft (0.148595ms) + ✔ 409 does not close the editor or drop the draft (0.512815ms) + ✔ network errors do not close the editor or drop the draft (0.178185ms) +✔ saveControlledBlockEdit (4.080149ms) +✔ parseProjectIdFromSessionId decodes sess-p{id}-u{user} (0.621912ms) +✔ resolveSessionProjectId prefers explicit id then session id encoding (0.149855ms) +✔ mapServerSessionToProjectSession fills project metadata (0.581942ms) +✔ mergeSessionLists keeps local stage while applying server counts (0.191564ms) +▶ squadCompletionObservation + ✔ accepts a directly completed adjacent assistant without requiring inflight (0.738108ms) + ✔ accepts a turn that passed through inflight then completed (0.121706ms) + ✔ rejects error terminals, missing correspondence, and visible errors (0.149446ms) + ✔ keeps waiting while still inflight and does not treat inflight as success (0.097687ms) +✔ squadCompletionObservation (2.076648ms) +✔ resolveReconnectRunId prefers explicit opts and ignores attempt without opts (0.734238ms) +✔ shouldSubscribeExistingRun only for in-flight statuses (0.158095ms) +✔ isRemoteTaskTerminal covers confirmation and quality_failed (0.140145ms) +✔ nextAttemptOpts carries retained runId for reconnect without new POST (0.121557ms) +▶ uploadFreeformRegister + ✔ buildUploadClientKey prefers explicit hint then doc-upload stamp (0.472296ms) + ✔ registerUploadAttachments hard-fails without creating orphan on API error (12.923646ms) + ✔ registerUploadAttachments rejects local doc-upload id from server (0.307631ms) + ✔ registerUploadAttachments returns server doc-free ids and freeform facts (0.425217ms) + ✔ deliverableFromFreeformUpload maps server id and upload facts (0.138386ms) +✔ uploadFreeformRegister (15.166989ms) +▶ workflowCategoryNavigation + ✔ private menu cannot see doc_proj* so it must switch to workflow before exact select (1.137846ms) + ✔ fail-closes when the workflow menu is showing but the exact doc is missing (0.206404ms) + ✔ label and taskKey opens always require the workflow category (0.094747ms) +✔ workflowCategoryNavigation (2.37942ms) +▶ 用户上传文档多格式在线预览体系与渲染分流测试 + ✔ 1. 上传附件时正确注入 sourceType: "uploaded_file" 与完整 fileMeta 元数据 (0.66963ms) + ✔ 2. 扩展名分类规则准确分发至对应的高保真渲染器类型 (0.298471ms) + ✔ 3. 受控工作流交付物严格隔离:绝不命中 FilePreviewPanel,保持 BlockRenderer 纯净 (0.147986ms) + ✔ 4. 上传文档支持受控流转:从个人私密一键共享至项目参考库后,在线预览依然可用且权限标态正确 (0.153345ms) +✔ 用户上传文档多格式在线预览体系与渲染分流测试 (2.101867ms) +▶ 项目立项、成员职责分配与退出留痕治理测试套件 + ✔ 1. 默认项目库包含完整元数据与法定三权成员 (active 状态) (0.458517ms) + ✔ 2. 跨用户会话可见性严格隔离:未加入成员完全不可见 (0.200454ms) + ✔ 3. 创建者添加新成员并分配职责后,新成员即刻可见该项目会话 (0.118626ms) + ✔ 4. 中途加入后期退出 (exited):保留项目会话但标记已退出只读留痕 (0.125476ms) + ✔ 5. 超级管理员 (ADMIN) 享有全量通配可见与管理兜底特权 (0.086488ms) +✔ 项目立项、成员职责分配与退出留痕治理测试套件 (1.850955ms) +▶ 新建项目工程文档模板质量与纯净性保障套件(对标官方参考系统) + ✔ 1. 必须精确生成 7 份官方全流程受控工作流模板且标记纯净 (0.66659ms) + ✔ 2. 杜绝旧项目 CUSA-NeuroPulse 串号泄露,动态注入新项目信息 (0.545744ms) + ✔ 3. 严格对标参考系统模板规范要素,绝非 3 行残缺摘要 (0.408417ms) + ✔ 4. 缓存丢失场景下即时自愈重建 AST 能力验证 (0.241083ms) +✔ 新建项目工程文档模板质量与纯净性保障套件(对标官方参考系统) (5.099429ms) +▶ 用户上传文档私密归档与共享流转测试 + ✔ 10 个评审项目均包含已共享的 URS 交付物与 AST,支持跨角色合规查阅且会话均以 assistant 闭环 (1.155265ms) + ✔ 用户上传附件自动生成私密交付物并在 AST 中建立隔离,支持流转至项目参考库 (1.181035ms) + ✔ 单轮对话支持一次上传多个文档(上限5个),批量生成私密交付物并遵循数量约束 (0.406688ms) +✔ 用户上传文档私密归档与共享流转测试 (3.384109ms) +▶ 工作流切换与消息展示时序测试套件 + ✔ 1. 当存在历史 seed 消息且追加新实时消息时,新消息必须严格沉淀在末尾 (0.65175ms) + ✔ 2. 切回项目时相同正文不应因 temp/server id 差异重复展示 (0.141016ms) +✔ 工作流切换与消息展示时序测试套件 (1.414058ms) +✔ DeliverableItem 必须包含 projectId 与 isTemplateOnly 属性 (0.652751ms) +ℹ tests 376 +ℹ suites 34 +ℹ pass 376 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 838.607739 + + RUN v5.0.0 /home/weichen/projects/Agent-System/web + +(node:4028144) 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 05:15:46 + Duration 509ms (import 50%, transform 44%, tests 5%, worker 1%) + +npm_exit=0 diff --git a/.doc/test-reports/assets/2026-09-16-matrix-deep-test/pi-runner-dev-health.json b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/pi-runner-dev-health.json new file mode 100644 index 00000000..81366bab --- /dev/null +++ b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/pi-runner-dev-health.json @@ -0,0 +1,14 @@ +{ + "ok": true, + "service": "shuimu-pi-agent-runner", + "endpoint_url": "https://api.minimaxi.com/v1", + "model_id": "MiniMax-M2.7-highspeed", + "api": "openai-compatible", + "has_token": true, + "tavily": { + "active": true, + "keys_count": 2 + }, + "data_dir": "/app/data/workspaces", + "uptime": 6589.40151734 +} diff --git a/.doc/test-reports/assets/2026-09-16-matrix-deep-test/pi-sample-typed.txt b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/pi-sample-typed.txt new file mode 100644 index 00000000..0c3b283c --- /dev/null +++ b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/pi-sample-typed.txt @@ -0,0 +1,13 @@ +=== RUN TestPiAgentTypedResult_LiveDualTrack +=== RUN TestPiAgentTypedResult_LiveDualTrack/failure_empty_prompt +=== RUN TestPiAgentTypedResult_LiveDualTrack/timeout +=== RUN TestPiAgentTypedResult_LiveDualTrack/cancel +=== RUN TestPiAgentTypedResult_LiveDualTrack/success +--- PASS: TestPiAgentTypedResult_LiveDualTrack (3.28s) + --- PASS: TestPiAgentTypedResult_LiveDualTrack/failure_empty_prompt (0.00s) + --- PASS: TestPiAgentTypedResult_LiveDualTrack/timeout (0.00s) + --- PASS: TestPiAgentTypedResult_LiveDualTrack/cancel (0.30s) + --- PASS: TestPiAgentTypedResult_LiveDualTrack/success (2.97s) +PASS +ok chat-agent-system/internal/agent 3.287s +pi_sample_exit=0 diff --git a/.doc/test-reports/assets/2026-09-16-matrix-deep-test/short.txt b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/short.txt new file mode 100644 index 00000000..61fba3c8 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/short.txt @@ -0,0 +1,62 @@ +ok chat-agent-system/cmd/bizdev-cli 91.185s +? chat-agent-system/cmd/dataset [no test files] +ok chat-agent-system/cmd/document-content-reconcile (cached) +? chat-agent-system/cmd/document-revision-backfill [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 (cached) +ok chat-agent-system/internal/app (cached) +ok chat-agent-system/internal/app/chatflow (cached) +ok chat-agent-system/internal/app/docadvance (cached) +ok chat-agent-system/internal/app/docflow (cached) +ok chat-agent-system/internal/app/docnotify (cached) +ok chat-agent-system/internal/app/docproject (cached) +ok chat-agent-system/internal/app/intentflow (cached) +ok chat-agent-system/internal/app/stageflow (cached) +ok chat-agent-system/internal/app/uow (cached) +ok chat-agent-system/internal/archtest 0.143s +ok chat-agent-system/internal/artifactvault (cached) +ok chat-agent-system/internal/auth (cached) +ok chat-agent-system/internal/authz (cached) +ok chat-agent-system/internal/bizdev (cached) +ok chat-agent-system/internal/chat (cached) +ok chat-agent-system/internal/config 0.002s +ok chat-agent-system/internal/coordinator (cached) +ok chat-agent-system/internal/ctxmgr (cached) +ok chat-agent-system/internal/dataset (cached) +ok chat-agent-system/internal/db (cached) +ok chat-agent-system/internal/doccontent (cached) +ok chat-agent-system/internal/docduty (cached) +ok chat-agent-system/internal/docgov 0.015s +ok chat-agent-system/internal/docquery (cached) +ok chat-agent-system/internal/docrevision (cached) +ok chat-agent-system/internal/events (cached) +ok chat-agent-system/internal/freedoc 0.020s +ok chat-agent-system/internal/fsutil (cached) +ok chat-agent-system/internal/httpx (cached) +ok chat-agent-system/internal/intent (cached) +ok chat-agent-system/internal/kb (cached) +ok chat-agent-system/internal/maturity (cached) +ok chat-agent-system/internal/notification (cached) +? chat-agent-system/internal/observability [no test files] +ok chat-agent-system/internal/projectcontext (cached) +ok chat-agent-system/internal/projectinstance (cached) +ok chat-agent-system/internal/projectworkflow (cached) +ok chat-agent-system/internal/quote (cached) +ok chat-agent-system/internal/replyexport (cached) +ok chat-agent-system/internal/server 10.668s +ok chat-agent-system/internal/squad (cached) +ok chat-agent-system/internal/storage (cached) +ok chat-agent-system/internal/stream (cached) +ok chat-agent-system/internal/stream/transport (cached) +ok chat-agent-system/internal/taskrun (cached) +ok chat-agent-system/internal/template (cached) +ok chat-agent-system/internal/upload (cached) +? chat-agent-system/internal/workflow [no test files] +ok chat-agent-system/internal/workflow/runtime (cached) +ok chat-agent-system/internal/workflowdef (cached) +ok chat-agent-system/internal/workspace (cached) +? chat-agent-system/templates [no test files] +short_exit=0 diff --git a/.doc/test-reports/assets/2026-09-16-matrix-deep-test/vet.txt b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/vet.txt new file mode 100644 index 00000000..6bda81b4 --- /dev/null +++ b/.doc/test-reports/assets/2026-09-16-matrix-deep-test/vet.txt @@ -0,0 +1 @@ +vet_exit=0