Files
Agent-System/.doc/test-reports/assets/2026-09-28-refresh-task-state-recovery/npm-test.txt
T
weichen 5bc88faf4f docs(test): 记录刷新恢复的短测与前端构建
短测、前端测试和构建已通过。架构边界失败来自基线上的 coordinator 导入,浏览器与真实 PI 链路尚未在新代码上复验。
2026-09-28 06:14:35 +00:00

652 lines
46 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
> 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.388929ms)
✔ AuthClient: 自主注册受控流程(仅填用户名密码姓名,职位强制绑定访客待指派) (0.448527ms)
✔ AuthClient: 开启注册需审批时,注册账号处于待审状态并禁止登录 (0.495266ms)
✔ AuthClient: 管理员创建账号必须在首次登录修改密码 (0.258262ms)
✔ authErrorMessage: 优先信封 error 领域原因,避免裸 JSON / 无权访问误导 (0.227843ms)
✔ mapUserAccount: snake_case Go contract → camelCase (1.231233ms)
✔ mapUserAccount: prefers snake_case when both present (0.164515ms)
✔ mapLoginResult/mapMeResult use top-level must_change_password as sole authority (0.211534ms)
✔ mapUserAccountList maps admin users list (0.116027ms)
✔ AuthClient.login + fetchMe map real snake_case wire payloads (36.529405ms)
✔ shouldAutoRetryChat: disabled until idempotency (0.913842ms)
✔ shouldAutoRetryTask: transient only, max 2 (0.229563ms)
✔ shouldAutoRetryTask: document busy never retries (0.136656ms)
✔ shouldAutoRetry alias delegates to task path (0.137816ms)
✔ autoRetryDelayMs: 1s then 2s (0.137336ms)
✔ fallbackErrorClass: network → transient, workspace → resumable (1.663131ms)
✔ upsertChatSession surfaces safe INTERNAL envelope instead of raw JSON text (79.905537ms)
[sse] 忽略无法解析的帧: {not valid json SyntaxError: Expected property name or '}' in JSON at position 1 (line 1 column 2)
at JSON.parse (<anonymous>)
at parseFrame (/home/weichen/projects/Agent-System/.worktrees/refresh-task-state-recovery-2026-09-28/web/src/api/chatStream.ts:126:26)
at parseSSEChunk (/home/weichen/projects/Agent-System/.worktrees/refresh-task-state-recovery-2026-09-28/web/src/api/chatStream.ts:199:20)
at TestContext.<anonymous> (/home/weichen/projects/Agent-System/.worktrees/refresh-task-state-recovery-2026-09-28/web/src/api/chatStream.test.ts:41:31)
at Test.runInAsyncScope (node:async_hooks:226:14)
at Test.run (node:internal/test_runner/test:1402:25)
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
at Test.postRun (node:internal/test_runner/test:1542:19)
at Test.run (node:internal/test_runner/test:1467:12)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
✔ parseSSEChunk: parses event and data lines (1.00906ms)
✔ parseSSEChunk: keeps incomplete frame in rest (0.231474ms)
✔ parseSSEChunk: flush parses final frame without trailing delimiter (0.224793ms)
✔ parseSSEChunk: ignores heartbeat comments and keeps last id (0.139066ms)
✔ parseSSEChunk: skips a single malformed frame and keeps parsing the next valid frame (5.017202ms)
✔ parseSSEChunk: parses CRLF-delimited frames (0.229503ms)
✔ parseSSEChunk: mixed LF and CRLF delimiters (0.137336ms)
✔ API_BASE is empty relative base (1.037719ms)
✔ apiFetch attaches Bearer from session storage (64.929112ms)
✔ apiFetch retries GET on 503 then succeeds (201.72881ms)
✔ apiFetch does not retry POST by default (0.516094ms)
✔ readApiError preserves typed envelope for error cards (1.498965ms)
✔ apiFetch auth:false skips Authorization (0.530665ms)
▶ docgov lifecycle API client
✔ claimDocument posts to /api/v1/docgov/claim with author role (23.291168ms)
✔ submitForReview posts to /api/v1/docgov/submit-review (0.706349ms)
✔ reviewDecision posts action and optional reason (0.817416ms)
✔ approverDecision posts action and rollback_to (0.954792ms)
✔ proposeModification posts to /api/v1/docgov/proposal (1.198325ms)
✔ decideModificationProposal posts to /api/v1/docgov/proposal/decide (0.720289ms)
✔ docgov lifecycle API client (28.742506ms)
✔ updateFreeformDoc exposes CONCURRENCY_CONFLICT on 409 (22.916699ms)
▶ notifications inbox helpers
✔ ranks action_required / proposal ahead of info (0.65737ms)
✔ notifications inbox helpers (1.486036ms)
✔ addProjectMember exposes structured ProjectSettingsApiError on 403 (25.801144ms)
✔ updateProjectMember surfaces safe INTERNAL message on 500 duty-sync failure (0.822326ms)
▶ projectSettingsError
✔ keeps status, code, message and issues on PLAN_FROZEN (1.624582ms)
✔ maps revision and concurrent conflicts to distinct recovery (0.172775ms)
✔ joins validation issues but still keeps typed codes (0.189844ms)
✔ prefers envelope code over legacy error field (0.138986ms)
✔ unwraps nested business JSON inside VERSION_CONFLICT envelope (0.187354ms)
✔ maps bare VERSION_CONFLICT envelope to retry_after_switch (0.106467ms)
✔ retains the local draft when a late tab hits PLAN_FROZEN (0.114897ms)
✔ prefers error_code over legacy bare error string (DOC_BUSY) (0.128807ms)
✔ projectSettingsError (4.087899ms)
✔ fetchProjectTrace turns null arrays into empty arrays (25.555001ms)
✔ fetchProjectTrace keeps real arrays and rejects failed responses (1.302701ms)
✔ Project workflow types validation (2.125657ms)
✔ createTaskRun exposes DOC_BUSY detail without a retryable run (27.347498ms)
✔ parseSSEChunk tracks id seq for after_seq reconnect (0.474346ms)
✔ subscribeTaskRunEvents reconnects on EOF with advancing after_seq (6.424009ms)
✔ readTaskRunSSEOnce marks non-terminal EOF for reconnect (0.68087ms)
✔ subscribeTaskRunEvents fails fast on 401 without retrying (0.491175ms)
✔ subscribeTaskRunEvents fails fast on 404 without retrying (1.400458ms)
✔ buildTaskRequest: maps five project fields + task_key + user identity (0.757228ms)
✔ buildTaskRequest: omits optional fields when absent (0.164035ms)
✔ buildTaskRequest: includes materials when provided and non-empty (0.755688ms)
✔ buildResumeRequest: adds work_dir on top of task request (0.175045ms)
✔ buildTaskRequest: canonicalizes legacy doc-p doc_id (0.260083ms)
✔ buildTaskRequest: UI-05 pinned intake keeps task_key + doc_proj6109_intake (0.193434ms)
✔ buildResumeRequest: forwards add_steps when provided (0.153185ms)
✔ CategoryDock: 渲染顶部 🔔 未读提醒项及角标数字 (20.272788ms)
✔ CategoryDock: isAllReadCompleted 为 true 时渲染完成态提示 (9.797689ms)
✔ CategoryDock: 0 未读时不渲染红色未读角标 (6.548825ms)
✔ CategoryDock: 分类项包含依次跳转与遍历提示信息 (5.285423ms)
✔ chat column lives outside the workbench shell (0.954951ms)
✔ InputArea keeps draft when send preflight fails (1.420548ms)
✔ InputArea clears draft only after accepted send (2.463867ms)
✔ InputArea shows thinking block message (0.197614ms)
✔ InputArea keeps draft when attachment registration fails (0.247822ms)
✔ TaskRunCard renders timeline with title badge and current step (13.771851ms)
✔ TaskRunCard completed state keeps card with duration and artifact (2.308901ms)
✔ TaskRunCard sanitizes frozen progress labels on completed steps (1.979611ms)
✔ TaskRunCard keeps shell when only taskRunId is present (0.864224ms)
✔ active document pane lives outside the workbench shell (1.437047ms)
✔ isTemplateOnly 交付物应正确识别为初始模板展示态 (7.921545ms)
✔ workbench shell lives outside App (4.726439ms)
✔ 左侧栏鼠标严密绝对跟随与夹紧测试 (Left Rail Exact Pointer Following & Clamping) (0.713178ms)
✔ 右侧栏鼠标严密绝对跟随与反向位移测试 (Right Rail Exact Pointer Following & Inverted Delta) (0.126506ms)
✔ trace panel is not mounted above the chat stream (5.641603ms)
✔ detects legacy mock and neuropulse/ten-projects ids (0.864744ms)
✔ detects colliding demo project ids (0.132876ms)
✔ applyRestoredFileRaw: 以 prev 为权威,只补丁缺失 fileRaw,不丢新增条目 (1.154566ms)
✔ applyRestoredFileRaw: 无可用 fileRaw 时返回同一引用 (0.187955ms)
✔ login member sync stays one request for 1, 30 and 100 projects (6.07364ms)
✔ viewer seed keeps session visibility without a member-list call (0.397488ms)
✔ later session response cannot overwrite a newer user (0.190665ms)
✔ in-flight member sync collapses to one call (0.263752ms)
✔ 每人独立私聊:同一项目不同用户拥有不同 sessionId (0.881204ms)
✔ 左侧会话列表按当前用户过滤,不可见他人私聊 (0.256262ms)
✔ 消息严格归属各自私聊 session,无跨用户混聊 (0.870234ms)
✔ 切换用户时 resolve 到该用户同项目私聊会话 (0.244812ms)
✔ resolve 优先有消息的私聊,跳过空壳 sess-p{N}-u{id} (1.166125ms)
✔ ensurePrivateSessionsForUser 为缺失用户补齐空私聊 (0.593802ms)
✔ 多项目会话消息隔离测试仍成立(endo vs ultrasound) (0.33904ms)
✔ window cache LRU: 驱逐带 userId 前缀的完整 cache key,不留孤儿条目 (1.36061ms)
✔ window cache: 无 schema 的旧载荷不当作有效缓存 (7.710341ms)
✔ window cache: 读写同一 userId 前缀,跨用户不串读 (0.273892ms)
✔ 残留的 legacy demo sessionId 被读取侧清除并返回 fallback (0.905753ms)
✔ 真实 sessionId 不被误清 (0.152565ms)
✔ 无 window 环境(SSR)安全返回 fallback (0.068078ms)
✔ same account and first login do not reset workbench storage (1.144056ms)
✔ switching accounts resets workbench storage (0.182865ms)
✔ resetWorkbenchStorage preserves org user directory for cross-account project create (1.219384ms)
✔ parseAnchorHash: 正确解析标准深链 hash (1.438807ms)
✔ formatAnchorHash: 正确构造深链格式 (0.106107ms)
✔ navigateToAnchor: 快路径直接命中 DOM 节点 (0.388478ms)
✔ navigateToAnchor: 慢路径拉取分片后命中 (79.542228ms)
✔ resolveTurnAnchorId: 方案 A 轮次归一化测试 (0.507675ms)
✔ 全链路场景 1: 用户自主受控注册(仅填用户名/密码/姓名,职位严格绑定访客待指派) (1.552684ms)
✔ 全链路场景 2: 系统准入策略(关闭自主注册与开启强制审批流转) (0.647091ms)
✔ 全链路场景 3: 管理员开通账号首次强制改密闭环 (0.242653ms)
✔ 全链路场景 4: 环境标识随登录会话返回(dev/test/main) (0.261022ms)
✔ cleanHeadingContent: 手工多级序号前缀清洗与专业词汇保护 (2.277532ms)
✔ 标题多层级自动编号:单 H1 文档总标题自适应模式 (1 -> 1.1 -> 1.1.1) (0.34501ms)
✔ 标题多层级自动编号:多 H1 标准大章模式 (0.137276ms)
✔ 跨章节图、表、公式多级按章重编号测试 (表 1-1, 表 2-1, 图 3-1, 式 (4-1)) (0.154156ms)
✔ 有序列表与无序列表编号与渲染功能测试 (2.399788ms)
✔ 动态块操作闭环重编号验证 (Insert, Move, Delete) (3.589093ms)
✔ findMatchingBlockForReview: 能够精准按审查关键词(电气安全/EMC/竞品)定位段落块 (0.848975ms)
✔ findMatchingBlockForReview: 能够按外部指定 hint 线索精确命中目标块 (0.170635ms)
✔ createRejectConfirmationCard: 生成合规危险级驳回门禁卡片 (0.605742ms)
✔ isAffirmativeResponse: 准确识别双轨交互中的肯定意图输入 (0.205574ms)
✔ findLastActiveCard: 正确在会话历史中提取最新的待决策卡片 (0.201834ms)
✔ decrementActiveCardsTtl: 多轮对话超时递减与自动失效归档 (0.163195ms)
✔ applyConfirmRejectToDoc & applyUndoRejectToDoc: 驳回挂载批注与60s窗口期撤销完整闭环 (0.251372ms)
✔ resolveCardInMessages & cancelCardInMessages: 消息流中卡片终态沉淀 (0.151626ms)
✔ classifyRejectUtterance: 询问原因 → QUERY_REJECT_REASON (1.295522ms)
✔ classifyRejectUtterance: 明确执行 → EXECUTE_REJECT (0.177635ms)
✔ classifyRejectUtterance: 模糊 → OTHER (0.197495ms)
✔ resolveDocGovCard: 编制人查询 → 信息卡且无 confirm_reject (0.788967ms)
✔ resolveDocGovCard: 审核人执行 + reviewing → 确认卡 (0.289862ms)
✔ resolveDocGovCard: 编制人误说执行驳回 → 无权纯文本 (0.141016ms)
✔ resolveDocGovCard: 批准人 + approving → 终审确认卡 (0.274622ms)
✔ resolveDocGovCard: 编制人 OTHER → 引导查询无危险按钮 (0.128557ms)
✔ canConfirmReject: 仅审核/批准 (0.537784ms)
✔ deriveFallbackCategory identifies categories correctly (0.870374ms)
✔ enrichMessagesWithCategories backfills categories without overwriting existing ones (0.313601ms)
✔ Markdown ➔ Block AST 解析测试 (标题自适应编号与图表公式全链路) (4.275193ms)
✔ 动态重编号引擎测试 (多 H1 规范章节重排验证) (0.980431ms)
✔ Block AST ➔ Markdown 双向无损往返还原测试 (0.843655ms)
✔ 三层交付物多用户隐私绝对隔离测试 (Multi-user Strict Privacy Isolation) (1.088098ms)
✔ 一键共享至项目参考库流转测试 (Promote to Shared Reference Test) (0.221383ms)
✔ 撤回共享恢复私有草稿测试 (Revoke Shared Reference Test) (0.408948ms)
✔ 受控工作流纯净性红线检验 (Workflow Purity Security Red Line) (0.129456ms)
✔ isSameMessage: clientTurnId match (1.861744ms)
✔ isSameMessage: serverId match without turn (0.175055ms)
✔ filterPendingLiveMessages: real temp vs server id (0.137566ms)
✔ mergeLiveOverHistory preserves server id from live (0.173595ms)
✔ mergeLiveOverHistory does not let inflight live mask terminal history (0.134716ms)
✔ mergeLiveOverHistory keeps live terminal over history inflight (0.112497ms)
✔ applyPhaseEvent: appends first phase as running node (1.403038ms)
✔ applyPhaseEvent: completes predecessors when a new phase arrives (0.249813ms)
✔ applyPhaseEvent: same phase refreshes label in place (no duplicate node) (0.243692ms)
✔ applyPhaseEvent: unknown phase falls back to hourglass meta (0.130056ms)
✔ applyPhaseEvent: prefers backend message over short label (0.114206ms)
✔ applyPhaseEvent: step_completed closes running entry without appending (0.239473ms)
✔ applyPhaseEvent: stage_completed closes entries (0.163325ms)
✔ applyPhaseEvent: task_failed appends warning node (0.133246ms)
✔ applyPhaseEvent: decorates label with step index / total steps (0.137436ms)
✔ applyPhaseEvent: repeated step_executing with step_index gets separate nodes (0.200365ms)
✔ applyPhaseEvent: ignores event without phase payload (0.097807ms)
✔ applyPhaseEvent: step_failed marks running entry as failed (keeps step label) (0.114317ms)
✔ applyPhaseEvent: step_failed appends failed node when no running entry exists (1.234163ms)
✔ applyPhaseEvent: retry of a failed step resets it to running (0.141366ms)
✔ applyPhaseEvent: stores detail from phase.message (0.075458ms)
✔ PHASE_META: document_parsing and document_summarizing are registered (0.114747ms)
✔ PLAN_CONFIRM 卡片来自 PlanView 且不触达 AST (1.988191ms)
✔ 409 冲突把卡片标为 outdated 并换上最新 revision (0.252702ms)
✔ GET reconcile 用权威 PlanView 覆盖本地 executing,不假装成功 (0.226923ms)
✔ 过期计划映射 expired (0.125736ms)
✔ 非计划卡不被误判 (0.112107ms)
✔ 集成验证:项目切换时交付物严格隔离,新建项目即刻包含 7 份模板副本 (6.355481ms)
✔ 集成验证:三层隐私与项目物理隔离双重约束 (8.259005ms)
✔ 用例 1: DEFAULT_ROLES 包含 5 种默认角色且具备预期权限 (4.314872ms)
✔ 用例 2: 系统管理员 (ADMIN) 与具备 perm:manage 用户的通配豁免特权 (0.226003ms)
✔ 用例 3: 常规工作流基线可见性 (workflow:view_all) 判定 (0.249052ms)
✔ 用例 4: 单文档覆盖 - designated_only (仅编制/审核/批准人可见,其他用户被精确拦截) (0.145636ms)
✔ 用例 5: 单文档覆盖 - role_whitelist (仅白名单内角色可见,其他角色被精确拦截) (0.127306ms)
✔ 用例 6: 单文档覆盖 - public (放宽可见性,无 workflow:view_all 权限的访客也能查阅) (0.100067ms)
✔ 用例 7: 私密文档隔离强红线 (category === private 无论任何管理员或单文档覆盖,非创建者绝对不可见) (0.111796ms)
✔ 用例 8: 核心业务动作权限拦截判定 (canPerformDocAction & hasPermission) (0.149616ms)
✔ 用例 9: filterVisibleDeliverablesWithRBAC 能够批处理过滤大盘交付物 (5.913474ms)
✔ 集成场景 1: 动态新增合规审计员角色,并配置其仅能查阅特定单文档覆盖 (1.047099ms)
✔ 集成场景 2: 服务端 capabilities 变更后权限即刻生效 (0.168345ms)
✔ 集成场景 3: 单文档覆盖 designated_only 严格收紧与撤回恢复全流程 (0.148375ms)
✔ renderInlineMarkdown: renders bold, italic, strikethrough (1.362779ms)
✔ renderInlineMarkdown: escapes raw HTML tags to prevent XSS (0.653981ms)
✔ renderInlineMarkdown: blocks javascript: link hrefs (0.305061ms)
✔ renderInlineMarkdown: renders inline code and preserved line breaks (0.290592ms)
✔ renderInlineMarkdown: renders headings lists and tables for chat replies (0.487936ms)
✔ renderInlineMarkdown loads katex only after a formula is seen (19.51147ms)
✔ sanitizeMermaidCode: auto wraps unquoted labels containing brackets or comparison operators (0.422077ms)
(node:1877659) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.
(Use `node --trace-warnings ...` to show where the warning was created)
✔ DOCX 渲染器行内文本与公式解析测试 (parseInlineContent) (4.879835ms)
✔ DOCX 渲染器 LaTeX 原生 OMML 转换引擎测试 (latexToOmml) (2.009401ms)
✔ DOCX 渲染器 Mermaid 语法净化与容错测试 (sanitizeMermaidCode) (0.3103ms)
✔ DOCX 渲染器 SVG 净化防 Canvas 污染测试 (cleanSvgForCanvas) (0.367549ms)
✔ DOCX 渲染器全量编译测试 (buildDocxModel & exportDocumentToDocx) (61.249852ms)
✔ XLSX 渲染器多表提取与工作簿编译测试 (buildXlsxWorkbook & exportDocumentToXlsx) (6.587554ms)
▶ Reply Document IR & Export Engine
✔ deriveReplyTitle and sanitizeFilename derive title and safe file name (1.768507ms)
✔ deriveReplyTitle handles text without heading (0.285461ms)
✔ parseReplyMarkdown parses headers, lists, code, and tables (1.728138ms)
✔ renderClipboardHtml renders self-contained styling for office tools (0.462936ms)
✔ renderClipboardHtml converts LaTeX formulas to native MathML for Word/Office (4.016571ms)
✔ renderPlainText strips formatting cleanly (0.481286ms)
✔ serializeMarkdown round-trips to valid markdown (0.33855ms)
✔ stripUnsafeHtml strips script tags and dangerous event handlers (0.549014ms)
✔ escapeHtml escapes math error payloads used by BlockEditorModal catch path (0.196264ms)
✔ Reply Document IR & Export Engine (11.579927ms)
✔ createProjectTemplateDeliverables: 必须精确生成 7 份全生命周期受控文档副本 (3.852105ms)
✔ resolveRequirementsTaskKey prefers intake for 初始需求表 (1.199405ms)
✔ resolveRequirementsTaskKey selects user_requirements for explicit URS (0.156685ms)
✔ UI-02 first-round prompt with 首轮+用户需求+摸底 must be intake not user_requirements (0.478466ms)
✔ 首轮 / 需求摸底 / 摸底 beat bare 用户需求 (0.106416ms)
✔ bare 用户需求 without V0.1 markers stays user_requirements (0.107757ms)
✔ matchTemplateDeliverable uses intake key when pool only has URS template (0.258242ms)
✔ resolveTaskTemplateForMessage keeps intake key with URS-only pool (0.149816ms)
✔ matchTemplateDeliverable prefers intake when both templates exist (0.126717ms)
✔ read-only request does not start a document task: 总结一下用户初始需求表 (0.294921ms)
✔ read-only request does not start a document task: 查看用户初始需求表 (0.145125ms)
✔ read-only request does not start a document task: 用户初始需求表现在谁在编辑 (0.090967ms)
✔ read-only request does not start a document task: 分析一下用户需求表里的风险 (0.070788ms)
✔ read-only request does not start a document task: 用户初始需求表 (0.054098ms)
✔ explicit write action still starts intake (0.136246ms)
✔ explicit update action still starts URS (0.190135ms)
✔ UI-05 prompt without active doc still keyword-routes to feasibility_reg (0.294701ms)
✔ UI-05 prompt + registered intake pins intake and doc_proj6109_intake (0.235983ms)
✔ read-only current-doc request does not start a task (0.071978ms)
✔ summary/analysis with write verbs stays chat (read-only priority) (0.089587ms)
✔ pure write intent still routes to task (0.053668ms)
✔ template-only active slot is not pinned; keywords still apply (0.096717ms)
✔ explicit named deliverable can switch away from active intake (0.165225ms)
✔ domain 注册法规 without current-doc deixis still routes feasibility_reg (0.088787ms)
✔ mismatched title vs docId suffix prefers docId taskKey (0.093428ms)
✔ deixis 当前文档 pins registered intake (0.095807ms)
✔ deixis 本文件 pins registered intake (0.047478ms)
✔ deixis 这份文档 pins registered intake (0.050108ms)
✔ deixis 本文档 pins registered intake (0.044218ms)
✔ deixis 本受控文档 pins registered intake (0.041788ms)
✔ no active doc does not invent a pin (0.096247ms)
✔ UI-11 named 系统设计输入 beats negated 需求 background (0.076237ms)
✔ mixed generate-design + do-not-cover-requirements stays prelim_design (0.055108ms)
✔ current-doc pin still wins when no other deliverable is named (0.083417ms)
✔ v3 bd_ task key wins over unprefixed intake alias (0.124346ms)
✔ word-order variants of the intake sheet stay on intake, not the shorter URS title (0.195294ms)
✔ resolveTaskTemplateForMessage blocks cross-workflow document mentions (2.185825ms)
✔ resolveTaskTemplateForMessage keeps in-scope main docs when active is main (0.129286ms)
✔ weighted mode does not let a cross-workflow title hijack an in-scope write (0.537474ms)
✔ progress question is read-only; explicit start still resolves research (0.093728ms)
▶ document revision overlay modes
✔ pure hides all decorations (0.811806ms)
✔ manual only marks human hunks (0.160956ms)
✔ all marks human and agent differently (0.137306ms)
✔ same human hunk stays amber in manual and all (no pairwise style guarantee) (0.135026ms)
✔ exposes needs-content error code for empty orphan docs (0.094397ms)
✔ matches overlay hunks by section or text when ids differ (0.272582ms)
✔ aligns client block ids from head_block_map by order (0.217134ms)
✔ document revision overlay modes (2.925713ms)
▶ toolbar refresh + report entry reachability
✔ pickLatestChangeReportId prefers highest version with report (0.33787ms)
✔ first squad run alone still exposes a reachable report id (0.165395ms)
✔ second squad run keeps both history report entries and latest shortcut (0.778567ms)
✔ revisionRefreshKey is an independent refresh signal from docId (0.127386ms)
✔ toolbar refresh + report entry reachability (1.69243ms)
▶ change report view model
✔ surfaces risk items, project impact, doc impacts with advice, and open questions (0.67743ms)
✔ marks complete analysis as PI narrative vs factual fields (0.187924ms)
✔ preferReportId prioritizes pending over committed latest (0.096757ms)
✔ change report view model (1.147986ms)
▶ revisionToolbarMount
✔ exposes clear non-error template preview hint copy (2.417999ms)
✔ template doc-p + isTemplateOnly=true does not mount (0.162285ms)
✔ legacy doc-001 does not mount (0.156295ms)
✔ unregistered doc-upload orphan does not mount (must register first) (0.145726ms)
✔ server-registered upload (doc-free) and freeform mount (0.156935ms)
✔ canonical doc_proj and generated non-template doc-p mount (0.193634ms)
✔ revisionToolbarMount (4.318292ms)
✔ login workspace sync lives in one hook (1.204984ms)
✔ block editing lives in one hook (0.957632ms)
✔ interactive card actions live in one hook (1.048618ms)
✔ useChatWindow: 所有 saveSessionWindowCache 调用必须传入 userId (1.066258ms)
✔ loadOlder race: stale resolve ignored by generation (1.557084ms)
✔ window fetch race: stale response ignored by generation (4.517886ms)
✔ mapRecordToMessage: 正确映射服务端消息记录为前端 ChatMessage (1.654151ms)
✔ refresh window: 空 messages 日桶不算有效窗口 (0.192455ms)
✔ mapRawBucket: 正确映射服务端按日分片桶 (0.312121ms)
✔ Category navigation: chip 选中后准确匹配目标分类最新轮次并触发归一化定位 (0.286702ms)
✔ mapRecordToMessage: restores task phase snapshot into card fields (0.236783ms)
✔ mapRecordToMessage: run anchor without task_status stays streaming (0.180904ms)
✔ controlled document hydration lives in one hook (1.096208ms)
✔ project creation lives in one hook called before the login return (0.755868ms)
✔ document lifecycle actions live in one hook (1.109877ms)
✔ freeform document actions live in one hook (1.755868ms)
✔ in-flight states cover pending and running only (6.667272ms)
✔ hasInFlightParse detects parse polling needs (0.246373ms)
✔ hook + reparse API surface wired (0.298551ms)
✔ project member writes live in one hook before the login return (1.318591ms)
✔ replay retries 502 and stops on auth or not-found (0.66772ms)
✔ sending a message lives in one hook (1.01656ms)
✔ server document list sync lives in one hook (1.393729ms)
✔ chat and task attempts live in one hook (1.34513ms)
✔ stage unresolved and not-in-active-stage degrade to chat once (0.155916ms)
✔ failed run with error_message surfaces TASK_FAILED not NETWORK_ERROR (0.770138ms)
✔ snake_case blocked_pending_governance is governance, not a network error (0.34381ms)
✔ unknown 4xx business code is not reported as a network error (0.377559ms)
✔ turn runtime: session A stream survives session B switch (0.649891ms)
✔ abortAllSessions aborts controllers across all sessions (0.192954ms)
✔ App persists workbench state through one hook and migrates legacy messages once (0.968861ms)
✔ active task cache keeps an in-progress run and drops it when finished (1.106048ms)
✔ syncAdminUserDirectories calls local reload then parent onRefreshUsers (1.624912ms)
✔ syncAdminUserDirectories fails closed when onRefreshUsers is a dead/missing prop (0.614612ms)
✔ syncAdminUserDirectories surfaces parent refresh errors (no silent swallow) (2.138076ms)
✔ afterProjectMemberPersisted syncs members then refreshes workflow docs (1.172795ms)
✔ afterProjectMemberPersisted does not refresh when member sync fails (0.463506ms)
▶ blockEditorDialogPolicy
✔ pins an accessible dialog label and exact save name (0.492506ms)
✔ rejects page-wide fuzzy /保存/ that would hit private-library buttons (0.258003ms)
✔ blockEditorDialogPolicy (1.557624ms)
▶ resolveSaveTargetBlock
✔ keeps the editor and does not fake success when the block id is gone (0.635451ms)
✔ never retargets another block that happens to share the same content (0.705099ms)
✔ resolveSaveTargetBlock (2.244724ms)
▶ editor session document binding
✔ fail-closes when activeDocId drifts away from the opened editor doc (0.173244ms)
✔ accepts a save only when the editor is still bound to the active doc (0.099087ms)
✔ blocks switching documents while the editor is open (0.139706ms)
✔ editor session document binding (0.614882ms)
▶ interpretBlockSaveError
✔ 409 keeps the draft in the editor (0.170955ms)
✔ other PATCH failures also keep the editor (0.192604ms)
✔ interpretBlockSaveError (0.782167ms)
▶ blockedGovernanceCopy
✔ recognizes blocked run status and fixed hint, not generation success (0.736178ms)
✔ blockedGovernanceCopy (1.654011ms)
▶ resolveChatComposerStreaming
✔ is false when no inflight assistant bubbles (0.472606ms)
✔ is true when inflight bubble and live turn (0.106117ms)
✔ is true when inflight bubble and live task run (0.078888ms)
✔ is false for orphan streaming_status after runtime cleared (0.059708ms)
✔ resolveChatComposerStreaming (1.616372ms)
▶ commentPolicy
✔ applies stage matrix for add (0.6784ms)
✔ keeps viewer read-only (0.206644ms)
✔ resolves author role literally (0.119417ms)
✔ gates resolve by stage (0.206814ms)
✔ commentPolicy (4.325182ms)
▶ controlledContentInvalidation
✔ hydrate success then late list_sync keeps cache/ready and does not bump resume (1.722119ms)
✔ post_task invalidation drops active cache and requires a new hydrate epoch (0.221513ms)
✔ editor open / save epoch keeps draft and rejects a stale GET after PATCH (0.351609ms)
✔ never drops the active doc without signaling rehydrate (0.138126ms)
✔ candidate helper keeps template / doc-001 / freeform / upload out of wipe lists (0.450837ms)
✔ dropRecordKeys is a no-op when ids are absent (0.219383ms)
✔ controlledContentInvalidation (4.35165ms)
▶ controlledDocHydrate
✔ shouldLoadControlledContent when non-template workflow doc (3.012441ms)
✔ shouldLoadControlledContent rejects local legacy/mock ids like doc-001 (0.181415ms)
✔ shouldLoadControlledContent keeps canonical, freeform-off, and template preview rules (0.164175ms)
✔ hydrateControlledDocumentContent never requests content/revision for doc-001 (0.383468ms)
✔ hydrateControlledDocumentContent never requests for template preview or registered freeform (0.181555ms)
✔ shouldLoadControlledContent stays inside toolbar server-backed eligibility (0.313571ms)
✔ resolveCanonicalDocId maps doc-p56-intake to doc_proj56_intake (0.490665ms)
✔ canonicalDocIdForTask maps doc-p56-research to doc_proj56_research (0.230063ms)
✔ hydrate treats projection missing as ledger content, not 404 (1.823986ms)
✔ attaches hydrate ETag as PATCH baseline and ignores a later GET (1.028349ms)
✔ rejects hydrate when revision-state network or 5xx fails (0.841565ms)
✔ aligns markdownToBlockAST random ids onto revision-state head_block_map (1.830716ms)
✔ leaves Math.random ids when head_block_map is omitted (why gate + fail-closed remain) (1.067668ms)
✔ rejects controlled hydrate on NOT_FOUND or NEEDS_CONTENT (0.377559ms)
✔ fingerprint stays stable when only object identity changes (0.269112ms)
✔ dedupes in-flight hydrate for the same doc fingerprint (0.449247ms)
✔ aligned late hydrate still cannot overwrite a PATCH-success baseline (0.455086ms)
✔ controlledDocHydrate (15.550208ms)
✔ createClientTurnId uses randomUUID when available (0.815456ms)
✔ createClientTurnId falls back to getRandomValues UUID v4 (0.421077ms)
✔ createClientTurnId throws when no secure random API exists (0.35659ms)
✔ selectNonCreatorInitialMembers skips creator only (1.587573ms)
✔ buildManagedMemberUpsertPayload sends document_duty on add/update/restore (0.270002ms)
✔ buildInitialMemberUpsertPayload maps reviewer UI role to member API role (0.191914ms)
✔ persistInitialProjectMembers awaits each add and stops on failure (0.65355ms)
✔ ensureCreatedProjectWithMembers skips recreate on bootstrap id and retries members (0.549973ms)
✔ beginCreateProjectSubmit rejects concurrent second entry until end (31.813816ms)
✔ resolveCreateProjectSubmitPhase uses bootstrap to choose syncing label (0.723658ms)
✔ createProjectSubmitButtonLabel and close block while submitting (0.200754ms)
✔ shouldCloneMedicalTemplates skips the 7-pack for software domain (0.131006ms)
▶ resolveCurrentDocRole
✔ resolves A as author by authoritative user id (0.752448ms)
✔ does not promote reviewer B or stranger to author (0.123077ms)
✔ resolves real USER_B id as reviewer and never name-promotes placeholder 2 (0.095468ms)
✔ fail-closes unknown identity to viewer even if projectPermission says author (0.076527ms)
✔ matches name only for legacy local docs without duty ids (0.105767ms)
✔ does not name-promote when server controlled duties are zero ids (0.160535ms)
✔ resolveCurrentDocRole (3.184245ms)
▶ currentProjectRestore
✔ rejects empty project names (0.827155ms)
✔ rejects page-wide project name when banner and sidebar both match (0.185724ms)
✔ scopes the visible entry to complementary exact title (2.776877ms)
✔ scopes the current project assertion to banner exact text (0.35035ms)
✔ currentProjectRestore (5.071659ms)
▶ deliverableLeaseSync
✔ returns the same array reference when leases are unchanged (0.753007ms)
✔ returns a new array only when a lease actually changes (0.177275ms)
✔ deliverableLeaseSync (1.904263ms)
▶ docGovActionVisibility
✔ hides all approval actions on unmanaged docs (1.605673ms)
✔ gates separated duties by user id, not folded role label (0.172974ms)
✔ author_only: same user holds all three duties and sees all actions (0.106427ms)
✔ author_only: non-duty user sees no actions (0.104037ms)
✔ docGovActionVisibility (3.05592ms)
▶ documentBlockDomAttrs
✔ marks a real DocumentBlock in pure mode without overlay kind (1.241673ms)
✔ keeps the same stable attrs when overlay is later attached separately (0.197974ms)
✔ documentBlockDomAttrs (2.573574ms)
✔ author can edit drafting when unlocked (0.720368ms)
✔ active project member can edit drafting when unlocked (deny_only_submit) (0.129316ms)
✔ non-member viewer cannot edit drafting (0.089708ms)
✔ lease blocks edit even for author and member (0.093477ms)
✔ reviewing is not editable via drafting affordance (0.080617ms)
▶ durableBodySnippet
✔ rejects empty persisted snippets (0.850954ms)
✔ lets a later successful revision replace the old snippet (0.988341ms)
✔ does not promote a conflict-failed draft to the expected body (0.174115ms)
✔ durableBodySnippet (2.940223ms)
▶ dutyCellAssertion
✔ parses author, reviewer, and viewer from select value or badge role (0.890893ms)
✔ must not infer author from a row whose option labels include 编制负责人 (0.499835ms)
✔ accepts only a disabled non-assignable reviewer select (0.122916ms)
✔ rejects an enabled reviewer select when the reviewer cannot assign leads (0.098187ms)
✔ rejects canAssignLead=true even if the reviewer select is disabled (0.249163ms)
✔ rejects viewer, author, approver, and unknown values for USER_B (0.265472ms)
✔ dutyCellAssertion (6.592245ms)
▶ decideHydrationApply
✔ applies only when gen, doc, save epoch match and editor is closed (1.170076ms)
✔ rejects a response for another document (0.146755ms)
✔ rejects a superseded generation (0.104287ms)
✔ decideHydrationApply (2.515795ms)
▶ createEditorHydrationGate
✔ does not start a new hydrate while the editor is open (UI-06 fill-window GET) (0.449467ms)
✔ deferred hydrate that resolves after the editor opens does not replace the session (0.162255ms)
✔ covers hydrate resolving between fill and save (0.149286ms)
✔ asks for a hydrate resume after editor_open blocked the first apply (0.370859ms)
✔ asks for a hydrate resume when beginHydration is skipped while editing (0.298281ms)
✔ requestHydrationResume is consumed once after a protected edit session (0.252152ms)
✔ late hydrate after a successful PATCH does not roll back the new baseline (0.412608ms)
✔ createEditorHydrationGate (2.69034ms)
▶ formatFileSize
✔ renders bytes below 1KB without rounding to 0 (0.834686ms)
✔ renders KB/MB with sensible precision (0.260662ms)
✔ degrades gracefully for invalid input (0.270781ms)
✔ formatFileSize (2.69142ms)
▶ deliverableFromServerSummary
✔ restores uploaded file routing metadata from server facts (0.903473ms)
✔ keeps plain freeform docs without upload metadata on the editor path (0.214224ms)
✔ handles legacy rows with filename but zero size gracefully (0.130076ms)
✔ maps shared space to shared category (0.139396ms)
✔ deliverableFromServerSummary (3.529395ms)
✔ redactResourceUrl drops query and origin (1.247093ms)
✔ summarizeResources flags deferred heavy chunks (1.146446ms)
✔ firstPaintHeavyHits lists only deferred module paths (0.186145ms)
✔ countInitRequests separates member fanout from session lists (0.283052ms)
✔ percentile uses nearest-rank and stays null on empty input (0.167675ms)
✔ summarizeLatencies reports p50/p75/p95 (0.216413ms)
✔ mergeSessionUser prefers session identity over stale catalog entry (1.251713ms)
▶ playwrightPhaseArtifacts
✔ defaults unknown or empty UI_PHASE to main (0.723149ms)
✔ keeps post-restart distinct from main so the second run cannot overwrite traces (0.178675ms)
✔ keeps main results at the historical filename and isolates post-restart recordPass (2.574403ms)
✔ shares phase-state and secrets across phases (0.211744ms)
✔ defaults assets to the 2026-09-22 rerun tree, not project-143 history (0.330121ms)
✔ refuses historical controlled-content and Round20 evidence dirs (2.076958ms)
✔ lists closeout groups covering UI-03/05/06/07-08-09/11/13/post-restart (0.811166ms)
✔ playwrightPhaseArtifacts (9.540066ms)
✔ resolvePostTaskActiveDocId prefers server doc_proj for taskKey (0.9999ms)
✔ resolvePostTaskActiveDocId honors preferred server doc id (0.195745ms)
✔ shouldSwitchTemplateSlotToServer when active is local template slot (0.169585ms)
✔ pollUntilPostTaskServerDoc retries until same taskKey server doc appears (0.495385ms)
✔ pollUntilPostTaskServerDoc returns null after maxAttempts without relying on setState (0.206394ms)
✔ mapServerProjectToProjectInfo maps creator and preserves local members (0.899954ms)
✔ mergeProjectLists drops local-only demo seed projects by default (0.32681ms)
✔ mergeProjectLists can retain local-only demo when explicitly opted in (0.158635ms)
✔ documentDutyFromMemberRole maps UI reviewer and creator (0.739068ms)
✔ exclusiveMemberRoleChange keeps a single reviewer (0.189214ms)
✔ memberRoleFromDocumentDuty does not invent reviewer from access role (0.116077ms)
✔ toApiProjectRole maps doc roles to member and creator to owner (0.735568ms)
✔ fromApiProjectRole maps owner to creator for project creator (0.143375ms)
✔ mapApiMemberToProjectMember builds UI record (0.188675ms)
▶ projectSettingsDuties
✔ toggles full to none by atomically clearing duties (1.726969ms)
✔ blocks partial saves and locates required/governance issue codes (0.607871ms)
✔ blocks activation preview when no document is under human approval (0.31043ms)
✔ allows an all-none configurable draft without three members (0.430327ms)
✔ requires three members once any document is managed (0.135766ms)
✔ resolves author_only to A/A/A without three-member requirement (0.243022ms)
✔ rejects author_only without author or with conflicting reviewers (0.159025ms)
✔ mixed full + author_only still requires three members for the full doc (0.324181ms)
✔ toggleAuthorOnly clears review/approve slots and restores on disable (0.178825ms)
✔ folds later rdev stages and batches human approval keys (0.263173ms)
✔ projectSettingsDuties (6.032391ms)
▶ projectSettingsMode
✔ enters frozen when can_edit_plan is false or the project is active (0.766867ms)
✔ keeps an active workflow editable except the definition switch (0.161595ms)
✔ stays planning only for an editable draft (0.076008ms)
✔ lists enabled duties for the frozen snapshot and skips disabled tasks (0.714029ms)
✔ keeps the local draft after PLAN_FROZEN refresh and switches to frozen (0.123676ms)
✔ projectSettingsMode (2.846246ms)
▶ recheckAck
✔ requires an explicit acknowledgement before advance (0.745668ms)
✔ recheckAck (1.588373ms)
▶ revisionEtag
✔ uses stale hydrate ETag for PATCH and never the latest GET (0.492745ms)
✔ does not invent 0:0 when controlled hydrate misses etag or errors (0.153046ms)
✔ refuses controlled save without a hydrate ETag (0.493985ms)
✔ allows freeform bootstrap 0:0 only (0.125246ms)
✔ revisionEtag (2.533935ms)
▶ saveControlledBlockEdit
✔ successful save calls PATCH once with bound docId, hydrate ETag, body and client_block_map (2.507325ms)
✔ does not PATCH when editorDocId and activeDocId diverge (0.239383ms)
✔ does not PATCH on stale block id and keeps the draft (0.185995ms)
✔ 409 does not close the editor or drop the draft (0.854364ms)
✔ network errors do not close the editor or drop the draft (0.441767ms)
✔ saveControlledBlockEdit (5.514056ms)
✔ parseProjectIdFromSessionId decodes sess-p{id}-u{user} (1.520394ms)
✔ resolveSessionProjectId prefers explicit id then session id encoding (0.212014ms)
✔ mapServerSessionToProjectSession fills project metadata (0.627971ms)
✔ mergeSessionLists keeps local stage while applying server counts (0.223494ms)
▶ squadCompletionObservation
✔ accepts a directly completed adjacent assistant without requiring inflight (1.388318ms)
✔ accepts a turn that passed through inflight then completed (0.127666ms)
✔ rejects error terminals, missing correspondence, and visible errors (0.093147ms)
✔ keeps waiting while still inflight and does not treat inflight as success (0.067458ms)
✔ cancelInflightAssistantMessages settles only this-session assistant inflight (0.128636ms)
✔ squadCompletionObservation (2.6832ms)
✔ running bubble without phases needs replay (0.889653ms)
✔ interrupted bubble without phases needs replay (1.515235ms)
✔ bubble that already has phases is not replayed (0.164685ms)
✔ completed bubble without snapshot needs replay for legacy rows (0.096507ms)
✔ completed bubble with snapshot is not replayed (0.113237ms)
✔ phase replay key ignores completed chatter (0.153825ms)
✔ resolveTaskRunCardTitle prefers artifact title (0.909703ms)
✔ resolveTaskRunCardTitle falls back to user message then taskKey (0.208703ms)
✔ truncateTitle ellipsizes long text (0.164275ms)
✔ formatTaskDuration covers seconds minutes hours (0.160255ms)
✔ resolveTaskRunCardBadge maps terminal and live states (0.775347ms)
✔ shouldRenderTaskRunCard keeps card shape when run id exists (0.158936ms)
✔ runningPhaseDetail prefers live label when it differs from step (0.142095ms)
✔ 403 revision denial is not reported as a network error (0.930763ms)
✔ 403 author-duty denial surfaces draft-vs-submit guidance (0.157385ms)
✔ DOC_DUTY_FORBIDDEN keeps draft-vs-submit guidance (0.754727ms)
✔ TASK_SCOPE_UNRESOLVED names the missing workflow stage (0.094747ms)
✔ resolveReconnectRunId prefers explicit opts and ignores attempt without opts (0.622101ms)
✔ shouldSubscribeExistingRun only for in-flight statuses (0.139905ms)
✔ isRemoteTaskTerminal covers confirmation and quality_failed (0.112477ms)
✔ nextAttemptOpts carries retained runId for reconnect without new POST (1.610892ms)
✔ template documents are labeled as preview, not 编制中 or 已生效受控 (0.958361ms)
✔ turnAttachmentRefs keeps doc and parse facts (1.178685ms)
✔ describeChatHttpFailure prefers the public validation error (0.460687ms)
▶ uploadFreeformRegister
✔ buildUploadClientKey prefers explicit hint then doc-upload stamp (0.955591ms)
✔ registerUploadAttachments hard-fails without creating orphan on API error (16.603197ms)
✔ registerUploadAttachments rejects local doc-upload id from server (0.370409ms)
✔ registerUploadAttachments returns server doc-free ids and freeform facts (0.548384ms)
✔ deliverableFromFreeformUpload maps server id and upload facts (0.167475ms)
✔ buildUploadRegistrationMarkdown embeds real text content when provided (0.144066ms)
✔ buildUploadRegistrationMarkdown keeps placeholder for binary files without textContent (0.250482ms)
✔ registerUploadAttachments persists source file metadata as server facts (0.301371ms)
✔ uploadFreeformRegister (20.688145ms)
▶ workflowCategoryNavigation
✔ private menu cannot see doc_proj* so it must switch to workflow before exact select (1.049129ms)
✔ fail-closes when the workflow menu is showing but the exact doc is missing (0.190554ms)
✔ label and taskKey opens always require the workflow category (0.170195ms)
✔ workflowCategoryNavigation (3.520565ms)
✔ rdev selection explains the CDO prerequisite (0.787547ms)
✔ login shell does not statically import export, preview, admin, or chart engines (27.783405ms)
▶ no external Google Fonts on login shell
✔ index.html has no fonts.googleapis / fonts.gstatic (0.930232ms)
✔ styles reference self-hosted fonts.css (0.365889ms)
✔ no external Google Fonts on login shell (2.449468ms)
▶ 用户上传文档多格式在线预览体系与渲染分流测试
✔ 1. 上传附件时正确注入 sourceType: "uploaded_file" 与完整 fileMeta 元数据 (0.865104ms)
✔ 2. 扩展名分类规则准确分发至对应的高保真渲染器类型 (0.258543ms)
✔ 3. 受控工作流交付物严格隔离:绝不命中 FilePreviewPanel,保持 BlockRenderer 纯净 (0.176665ms)
✔ 4. 上传文档支持受控流转:从个人私密一键共享至项目参考库后,在线预览依然可用且权限标态正确 (0.179385ms)
✔ 用户上传文档多格式在线预览体系与渲染分流测试 (2.772037ms)
▶ 项目立项、成员职责分配与退出留痕治理测试套件
✔ 1. 默认项目库包含完整元数据与法定三权成员 (active 状态) (0.6818ms)
✔ 2. 跨用户会话可见性严格隔离:未加入成员完全不可见 (0.273272ms)
✔ 3. 创建者添加新成员并分配职责后,新成员即刻可见该项目会话 (0.165275ms)
✔ 4. 中途加入后期退出 (exited):保留项目会话但标记已退出只读留痕 (0.162316ms)
✔ 5. 超级管理员 (ADMIN) 享有全量通配可见与管理兜底特权 (0.093258ms)
✔ 项目立项、成员职责分配与退出留痕治理测试套件 (2.459847ms)
▶ 新建项目工程文档模板质量与纯净性保障套件(对标官方参考系统)
✔ 1. 必须精确生成 7 份官方全流程受控工作流模板且标记纯净 (0.848355ms)
✔ 2. 杜绝旧项目 CUSA-NeuroPulse 串号泄露,动态注入新项目信息 (0.701719ms)
✔ 3. 严格对标参考系统模板规范要素,绝非 3 行残缺摘要 (0.411778ms)
✔ 4. 缓存丢失场景下即时自愈重建 AST 能力验证 (0.532624ms)
✔ 新建项目工程文档模板质量与纯净性保障套件(对标官方参考系统) (7.526547ms)
▶ 用户上传文档私密归档与共享流转测试
✔ 10 个评审项目均包含已共享的 URS 交付物与 AST,支持跨角色合规查阅且会话均以 assistant 闭环 (1.469307ms)
✔ 用户上传附件自动生成私密交付物并在 AST 中建立隔离,支持流转至项目参考库 (1.644061ms)
✔ 单轮对话支持一次上传多个文档(上限5个),批量生成私密交付物并遵循数量约束 (0.552124ms)
✔ 用户上传文档私密归档与共享流转测试 (4.558774ms)
▶ 工作流切换与消息展示时序测试套件
✔ 1. 当存在历史 seed 消息且追加新实时消息时,新消息必须严格沉淀在末尾 (1.243133ms)
✔ 2. 切回项目时相同正文不应因 temp/server id 差异重复展示 (0.185805ms)
✔ 工作流切换与消息展示时序测试套件 (2.221984ms)
✔ DeliverableItem 必须包含 projectId 与 isTemplateOnly 属性 (0.775697ms)
ℹ tests 532
ℹ suites 41
ℹ pass 532
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1586.5667
RUN v5.0.0 /home/weichen/projects/Agent-System/.worktrees/refresh-task-state-recovery-2026-09-28/web
Test Files 3 passed (3)
Tests 34 passed (34)
Start at 06:12:03
Duration 333ms (transform 67%, import 25%, tests 6%, worker 2%)
NPM_TEST:0