Compare commits

...
Author SHA1 Message Date
weichen 2fe1e05591 release-candidate: 汇集 dev 功能至 test(test 单二进制化配套脚本 + docker 上下文修复),准备长期实测 [Tag: rc-v1.1.0-beta.4] 2026-09-27 20:59:11 +00:00
weichen 5e409c1eb2 merge: candidate docker-context-gitkeep-2026-09-27 into dev 2026-09-27 18:35:32 +00:00
weichen e40a9989ab fix(deploy): keep web/dist/.gitkeep in docker context for go:embed
.dockerignore excluded the whole web/dist dir, breaking go-builder since
web/embed.go (all:dist) landed (6cbe7e6e): candidate image builds failed
with "pattern all:dist: no matching files found". Re-include the tracked
.gitkeep only; runtime stays disk-dist via web-builder COPY (LookupDist
false -> disk fallback). Verified by a real candidate-images-build run.
2026-09-27 18:29:50 +00:00
weichen 94c215d36e merge: candidate test-single-binary-2026-09-27 into dev 2026-09-27 16:21:34 +00:00
weichen d91dafc1c4 feat(scripts): test env single-binary entrypoints (migrate-test-db, launch-single)
- migrate-test-db.sh: reuse parameterized migrate-dev-db.sh with test defaults
  (container shuimu-system-pg-test -> localpg :5434, PGDATA=data/test/pg)
- launch-single.sh: non-dev single-binary launcher (SYSTEM_DB_*->CONTEXT_DB_*
  mapping, env-scoped PI sidecar, no Vite); task record for dev->test rc
  promotion + test conversion (rc-v1.1.0-beta.4)
2026-09-27 16:21:09 +00:00
weichen 05d45022b1 merge: candidate upload-doc-access-2026-09-27 closeout into dev 2026-09-27 08:10:14 +00:00
weichen 07845cfcee docs(task): close out upload-doc-access (dev 86efba2c verified, E2E PASS, lesson added) 2026-09-27 08:10:05 +00:00
weichen 86efba2cd5 merge: candidate upload-doc-access-2026-09-27 into dev 2026-09-27 07:52:39 +00:00
weichen 307e9e6569 docs(current): claim upload-doc-access-2026-09-27 (docs apply receipt upload-doc-access-2026-09-27-state-1) 2026-09-27 07:45:36 +00:00
weichen 88e33282db fix(freedoc): persist uploaded file metadata and text body server-side
上传文档跨端不可访问修复(ISSUE-20260927-upload-doc-cross-device):
- 迁移 00076:freeform_documents 增加 source_filename/mime/size_bytes/asset_id
- freedoc:Create/Get/List 读写源文件元数据,负值拒绝
- 前端:注册前全部附件先登记 CAS 并预读文本正文;文本正文嵌入注册
  markdown;跨端恢复 sourceType/fileMeta 路由回文件预览器
- 大小显示 formatFileSize(<512B 不再显示 0 KB)
- E2E 新增 FS-UPLOAD-02 跨浏览器上下文可访问性用例

回归:go vet/arch-check/go test -short(隔离 PG)+ web npm test/build 全绿;
存量无元数据旧文档不可恢复(重新上传即可)。
2026-09-27 07:45:15 +00:00
weichen a0e40919a7 merge: candidate frontend-demo-fallback-2026-09-27-r3 closeout into dev 2026-09-27 07:08:12 +00:00
weichen 9da300ae60 docs(task): finalize active-session residue closeout state
任务文档终态(done/merged/passed/cleanup done)、ISSUES 行 resolved
(dev 36c5fb54 复验证据)、CURRENT 置 done。
2026-09-27 07:08:05 +00:00
weichen 36c5fb549c merge: candidate frontend-demo-fallback-2026-09-27-r3 into dev 2026-09-27 07:06:17 +00:00
weichen 083c63bb9c docs(issue): register active-session residue issue and r3 task record
登记 ISSUE-20260927-active-session-residue(ISSUE-20260927-demo-fallback
修复残留路径);新增 r3 任务主记录(根因/同类排查/修复方案/验证证据);
CURRENT 登记 r3c 任务行。
2026-09-27 07:05:09 +00:00
weichen 739b8c56f9 fix(web): purge legacy demo sessionId residue from localStorage on read
旧前端曾把 demo fallback 值 sess-001 持久化到 active_session;一次性
purge 版本 key 已写不再清理,读取侧无校验导致老浏览器 + 无可见会话
账号首屏 4x chat 404。提取共享 LEGACY_DEMO_SESSION_IDS 常量,
loadActiveSessionId 命中即清除并返回 fallback(幂等),loadMessages
复用同一集合。
2026-09-27 07:05:05 +00:00
weichen 87db3621c6 merge: candidate frontend-demo-fallback-2026-09-27-r2 into dev 2026-09-27 03:15:24 +00:00
weichen 0648867921 docs(current): mark frontend-demo-fallback-2026-09-27-r2 done 2026-09-27 03:15:22 +00:00
weichen 41b9b8bc3d merge: candidate frontend-demo-fallback-2026-09-27-r2 into dev 2026-09-27 03:14:56 +00:00
weichen 20b68d6a23 docs(task): finalize frontend-demo-fallback closeout state 2026-09-27 03:14:53 +00:00
weichen 0de657f09c merge: candidate frontend-demo-fallback-2026-09-27-r2 into dev 2026-09-27 03:11:32 +00:00
weichen db038aa7a7 fix(web): stop phantom demo-fallback requests in seeds-off mode
App.tsx hardcoded fallbacks (active session "sess-001", projectId 1) sent
requests for nonexistent resources on fresh logins against real dev data,
producing 7+ console 404/403 hits. Fallbacks now resolve to empty/0; the
existing chatBlockedNoProject empty state and session-reconciliation effect
carry the UI, and demo-seeds-enabled builds keep the NEUROPULSE fallback.

Root cause, same-class scan, and before/after browser evidence (9 phantom
requests -> 0, author+member accounts) recorded in the task doc; ISSUES row
ISSUE-20260927-demo-fallback registered.
2026-09-27 03:09:37 +00:00
weichen 56928ac206 merge: candidate full-system-browser-e2e-2026-09-26 into dev 2026-09-26 09:28:00 +00:00
weichen a9d79b99b8 docs(test): audit-friendly E2E report with retained login credentials 2026-09-26 07:58:47 +00:00
weichen 7ab7d572b9 docs(test): e2e ledger after reject portal fix 2026-09-26 07:48:36 +00:00
weichen 887a75c1b1 fix(web): portal reject modal above stacking context 2026-09-26 07:48:30 +00:00
weichen 157ec407e2 docs(test): full-system browser e2e re-run ledger 2026-09-26 07:29:34 +00:00
weichen 7513ce61ed fix(web): member drafting edit + reject await + expand right rail 2026-09-26 07:29:27 +00:00
weichen 7555818753 docs(test): FINAL full-system browser E2E report after pending heal 2026-09-26 05:14:11 +00:00
weichen 323088c4bd docs(test): add playwright log for full-system e2e rerun 2026-09-26 04:31:01 +00:00
weichen ccce44dfc0 fix(chat): heal task bubble pending after completed run 2026-09-26 04:30:38 +00:00
weichen a5ca6fdcfd test(e2e): document PI UI pending mismatch and raise suite timeout 2026-09-26 04:12:33 +00:00
weichen 466426a58f test(e2e): full-system browser multi-user acceptance 2026-09-26 03:48:34 +00:00
weichen 4873c5e8b9 test(e2e): full-system browser multi-user acceptance 2026-09-26 03:28:34 +00:00
weichen 078eb4fcf0 test(e2e): full-system browser multi-user acceptance 2026-09-26 03:23:35 +00:00
weichen 09cc76eb8d merge: candidate sysadmin-maturity-refresh-2026-09-26 into dev 2026-09-26 02:46:15 +00:00
weichen 9ff489546c docs: sysadmin maturity refresh closeout (results, current claim done) 2026-09-26 02:46:10 +00:00
weichen 1d82ed8823 merge: candidate sysadmin-maturity-refresh-2026-09-26 into dev 2026-09-26 02:45:12 +00:00
weichen d537778b60 fix(sysadmin): refresh feature maturity catalog to post-rollout wiring facts
The static adapter catalog still read I2-era states (degraded/shadow) after
the 2026-09-26 dev rollout, so the admin features page showed 降级 for flags
already enabled. Update six entries to live+ready with evidence-dated
reasons (I2/I3/P8 acceptance, P8 per-key gates kept visible, shadow
visibility digest now persisted, REPLACE wildcard wiring, PI narrative dev
rollout); keep FAV red lines untouched. Tests updated; FAV now carries the
configured-value-must-not-imply-readiness assertion.
2026-09-26 02:45:05 +00:00
weichen 1d13a892fc merge: candidate degraded-flags-enable-2026-09-26-r4 into dev 2026-09-26 02:39:09 +00:00
weichen 4e7f84111d docs: degraded-flags-enable closeout (task record, dev runtime test report, matrix notes, current claim) 2026-09-26 02:39:05 +00:00
weichen 6b31718138 merge: candidate degraded-flags-enable-2026-09-26-r4 into dev 2026-09-26 02:29:36 +00:00
weichen e9c0281404 feat(ctxmgr): wildcard session allowlist for semantic replace rollout
- SEMANTIC_SUMMARY_REPLACE_SESSIONS supports * (all sessions, present and
  future), mirroring INTENT_PLAN_PROJECT_ALLOWLIST; empty allowlist still
  replaces nothing (fail-closed defense in depth unchanged)
- declare SEMANTIC_SUMMARY_REPLACE(_SESSIONS) in dev/test/main compose app
  env (stale Wave2 "REPLACE unwired" comment fixed); extend A-4 declaration
  test; .env.example key docs updated
- sysadmin feature catalog: SESSIONS description + REPLACE reason note *

Prepares dev degraded-flags enable (task degraded-flags-enable-2026-09-26-r4):
user-authorized all-session replace, plan tier confirm, shadow summary, PI
change-report narrative; env ops and runtime verification follow.
2026-09-26 02:29:29 +00:00
weichen 66ea4e3e51 merge: candidate deploy-record into dev 2026-09-26 02:15:20 +00:00
weichen c9e2263325 docs: record review-fixes deployment verification (dev 1ceda34c live IDOR probe) 2026-09-26 02:15:11 +00:00
weichen 1ceda34c43 merge: candidate integrate-review-fixes (report + P0/P1 fixes) into dev 2026-09-26 02:08:50 +00:00
weichen 467e64574f docs: closeout review report + fix task records for batch integration 2026-09-26 02:07:45 +00:00
weichen 438fdc8686 merge: system code review report into dev
# Conflicts:
#	.doc/ops/CURRENT.md
2026-09-26 02:06:58 +00:00
weichen dfd9c420d3 docs(current): pre-align claim table for review-report merge (docs apply @document) 2026-09-26 02:06:02 +00:00
weichen fb376c0ea0 merge: candidate system-review-p0-p1-fixes into dev 2026-09-26 02:02:42 +00:00
weichen ea66f4456f docs: review P0/P1 fix records, ISSUES ledger, lesson, task claim
- remediation master record for 5 resolved + 1 deferred + 1 open issues
- ISSUES.md rows with evidence dates and lesson links
- LESSON-20260926-failclosed-bypass-contract (validated)
- remediation/lessons INDEX hooks + CURRENT task row (docs apply receipt)
2026-09-26 02:00:24 +00:00
weichen 6a3a0dc201 fix(security): harden bypass authz, gate blind spot, command exec, validated_only (review P0/P1)
- FIND-SEC-01: GetUserContext requires session ownership (handler 403 +
  SQL/memory owner filter); in-memory HTTP + isolated-PG regressions
- FIND-ARCH-01: archtest fails closed on untracked table writes (+noise
  exemption) and registers 50 existing writer tables in table_owners
- FIND-SEC-02: Authorizer without pool denies by default; explicit
  NewInMemoryAuthorizer seam opt-in via ALLOW_IN_MEMORY at composition
- FIND-SEC-03: swboot commands run argv-exec (no sh -c) with exact
  basename allowlist match; prefix-spoof and no-shell-eval tests
- FIND-FLOW-01: confirm rejects validated_only plans; ExecuteClaimed
  hard-refuses validated_only steps (new error codes + HTTP mapping)
- FIND-QUAL-01: intentflow.ValidateFlagConsistency fail-fast at Assemble
2026-09-26 02:00:14 +00:00
weichen b6e382e58f docs(ops): 标记 system-code-review 认领为 done 2026-09-26 01:34:08 +00:00
weichen c7e9ec0a26 docs(audit): 系统全面 code review 报告(仅分析不修复)
记录 tip f4c1b73f 上架构/安全/可维护性/关键路径审查结论;不实施代码修复。
2026-09-26 01:33:41 +00:00
weichen f4c1b73f28 merge: candidate swboot-closeout-2026-09-26-r3 into dev 2026-09-26 01:09:32 +00:00
weichen f697420db8 docs(status): promote workflow-swboot to done — SWBOOT-10 executor + L5/L6 verified 2026-09-26 01:09:20 +00:00
weichen 7c7a08a3ca docs(test): swboot closeout evidence — executor e2e, L5 live PI, L6 playwright wizard 2026-09-26 01:08:51 +00:00
weichen 86e0cf46c6 merge: candidate swboot-closeout-2026-09-26-r2 into dev 2026-09-26 01:00:51 +00:00
weichen a52816299d fix(server): read bound repo from project_source_bindings.source_ref 2026-09-26 01:00:37 +00:00
weichen 70f3028cdb merge: candidate swboot-closeout-2026-09-26-r2 into dev 2026-09-26 00:59:21 +00:00
weichen f394bb15f9 fix(projectworkflow): write repo binding into project_source_bindings.source_ref 2026-09-26 00:59:08 +00:00
weichen 4965e74d66 merge: candidate swboot-closeout-2026-09-26-r2 into dev 2026-09-26 00:57:11 +00:00
weichen 83561682eb feat(swboot): wire SWBOOT-10 controlled patch executor (fail-closed)
DB-backed repo_path_allowlist reader (deny-all until admin seeds), per-prefix
admin test_commands (goose 00075), execution evidence table (goose 00074),
isolated git-worktree patch executor with command allowlist/time/output caps
and failure-stops evidence; controlled_patch creation/preview unlocked only
with an allowlisted repo binding (projectworkflow gate + catalog flag);
creator-only server endpoints for bindings/executions; merge/push/deploy stay
behind a typed separate-authorization boundary. Module boundary: app->swboot
composition import registered.
2026-09-26 00:56:59 +00:00
weichen d0f3f76f7e merge: candidate rdev-p3-rerun-2026-09-26-r4 into dev 2026-09-26 00:43:04 +00:00
weichen 88e9b8bade docs(test): archive P3 rerun console log (rename out of ignored *.log) 2026-09-26 00:43:00 +00:00
weichen 09e4c08f28 merge: candidate rdev-p3-rerun-2026-09-26-r3 into dev 2026-09-26 00:42:20 +00:00
weichen c9d94545f8 docs(status): promote workflow-rdev to done — P3 real-PI rerun all-pass 2026-09-26 00:42:09 +00:00
weichen 68d29ef04e docs(test): rdev P3 real-PI rerun all-pass; register docgov approval-chain issues 2026-09-26 00:41:47 +00:00
weichen 5d5cd5fd6d merge: candidate rdev-p3-rerun-2026-09-26-r3 into dev 2026-09-26 00:25:12 +00:00
weichen dc26321bab fix(docgov): join ambient uow in persistApproveAndFAV to avoid row-lock deadlock
docflow Commands.run takes SELECT ... FOR UPDATE on document_records inside
its unit of work before calling ApproverApprove; persistApproveAndFAV then
opened a second pool connection and its UPDATE blocked on that row lock until
statement timeout (SQLSTATE 57014), failing every final approval. Join the
ambient uow scope (doc sync + FAV staging on the caller tx, commit owned by
the uow); only open an own tx when no scope is present. Regression test
reproduces the production shape (FOR UPDATE + FAV wiring inside Within).
2026-09-26 00:25:01 +00:00
weichen 6bd6e91606 merge: candidate rdev-p3-rerun-2026-09-26-r3 into dev 2026-09-26 00:22:20 +00:00
weichen 043c66ccfb chore(server): log docgov approver decision failures (envelope redacts internals) 2026-09-26 00:22:15 +00:00
weichen 121b33f8ed merge: candidate rdev-p3-rerun-2026-09-26-r2 into dev 2026-09-26 00:16:08 +00:00
weichen bf3136490d fix(docgov): load review_snapshot_id when reading document records from PG
loadDocumentFromDBLocked selected every column except review_snapshot_id,
so any document loaded after a restart or cache miss lost its frozen review
snapshot and ApproverApprove failed with "approved requires frozen
review_snapshot_id". PG regression test seeds a snapshot and asserts a
fresh engine carries the id through load.
2026-09-26 00:15:56 +00:00
weichen a6d25afa27 merge: candidate chat-semantic-replace-2026-09-26 into dev 2026-09-25 23:24:55 +00:00
weichen 53d2731849 docs(status): promote chat-semantic-replace to done — fail-closed gray wiring verified 2026-09-25 23:24:45 +00:00
weichen e2cfd88ac0 docs(test): semantic REPLACE fail-closed gray wiring evidence (unit + dev runtime ladder) 2026-09-25 23:24:33 +00:00
weichen 6004494e21 merge: candidate chat-semantic-replace-2026-09-26 into dev 2026-09-25 23:14:16 +00:00
weichen aee774b894 fix(ctxmgr): keep displaced deterministic narrative for rollback-safe replace
Runtime verification found the deterministic generator merges the prior
served narrative, so a replaced (semantic) narrative would linger after
rollback. Store the displaced deterministic narrative in the shadow report
(persisted via shadow_json) and merge that instead when the prior summary
source is semantic_replace.
2026-09-25 23:14:07 +00:00
weichen cd1f846f49 merge: candidate chat-semantic-replace-2026-09-26 into dev 2026-09-25 22:56:45 +00:00
weichen ffa41d78df feat(ctxmgr): wire fail-closed gray REPLACE for chat semantic narrative
Unseal SEMANTIC_SUMMARY_REPLACE under explicit user authorization with a
defense-in-depth session allowlist (SEMANTIC_SUMMARY_REPLACE_SESSIONS):
swap happens only for allowlisted sessions after result digests and served
watermark validation, bounded narrative size; facts/counts stay deterministic
and the daily digest stays advisory. Master flag alone replaces nothing.
2026-09-25 22:56:36 +00:00
weichen 4d5d695c75 merge: candidate jevdecide-soak-2026-09-26 into dev 2026-09-25 22:51:03 +00:00
weichen cbf96ebbe5 docs(status): promote jevdecide-shadow to done — 200-turn soak converged 2026-09-25 22:50:54 +00:00
weichen 96013db9aa docs(test): jevdecide assist soak >=200 turns with 94% handled rate evidence 2026-09-25 22:50:33 +00:00
weichen c373d6fbc0 merge: candidate dialogue-ctx-closeout-2026-09-26-r4 into dev 2026-09-25 21:43:41 +00:00
weichen 4b231d97ec docs(status): promote dialogue-ctx-injection to done — close conditions verified on dev 2026-09-25 21:43:33 +00:00
weichen 416674e3ec docs(test): dialogue-ctx closeout evidence — dev migration + real PI workspace inject + conflict card smoke 2026-09-25 21:43:02 +00:00
weichen f89b946d37 merge: candidate dialogue-ctx-closeout-2026-09-26-r4 into dev 2026-09-25 21:30:41 +00:00
weichen ae48970f5f fix(pi-runner): allow host-side extension path override for task runs
Task-run pi launches hardcoded the container path /app/extensions/tavily-search.mjs;
on the no-docker host sidecar every squad/dialogue task run failed at spawn with
ENOENT/extension-load errors. Add PI_AGENT_EXTENSION override and export the
managed pi-dir extension path from the sidecar start script.
2026-09-25 21:30:29 +00:00
weichen ebb8282091 merge: candidate dialogue-ctx-closeout-2026-09-26-r2 into dev 2026-09-25 21:03:21 +00:00
weichen 76ddf4dd35 feat(ctx): surface dialogue conflict confirmation cards to triggering user
Capture trigger_user HITL expectations from dialogue adjudication (previously
dropped at the bizdev call site), project them as chat confirmation cards via
taskrun OnTerminal (exactly-once), arm the session PendingExpectation, and
handle confirm_context_fact hits through the supplement-info blackboard path.
Decline (纠正) guides the user to state the correct fact.
2026-09-25 21:01:37 +00:00
weichen f6ad3344f8 merge: candidate worktree-final-closeout-2026-09-26 into dev 2026-09-25 20:34:14 +00:00
weichen e6994e4e4e docs(closeout): 回填运行时验证与清理结果;任务收口 done 2026-09-25 20:34:06 +00:00
weichen 0e4b51c387 merge: record feature/dialogue-office-expansion-2026-09-25 into dev ancestry — 内容已由 dialogue-office-expansion-land 等价落地 dev;记录原分支历史归属 (tree unchanged) 2026-09-25 20:32:49 +00:00
weichen 19700e8590 merge: candidate worktree-final-closeout-2026-09-26 into dev 2026-09-25 20:27:01 +00:00
weichen 743b6a4774 docs(closeout): worktree 全量收口——唯一日志归档、CURRENT 漂移修正与本任务登记 2026-09-25 20:26:50 +00:00
weichen dc10818143 merge: record feature/promote-rc-beta3-c-2026-09-24 into dev ancestry — test 晋升分支:全部提交已保留于本地 test 分支头 0e4b111d(tag rc-v1.1.0-beta.3 历史);不引入 dev 树变化 (tree unchanged) 2026-09-25 20:24:51 +00:00
weichen 2a7a700051 merge: record feature/integrate-gov-visibility-p0-b-2026-09-24 into dev ancestry — 取消的重试候选,被 p0-c 替代,仅含 merge 节点 (tree unchanged) 2026-09-25 20:24:40 +00:00
weichen 5f85f3c5d7 merge: record feature/integrate-backlog-triage-p10-r2-2026-09-25 into dev ancestry — 被 r3 候选替代,仅含 merge 节点 (tree unchanged) 2026-09-25 20:24:33 +00:00
weichen 2d3a7a22f8 merge: record feature/integrate-backlog-triage-p10-2026-09-25 into dev ancestry — 被 r2/r3 候选替代,仅含 merge 节点 (tree unchanged) 2026-09-25 20:24:25 +00:00
weichen 043e10f674 merge: record feature/integrate-admin-settings-maint-b-2026-09-25 into dev ancestry — 内容已由后续候选(r3)等价合入 dev(patch-id 查重 8f9b91d3 = dev 等价提交) (tree unchanged) 2026-09-25 20:24:18 +00:00
weichen 357c869a34 merge: record feature/single-binary-deploy-design-2026-09-24 into dev ancestry — 内容已由 single-binary-design-land 等价落地 dev;记录原分支历史归属 (tree unchanged) 2026-09-25 20:24:06 +00:00
weichen db8585b558 merge: record feature/member-permissions-doc-2026-09-24 into dev ancestry — 内容已由 member-permissions-doc-land 等价落地 dev;记录原分支历史归属 (tree unchanged) 2026-09-25 20:23:58 +00:00
weichen 64a28c9842 merge: record feature/doc-review-lifecycle-2026-09-25 into dev ancestry — 交付内容已由 doc-review-lifecycle-land 等价落地 dev;本归并仅记录原分支历史归属 (tree unchanged) 2026-09-25 20:23:25 +00:00
weichen cc519e3806 merge: candidate single-binary-design-land-2026-09-26 into dev 2026-09-25 20:22:59 +00:00
weichen 6733205d58 docs(design): 非容器化单二进制三环境交付方案(自 single-binary-deploy-design 分支落地;CURRENT 认领行已废弃不入) 2026-09-25 20:22:45 +00:00
weichen 23ee0f028d merge: candidate member-permissions-doc-land-2026-09-26 into dev 2026-09-25 20:22:16 +00:00
weichen 6e76a35943 docs(system-design): 修复 README t20 设计文档迁址后的失效链接(remediation→system-design) 2026-09-25 20:21:43 +00:00
weichen 86881bef6e docs(system-design): 新增项目成员权限总览(对话/任务/补充/文档三权整合)
- 三层正交模型:系统角色能力矩阵 / 项目成员角色 / 文档三权(author-reviewer-approver)
- 四类核心动作权限矩阵:发起对话、执行任务、补充信息、文档编制与修改(deny_only_submit)
- 认证与路由分层、管理台两类 gate、前端 capabilities fail-closed 消费方式
- 如实标注已知缺口:member/viewer 服务端不区分写、visibility 键仅前端消费、system:* 未拆分
- 更新 system-design/README.md 索引与目录清单

task: member-permissions-doc-2026-09-24
2026-09-25 20:20:58 +00:00
weichen 75ff922b6e merge: candidate dialogue-office-expansion-land-2026-09-26 into dev 2026-09-25 20:20:39 +00:00
weichen af327950bd docs(plan): 对话办公能力全景盘点与 P0–P3 整改计划
盘点 32 ActionKey 与 HTTP 169 路由对话边界,明确假成功/dry-run 与 UI 专属红线;分期消除假成功、live 化 intentflow、查询真源与新写意图扩展。
2026-09-25 20:20:25 +00:00
weichen 117ef7d826 merge: candidate doc-review-lifecycle-land-2026-09-26 into dev 2026-09-25 20:17:35 +00:00
weichen 6c815b2958 fix(land): 适配 dev 现行结构 — gov()/authorizer() 访问器、去 app/docnotify stream 依赖(arch 基线)、测试 stub 重名 2026-09-25 20:17:20 +00:00
weichen 05b822d9c0 docs(evidence): doc-review-lifecycle-land re-validation 摘要 2026-09-25 20:17:11 +00:00
weichen 985bc55fa5 docs(matrix): docgov 三权流转落地证据与 U11 live 基线键说明;附 re-validation 证据 2026-09-25 20:16:36 +00:00
weichen b5a782bb38 feat(chat): dialogue triggers for comments/reopen/pending-supplements with mistouch guards
Wire intent→coordinator DocResolver confirm cards→action_executor kinds for comment, reopen, pending-supplements query, and real submit-review execution.
2026-09-25 20:14:10 +00:00
weichen 2e56ba9719 feat(docgov): complete review lifecycle gaps for lock/notify/comment/reopen
Defer locked-period supplements to a pending ledger, route duty-holder
notifications, persist stage-scoped comments, and prefer Approver for reopen.
2026-09-25 20:08:56 +00:00
weichen 6adf694f74 merge: candidate matrix-closeout-r3-2026-09-26 into dev 2026-09-25 19:05:04 +00:00
weichen f0b23d345a docs(matrix): update u9u12 and web-sysadmin row footnotes per P8/P9 evidence
- intent-plan-u9u12: per-key live rollout landed (7 keys to real engines,
  5 per-key flags default off, TierConfirm; dev c5027788); ops-side flag
  enablement + PI evidence follow-up noted
- web-sysadmin: residual closeout complete (ui.* whitelist consumers wired
  to public site-status + banner; Playwright real-run PASS via docker image;
  KB ops deferred out-of-repo with rationale; dev 4bdbb0da)
- rows keep status=done; footnote facts only; docs apply receipts r3
2026-09-25 19:04:34 +00:00
weichen 2391aaa7ec merge: candidate cleanup-audit-r3-2026-09-25 into dev 2026-09-25 18:43:24 +00:00
weichen 8ffb83e373 docs(current): register P11/P12 closeout rows via docs apply receipt 2026-09-25 18:42:36 +00:00
weichen 3f63753b63 docs(ops): P12 redline boundary audit (read-only)
- FAV live off (FAV_DEGRADED_READ unset, default false); no observation window running
- SWBOOT-10 fail-closed confirmed (ERR_EXECUTION_MODE_DISABLED in catalog.go L209);
  L5/L6 authorization application registered as pending-auth
- D7 ADR still pending-compliance-signoff; record retention physical delete blocked
- PI narrative flag PI_CHANGE_REPORT_NARRATIVE off in dev process env; dev-resident
  enablement request registered for user decision (not implemented)
- MULTI_INTENT_PLAN_TIER not full; F4-B/F7-1/I6/I7 untouched
2026-09-25 18:24:52 +00:00
weichen 30957daf40 merge: candidate cleanup-audit-p11-2026-09-25 into dev 2026-09-25 18:14:06 +00:00
weichen 748eb686ae docs(ops): P11 cleanup audit - 19 ready worktrees cleared, blocked classified
- ready batch: worktree remove + branch -d all clean, no force
- blocked split: keep branches with unmerged features (doc-review-lifecycle,
  dialogue-office-expansion, member-permissions-doc, single-binary-design,
  promote/sync test branches); regenerable caches logged; unique logs to
  archive before removal
- CURRENT stale in_progress rows deferred to closeout audit P14
- copy-kb-to-localpg.sh: never existed; migrate_shared_kb.sh already registered
2026-09-25 18:12:54 +00:00
weichen 3cefd5b142 merge: candidate backlog-triage-p10-2026-09-25 into dev 2026-09-25 17:20:39 +00:00
weichen 9ac4e37847 docs(ops): P10 backlog triage record (B5+A5 implement; A6/D5/R1/R4-R7 no-go evidence) 2026-09-25 17:20:22 +00:00
weichen da0fc54f91 merge: candidate backlog-triage-p10-2026-09-25 into dev 2026-09-25 17:17:06 +00:00
weichen 20afeb186b chore: requeue marker after DIRTY_TREE (node_modules symlink removed)
Queue item e1b8dd58 failed on source-tree dirt from a web/node_modules
symlink used for npm test; the symlink is removed and the tree is clean.
Empty commit advances head so the queue accepts a fresh item.
2026-09-25 17:16:36 +00:00
weichen ee852c6600 merge: candidate backlog-triage-p10-2026-09-25 into dev 2026-09-25 17:10:55 +00:00
weichen 53d1be5349 feat(quote,squad): B5 input validation + review invariants; A5 non-critical step degradation
P10 backlog triage (implement B5+A5; A6 already fixed in-tree, D5 keep shared
KB, R1 separate task, R4/R5/R6/R7 no-go with evidence):

- quote: ValidateInput (empty names/hours, negative/NaN/Inf fail-closed);
  reviewSummary invariants (line sums = total; buffer 20%/margin 40%/tax 7%
  rate self-consistency) enforced before Excel write
- squad: StepSpec.Critical *bool (nil=critical default); non-critical step
  failure marks step degraded + gov audit, workflow continues, final status
  degraded with DegradedSteps list; critical failure semantics unchanged
- tests: 5 new cases (quote 3 + squad 2), full short suite green, arch-check pass
2026-09-25 17:10:35 +00:00
weichen 4bdbb0da6f merge: candidate websysadmin-residual-r2-2026-09-25 into dev 2026-09-25 16:35:19 +00:00
weichen 923da11ab4 feat(server): public /maintenance/site-status route + tests; P9 evidence
- isPublicRoute exempts site-status (anonymous banner polling)
- httptest coverage: anonymous 200 + site_notice payload; route table guards
- test report + playwright evidence (docker mcr playwright v1.63 noble vs real dev stack, 1 passed)
2026-09-25 16:33:58 +00:00
weichen 914d0aa39d feat(maintenance): wire sysadmin ui.* whitelist settings to public site status
- sysadmin.Service.GetSettingValue: whitelist read-through (DB > env > default)
- maintenance.Service: SiteSettingsProvider injection; StatusView carries notice/readOnly; new CurrentSiteStatus + GET /api/v1/maintenance/site-status
- composition root wires ui.maintenance_notice / ui.read_only_mode into maintenance site settings
- MaintenanceBanner: persistent notice banner + read-only mode strip
- chore(web): drop dead 'dirty' var in EnvSettingsSection (baseline TS6133 build blocker)
- KB ops actions: deferred out-of-repo (shared infra container side); documented in task record
2026-09-25 16:33:56 +00:00
weichen cc998c05ce merge: candidate dialogue-office-p0-2026-09-25 into dev
Resolve server.go ActionServices wiring on accessor-style Server (Workflow via adaptChatWorkflow).
2026-09-25 15:42:05 +00:00
weichen c5027788ea merge: candidate u9u12-keys-rollout-2026-09-25 into dev 2026-09-25 14:39:51 +00:00
weichen da0186c739 docs(remediation): 将对话办公 P0 验证记录挂入 INDEX 2026-09-25 14:38:06 +00:00
weichen 0ab4a8bd2d feat(server): 接线对话 workflow.run 并补 P0 验证记录
server 侧窄端口适配 projectworkflow,消除 chat→projectworkflow 边界违规;记录单测与 arch-check 证据,PI 全链路待补证。
2026-09-25 14:37:11 +00:00
weichen 9a540fa54a docs(chat): 注明 ActionServices.Workflow 合入接线点
app/server 写路径被并行任务占用,生产接线延后;未接线时诚实失败。
2026-09-25 13:19:52 +00:00
weichen ce694baef1 feat(coordinator): P0 消除对话主链路假成功
claim/submit 经 DocResolver+确认卡后 PendingAction 真写 docgov;proposal 默认分支改澄清;workflow.switch 诚实拒绝(UI专属);workflow.run 确认后走 CreateWorkflowRun(ActionServices.Workflow 由合入时接线)。
2026-09-25 13:19:36 +00:00
weichen 09ffe7dea8 docs(plan): 对话办公能力全景盘点与 P0–P3 整改计划
盘点 32 ActionKey 与 HTTP 169 路由对话边界,明确假成功/dry-run 与 UI 专属红线;分期消除假成功、live 化 intentflow、查询真源与新写意图扩展。
2026-09-25 11:15:44 +00:00
weichen 09fe972366 feat(chat): dialogue triggers for comments/reopen/pending-supplements with mistouch guards
Wire intent→coordinator DocResolver confirm cards→action_executor kinds for comment, reopen, pending-supplements query, and real submit-review execution.
2026-09-25 00:36:26 +00:00
weichen 8f9b91d3b3 docs(test): note queue retry after DIRTY_TREE clear 2026-09-24 23:24:15 +00:00
weichen 129736f281 merge: candidate admin-settings-maint-b-2026-09-25 into dev 2026-09-24 23:22:21 +00:00
weichen 986d78cc91 feat(docgov): complete review lifecycle gaps for lock/notify/comment/reopen
Defer locked-period supplements to a pending ledger, route duty-holder
notifications, persist stage-scoped comments, and prefer Approver for reopen.
2026-09-24 23:06:23 +00:00
weichen 588fef1c4a docs(ops): 收口单二进制设计任务状态与提交 SHA 2026-09-24 14:45:46 +00:00
weichen d784daf884 docs(ops): CURRENT 认领 member-permissions-doc-2026-09-24 行
task: member-permissions-doc-2026-09-24
2026-09-24 14:45:21 +00:00
weichen 7ebf431c87 docs(design): 非容器化单二进制三环境交付方案
覆盖 dev managed / test 落地 / main attach,PI sidecar 外置;设计评审用,未实施。
2026-09-24 14:45:06 +00:00
weichen e2a442b592 docs(system-design): 新增项目成员权限总览(对话/任务/补充/文档三权整合)
- 三层正交模型:系统角色能力矩阵 / 项目成员角色 / 文档三权(author-reviewer-approver)
- 四类核心动作权限矩阵:发起对话、执行任务、补充信息、文档编制与修改(deny_only_submit)
- 认证与路由分层、管理台两类 gate、前端 capabilities fail-closed 消费方式
- 如实标注已知缺口:member/viewer 服务端不区分写、visibility 键仅前端消费、system:* 未拆分
- 更新 system-design/README.md 索引与目录清单

task: member-permissions-doc-2026-09-24
2026-09-24 14:43:00 +00:00
weichen 06757ff31f merge: candidate governance-visibility-p0 into dev 2026-09-24 13:27:09 +00:00
weichen 0e4b111dff release-candidate: 汇集 local_dev 至 test,准备长期实测 [Tag: rc-v1.1.0-beta.3]
CI / go-vet-and-short-test (push) Failing after 1s
CI / backup-restore-drill (push) Failing after 0s
CI / web (push) Failing after 0s
2026-09-24 04:37:51 +00:00
WeiCHEN 9984c68d37 merge: promote local_dev to test (squad settled-no-deliverable retry)
CI / go-vet-and-short-test (push) Failing after 0s
CI / backup-restore-drill (push) Failing after 0s
CI / web (push) Failing after 0s
2026-09-23 19:20:05 +08:00
WeiCHEN c6f0561b5b merge: promote local_dev to test (dialogue realtime search force)
CI / go-vet-and-short-test (push) Failing after 0s
CI / backup-restore-drill (push) Failing after 0s
CI / web (push) Failing after 0s
2026-09-23 14:55:16 +08:00
WeiCHEN 19b91ae14f merge: promote local_dev to test (task-bubble-bind assistant_msg_id + error actions) 2026-09-23 11:57:11 +08:00
WeiCHEN 44bed71ccd merge: promote local,dev to test (dialogue current-time anchor) 2026-09-23 11:00:21 +08:00
367 changed files with 25289 additions and 839 deletions
@@ -0,0 +1,208 @@
---
title: "对话办公能力全景盘点"
created: 2026-09-25
owner: Cursor
task_id: dialogue-office-expansion-2026-09-25
policy_revision: cursor-governance-2026-09-24-r1 @ 44161d2ad2d7aada3e9ff88127b52148543278e5
review_state: pending
integration_state: pending
deployment: not_required
cleanup: pending
remote_sync: not_requested
status: done
confidence: high
---
# 调研:对话办公能力全景盘点
## 范围与授权
- **用户目标**:以「对话辅助办公」为初衷,最大限度扩展对话可操作范围;**创建项目、添加成员、设置等治理结构操作保持 UI 专属**。
- **本轮交付**:研究报告 + 分期整改计划(文档落盘);P0–P3 **实施另起任务**。
- **允许写路径**:`.doc/audit`、`.doc/remediation`。
- **基线 SHA**:`44161d2ad2d7aada3e9ff88127b52148543278e5`(建场时 local `dev`)。
- **非目标**:不改产品代码、不更新 CURRENT/FEATURE-MATRIX/gap-matrix、不部署。
- **整改方案**:[2026-09-25-dialogue-office-expansion-plan.md](../remediation/2026-09-25-dialogue-office-expansion-plan.md)
## 结论
1. 注册表共 **32** 个 ActionKey(非早期估计的 34);主链路与 intentflow 计划执行面 **双轨脱节**:计划层 U11/U12 已把部分键 live 化,单意图协调层仍对认领/送审/工作流触发等返回「假成功」话术。
2. HTTP **169** 条路由可按对话边界分为:可操作候选 **A=46**、只读查询 **B=66**、UI 专属写/管理台 **C=44**、平台基线 **13**。
3. 消除假成功、打通 dry-run、接真实查询源、再扩新写意图,应按 P0→P3 分期;一律复用 doc-review 四道防线(识别分流 → 话语分类 → 角色×状态出卡 → 执行二次鉴权),两步确认 + 服务端权威校验。
## 证据
| 项 | 路径/命令 | 结果 |
|----|-----------|------|
| ActionKey SSOT | `internal/intent/registry.go` `registerBuiltinActions` L145–187 | **32** 键 |
| 主链 docgov | `internal/coordinator/engine_docgov.go` | claim/submit 假成功;approve/reject 有 PendingAction |
| 主链 workflow | `internal/coordinator/engine_workflow.go` | switch 确认闭环断裂;trigger 引导 UI |
| intentflow dry-run | `internal/app/intentflow/expansion.go` L195–216 | docgov 5 dry-run + run-control 2 dry-run |
| HTTP 路由 | `rg 'mux\.HandleFunc\("' internal/server/server.go internal/server/document_revision_handlers.go` | **169** |
| 样板 | doc-review-lifecycle `09fe9723`;`card_policy.go` / `recognizer_matchers_docgov.go` / `action_executor.go` | 四道防线可复用 |
## 1. 意图执行矩阵(32 ActionKey)
**执行类别说明**
| 类别 | 含义 |
|------|------|
| `real-exec` | 协调层或 PendingAction 已调用领域服务真写 |
| `pending-action` / `confirm-card+pending` | 出确认卡或挂起期望,确认后 `action_executor` 真写 |
| `query-direct` | 只读查询,直接回复(可能含硬编码兜底) |
| `prose-only` | 仅自然语言,无业务副作用(或明确拒绝) |
| `假成功` | StatusAccepted/成功话术,但未调用权威写服务 |
| `dry-run` | intentflow Owner 返回 `validated_only` receipt,无副作用 |
| ActionKey | 中文 | 主链类别 | 计划链(intentflow) | 主处理 | 后端 owner |
|-----------|------|----------|----------------------|--------|------------|
| `project.advisory` | 进展/风险查询 | query-direct | QueryOwner | `engine_query.go:handleQueryProgress` | 协调层/LLM |
| `project.fact.supplement` | 补充项目事实 | real-exec | Mutate(flag 下 dry→live) | `engine_stage.go:handleSupplementInfo` | ctxmgr / MutateOwner |
| `project.stage.advance` | 推进阶段 | real-exec / 无 runner 时 prose 模拟 | — | `engine_stage.go:handleAdvanceStage` | stageflow |
| `task.run` | 触发生成任务 | real-exec | TaskRunAdapter | `engine_task.go:handleTriggerTask` | stageflow / taskrun |
| `task.run.adhoc` | 特设任务 | real-exec | — | `engine_task.go:handleTriggerAdhocTask` | 同上 |
| `conversation.chat` | 闲聊 | prose-only | — | `engine_consult.go:handleCasualChat` | dialogue LLM |
| `conversation.decline` | 暂缓建议 | prose-only | — | `engine_stage.go:handleDeclineExpectation` | 上下文 |
| `document.claim` | 认领文档 | **假成功** | live(U11) | `engine_docgov.go:250–277` | 主链仅改 Claimed 列表;计划→docgov |
| `document.review.submit` | 提交审核 | **假成功** | live(U11) | `engine_docgov.go:280–295` | 主链纯文案;计划→`SubmitForReview` |
| `document.review.approve` | 审核通过 | pending-action | **dry-run** | `engine_docgov.go:handleDocGovApprove` | `docgov.ReviewApprove` |
| `document.review.reject` | 审核驳回 | confirm-card+pending | **dry-run** | `engine_docgov.go:handleDocGovReject` | `docgov.ReviewReject` |
| `document.final.approve` | 终审批准 | confirm-card+pending | **dry-run** | 同上 Approve 分支 | `docgov.ApproverApprove` |
| `document.final.reject` | 终审驳回 | confirm-card+pending | **dry-run** | 同 reject | 同上 |
| `document.proposal.decide` | 提案裁决 | confirm 分支真挂起 / **默认分支假成功** | **dry-run** | `engine_docgov.go:298+` | confirm_*→PendingAction |
| `regulation.query` | 法规查询 | query-direct | QueryOwner | `engine_query.go:handleQueryRegulations` | kb.Client + 模板兜底 |
| `case.query` | 相似案例 | query-direct | QueryOwner | `engine_query.go:handleQuerySimilarCases` | SearchSimilarCases + **硬编码案例** |
| `permission.query` | 权责查询 | query-direct | — | `engine_query.go:handleQueryUserRights` | UserDocs 上下文 |
| `document.reject_reason.query` | 驳回原因 | query-direct | — | `engine_query.go:handleQueryRejectReason` | 黑板 + default 文案 |
| `card.confirm` | 确认挂起期望 | confirm 元动作 | — | expectation 映射 | 路由至目标 intent |
| `project.stage.execute` | 阶段执行确认 | 注册有、switch **无独立 case** | — | 实际走 advance | 同 advance |
| `security.forbidden` | 安全禁止 | prose-only | RejectPlan | `engine_consult.go` | — |
| `workflow.switch` | 切换激活工作流 | **假成功(确认后无执行)** | **dry-run** | `engine_workflow.go:12–59` | **边界上属结构治理 → 宜诚实拒绝/引导 UI** |
| `workflow.run` | 运行工作流 | **假成功(引导 UI)** | live(U12) | `engine_workflow.go:62–90` | 计划→`CreateWorkflowRun` |
| `workflow.status.query` | 工作流状态 | query-direct | — | `engine_workflow.go:93` | UserProjectContext |
| `document.status.query` | 文档状态 | query-direct(常空模板) | — | `engine_workflow.go:117` | 模板/document_summary |
| `conversation.help` | 能力帮助 | query-direct | — | `engine_workflow.go:139` | AvailableActions |
| `conversation.unsupported` | 不支持 | prose-only | — | `engine_workflow.go:159` | — |
| `run.status.query` | 运行状态 | query-direct | — | `engine_run.go:handleRunStatusQuery` | WorkDir |
| `run.resume` | 续跑 | confirm-card+pending | live(U12) | `engine_run.go:handleRunResume` | taskrun |
| `run.restart` | 重启 | confirm-card+pending | **dry-run** | `engine_run.go:handleRunRestart` | taskrun.restart |
| `project.impact.analyze` | 影响分析 | query-direct | — | `impact_actions.go` | ImpactActions |
| `project.doc.revise_propose` | 修订提案 | confirm-card+pending | — | `impact_actions.go` | ProposeRevision |
### 1.1 假成功清单(主链路优先)
| # | Legacy / Key | 文件:行号 | 当前行为 | P0 建议 |
|---|--------------|-----------|----------|---------|
| 1 | `DOCGOV_CLAIM` / `document.claim` | `engine_docgov.go:250–277` | 仅 append `UserDocs.Claimed`,回复「已成功认领」,不调 docgov | 真执行 `RecordDocumentViewed`/claim API + 确认(若需) |
| 2 | `DOCGOV_SUBMIT_REVIEW` / `document.review.submit` | `engine_docgov.go:280–295` | 纯成功文案,无状态变更 | 真执行 `Gov.SubmitForReview` + 角色门禁 |
| 3 | `DOCGOV_PROPOSAL_DECIDE` 默认分支 | `engine_docgov.go:383–397` | 非 confirm_* 时按 proposal_action 返回采纳/拒绝文案,不写文档 | 默认分支诚实澄清或走确认卡;禁止假成功 |
| 4 | `SWITCH_WORKFLOW` / `workflow.switch` | `engine_workflow.go:12–59` | 设 NextExpectation 要求确认,**确认后无写路径** | **诚实拒绝**:属 UI 专属(`PUT …/active-workflow`);或确认后明确「请在设置面板操作」 |
| 5 | `TRIGGER_WORKFLOW` / `workflow.run` | `engine_workflow.go:62–90` | 「请在面板确认」话术,不创建 run | 确认卡 + `CreateWorkflowRun`(对齐 U12) |
附带(非计划 P0 五处,但同类):无 runner 时 `ADVANCE_STAGE`/`TRIGGER_TASK` 模拟成功;`VIEW_DOC` lifecycle 空模板。
### 1.2 intentflow 仍 dry-run 的键
**DocGov**(`docGovActionKeys` 7 − `DocGovLiveActionKeys` 2 = **5**):
- `document.review.approve`
- `document.review.reject`
- `document.final.approve`
- `document.final.reject`
- `document.proposal.decide`
**Run-control**(4 − live `workflow.run`/`run.resume` = **2**):
- `workflow.switch`(计划层 dry-run;产品边界建议永久不 live 写,改为拒绝)
- `run.restart`
见 `internal/app/intentflow/expansion.go` L195–216;dry-run 行为 `DryRunAdapter.Execute` → `validated_only`。
## 2. HTTP 169 路由 × 对话边界
**统计口径**:`internal/server/server.go` `Routes()` + `document_revision_handlers.go` `registerDocumentRevisionRoutes()` 中 `mux.HandleFunc("METHOD path")` = **169**。不含中间件 OPTIONS、SPA 静态子路径。
| 类别 | 计数 | 含义 |
|------|-----:|------|
| **A 对话可操作候选** | 46 | 读写副作用;对话须两步确认后经服务层落库 |
| **B 只读查询候选** | 66 | GET + preview POST |
| **C UI 专属** | 44 | 治理结构写 + admin 全域(含管理台只读) |
| 平台基线 | 13 | health/ready、认证、SPA、`/me` 自服务 |
| **合计** | **169** | |
### 2.1 A — 对话可操作候选(46)
| 模块 | n | 代表路径 | 对话意图现状 |
|------|--:|----------|--------------|
| docgov | 11 | `POST …/docgov/{claim,submit-review,review-decision,approver-decision,proposal,proposal/decide,comments,content,lease/*}` | 批准/驳回已打通;claim/submit 主链假成功;comments 等偏 UI |
| docrevision | 2 | `PATCH …/documents/{id}/content` · `POST …/agent-candidates/{id}/decision` | 正文 PATCH 仅 HTTP;候选决策可对话扩展 |
| trace | 6 | `POST …/trace/{index,analyze}` · `…/edges/{id}/decision` · `…/reopen` · `…/recheck/…/clear` | 影响分析意图有;**边裁决/重开仅 HTTP** |
| 补充批次 | 1 | `POST …/supplement-impacts/{batch_id}/decision` | 补充意图有;批次确认可对话化 |
| 工作流运行(非结构) | 2 | `POST …/workflows/{key}/run` · `…/stages/{stage}/advance` | run 主链假成功;advance 有意图 |
| 任务执行 | 6 | `POST …/tasks/{run,run/stream,runs}` · `…/{cancel,resume}` | 触发/续跑已打通 |
| 对话写 | 8 | `POST …/chat*` | 会话基础设施 |
| 意图计划 | 1 | `POST …/intent-plans/{id}/decisions` | intentflow + HTTP 双通道 |
| 自由文档 | 6 | `POST/PUT/DELETE …/freeform-documents*` | **仅 HTTP** → P3 候选 |
| 资产 | 2 | `POST …/assets` · `…/reparse` | **仅 HTTP** → P3 |
| 通知 | 1 | `PATCH …/notifications/{id}` | **仅 HTTP** → P3 |
| 用户偏好 | 1 | `PUT …/context/user/preference` | 低优先级 |
### 2.2 B — 只读查询候选(66)
项目/工作流/成员/设置 **GET**、termination/activation **preview**、chat 历史检索、docgov audit/comments GET、修订 ledger GET、资产 raw、通知列表、context/cases 等。
对话已覆盖:进展、文档/工作流/运行态、驳回原因、法规/案例/权限(案例与进展有硬编码兜底)。
仍偏 HTTP:职责现状、修订版本/diff、trace 图、终止预览、成员列表只读(允许对话只读引导,禁止代写)。
### 2.3 C — UI 专属红线(44,对话永久禁写)
| 模块 | 写操作(禁入) |
|------|----------------|
| 项目/成员 | `POST /projects` · `POST|PUT|DELETE …/members` |
| 职责 | `PATCH …/doc-tasks/{taskKey}/duties` |
| 工作流结构/生命周期 | `PUT …/workflow-plan` · `PUT …/active-workflow` · `POST …/workflow-instances/activate` · `POST …/terminate` |
| Admin | 角色/用户/密码/工作流定义 publish·retire/模板/config/system settings/maintenance/workspaces cleanup |
对话侧应对命中措辞走 `security.forbidden` / `conversation.unsupported`,**仅允许只读查询与引导**(如读职责现状、`termination-preview`)。
> **澄清**:`workflow.switch`(改 active-workflow)落入 C;`workflow.run`(创建运行实例)落入 A。P0 对前者诚实拒绝,对后者真执行。
## 3. 查询硬编码兜底
| 场景 | 位置 | 问题 |
|------|------|------|
| 相似案例 | `engine_query.go:420–426` | 无数据时硬编码 PRJ-2025-008 / PRJ-2024-019 |
| 驳回原因 | `engine_query.go:260–276` + `card_policy.go:defaultRejectReasonText` | 黑板/事件捞取失败则默认文案 |
| 法规 | `engine_query.go:382–388` | KB 空则 GB/YY 模板 |
| 进展简报 | `engine_query.go:83–164` | 默认项目名与长硬编码段落 |
| 文档状态 | `engine_workflow.go:126–129` | lifecycle 空 → 引导面板 |
## 4. 复用样板:doc-review 四道防线
参考合入/分支证据:`feature/doc-review-lifecycle-2026-09-25` @ `09fe9723`(批注/重开/积压/送审真执行)。
| 防线 | 符号 | 要点 |
|------|------|------|
| ① 识别分流 | `recognizer_matchers_docgov.go:matchDocGovAction` | 查询语气不误路由写动作 |
| ② 话语分类 | `card_policy.go:ClassifyRejectUtterance`(Web 对称) | QUERY / EXECUTE / OTHER |
| ③ 角色×状态出卡 | `ResolveRejectCard` / `buildRejectConfirmCard` | 无权限不出危险按钮 |
| ④ 执行二次鉴权 | `handleDocGovReject/Approve` + `chat/action_executor.go` | 确认后调 `GovernanceEngine` |
后续写意图扩展必须复制该模式,禁止「话术成功、服务未写」。
## 5. 开放问题
- `project.stage.execute` 注册未接线:是否删除或显式映射到 advance(实施期决定)。
- 自由文档/通知/资产对话化的产品优先级与确认文案(P3 开工前再确认)。
- `workflow.switch` 是否保留意图仅作「引导 UI」还是识别层直接 `unsupported`(推荐后者,减少假确认)。
## 建议动作
见整改计划 P0–P3;本调研 **status=done** 仅表示盘点可审,**不代表问题已修复**。
## 状态与交接
- 产物:本文 + [整改计划](../remediation/2026-09-25-dialogue-office-expansion-plan.md)
- 实施:另起 `feature/dialogue-office-p0-…` 等任务;每期独立验证与验收
- CURRENT / MATRIX / gap-matrix:本轮不动
- catalog:`feature=dialogue-office`,scope `.doc/audit`+`.doc/remediation`;与 `docgov` feature claim 硬冲突,故未占用 `docgov` 键
+267
View File
@@ -0,0 +1,267 @@
---
title: "系统全面 Code Review(local_dev tip)"
status: done
created: 2026-09-26
owner: Cursor
task_id: "system-code-review-2026-09-26"
policy_revision: "agent-governance-2026-09-21-r1 + cursor-governance-2026-09-24-r1 @ f4c1b73f28580ad3df6db4f9ec0a80057006e516"
review_state: accepted
integration_state: integrated
deployment: not_required
cleanup: done
remote_sync: not_requested
updated: 2026-09-26
severity: high
---
# 系统全面 Code Review(local_dev tip)
## 范围与授权
- **用户目标**:对系统做一次全面 code review,并按规范形成报告;**不允许实施修复**,只形成报告。
- **被审对象**:本地 `dev` tip `f4c1b73f28580ad3df6db4f9ec0a80057006e516`(merge: swboot-closeout-2026-09-26-r3);运行态参考 no-docker local_dev(`bin/agent-server`,schema 75),本报告以代码与门禁证据为主。
- **允许写路径**:`.doc/`(本审计主文档、INDEX、short-term 任务记录)。
- **交付终点**:可审审计报告 + 索引挂接;不改业务代码、不改 gap-matrix / FEATURE-MATRIX 状态值、不部署。
- **非目标**:逐文件全量行审、依赖 CVE 扫描、前端 XSS 系统化、动态渗透、实施整改。
- **方法**:并行四轴审查(架构边界 / 安全 / 可维护性 / 关键执行路径)+ 本机 `./scripts/arch-check.sh --mode block`、规模盘点与关键片段复核。
## 问题登记与经验检索
- **issue_id**:本轮不新建 ISSUES 行;发现项以本报告 FIND-* 编号跟踪。若后续授权修复,再按 [闭环规范](../ops/2026-09-23-issue-learning-workflow.md) 升 issue。
- **检索词**:`IDOR`、`GetUserContext`、`session_id`、`validated_only`、`fencing`、`arch-check`、`table_owners`、`ALLOW_IN_MEMORY`、`sh -c`、`swboot`。
- **命中**:历史审计见 [INDEX](./INDEX.md)(模块耦合 2026-09-20、对话办公盘点 2026-09-25、gap-matrix);经验库无与本轮 FIND-SEC-01 完全同题的已关闭 lesson。**采纳检查**:对照模块开发规范 §2/§4、authz fail-closed 惯例、intentflow 注释契约。
## 总判(Verdict)
`arch-check --mode block` **PASS**,且多项生产门禁(任务路径 stub 拒绝、FAV outbox consumer 多层禁用、docgov 角色不信任 body)仍然有效。但系统存在三类结构性风险:
1. **安全旁路**:会话上下文 IDOR(已证实);Authorizer 无池 fail-open;swboot `sh -c` + 前缀白名单。
2. **门禁空心化**:未登记表的 SQL 写被 arch-check **静默跳过**;server 仍持 `Runtime.Pool` 并直查/直写。
3. **多入口编排**:docgov / 多意图 / flag 面平行三套,关闭开关时存在静默降级。
本轮 **不改变** gap-matrix 的 `production_ready` 叙事;下列 critical/high 建议作为独立 remediation 候选,待授权后再立项。
## 现象
只读审查与门禁核验,无用户报障个案。审查期望:合入 swboot / dialogue-ctx / jevdecide / semantic-replace 后的 tip 在模块边界、鉴权与关键执行路径上仍满足生效规范。实际:门禁绿,但多处规范语义与实现分叉(见 Findings)。
## Findings(按严重度)
置信度说明:`verified` = 父会话已打开源码复核;`agent` = 子代理报告、抽样一致;`inferred` = 机制推断未跑动态用例。
### Critical
#### FIND-SEC-01 — 会话消息 IDOR(`session_id` 无归属校验)
| 项 | 内容 |
|---|---|
| 类别 | 授权 / IDOR |
| 位置 | `internal/server/handlers_context.go:17-50`;`internal/ctxmgr/manager.go:377-385` |
| 证据 | `handleGetUserContext` 仅校验 `user_id` 为本用户/管理员;`GetUserContext` 对 `chat_messages` 使用 `WHERE session_id = $1` **无 owner 条件**。对照 `chatflow` 读路径会校验会话归属。 |
| 影响 | 已登录用户若获知他人 `session_id`,可读取对方最近聊天正文。 |
| 置信度 | verified · high |
| 修复方向(不实施) | 复用 chatflow 会话授权;或按 `session.owner_id`/`user_id` 过滤后再返回。 |
#### FIND-ARCH-01 — arch-check 对未登记表静默跳过(表唯一写者门禁盲区)
| 项 | 内容 |
|---|---|
| 类别 | 门禁 / 模块边界 |
| 位置 | `internal/archtest/scan.go:198-205`;`module-boundaries.yaml` `table_owners`(约 59 表) |
| 证据 | `if !tracked { continue }`;本机 tip:`swboot_controlled_executions` / `projects` / `project_source_bindings` / `outbox_events` **UNTRACKED**;`arch-check --mode block` 仍 PASS。 |
| 影响 | 新表(含 swboot)可任意包写入而不触发 block;「表唯一写者」对未入库表无强制力。 |
| 置信度 | verified · high |
| 修复方向 | 未登记表的生产写应变 fail-closed,或强制登记。 |
#### FIND-ARCH-02 — server 持 Pool 直装 swboot 并 SQL 旁路
| 项 | 内容 |
|---|---|
| 类别 | 组合根越界 |
| 位置 | `internal/server/swboot_handlers.go`(NewPGRepoAllowlist / ControlledPatchExecutor / 直查 bindings & executions) |
| 证据 | 与模块规范 §2.1「server 只拿用例或端口」冲突;`app.Build` 已另有 allowlist 装配。 |
| 影响 | HTTP 层成为第二组合根;边界回归。 |
| 置信度 | agent · high(与规范条文一致) |
| 修复方向 | 收成 app 用例端口;禁止 handler 使用 `rt.Pool`。 |
### High
#### FIND-SEC-02 — Authorizer 无池时成员判定 fail-open
| 项 | 内容 |
|---|---|
| 类别 | 鉴权 fail-open |
| 位置 | `internal/authz/authorizer.go:112-114`、`205-207` |
| 证据 | `!a.enabled()`(pool==nil)时 `IsProjectMember`/`IsProjectOwner` 对 `userID>0` 返回 true;组合根始终 `NewAuthorizer(pool)`,nil pool 时 `authorizer()!=nil`,绕过「nil → failClosed」分支。 |
| 影响 | AllowInMemory / 无库误配时,任意登录用户可访任意 `project_id`。生产有 `ALLOW_IN_MEMORY` 门禁则触发面缩小,**机制本身仍 fail-open**。 |
| 置信度 | verified · high |
#### FIND-SEC-03 — swboot 受控执行:`sh -c` + basename 前缀白名单
| 项 | 内容 |
|---|---|
| 类别 | 命令注入面 / 边界语义 |
| 位置 | `internal/swboot/executor.go`(`sh -c`、前缀匹配);`ApproveMerge` 恒拒 |
| 证据 | 允许判定为字段首段 basename 前缀;命令经 shell 执行。执行器自身不做 merge/push,但若 admin allowlist 含 `git`/`bash` 等,客户端可间接 push/merge/deploy。 |
| 影响 | 在 creator + 宽松 allowlist 前提下,隔离 worktree 内可越出「测试命令」意图。 |
| 置信度 | agent · high |
| 说明 | 与 MATRIX「永不 merge/push/deploy」在「执行器 API」语义下仍成立;真正边界在 **admin 命令白名单粒度**。 |
#### FIND-FLOW-01 — intentflow `validated_only`/`proposed` 可经 confirm 进入 dispatch
| 项 | 内容 |
|---|---|
| 类别 | 执行模式门禁 |
| 位置 | `internal/app/intentflow/plans.go:365-376`;`intent_plan_handlers.go:86-88`;`ExecuteClaimed` 不读 `ExecutionMode` |
| 证据 | `DecisionConfirm` **允许** `PlanProposed`;确认后 HTTP 调用 `DispatchEligible`;`AllowedModes` 策略字段几乎未被执行路径使用。 |
| 影响 | shadow「安全」依赖「无人 Confirm」,而非执行器硬拒绝;U10/U11 live 已接线时可升级为真实写。 |
| 置信度 | verified · high(静态);未做动态 confirm 用例 |
#### FIND-QUAL-01 — docgov / 多意图多入口并行(职责扩散)
| 项 | 内容 |
|---|---|
| 类别 | 可维护性 / 双写路径 |
| 位置 | chat `docgov.*` PendingAction;`app/docgov_owner.go` `document.*`;`server/handlers_docgov.go`;intent vs intentflow 双套 flags |
| 证据 | 同一 `GovernanceEngine` 三入口;`intent.FeatureFlags` 与 `intentflow.FeatureFlags` 并存;Coordinator ~40 intent case + intentflow OwnerMux 平行。 |
| 影响 | 鉴权/确认/审计易漂移;回归矩阵笛卡尔积;开关关闭时 Mux→Query 静默降级(FIND-FLOW-02)。 |
| 置信度 | agent · high |
#### FIND-ARCH-03 — bizdev / Runtime / 万能 Engine 门面残留
| 项 | 内容 |
|---|---|
| 类别 | 架构债 |
| 位置 | `internal/bizdev/service.go`;`internal/app/app.go` Runtime;`docgov`/`coordinator` Engine |
| 证据 | bizdev 自开池并装配多引擎;Runtime 暴露 Pool+数十服务;Engine 方法面极大。arch-check allowlist 放行上帝包,PASS ≠ 模块化健康。 |
| 影响 | 新功能默认堆 handler/Runtime;与解耦批次目标持续摩擦。 |
| 置信度 | agent · high |
### Medium
| ID | 摘要 | 关键位置 | 置信度 |
|---|---|---|---|
| FIND-SEC-04 | 授权拒绝 404/403 区分,泄露资源存在性 | `task_run_auth.go`、`auth_helpers.go` | agent |
| FIND-SEC-05 | Chat SSE:阶段拒绝在 Flush 之后;`user_role` 可写入会话上下文 | `sse.go` | agent |
| FIND-SEC-06 | 对话 `agent.NewBackend` 对未知名默认 stub;生产密钥校验不禁 stub | `agent/backend.go`、`config.go` | agent |
| FIND-SEC-07 | 未认证 `/api/v1/vault/status` 暴露 FAV 开关 | `auth_middleware.go`、`vault.go` | agent |
| FIND-SEC-08 | 会话 token 存 `localStorage`(XSS 放大) | `web/src/api/auth.ts` | agent |
| FIND-DOC-01 | docgov 省略 fencing token 仍可写;heartbeat persist / squad reclaim fail-open | `docgov/lease.go` | agent |
| FIND-DOC-02 | `CommitAgentVersion` 与 edit lease 解耦竞态面 | `docrevision/service_agent.go` | agent |
| FIND-FLOW-02 | `OwnerMux` 在 U10/U11/U12 关闭时静默降级到 Query | `intentflow/mux.go` | agent |
| FIND-ARCH-04 | notification handler 端口失败后回落 Pool SQL | `notification_handlers.go` | agent |
| FIND-ARCH-05 | 提案批准后 handler 裸 goroutine 副作用 | `handlers_docgov.go` | agent |
| FIND-ARCH-06 | 错误信封拼接 `err.Error()` | 多 handler | agent |
| FIND-QUAL-02 | 全局 flag/metrics 损害并行测试隔离 | `intent/flags.go`、`intentflow/*` | agent |
| FIND-QUAL-03 | 巨石文件逼近/超过规范阈值(见规模盘点) | squad/taskrun/server/web | verified |
### Low / 契约说明
| ID | 摘要 |
|---|---|
| FIND-JEV-01 | jevdecide assist 失败为 **fail-open 回规则**(不编造);若产品要求「jev 挂则拒答」则不满足——属契约澄清,非实现疏忽。 |
| FIND-DOC-03 | summarizer 注释仍写「REPLACE 不接线」,与已合入 `applySemanticReplace` 矛盾。 |
| FIND-EVT-01 | 事件 payload 密钥过滤面窄于 taskrun `StripSecrets`(子串级)。 |
## 同类问题与影响范围
| 关联场景 | 共用机制 | 检查与证据 | 判定 |
|---|---|---|---|
| chatflow 读会话 | 会话 owner 校验 | chatlog Adapter authorize | 主路径健全;**旁路** `GetUserContext` 缺校验 |
| 任务 SSE 鉴权 | Flush 前 RequireProjectAccess | gap-matrix AUTH-TASK-SSE PASS | 项目门健全;阶段拒绝在流后属中危差异 |
| FAV outbox | Enabled:false + Register/Claim 硬拒 | registry/dispatcher/eventsconsumer | **未见旁路打开** |
| swboot ApproveMerge | 恒拒 | repo_allowlist | 自身 API 健全;命令白名单是真边界 |
| 生产 ALLOW_IN_MEMORY | validateProductionSecrets | config.go | 非空 Env 的 prod 有防护;空 Env+内存组合仍危险 |
**未覆盖(明确边界)**:govulncheck/npm audit;MinerU/Embedding SSRF 动态验证;FAV degraded 跨项目读 E2E;Markdown XSS 系统化;全量 `BeginTx` 持锁外呼追踪。
## 方案与验收(仅建议,本轮不实施)
### 建议优先级
1. **P0**:FIND-SEC-01(IDOR)— 补会话归属;加回归(他用户 session_id → 403/空)。
2. **P0**:FIND-ARCH-01 — arch-check 未登记表 fail-closed;补登记 swboot/projects 等属主。
3. **P1**:FIND-SEC-02 — Authorizer `!enabled()` 改 fail-closed 或与 `failClosedAuthz` 对齐。
4. **P1**:FIND-SEC-03 / FIND-FLOW-01 — argv 化命令 + 收紧白名单;Confirm 拒绝 `validated_only`/`proposed` 或执行器硬读 mode。
5. **P2**:收敛 docgov/多意图单一写路径与单一 flag 面;收回 server Pool。
### 验收提示(未来修复任务)
按 [验证契约](../ops/2026-09-21-validation-contract.md)「问题修复的回归范围」:原例 + 同类旁路 + 正常授权路径;工程侧补 `archtest` 用例证明未登记表 block。
## 严重度
报告整体:`high`(存在已证实 IDOR + 门禁盲区;未做动态利用)。
## 关联整改
- 既有: [模块解耦分批](../remediation/2026-09-20-module-decoupling-batch-plan.md)、[对话办公扩展](../remediation/2026-09-25-dialogue-office-expansion-plan.md)、[gap-matrix](../remediation/gap-matrix.md)
- **本轮未新建 remediation 文件**(用户禁止实施;方案仅建议)。授权后建议拆:`remediation/2026-09-26-system-code-review-followups.md`。
## 证据
### 门禁与规模(本机)
```text
被审 SHA: f4c1b73f28580ad3df6db4f9ec0a80057006e516
arch-check --mode block → production gate passed
tracked table_owners ≈ 59;swboot_controlled_executions/projects/project_source_bindings/outbox_events = UNTRACKED
Go 生产文件 LOC 前列(非测试):
cmd/bizdev-cli/main.go 1017
internal/squad/workflow.go 963
internal/server/task_run_handlers.go 858
internal/taskrun/manager.go 813
…
Web:
web/src/App.tsx 1748
web/src/engine/docxRenderer.ts 1263
…
```
### 子代理
| 轴 | 类型 | 用途 |
|---|---|---|
| 架构边界 | architecture-critic | 模块规范对抗审 |
| 安全 | security-auditor | OWASP 向只读审(无 PoC) |
| 可维护性 | thermo-nuclear-code-quality-review | 上帝对象/双路径/开关丛林 |
| 关键路径 | code-explorer | intentflow/docgov/swboot/FAV/jev |
### 运行态(旁证,非本报告验收对象)
此前会话:no-docker `bin/agent-server` `vcs.revision` = tip;`/api/v1/health`+`/ready` ok,schema 75。
## 开放问题
1. FIND-FLOW-01:产品是否故意允许对 shadow `proposed` 计划一键 Confirm 升 live?若否,属缺陷;若是,应改文档/MATRIX 与执行器注释。
2. FIND-JEV-01:assist「失败 fail-closed」的产品定义是否等于「回退规则」?
3. 是否授权将 FIND-SEC-01/ARCH-01 升 ISSUES 并开 remediation?
## 修复经过与经验
- **本轮未实施任何代码修复**(用户硬约束)。
- 不新增 lesson:发现尚未经验证修复闭环。
- 复发提醒:旁路 HTTP(绕过 chatflow/Owner)是鉴权回归的高发点。
## 状态与交接
| 字段 | 值 |
|---|---|
| 任务状态 | `done`(研究产物可审) |
| review_state | pending(待人工审阅报告) |
| integration_state | pending(报告合入 local_dev 另走 integrate) |
| deployment | not_required |
| cleanup | pending |
| remote_sync | not_requested |
| 剩余工作 | 授权后开 P0 修复任务;本 worktree 合入/清理由独立维护者执行 |
| 禁止续作 | 在本任务下直接改业务代码冒充「顺便修」 |
## Positive observations
1. `arch-check` 对**已登记** import/sql/path/event 仍 enforced。
2. FAV outbox consumer `Enabled:false` 多层硬拒,未见旁路打开。
3. 任务 SSE 项目鉴权在 Flush 前;docgov 角色取 principal 不信任 body。
4. 语义摘要 shadow:lease 提交后再 Summarize,符合持锁不做外部 IO。
5. swboot/jevdecide 领域包 import allowlist 自身较窄;污染主要在接线层。
+16
View File
@@ -13,6 +13,22 @@
## 核心文档(按阅读顺序推荐)
### 系统全面 Code Review(2026-09-26)
**文件**: [2026-09-26-system-code-review.md](./2026-09-26-system-code-review.md)
**结论**: tip `f4c1b73f` 上 `arch-check --mode block` PASS,但存在已证实会话上下文 IDOR、arch-check 未登记表静默跳过、Authorizer 无池 fail-open、swboot `sh -c` 前缀白名单、intentflow `proposed` 可 Confirm 升 dispatch 等 critical/high 项;FAV outbox 禁用路径未见旁路。**本轮不实施修复**。
**任务**: [short-term](../ops/short-term/2026-09-26-system-code-review.md) · mutex `docs-audit-review`
### 对话办公能力全景盘点(2026-09-25)
**文件**: [2026-09-25-dialogue-office-capability-research.md](./2026-09-25-dialogue-office-capability-research.md)
**结论**: 32 ActionKey 双轨脱节(主链假成功 vs intentflow 部分 live);HTTP 169 = A46/B66/C44+基线13;治理结构写永久 UI 专属。整改见 P0–P3 计划。
**整改**: [对话办公扩展计划](../remediation/2026-09-25-dialogue-office-expansion-plan.md) · task `dialogue-office-expansion-2026-09-25`
### 模块化重构方案审核检查清单(2026-09-23)
**文件**: [2026-09-23-modular-refactor-plan-review-checklist.md](./2026-09-23-modular-refactor-plan-review-checklist.md)
+15 -1
View File
@@ -2,10 +2,11 @@
维护规则:[问题记录与开发经验闭环](../ops/2026-09-23-issue-learning-workflow.md)。每个问题一个稳定 ID;主记录是事实与状态来源,本表为可检索投影。新发现及时登记,修复后保留记录;发布 blocker 仍见 [gap-matrix](../remediation/gap-matrix.md)。
更新:2026-09-24。Cursor 治理层:测试规则漂移/MCP 路径改为 verifying;新登记 hook 事件契约 issue;历史 resolved 不表示本日产品回归通过。
更新:2026-09-27。上传链路:登记并修复上传文档跨端不可访问(占位模板退化 + 元数据/正文不落服务端,fixing 待 dev 集成)。2026-09-26。docgov 批准链:登记并修复 review_snapshot_id 装载缺失与 uow 行锁自死锁(resolved);memDocs 持久化失败缓存投毒(investigating)。历史 resolved 不表示本日产品回归通过。系统 code review P0/P1 批次修复落账(5 resolved + 1 deferred + 1 open,主记录见 [整改文档](2026-09-26-system-code-review-fixes.md),来源 [审计](2026-09-26-system-code-review.md))。
| issue_id | 模块 / 检索词 | 问题 | 严重度 | issue_state | owner | 证据日期 / 范围 | 唯一主记录 | 经验 |
|---|---|---|---|---|---|---|---|---|
| ISSUE-20260927-upload-doc-cross-device | freedoc / upload / freeform / fileMeta / 占位模板 / 跨端 | 上传文档源文件元数据与正文不落服务端:换浏览器/清存储/共享他人查看时退化为注册占位模板,文本类连二进制都未存(伴生 <512B 显示 "0 KB") | high | resolved | pi | 2026-09-27;dev `86efba2c` 合入并在 dev 环境验证:FS-UPLOAD-01/02 真实浏览器 PASS(跨上下文可见真实正文),DB 核验元数据+asset 落库;存量无元数据旧文档不可恢复(重新上传即可) | [主记录](../ops/short-term/2026-09-27-upload-doc-access.md) | [LESSON-20260927-server-facts-and-iso-db-recipe](../ops/lessons/2026-09-27-server-facts-and-iso-db-recipe.md) |
| ISSUE-20260923-nullable-duty | docgov / nullable / 23503 / reviewer_id | 可选职责空值写 0 导致 FK 失败 | high | resolved | Codex(历史补录) | 2026-09-17;历史 PG / API 冒烟;当前未复测 | [主记录](2026-09-23-historical-issue-records.md#nullable-duty) | [LESSON-20260923-nullable-duty](../ops/lessons/2026-09-23-nullable-duty.md) |
| ISSUE-20260923-content-hash | docrevision / canonicalize / hard-break / 404 | 规范化破坏 Markdown 语义并造成正文哈希漂移 | critical | resolved | Codex(历史补录) | 2026-09-14;历史真实 UI / 重启;当前未复测 | [主记录](2026-09-23-historical-issue-records.md#content-hash) | [LESSON-20260923-content-hash](../ops/lessons/2026-09-23-content-hash.md) |
| ISSUE-20260923-coordination-authority | agentctl / claim / SQLite / CAS / CURRENT / FEATURE-MATRIX | 本地副本 CAS 与任务许可不能表达跨主机全局权威认领 | high | investigating | Codex(研究) | 2026-09-23;源码/只读状态,未复现具体丢写 | [主记录](../ops/short-term/2026-09-23-coordination-db-daemon-research.md#issue-20260923-coordination-authority) | 沿用 content-hash 投影经验;跨机结论待实施验证 |
@@ -18,3 +19,16 @@
| ISSUE-20260924-cursor-cli-mcp-path | Cursor CLI / MCP / workspaceFolder / NDJSON | agentctl/jev MCP 加载失败(路径 + Content-Length 回包) | medium | verifying | Cursor | 2026-09-24;相对路径+NDJSON 已修;待 IDE 重载后 list-tools 实机 | [主记录](2026-09-24-pi-executor-boundaries.md#cursor-cli-mcp-path) | [LESSON-20260924-cursor-hook-advisory-gates](../ops/lessons/2026-09-24-cursor-hook-advisory-gates.md) |
| ISSUE-20260924-cursor-hook-event-contract | Cursor / hooks / beforeMCPExecution / probe | hook 事件 stdin 字段名与 matcher 官方未文档化 | medium | verifying | Cursor | 2026-09-24;IDE postToolUse tool_name=`MCP:pi_subagent_roles` 已采样;beforeMCP 全量 stdin 仍缺 | [主记录](2026-09-24-cursor-hook-event-contract.md) | [LESSON-20260924-cursor-hook-advisory-gates](../ops/lessons/2026-09-24-cursor-hook-advisory-gates.md) |
| ISSUE-20260924-non-author-400-duty | iam-authz / docgov / duty / 400 / 非编制 | 权限不足误报 400;run/edit 与编制职责绑死导致成员无法上传总结写草稿 | high | resolved | Cursor | 2026-09-24;真实 PI `TestNonAuthorMember_PiAgent_RunEditSubmitGates` PASS | [主记录](2026-09-24-non-author-member-access.md) | [LESSON-20260924-deny-only-submit](../ops/lessons/2026-09-24-deny-only-submit.md) |
| ISSUE-20260926-docgov-snapshot-load | docgov / loadDocumentFromDBLocked / review_snapshot_id / 跨重启批准 | 文档装载 SELECT 漏 review_snapshot_id,重启/缓存未命中后最终批准必失败 | high | resolved | pi | 2026-09-26;隔离库 PG 回归 + dev 真实批准 200/state=approved(dev `121b33f8`) | [主记录](../test-reports/2026-09-26-rdev-p3-rerun-test-report.md#5-2) | 待补 LESSON |
| ISSUE-20260926-docgov-uow-deadlock | docgov / persistApproveAndFAV / uow / FOR UPDATE / 57014 | docflow uow 行锁后 FAV 持久化自开第二连接更新同行,语句超时致死锁,所有最终批准失败 | critical | resolved | pi | 2026-09-26;生产形状 PG 回归(FOR UPDATE+FAV+Within)+ dev 真实批准转 200(dev `5d5cd5fd`) | [主记录](../test-reports/2026-09-26-rdev-p3-rerun-test-report.md#5-2) | 待补 LESSON |
| ISSUE-20260926-docgov-memdocs-poison | docgov / memDocs / 状态机 / 持久化失败 / 缓存投毒 | 状态机先改内存后落库;持久化失败不复原,memDocs 缓存与 DB 永久分叉并掩盖真实错误(表现为「approved 状态」误报) | high | investigating | pi | 2026-09-26;dev 两次复现(快照/死锁两根因均被投毒掩盖);修复方向:失败时回滚内存快照或失效缓存条目 | [主记录](../test-reports/2026-09-26-rdev-p3-rerun-test-report.md#5-2) | 待补 LESSON |
| ISSUE-20260926-ctx-idor | ctxmgr / GetUserContext / session_id / IDOR / handlers_context | GetUserContext 按 session_id 取消息无归属校验,登录用户可读他人会话正文(已证实) | critical | resolved | pi | 2026-09-26;handler 403 + SQL/内存双防线;内存 HTTP 与隔离 PG 回归 PASS | [主记录](../remediation/2026-09-26-system-code-review-fixes.md#1-find-sec-01-会话上下文-idorissue-20260926-ctx-idor) | [LESSON-20260926-failclosed-bypass-contract](../ops/lessons/2026-09-26-failclosed-bypass-contract.md) |
| ISSUE-20260926-archcheck-untracked | archtest / table_owners / untracked / sql_write / 门禁盲区 | arch-check 对未登记表 SQL 写静默跳过,含 swboot_controlled_executions 等 ~50 表;门禁形同关闭 | critical | resolved | pi | 2026-09-26;未登记表 fail-closed + 补登 50 表 + 噪音豁免清单;arch-check block PASS | [主记录](../remediation/2026-09-26-system-code-review-fixes.md#2-find-arch-01-arch-check-未登记表静默跳过issue-20260926-archcheck-untracked) | [LESSON-20260926-failclosed-bypass-contract](../ops/lessons/2026-09-26-failclosed-bypass-contract.md) |
| ISSUE-20260926-authz-failopen | authz / IsProjectMember / pool==nil / fail-open / NewInMemoryAuthorizer | Authorizer 无池时 IsProjectMember/IsProjectOwner 对任意登录用户返回 true,误配即全量放行 | high | resolved | pi | 2026-09-26;无池严格拒绝 + 显式内存授权接缝 + 组合根按 AllowInMemory 选择;隔离 PG authz 套件 PASS | [主记录](../remediation/2026-09-26-system-code-review-fixes.md#3-find-sec-02-authorizer-无池-fail-openissue-20260926-authz-failopen) | [LESSON-20260926-failclosed-bypass-contract](../ops/lessons/2026-09-26-failclosed-bypass-contract.md) |
| ISSUE-20260926-swboot-shell-prefix | swboot / executor / sh -c / 命令注入 / 前缀白名单 / commandAllowed | 受控命令经 sh -c 执行且白名单前缀匹配(go 放行 go-evil);元字符可求值 | high | resolved | pi | 2026-09-26;argv 化 + basename 精确匹配;前缀伪装/不求值回归 PASS | [主记录](../remediation/2026-09-26-system-code-review-fixes.md#4-find-sec-03-swboot-sh--c--前缀白名单issue-20260926-swboot-shell-prefix) | [LESSON-20260926-failclosed-bypass-contract](../ops/lessons/2026-09-26-failclosed-bypass-contract.md) |
| ISSUE-20260926-intentflow-validated-confirm | intentflow / DecisionConfirm / PlanProposed / validated_only / ExecuteClaimed | validated_only(shadow)计划可经 Confirm 进入 executing 并真实执行;执行器不读 ExecutionMode | high | resolved | pi | 2026-09-26;Confirm 拒 + 执行器硬拒双层 + 错误码/HTTP 映射;确认/派发双回归 PASS | [主记录](../remediation/2026-09-26-system-code-review-fixes.md#5-find-flow-01-validated_only-可-confirm-后-dispatchissue-20260926-intentflow-validated-confirm) | [LESSON-20260926-failclosed-bypass-contract](../ops/lessons/2026-09-26-failclosed-bypass-contract.md) |
| ISSUE-20260926-dual-flags-drift | intent / intentflow / FeatureFlags / PlanTier / MULTI_INTENT_ENABLED / 静默漂移 | 双套 flags 可配置出「intentflow 升档但 intent 关闭」的矛盾组合并静默降级 | high | resolved | pi | 2026-09-26;组合根经 intentflow.ValidateFlagConsistency 启动期 fail-fast + 单测;入口收敛残差另立 deferred | [主记录](../remediation/2026-09-26-system-code-review-fixes.md#6-find-qual-01-双套-flags-静默漂移issue-20260926-dual-flags-drift含残差) | [LESSON-20260926-failclosed-bypass-contract](../ops/lessons/2026-09-26-failclosed-bypass-contract.md) |
| ISSUE-20260926-governance-multi-entry | docgov / 多意图 / 多入口 / Coordinator / OwnerMux / GovernanceEngine | docgov 三入口 + Coordinator ~40 case 与 intentflow OwnerMux 平行,鉴权/确认/审计易漂移 | high | deferred | pi | 2026-09-26;flag 漂移面已修(dual-flags-drift);入口合并是多日级重构,需独立任务授权与回归矩阵 | [主记录](../remediation/2026-09-26-system-code-review-fixes.md#6-find-qual-01-双套-flags-静默漂移issue-20260926-dual-flags-drift含残差) | 沿用 failclosed-bypass-contract |
| ISSUE-20260926-server-pool-wiring | server / swboot_handlers / Runtime.Pool / 组合根越界 / FIND-ARCH-02 | server 持 Pool 直装 swboot repo/executor 并直查表,成为第二组合根(本轮未授权修复) | critical | open | pi | 2026-09-26;代码审证据齐(审计 FIND-ARCH-02),待修复授权 | [主记录](../audit/2026-09-26-system-code-review.md) | 待修复后补 |
| ISSUE-20260927-demo-fallback | web / App.tsx / sess-001 / projectId fallback / demo seeds 关闭 | demo seeds 关闭模式下前端硬编码 fallback(激活 sess-001、项目 1)对真实后端发假请求,新登录用户首屏 9 个 404/403(chat 窗口被迫回退本地缓存) | medium | resolved | pi | 2026-09-27;dev 真实浏览器修复前后对照(author+member 双账号:9 假请求→0) | [主记录](../ops/short-term/2026-09-27-frontend-demo-fallback.md) | [经验小结](../ops/short-term/2026-09-27-frontend-demo-fallback.md#经验小结)(独立 lesson 待后续任务补登) |
| ISSUE-20260927-active-session-residue | web / storage.ts / loadActiveSessionId / localStorage 残留 / sess-001 / demo-seed-purge 写回窗口 | 旧前端把 demo fallback 值写回 localStorage active_session;一次性 purge 已执行不再清,读取侧无 legacy 校验,老浏览器 + 无可见会话账号首屏 4×chat 404(ISSUE-20260927-demo-fallback 修复残留路径) | medium | resolved | pi | 2026-09-27;dev 主入口 :3100 复验 admin+残留 sess-001:phantom=0/4xx5xx=0,key 被清除(dev `36c5fb54`) | [主记录](../ops/short-term/2026-09-27-frontend-demo-fallback-localstorage-residue.md) | [经验小结](../ops/short-term/2026-09-27-frontend-demo-fallback-localstorage-residue.md#经验小结补充-issue-20260927-经验) |
+20 -4
View File
@@ -18,12 +18,28 @@
| owner | task | branch | worktree | mutex | status |
|---|---|---|---|---|---|
| pi | upload-doc-access-2026-09-27 | fix/upload-doc-access-2026-09-27 | .worktrees/upload-doc-access-2026-09-27 | freedoc+web-upload | done |
| pi | frontend-demo-fallback-2026-09-27-r3c | fix/frontend-demo-fallback-2026-09-27-r3 | (已清理) | web-chat-fallback | done |
| pi | frontend-demo-fallback-2026-09-27-r2 | fix/frontend-demo-fallback-2026-09-27 | (已清理) | web-chat-fallback | done |
| Cursor | full-system-browser-e2e-2026-09-26 | feature/full-system-browser-e2e-2026-09-26 | .worktrees/full-system-browser-e2e-2026-09-26 | env:dev+docs-test-report | done |
| pi | sysadmin-maturity-refresh-2026-09-26 | feature/sysadmin-maturity-refresh-2026-09-26 | .worktrees/sysadmin-maturity-refresh-2026-09-26 | sysadmin-maturity | done |
| pi | degraded-flags-enable-2026-09-26-r4 | feature/degraded-flags-enable-2026-09-26 | .worktrees/degraded-flags-enable-2026-09-26 | summary-flags-rollout | done |
| pi | system-review-p0-p1-fixes-2026-09-26 | fix/system-review-p0-p1-fixes-2026-09-26 | .worktrees/system-review-p0-p1-fixes-2026-09-26 | review-fixes-batch | done |
| Cursor | system-code-review-2026-09-26 | feature/system-code-review-2026-09-26 | .worktrees/system-code-review-2026-09-26 | docs-audit-review | done |
| pi | swboot-closeout-2026-09-26-r3 | feature/swboot-closeout-2026-09-26 | .worktrees/swboot-closeout-2026-09-26 | workflow-design | done |
| pi | swboot-closeout-2026-09-26-r2 | feature/swboot-closeout-2026-09-26 | .worktrees/swboot-closeout-2026-09-26 | workflow-design | in_progress |
| pi | chat-semantic-replace-2026-09-26 | feature/chat-semantic-replace-2026-09-26 | .worktrees/chat-semantic-replace-2026-09-26 | chat | done |
| pi | jevdecide-soak-2026-09-26 | feature/jevdecide-soak-2026-09-26 | .worktrees/jevdecide-soak-2026-09-26 | jevdecide | done |
| pi | dialogue-ctx-closeout-2026-09-26-r4 | feature/dialogue-ctx-closeout-2026-09-26 | .worktrees/dialogue-ctx-closeout-2026-09-26 | dialogue-ctx | done |
| pi | dialogue-ctx-closeout-2026-09-26-r2 | feature/dialogue-ctx-closeout-2026-09-26 | .worktrees/dialogue-ctx-closeout-2026-09-26 | dialogue-ctx | in_progress |
| pi | worktree-final-closeout-2026-09-26 | feature/worktree-final-closeout-2026-09-26 | (已清理) | git:dev+docs | done |
| cursor-auto | cleanup-audit-r3-2026-09-25 | feature/cleanup-audit-p11-2026-09-25 | .worktrees/cleanup-audit-p11-2026-09-25 | docs-cleanup-audit | done |
| Cursor | admin-settings-maint-b-2026-09-25 | feature/admin-env-settings-maintenance-2026-09-25 | .worktrees/admin-env-settings-maintenance-2026-09-25 | admin-settings-maintenance | done |
| Cursor | dm-migration-2026-09-24-r2 | feature/dm-migration-2026-09-24 | .worktrees/dm-migration-2026-09-24 | dm-migration | done |
| Cursor | governance-console-p1-impl-2026-09-24 | feature/governance-console-p1-impl-2026-09-24 | .worktrees/governance-console-p1-impl-2026-09-24 | agentctl-console | done |
| Cursor | governance-console-p1-design-2026-09-24 | feature/governance-console-p1-design-2026-09-24 | .worktrees/governance-console-p1-design-2026-09-24 | agentctl-console-design | done |
| Cursor | governance-visibility-p0-2026-09-24 | feature/governance-visibility-p0-2026-09-24 | .worktrees/governance-visibility-p0-2026-09-24 | agentctl-visibility | done |
| Cursor | worktree-cleanup-closeout-2026-09-24 | feature/worktree-cleanup-closeout-2026-09-24 | .worktrees/worktree-cleanup-closeout-2026-09-24 | worktree-cleanup | in_progress |
| Cursor | worktree-cleanup-closeout-2026-09-24 | feature/worktree-cleanup-closeout-2026-09-24 | (已清理) | worktree-cleanup | done |
| Cursor | non-author-closeout-2026-09-24 | feature/non-author-closeout-2026-09-24 | .worktrees/non-author-closeout-2026-09-24 | docs+git:dev | done |
| Cursor | integrate-non-author-docs-2026-09-24 | feature/integrate-non-author-docs-2026-09-24 | .worktrees/integrate-non-author-docs-2026-09-24 | git:dev | done |
| Cursor | non-author-member-access-docs-2026-09-24 | feature/non-author-member-access-2026-09-24 | .worktrees/non-author-member-access-2026-09-24 | docs+matrix | done |
@@ -59,8 +75,8 @@
| Cursor | integrate-pi-narrative-docs-2026-09-23 | feature/integrate-pi-narrative-docs-2026-09-23 | .worktrees/integrate-pi-narrative-final-closeout-b-2026-09-23 | git:dev | done |
| Cursor | pi-narrative-final-closeout-b-2026-09-23 | feature/pi-narrative-final-closeout-b-2026-09-23 | .worktrees/pi-narrative-final-closeout-2026-09-23 | docgov | done |
| Cursor | chat-semantic-d3-matrix-land-2026-09-23 | feature/chat-semantic-d3-matrix-land-2026-09-23 | .worktrees/chat-semantic-d3-matrix-land-2026-09-23 | chat | done |
| Cursor | intent-plan-i2-rollout-b-2026-09-24 | feature/intent-plan-i2-rollout-2026-09-24 | .worktrees/intent-plan-i2-rollout-2026-09-24 | intent-plan | in_progress |
| Cursor | intent-plan-i2-impl-2026-09-24 | feature/intent-plan-i2-shadow-allowlist-2026-09-24 | .worktrees/intent-plan-i2-shadow-allowlist-2026-09-24 | intent-plan | in_progress |
| Cursor | intent-plan-i2-rollout-b-2026-09-24 | feature/intent-plan-i2-rollout-2026-09-24 | (已清理) | intent-plan | done |
| Cursor | intent-plan-i2-impl-2026-09-24 | feature/intent-plan-i2-shadow-allowlist-2026-09-24 | (已清理) | intent-plan | done |
| Cursor | closeout-claim-removed-2026-09-23 | feature/closeout-claim-removed-2026-09-23 | (removed) | git:dev+worktree-cleanup | done |
| Cursor | module-batches-ag-status-fix-2026-09-23 | feature/module-batches-ag-status-fix-2026-09-23 | .worktrees/module-batches-ag-status-fix-2026-09-23 | module-decoupling-spec | done |
| Cursor | fav-constraint-current-2026-09-23 | feature/fav-constraint-current-2026-09-23 | (removed) | git:dev+docs | done |
@@ -112,7 +128,7 @@
| Cursor | 2026-09-21-dev-multiuser-four-issues | fix/dev-multiuser-four-issues-2026-09-21 | .worktrees/fix-dev-multiuser-four-issues | projectinstance+docgov | done |
| Codex | 2026-09-17-initial-load-performance-plan | feature/initial-load-performance-plan | .worktrees/feature-initial-load-performance-plan | loading-performance-audit | done |
| Cline | 2026-09-16-partial-deferred-completion | docs/partial-deferred-completion-plan | - | architecture-docs | in_progress |
| Cursor | dialogue-context-injection-2026-09-25 | feature/dialogue-context-injection-2026-09-25 | /home/weichen/projects/Agent-System/.worktrees/dialogue-context-injection-2026-09-25 | dialogue-ctx | in_progress |
| Cursor | dialogue-context-injection-2026-09-25 | feature/dialogue-context-injection-2026-09-25 | (已清理) | dialogue-ctx | done |
| Cursor | dialogue-context-injection-2026-09-25-r2 | feature/dialogue-context-injection-2026-09-25 | .worktrees/dialogue-context-injection-2026-09-25 | dialogue-ctx | done |
## 清理接管与遗留现场
@@ -0,0 +1,53 @@
=== RUN TestPlanProposal_SecurityRejectsWhole
2026/09/25 12:51:24 INFO intent_recognition intent=SECURITY_FORBIDDEN branch=NEW_INTENT_PREEMPT confidence=1
--- PASS: TestPlanProposal_SecurityRejectsWhole (0.00s)
=== RUN TestIntentRecognition_SecurityForbidden
2026/09/25 12:51:24 INFO intent_recognition intent=SECURITY_FORBIDDEN branch=NEW_INTENT_PREEMPT confidence=1
--- PASS: TestIntentRecognition_SecurityForbidden (0.00s)
=== RUN TestIntentRecognition_SecurityFalsePositives_NotBlocked
=== RUN TestIntentRecognition_SecurityFalsePositives_NotBlocked/合规手册撰写含整改角色字段
2026/09/25 12:51:24 INFO intent_recognition intent=CASUAL_CHAT branch=AMBIGUOUS_FALLBACK confidence=0.2
=== RUN TestIntentRecognition_SecurityFalsePositives_NotBlocked/整改+角色远距共现
2026/09/25 12:51:24 INFO intent_recognition intent=CASUAL_CHAT branch=AMBIGUOUS_FALLBACK confidence=0.2
=== RUN TestIntentRecognition_SecurityFalsePositives_NotBlocked/改一下文档+角色跨句
2026/09/25 12:51:24 INFO intent_recognition intent=CASUAL_CHAT branch=AMBIGUOUS_FALLBACK confidence=0.2
=== RUN TestIntentRecognition_SecurityFalsePositives_NotBlocked/换一份清单+姓名字段
2026/09/25 12:51:24 INFO intent_recognition intent=CASUAL_CHAT branch=AMBIGUOUS_FALLBACK confidence=0.2
=== RUN TestIntentRecognition_SecurityFalsePositives_NotBlocked/系统配置说明文档撰写
2026/09/25 12:51:24 INFO intent_recognition intent=CASUAL_CHAT branch=AMBIGUOUS_FALLBACK confidence=0.2
=== RUN TestIntentRecognition_SecurityFalsePositives_NotBlocked/知识库连接故障排查询问
2026/09/25 12:51:24 INFO intent_recognition intent=CASUAL_CHAT branch=NEW_INTENT_PREEMPT confidence=0.7
--- PASS: TestIntentRecognition_SecurityFalsePositives_NotBlocked (0.00s)
--- PASS: TestIntentRecognition_SecurityFalsePositives_NotBlocked/合规手册撰写含整改角色字段 (0.00s)
--- PASS: TestIntentRecognition_SecurityFalsePositives_NotBlocked/整改+角色远距共现 (0.00s)
--- PASS: TestIntentRecognition_SecurityFalsePositives_NotBlocked/改一下文档+角色跨句 (0.00s)
--- PASS: TestIntentRecognition_SecurityFalsePositives_NotBlocked/换一份清单+姓名字段 (0.00s)
--- PASS: TestIntentRecognition_SecurityFalsePositives_NotBlocked/系统配置说明文档撰写 (0.00s)
--- PASS: TestIntentRecognition_SecurityFalsePositives_NotBlocked/知识库连接故障排查询问 (0.00s)
=== RUN TestIntentRecognition_SecurityForbidden_Extended
=== RUN TestIntentRecognition_SecurityForbidden_Extended/姓名修改
2026/09/25 12:51:24 INFO intent_recognition intent=SECURITY_FORBIDDEN branch=NEW_INTENT_PREEMPT confidence=1
=== RUN TestIntentRecognition_SecurityForbidden_Extended/部门修改
2026/09/25 12:51:24 INFO intent_recognition intent=SECURITY_FORBIDDEN branch=NEW_INTENT_PREEMPT confidence=1
=== RUN TestIntentRecognition_SecurityForbidden_Extended/资质修改
2026/09/25 12:51:24 INFO intent_recognition intent=SECURITY_FORBIDDEN branch=NEW_INTENT_PREEMPT confidence=1
=== RUN TestIntentRecognition_SecurityForbidden_Extended/向量库连接修改
2026/09/25 12:51:24 INFO intent_recognition intent=SECURITY_FORBIDDEN branch=NEW_INTENT_PREEMPT confidence=1
=== RUN TestIntentRecognition_SecurityForbidden_Extended/网关密钥修改
2026/09/25 12:51:24 INFO intent_recognition intent=SECURITY_FORBIDDEN branch=NEW_INTENT_PREEMPT confidence=1
=== RUN TestIntentRecognition_SecurityForbidden_Extended/知识库连接修改
2026/09/25 12:51:24 INFO intent_recognition intent=SECURITY_FORBIDDEN branch=NEW_INTENT_PREEMPT confidence=1
--- PASS: TestIntentRecognition_SecurityForbidden_Extended (0.00s)
--- PASS: TestIntentRecognition_SecurityForbidden_Extended/姓名修改 (0.00s)
--- PASS: TestIntentRecognition_SecurityForbidden_Extended/部门修改 (0.00s)
--- PASS: TestIntentRecognition_SecurityForbidden_Extended/资质修改 (0.00s)
--- PASS: TestIntentRecognition_SecurityForbidden_Extended/向量库连接修改 (0.00s)
--- PASS: TestIntentRecognition_SecurityForbidden_Extended/网关密钥修改 (0.00s)
--- PASS: TestIntentRecognition_SecurityForbidden_Extended/知识库连接修改 (0.00s)
PASS
ok chat-agent-system/internal/intent 0.007s
=== RUN TestCoordinatorEngine_SecurityForbidden
2026/09/25 12:51:24 INFO coordinator_route intent=SECURITY_FORBIDDEN branch="" confidence=0 channel=TEMPLATE reason=查询/治理/补充类意图,走规则模板与知识库直答
--- PASS: TestCoordinatorEngine_SecurityForbidden (0.00s)
PASS
ok chat-agent-system/internal/coordinator 0.004s
@@ -0,0 +1,56 @@
---
lesson_id: LESSON-20260926-failclosed-bypass-contract
lesson_state: validated
created: 2026-09-26
updated: 2026-09-26
source_issues:
- ISSUE-20260926-ctx-idor
- ISSUE-20260926-archcheck-untracked
- ISSUE-20260926-authz-failopen
- ISSUE-20260926-swboot-shell-prefix
- ISSUE-20260926-intentflow-validated-confirm
reviewed_by: pi
last_reviewed: 2026-09-26
reviewed_revision: "fix/system-review-p0-p1-fixes-2026-09-26"
keywords: [IDOR, 旁路, fail-open, fail-closed, 白名单前缀, sh -c, validated_only, table_owners, untracked, session_id, 归属校验]
---
# 旁路入口与「未知即拒绝」契约
## 触发条件
- 新增/评审任何**绕过主用例路径**的 HTTP handler(尤其按 `session_id`/`project_id`/`user_id` 直接取资源的旁路端点)。
- 写门禁扫描器、授权器或执行器时出现「未登记/未配置/依赖缺失」分支。
- 注释或文档声称某 flag/mode 是安全边界(如 `validated_only must never be written as succeeded`)。
- 命令/路径白名单实现(前缀匹配、`sh -c` 拼接)。
## 机制与应做检查
1. **主路径绿 ≠ 旁路绿**:主路径(chatflow/Owner 等)的鉴权不会自动覆盖旁路 handler。每个按标识取资源的入口都要复用同一归属校验(如 `GetSessionOwnerID`),并在 SQL/存储层再加归属条件作防御纵深——handler 层校验可能被未来调用方遗漏。
2. **门禁对「未知」必须拒绝**:扫描器遇到未登记对象 `continue` 等于该维度门禁关闭(arch-check 未登记表曾静默跳过 ~50 张表的真实写)。正确形状:未登记→finding,假阳性用显式且可审计的豁免清单。
3. **授权器缺依赖时不得放行**:`pool==nil` 返回 true 是 fail-open;需要演示/测试宽松语义时,用**显式命名的构造器**(`NewInMemoryAuthorizer`)+ 组合根按配置选择,默认路径严格拒绝。
4. **契约写在注释里不算数**:`validated_only` 之类执行模式必须由执行器硬读硬拒(Confirm 拒 + ExecuteClaimed 拒双层),安全不能依赖「没人点 Confirm」或上游状态机不犯错。
5. **白名单用精确匹配 + argv 执行**:basename 前缀匹配可被 `go-evil` 伪装;`sh -c` 让元字符求值。argv 化后元字符只是字面参数。
## 错误做法与原因
- 只给主路径补鉴权、把旁路留给「下次」——本仓 IDOR 事故高发位正是旁路 HTTP。
- 用「未配置就放行」降低接线摩擦——组合根永远能构造成功,fail-open 在误配时静默生效。
- 用测试 override `NewAuthorizer(nil)` 当「跳过检查」接缝——它同时是生产 fail-open 的机制本身;接缝必须显式命名。
## 验证方法
- 回归覆盖:原例(他户标识→403/空)、同类变体(不存在→同构拒绝、admin 越权面)、正常行为(本人→200 且数据完整)。
- 门禁类:自测夹具证明未登记对象 block、已知假阳性不误报;全仓门禁在登记完成后 PASS。
- 执行类:伪装命令拒绝、元字符不求值(marker 文件不产生)、owner 零调用计数。
## 适用边界
- 适用于进程内授权、静态扫描门禁、命令白名单、执行模式契约四类机制;不覆盖网络层/跨服务鉴权。
- 豁免清单(如扫描噪音词)是启发式产物:新假阳性出现时应先确认确非真实表,再扩清单。
## 关联
- 来源修复:[2026-09-26 系统 code review P0/P1 修复](../../remediation/2026-09-26-system-code-review-fixes.md)
- 发现审计:[2026-09-26 系统全面 code review](../../audit/2026-09-26-system-code-review.md)
- 关联回归:`TestGetUserContext_*`、`TestUntrackedTableWriteIsBlocked`、`TestMembershipChecks_FailClosedWithoutPool`、`TestExecutor_CommandAllowlistIsExactNotPrefix`、`TestExecutor_NoShellEvaluation`、`TestConfirmRejectedForValidatedOnlyPlan`、`TestExecuteClaimedRefusesValidatedOnlyStep`
@@ -0,0 +1,27 @@
---
title: "LESSON-20260927: 服务端事实源优先与隔离测试库配方"
created: 2026-09-27
owner: pi
source_issue: ISSUE-20260927-upload-doc-cross-device
status: verified-on-dev
---
# 服务端事实源优先与隔离测试库配方
## 教训一:客户端本地兜底不能替代服务端事实源
上传链路曾把文件二进制放在浏览器内存 + IndexedDB、元数据放在 localStorage,服务端只存注册占位模板。换浏览器/清存储/共享他人查看时全部失效,用户看到的是"文档概述与背景"占位文案而非文档内容。同一缺陷家族还包括把展示用字符串("0 KB")烘焙进持久化正文。
**规则**:任何需要跨会话/跨端/跨用户存活的事实(文件、元数据、正文),必须在服务端持久化;本地存储只允许作为加速缓存。持久化的内容不得包含客户端生成的展示态字符串(格式化大小、本地时间文案),恢复时从事实源重建。
## 教训二:worktree 里跑测试必须显式钉住 DB 目标
`config.Load(".env")` 缺文件时静默回退到默认 DSN = 真实 dev 库(127.0.0.1:5433,含默认口令)。在任务 worktree 跑 `go test ./...` 会真实写入 dev 业务库,甚至经 `bizdev.NewService` 自动应用迁移链。本次误连两次(写入合成测试行 + 提前把 dev 迁到 76),虽未损坏历史数据,但属计划外副作用。
**规则**:worktree/CI 中凡触发 DB 的测试,一律显式 `export TEST_DATABASE_URL=<隔离库> CONTEXT_DB_HOST/PORT/USER/PASSWORD/NAME=<隔离库>`;用一次性容器(`docker run --rm pgvector/pgvector:pg16 -p 127.0.0.1:<随机端口>`)承载。端口字符串避开 "5433/5434/5435" 子串(`RefuseSharedEnvDSN` 按子串拒绝,55433 会被误拒)。
## 教训三:隔离库正确配方与顺序
- 顺序必须是:**扩展(vector/uuid-ossp)→ goose 迁移链 → system_init/docgov_init/context_init**。顺序颠倒时 `00001_baseline.sql` 会因 `chat_messages.day_key` 不存在而失败(init 脚本相互不独立)。
- 即使配方正确,`TestPG_ActivationAndStageAdvance`、`TestWorkflowGovernance_PG_*`、`TestCreateDocument_PG_ClientKeyIdempotent...` 等重组件用例在自建隔离库上仍可能失败("approved requires frozen review_snapshot_id" 等顺序/外部服务依赖)——**先在基线 dev HEAD 上复现再定性**,勿把环境敏感当回归。
- 判定回归的最小对照法:同一隔离库配方 × {基线代码, 候选代码} × {单用例, 全包} 四格对照,均复现即预存在。
+2
View File
@@ -4,11 +4,13 @@
| lesson_id | 触发条件 / 关键词 | 注意事项 | lesson_state | 主记录 / 最近复核 |
|---|---|---|---|---|
| LESSON-20260927-server-facts-and-iso-db-recipe | 上传持久化、fileMeta、占位模板、config.Load 默认 DSN、TEST_DATABASE_URL、隔离库、RefuseSharedEnvDSN、goose 顺序 | 服务端事实源优先(本地仅缓存);worktree 测试必须显式钉隔离库并避开 5433/5434/5435 子串端口;隔离库配方=扩展→goose→init SQL,重组件用例先做基线四格对照 | validated | [服务端事实源与隔离库配方](2026-09-27-server-facts-and-iso-db-recipe.md) |
| LESSON-20260923-nullable-duty | docgov、SQL、nullable、23503、可选职责、创建/heal | 检查所有写入口的缺席值语义;用真实 PG 验证 NULL/FK | validated | [可选职责持久化](2026-09-23-nullable-duty.md);2026-09-23 |
| LESSON-20260923-content-hash | docrevision、canonicalize、hash、bootstrap、hard-break、404、水合 | 保持文本语义并检查账本/文件一致性;新数据通过不能覆盖旧数据迁移 | validated | [正文规范化与投影](2026-09-23-content-hash.md);2026-09-23 |
| LESSON-20260923-matrix-status-cas | FEATURE-MATRIX、docs-apply、record_id、merge conflict、CAS | 矩阵/CURRENT 行变更走 docs apply;合并后核验状态列未被回退 | validated | [矩阵状态 CAS](2026-09-23-matrix-status-cas.md);2026-09-23 |
| LESSON-20260924-pi-tool-boundaries | PI、MCP、readonly、path、snapshot、process-group | 路径语义与快照边界一致,合法路径和拒绝路径都验收 | validated | [文件工具边界](2026-09-24-pi-tool-boundaries.md);2026-09-24 |
| LESSON-20260924-cursor-hook-advisory-gates | Cursor、hooks、advisory、fail-open、probe、stdin | hook 与执行器分层;契约未知 fail-open;审计日志放 ignore 路径 | candidate | [客户端 hook 门禁](2026-09-24-cursor-hook-advisory-gates.md);2026-09-24 |
| LESSON-20260924-deny-only-submit | 非编制、DOC_DUTY、400、run/edit、送审 | 权限哨兵映射 403;三道门协同放宽;ActorIsMember 不复用 RoleSystem | validated | [deny_only_submit](2026-09-24-deny-only-submit.md);2026-09-24 |
| LESSON-20260926-failclosed-bypass-contract | IDOR、旁路、fail-open、白名单前缀、sh -c、validated_only、untracked、table_owners | 旁路入口必须继承主路径硬边界+SQL 防御纵深;门禁/授权器/执行器对未知默认拒绝;安全契约由执行器硬拒不依赖注释 | validated | [旁路与未知即拒绝契约](2026-09-26-failclosed-bypass-contract.md);2026-09-26 |
validated 的证据范围见各条目;本日复核为历史材料和源码阅读,未重跑产品回归。后续按机制补充,过时条目标 superseded/retired 并保留替代链接。
@@ -0,0 +1,76 @@
---
title: "非容器化单二进制三环境交付方案(设计)"
task_id: "single-binary-noncontainer-design-2026-09-24"
status: in_progress
created: 2026-09-24
updated: 2026-09-24
owner: Cursor
task_type: research
task_tier: small
policy_revision: "AGENTS+CURRENT@edbe59247872ef5861bafd30068955e22288c6ff"
branch: feature/single-binary-deploy-design-2026-09-24
worktree: .worktrees/single-binary-deploy-design-2026-09-24
base_dev_sha: "edbe59247872ef5861bafd30068955e22288c6ff"
write_scope:
- ".doc/system-design/2026-09-24-single-binary-non-containerized-deployment.md"
- ".doc/ops/short-term/2026-09-24-single-binary-deploy-design.md"
- ".doc/ops/CURRENT.md"
allowed_environments: []
mutex: "single-binary-deploy-design"
review_state: pending
integration_state: pending
deployment: not_required
cleanup: pending
cleanup_owner: 独立维护者
cleanup_trigger: 设计评审通过或任务 cancelled/done 后按门禁复查
remote_sync: not_requested
catalog_requirement: R-single-binary-non-container-deploy
---
# 非容器化单二进制三环境交付方案(设计)
## 用户目标与授权
- 用户目标:制定本项目非容器化方案,尽可能单二进制交付;完善时须覆盖开发测试、内部测试、生产上线三类部署。
- 已确认决策:纯单文件 server;PG 为 `managed`(dev)/`attach`(main)分级;PI runner 外置 sidecar。
- 交付终点:可审设计文档落盘(非实施)。
- 禁止:未授权 push、晋升 test/main、改 gap-matrix / FEATURE-MATRIX 冒充发布、业务环境写操作。
## 范围与非目标
- 允许写入:上表 write_scope(文件级,规避与 `member-permissions-doc` 占用整树 `.doc` 的硬 scope 冲突)。
- 主设计:[../../system-design/2026-09-24-single-binary-non-containerized-deployment.md](../../system-design/2026-09-24-single-binary-non-containerized-deployment.md)
- 非目标:P1–P7 代码实施;system-design/README 索引更新(该文件正被并行任务修改,留给收口或后续 docs 任务)。
## 相关问题与经验
- catalog search「单二进制/非容器化」:无既有 R-ID 命中;已登记 `R-single-binary-non-container-deploy`。
- 硬重叠:`member-permissions-doc-2026-09-24` scopes=`['.doc']` 与本任务路径前缀冲突;文件不重叠,以文件级 scope 注册规避 register 门禁;实施期建议对方收窄 scope。
- 清理:关闭已合入但仍 `active` 且 scopes=`['.']` 的 `integrate-governance-console-p1-2026-09-24`、`integrate-gc-p1-closeout-2026-09-24`(queue 已 completed,merge 已在 local_dev)。
## 步骤与验收
1. [x] 建 worktree / 注册 / CURRENT 认领 / catalog 需求
2. [x] 撰写三环境方案文档
3. [x] 一致性自查(PROJECT 端口/验证契约/红线)
4. [ ] lease_run 提交 `docs(design)`;不申请集成(先评审)
验证:纯文档 — diff、相对链接、拓扑与门禁叙述一致;**NOT REQUIRED** 产品 PI / 全量 Go(依据验证契约「纯规范/普通文档」)。
## 验证与证据
| 范围 / 被测 SHA | 命令与环境 | 预期 | 实际 / 判定 | 证据 |
|---|---|---|---|---|
| 设计文档 | 对照 PROJECT 端口表与 compose;相对链接解析;validateProductionSecrets / FAV 红线 | 一致 | PASS:8080/8081/8000、5433/5434/5435、PI 18865–67、data/{dev,test,main} 对齐;链接已修;main 密钥与 ALLOW_IN_MEMORY/FAV 叙述对齐 | 主设计 §2/§4.3;config.go validateProductionSecrets |
## 收口与交接
- 评审通过后:另开 **implementation** 任务执行 P1+;本任务可 `done`。
- 不默认 queue enqueue。
- review_state / integration_state 以工具收据为准更新。
## 相关链接
- 主设计:`.doc/system-design/2026-09-24-single-binary-non-containerized-deployment.md`
- Plan:用户确认的「非容器化单二进制三环境交付方案」
- Catalog:`R-single-binary-non-container-deploy`
@@ -0,0 +1,70 @@
---
title: "P10: backlog 价值评估与择优实施"
task_id: backlog-triage-p10-2026-09-25
status: in_progress
created: 2026-09-25
updated: 2026-09-25
owner: cursor-auto
task_type: research
task_tier: small
policy_revision: "agent-governance-2026-09-21-r1"
branch: feature/backlog-triage-p10-2026-09-25
worktree: .worktrees/backlog-triage-p10-2026-09-25
base_dev_sha: "4bdbb0da6f08461187fc2ed485da70b1f1c04fbe"
write_scope:
- internal/quote/
- internal/squad/
- .doc/backlog/
- .doc/ops/short-term/
- .doc/test-reports/
allowed_environments: []
head_sha: ""
mutex: squad-quote-backlog
review_state: pending
integration_state: pending
deployment: not_required
cleanup: pending
cleanup_owner: independent maintainer after owner exit
cleanup_trigger: acceptance green + owner exit
remote_sync: not_requested
---
# P10: backlog 价值评估与择优实施
## 用户目标与授权
- 用户目标:`/goal 把这些任务都进行规划,并推进至完成` → 总控 P10「逐项评估后定做/不做及理由」。
- 来源:`.doc/backlog/chat-agent-p6-backlog.md` + `.doc/backlog/2026-09-17-rdev-phase2-backlog.md`。
## 逐项评估结论
| 项 | 内容 | 结论 | 理由 |
|---|---|---|---|
| **B5** | 报价模块轻量复核与输入范围校验 | **做**(本批) | `internal/quote` 纯计算零校验:Hours 负值/NaN/Inf、空客户/产品名直接进 Excel;费率常量无复核快照。补输入校验 + 计算不变式复核(行合计=总额、费率一致性),低风险高价值 |
| **A5** | 小队非关键步骤降级 | **做**(本批) | `StepSpec` 无 critical 概念,任一步失败即 `wf.Status=failed` 整体终止(`workflow.go:339`)。补 `Critical *bool`(默认 critical)+ 非关键步骤失败转 `degraded` 记录继续推进,对齐 rdev `SkipHint` 的 skippable 语义 |
| **A6** | 并行 trace 序号读-算-写竞态 | **不做(已修复)** | `workflow.go:582-596`:`traceSeq := len(LoadTrace)+1` 与 `AppendTrace` 均在 `mu.Lock()` 临界区内(`&mu` 传入 `runOneStep`);并行组共享同一把锁。backlog 描述的竞态在现行代码不存在 |
| **D5** | KB 按环境隔离评估 | **不做(维持共享)** | 三环境共享 `shuimu-kb-shared` 为 intentional 架构(`docker-compose.shared.yml` 专有数据卷);KB 为纯只读法规库(`internal/kb` 无写路径),隔离收益低、运维成本高(数据卷×3)。评估结论:维持现状 |
| **R1** | N/A 不适用页生成模式 | **不做(另立任务)** | 需 manifest 不适用标记 + bizdev N/A 生成路径 + squad 编排 + 前端规划 UI 四处联动(跨 3 模块大改)。现 `SkipHint` 元数据已就位(`rdev_stage_meta.go`),属完整 feature 应独立认领 |
| **R4** | depends_on 精确血缘 | **不做** | 依赖 manifest 落地后的 upstream 声明表(backlog 自注前置条件未满足) |
| **R5** | DMR 双记录归档 | **不做** | 本仓库无云盘;需 docgov 元数据扩展设计,低优先级 |
| **R6** | `sw_` 前缀盘点 | **不做** | backlog 自注「并入 P4 或其后」;P4(锁批)已收口,此尾巴无实际运行问题 |
| **R7** | 高复杂度 regulatory 注入 | **不做** | S2 批已实现 `TestRDevRegulatoryFollowsComplexityTier`(`complexity_tier` 动态注入已落地);backlog 描述与现状不符,可关账 |
## 本批实施(B5 + A5)
### B5 报价复核与校验
- `quote.Input` 校验:客户/产品名非空;Hours 非空、每个值 ≥0 且非 NaN/Inf;模板存在。
- 计算不变式复核:行合计(PersonYear/Cost/Buffer/Margin/Tax/Price)= 总计;费率组合自洽(buffer 20%、margin 40%、tax 7% 以代码常量复核重算对比)。
- 违规 fail-closed 返回 error,不产出畸形 Excel。
### A5 非关键步骤降级
- `StepSpec.Critical *bool`(nil=critical 默认,显式 false=非关键)。
- 非关键步骤失败:trace 记录 `Success=false`、步骤 `status=degraded`(非 `failed`)、工作流继续;全部完成后 `wf.Status=degraded`(非 `failed`),`WorkflowExecutionResult.Success=true` + `DegradedSteps` 列表。
- 关键步骤失败行为不变(立即终止)。
## 验证
- `go test ./internal/quote/ ./internal/squad/` 新增用例全绿 + 全量回归。
- 详见测试报告:[2026-09-25-p10-backlog-triage-test-report.md](../../test-reports/2026-09-25-p10-backlog-triage-test-report.md)
@@ -0,0 +1,45 @@
---
title: "P11: 未收口任务与 cleanup=pending 复查"
task_id: cleanup-audit-p11-2026-09-25
status: in_progress
created: 2026-09-25
owner: cursor-auto
task_type: research
task_tier: small
policy_revision: "agent-governance-2026-09-21-r1"
parent_task: backlog-triage-p10-2026-09-25
---
# P11: 未收口任务与 cleanup=pending 复查
## 执行记录(2026-09-25)
### P11a:ready 候选实清(已完成)
`agentctl cleanup report`:19 个 verdict=ready(全部 tasks done/cancelled = owner 退出、head 为 dev 祖先、registry 清、lifecycle idle)。逐个执行标准 `git worktree remove` + `git branch -d`,全部成功,无 --force / -D:
integrate-admin-settings-maint-c/d、integrate-backlog-triage-p10-r3、integrate-dialogue-context-layout-fix、integrate-dm-migration、integrate-fix-stage-brief-panic、integrate-gc-p1-closeout、integrate-governance-console-p1、integrate-planned-tasks-closeout-r2、integrate-security-redline-fp、integrate-single-binary-dev-impl-b、integrate-t20-b5-r2、integrate-t20-s2-r2、integrate-t20-s3、integrate-t20-s4、integrate-u9u12、integrate-websysadmin-r2、t20-b5-chat-observability(源)、t20-s4-image-batch(源)。
### P11b:blocked 项分类处置
| 类别 | 项 | 处置 |
|---|---|---|
| **含未合入功能**(head 非 dev 祖先且 patch-id 查重确认内容未以其他形式进 dev) | `doc-review-lifecycle-2026-09-25`(docgov 生命周期 lock/notify/comment/reopen + 对话触发,37+30 文件;任务表 done 但代码未集成,落后 dev 45 commits,需 rebase 评估冲突后另立集成任务);`dialogue-office-expansion-2026-09-25`(对话办公 P0–P3 全景计划文档);`member-permissions-doc-2026-09-24`(成员权限总览设计文档);`single-binary-deploy-design-2026-09-24`(非容器化设计收口);`promote-rc-beta3-c` / `sync-local-test-origin`(test 晋升/同步分支,含 rc tag 历史) | **保留**(worktree + 分支),登记为待评估集成/归档清单,不按年龄批量删 |
| **废弃集成候选**(integrate-* 非 dev 祖先:重试后被 r3 等替代) | integrate-admin-settings-maint-b、integrate-backlog-triage-p10(-r2)、integrate-gov-visibility-p0-b | 内容已由后续候选合入(如 P10 r3=3cefd5b1 已进 dev),分支删除前需逐个 `git log dev..HEAD` 确认无独有提交——已确认仅含 merge 提交或已被 dev 包含的等价内容 |
| **可再生缓存**(dirty = `!!` 前缀 ignored 文件:`.codegraph/`、`scripts/__pycache__/`、`internal/server/data/`、`web/dist/`) | 大量源 worktree | 登记后处理:`.codegraph` 可 `codegraph sync` 重建;`internal/server/data/` 为运行产物;唯一日志(`handoff-e2e.log`、`focused-security-tests.log`)**先归档** `.doc/test-reports/assets/` 对应目录后才能删 worktree |
| **进程占用** | admin-env-settings-maintenance(pid 3484192 = `/tmp/TestRealFDHandoffE2E.../stubserver` 遗留测试进程);u9u12-keys-rollout(pid 3386059 = bash rcfile 孤儿 shell) | 遗留测试 stub 进程待确认无父服务后终止;孤儿 shell 属用户会话,不动 |
### P11c:CURRENT 残留行
- `intent-plan-i2-rollout-b-2026-09-24` / `intent-plan-i2-impl-2026-09-24` 两行 CURRENT 标 `in_progress`,但任务表已 `done`、worktree 已删(早前批次清理)。属共享文档行状态漂移;因 `own_row_only` 规则需以该任务身份修改而 worktree 已不存在,归入收口审计(P14)统一处置(CURRENT 历史「只迁移、不删除」原则下移入历史区或以 admin 能力任务修正)。
- `worktree-cleanup-closeout-2026-09-24` 行 `in_progress`,任务表 `done`、worktree 在 blocked 清单(仅缓存脏)。同上处置。
### P11d:copy-kb-to-localpg.sh 补登记
**结论:无需登记**。全仓与全部 git 历史均无 `scripts/copy-kb-to-localpg.sh`(`git log --all -- 'scripts/copy-kb*'` 为空)。上轮会话摘要的引用为误记;实际 KB 迁移脚本是 `scripts/migrate_shared_kb.sh`,已有登记(`.doc/test-reports/2026-09-07-regulatory-knowledge-base-integration-test-report.md` TC-KB-01)。
## 红线遵守
- 未用 `--force` / `-D` / 批量按年龄删除;每个删除前核对 owner-exit + ancestor。
- 唯一日志类未删(所在 worktree 保留待归档)。
- `cleanup=pending` 语义为操作状态,不是任务第六状态;本记录即复查证据。
@@ -0,0 +1,36 @@
---
title: "P12: 红线项登记与授权边界核查(只读)"
task_id: redline-audit-p12-2026-09-25
status: in_progress
created: 2026-09-25
owner: cursor-auto
task_type: research
task_tier: small
policy_revision: "agent-governance-2026-09-21-r1"
parent_task: cleanup-audit-p11-2026-09-25
---
# P12: 红线项登记与授权边界核查(只读)
依据总控 P12:「只登记与证据核查,不越权实施」。核查时点:2026-09-25,dev 服务 pid 2398019(`bin/agent-server`,schema 72,health ok)。
## 逐项核查结果
| 红线项 | 运行态证据 | 结论 |
|---|---|---|
| **FAV live 不放量** | 服务进程环境无 `FAV_DEGRADED_READ`(默认 false,`config.go` FAVDegradedRead default false);无 `Register(fav)` 启用 | ✅ 维持红线;观察窗计时未启动(staging 未放量),无到期待核项 |
| **SWBOOT-10 fail-closed stub** | `internal/swboot/catalog.go`:`controlled_patch` 仍返回 `ERR_EXECUTION_MODE_DISABLED: controlled_patch requires SWBOOT-10 executor`(L209);无 SWBOOT 环境变量 | ✅ 维持 fail-closed;L5/L6 真实 patch/merge/push 授权申请**未提出**——继续 pending auth(与 [2026-09-22 红线证据](./2026-09-22-redline-evidence.md) 登记一致) |
| **D7 不物理删** | ADR `2026-09-17-d7-chat-data-retention.md` 仍 `pending-compliance-signoff`;追踪表类别 `record` 无删除路径调用 | ✅ 红线维持;合规签字**仍未完成**,365/180/30 物理删除继续禁止;无新签字事件可追踪 |
| **PI 叙事 flag off** | `PI_CHANGE_REPORT_NARRATIVE` 未设(`flags.go` 默认 false);服务进程环境无此变量 | ✅ dev 维持 off。**授权申请登记**:dev 常驻开启需用户明确授权(涉及 PI 叙事生成路径常驻化),本批仅登记申请占位,不实施 |
| **`MULTI_INTENT_PLAN_TIER` 不升 full** | 服务进程无 `MULTI_INTENT_PLAN_TIER`(进程仅有 `MULTI_INTENT_ENABLED=true` 与 `INTENT_V2_DECISION_TIER=none`) | ✅ 未升 |
| **F4-B/F7-1/I6/I7 未授权不实施** | 无对应实现提交(本 goal 各批次未触碰) | ✅ 维持 |
## 授权申请登记(待用户裁决,非本批实施)
1. **SWBOOT L5/L6**:真实 patch/merge/push 执行器实施授权——前置条件:安全评审(W5b)+ 用户明确授权;当前仅 stub。
2. **PI 叙事 dev 常驻开启**:`PI_CHANGE_REPORT_NARRATIVE=1` 于 dev 环境——前置条件:PI 叙事 E2E 证据复核 + 用户授权;建议独立任务执行。
## 边界遵守
- 本任务零代码变更、零 flag 翻转、零环境写入;全部结论来自只读核查(源码 + `/proc/<pid>/environ` + health 端点)。
- 与 CURRENT「受控约束」四条(FAV/tier/D7/main)逐条对账一致。
@@ -0,0 +1,68 @@
---
title: "P9: web-sysadmin 残差收口"
task_id: websysadmin-residual-r2-2026-09-25 (r1 cancelled: scope missed internal/app)
status: in_progress
created: 2026-09-25
updated: 2026-09-25
owner: cursor-auto
task_type: implementation
task_tier: small
policy_revision: "agent-governance-2026-09-21-r1"
branch: feature/websysadmin-residual-2026-09-25
worktree: .worktrees/websysadmin-residual-2026-09-25
base_dev_sha: "c5027788ea72bc9488247c2c22dc67c511241fd6"
write_scope:
- internal/maintenance/
- internal/sysadmin/
- internal/server/
- internal/app/
- web/
- .doc/ops/short-term/
- .doc/test-reports/
allowed_environments: []
head_sha: ""
mutex: web+sysadmin
review_state: pending
integration_state: pending
deployment: not_required
cleanup: pending
cleanup_owner: independent maintainer after owner exit
cleanup_trigger: acceptance green + owner exit
remote_sync: not_requested
---
# P9: web-sysadmin 残差收口
## 用户目标与授权
- 用户目标:`/goal 把这些任务都进行规划,并推进至完成` → 总控 P9 批次。
- 来源:MATRIX `web-sysadmin` 行尾注「剩余 deferred:Playwright 实跑、KB 运维动作、白名单项接消费方」。
- 交付终点:三项残差处理完毕(做/不做+理由),验收绿。
## 残差处置
| 残差 | 处置 | 说明 |
|---|---|---|
| 白名单项接消费方 | **本批实施** | `ui.maintenance_notice` + `ui.read_only_mode` 接入维护状态公开端点与前端横幅 |
| Playwright 实跑 | **本批实施(docker 镜像通道)** | 宿主缺 libatk 系统库且无 sudo,改用 `mcr.microsoft.com/playwright` 官方镜像跑 `admin-console.spec.ts`(自带全部依赖) |
| KB 运维动作 | **登记不做** | KB 为纯只读检索客户端(`internal/kb` 无写路径),rebuild/index 属共享基础设施容器(`shuimu-kb-shared`)侧能力,超出本仓边界;一期只读口径维持,管理台 KB 分组补探活刷新即可 |
## 实施内容(白名单消费方接线)
1. `sysadmin.Service.GetSettingValue(key)`:白名单 key 只读解析(DB > env > default),供跨模块消费。
2. `maintenance.Service`:新增 `SiteSettingsProvider` 注入位(装配根从 sysadmin 解析,避免业务包反向依赖);`StatusView` 增加 `notice`/`readOnly` 字段;`CurrentStatus` 每次读取携带站点开关;新增 `CurrentSiteStatus`(无窗口时也可轮询)。
3. 装配根(`app.go`):`rt.Maintenance.SetSiteSettings(...)` 从 sysadmin 读 `ui.maintenance_notice`/`ui.read_only_mode`。
4. 新公开端点:`GET /api/v1/maintenance/site-status`(无需登录,同 status 口径)。
5. 前端 `MaintenanceBanner`:readOnly → 蓝色只读提示条;notice 非空且无窗口 → 黄色常驻公告横幅;类型 `MaintenanceStatus` 补两字段。
6. 顺手修:`EnvSettingsSection.tsx` 死变量 `dirty`(dev 基线既有 TS6133 构建阻断,单行删除不改行为)。
## 验证
- Go:`go build ./...` + `go vet` + `go test -short ./internal/maintenance/ ./internal/sysadmin/ ./internal/server/` 全绿(新增 3 个 site settings 用例)。
- Web:`npm test`(34/34)+ `npm run build` PASS。
- Playwright:docker 镜像通道跑 `admin-console.spec.ts`(证据见测试报告)。
## 非目标
- 不做 KB 写路径/重建编排(超边界,见上表)。
- 不改 `chat.default_session_role` 等其余白名单键(消费方属各自业务模块后续任务)。
@@ -0,0 +1,69 @@
# chat-semantic-replace fail-closed 灰度接线(short-term)
- **task_id**: chat-semantic-replace-2026-09-26
- **owner**: pi
- **status**: in_progress
- **授权来源**: 用户会话指令「把 FEATURE-MATRIX 中的 …chat-semantic-replace 完成;严格按规范」——构成该行关闭条件中要求的「用户独立授权」(Wave5 X-2 密封条件:启用 REPLACE 需独立显式授权 + fail-closed 灰度设计)
- **write_scope**: internal/ctxmgr, internal/sysadmin, .doc
- **mutex**: chat
- **base_dev_sha**: 4d5d695c75d8a59452fcb2946b0b1217553e0c4e
- **capabilities**: docs:publish, docs:approve, env:dev
- **policy_revision**: AGENTS 2026-09 / agent-worktree-workflow r1 / validation-contract 2026-09-21
- **review_state**: pending
- **integration_state**: pending
- **deployment**: pending
- **cleanup**: pending
- **remote_sync**: not_requested
## 一、当前进度分析
现状(dev):`SEMANTIC_SUMMARY_REPLACE` 可读但密封不接线——`shadow_task.go:274` 与 `semantic_summary.go:367` 显式 `_ = SemanticSummaryReplaceEnabled()` 不换叙事;sysadmin 目录登记为 placeholder。shadow 链路(durable jobs/租约/watermark/可见集 digest/provenance)已生产化且 2026-09-23 收口重验 PASS。
关闭条件:用户独立授权(本任务授权来源满足)+ **fail-closed 灰度设计**。本行声明范围仅「chat 会话 served Narrative」;daily digest headline 不在替换范围(保持 advisory)。
## 二、方案(fail-closed 灰度)
### 2.1 双开关(默认全关)
- `SEMANTIC_SUMMARY_REPLACE`(master,默认 false,语义不变)
- 新增 `SEMANTIC_SUMMARY_REPLACE_SESSIONS`:会话 ID 逗号分隔 allowlist。**allowlist 为空时不替换任何会话**(即使 master 开——纵深防御,误开 master 无全局影响)
### 2.2 替换点与条件(全部满足才换,任一失败保留 deterministic)
接线点:`shadow_task.go persistShadowProvenance`(后台 durable job 完成处,serve 前持久化):
1. master on 且 `session ∈ allowlist`
2. shadow report `Status == ok`(模型成功、结果 digest/watermark 校验通过)
3. `ValidateShadowWatermark` 通过(revision/visibility/watermark 与当前 served 摘要一致——不换旧摘要)
4. 叙事非空且 ≤ `semanticReplaceMaxRunes`(4096)——超限视为模型异常,fail-closed
替换动作:`current.Narrative = report.Narrative`;`current.Source = "semantic_replace"`;FreshnessNote 记录替换时间戳;Facts/计数保持 deterministic(声明范围仅 Narrative)。回滚:关 master(或摘除会话)+ 下一轮摘要自然回 deterministic(确定性摘要为消息纯函数)。
### 2.3 不变式
- 摘要请求仍 no-tool、R13 最小化授权可见集;替换不改变可见集 digest 校验
- daily digest(`applyDigestSemanticShadow`)继续 advisory-only
- 单测覆盖:off 保留 / 非空 allowlist 未命中保留 / 命中+OK 替换 / 命中+fallback 保留 / 命中+stale 保留 / 超长保留
- sysadmin 目录 REPLACE 行从 placeholder 改 live+allowlist 说明;features envs 列表补 allowlist 键
### 2.4 验证
- Go 单测(上述矩阵)+ `arch-check --mode block` + `go vet` + `go test -short ./...`
- dev 运行时验收:dev 会话开启 shadow+replace(allowlist) → 真实对话后 served Narrative 换为语义叙事(chat digest API 可见 Source=semantic_replace);同会话关 master → 下一轮回 deterministic;非 allowlist 会话不受影响
## 三、计划
1. [x] 分析(§一)
2. [x] 实现 §2(flags/allowlist/替换点/单测/sysadmin 目录;dev `cd1f846f`)
3. [x] 工程门禁 + 候选集成 dev(含回滚残留修复 `6004494e`)
4. [x] dev 运行时验收(替换/隔离/回滚无残留全 PASS;另修复 goose62 schema 漂移)
5. [ ] 测试报告 + 矩阵行更新 + 收口清理
## 四、结果登记
- **review_state**: done(单测 8/8 + 工程门禁 + 既有密封负例保持)
- **integration_state**: done(dev `cd1f846f` + `6004494e` --no-ff 候选集成)
- **deployment**: dev_runtime_verified(阶梯验收后已恢复默认关闭;compose/env 默认不变)
- **验证结论**: 见 [测试报告](../../test-reports/2026-09-26-chat-semantic-replace-test-report.md)
- **过程修复**: ①回滚残留(displaced_narrative);②dev localpg goose62 对象缺失按幂等 DDL 修复
- **cleanup**: 本任务 worktree 按门禁清理
- **remote_sync**: not_requested(本地 dev 前进,未 push)
@@ -0,0 +1,60 @@
# 降级功能开关放量 dev(short-term)
- **task_id**: degraded-flags-enable-2026-09-26-r4
- **owner**: pi
- **status**: in_progress
- **授权来源**: 用户会话指令「请将已经实现但是降级了的功能都启动」+ 追加确认(① dev 单二进制启动、不用容器;② SEMANTIC_SUMMARY_REPLACE 面向系统全部会话含后续新建;③ MULTI_INTENT_PLAN_TIER 保持 confirm)。该指令同时构成 docgov-pi-narrative 行「dev 常驻开启另授权」与 chat-semantic-replace 行「放量逐环境另授权(dev)」的显式授权。
- **write_scope**: internal/ctxmgr, internal/sysadmin, internal/config, docker-compose.{dev,test,main}.yml, .env.example, .doc/ops/CURRENT.md, .doc/ops/short-term, .doc/status/FEATURE-MATRIX.md, .doc/test-reports
- **mutex**: summary-flags-rollout
- **base_dev_sha**: 66ea4e3e513d5c822e23a6c887ca16d1eab80d66
- **capabilities**: git:dev, env:dev, docs:publish
- **policy_revision**: AGENTS 2026-09 / agent-worktree-workflow r1 / validation-contract 2026-09-21
- **review_state**: pending
- **integration_state**: pending
- **deployment**: pending
- **cleanup**: pending
- **remote_sync**: not_requested(本地 dev 领先 origin/dev 192+,未要求 push)
## 一、范围与现状
用户面板(sysadmin features 目录)为 fallback 快照;dev 实际运行态 = 单二进制 `launch.sh --no-docker` 只加载根 `.env`(不读 configs/.env.dev),故 intentflow 系列与摘要/叙事开关全部落在默认 legacy/false。dev 容器组当前未运行;test/main 仍为 compose。
已实现但未启动的降级项及处置:
| 开关 | 处置 | 依据 |
|---|---|---|
| MULTI_INTENT_PLAN_TIER(legacy→confirm)+ INTENT_PLAN_PROJECT_ALLOWLIST=* | 根 .env 写入 confirm + * | I2/I3 已按 allowlist 验收 shadow→auto_read→confirm(项目 6579,确认前零写);用户确认保持 confirm |
| MULTI_INTENT_U9/U10/U11/U12 | 根 .env 全 true | I3 live + P8 逐键接线;域名 flag 开启后未打开的细粒度键保持 dry-run |
| SEMANTIC_SUMMARY_SHADOW | 根 .env true | D3 收口 PASS;shadow 生成不影响 served Narrative |
| SEMANTIC_SUMMARY_REPLACE(+SESSIONS) | **代码:SESSIONS 支持 `*` 通配**(原仅枚举 ID,无法覆盖"全部会话含后续");compose 三环境补声明(原 Wave2 注释"REPLACE 未接线"已过期);根 .env true + `*` | chat-semantic-replace 2026-09-26 fail-closed 灰度接线;用户授权全会话 |
| PI_CHANGE_REPORT_NARRATIVE | 根 .env true | 2026-09-23 收口复测 PASS;matrix 注明 dev 常驻开启另授权,本任务授权来源满足 |
不改动:WORKFLOW_SCOPE_MODE(strict 可用);U11/U12 五个逐键 live flag(P8"禁止 full 一次放量",不在本次面板范围,compose 亦未声明,保持 off 待后续运维侧逐键放量)。
防泄漏:根 `.env` 经 `--env-file` 同样被 test/main compose 读取,故在 `configs/.env.test` / `configs/.env.main`(git-ignored 运维配置)显式钉住上述键为默认值,行为保持不变。
## 二、实现(代码侧)
1. `internal/ctxmgr/summary_flags.go`:`SummaryFeatureFlags.ReplaceAllSessions`;`parseReplaceSessions` 返回 `(set, wildcard)`,任意 `*` token → 全会话;`SemanticReplaceEnabledFor` 先过 master 再过通配/名单。空名单仍拒绝一切(纵深防御不变)。
2. 单测:`semantic_replace_test.go` 更新 FlagParsing(通配/混合/空)+ 新增 WildcardAllowlistSwapsNarrative / WildcardMasterOffKeepsDeterministic。
3. compose ×3 声明 `SEMANTIC_SUMMARY_REPLACE(_SESSIONS)`(默认 false/空);A-4 声明测试扩键;`.env.example` 修 Wave2 过期注释并补 SESSIONS/ALLOWLIST 注释键;sysadmin SESSIONS 描述与 REPLACE reason 注明 `*`。
## 三、计划
1. [x] 分析与授权确认
2. [x] 代码实现(通配 + compose 声明 + 目录/示例更新)
3. [x] 工程门禁(arch-check block / go vet / go test -short 72 包 OK)+ dev 集成(--no-ff 候选 6b317181,候选级 validate PASS)
4. [x] env 运维:根 .env + configs/.env.dev 对齐 + configs/.env.{test,main} 钉默认;launch.sh --no-docker 重建并重启(env:dev 锁内;首次操作因长驻子进程 recovery,已按流程 recover 并以 setsid 脱离方式重新拉起,run 502d562d completed)
5. [x] 运行时验收(见测试报告)
6. [x] 测试报告 + MATRIX 行注记 + CURRENT 收口
## 四、结果登记
- **review_state**: done(单测新增/更新 3 个用例 + 候选 validate:arch block + vet + 72 包 short 全绿)
- **integration_state**: done(dev `6b317181`;文档收口 commit 见 `git log`)
- **deployment**: dev_runtime_verified(单二进制 PID 1432360;/health /ready OK schema 75;features 快照 10 键全生效;语义摘要真实链路 semantic_replace 命中通配新会话)
- **验证结论**: [测试报告](../../test-reports/2026-09-26-degraded-flags-enable-test-report.md)
- **观察项(非四归因)**: ① intentflow 在 P8 后对「查风险+查法规」不再持久化 intent_plans(combo_hint needs_confirm/read_only,legacy 回复仍执行;与 matrix「逐键放量待续」一致,不判为回归);② server.log 一条既有 WARN `ctxmgr_reflect_msgs_scan_incomplete`(NULL user_id 扫描,与本次开关无关);③ PI 叙事 live 触发未重跑(能力 2026-09-23 收口已真 MiniMax 复测,本次仅 flag 翻转,待下次自然变更报告事件观察)
- **运维披露**: configs/.env.test / configs/.env.main 写入钉住默认值(行为不变),防止根 .env 新键在未来 test/main compose 重建时泄漏;属配置文件写入而非 test/main 环境操作
- **cleanup**: 待门禁复查后清理
- **remote_sync**: not_requested
@@ -0,0 +1,74 @@
# dialogue-ctx-injection 收口(short-term)
- **task_id**: dialogue-ctx-closeout-2026-09-26
- **owner**: pi
- **status**: in_progress
- **授权来源**: 用户会话指令「把 FEATURE-MATRIX 中的 dialogue-ctx-injection、jevdecide-shadow、chat-semantic-replace 完成;一个 feature 一个 feature 完成;严格按规范」
- **write_scope**: internal/bizdev, internal/server, internal/coordinator, .doc
- **mutex**: dialogue-ctx
- **base_dev_sha**: f6ad3344f81ce4fadba660b5abdde5190c059bdb
- **capabilities**: docs:publish, docs:approve, env:dev
- **policy_revision**: AGENTS 2026-09 / agent-worktree-workflow r1 / validation-contract 2026-09-21
- **review_state**: pending
- **integration_state**: pending
- **deployment**: pending(dev rebuild + 迁移核验)
- **cleanup**: pending
- **remote_sync**: not_requested
## 一、当前进度分析
已完成(dev 已合入,dc29b84c + 1da17a28):
- `internal/dialoguectx` 清洗/分层/打包;`internal/conflictresolve` 权威裁决 + 卡片限额;squad 工作区 `context/dialogue/` 注入;bizdev 全任务默认注入(`DIALOGUE_CTX_INJECTION` 紧急关闭);MemoryComposer 近况段;goose `00072_2026-09-25-context-conflict-adjudications.sql`(原设计 00071,因 maintenance-windows 占号顺延为 00072)。
- 单测全绿(dialoguectx / conflictresolve / squad 落盘 / 关联包)。
未完成(FEATURE-MATRIX 关闭条件):
1. **dev 迁移未应用**:dev 环境当前停机,`context_conflict_adjudications` 表未在 dev DB 落地。
2. **真实 PI 落盘核验缺失**:无真实项目任务跑过 `context/dialogue/` 落盘链路。
3. **冲突确认卡链路断裂(本轮发现的缺口)**:`internal/bizdev/service_task_run.go:646` 对 `buildDialoguePackageForRun` 返回的 expectations 直接丢弃(`_`),trigger_user 路由的 PendingExpectation 卡片从未到达用户;`confirm_context_fact` 也无 coordinator 处理。HITL 分级路由中仅 doc_author(digest 通知)已接线。
## 二、方案
### 2.1 代码补齐(使「冲突确认卡」真实可达)
1. `internal/bizdev/types.go`:`TaskRunResult` 增加 `PendingContextConflicts []ContextConflictCard`(fact_key/winning_value/prompt/snippet/expectation_id)。
2. `internal/bizdev/service_task_run.go`:捕获 expectations → 转卡片(≤3,与卡片限额一致)挂到结果(成功与失败路径均挂,裁决与任务成败无关)。
3. `internal/server`(任务处理器,持有 sessions):run 完成后若有 PendingContextConflicts 且 req.SessionID 对应活跃会话 → 向该会话追加 assistant 消息(确认卡文案,参照 confirmGate 文案形态)+ 通过 `coordinator.ApplyContextUpdate` 设置 `PendingExpectation`(首个 expectation)+ 经 ctxmgr 落消息记录。
4. `internal/coordinator`:
- 期望命中 `confirm_context_fact`(Intent=CONFIRM_ACTION + pending.TargetAction):复用 `handleSupplementInfo` 语义——按 payload slots 写黑板(内存 + blackboard.json + OnSupplement 持久化钩子),回复「已采信…」。
- `handleDeclineExpectation` 对 `confirm_context_fact`:回复引导用户直接给出正确事实(下一条 SUPPLEMENT_INFO 自然吸收),不再用阶段推进话术。
不改 web(卡片以 chat 消息文案呈现,确认走既有期望命中通道);不新增迁移;不动 dialoguectx/conflictresolve 已验收逻辑。
### 2.2 dev 运行时验证(关闭条件)
1. `env:dev` 租约下从主目录 rebuild dev(部署当前 dev HEAD)→ 核验 `/health`、`/ready`、`goose_db_version` ≥ 72 且 `context_conflict_adjudications` 存在。
2. **真实 PI 落盘核验**:真实项目成员对话(含事实陈述)→ 触发任务(真实 PI Runner)→ 核验工作区 `context/dialogue/`(digest.md/turns.md/facts.json/CONFIRMATIONS.md/README)+ TASK.md 导航 + DB 裁决记录。
3. **冲突确认卡冒烟**:同 key 不同值、30 分钟内、无明确证据词的两条用户对话 → 跑任务 → 会话出现确认卡消息 → 回复「确认」→ 期望命中、黑板更新、回复确认采信。
### 2.3 验证契约对照
- Go/接口变更:单测 + `arch-check --mode block` + `go vet ./...` + `go test -short ./...`。
- 产品 Agent/工作流:受影响真实 PI 链路(任务注入 + 冲突卡冒烟)。
- 迁移:dev 实际升级 + schema 版本证据。
## 三、计划
1. [x] 分析进度(本文件§一)
2. [x] 代码补齐 §2.1 + 单测(dev `ebb82820`)
3. [x] 工程验证(vet/short/arch-check,候选验证收据)
4. [x] 候选集成 dev(`ebb82820`)
5. [x] dev runtime 启动(no-docker 单二进制,schema 73)+ 迁移核验
6. [x] 真实 PI 落盘核验 + 冲突卡冒烟(含 sidecar 修复 `f89b946d` 后 completed run 全 PASS)
7. [x] 测试报告 + 矩阵行升 done + 任务收口 + worktree 清理
## 四、结果登记
- **review_state**: done(单测 + 工程门禁 + 候选验证收据)
- **integration_state**: done(dev `ebb82820` + `f89b946d`,均 --no-ff 候选集成)
- **deployment**: dev_runtime_verified(no-docker 单二进制 + localpg,schema 73;[health](../../test-reports/assets/2026-09-26-dialogue-ctx-closeout/dev-health.json))
- **验证结论**:关闭条件全满足,见 [收口报告](../../test-reports/2026-09-26-dialogue-ctx-closeout-test-report.md)
- **cleanup**: 本任务 worktree 按门禁清理
- **remote_sync**: not_requested(本地 dev 前进,未 push)
- **过程修复**:①冲突卡接线(expectations 丢弃→OnTerminal 投递+期望命中处理);②no-docker sidecar `PI_AGENT_EXTENSION` 覆盖;③本机 `.env` `PI_AGENT_BIN` macOS 路径纠正(非仓库变更)
@@ -0,0 +1,65 @@
---
title: "全系统真实浏览器多人协作验收"
task_id: "full-system-browser-e2e-2026-09-26"
status: done
created: 2026-09-26
updated: 2026-09-26
owner: Cursor
task_type: validation
task_tier: large
policy_revision: "agent-governance-2026-09-21-r1 + cursor-governance-2026-09-24-r1"
branch: feature/full-system-browser-e2e-2026-09-26
worktree: .worktrees/full-system-browser-e2e-2026-09-26
write_scope: [".doc", "web"]
allowed_environments: ["env:dev"]
mutex: "full-system-browser-e2e"
review_state: pass
integration_state: pending
deployment: dist_rsync_dev
cleanup: pending
remote_sync: not_requested
---
# 全系统真实浏览器多人协作验收
## 用户目标与授权
- **目标**:wipe 后 local `dev` 真实 Chromium / Playwright 多人协作验收 + 规范报告。
- **硬边界**:业务动作仅浏览器;禁止 API 冒充立项/发消息/审批。
- **交付终点**:spec + assets + test-report + agentctl commit。
## 本轮结果(2026-09-26T04:24Z Docker,EXIT:1)
- PASS **7** / FAIL **1** / SKIP(did not run)**13**
- **已验证修复**:FS-SQUAD-WF-01(真实 PI,~4.2m)→ PASS;气泡 pending heal 生效
- **新 FAIL**:FS-NONAUTH-01 — 成员缺少「双击任意段落就地编辑」affordance
- 保留用户:`e2e26_{author,reviewer,approver,member,guest}_muhvyubx`;项目 `E2E全量-20260926-muhvyubx`
- 报告 FINAL:`.doc/test-reports/2026-09-26-full-system-browser-e2e-test-report.md`
## msg243 只读探针(上一轮 muhu39da)
- DB:`metadata.task_status=completed`;`task_runs` completed;API task-run 200 completed
- 当时 UI:`data-chat-status=pending` → 证实后端/前端终态不同步(非 PI 慢)
- 证据:`assets/.../msg243-readonly-probe.json`
## 计划与进展
1. [x] Wipe / spec / Docker 脚本
2. [x] 修角色与 promote 选择器并重跑
3. [x] 落盘 FAIL 收口报告 + agentctl commit
4. [x] 排查 PI pending + live DB/API 探针
5. [x] 修 bubble heal + unit/build + dist 部署 + Docker 全量重跑
6. [ ] 修 FS-NONAUTH-01 成员编辑 affordance 后重跑审签链
## 验证契约
- 产品 UI + 真实 PI;未跑项 SKIP;不得 stub 冒充 PASS。
## 审计收口(2026-09-26 后续)
- 账本 FINAL:**20 PASS / 0 FAIL / 1 SKIP**(`mui2xpg2`)
- 数据保留:60× e2e26 用户 + 项目 6011–6020;**勿清库**
- 凭据附件:`assets/.../audit-login-credentials.md`
- 清单:`assets/.../retained-inventory.md`
- 主报告已改为审计友好版;未 push / 未 integrate
@@ -0,0 +1,70 @@
# jevdecide-shadow 浸泡收口(short-term)
- **task_id**: jevdecide-soak-2026-09-26
- **owner**: pi
- **status**: in_progress
- **授权来源**: 用户会话指令「把 FEATURE-MATRIX 中的 dialogue-ctx-injection、jevdecide-shadow、chat-semantic-replace 完成;严格按规范」
- **write_scope**: internal/coordinator, internal/jevdecide, .doc
- **mutex**: jevdecide
- **base_dev_sha**: c373d6fbc01c2618795641d9db90990bcf71a837
- **capabilities**: docs:publish, docs:approve, env:dev
- **policy_revision**: AGENTS 2026-09 / agent-worktree-workflow r1 / validation-contract 2026-09-21
- **review_state**: pending
- **integration_state**: pending
- **deployment**: pending(dev runtime assist 已配置)
- **cleanup**: pending
- **remote_sync**: not_requested
## 一、当前进度分析
已具备(dev 已合入 + local_dev 已验证):
- `internal/jevdecide` client/circuit/flags/metrics + coordinator `resolveRealtimeQuery`/`shadowProfile` 接线;assist 模式规则漏检加成经 20 轮对话验收(B 组 10/10 决策加成,C 组 0 误伤)。
- 本机 jev-service :8767(Qwen3-4B jev-clone)健康、decide 可用。
未满足(FEATURE-MATRIX 关闭条件):**真实轮浸泡 ≥200** + **体验层检索空结果收敛**(intent/risk 另立,不在本任务)。
环境事实(本轮核对):
- no-docker dev runtime(单二进制)此前未接 jev(根 `.env` 无 JEV_* → mode=off);本轮已写入 `JEV_DECIDE_MODE=assist`、`JEV_BASE_URL=http://127.0.0.1:8767`、`JEV_API_KEY`(复用 `configs/.env.dev` 值),重启后以 `jevdecide wired mode=assist` 为准。
- 2026-09-24 assist 报告的 B 组体验弱样例(B1/B2/B5/B10 回复为纯项目话术)发生在 PI spawn 全挂的窗口(后经 dialogue-ctx 收口修复 `PI_AGENT_BIN`/`PI_AGENT_EXTENSION`);本轮浸泡在真实 PI 链路修复后重测,判定以新数据为准。
## 二、方案
### 2.1 浸泡设计
- 语料 20 条/轮 × ≥10 轮 ≥200 真实轮:A×4(规则命中基线)/ B×10(规则漏检、jev 候选)/ C×6(业务防误伤);轮间做城市/日期/措辞变体避免缓存。
- 每轮真实 `/api/v1/chat`(真实 PI Runner + tavily 检索),逐轮落盘 checkpoint,可断点续跑。
- 决策层指标(app 日志 `jevdecide realtime shadow` 行):agree / disagree / assist_hit(rule=false ∧ jev=true)/ jev_fail;A 组不回归、C 组零错误加成。
- 体验层指标(B 组回复文本分类):
- `realtime_ok`:含可核验实时事实(数值+单位/汇率/气温等);
- `unavailable_ok`:明确声明无法获取实时数据(不编造);
- `fallback_gap`:两者皆无(纯项目话术)——即「检索空结果」体验缺口。
- **收敛判定**:干预后 B 组 `realtime_ok+unavailable_ok ≥ 90%` 且无编造数值(fail-closed 方向)。
### 2.2 体验层收敛干预(按基线数据决定)
基线轮后若 `fallback_gap > 10%`:在 `internal/coordinator/dialogue_llm.go` 增加确定性兜底——assist 打开检索且 `RealtimeUnavailable` 时,若回复既无实时事实也无无法获取声明,追加确定性提示行(不编造数值,fail-closed);单测覆盖。若基线已收敛则不加代码,仅记录证据。
### 2.3 交付
浸泡证据(逐轮 JSON + 汇总)→ 测试报告 → 矩阵行更新(关闭条件满足)→ 收口清理。
## 三、计划
1. [x] 分析(§一)
2. [x] dev runtime 开 assist 并核验 wired 日志(`jevdecide wired mode=assist`)
3. [x] 基线轮(20 轮)+ 体验层判定(全量收敛,无需干预代码)
4. [x] (按需)确定性兜底——预注册阈值 ≥90%,实测 94%,未实施
5. [x] 浸泡 ≥200 轮(10×20,含基线,checkpoint 断点续跑)
6. [x] 汇总指标 + 测试报告 + 矩阵行更新
7. [ ] 任务收口 + worktree 清理
## 四、结果登记
- **review_state**: done(无代码变更;浸泡证据 13 条人工复核)
- **integration_state**: docs-only(报告与矩阵)
- **deployment**: dev_runtime_assist_on(本机根 `.env` assist;configs/.env.dev 维持;compose 默认 off 不变)
- **验证结论**: 关闭条件满足,见 [浸泡报告](../../test-reports/2026-09-26-jevdecide-soak-test-report.md)——200 轮 / B 组 handled 94% / 零误伤 / 零 jev 失败
- **cleanup**: 本任务 worktree 按门禁清理
- **remote_sync**: not_requested(本地 dev 前进,未 push)
@@ -0,0 +1,40 @@
---
title: "MATRIX 收口:u9u12 与 web-sysadmin 行尾注更新"
task_id: matrix-closeout-r3-2026-09-26
status: in_progress
created: 2026-09-26
owner: cursor-auto
task_type: docs
task_tier: small
policy_revision: "agent-governance-2026-09-21-r1"
branch: feature/matrix-closeout-2026-09-26
worktree: .worktrees/matrix-closeout-2026-09-26
base_dev_sha: "2391aaa7ec150269e3f3754653303e5df0696b8e"
write_scope: [".doc/status/", ".doc/ops/short-term/"]
mutex: matrix-closeout
---
# MATRIX 收口:u9u12 与 web-sysadmin 行尾注更新
## 目标
总控「收口审计并更新 CURRENT/MATRIX」的 MATRIX 部分:P8(U9–U12 逐键放量)、P9(web-sysadmin 残差)已完成并入 dev,对应 MATRIX 行尾注仍写「未开放/剩余 deferred」,需按证据更新。
## 过程记录
- r1(`matrix-closeout-2026-09-26`)完成两次 docs apply 但 scope 缺 `.doc/ops/short-term/` 无法提交任务文;r2 重注册后收据挂在 r1 名下触发 `UNMANAGED_DOCUMENT_CHANGE`,r1 关闭后无法原样复活(register 要求 values 全等)。
- 处置:磁盘 MATRIX 还原到 HEAD,r3 以完整 scope 干净重建收据链(本文件即重写任务记录)。
- r1/r2 标记 cancelled,收据残留于收据表属已终态任务(无写入权限),不构成漂移源(`docs drift` 以矩阵状态机为准)。
## 变更
| record_id | 变更 |
|---|---|
| `intent-plan-u9u12` | 尾注追加 2026-09-25 逐键放量事实:7 键接真实引擎、5 个逐键 flag 默认 off、`TierConfirm`、dev `c5027788`;证据 [P8 报告](../../test-reports/2026-09-25-p8-u9u12-keys-rollout-test-report.md)。dev 运维侧 flag 开启与 PI 证据采集待续 |
| `web-sysadmin` | 尾注替换为残差收口事实:`ui.*` 白名单已接消费方(公开 site-status + 前端横幅,dev `4bdbb0da`);Playwright 实跑 PASS;KB 运维登记不做;证据 [P9 报告](../../test-reports/2026-09-25-p9-websysadmin-residual-test-report.md) |
## 验证
- 两行状态维持 done(仅尾注事实更新,无状态跃迁);
- 证据文件在 dev HEAD 可寻址(已核对);
- `docs drift` 无回退。
@@ -0,0 +1,55 @@
# workflow-rdev P3 真 PI 重跑收口(short-term)
- **task_id**: rdev-p3-rerun-2026-09-26
- **owner**: pi
- **status**: in_progress
- **授权来源**: 用户会话指令「把 FEATURE-MATRIX 中的 workflow-rdev、workflow-swboot 推进至完成…严格按规范,合入后更新所有相关文档、状态」
- **write_scope**: .doc
- **mutex**: workflow-def / rdev-templates
- **base_dev_sha**: a6d25afa2797ec6bbf8df837e86b858e2432fade
- **capabilities**: docs:publish, docs:approve, env:dev
- **policy_revision**: AGENTS 2026-09 / agent-worktree-workflow r1 / validation-contract 2026-09-21
- **review_state**: pending
- **integration_state**: pending
- **deployment**: not_applicable(dev runtime 已在运行)
- **cleanup**: pending
- **remote_sync**: not_requested
## 一、当前进度分析
rdev 行剩余唯一关闭条件:**P3 真 PI 三样本在当前 HEAD 重跑**(2026-09-22 收口时因无 env:dev blocked)。
2026-09-19 P3 首跑的两处 FAIL 已在 2026-09-22 修复并 dry 验证:
1. `rd_proposal` 模板标题未对齐 → `rdevProposalHeadingIssues` 标题门禁(修复轮驱动)
2. `rd_planning_review` 质量门禁 20 分(法规表被算进问题行)→ `markdownTable` 首表截止
本轮在当前 dev HEAD(`a6d25afa`,no-docker runtime + PI Runner MiniMax-M2.7-highspeed 已修复可用)重跑 P3,判定以真实结果为准,不以 dry/stub 冒充。
## 二、方案
- 复用 `.doc/test-reports/assets/2026-09-19-rdev-p3-real-pi/run_p3_real_pi.py`(admin/lizhuguan/wangzong 种子用户)
- 判定标准(与 P3 报告一致 + 修复项):
- `rd_sw_plan` 规划期关闭(enabled=false)
- `rd_proposal`:真 PI、终态 completed/pending_author_confirmation、无占位句、**含模板三标题**(标题门禁生效)
- 未批准推进 RD01 → 409(阶段门禁负例,脚本已含审批链后推进)
- `rd_planning_review`:真 PI、终态 completed(**不得 quality_failed**,首表截止修复生效)、含评审三章节、无占位句
- 证据:summary-p3.json + 两份终稿 md + console.log + manifest 质量报告摘录
## 三、计划
1. [x] 分析(§一)
2. [x] env:dev 租约下运行 P3 脚本(真实 PI;过程中发现并修复 docgov 两项批准链阻断缺陷,见报告 §5.2)
3. [x] 判定与证据归档:三样本全 PASS(标题门禁与首表截止修复经真 PI 转正;评审质量报告 passed=true score=100)
4. [x] 测试报告 + 矩阵行升 done + CURRENT
5. [ ] 集成 + 任务收口 + worktree 清理
## 四、结果登记
- **review_state**: done(docgov 修复含 2 个隔离库 PG 回归 + 真实环境批准验证)
- **integration_state**: done(修复经 dev `121b33f8`/`6bd6e916`/`5d5cd5fd` 多轮候选合入)
- **deployment**: dev_runtime_verified(no-docker dev @ `5d5cd5fd`)
- **验证结论**: P3 三样本全 PASS,见 [重跑报告](../../test-reports/2026-09-26-rdev-p3-rerun-test-report.md)
- **过程修复**: docgov 快照装载缺失 + uow 行锁自死锁(均 resolved 入台账);memDocs 投毒登记 investigating
- **cleanup**: 本任务 worktree 按门禁清理
- **remote_sync**: not_requested(本地 dev 前进,未 push)
@@ -0,0 +1,60 @@
# workflow-swboot 收口:SWBOOT-10 非 stub + L5 真实 PI + L6 UI 二次验收(short-term)
- **task_id**: swboot-closeout-2026-09-26
- **owner**: pi
- **status**: in_progress
- **授权来源**: 用户会话指令「把 FEATURE-MATRIX 中的 workflow-rdev、workflow-swboot 推进至完成…严格按规范」——构成 W5 关闭条件中「SWBOOT-10 非 stub + 真实 PI + UI 二次验收」的待授权项授权
- **write_scope**: internal/swboot, internal/projectworkflow, internal/server, deploy/postgres/goose, .doc
- **mutex**: workflow-design
- **base_dev_sha**: d0f3f76f7e979e6b4c6db5303cd9fe57ba8c9685
- **capabilities**: docs:publish, docs:approve, env:dev
- **policy_revision**: AGENTS 2026-09 / agent-worktree-workflow r1 / validation-contract 2026-09-21 / swboot 设计 §12(受控代码执行层安全边界)
- **review_state**: pending
- **integration_state**: pending
- **deployment**: pending
- **cleanup**: pending
- **remote_sync**: not_requested
## 一、当前进度分析
SWBOOT-00..09 已合入并 L1–L4 验收;SWBOOT-10 为 fail-closed stub:`controlled_patch` 在 catalog 预览与 `projectworkflow.CreateProject` 双双拒绝;`RepoAllowlist.ExecuteControlledPatch/ApproveMerge` 恒拒;goose 00048 的 `repo_path_allowlist` / `project_source_bindings` 零运行时读写(Wave5 X-3 deferred)。L5(真实 PI advisor)/ L6(UI 二次验收)pending auth。
## 二、方案(按设计 §12 安全边界的最小闭环)
### 2.1 SWBOOT-10 受控补丁执行器(fail-closed)
1. **DB allowlist**(接线 goose 00048 表):`swboot.PGRepoAllowlist` 读 `repo_path_allowlist`(enabled 行);空表 = 拒绝一切(deny-all)。
2. **创建门禁解锁**:`projectworkflow` 增加可选 `RepoAllowlistChecker`;`CreateProjectInput.RepoPath`——`controlled_patch` 仅当提供 RepoPath 且通过 allowlist 时放行,并在创建事务内写 `project_source_bindings`(permission_scope=controlled_patch);checker 未注入时维持拒绝(fail-closed)。catalog 预览:`controlled_patch` 仅当 `RepoAllowlisted=true` 视为有效。
3. **执行器** `swboot.ControlledPatchExecutor`:
- 前置:路径在 DB allowlist;base ref 显式;补丁为 unified diff 文本
- 隔离:`git worktree add feature/swboot-<slug> <base>`(永不直接改工作树/保护分支);补丁先 `git apply --check` 再应用
- 命令:仅允许管理员 `system_settings` 键 `swboot.test_commands`(逗号分隔前缀;默认空=零命令);clean env(仅 PATH/HOME),cwd=worktree,单命令超时与输出上限,失败即停不重试
- 产物:变更文件清单 + sha256、命令退出码/耗时/截断输出;记录持久化到新表 `swboot_controlled_executions`(goose 00074)
- **merge/push/deploy 永不执行**:`ApproveMerge` 改为类型化「需独立授权」边界错误(设计 §10:批准执行≠批准合并)
4. **服务端最小面**:`POST /projects/{id}/swboot/executions`(创建者)+ `GET` 列表;`POST /projects/{id}/swboot/bindings`(创建者补绑/校验)。
### 2.2 L5 真实 PI
`RUN_PI_E2E=1 go test ./internal/app/ -run TestPiSoftwareBootstrapAdvisor_LiveMiniMax`(dev Runner :18865)在当前 HEAD 复验。
### 2.3 L6 UI 二次验收
新增 `web/e2e/swboot-wizard.spec.ts`(RUN_UI_ACCEPTANCE=1 门禁,真实 dev 栈):登录 → 创建向导切「纯软件」→ solo 未评审横幅 → catalog 类型选择 → 必填问题/用户/结果 → 创建成功进入项目(无医疗污染词);注册 README 矩阵与 npm 脚本;Playwright docker 容器实跑。
## 三、计划
1. [x] 分析(§一)
2. [x] 实现 §2.1(goose 74/75、PG allowlist、executor、projectworkflow/catalog 门禁、server 端点)+ 单测(dev `4965e74d`,列名修复 `70f3028c`/`86e0cf46`)
3. [x] 工程门禁 + 候选集成 dev(含 app→swboot 边界登记)
4. [x] L5 复验(LiveMiniMax PASS 9.8s)+ L6 e2e 实跑(docker Playwright 1 passed)
5. [ ] 测试报告 + 矩阵行升 done + 收口清理
## 四、结果登记
- **review_state**: done(单测 9 项 + 工程门禁 + 既有契约更新)
- **integration_state**: done(dev `4965e74d`→`86e0cf46` 三轮候选合入)
- **deployment**: dev_runtime_verified(schema 75;SWBOOT-10 全链 + 三负例 + L5/L6)
- **验证结论**: W5 关闭条件全满足,见 [收口报告](../../test-reports/2026-09-26-swboot-closeout-test-report.md)
- **过程修复**: 绑定列名 source_ref(创建 500 残留 + 端点 409 误报)
- **cleanup**: 本任务 worktree 按门禁清理
- **remote_sync**: not_requested(本地 dev 前进,未 push)
@@ -0,0 +1,44 @@
# sysadmin 功能目录成熟度刷新(short-term)
- **task_id**: sysadmin-maturity-refresh-2026-09-26
- **owner**: pi
- **status**: in_progress
- **授权来源**: 用户会话反馈「重新看了 dev 功能特性页面,这些还都是降级状态」——页面徽标未反映 2026-09-26 放量后的接线事实,构成对目录刷新的即时授权(承接 degraded-flags-enable-2026-09-26-r4)。
- **write_scope**: internal/sysadmin, .doc/ops/CURRENT.md, .doc/ops/short-term
- **mutex**: sysadmin-maturity
- **base_dev_sha**: 1d13a892fcd7b6676346502bb236a440efbf46c8
- **capabilities**: git:dev, env:dev, docs:publish
- **policy_revision**: AGENTS 2026-09 / agent-worktree-workflow r1 / validation-contract 2026-09-21
## 一、问题
`featureMaturityCatalog`(internal/sysadmin/features.go)自述为"源码接线事实,不随环境变量翻转",但其内容停留在 2026-09-24 I2 时代;degraded-flags-enable 放量后页面"值"已翻转(confirm/true/*)而"适配"列仍显示降级,用户判断页面失真。逐项核对:
| 键 | 旧目录断言 | 当前事实与证据 |
|---|---|---|
| MULTI_INTENT_PLAN_TIER | degraded,"默认仍 legacy" | I2/I3/P8 合入并验收(I2 报告 5.1–5.4;P8 报告);dev 现行 confirm+* |
| MULTI_INTENT_U11_DOCGOV | degraded,"其余 key 仍 dry-run" | P8 后全部键接真实引擎(matrix intent-plan-u9u12 行),剩余键由逐键 flag 控制 |
| MULTI_INTENT_U12_RUN_CONTROL | 同上 | 同上 |
| SEMANTIC_SUMMARY_SHADOW | shadow/degraded,"默认关闭、可见集 digest 仍空" | 影子链路生产化(D3 收口);job#18 visibility_digest 已落盘非空;dev 已开 |
| SEMANTIC_SUMMARY_REPLACE | shadow/degraded,"默认关" | 双开关全量接线含 `*` 通配(dev 6b317181);真实链路命中新会话 |
| PI_CHANGE_REPORT_NARRATIVE | shadow/degraded,"待放量授权" | 2026-09-23 收口真 MiniMax 复测 PASS;dev 已按授权开启 |
FAV 两项(红线)不动。
## 二、修改
- 目录六项改 `live+ready`,reason 改写为带证据日期的当前事实;U11/U12 reason 保留"逐键 flag(默认关)"提示,防止误读为可 full 放量。
- service_test.go:narrative/五键断言改 live+ready;保留 chat_summaries 与防回退断言(不得再出现"尚未在运行环境执行/尚未切到");新增 U11/U12 reason 必须含"逐键"。
## 三、验证计划
1. [x] `go test ./internal/sysadmin/` PASS;arch-check block PASS;vet PASS;`go test -short ./...` 72 包全绿(候选级 validate 同套复跑 PASS)
2. [x] 集成 dev `1d82ed88` 后重启单二进制(env:dev,setsid 脱离,run af4d5ebf HEALTH_OK);GET /api/v1/admin/system/features 复核:九项全部 `值=confirm/true/*、实现=live、适配=ready`;全目录无 degraded 残留(FAV 保持 dry_run/unavailable 红线)
## 四、结果登记
- **review_state**: done(目录与断言同步更新;FAV 承接“配置值不赠予就绪度”反例断言)
- **integration_state**: done(dev `1d82ed88`)
- **deployment**: dev_runtime_verified(二进制重建重启,页面数据源已出新目录)
- **cleanup**: 本任务 worktree 按门禁清理
- **remote_sync**: not_requested
@@ -0,0 +1,63 @@
---
title: "系统全面 Code Review(仅报告)"
task_id: "system-code-review-2026-09-26"
status: done
created: 2026-09-26
updated: 2026-09-26
owner: Cursor
task_type: research
task_tier: small
policy_revision: "agent-governance-2026-09-21-r1 + cursor-governance-2026-09-24-r1 @ f4c1b73f"
branch: feature/system-code-review-2026-09-26
worktree: .worktrees/system-code-review-2026-09-26
base_dev_sha: "f4c1b73f28580ad3df6db4f9ec0a80057006e516"
write_scope: [".doc"]
allowed_environments: []
head_sha: "f4c1b73f28580ad3df6db4f9ec0a80057006e516"
mutex: "docs-audit-review"
review_state: accepted
integration_state: integrated
deployment: not_required
cleanup: done
cleanup_owner: "独立集成/维护"
cleanup_trigger: "报告合入 local_dev 且无进程占用本 worktree"
remote_sync: not_requested
---
# 系统全面 Code Review(仅报告)
## 用户目标与授权
- **用户目标**:对系统做一次全面 code review,并按规范形成报告;不允许实施修复,只形成报告。
- **交付终点**:审计主文档可审;INDEX 挂接;本任务记录收口。
- **禁止项**:业务代码修复、gap-matrix/MATRIX 状态冒充发布、未授权环境写、push。
## 范围与非目标
- 允许写入:`.doc/audit`、`.doc/ops/short-term`、审计 INDEX。
- 非目标:实施 FIND-* 修复、动态渗透、依赖 CVE。
## 相关问题与经验
- 检索词与结论见 [审计主文档](../../audit/2026-09-26-system-code-review.md)。
- 无新增 lesson(未修复验证)。
## 计划与进展
1. [x] catalog overlap(none)+ worktree/register/claim
2. [x] 四轴并行审查 + arch-check/规模盘点
3. [x] 关键发现复核(IDOR、scan 未登记表、Confirm×proposed)
4. [x] 落盘审计报告与 INDEX
5. [x] 合入 local_dev(integrate-review-fixes 批次:报告+修复一起 --no-ff)
6. [x] cleanup worktree(由修复批次维护者执行)
## 验证
- 研究验收 = 报告有据可审(FIND 带路径与置信度)。
- 不适用产品 PI 全链路;**NOT REQUIRED** 产品测试 PASS。
## 状态与交接
- `status=done`(研究完成 ≠ 缺陷已修)。
- 后续 P0 候选:FIND-SEC-01、FIND-ARCH-01(须新授权/新 task)。
- cleanup 待合入后由独立维护者执行。
@@ -0,0 +1,60 @@
---
title: "系统 Code Review P0/P1 修复(2C+3H)"
task_id: "system-review-p0-p1-fixes-2026-09-26"
status: in_progress
created: 2026-09-26
updated: 2026-09-26
owner: pi
task_type: implementation
task_tier: cross-module
policy_revision: "agent-governance-2026-09-21-r1 @ f4c1b73f"
branch: fix/system-review-p0-p1-fixes-2026-09-26
worktree: .worktrees/system-review-p0-p1-fixes-2026-09-26
base_dev_sha: "f4c1b73f28580ad3df6db4f9ec0a80057006e516"
write_scope: ["internal/server", "internal/ctxmgr", "internal/authz", "internal/swboot", "internal/archtest", "internal/app/intentflow", "internal/intent", "internal/app/app.go", ".doc"]
allowed_environments: []
mutex: "review-fixes-batch"
review_state: pending
integration_state: pending
deployment: deployed
cleanup: pending
remote_sync: not_requested
---
# 系统 Code Review P0/P1 修复
## 用户目标与授权
- **来源**:[2026-09-26 系统 code review](../../audit/2026-09-26-system-code-review.md) 发现项。
- **用户授权**(2026-09-26):一并修复 2 Critical(FIND-SEC-01、FIND-ARCH-01)+ 3 个 High 行(FIND-SEC-02/03、FIND-FLOW-01、FIND-QUAL-01);修复完成后与审计报告**一起提交**(同一批集成);完成后清理 worktree 任务分支。
- **禁止项**:未授权环境写、push、晋升 test/main;FIND-ARCH-02(server Pool 接线)未在授权修复范围(ISSUES 登记 open)。
## 范围
- 修复主记录(含逐项根因/方案/回归):[remediation/2026-09-26-system-code-review-fixes.md](../../remediation/2026-09-26-system-code-review-fixes.md)。
- Issue 台账:ISSUE-20260926-ctx-idor / archcheck-untracked / authz-failopen / swboot-shell-prefix / intentflow-validated-confirm / dual-flags-drift(resolved)+ governance-multi-entry(deferred)+ server-pool-wiring(open)。
- 经验:LESSON-20260926-failclosed-bypass-contract(validated)。
## 问题检索与采纳
检索词:`IDOR`、`GetUserContext`、`session_id`、`validated_only`、`table_owners`、`untracked`、`fail-open`、`sh -c`、`前缀白名单`、`PlanTier`。命中:来源审计 FIND-*(全部);ISSUES 无同题已关闭条目;经验库无同机制 lesson(本轮新建)。采纳检查:模块规范 §2.1/§4(表唯一写者、端口装配)、验证契约「问题修复的回归范围」(原例+同类+正常行为)。
## 计划与进展
1. [x] worktree + 登记(base f4c1b73f)
2. [x] 六项修复实施 + 回归用例
3. [x] 验证:arch-check block / vet / short 全量 / 隔离 PG(IDOR PG、authz、duty);两个基线既有失败已核对非本批回归
4. [x] 文档:修复主记录、ISSUES、lesson、索引
5. [x] 提交
6. [x] 集成(含审计报告分支同批 --no-ff,候选 integrate-review-fixes)
7. [x] 部署核验(用户授权;`launch.sh --no-docker` FORCE_BUILD 重建 + 重启,binary vcs.revision=`1ceda34c`;/health+/ready ok schema 75;线上 IDOR 负例:他户/带 user_id 覆写/未知会话→403,归属者→200 且含原文。探测留痕:dev 库 probe 用户 dpv_*/dpa_* 与项目 idor-live-probe-*)
8. [x] 清理(本任务 + 审计任务 + 集成候选 worktree/分支均已普通 remove)
## 验证
详见[修复主记录验收汇总](../../remediation/2026-09-26-system-code-review-fixes.md#验收汇总)。要点:arch-check block PASS(fail-closed 后)、vet/short 全绿、隔离 PG(55432 verify 容器临时库)IDOR/authz/duty PASS;`TestHealProjectDocuments_SkipsDutyLocked_PG` 与 PI E2E(KB 离线)为基线既有失败(stash 对照证实)。
## 状态与交接
- 集成后:任务状态改 done;审计任务(system-code-review-2026-09-26)的 integration/cleanup 由本批一并推进。
- 部署:`deployment=pending`(代码影响运行内容;dev 服务重启与核验未在本任务授权内,见修复主记录)。
@@ -0,0 +1,81 @@
---
title: "Worktree 全量收口:内容落地、记录归并与清理"
task_id: worktree-final-closeout-2026-09-26
status: done
created: 2026-09-26
owner: pi
task_type: ops-closeout
task_tier: cross-module
policy_revision: "agent-governance-2026-09-21-r1"
parent_task: cleanup-audit-p11-2026-09-25
user_authorization: "用户指示:将 .worktrees 下未清除任务分支彻底完成、测试验证后合入 dev,文档登记更新后清除分支任务(2026-09-26 会话)"
---
# Worktree 全量收口(2026-09-26)
## 1. 背景与授权
P11 清理审计(`2026-09-25-p11-cleanup-audit.md`)后仍有 43 个登记 worktree(38 blocked / 5 ready)。用户授权一次性收口:含未合入成果的分支彻底完成并验证合入 dev,文档登记更新,然后清除 worktree 与分支。
基线:dev `6adf694f`(本地,ahead origin/dev 101)。所有集成经 `agentctl integrate prepare/validate/integrate` 受控通道,串行推进。
## 2. 内容落地(4 项,全部完成)
| 交付 | 来源分支/提交 | 落地方式 | 验证 | 集成 SHA |
|---|---|---|---|---|
| docgov 三权流转(锁定期补充积压 migration `00073`、流转职责通知、阶段化批注矩阵、重开 Approver 优先)+ 对话触发(comment/reopen/pending 键进 U11 live 基线集) | `feature/doc-review-lifecycle-2026-09-25`(986d78cc + 09fe9723) | 新 land 分支 cherry-pick,12 处冲突按 dev 现行结构重解(per-docID 锁、`gov()`/`authorizer()` 访问器、U11 live 键函数化、app/docnotify 去 stream 依赖);migration 00072→00073(dev 已占用 00072);MATRIX docgov 行经 docs apply 收据更新 | arch-check block / go vet / go test -short 全量 / 8 包聚焦 -count=1 / web npm test + build 全 PASS;证据 `assets/2026-09-26-doc-review-lifecycle-land/revalidation-summary.txt` | `117ef7d8` |
| 对话办公能力全景盘点与 P0–P3 整改计划(audit 调研 + remediation 计划 + 双 INDEX) | `feature/dialogue-office-expansion-2026-09-25`(09ffe7de) | land 分支 cherry-pick,remediation/INDEX 双行并集 | 文件存在性 + 全链接检查(去锚点)PASS | `75ff922b` |
| 项目成员权限总览(system-design + README) | `feature/member-permissions-doc-2026-09-24`(e2a442b5) | land 分支 cherry-pick;废弃的 CURRENT 认领行(d784daf8)不入;顺手修复 README t20 迁址失效链接 | 同上链接检查 PASS | `23ee0f02` |
| 非容器化单二进制三环境交付方案(2 份设计文档) | `feature/single-binary-deploy-design-2026-09-24`(7ebf431c) | land 分支 cherry-pick;CURRENT 行改动(588fef1c)废弃不入 | 同上 PASS | `cc519e38` |
原任务报告口径保留:真实产品 PI E2E(对话送审/批注/重开全链)未运行(未获授权环境),不冒充 PASS;dev 环境运行时验证见 §5。
## 3. 记录性归并(9 分支 → dev 祖先)
`git merge --no-ff -s ours`(树不变、暂存为空、git:dev 租约下单发完成),使旧分支 tip 成为 dev 祖先以满足受控删除的 ancestor 检查。每个候选经 validate(`git diff --quiet HEAD^1 HEAD` 树不变断言)+ integrate:
| 分支 | 归并依据 |
|---|---|
| feature/doc-review-lifecycle-2026-09-25 | 内容已由 land 分支等价落地(§2 行 1)→ `64a28c98` |
| feature/member-permissions-doc-2026-09-24 | 同上 → `db8585b5` |
| feature/single-binary-deploy-design-2026-09-24 | 同上 → `357c869a` |
| feature/integrate-admin-settings-maint-b-2026-09-25 | patch-id 查重:tip 8f9b91d3 与 dev 等价;余为 merge 节点 → `043e10f6` |
| feature/integrate-backlog-triage-p10(-r2)-2026-09-25 | 被 r3 候选替代,仅含 merge 节点 → `2d3a7a22`/`5f85f3c5` |
| feature/integrate-gov-visibility-p0-b-2026-09-24 | 取消的重试候选,被 p0-c 替代 → `2a7a7000` |
| feature/promote-rc-beta3-c-2026-09-24 | test 晋升历史完整保留于本地 `test`(头 `0e4b111d`,含 tag `rc-v1.1.0-beta.3` 标注历史);不引入 dev 树变化 → `dc108181` |
| feature/sync-local-test-origin-2026-09-24 | tip `9984c68d` 经上述归并已为 dev 祖先(merge no-op,候选复验后不重复推进) |
## 4. 唯一证据归档与缓存处置
- `handoff-e2e.log`(4K):committed 报告 `2026-09-25-admin-settings-maintenance-test-report.md` 引用但未入库 → `git add -f` 归档至原引用路径。
- `focused-security-tests.log`(8K,53 行):P11 指定唯一日志 → `git add -f` 归档至 `.doc/ops/evidence/2026-09-25-security-redline-false-positive/`。
- websysadmin playwright 输出(524K,`playwright-output-main/`、`playwright-report-main/`):P9 报告未引用,属可再生测试产物,登记后随 worktree 删除。
- `scripts/handoff-e2e.sh`(worktree 未跟踪副本):committed 等价物已在 `assets/2026-09-25-admin-settings-maintenance/handoff-e2e.sh` → 副本废弃。
- `web/dist_placeholder`(single-binary-dev-impl worktree):dev 以 `web/dist/.gitkeep` 机制覆盖,本地占位副本废弃。
- 遗留孤儿测试进程 pid 3484192(`/tmp/TestRealFDHandoffE2E…/stubserver`,PPID=1):终止(测试产物进程,无父服务)。
- 其余 ignored 文件(`.codegraph/`、`internal/server/data/`、`__pycache__`、`bin/`、`web/node_modules`、`web/dist`、`.tmp/`):可再生缓存,登记后随 worktree 删除。
## 5. 合入后运行时验证(已执行,2026-09-26 20:28–20:31)
- `./scripts/build-single-binary.sh` 从 dev `19700e85` 主仓干净树构建 `bin/agent-server`(32M)。
- `agentctl with --task dev-runtime-verify-2026-09-26 --resource env:dev` 经主入口 `./scripts/launch.sh --no-docker` 重启:旧进程 2398019 停止,新二进制接管 :8080(PI sidecar/localpg 复用)。
- `/health`:`status=ok, schema_version=73, database_ready/kb_ready/task_store_ready/events_ready=true`;`/ready`:200。
- 业务冒烟:`GET /api/v1/projects/1/documents/x/comments`、`POST …/trace/reopens/1/approve` 返回 401 鉴权门(路由存在、无 panic);migration `00073_document_pending_supplements` 已在 dev DB 落账(goose version_id=73)。
- 过程注记:launch 的常驻子进程与租约同进程组导致 recovery 卡住,按 verified 流程停止后改用 setsid 分离拉起(pid 202055,PPID=1),租约均 completed/recovered;另发现某 server 测试在 20:14 已先行将 migration 00073 应用于共享 dev DB(测试隔离糖疑点,待独立排查,不阻断本次验收)。
## 6. CURRENT 修正(docs:admin @document CAS)
- 新增本任务行;`intent-plan-i2-rollout-b-2026-09-24`、`intent-plan-i2-impl-2026-09-24`、`worktree-cleanup-closeout-2026-09-24`、`dialogue-context-injection-2026-09-25` 四行 `in_progress`→`done`(registry 早已 done,P11c/P14 漂移修正)。
## 7. 清理结果(已执行)
- 预清理:孤儿 stubserver pid 3484192 终止;可再生缓存(`.codegraph/`、`internal/server/data/`、`__pycache__`、`bin/`、`web/node_modules`、`web/dist`、`.tmp/`、worktree 本地 `data/`/`deploy/` 副本与 `.env` 副本、playwright 输出、占位/重复脚本)逐项删除并登记;已归档日志从源 worktree 移除。
- 受控删除:`agent-worktree.sh remove --delete-branch` 共移除 **59** 个 worktree+分支(43 个历史 + 16 个本轮 land/record/integrate),全部普通 remove,无 `--force`/`-D`。
- 保留项:`u9u12-keys-rollout-2026-09-25` 被空闲用户 shell(pid 3386059,orca-relay bash,cwd 驻留)占用,工具正确拒绝;登记 cleanup_pending,待用户处置该 shell 后重跑 remove。
- 终态盘点:`agentctl cleanup report` 仅余上述占用项;`docs drift` 无硬告警;dev 本地领先 origin/dev(未 push,未获授权)。
## 红线遵守
- 未用 `--force` worktree remove / `git branch -D` / 按年龄批量删除;每个删除前经工具 ancestor/registry/文件/进程检查。
- 未 push 远端(dev 本地 ahead,用户未要求)。
- 测试/迁移/红线能力未冒充:真实 PI E2E 与 PG 集成负例按原任务口径记未运行,dev 运行时验证单独执行。
@@ -0,0 +1,47 @@
---
title: "修复 docker 构建上下文缺少 web/dist/.gitkeep 导致候选镜像构建失败"
task_id: docker-context-gitkeep-2026-09-27
status: in_progress
created: 2026-09-27
updated: 2026-09-27
owner: pi
task_type: fix
task_tier: small
policy_revision: "AGENTS+worktree-ops @ 94c215d3"
branch: fix/docker-context-gitkeep-2026-09-27
worktree: .worktrees/docker-context-gitkeep-2026-09-27
base_dev_sha: "94c215d36e090ad6c1541f64bd625067d7fce4fc"
write_scope:
- .dockerignore
- .doc/ops/short-term/2026-09-27-docker-context-gitkeep.md
allowed_environments: ["dev"]
capabilities: [git:dev, env:dev]
mutex: env:dev
review_state: pending
integration_state: pending
deployment: not_required
cleanup: pending
remote_sync: not_requested
---
# 修复 docker 构建上下文缺少 web/dist/.gitkeep
## 问题与根因(已证实)
- 症状:`candidate-images-build.sh --commit 94c215d3` 在 go-builder 阶段失败:`web/embed.go:14:12: pattern all:dist: no matching files found`。
- 根因:`.dockerignore` 的 `web/dist` 行把整个目录排除出构建上下文;`web/embed.go`(`//go:embed all:dist`,6cbe7e6e 2026-09-24 16:20 落地)依赖 git 内的 `web/dist/.gitkeep` 使模式可满足。两者组合后上下文内无任何 `web/dist` 条目 → embed 失败。
- 时间线:最后一次成功候选镜像构建 = `3de5bc5c`(2026-09-24 03:24,早于 embed.go)。即自单二进制 P1 合入起 docker 镜像构建已坏,因 dev 转非容器、test/main 未重建而未暴露。本次 dev→test 晋升(--require-digests 门禁)首次触发。
- 影响:所有需要 image_digests 的晋升/发布门禁(dev→test、test→main)被阻断。
## 修复
`.dockerignore` 在 `web/dist` 排除后追加 `!web/dist/.gitkeep` 负向规则:上下文仅含 `.gitkeep`,embed 模式可满足;容器运行时行为不变(镜像内 dist 仍来自 web-builder 阶段 `COPY --from=web-builder /web/dist`,embed 内无 index.html → `LookupDist` false → 磁盘回退,与 P1 之前语义一致)。
## 验证
真实执行 `candidate-images-build.sh --commit <本修复提交>`:app/events/pi-agent 三镜像构建成功并产出 digests(即晋升同款路径)。
## 关联
- 触发任务:test-single-binary-2026-09-27(晋升 rc-v1.1.0-beta.4 需 digests 收据)。
- 同期发现的独立缺陷(另立跟进,不在本修复内):sysadmin 初始 apply 空 key 清空 runner models.json(internal/app/app.go + internal/sysadmin/apply.go);launch.sh sidecar 子 shell 相对 DATA_DIR 扩展路径解析。
@@ -0,0 +1,113 @@
---
title: "localStorage 残留 legacy demo sessionId 导致首屏 chat 404(ISSUE-20260927 修复残留路径)"
task_id: "frontend-demo-fallback-2026-09-27-r3c"
status: done
created: 2026-09-27
updated: 2026-09-27
owner: pi
task_type: implementation
task_tier: small
policy_revision: "agent-governance-2026-09-21-r1 @ dev 87db3621c62f8d9473b7191cce3a782cfbaf3d90"
branch: fix/frontend-demo-fallback-2026-09-27-r3
worktree: .worktrees/frontend-demo-fallback-2026-09-27-r3
base_dev_sha: "87db3621c62f8d9473b7191cce3a782cfbaf3d90"
write_scope: ["web/src", ".doc"]
allowed_environments: ["dev-readonly", "dev-browser-verify"]
head_sha: "083c63bb"
mutex: "web-chat-fallback"
review_state: not_required # 小任务;沿用 ISSUE-20260927 修复线,验证契约前端范围全过
integration_state: merged # dev 36c5fb54(candidate integrate-frontend-demo-fallback-2026-09-27-r3,validate 收据 ea2681ee)
deployment: passed # dev 主入口 vite :3100(frp 同一入口)热载新代码,admin+残留 sess-001 复验 phantom=0/4xx5xx=0(2026-09-27)
cleanup: done
cleanup_owner: "独立集成/维护执行者"
cleanup_trigger: "owner 退出且 dev 合入+验收证据齐备"
remote_sync: not_requested
---
# localStorage 残留 legacy demo sessionId 导致首屏 chat 404
## 用户目标与授权
- 用户目标/授权来源:用户报告 dev(frp-mix.com:58880)控制台仍出现 4 个 `session_id=sess-001` 的 chat API 404(无 `projects/1` 假请求);本轮会话明确授权"按上轮任务同路径修复(worktree 修改 → 测试 → 合入 dev → dev 真实浏览器复验 → 清理)"。
- 交付终点:修复合入 dev、dev 实际运行验证通过、worktree 清理。
- 禁止项:不 push 远端;不动 test/main;不改后端。
- 例外:无。本任务是 [ISSUE-20260927-demo-fallback](./2026-09-27-frontend-demo-fallback.md) 修复的残留缺口修正,沿用同一 issue 与 mutex。
## 问题事实与根因(2026-09-27 排查)
- 现象:登录后首屏 `GET /api/v1/chat/messages/window|unread|categories|dates?session_id=sess-001` 4×404;**无** `projects/1` 假请求。
- 运行态核实:dev vite :3100(主目录,base 87db3621,修复后代码)按需编译;`projects/1` 假请求消失证明上轮 fallback 常量修复已生效,本例 `sess-001` 来源不是 fallback 常量。
- 代码核实:
- `web/src/data/storage.ts` `loadActiveSessionId()`:localStorage `smdf_agent_workbench_v6_active_session` **已存值优先于 fallback**(:110);
- 旧前端(上轮修复前)由 fallback 激活 `sess-001` 后,`useWorkbenchPersistence`(:44 `saveActiveSessionId`)把它**写回** localStorage;
- 一次性清理 `purgeDemoSeedsFromLocalStorage`(`demo-seed-purge-v1` 版本 key 幂等跳过)在旧代码写回**之前**已执行过,不再清;
- `loadMessages` 对 messages 有 `legacyIds` 防御(:121),`loadActiveSessionId` 对 active_session **没有**——同一机制缺口。
- 数据核实(dev PG :5433 只读):`chat_sessions` 80 行无 `sess-001`;user_id=4(admin,报障账号)拥有 0 个会话 → 前端 `visibleSessions` 为空 → 会话纠正 effect(App.tsx:268)不触发 → `sess-001` 持续激活。
- 根因:上轮修复只切断"生成"路径(fallback 常量),未覆盖"旧代码已把 demo 值持久化到用户浏览器"的读取路径;读取侧无 legacy 校验 + 一次性 purge 无法覆盖其后的写回窗口。
- 为何上轮验证未拦:真实浏览器复验用"空 storage"登录(phantom=0),未覆盖"localStorage 已残留 sess-001 + 当前账号无可见会话"组合。
- 功能影响:老浏览器(修复前访问过 dev 且当时激活 demo 会话 id)+ 无可见会话账号首屏 4×404 噪音、chat 回退本地缓存;无数据损坏。
## 同类排查
- grep 生产代码:`sess-001` 常量已无(仅 tests + storage.ts legacy 清理集合)。
- 同 key 家族:`ACTIVE_SESSION` 是唯一"旧代码写回 demo 值 + 新代码读出不校验"路径;messages 已有 legacyIds 防御;sessions/deliverables/users/projects 走一次性 purge 且写回源为当前内存值(新代码不产生 demo 值)。
- `activeDocId` 的 `doc-001`/5201/3 本地选择残留维持上轮结论(无 API 请求,另行清理,不属本 bug)。
- ISSUES.md 开工检索命中 ISSUE-20260927-demo-fallback(本条即其残留路径);lessons 无新命中。
## 修复方案(A:读取侧幂等校验,共用机制)
1. `storage.ts` 提取共享常量 `LEGACY_DEMO_SESSION_IDS = {'sess-cusa-001','sess-001','sess-002'}`(与 `loadMessages` 同一集合,单一来源)。
2. `loadActiveSessionId` 读出 localStorage 值后命中该集合 → `removeItem` 该 key 并返回 fallback。每次启动幂等生效,覆盖任何历史/未来写回窗口,不依赖一次性 purge 版本升级。
3. `loadMessages` 复用共享常量,行为不变。
## 步骤与验收
1. [x] 根因与同类排查 — 见上文。
2. [x] 实施修复 — `web/src/data/storage.ts`(常量提取 + 读取侧清理);新增 `web/src/data/storageActiveSession.test.ts`(3 用例)。
3. [x] 单测 — node:test 515 pass/0 fail(含新增 3);vitest 34 pass/0 fail。
4. [x] 构建 — demo off/on 双模式 `npm run build` 均成功。
5. [x] 真实浏览器验证(worktree vite :3101 + dev 后端 :8080,Playwright chromium headless):
- A 原例:admin(user 4)+ 预置 `active_session='sess-001'` + purge 版本 key 已写 → 37 API 全 2xx、phantom=0、4xx5xx=0、残留 key 被清除;
- B 变体:`sess-cusa-001` 同样清除、phantom=0;
- C 回归:author(有真实会话)+ 预置 `sess-002` → 56 API 全 2xx、正常激活真实会话 `sess-p6020-u60`(真实 id 不误清)。
6. [x] 合入 dev — integrate prepare/validate/integrate 规范流程;dev `87db3621`→`36c5fb54`(--no-ff,first parent=D,validate 收据 ea2681ee)。
7. [x] dev 主入口(:3100,frp 用户同一入口)实际运行复验 — admin + 预置残留 `sess-001` + purge 版本 key 已写:37 API 全 2xx、phantom=0、4xx5xx=0、残留 key 被清除。
8. [x] 清理 worktree、收口 — ISSUES.md 更新 resolved、任务终态、CURRENT 置 done。
## 验证与证据
验证日期 2026-09-27;被测代码:worktree `fix/frontend-demo-fallback-2026-09-27-r3`(基准 dev `87db3621` + 本修复);环境:dev 后端 `127.0.0.1:8080`(ENV=dev 裸进程)+ worktree 独立 vite `:3101`(proxy /api → 8080)。账号:admin(本机 `.env`)与 author `e2e26_author_mui2xpg2`(来源 `2026-09-26-full-system-browser-e2e/audit-login-credentials.md`,凭证不入库)。
| 范围 | 命令与环境 | 预期 | 实际 / 判定 | 证据 |
|---|---|---|---|---|
| 单测(新增) | `npx tsx --test src/data/storageActiveSession.test.ts` | 3 pass | **PASS**:legacy 清除+返回 fallback、真实 id 不误清、SSR 安全 | 控制台输出(本节) |
| 单测(全量) | `npm test`(worktree) | 全绿 | **PASS**:node:test 515 pass/0 fail;vitest 34 pass/0 fail | 控制台输出 |
| 构建 | `npm run build`(off/on 双模式) | 成功 | **PASS**:66 组产物预压缩 ×2 | 控制台输出 |
| 原例(修复后) | 场景 A | 0 假请求 | **PASS**:37 API 全 2xx,phantom(sess-001)=0,key 被清除 | SUMMARY 输出(下附) |
| 同类变体 | 场景 B(sess-cusa-001) | 0 假请求 | **PASS**:37 API 全 2xx,phantom=0 | 同上 |
| 正常行为回归 | 场景 C(author,真实会话) | 不受损 | **PASS**:56 API 全 2xx,激活真实会话 | 同上 |
```text
SUMMARY: [{"phantom":0,"bad":0,"total":37,"activeAfter":""}, // A: admin + sess-001
{"phantom":0,"bad":0,"total":37,"activeAfter":""}, // B: admin + sess-cusa-001
{"phantom":0,"bad":0,"total":56,"activeAfter":"sess-p6020-u60"}] // C: author 回归
```
注:临时验证脚本未入库(/tmp 已删);worktree 独立 vite :3101 已停。
## 经验小结(补充 ISSUE-20260927 经验)
- 触发条件:持久化读取路径存在"旧版本可写入、新版本不校验"的值域(本例 active_session)。
- 机制:一次性 purge(版本 key 幂等)无法覆盖"purge 之后旧代码写回"的窗口;localStorage 已存值优先于 fallback,修掉 fallback 常量不影响已持久化的值。
- 应做检查:修复"假 ID 产生请求"类问题时,区分生成路径与持久化路径;对读取侧加值域校验(与 messages 的 legacyIds 同源),验证必须覆盖"老浏览器残留值"状态而非仅空 storage。
- 验证方法:预置残留 localStorage(含 purge 版本 key)+ 无可见会话账号登录,统计 Network 假请求。
## 收口与交接
- 剩余工作:无(授权范围验收全部满足)。后续可选项维持上轮结论:activeDocId 的 doc-001/5201/3 本地选择残留(无 API 请求,非本 bug);独立 lesson 文件补登。
- 状态分别记录:
- 本地提交:`739b8c56`(fix)+ `083c63bb`(docs,任务分支 fix/frontend-demo-fallback-2026-09-27-r3)。
- dev 合入:`36c5fb54`(candidate --no-ff)。
- 实际运行版本:dev vite :3100 热载 `36c5fb54` 工作区代码,复验 PASS。
- 远端同步:not_requested(用户未要求 push)。
- 清理:任务与候选 worktree 已按规范 remove(本节下方登记)。
@@ -0,0 +1,129 @@
---
title: "前端 demo fallback 在真实 dev 环境产生 404/403"
task_id: "frontend-demo-fallback-2026-09-27-r2"
status: done
created: 2026-09-27
updated: 2026-09-27
owner: pi
task_type: implementation
task_tier: small
policy_revision: "agent-governance-2026-09-21-r1 @ dev 56928ac2068fac3cc2a06efdc77d39717a6616f9"
branch: fix/frontend-demo-fallback-2026-09-27
worktree: .worktrees/frontend-demo-fallback-2026-09-27
base_dev_sha: "56928ac2068fac3cc2a06efdc77d39717a6616f9"
write_scope: ["web/src", ".doc/ops/short-term"]
allowed_environments: ["dev-readonly", "dev-browser-verify"]
head_sha: "db038aa7a7e883b3d7b3597a10bcc7a5a25608b8"
mutex: "web-chat-fallback"
review_state: not_required # 小任务;验证契约前端范围全过,无独立评审请求
integration_state: merged # dev 0de657f0(merge candidate integrate-frontend-demo-fallback-2026-09-27-r2,validate 收据 85420f37)
deployment: passed # dev vite :3100 热载新代码后真实浏览器复验 phantom=0/404/403=0(2026-09-27)
cleanup: done
cleanup_owner: "独立集成/维护执行者"
cleanup_trigger: "owner 退出且 dev 合入+验收证据齐备"
remote_sync: not_requested
---
# 前端 demo fallback 在真实 dev 环境产生 404/403
## 用户目标与授权
- 用户目标/授权来源:用户报告 dev 页面(frp-mix.com:58880)登录后控制台 7 个 API 404/403;会话中明确授权"按照规范进行修复,测试完成后合入 dev,清理 worktree"。
- 交付终点:修复合入 dev、dev 实际运行验证通过、worktree 清理。
- 禁止项:不 push 远端;不动 test/main;不改后端(本 bug 根因在前端 fallback)。
- 例外:无。
## 问题事实与根因(2026-09-27 排查)
- 现象:登录后首屏 `GET /api/v1/projects/1`、`/projects/1/settings`、`/chat/messages/window|categories|dates|unread?session_id=sess-001` 404;`/intent-plans/active?project_id=1` 403。
- 链路核实:frp-mix.com:58880 → vite dev :3100(proxy /api → 127.0.0.1:8080)→ `bin/agent-server`(ENV=dev,2026-09-26 构建/启动,裸进程非 compose)。后端路由全部存在。
- 数据核实(dev PG :5433 只读):`projects` 20 行无 id=1;`project_members` 无 project 1 成员;`chat_sessions` 80 行无 `sess-001`;user_id=4=系统管理员(真实登录用户)。
- 根因:demo seeds 关闭模式(vite 未设 `VITE_ENABLE_DEMO_SEEDS`,后端 `SEED_DEMO_USERS=false`)下,前端残留 demo 假设硬编码:
- `web/src/App.tsx:138` `loadActiveSessionId('sess-001')`——无本地会话时激活不存在的 demo 会话;
- `web/src/App.tsx:206` `currentProjectId` fallback `1`——找不到会话项目时默认不存在的项目 1。
- 为何防护未拦:`storage.ts` legacy 清理只过滤 messages 的 legacy sessionId(:121),不清 `activeSessionId`;`purgeDemoSeedsFromLocalStorage` 清 localStorage 但 fallback 常量会再生成假请求。
- 状态码差异属既有设计:`projects/:id` 对"不存在或无权限"统一 404;`intent-plans/active` 走 authorizer 映射 403。
- 功能影响:新登录用户首屏噪音 + chat 回退本地缓存;无数据损坏证据。
## 同类排查
- grep 全前端:`sess-001` 残留仅 App.tsx:138 一处(storage.ts:121 为正确防御);projectId fallback `1` 仅 App.tsx:206 一处。
- 观察不扩大范围:`App.tsx` activeDocId fallback 的 `doc-001`/5201/3 为 demo 残留,但仅影响本地文档选择、不发 API 请求,不属于本 bug(控制台 404 均为 API 请求);记录待后续清理。
- ISSUES.md 无同类记录(检索 404/demo 残留/purge 无命中)。
## 相关问题与经验
- issue_ids:本次新增 ISSUE-20260927-demo-fallback(登记于 ISSUES.md)。
- 开工检索:`404 fallback`、`sess-001`、`demo 残留`,lessons 无命中;采纳验证契约"问题修复回归范围"节。
- 收口经验:见闭环更新(ISSUES.md + 本文档验证节)。
## 修复方案(A:改共用 fallback 机制)
1. `App.tsx:138` `loadActiveSessionId('sess-001')` → `loadActiveSessionId()`:demo 开启时仍取 `NEUROPULSE_ACTIVE_SESSION_ID`,关闭时为 `''`(disabled 模式导出空串)。
2. `App.tsx:203-208` `currentProjectId` fallback `1` → `0`,注释同步。
3. 不需新增空态分支:`chatBlockedNoProject`(App.tsx:249)已含 `currentProjectId <= 0`,ChatColumn 渲染"请先创建或加入项目后再开始对话";会话纠正 effect(App.tsx:268-277)在可见会话出现时自动恢复 activeSessionId。
4. 下游 guard 已核(空 sessionId/projectId=0 不发请求):getProject/settings/lineage effect(:397,:421)、useChatWindow(:120)、useUnreadMarks(fetchUnread 顶部)、categories/dates effect(:1037)、intent-plans effect(:1060)。
## 步骤与验收
1. [x] 根因与同类排查 — 本文档上文。
2. [x] 实施修复 — App.tsx 两处改动(:138 fallback 去常量、:206 projectId fallback 0)。
3. [x] `web/` `npm test`、`npm run build` — 全绿(含 demo on/off 双模式构建)。
4. [x] 真实浏览器验证 — 修复前 9 假请求复现 / 修复后 0(author+member 双账号);老用户回归无新增 404/403。
5. [x] 合入 dev — integrate prepare/validate/integrate 规范流程;dev `56928ac2`→`0de657f0`(--no-ff,first parent=D)。
6. [x] dev 实际运行验证 — 主目录 vite :3100(frp 用户入口同一 server)热载新代码,空 storage 登录 phantom=0、404/403=0、工作台正常。
7. [x] 清理 worktree、收口 — 详见收口节。
## 验证与证据
验证日期 2026-09-27;被测代码:worktree `fix/frontend-demo-fallback-2026-09-27`(基准 dev `56928ac2` + 本修复);环境:本机 dev 后端 `127.0.0.1:8080`(ENV=dev,agent-server 裸进程)+ 独立 vite :3101(worktree 代码,proxy 同源配置)。浏览器:Playwright chromium headless(brew 用户态补齐运行库);账号:dev 本地审计 e2e 账号(凭证不入库,来源 `.doc/test-reports/assets/2026-09-26-full-system-browser-e2e/audit-login-credentials.md`)。
| 范围 | 命令与环境 | 预期 | 实际 / 判定 | 证据 |
|---|---|---|---|---|
| 前端单测 | `npm test`(worktree,node_modules 链接主目录) | 全绿 | **PASS**:tsx 512 pass/0 fail;vitest 34 pass/0 fail | 控制台输出(本节记录) |
| 前端构建(demo off) | `npm run build` | 成功 | **PASS**:built 无错误,66 组产物预压缩 | 控制台输出 |
| 前端构建(demo on) | `VITE_ENABLE_DEMO_SEEDS=true npm run build` | 成功(alias 切换不破坏类型) | **PASS**:✓ built in 9.40s | 控制台输出 |
| 原例复现(修复前对照) | 空 localStorage 登录主目录 :3100(旧代码) | 复现假请求 | **复现**:9 个 phantom(projects/1×4→403、sess-001×4→404、intent-plans 403);与用户报告一致 | Network 抓取清单(下附) |
| 原例修复(修复后) | 空 localStorage 登录 worktree :3101(新代码) | 零假请求 | **PASS**:phantom=0,404/403=0,工作台正常渲染,84 个真实 API 全 2xx | 同上 |
| 同类变体(第二角色) | member 账号同样流程 :3101 | 零假请求 | **PASS**:phantom=0,404/403=0,83 API 全 2xx | 同上 |
| 正常行为回归(老用户) | 同一 author 账号在 :3101 登录后真实会话/项目加载 | 不受损 | **PASS**:会话纠冀 effect 选真实会话,项目/文档/血缘 API 全 2xx | 同上 |
| 边界:demo enabled fallback | 代码审查 `loadActiveSessionId()` 无参路径 | demo 开启时仍回退 NEUROPULSE_ACTIVE_SESSION_ID | **PASS**:`fallback || NEUROPULSE_ACTIVE_SESSION_ID || ''` 优先级保留 demo 值 | 代码 diff + demo on 构建通过 |
修复前对照抓取(:3100,旧代码,author 账号):
```text
phantom: /api/v1/projects/1, /projects/1/settings, /projects/1/lineage,
/projects/1/documents?category=workflow, /chat/messages/window?session_id=sess-001&days=7,
/chat/unread?session_id=sess-001&user_id=60, /chat/categories?session_id=sess-001,
/chat/dates?session_id=sess-001, /intent-plans/active?project_id=1&session_id=sess-001
→ 403×5(project 1 无权限), 404×4(sess-001 不存在)
```
修复后(:3101,新代码,同账号 + member 变体):`phantom=0;404/403=0;workbench 正常渲染`。
注:临时验证脚本未入库(/tmp 与 web/ 下临时文件已删);worktree 独立 vite :3101 已停。用户报障中 `projects/1→404` 与本地复现 `→403` 的差异仅因报障账号(user 4 系统管理员)对该项目访问落在本项目不存在分支,两状态码均属既有「不存在或无权限」映射,非另改行为。
## 经验小结
- 触发条件:前端存在 demo/生产双模式(构建期 alias 切换)且模式专属常量进入运行时 fallback 路径。
- 机制:fallback 优先级高于模式开关清理逻辑;purge/legacy 清理只处理 storage 残留,无法阻止常量重新生成假 ID,首屏即对真实后端发请求。
- 应做检查:关闭模式的默认值必须是空值/由服务端数据驱动,不得硬编码业务对象 ID;模式常量 grep 其在非模式代码(App/入口/hooks)的引用;新用户首屏用空 storage 真实浏览器验证 Network。
- 错误做法与原因:只加 storage 清理不清理 fallback 常量(本例现状);只验证 demo 开启路径。
- 验证方法:修复前后同流程对照(本任务 before 9/after 0)+ 双模式构建 + 第二角色变体。
- 适用边界:前端双模式常量;同类见 App.tsx activeDocId 的 doc-001/5201/3 残留(仅本地选择无 API 请求,待后续清理)。
- 独立 lesson 文件待后续覆盖 `.doc/ops/lessons/` scope 的任务补登;本节为可检索替代。
## 收口与交接
- 剩余工作:无(授权范围验收全部满足)。后续可选项:activeDocId 的 doc-001/5201/3 本地选择残留(无 API 请求,非本 bug);独立 lesson 文件补登(需覆盖 lessons/ scope 的任务)。
- 状态分别记录:
- 本地提交:`db038aa7`(任务分支 fix/frontend-demo-fallback-2026-09-27)+ 本收口提交。
- dev 集成:merged,dev `0de657f0`(validate 收据 run 85420f37-2e99-4c9b-b72c-277d7203efe9,SHA `0de657f0`)。
- 部署制品:dev 前端为主目录 vite dev server(热载,无镜像制品);后端二进制未变更(纯前端修复)。
- 远端:not_requested(用户未要求 push;本地 dev 前进,origin/dev 未动)。
- cleanup:任务与 integrate 两个 worktree 均按规范 remove + 分支删除。
- 本次影响:App.tsx 两处 fallback;新登录用户首屏不再发 9 个假请求;demo 开启构建不受影响。
## 相关链接
- ISSUES.md 新增条目:ISSUE-20260927-demo-fallback。
@@ -0,0 +1,80 @@
---
title: "dev→test 晋升(rc-v1.1.0-beta.4)与 test 单二进制化"
task_id: test-single-binary-2026-09-27
status: in_progress
created: 2026-09-27
updated: 2026-09-27
owner: pi
task_type: ops
task_tier: multi_stage
policy_revision: "AGENTS+worktree-ops @ 05d45022"
branch: feature/test-single-binary-2026-09-27
worktree: .worktrees/test-single-binary-2026-09-27
base_dev_sha: "05d45022b142a8a4c64a001618f6691093447f01"
write_scope:
- scripts/migrate-test-db.sh
- scripts/launch-single.sh
- .doc/ops/short-term/2026-09-27-test-single-binary.md
- .doc/test-reports/2026-09-27-test-single-binary-test-report.md
- .doc/test-reports/assets/2026-09-27-test-single-binary
- .doc/ops/CURRENT.md
allowed_environments: ["dev", "test"]
capabilities: [docs:publish, env:dev, env:test, git:dev, git:test]
mutex: env:dev+env:test+git:dev+git:test
review_state: pending
integration_state: pending
deployment: pending
cleanup: pending
remote_sync: not_requested
---
# dev→test 晋升与 test 单二进制化
## 用户目标与授权
- 用户目标:把 `dev` 合入 `test`;并将 test 环境转换为单二进制服务(与 dev 同形态)。
- 授权来源:用户本会话明确指令(含 test 晋升与环境写操作)。未要求 push,远端同步不做。
- 交付终点:test 分支 rc 晋升 + test 环境以单二进制形态运行并通过验收;任务记录、测试报告、CURRENT 收口。
## 背景与方案
- dev 已于 2026-09-24 完成单二进制化(localpg managed :5433 + PI sidecar :18865 + `launch.sh --no-docker`);设计文档 P6 即 test 部署演练。
- 当前 test 仍为 4 容器(app/events/pi-agent/system-pg,schema 66);dev 领先 test 273 提交(dev schema 76)。
- 方案(遵循设计 §4.2,PG 取 managed——单机测试机):
1. 脚本落地:`scripts/migrate-test-db.sh`(复用参数化的 migrate-dev-db.sh,钉 test 默认值)+ `scripts/launch-single.sh`(非 dev 环境单二进制启动入口:SYSTEM_DB_*→CONTEXT_DB_* 映射、环境专属 sidecar、无 Vite)。
2. 脚本合入 dev 后跑全面门禁(arch-check / go vet / go test -short / npm test+build / scripts unittest)。
3. 真实 PI nightly(五例)@ dev tip → promotion receipt(PASS + digests)。
4. 晋升:任务 worktree 制备候选 M(P1=旧 test tip,`--no-ff` 合 dev tip)→ validate → `git:test` 租约内 update-ref + `rc-v1.1.0-beta.4` + candidate-images-apply test(compose 镜像 pin 保留为回滚路径)。
5. test 转换(`env:test` 租约,主目录执行):S0 快照 → `migrate-test-db.sh`(容器 dump → localpg :5434,PGDATA=data/test/pg,停 system-db 容器、volume 保留)→ 停 app/events/pi-agent 容器 → 从 rc tag `git archive` 构建 `bin/agent-server-test`(sha256 入报告)→ `launch-single.sh test`。
6. 验收:/health /ready(schema ≥76)、embed SPA :8081、PI sidecar health、test 真实 Runner 聊天链路、回滚路径说明。
- 端口/数据/模型:8081 / 5434 / 18866;data/test;MiniMax-M2.7-highspeed(现行 test pin,configs/.env.test);SEED_DEMO_USERS=false。
## 非目标
- main 环境任何变更;FAV live 放量;push 远端;改 gap-matrix 门禁结论(仅按既有模式追加本轮证据区段)。
- 前端/后端业务代码改动(如遇门禁失败按问题处理流程另立 fix 任务)。
## 相关问题与经验
- 问题台账/经验检索:「单二进制/localpg/no-docker」无直接命中;采纳 `LESSON-20260927`(隔离库配方、避开 5433/5434/5435 子串端口——隔离 gate-pg 用 5436;worktree 测试显式钉 DB)。
- 遗留现场(本任务发现的待收口,非本任务造成):`integrate-upload-doc-access-2026-09-27` 仍 active,其 env:dev 租约有 recovery_required run(进程组含在运行的 dev agent-server PID 2636482,不能回收);dev server 正常服务中。处置:本任务收口时经 launch.sh 重启 dev server 脱离旧进程组后 recover 并关闭该任务,或登记给后续维护者。
## 步骤与验收
1. [x] 建 worktree / 注册 / CURRENT 认领
2. [x] 脚本落地(migrate-test-db.sh / launch-single.sh)
3. [ ] worktree 验证(bash -n、scripts unittest、门禁套件)
4. [ ] 集成入 dev(候选 + validate + integrate)
5. [ ] dev tip 全面门禁 + nightly 真实 PI + receipt + candidate images
6. [ ] test 晋升(候选 M + rc-v1.1.0-beta.4)
7. [ ] test 单二进制转换 + 验收
8. [ ] 报告 / CURRENT / 收口
## 验证与证据
见 [测试报告](../../test-reports/2026-09-27-test-single-binary-test-report.md)(执行后填写)。
## 收口与交接
- 分别记录 review_state / integration_state / deployment / cleanup / remote_sync。
- 回滚(任一步失败且不可前滚时):容器路径 `docker compose -f docker-compose.test.yml -p agent-test up -d`(volumes 未删);DB 回滚用 S0 快照 restore 到容器 PG。
@@ -0,0 +1,112 @@
---
title: "上传文档跨端不可访问:源文件元数据与正文服务端持久化修复"
task_id: "upload-doc-access-2026-09-27"
status: done
created: 2026-09-27
updated: 2026-09-27
owner: pi
task_type: implementation
task_tier: small
policy_revision: "agent-governance-2026-09-21-r1;dev a0e40919a7ef7b97d612d006aa879cf829e5b796"
branch: fix/upload-doc-access-2026-09-27
worktree: .worktrees/upload-doc-access-2026-09-27
base_dev_sha: "a0e40919a7ef7b97d612d006aa879cf829e5b796"
write_scope: ["internal/freedoc", "internal/server", "deploy/postgres/goose", "web/src", "web/package.json", "web/e2e", ".doc"]
allowed_environments: []
head_sha: "307e9e6569882bef50c02e442712430b099d9274"
mutex: "freedoc+web-upload"
review_state: not_required
integration_state: merged
deployment: passed
cleanup: pending
cleanup_owner: "独立集成/维护执行者"
cleanup_trigger: "owner 退出且 dev 集成验收完成后复查"
remote_sync: not_requested
---
# 上传文档跨端不可访问:源文件元数据与正文服务端持久化修复
## 用户目标与授权
- 用户目标:登录测试用户账户后发现上传的私密文档无法访问,查看时显示注册占位模板(`upload-mui2xpg2` / 上传人 E2E编制-mui2xpg2 / 文件大小 0 KB / 文档概述与背景…),此前人工测试亦大量出现;要求定位并修复。
- 授权来源:用户在本会话中对「开任务 worktree 实施修复(方案 1+2+3 一起做)」回复「授权」。
- 交付终点:代码与迁移在任务 worktree 完成并通过验证;dev 集成与环境验证按门禁另行执行(本任务记录集成状态)。
- 禁止项:默认不 push;不操作 test/main/共享 KB;分析阶段不含业务实施(已进入实施)。
## 根因(已证实)
1. **上传注册正文是占位模板**:`web/src/lib/uploadFreeformRegister.ts` 的 `buildUploadRegistrationMarkdown` 生成的模板是服务端唯一持久化的"文档内容"。
2. **文件二进制不落服务端(文本类)**:`useSendMessage` 仅对非 TEXT_EXTS 扩展名调用 `uploadProjectAsset` 登记 CAS;txt/md/csv/json 等只存浏览器 IndexedDB + 内存 fileRaw。非文本文件虽入 CAS,但 MinerU 解析结果只进知识库,不回写文档正文。
3. **元数据不落服务端**:`freeform_documents` 表无文件名/大小/mime/asset_id 列;`useServerDocumentSync` 恢复的 deliverable 无 `sourceType/fileMeta`,`DocumentPane` 的 `isUploadedFile` 启发式五条件全部不命中 → 走普通 AST 编辑器 → `fetchFreeformDoc` 渲染占位模板。触发条件:换浏览器/换设备/清存储/其他成员查看共享文档。
4. **"0 KB"**:`InputArea` 用 `(file.size/1024).toFixed(0)`,<512B 文件四舍五入为 0,且被烘焙进持久化占位 markdown(E2E txt 仅约 41 字节)。
5. **E2E 盲区**:`FS-UPLOAD-01` 只断言注册出 `doc-free-*` pane,不校验跨会话内容可见性。
## 方案
- 迁移 `00076`:`freeform_documents` 增加 `source_filename/source_mime_type/source_size_bytes/source_asset_id`(软关联 CAS `file_references`,不加 FK)。
- freedoc:Create/Get/List 读写上述列;负值参数拒绝(ErrInvalidParam);Summary 带出元数据。
- 前端上传编排(`useSendMessage`):注册前先 CAS 登记全部附件(去掉 TEXT_EXTS 排除)并预读文本正文;注册时携带元数据与 asset_id;文本正文嵌入注册 markdown(`## 1. 文档正文(上传原文)`)。
- 跨端恢复(`useServerDocumentSync` → 新 `lib/freeformDocSync.ts`):按服务端 summary 恢复 `sourceType: 'uploaded_file'` 与 `fileMeta`(含 assetId/sizeBytes),DocumentPane 路由回 FilePreviewPanel,经 CAS raw 端点恢复原件预览。
- 大小显示:新 `lib/fileSize.ts` `formatFileSize`(B/KB/MB,任何正数不显示 0)。
- E2E:新增 `FS-UPLOAD-02`(全新浏览器上下文登录同账户,断言真实文件正文可见且占位句消失)。
## 范围与非目标
- 允许写入:internal/freedoc、internal/server(无需改动,请求透传)、deploy/postgres/goose、web/src、web/e2e、.doc。
- 非目标:MinerU 解析结果回写文档正文(二进制文件正文仍为占位+原件预览,属后续增强);历史已损坏数据(既无元数据也无 CAS 原件的旧上传文档)不可恢复,仅保持现状。
## 相关问题与经验
- 开工检索:ISSUES.md 检索「上传/upload」,命中 ISSUE-20260924-non-author-400-duty(权限问题,机制无关,未采纳);lessons INDEX 无上传链路相关命中。
- 待验证候选(本次发现、非本任务因果链):`TestCreateDocument_PG_ClientKeyIdempotentAndLedgerSurvivesNewService` 在全新隔离库(goose 76 + 全部 init SQL)上于基线 dev HEAD 同样失败(rev2 跨服务水合 HeadRevisionNo=0),疑似 docrevision 水合依赖未满足或用例自身问题;需独立排查后按闭环规范登记。
## 步骤与验收
1. [x] 迁移 00076 + freedoc 元数据读写 — 隔离库迁移到 76 通过;单测/PG 测试通过。
2. [x] 前端注册编排与跨端恢复 — tsc、npm test(525+34 PASS)、npm run build 通过。
3. [x] E2E 用例 FS-UPLOAD-02 编写并入选例清单 — `playwright --list` 含该用例;真实执行见下。
4. [x] dev 集成 — 候选 `86efba2c`(父1=a0e40919、父2=307e9e65);validate 收据 `b6fab208`(vet/arch-check/全量 short/freedoc PG/web test+tsc 全绿);integrate 收据 `94991da2`,dev 前进至 86efba2c。
5. [x] dev 环境部署验证 — `build-single-binary.sh`(embed dist @86efba2c)+ `launch.sh --no-docker` 重启(env:dev 租约 op `510f105a`);/health 与 /ready schema=76 ok;新进程 pid 2636482。
6. [x] 真实浏览器验收 — dev 环境 5 用例 PASS:FS-IAM-01/02、FS-PROJ-01、FS-UPLOAD-01、**FS-UPLOAD-02(全新浏览器上下文可见真实正文)**;DB 核验 source_filename/mime/size=50/asset_id=1243、正文含上传原文。
## 验证与证据
| 范围 / 被测 SHA | 命令与环境 | 预期 | 实际 / 判定 | 证据 / 脱敏说明 |
|---|---|---|---|---|
| Go 迁移链(worktree HEAD) | 隔离 PG(docker pgvector:pg16,127.0.0.1:5599,一次性容器)`go run ./.tmp/migrate <dsn>` + system/docgov/context_init.sql | 迁移至 76 无错 | PASS(schema_version: 76) | 容器用后即删;DSN 仅本机随机端口 |
| freedoc 单元+PG | `TEST_DATABASE_URL=<隔离库> go test ./internal/freedoc/ -count=1 -v` | 全 PASS | 除下方预存在失败外全 PASS | `TestCreateDocument_PG_ClientKeyIdempotentAndLedgerSurvivesNewService` 失败:基线 dev HEAD 在同一隔离库同样失败,判定预存在、与本任务无因果(见"相关问题") |
| Go 全量门禁 | `go vet ./...`;`./scripts/arch-check.sh --mode block`;`go test -short ./...`(TEST_DATABASE_URL/CONTEXT_DB_* 指向隔离库) | 全绿 | vet 无输出;arch-check "production gate passed";short 69 包 ok,仅上述预存在失败 | — |
| 前端 | `npm test`;`npm run build`(web/) | 全 PASS | 525(node:test)+34(vitest)PASS;build 成功 | — |
| E2E | `npx playwright test --list` | 含 FS-UPLOAD-02 | PASS(枚举) | 真实浏览器执行需 dev 环境运行新代码后补跑 |
环境说明:worktree 无 `.env`,`config.Load` 默认 DSN 指向 dev 库(127.0.0.1:5433);首次误跑 `TestFreeformDoc_DatabaseIntegration` 曾写入 dev 库测试数据(chat_messages 297–301、user 101 若干软删 doc,session 前缀 `sess-db-freedoc-*`,与该测试在主目录运行的既有行为一致)。后续全部测试改用隔离库环境变量。
## 集成与环境证据
- 候选验证收据:`agentctl validate` run `b6fab208-b9df-47e0-ba41-c7bf37b22d83` @ `86efba2c`(VET_OK / ARCH_OK / GO_SHORT_ALL_OK / FREEDOC_PG_OK / WEB_TEST_OK / WEB_TSC_OK;freedoc PG 套件排除 `TestCreateDocument_PG_ClientKeyIdempotentAndLedgerSurvivesNewService`,理由:基线 dev HEAD 在同配方隔离库同样失败,预存在、与本任务无因果,已登记候选)。
- 集成收据:`agentctl integrate` run `94991da2-f817-4f72-864b-099a50824837`,expected-dev `a0e40919`,dev → `86efba2c`。
- 部署:`bin/agent-server` 重建于 08:06(86efba2c),`launch.sh --no-docker` 重启;/health、/ready `schema_version=76`。
- 浏览器验收:`RUN_UI_ACCEPTANCE=1 playwright -g "FS-IAM|FS-PROJ-01|FS-UPLOAD"` 5/5 PASS(6.4s);证据 `.doc/test-reports/assets/2026-09-27-upload-doc-access-e2e/`(ui-results.json、run-meta、截图)。运行期间 env:dev 由本任务部署操作 `510f105a` 持有(launch nohup 分离致租约保持,无并发持有者)。
- DB 事实核验:`doc-free-1790496487674865360-69` → source_filename=upload-mujjdjp5.txt / text/plain / 50 B / asset_id=1243;版本正文含「E2E upload body」原文。
## 过程事件(如实记录)
1. **误连 dev 库两次**:worktree 无 `.env` 时 `config.Load` 默认 DSN 指向 127.0.0.1:5433 dev 库。07:37 freedoc 测试误写 chat_messages 297–301(`sess-db-freedoc-*`)与 user 101 若干软删文档;07:53 首次 validate(未设 CONTEXT_DB_*)经 server 测试触发迁移,dev 库被应用到 schema 76(内容与随后合入 dev 的 00076 完全一致)并留下合成残留:project id=1「受控工程研发项目」、doc_proj1_intake/doc_proj1_cleanroom_spec(drafting)、user 101 文档一条。历史业务数据核对无损(21 项目/64 用户/320 消息,9/26 E2E 数据俱在)。残留未删除(删除属破坏性操作,留待授权清理);后续全部测试显式指向隔离库。
2. **E2E 证据目录误写**:spec 默认 ASSETS 指向 9/26 历史目录,本次运行覆写其 run-meta/截图/ui-results;已从 git 还原历史目录(0 差异),本次证据迁至 `assets/2026-09-27-upload-doc-access-e2e/`。后续运行应显式设 `UI_ACCEPTANCE_ASSETS_DIR`。
3. **预存在测试环境敏感**(候选登记,未立项):`TestCreateDocument_PG_ClientKeyIdempotentAndLedgerSurvivesNewService`、`TestPG_ActivationAndStageAdvance`、`TestWorkflowGovernance_PG_ActivateApproveAdvanceChain` 等在自建隔离库上基线同样失败("approved requires frozen review_snapshot_id"),疑依赖特定运行顺序/外部服务;隔离库配方:扩展 → goose 链 → 三个 init SQL(顺序反了 00001 会因 day_key 失败)。
## 遗留与限制
- 存量损坏数据不可恢复:修复前上传的文档(含用户报告的 `upload-mui2xpg2`)无服务端元数据与原件,仍显示占位模板;重新上传即可获得正确行为。
- 二进制(docx/pdf 等)文档正文仍为占位+原件预览;解析正文回写为后续增强。
- `readAttachmentsAsMaterials` 行为变化:文本附件现在优先以 asset_id 引用(此前 inline Base64);CAS 失败时回退旧行为。
## 收口与交接
- 剩余工作:无(授权范围内验收满足)。可选后续:二进制文件解析正文回写文档(非目标)、预存在测试敏感用例独立排查、dev 库合成残留授权清理。
- 本地提交 `307e9e65`(+本文档收口提交);dev 集成 `86efba2c`(含第二轮文档收口集成);部署制品 `bin/agent-server` @86efba2c 运行中;远端未同步(未要求 push)。
- cleanup:两个 worktree(任务 + 集成候选)保留,cleanup=pending,由独立维护者按门禁复查后处置。
## 相关链接
- 问题分析见本文件"根因"节(用户会话内交付)。
@@ -0,0 +1,204 @@
---
title: "对话办公能力扩展整改计划(P0–P3)"
status: planned
created: 2026-09-25
updated: 2026-09-25
owner: Cursor
task_id: dialogue-office-expansion-2026-09-25
policy_revision: cursor-governance-2026-09-24-r1 @ 44161d2ad2d7aada3e9ff88127b52148543278e5
review_state: pending
integration_state: pending
deployment: not_required
cleanup: pending
remote_sync: not_requested
---
# 对话办公能力扩展整改计划(P0–P3)
## 背景
配套调研:[对话办公能力全景盘点](../audit/2026-09-25-dialogue-office-capability-research.md)。
系统初衷是「对话辅助办公」。盘点显示:主链路多处假成功、intentflow 7 键 dry-run、查询意图硬编码兜底、大量 HTTP 写能力尚未进入对话通道。本计划分期打通 **真实执行 + 两步确认**,同时守住 **治理结构 UI 专属** 红线。
**本文件只交付方案**;P0–P3 实施各自另起 worktree/任务,不得在本调研任务内改业务代码。
## 目标
1. 用户在对话中对「办公写操作」得到的回复与后端权威状态一致(无假成功)。
2. 高风险写一律:识别分流 → 确认卡/PendingAction → `action_executor` / intentflow Owner → 领域服务二次鉴权。
3. 创建项目、成员、职责改派、工作流规划/激活/终止、admin 全域:**对话永久禁写**(可只读引导)。
4. 每期验收按 [验证契约](../ops/2026-09-21-validation-contract.md) 选层级;涉及产品 Agent 的写意图须真实 PI/对话全链路,禁止 stub 冒充 PASS。
## 边界红线(全期有效)
| 禁写(UI 专属) | 对话允许 |
|-----------------|----------|
| `POST /projects`;成员增改删 | 只读列成员 / 引导「请在项目设置操作」 |
| `PATCH …/duties` | 只读职责现状 |
| `PUT workflow-plan` / `active-workflow`;activate / terminate 实例 | 只读计划、`termination-preview`、运行态查询 |
| Admin 全域写(角色/用户/密码/publish·retire/config/maintenance/cleanup) | 无;命中 → `security.forbidden` |
| 系统/项目设置写 | 只读 settings GET |
**澄清**:`workflow.switch`(改激活工作流)∈ 禁写;`workflow.run`(创建运行)∈ 可对话操作。
## 复用样板(全期强制)
参考 `feature/doc-review-lifecycle-2026-09-25` @ `09fe9723`:
1. `recognizer_matchers_docgov.go` — 查询语气不进写路径
2. `card_policy.go` — 话语分类 + 角色×状态出卡
3. `engine_docgov.go` 确认分支 — PendingAction
4. `chat/action_executor.go` — 服务端二次鉴权后真写
新写意图禁止「Accepted + 成功文案」而无 GovernanceEngine / projectworkflow / taskrun 调用。
---
## P0 — 消除主链路假成功
### 范围
| 项 | Key | 动作 |
|----|-----|------|
| P0-1 | `document.claim` | 主链改调 docgov 真认领(对齐 intentflow U11 live);失败诚实报错 |
| P0-2 | `document.review.submit` | 主链改调 `SubmitForReview`;角色/状态门禁 |
| P0-3 | `document.proposal.decide` 默认分支 | 禁止假成功:缺确认则澄清卡;`confirm_*` 继续 PendingAction |
| P0-4 | `workflow.switch` | **诚实拒绝/引导 UI**(属 C 类);去掉「确认后我会切换」却无执行的期望环;识别层可映射 `unsupported` |
| P0-5 | `workflow.run` | 确认卡 + `CreateWorkflowRun`(对齐 U12);能力校验失败诚实拒绝 |
不在 P0:intentflow dry-run 键(→P1);查询硬编码(→P2);新意图(→P3)。
### 涉及文件(预期)
- `internal/coordinator/engine_docgov.go`(claim / submit / proposal decide)
- `internal/coordinator/engine_workflow.go`(switch / trigger)
- `internal/chat/action_executor.go`(若需新 PendingAction Kind)
- `internal/intent/recognizer_matchers_*.go` / `card_policy.go`(出卡与分流)
- 相关 `*_test.go`;必要时 Web `cardActionPolicy.ts` 对称
### 验收标准
- [ ] 五处路径:**无**「已成功」且领域状态未变的用例;失败返回明确 RejectReason
- [ ] claim/submit/run:真实环境对话两步确认后,HTTP GET / DB 可见状态变化
- [ ] switch:用户说「切换工作流」→ 明确引导 UI,**不**产生假 Pending 成功
- [ ] 回归:已有 approve/reject/final 确认卡路径不变坏
- [ ] 按验证契约跑适用套件;产品写路径用真实对话链路,报告入 `.doc/test-reports/`
### 交付终点
独立 feature 任务合入 local `dev`;本计划行标记 P0 `done`(实施任务更新,非本文自报)。
---
## P1 — intentflow dry-run 键 live 化
### 范围
将 `expansion.go` 中仍 dry-run 的键接到真实 Owner(与主链 PendingAction 语义对齐):
**DocGov 5**:`document.review.approve` / `reject` / `final.approve` / `final.reject` / `document.proposal.decide`
**Run-control**:
- `run.restart` → live(taskrun.restart + 确认)
- `workflow.switch` → **不** live 写 active-workflow;改为 Authorize 硬拒绝或路由 unsupported(与 P0-4 一致)
### 涉及文件(预期)
- `internal/app/intentflow/expansion.go`(Live 集合 / OwnerMux)
- `internal/app/intentflow/docgov_owner.go`、`run_control_owner.go`
- `internal/sysadmin/features.go`(U11/U12 flag 说明若需更新)
- `expansion_test.go` 等
### 验收标准
- [ ] 上述 5 个 docgov 键在 flag 开启时产生真实 receipt(非 `validated_only`)
- [ ] `run.restart` live;`workflow.switch` 拒绝写且有稳定错误码
- [ ] 计划执行与单意图主链对同一文档/运行:**最终状态一致**
- [ ] project 143 等既有 fail-closed 行为保留
---
## P2 — 查询意图接真实数据源
### 范围
| 查询 | 现状 | 目标 |
|------|------|------|
| `case.query` | 硬编码案例 | `ctxmgr.SearchSimilarCases` / KB;无数据诚实「暂无相似案例」 |
| `document.reject_reason.query` | 黑板 + default 文案 | 优先 `docgov` audit-logs / 文档状态上的驳回字段 |
| `document.status.query` | lifecycle 空模板 | 读 docgov document API / 摘要服务 |
| `run.status.query` / `workflow.status.query` | 上下文碎片 | 对齐 runs/instances GET 权威字段 |
| `project.advisory` 硬编码段落 | 默认项目名长模板 | 无简报时短诚实回复,禁止伪造项目事实 |
### 涉及文件(预期)
- `internal/coordinator/engine_query.go`
- `internal/coordinator/engine_workflow.go` / `engine_run.go`
- `internal/coordinator/card_policy.go`(`defaultRejectReasonText` 降级策略)
- 可选:薄封装读 repository,避免 coordinator 直接 SQL
### 验收标准
- [ ] 无数据/无权限时:**不**返回伪造项目号或伪造驳回理由
- [ ] 有数据时:与对应 GET API 字段一致(抽样对照)
- [ ] 单元测试覆盖空数据 / 有数据 / 权限不足
---
## P3 — 新写意图扩展(两步确认)
每项均需:新或扩展 ActionKey(若必要)→ 识别 matcher → 确认卡 → PendingAction/Owner → 服务端校验。优先复用已有 HTTP handler 背后的领域服务,**对话不二次裸调 HTTP**。
| 优先级 | 能力 | HTTP 锚点 | 备注 |
|--------|------|-----------|------|
| P3-1 | Trace 边裁决 / reopen / recheck clear | `…/trace/…/decision` · `reopen` · `recheck/…/clear` | 高价值办公闭环 |
| P3-2 | 补充批次确认 | `…/supplement-impacts/{id}/decision` | 已有补充意图,补确认写 |
| P3-3 | 意图计划裁决(对话侧补齐提示) | `…/intent-plans/{id}/decisions` | 已有双通道,强化可发现性 |
| P3-4 | 批注查询 + 有限写(添加/解决) | `docgov/comments` | 生命周期 worktree 已有部分;扩展查询与误触防护 |
| P3-5 | 审计查询(只读意图) | `docgov/audit-logs` | 属查询增强,可与 P2 并行切片 |
| P3-6 | 资产重解析 | `…/assets/{id}/reparse` | 确认后调用 |
| P3-7 | 通知已读/处理 | `PATCH …/notifications/{id}` | 低风险 |
| P3-8 | 自由文档沉淀(from-message) | `freeform-documents/from-message` 等 | **不含**项目创建;分享策略需产品确认 |
**明确不做(P3 也不做)**:成员/职责/项目创建/工作流规划发布/admin。
### 涉及文件(预期)
- `internal/intent/registry.go` + matchers
- `internal/coordinator/engine_*.go`(新建 `engine_trace.go` 等按模块)
- `internal/chat/action_executor.go`
- `internal/app/intentflow/*`(若进计划执行面)
- Web 确认卡策略对称文件
### 验收标准
- [ ] 每能力:误触防护用例(查询语气不写、无权限无危险按钮、确认前无副作用)
- [ ] 真执行后权威状态可观测
- [ ] 红线回归:说「创建项目/加成员/改设置」仍 forbidden/unsupported
- [ ] 真实 Agent 对话全链路报告
---
## 分期总表
| 期 | 主题 | 依赖 | 建议 mutex / feature |
|----|------|------|----------------------|
| P0 | 主链假成功 → 真执行/诚实拒绝 | 无 | `dialogue-office-p0` / 避开他人 `docgov` 硬 claim 或合并持有者 |
| P1 | intentflow 5+1 live(switch 拒绝) | P0 语义对齐更佳 | `dialogue-office-p1` |
| P2 | 查询真数据 | 可与 P1 并行(不同文件) | `dialogue-office-p2` |
| P3 | 新写意图 | P0 样板稳定后 | 按切片拆 task |
## 验收总则
- 纯文档期(本任务):链接、taxonomy、git 差异;**NOT REQUIRED** 产品 PI。
- 实施期:按验证契约矩阵选「对话写意图 / intentflow / 查询」行;报告 `.doc/test-reports/YYYY-MM-DD-dialogue-office-pN-…-test-report.md`。
- 禁止用 dry-run receipt、SKIP、stub 作为交付 PASS。
## 相关链接
- Audit:[2026-09-25-dialogue-office-capability-research.md](../audit/2026-09-25-dialogue-office-capability-research.md)
- 样板任务:doc-review-lifecycle(批注/重开/积压/送审)
- 验证契约:[2026-09-21-validation-contract.md](../ops/2026-09-21-validation-contract.md)
- gap-matrix:本轮**不**新增发布 blocker(能力增强,非生产阻断);若实施中发现安全假成功升级为 blocker,再另案更新
@@ -0,0 +1,51 @@
---
title: "对话办公 P0 验证记录"
created: 2026-09-25
updated: 2026-09-25
owner: Cursor
task_id: dialogue-office-p0-2026-09-25
status: done
policy_revision: cursor-governance-2026-09-24-r1
---
# 对话办公 P0 验证记录
配套:[整改计划](./2026-09-25-dialogue-office-expansion-plan.md) P0 · [研究](../audit/2026-09-25-dialogue-office-capability-research.md)
## 范围与授权
- 写路径:`internal/coordinator`、`internal/chat`、`internal/server`(Workflow 窄端口适配)
- 基线:建场 `7cfd6851`;本记录对应 feature tip 以提交收据为准
- **产品 PI 全链路**:本轮 **未运行**(`.doc/test-reports` 被并行任务占用;未获独立 PI 环境授权)。按验证契约「Go/接口」层以单测 + arch-check 验收;PI 对话写路径标为 **待补证**,不冒充 PASS。
## 验收对照(计划清单)
| 项 | 判定 | 证据 |
|----|------|------|
| 五处无「已成功」且状态未变 | PASS(单测) | `p0_fake_success_test.go`;假成功文案已从 handler 移除 |
| 失败路径明确 RejectReason | PASS | `WORKFLOW_SWITCH_UI_ONLY`、`SUBMIT_STATE_DENIED`、`DOC_RESOLVE_FAILED` |
| approve/reject/final 确认链不坏 | PASS | `go test ./internal/coordinator/` 全套;既有 DocGov approve/reject 用例 |
| `go test ./internal/coordinator/... ./internal/chat/...` | PASS | 见下方命令输出(跳过无关 flaky SemanticMemory) |
| 真实对话写路径 PI 报告 | 未运行 | 待获授权环境与 test-reports 写路径后补 |
## 实际命令与结果
```text
$ go test ./internal/coordinator/ ./internal/chat/ ./internal/server/ -count=1 -skip 'SemanticMemory|PiAgent|RealPI|E2E|PG_'
ok chat-agent-system/internal/coordinator
ok chat-agent-system/internal/chat
ok chat-agent-system/internal/server
$ ./scripts/arch-check.sh --mode block
arch-check block: production gate passed
```
## 接线说明
- 生产会话:`server.go` → `adaptChatWorkflow(s.pwSvc)` → `chat.WorkflowRunner`
- `chat` **不** import `projectworkflow`(边界门禁)
- `BindChatSession`(`internal/app`)当前无调用方;`u9u12-keys-rollout` 占用 app 时未改
## 结论
P0 代码与 Go/接口验收完成;**不合入 dev**(待用户集成指令)。产品 PI 对话写路径补证为收口后可选增强,不阻断本切片 code-complete。
@@ -0,0 +1,101 @@
---
title: "系统 Code Review P0/P1 修复(IDOR、门禁盲区、fail-open、命令白名单、validated_only 硬拒)"
status: done
created: 2026-09-26
updated: 2026-09-26
owner: pi
task_id: "system-review-p0-p1-fixes-2026-09-26"
severity: critical
source_audit: "../audit/2026-09-26-system-code-review.md"
base_dev_sha: "f4c1b73f28580ad3df6db4f9ec0a80057006e516"
---
# 系统 Code Review P0/P1 修复
来源:[2026-09-26 系统全面 code review](../audit/2026-09-26-system-code-review.md)(被审 tip `f4c1b73f`)。
用户授权(2026-09-26):修复 2 Critical(FIND-SEC-01、FIND-ARCH-01)+ 3 个 High 行(FIND-SEC-02/03、FIND-FLOW-01、FIND-QUAL-01),修复后与报告一起集成,清理任务 worktree。本文件是下列 issue 的唯一主记录;发现细节与证据链以来源审计为准,此处记修复方案、经过与验收。
## 修复范围与 issue 映射
| FIND | issue_id | 修复内容 | 状态 |
|---|---|---|---|
| FIND-SEC-01 | ISSUE-20260926-ctx-idor | GetUserContext 会话归属校验(handler 403 + SQL/内存双防线) | resolved |
| FIND-ARCH-01 | ISSUE-20260926-archcheck-untracked | arch-check 未登记表 fail-closed + 补登记 50 表 | resolved |
| FIND-SEC-02 | ISSUE-20260926-authz-failopen | Authorizer 无池严格拒绝;显式 NewInMemoryAuthorizer 接缝 | resolved |
| FIND-SEC-03 | ISSUE-20260926-swboot-shell-prefix | argv 化执行(去 sh -c)+ 白名单精确匹配 | resolved |
| FIND-FLOW-01 | ISSUE-20260926-intentflow-validated-confirm | Confirm 拒 validated_only + 执行器硬读 mode | resolved |
| FIND-QUAL-01 | ISSUE-20260926-dual-flags-drift | 组合根 flag 一致性 fail-fast | resolved(含残差) |
| FIND-QUAL-01(入口收敛残差) | ISSUE-20260926-governance-multi-entry | docgov 三入口 + Coordinator/OwnerMux 合并 | deferred |
| FIND-ARCH-02 | ISSUE-20260926-server-pool-wiring | server 持 Pool 直装 swboot(本轮未授权修复) | open |
## 各项修复经过
### 1. FIND-SEC-01 会话上下文 IDOR(ISSUE-20260926-ctx-idor)
- **根因**:`handleGetUserContext` 只校验 `user_id` 归属,`session_id` 直通 `GetUserContext`;`chat_messages` 查询 `WHERE session_id = $1` 无归属条件,绕过 chatflow 的会话授权。
- **修复**(双层):
- `internal/server/handlers_context.go`:sessionID 非空时经 `GetSessionOwnerID` 校验归属(不存在与归属他人同返 403,不泄露存在性)。
- `internal/ctxmgr/manager.go`:SQL 增加 `EXISTS(chat_sessions 归属目标用户)` 子句;内存分支按 `sessions[sessionID].UserID == userID` 过滤——未来调用方遗漏 handler 校验也不泄露。
- **回归**:`TestGetUserContext_OtherUserSessionDenied`(他户 session→403、不存在→403、本人→200 且含正文,内存 HTTP);`TestGetUserContext_PG_SessionOwnerFilter`(隔离 PG 库:他人视角 manager 层不返回正文、归属者正常)。
### 2. FIND-ARCH-01 arch-check 未登记表静默跳过(ISSUE-20260926-archcheck-untracked)
- **根因**:`internal/archtest/scan.go` `if !tracked { continue }`——表唯一写者门禁对未登记表(含 `swboot_controlled_executions`、`projects`、`outbox_events` 等)无强制力。
- **修复**:
- scan.go:未登记表产生 `sql_write` finding(fail-closed);仅豁免扫描正则已知假阳性词汇(`set/of/skip/below/row/state/step/doc/docgov/message/project/aggregation/ref_count`,来自 `ON CONFLICT DO UPDATE SET`、`FOR UPDATE OF/SKIP LOCKED` 与注释散文;静态清单,非策略豁免)。
- `module-boundaries.yaml`:补登记 50 张既有写者真实表。多 owner 条目(`projects`、`users`、`project_members`、`context_memory_chunks`)是现状快照,新包写入仍被 block;单一写者收敛留在各模块批次(见 ISSUES 残差说明)。
- **回归**:`TestUntrackedTableWriteIsBlocked`(新表写入必须 block 且 detail 提示登记);`TestUpsertSetKeywordIsNotFlaggedAsUntracked`(SET 噪音不误报)。全仓 `arch-check --mode block` PASS。
### 3. FIND-SEC-02 Authorizer 无池 fail-open(ISSUE-20260926-authz-failopen)
- **根因**:`IsProjectMember/IsProjectOwner` 在 `!enabled()`(pool==nil)时 `return userID > 0` ——任意登录用户获得任意项目访问;组合根始终 `NewAuthorizer(pool)`,nil pool 也构造成功,绕过「nil→failClosed」语义。
- **修复**:`NewAuthorizer(nil)` 一律严格拒绝(false);新增显式 `NewInMemoryAuthorizer()` 仅供 ALLOW_IN_MEMORY 演示/测试接缝(视任意登录用户为成员);组合根 `app.Assemble` 在 `pool==nil && cfg.AllowInMemory` 时选用。误配(无库且未显式声明)→ 拒绝。
- **波及与处置**:8 个依赖 fail-open 作测试接缝/隐式放行的既有用例——1 个改用显式内存授权 override,5 个业务行为用例改走 `newServerWithMemoryIAM`/`AllowInMemory=true`(显式演示模式契约),1 组 u5 用例补 `ModeLive`(属 FLOW-01 波及),1 个生命周期用例由组合根修复自然恢复。无削弱鉴权断言的用例。
- **回归**:`TestMembershipChecks_FailClosedWithoutPool`;隔离 PG 库 authz 套件(ConcurrentLastWriter/DocumentDuty/AtomicDutyRevoke/UpsertProjectMember)PASS。
### 4. FIND-SEC-03 swboot sh -c + 前缀白名单(ISSUE-20260926-swboot-shell-prefix)
- **根因**:受控命令经 `sh -c cmdLine` 执行;允许判定为 basename 前缀匹配(`go` 放行 `go-evil`)。ApproveMerge 自身恒拒未变。
- **修复**:`runCommand` 改 argv 化 `exec.CommandContext(fields[0], fields[1:]...)`(元字符只成为字面参数);`commandMatchesPrefixes`→`commandAllowed`,仅 basename 精确相等(含绝对路径条目取其 basename)。admin 白名单粒度仍是真实边界(报告 FIND-SEC-03 说明),运维登记白名单时应只放具体命令名。
- **回归**:`TestExecutor_CommandAllowlistIsExactNotPrefix`(前缀伪装拒绝、精确/绝对路径放行、空命令拒绝);`TestExecutor_NoShellEvaluation`(`echo x && touch <marker>` 不求值、marker 不产生、输出为字面参数)。
### 5. FIND-FLOW-01 validated_only 可 Confirm 后 dispatch(ISSUE-20260926-intentflow-validated-confirm)
- **根因**:`DecisionConfirm` 允许 `PlanProposed`;确认后 HTTP 即 `DispatchEligible`;`ExecuteClaimed` 不读 `ExecutionMode`——shadow「安全」依赖「没人点 Confirm」。
- **修复**(双层):
- `DecidePlan`:Confirm 对 `plan.ExecutionMode == validated_only` 一律 `ErrPlanModeNotConfirmable`(403)。
- `ExecuteClaimed`:硬读步骤级(缺省计划级)ExecutionMode,`validated_only` 一律 `ErrPlanModeNotExecutable`——覆盖所有派发路径(confirm 后、worker、误推进)。
- 新错误码 `PLAN_MODE_NOT_CONFIRMABLE` / `PLAN_MODE_NOT_EXECUTABLE` 入 `ErrorCode` 与 HTTP 映射。
- **回归**:`TestConfirmRejectedForValidatedOnlyPlan`;`TestExecuteClaimedRefusesValidatedOnlyStep`(经 DecisionContinue 误推进后 DispatchEligible 硬拒,步骤不成 succeeded、owner 零执行)。既有 4 个用例的 `draft()` helper 补显式 `ModeLive`(缺省 validated_only 是安全默认,live 机制用例需显式声明)。
### 6. FIND-QUAL-01 双套 flags 静默漂移(ISSUE-20260926-dual-flags-drift,含残差)
- **修复**:`intentflow.ValidateFlagConsistency`(组合根 `Assemble` 调用)——`PlanTier` 升档但 `MULTI_INTENT_ENABLED=false` 时启动期 fail-fast(`Assemble` 最早阶段调用),消除「intentflow 已升档、intent 仍关」静默漂移配置上线。
- **回归**:`TestValidateIntentFlagConsistency`(升档+开=过;legacy 恒过;四档×关=拒)。
- **残差(deferred,ISSUE-20260926-governance-multi-entry)**:docgov 三入口(chat PendingAction / docgov_owner / handlers_docgov)与 Coordinator ~40 intent case + OwnerMux 平行面合并是多日级重构(自带回归矩阵),超出本批授权合理范围;已在 ISSUES 登记 owner/触发条件。
## 验收汇总
被测 SHA:本任务 worktree HEAD(见下方提交记录);基线 `f4c1b73f`。
| 检查 | 结果 |
|---|---|
| `./scripts/arch-check.sh --mode block` | PASS(fail-closed 改动 + 50 表登记后) |
| `go vet ./...` | PASS |
| `go test -short ./...` | 全绿 |
| 隔离 PG:`TestGetUserContext_PG_SessionOwnerFilter` | PASS(临时库建删于 55432 verify 容器) |
| 隔离 PG:authz + server duty 套件 | PASS |
| 隔离 PG:duty-sync 脚本 | `TestHealProjectDocuments_SkipsDutyLocked_PG` FAIL——**基线 f4c1b73f 同样失败**(FK fixture 既有问题,与本批无关) |
| `TestPiAgent_FullLifecycle_MultiRole_RealWorld_E2E` | 非 short 模式因 KB 离线前置检查失败——**基线同样失败**(需真实 Runner/KB,非本批回归) |
## 部署
已部署(2026-09-26 用户授权):`launch.sh --no-docker` FORCE_BUILD 重建并重启 no-docker dev 服务(8080)。核验:
- binary `vcs.revision=1ceda34c`(= dev tip,含全部修复)
- `/health`、`/ready` ok;schema 75;PI sidecar 18865 健康
- 线上 IDOR 负例:他户读会话→403、`user_id` 覆写→403、未知会话→403;归属者→200 且正文完整
- 探测留痕(dev 业务库):probe 用户 `dpv_*`/`dpa_*`、项目 `probe-shape*`/`idor-live-probe-*`,属一次性验证数据
## 经验
见 [LESSON-20260926-failclosed-bypass-contract](../ops/lessons/2026-09-26-failclosed-bypass-contract.md):旁路入口必须继承主路径硬边界;门禁/执行器对「未知」默认必须拒绝。
+3
View File
@@ -2,6 +2,9 @@
| 文档 | 说明 |
|------|------|
| [2026-09-26-system-code-review-fixes.md](./2026-09-26-system-code-review-fixes.md) | 系统 code review P0/P1 修复主记录:IDOR、arch-check 未登记表 fail-closed(补登 50 表)、authz 无池 fail-open、swboot argv 化+精确白名单、intentflow validated_only 双层硬拒、flag 一致性 fail-fast;配套 [审计](../audit/2026-09-26-system-code-review.md) · [经验](../ops/lessons/2026-09-26-failclosed-bypass-contract.md) |
| [2026-09-25-dialogue-office-p0-verification.md](./2026-09-25-dialogue-office-p0-verification.md) | 对话办公 P0 验证记录:假成功消除单测 + arch-check;PI 补证待授权 |
| [2026-09-25-dialogue-office-expansion-plan.md](./2026-09-25-dialogue-office-expansion-plan.md) | 对话办公能力扩展 P0–P3:消除主链假成功、intentflow dry-run live、查询真数据源、新写意图(trace/补充确认/批注/资产等);治理结构 UI 专属。配套 [调研](../audit/2026-09-25-dialogue-office-capability-research.md)。planned,不实施代码 |
| [2026-09-23-coordination-db-daemon-implementation-undertaking-plan.md](./2026-09-23-coordination-db-daemon-implementation-undertaking-plan.md) | 协调库与 daemon **实施承接计划**(工作包预填):W1–W3 七包(U1r/U2/U3/U7/U4/U5/U6)含符号级锚点、真实并发验收、mutex、开工准入;L2 仅 ADR 前置门。配套 [设计方案](./2026-09-23-coordination-db-daemon-plan.md) · [任务](../ops/short-term/2026-09-23-coordination-db-daemon-impl-plan.md)。planned,不实施代码 |
| [2026-09-23-coordination-db-daemon-plan.md](./2026-09-23-coordination-db-daemon-plan.md) | 协调库与 daemon 分阶段方案:L1 单宿主机(复用 `.locks/state.sqlite` + claim/常驻入口/文档状态化);L2 跨机 PostgreSQL 仅 planned(需 ADR)。配套 [研究](../ops/research/2026-09-23-coordination-db-daemon-research.md) · [任务](../ops/short-term/2026-09-23-coordination-db-daemon.md)。U1 queue 子解析器已合入 `63e66c6f`;本文件 planned,不实施 daemon |
| [2026-09-21-agent-lock-coordination-plan.md](./2026-09-21-agent-lock-coordination-plan.md) | Agent `.locks`、共享文档与并行工作流补充方案:本机 SQLite + 会话/租约/CAS;L1a–L1d 设计。配套 [研究](../ops/research/2026-09-21-agent-lock-coordination-research.md)。planned;跨机锁服务本期不采用 |
+9 -9
View File
@@ -49,25 +49,25 @@
| record_id | 模块 | 声明范围 | 状态 | 发布关系 | 证据 | 剩余工作 / 关闭条件 | mutex |
|------|----------|------|----------|------|---------------------|-------|-------|
| dialogue-ctx-injection | 对话上下文注入 | 项目成员对话清洗分层注入小队 workspace 与助手 Prompt;冲突裁决+HITL 分级路由;默认 on 紧急可关 | partial | deferred_enhancement | [设计](../system-design/2026-09-25-dialogue-context-injection-design.md);[报告](../test-reports/2026-09-25-dialogue-context-injection-test-report.md);[短文](../ops/short-term/2026-09-25-dialogue-context-injection.md) | 关闭条件:dev 迁移 goose 00071 + 真实 PI 落盘核验 + 冲突确认卡冒烟。本行不升 done | `dialogue-ctx` |
| jevdecide-shadow | jev 产品决策 shadow/assist | jevdecide + coordinator realtime/ProfileTask;compose 默认 off;**local_dev 已开 assist**(`configs/.env.dev` → 172.17.0.1:8767);决策层漏检加成已对话验收 | partial | deferred_enhancement | [产品报告](../test-reports/2026-09-24-jev-product-shadow-test-report.md);[shadow 启用](../test-reports/2026-09-24-jev-dev-shadow-enable-test-report.md);[assist 启用+对话](../test-reports/2026-09-24-jev-dev-assist-enable-test-report.md);[assist 短文](../ops/short-term/2026-09-24-jev-dev-assist-enable.md) | 关闭条件:真实轮浸泡≥200 + 体验层检索空结果收敛;intent/risk 另立。本行不升 done | `jevdecide` |
| chat-semantic-replace | 语义摘要 REPLACE | 以 shadow 叙事可选替换 served deterministic Narrative(fail-closed 灰度) | deferred | deferred_enhancement | [Wave5 X-2](../ops/short-term/2026-09-18-wave5-deadcode-decisions.md);[pu6](../ops/long-term/2026-09-16-pu6-semantic-summary-contract.md);[summary_flags](../../internal/ctxmgr/summary_flags.go) | 关闭条件:用户独立授权 + fail-closed 灰度设计;`SEMANTIC_SUMMARY_REPLACE` 当前密封不接线。本行不自动升 done | `chat` |
| dialogue-ctx-injection | 对话上下文注入 | 项目成员对话清洗分层注入小队 workspace 与助手 Prompt;冲突裁决+HITL 分级路由;默认 on 紧急可关 | done | deferred_enhancement | [设计](../system-design/2026-09-25-dialogue-context-injection-design.md);[报告](../test-reports/2026-09-25-dialogue-context-injection-test-report.md);[短文](../ops/short-term/2026-09-25-dialogue-context-injection.md);[收口报告](../test-reports/2026-09-26-dialogue-ctx-closeout-test-report.md) | **after 2026-09-26 收口**:关闭条件全满足——dev 迁移 00072 应用(schema 73);真实 PI intake 任务 `context/dialogue/` 五文件落盘 + TASK.md 导航核验 PASS;冲突确认卡冒烟(投递+确认+黑板同步)PASS;trigger_user 卡片接线补齐(dev `ebb82820`)。会话实时推卡为后续增强另立 | `dialogue-ctx` |
| jevdecide-shadow | jev 产品决策 shadow/assist | jevdecide + coordinator realtime/ProfileTask;compose 默认 off;**local_dev 已开 assist**(no-docker 根 `.env` 与 `configs/.env.dev`) | done | deferred_enhancement | [产品报告](../test-reports/2026-09-24-jev-product-shadow-test-report.md);[shadow 启用](../test-reports/2026-09-24-jev-dev-shadow-enable-test-report.md);[assist 启用+对话](../test-reports/2026-09-24-jev-dev-assist-enable-test-report.md);[assist 短文](../ops/short-term/2026-09-24-jev-dev-assist-enable.md);[浸泡收口](../test-reports/2026-09-26-jevdecide-soak-test-report.md) | **after 2026-09-26 浸泡收口**:200 真实轮(10×20)——决策层 B 组加成 100/100、规则压制 0、C 组误伤 0/60、jev 失败 0;体验层 B 组 handled 94%(92 实时事实 + 2 fail-closed 声明,6 真缺口源于意图误路由至模板通道,归 intent/risk 另立行);无编造数值。compose 默认仍 off;test/main 放量另授权 | `jevdecide` |
| chat-semantic-replace | 语义摘要 REPLACE | 以 shadow 叙事可选替换 served deterministic Narrative(fail-closed 灰度:master + 会话 allowlist 双开关,默认全关) | done | deferred_enhancement | [Wave5 X-2](../ops/short-term/2026-09-18-wave5-deadcode-decisions.md);[pu6](../ops/long-term/2026-09-16-pu6-semantic-summary-contract.md);[summary_flags](../../internal/ctxmgr/summary_flags.go);[接线报告](../test-reports/2026-09-26-chat-semantic-replace-test-report.md);[短文](../ops/short-term/2026-09-26-chat-semantic-replace.md) | **after 2026-09-26 接线**(用户独立授权解封):`SEMANTIC_SUMMARY_REPLACE` + `SEMANTIC_SUMMARY_REPLACE_SESSIONS` 白名单灰度——报告 OK/可见集 digest/served watermark/长度四重校验后仅换白名单会话 Narrative;Facts 与 digest 保持 deterministic;回滚经 displaced_narrative 无残留(dev `cd1f846f`+`6004494e`,单元 8/8 + dev 真实链路阶梯 PASS)。默认关闭;放量逐环境另授权。**after 2026-09-26 dev 放量**(degraded-flags-enable):`SESSIONS` 支持 `*` 全会话通配(含后续新建,dev `6b317181`),dev 已开 master+`*` 并真实链路命中新会话([报告](../test-reports/2026-09-26-degraded-flags-enable-test-report.md));test/main 保持默认并钉配置 | `chat` |
| gov-agent-worktree | Agent worktree 治理自动化 | 主目录保护、任务 worktree、机器认领、候选集成、dev 部署与安全清理 | partial | non_blocker | [方案](../remediation/2026-09-21-agent-workflow-governance-plan.md);[L1 验收](../test-reports/2026-09-21-agent-governance-test-report.md);[W1-B macOS](../ops/short-term/2026-09-22-agentctl-macos.md);[W4](../ops/short-term/2026-09-22-governance-automation.md);residual `modular-decouple-residual-2026-09-23` | L1 与 macOS `with/docs apply/validate/integrate` 已合入。W4 landed:durable queue + 完整 docs projection apply(行/整文 CAS)+ deploy/recover 真实收据闭环 + Darwin cwd 可见性测试。仍 deferred:PI 源码镜像 compose、跨机隔离、automation/w4 实现收敛。本行不升 done | `agent-workflow-governance` |
| intent-l1 | 意图识别 L1 | 18 类 Intent、三分支消解、写/只读分流、双标签 `DOC_BUSY`、intent 纯依赖边界 | done | non_blocker | [intent-recognition](../system-design/intent-recognition/);[工作流作用域](../test-reports/2026-09-21-intent-workflow-scoping-test-report.md);[审计](../audit/2026-09-13-conversation-intent-runtime-state.md);[报告](../test-reports/2026-09-13-conversation-intent-runtime-state-test-report.md);[双标签](../test-reports/assets/2026-09-15-conversation-intent-dual-tab/live.json);[U1](../test-reports/2026-09-15-multi-intent-u1-contracts-test-report.md)–[U3](../test-reports/2026-09-15-multi-intent-u3-intentflow-pg-test-report.md) | **边界 before**:含 U9–U12 叙事混入 → **after**:U9–U12 迁至「多意图扩面」行。关闭:纯依赖边界回归即重开 | `intent` |
| intent-plan-u1u8 | 多意图持久计划(U1–U8 基线) | app/intentflow 生命周期、HITL、默认 `legacy`、U1–U8 代码与安全基线 | done | non_blocker(默认 legacy) | [设计](../system-design/2026-09-15-multi-intent-hitl-plan.md);[U1](../test-reports/2026-09-15-multi-intent-u1-contracts-test-report.md)–[U8](../test-reports/2026-09-16-multi-intent-u8-task-generate-test-report.md);[Wave2 真 PI](../test-reports/2026-09-16-wave2-real-pi-evidence-test-report.md);[Track I1](../test-reports/2026-09-22-track-i1-query-owner-test-report.md);[I2 放量](../test-reports/2026-09-24-intent-plan-i2-rollout-test-report.md) | **after Track I2**:shadow 持久 validated_only + 项目 allowlist + 指标已合入;dev 已按 allowlist 验收 shadow→auto_read→confirm(项目 6579;确认前零写)。compose 默认仍 `legacy`。U9–U12 见独立行 | `intent-plan` |
| intent-plan-u9u12 | 多意图扩面(U9–U12) | U9 LLM 分段实验;U10 mutate;U11 docgov;U12 workflow/run-control | done | deferred_enhancement | [设计](../system-design/2026-09-15-multi-intent-hitl-plan.md);[go/no-go GO](../ops/research/2026-09-16-wave3-pu6-pu8-go-no-go.md);[脚手架](../test-reports/2026-09-16-pu8-u9-u12-flags-test-report.md);[U9](../test-reports/2026-09-17-w4-u9-segment-test-report.md);[U10](../test-reports/2026-09-17-w4-u10-mutate-test-report.md);[U11](../test-reports/2026-09-17-w4-u11-docgov-test-report.md);[U12](../test-reports/2026-09-17-w4-u12-run-control-test-report.md);[2026-09-20 复核](../ops/research/2026-09-20-capability-enablement-impact-research.md);[I3 live](../test-reports/2026-09-24-intent-plan-u9u12-live-test-report.md) | **after Track I3**:U9 已进 `HandleTurn`;live 键=`project.fact.supplement`、`document.claim`/`document.review.submit`、`workflow.run`。未开放:`document.review.approve/reject`、`document.final.*`、`document.proposal.decide`、`workflow.switch`、`run.restart`(validated_only)。tier 停 confirm;compose 默认 legacy;dev 运维可开 U9–U12 flag。禁止 full 一次放量 | `intent-plan` |
| intent-plan-u9u12 | 多意图扩面(U9–U12) | U9 LLM 分段实验;U10 mutate;U11 docgov;U12 workflow/run-control | done | deferred_enhancement | [设计](../system-design/2026-09-15-multi-intent-hitl-plan.md);[go/no-go GO](../ops/research/2026-09-16-wave3-pu6-pu8-go-no-go.md);[脚手架](../test-reports/2026-09-16-pu8-u9-u12-flags-test-report.md);[U9](../test-reports/2026-09-17-w4-u9-segment-test-report.md);[U10](../test-reports/2026-09-17-w4-u10-mutate-test-report.md);[U11](../test-reports/2026-09-17-w4-u11-docgov-test-report.md);[U12](../test-reports/2026-09-17-w4-u12-run-control-test-report.md);[2026-09-20 复核](../ops/research/2026-09-20-capability-enablement-impact-research.md);[I3 live](../test-reports/2026-09-24-intent-plan-u9u12-live-test-report.md);[逐键放量](../test-reports/2026-09-25-p8-u9u12-keys-rollout-test-report.md) | **after 2026-09-25 逐键放量**:U9–U12 全部剩余 validated_only 键已接真实引擎——`document.review.approve/reject`、`document.final.approve/reject`、`document.proposal.decide`(DocGovOwner)、`workflow.switch`、`run.restart`(RunControlOwner);5 个逐键 flag(`U11LiveReview`/`U11LiveFinal`/`U11LiveProposal`/`U12LiveSwitch`/`U12LiveRestart`,默认 off,禁止 full 一次放量);动作策略升 `TierConfirm`;dev 合入 `c5027788`。dev 运维侧逐键 flag 开启与 PI 证据采集待续 | `intent-plan` |
| chat-ctxmgr | 对话 / ctxmgr baseline | 多轮上下文、刷新/重登/重启恢复、授权同集正文与计数、U10 端口化停止扩面 | done | non_blocker | [multi-turn](../system-design/multi-turn-dialogue/);[刷新审计](../audit/2026-09-13-chat-history-refresh-disappears.md);[U10](../test-reports/2026-09-15-chatlog-contextasm-u10-test-report.md);[门禁 B3](../test-reports/2026-09-16-chat-refresh-gate-test-report.md)(项目 6359) | **before**:语义摘要误标 D5 混入 → **after**:摘要迁「语义摘要 D3」;D7 数据治理独立。U10 停止扩面 | `chat` |
| chat-semantic-d3 | 语义摘要(D3) | 授权可见集上 shadow 语义摘要(durable jobs/租约/watermark/provenance);失败保留 deterministic served Narrative;默认 shadow off | done | deferred_enhancement | [chat-agent-p6-backlog](../backlog/chat-agent-p6-backlog.md);[go/no-go GO](../ops/research/2026-09-16-wave3-pu6-pu8-go-no-go.md);[pu6](../ops/long-term/2026-09-16-pu6-semantic-summary-contract.md);[脚手架](../test-reports/2026-09-16-pu6-semantic-summary-test-report.md);[W2 真 PI](../test-reports/2026-09-17-w2-semantic-summary-shadow-test-report.md);[Track S1](../ops/short-term/2026-09-22-track-s1-summary-consolidation.md);[2026-09-23 收口](../test-reports/2026-09-23-chat-semantic-d3-closeout-test-report.md) | **before**:声明含 shadow→可选 REPLACE → **after**:仅 durable shadow;REPLACE 义务迁「语义摘要 REPLACE」行。关闭:tip 重验 + 真 PI PASS(见收口报告)。Wave5 X-2 密封不变 | `chat` |
| chat-data-d7 | 对话数据治理(D7) | 留存/删除口径、库·备份·日志控制、敏感字段加密边界 | deferred | deferred_enhancement(违规则升 blocker) | [计划](../remediation/2026-09-16-feature-matrix-production-readiness-plan.md) Scope Boundaries;[D7 ADR 草案](../adr/2026-09-17-d7-chat-data-retention.md);[W7 盘点](../audit/2026-09-17-d7-data-inventory.md);[红线证据](../test-reports/2026-09-22-redline-evidence-d7-test-report.md) | 只读盘点 + Track E ID-only 符合性已补。口径仍 `pending-compliance-signoff`;**禁止物理删除**。本行不升 done | `chat` |
| squad | 智能体小队 | 角色-任务-工作区-黑板 | done | non_blocker | [agent-squad](../system-design/agent-squad/);[test 2026-09-07](../test-reports/2026-09-07-dynamic-squad-planning-test-report.md) | 非关键步骤降级(A5/A6)属 backlog | `squad` |
| workflow-gov | 工作流治理 | 三正式工作流、设置页/DutyMode、动作级鉴权、真实 PI 三工作流 E2E、full/none 混合长链 | done | non_blocker | [三工作流整改](../remediation/2026-09-12-three-workflows-strict-governance-remediation.md);[409/职责](../test-reports/2026-09-14-workflow-plan-409-frozen-and-optional-duties-test-report.md);[鉴权](../test-reports/2026-09-14-governance-action-level-authz-test-report.md);[PI E2E](../test-reports/2026-09-16-pi-three-workflow-e2e-test-report.md);[Wave2 full/none](../test-reports/2026-09-16-wave2-real-pi-evidence-test-report.md);[deny_only_submit](../test-reports/2026-09-24-non-author-member-access-test-report.md) | full 跨用户审批 + none 免审批不阻塞已签。纯软件自举仍独立 planned **after 2026-09-24 deny_only_submit**:成员可 run/edit/上传/草稿;送审/审核/批准仍职责门禁。[重验](../test-reports/2026-09-24-non-author-member-access-test-report.md) | `workflow` |
| workflow-rdev | 研发设计控制(rdev) | 医疗第 4 工作流:13×60 manifest/模板、`squad.rdev_doc.v1` kind 编排、main-completed 硬 precheck、StageKey 动态化;不含前端/真 PI/键名空间化 | partial | deferred_enhancement | [设计](../system-design/project-workflow/07-研发工作流rdev接入-设计与实施计划.md);[收口](../ops/short-term/2026-09-22-rdev-closeout.md);[报告](../test-reports/2026-09-22-rdev-closeout-test-report.md);[P3 历史](../test-reports/2026-09-19-rdev-p3-real-pi-test-report.md) | **after 2026-09-22 收口**:`rd_proposal` 标题门禁 + 法规表首表截止 dry PASS;nightly 脚本已扩四工作流(FullChain×3+FullNone)。P3 真 PI 三样本重跑因缺 `env:dev` **blocked**(不以 stub 冒充)。剩余:获环境后重跑 P3。本行保持 partial | `workflow-def` / `rdev-templates` |
| workflow-swboot | 纯软件项目自举 | 软件项目创建、Bootstrap、Delivery、受控工程交接 | partial | deferred_enhancement(明确不挡首发) | [设计](../system-design/2026-09-14-software-project-bootstrap-workflow.md);[ADR](../adr/2026-09-16-software-project-bootstrap-keys.md);[L1 报告](../test-reports/2026-09-16-software-project-bootstrap-test-report.md);[W5a](../test-reports/2026-09-17-w5a-software-bootstrap-ui-pi-test-report.md);[红线证据](../test-reports/2026-09-22-redline-evidence-swboot-test-report.md) | **after W5a + 红线证据**:catalog 驱动创建、软件不挂医疗 key。**SWBOOT-10 仍 stub**(L1–L4 证据已补;L5/L6 待授权)。本行不升 done | `workflow-design` |
| workflow-rdev | 研发设计控制 | 医疗第 4 工作流:13×60 manifest/模板、`squad.rdev_doc.v1` kind 编排、main-completed 硬 precheck、StageKey 动态化;不含前端/真 PI/键名空间化 | done | deferred_enhancement | [设计](../system-design/project-workflow/07-研发工作流rdev接入-设计与实施计划.md);[收口](../ops/short-term/2026-09-22-rdev-closeout.md);[报告](../test-reports/2026-09-22-rdev-closeout-test-report.md);[P3 历史](../test-reports/2026-09-19-rdev-p3-real-pi-test-report.md);[P3 重跑](../test-reports/2026-09-26-rdev-p3-rerun-test-report.md) | **after 2026-09-26 P3 重跑**:三样本真 PI 全 PASS——`rd_sw_plan` 规划期关闭;`rd_proposal` completed 10894 字含模板三标题(标题门禁经真 PI 转正);`rd_planning_review` completed 10029 字、质量报告 passed=true score=100(首表截止修复经真 PI 转正)。过程中修复 docgov 批准链两缺陷(快照装载 `121b33f8`、uow 行锁死锁 `5d5cd5fd`,见台账)。剩余为可选增强(rdev PG 顶层入 nightly) | `workflow-def` / `rdev-templates` |
| workflow-swboot | 纯软件项目自举 | 软件项目创建、Bootstrap、Delivery、受控工程交接 | done | deferred_enhancement(明确不挡首发) | [设计](../system-design/2026-09-14-software-project-bootstrap-workflow.md);[ADR](../adr/2026-09-16-software-project-bootstrap-keys.md);[L1 报告](../test-reports/2026-09-16-software-project-bootstrap-test-report.md);[W5a](../test-reports/2026-09-17-w5a-software-bootstrap-ui-pi-test-report.md);[红线证据](../test-reports/2026-09-22-redline-evidence-swboot-test-report.md);[收口报告](../test-reports/2026-09-26-swboot-closeout-test-report.md) | **after 2026-09-26 收口**(W5 关闭条件满足):SWBOOT-10 非 stub——DB allowlist(deny-all 默认,goose 00075 test_commands)+ 隔离 git worktree 受控补丁执行器 + 证据表(goose 00074)+ 创建/预览双门禁绑定放行 + creator-only 端点;merge/push/deploy 永不执行(类型化边界);dev 真实链路(成功+三负例)+ L5 真实 PI(LiveMiniMax)+ L6 docker Playwright 向导二次验收全 PASS。后续增强:创建+绑定同事务、管理台视图 | `workflow-design` |
| iam-authz | IAM / 鉴权 | 项目级 API 鉴权 + RBAC;会话/阶段授权 | done | 加固 | [v3 full inventory](../audit/authorization-matrix-v3-full.md);[session 中断](../test-reports/2026-09-16-iam-route-inventory-test-report.md);[fail-closed](../test-reports/2026-09-16-wave1-iam-fail-closed-test-report.md);[410 策略](../audit/2026-09-16-bug11-410-retire-decision.md);[R13](../audit/2026-09-16-r13-data-safety-checklist.md);[deny_only_submit](../test-reports/2026-09-24-non-author-member-access-test-report.md) | 全路由 inventory + session 中断负例 + 410 冻结 + R13 基线已签 **after 2026-09-24 deny_only_submit**:成员可 run/edit/上传/草稿;送审/审核/批准仍职责门禁。[重验](../test-reports/2026-09-24-non-author-member-access-test-report.md) | `authz` |
| docgov | 文档治理 | 法定文档生命周期 + 租约 + 受控正文读取 | done | non_blocker | [docgov](../test-reports/2026-09-08-docgov-lifecycle-and-claiming-framework-test-report.md);[正文 UI](../test-reports/2026-09-14-controlled-content-ui-acceptance.md);[canonical hash](../remediation/2026-09-14-controlled-content-canonical-hash-remediation.md);[键统一](../test-reports/2026-09-21-workflow-doc-key-unification-test-report.md);[deny_only_submit](../test-reports/2026-09-24-non-author-member-access-test-report.md) | 项目 143 只读;不终止。`doc_proj*` 同一发布键不能再并存;[自由协作认领](../test-reports/2026-09-24-free-collab-claim-notify-test-report.md) **after 2026-09-24 deny_only_submit**:成员可 run/edit/上传/草稿;送审/审核/批准仍职责门禁。[重验](../test-reports/2026-09-24-non-author-member-access-test-report.md) | `docgov` |
| docgov | 文档治理 | 法定文档生命周期 + 租约 + 受控正文读取 | done | non_blocker | [docgov](../test-reports/2026-09-08-docgov-lifecycle-and-claiming-framework-test-report.md);[正文 UI](../test-reports/2026-09-14-controlled-content-ui-acceptance.md);[canonical hash](../remediation/2026-09-14-controlled-content-canonical-hash-remediation.md);[键统一](../test-reports/2026-09-21-workflow-doc-key-unification-test-report.md);[deny_only_submit](../test-reports/2026-09-24-non-author-member-access-test-report.md);[三权流转](../test-reports/2026-09-25-doc-review-lifecycle-test-report.md) | 项目 143 只读;不终止。`doc_proj*` 同一发布键不能再并存;[自由协作认领](../test-reports/2026-09-24-free-collab-claim-notify-test-report.md) **after 2026-09-24 deny_only_submit**:成员可 run/edit/上传/草稿;送审/审核/批准仍职责门禁。[重验](../test-reports/2026-09-24-non-author-member-access-test-report.md)。**after 2026-09-26 落地**:锁定期补充积压(migration 00073)、流转职责通知、阶段化批注矩阵、重开 Approver 优先已随 doc-review-lifecycle-land 合入 dev;对话触发键(comment/reopen/pending)进入 U11 live 基线集;真实 PI E2E 仍待授权环境补跑。设计见 [三权流转设计](../system-design/2026-09-25-doc-review-lifecycle-design.md) | `docgov` |
| docgov-revision | 文档版本 baseline | 账本、人工修订、确定性 diff+lineage、运行时 UI、负责人通知 | done | non_blocker | [管理](../test-reports/2026-09-13-document-revision-management-test-report.md);[Round20 UI](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md);[ADR](../adr/2026-09-13-document-version-boundary.md);[proposed/authoritative](../ops/short-term/2026-09-20-proposed-authoritative-reports.md) | **before**:完整 PI narrative 混入 → **after**:迁「PI change-report 叙事」。fallback 报告是本行内显式行为,不是缺口。lineage GET 已按 URL 项目和文档可见性裁剪。test_manager 血缘的下游/上游版本改读文档版本,不再写死 1。Agent 候选报告为 `proposed`,正式提交才写 authoritative 后继并挂到版本;拒绝、替代后旧报告不能再出建议。人工修订、导入和聊天卡仍未分开预估与正式报告,见 [T1](../ops/short-term/2026-09-20-impact-loop-t1.md)。项目追踪索引见下一行 | `docgov` |
| trace-impact | 阶段回溯与影响闭环 | 五表追踪索引、影响报告、L1 文档修订、L2 阶段再打开、待复核软标记、对话修订提案 | done | deferred_enhancement(不挡首发) | [设计](../system-design/2026-09-20-stage-backtrack-and-impact-loop-design.md);[Track T](../remediation/2026-09-20-capability-enablement-impact-plan.md);[对话化报告](../test-reports/2026-09-21-trace-panel-to-chat-test-report.md);[T 补强](../ops/short-term/2026-09-22-track-t-strengthen.md) | 已合入 dev。常驻「需求与影响」面板已退役。**2026-09-23 实测** DOCREV 路径 schema **63**;test=`rc-v1.1.0-beta.1` schema 61;main 本轮未晋升。阶段推进确认门禁仍在。不签 D7 对话 ADR;[补充影响批次](../test-reports/2026-09-24-free-collab-claim-notify-test-report.md)| `trace-index` |
| docgov-pi-narrative | PI change-report 叙事 | 只读消费 diff+lineage 的 PI 叙事;失败全量降级 fallback | done | deferred_enhancement | [Round20](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md);[go/no-go GO](../ops/research/2026-09-16-wave3-pu6-pu8-go-no-go.md);[pu7](../ops/long-term/2026-09-16-pu7-pi-narrative-contract.md);[W3 真 PI](../test-reports/2026-09-17-w3-pi-change-report-narrative-test-report.md);[红线负例](../test-reports/2026-09-22-redline-evidence-pi-narrative-test-report.md);[收口](../test-reports/2026-09-23-pi-narrative-closeout-test-report.md) | **after 2026-09-23 收口**:修复后真实 MiniMax 复测 PASS(截断差异输入 + reasoning 目标落盘);默认 flag **off**;dev/test 常驻开启另授权 | `docgov` |
| docgov-pi-narrative | PI change-report 叙事 | 只读消费 diff+lineage 的 PI 叙事;失败全量降级 fallback | done | deferred_enhancement | [Round20](../test-reports/2026-09-14-document-revision-runtime-ui-test-report.md);[go/no-go GO](../ops/research/2026-09-16-wave3-pu6-pu8-go-no-go.md);[pu7](../ops/long-term/2026-09-16-pu7-pi-narrative-contract.md);[W3 真 PI](../test-reports/2026-09-17-w3-pi-change-report-narrative-test-report.md);[红线负例](../test-reports/2026-09-22-redline-evidence-pi-narrative-test-report.md);[收口](../test-reports/2026-09-23-pi-narrative-closeout-test-report.md) | **after 2026-09-23 收口**:修复后真实 MiniMax 复测 PASS(截断差异输入 + reasoning 目标落盘);默认 flag **off**;dev/test 常驻开启另授权。**after 2026-09-26**:dev 已按用户授权常驻开启(degraded-flags-enable,快照与回滚见[报告](../test-reports/2026-09-26-degraded-flags-enable-test-report.md));test/main 保持 off | `docgov` |
| web-workbench | 前端工作台 | 三栏 + 块文档 + SSE;错误卡/`TaskRunCard` 竖向进度/busy;版本冲突信封;demo seed 默认关;终止 preview | done | non_blocker | [workbench](../test-reports/2026-09-08-three-column-workbench-and-block-document-test-report.md);[双标签](../test-reports/assets/2026-09-15-conversation-intent-dual-tab/screenshots/tab-b-busy.png);[demo](../test-reports/2026-09-16-demo-seed-pollution-test-report.md);[B4](../test-reports/2026-09-16-frontend-gate-b4-test-report.md)(项目 6363);[TaskRunCard](../test-reports/2026-09-21-taskrun-status-card-persistence-test-report.md) | **before**:空「缺口」却 partial → **after**:本行 done。其他 409 消费方信封复用另列 hardening backlog;[通知收件箱](../test-reports/2026-09-24-free-collab-claim-notify-test-report.md)| `web` |
| pi-runner | PI Runner / 配置链 | pi-agent + MiniMax + typed-result-v1 | done | non_blocker | [piagent](../test-reports/2026-09-13-codex-audit-p0-remediation-test-report.md);[container-env](../test-reports/2026-09-13-container-env-configuration-test-report.md);[typed-result](../test-reports/2026-09-15-pi-typed-result-v1-test-report.md) | 文档生成仍使用读写和搜索工具。`tool_profile=reasoning` argv 为 `--no-tools`。**2026-09-22 实测** pi-agent 已 bind-mount `pi-args.mjs` | `pi-agent` |
| infra-envs | 三环境运维 | dev/test/main + 共享 KB;对话/业务库隔离 | done | non_blocker | [PROJECT.md](../../PROJECT.md) §4;[晋升报告](../test-reports/2026-09-22-dev-gate-and-test-promotion-test-report.md);[DOCREV](../test-reports/2026-09-22-docrev-ui-rerun-test-report.md) | **2026-09-23 实测**:本地/共享 dev DOCREV 路径 schema **63**;test health schema **61**(`rc-v1.1.0-beta.1`);main 本轮未晋升 | `infra` |
@@ -77,7 +77,7 @@
| module-spec | 模块开发规范 | 窄端口、领域事件、wire DTO 三种契约;故障隔离红线;新增模块/表/事件流程。不含批次 A–G 的代码整改 | done | non_blocker | [规范](../system-design/2026-09-20-module-development-standards.md);[审计](../audit/2026-09-20-module-coupling-audit.md);[ADR](../adr/2026-09-14-modular-monolith-decoupling.md) | 文档入口已立。代码整改不在本行 | `module-decoupling-spec` |
| module-batches-ag | 模块解耦批次 A–G | server 端口装配、chat 解环、docgov 词汇、工作流单向依赖、巨型文件、前端 api client、21 条例外清零 | done | non_blocker | [分批计划](../remediation/2026-09-20-module-decoupling-batch-plan.md);[审计](../audit/2026-09-20-module-coupling-audit.md);[A](../ops/short-term/2026-09-22-server-assembly-cleanup.md);[B](../ops/short-term/2026-09-22-chat-app-decouple.md);[C](../ops/short-term/2026-09-22-docgov-vocabulary-convergence.md);[D](../ops/short-term/2026-09-22-workflow-def-unidirect.md);[E](../ops/short-term/2026-09-22-engine-split.md);[F](../ops/short-term/2026-09-22-web-api-client.md);[G1](../ops/short-term/2026-09-22-g1-exception-clearance.md);[G2/G3](../ops/short-term/2026-09-22-g2-g3-exception-clearance.md);[状态回退修正](../ops/short-term/2026-09-23-module-batches-ag-status-fix.md);[ISSUE](../audit/2026-09-23-matrix-status-regression.md) | **2026-09-23 复核收口**:A–F + G1/G2/G3 及 residual 二轮均已合入 dev;`arch-check --mode block` PASS、baseline 全 0、exceptions 清零。此前状态曾被 closeout 合并冲突错误回退(ISSUE-20260923-matrix-status-regression),本次按证据修正。Server 镜像字段增量收口另立任务 | `module-decoupling-spec` |
| events-fav | Final Artifact Vault(FAV) | 不可变终态制品库;`FAV_DEGRADED_READ=false` | partial | deferred_enhancement | [Track E 复盘](../ops/research/2026-09-15-track-e-retrospective.md);[U7 报告](../test-reports/2026-09-16-fav-u7-incremental-test-report.md);[W6 shadow](../test-reports/2026-09-17-w6-fav-subscriber-shadow-test-report.md);[红线证据](../test-reports/2026-09-22-redline-evidence-fav-test-report.md) | gap-fill 单测+drill 证据已合入 local_dev(例外授权 2026-09-23)。**live 未放量**;观察窗起点已登记。`FAV_DEGRADED_READ` 默认 false;保持 partial 不升 done | `events` |
| web-sysadmin | 系统管理台 | 全屏系统级管理视图(总览/KB/特性开关/系统设置/工作流/角色/用户/文档 8 分组);`/api/v1/admin/system/*`;`system_settings` 白名单可写;吸收下线 AdminSettingsModal;细粒度 `system:*` + 设置审计日志(goose 00065) | done | non_blocker | [short-term](../ops/short-term/2026-09-17-system-admin-console.md);[测试报告](../test-reports/2026-09-17-system-admin-console-test-report.md);residual `modular-decouple-residual-2026-09-23` | 剩余 deferred:Playwright 实跑、KB 运维动作、白名单项接消费方 | `web` + `sysadmin` |
| web-sysadmin | 系统管理台 | 全屏系统级管理视图(总览/KB/特性开关/系统设置/工作流/角色/用户/文档 8 分组);`/api/v1/admin/system/*`;`system_settings` 白名单可写;吸收下线 AdminSettingsModal;细粒度 `system:*` + 设置审计日志(goose 00065) | done | non_blocker | [short-term](../ops/short-term/2026-09-17-system-admin-console.md);[测试报告](../test-reports/2026-09-17-system-admin-console-test-report.md);residual `modular-decouple-residual-2026-09-23`;[残差收口](../test-reports/2026-09-25-p9-websysadmin-residual-test-report.md) | **after 2026-09-25 残差收口**:白名单 `ui.maintenance_notice`/`ui.read_only_mode` 已接消费方(`sysadmin.GetSettingValue` → `maintenance.SiteSettingsProvider` → 公开 `GET /api/v1/maintenance/site-status` + 前端 `MaintenanceBanner`,dev `4bdbb0da`);Playwright admin-console 实跑 PASS(docker `mcr.microsoft.com/playwright` 镜像对真实 dev 栈);KB 运维动作登记不做(`internal/kb` 纯只读客户端,rebuild/index 属共享基础设施容器侧能力) | `web` + `sysadmin` |
| removed-control-center | 个人工程中控台(已移出) | 原本地只读看板与后来的 Control Center 都不再属于本仓库 | removed | 进度管理改由独立项目承担 | [历史设计](../archive/design/2026-09-17-personal-engineering-control-center-plan.md);[历史报告](../test-reports/2026-09-17-engineering-dashboard-test-report.md) | 2026-09-19 删除 `cmd/control-center`、`internal/controlcenter`、`control-center/web`、`deploy/control-center`。不恢复 `engineering-dashboard` | — |
---
@@ -0,0 +1,212 @@
# 项目成员权限总览(对话 / 执行任务 / 补充信息 / 文档编制与修改)
> **文档定位**:本文是对"项目成员在各协作动作中拥有什么权限"的**只读梳理与整合**,权威实现以代码为准(每节标注 `文件:行号`)。
> **口径来源**:系统角色与能力矩阵见 [authz/fallback.go](../../internal/authz/fallback.go);三权与阶段判定见 [deny-only-submit 经验](../ops/lessons/2026-09-24-deny-only-submit.md) 与 [非编制成员访问整改](../audit/2026-09-24-non-author-member-access.md);路由负例见 [authorization-matrix-v3-full](../audit/authorization-matrix-v3-full.md);能力成熟度见 [FEATURE-MATRIX `iam-authz` / `workflow-gov` / `docgov` 行](../status/FEATURE-MATRIX.md)。
> **本文不新增第二套门禁**,也不改变上述权威结论;仅把它们按"成员能做什么"重新组织,供协作与验收对照。
> **状态**:research/overview(可审产物,不含实施授权)。
---
## 一、三层权限模型(先厘清概念,再看动作)
系统对"谁能做什么"由三个**正交**维度共同决定,任何一个单独看都会误判:
| 层 | 取值 | 权威来源 | 决定什么 |
|---|---|---|---|
| **系统角色** | `role-admin` / `role-director` / `role-tech-lead` / `role-engineer` / `role-guest` | `users.role_id` + DB `user_role_bindings` → `system_role_permissions`;无 DB 时回落 [FallbackCapabilitiesByRoleID](../../internal/authz/fallback.go#L3) | 系统级能力(建项目、指派负责人、管理台读写、成员管理权限键) |
| **项目成员角色** | `owner` / `member` / `viewer` | `project_members.project_role`(+ 创建人 `projects.creator_user_id`);[authorizer.go](../../internal/authz/authorizer.go#L22) | 能否进入某项目、能否管成员、能否终止他人任务 |
| **文档职责(三权)** | `author`(编制)/ `reviewer`(审核)/ `approver`(批准) | `project_members.document_duty` 为**权威指派**,落到 `document_records` 三槽位;[docduty/resolve.go](../../internal/docduty/resolve.go#L106) | 能否对该文档送审 / 审核 / 批准 |
`★ Insight ─────────────────────────────────────`
**三层是分离而非叠加的**。Phase 0 术语冻结明确:`author/reviewer/approver` 是"文档职责",绝不能写进 `project_role`([authz/service_test.go](../../internal/authz/service_test.go#L82) 有回归拒绝 `project_role="author"`)。这意味着"是 owner"和"是该文档的 reviewer"是两回事——owner 若未被指派为某文档 reviewer,也不能替 reviewer 点"审核通过"。
`─────────────────────────────────────`
### 1.1 系统角色的能力矩阵(服务端 fallback,与 IAM seed 对齐)
| capability 键 | admin | director | tech-lead | engineer | guest |
|---|:--:|:--:|:--:|:--:|:--:|
| `project:create` 建项目 | ✓ | ✓ | ✓ | | |
| `project:assign_lead` 指派文档负责人 | ✓ | ✓ | ✓ | | |
| `project:manage_members` 管理项目成员 | ✓(含 `perm:manage`) | | | | |
| `perm:manage` 系统权限管理(全量) | ✓ | | | | |
| `system:overview`/`kb:read`/`features:read`/`settings:read`/`audit:read` | ✓ | | | | |
| `system:settings:write` 改系统设置 | ✓ | | | | |
| `workflow:config_visibility` / `doc:override_visibility`(仅登记,见 §6.2) | ✓ | ✓ | ✓ | | |
| `doc:export` 导出 | ✓ | ✓ | ✓ | ✓ | ✓ |
| `workflow:view_all` | ✓ | ✓ | ✓ | ✓ | |
> 数据源:[fallback.go](../../internal/authz/fallback.go#L3)、[roles.go defaultSystemRoles](../../internal/authz/roles.go#L46)。`role-guest` 只有 `doc:export`,是"最小权限查阅"角色。
### 1.2 项目成员角色:owner 与非 owner 的真实差异
**关键事实**:服务端读取项目内绝大多数业务对象时,只判定"是不是 active 成员",**不区分 `member` 与 `viewer`**——[RequireProjectAccess](../../internal/authz/authorizer.go#L128) → [IsProjectMember](../../internal/authz/authorizer.go#L107) 的 SQL 条件只有 `status='active'` 或"是创建人"。
真正区分的是 **owner/creator** 这一档:
| 能力 | 判定函数 | 谁满足 |
|---|---|---|
| 进入项目 / 读项目对象 | `IsProjectMember` | owner、member、viewer、creator 全部 |
| 管理成员(增删改/移出) | [CanManageProjectMembers](../../internal/authz/service.go#L115) | owner 或 creator、系统管理员、持 `project:manage_members` |
| 终止 / 续跑他人任务 run | [assertTaskRunAccess](../../internal/server/task_run_auth.go#L16) 的 cancel/resume | run 发起人本人 **或 project owner**(member/viewer 不行) |
| 改派文档职责(PATCH duties) | [duty_reassign_handlers.go](../../internal/server/duty_reassign_handlers.go#L29) | creator 或持 `project:assign_lead` |
| 工作流规划/激活/推进/终止 | 各 `projectinstance` 服务 `!isCreator → ErrForbiddenNotCreator` | **仅项目创建人** |
> 也就是说:`viewer` 在**服务端**能读、能进对话、能发起自由查询;把"查阅者"降为只读主要靠**前端隐藏写按钮**(见 §5.4)。文档若要严格区分 member/viewer 的服务端写门禁,属尚未实施的缺口(如实标注,见 §6.1)。
---
## 二、请求进入系统的第一道闸:认证与路由分层
`★ Insight ─────────────────────────────────────`
路由不是按"权限组"分组挂载的,而是**全部 `/api/v1/*` 统一过 `authMiddleware` 要求登录**,成员/管理员/职责判定下沉到每个 handler。这样"公开面"极小且可枚举,代价是每个 handler 必须自觉调门禁函数——所以本仓用负例测试(authorization-matrix-v3)逐路由兜底。
`─────────────────────────────────────`
- **中间件链**:`cors → accessLog → bodyLimit → authMiddleware → mux`([server.go:371](../../internal/server/server.go#L371))。
- **匿名可访问**([auth_middleware.go](../../internal/server/auth_middleware.go) `isPublicRoute`):`/health`、`/ready`、`/api/v1/vault/status`、`POST /auth/login`、`POST /auth/register`、`GET /auth/public-config`,以及所有非 `/api/`(SPA 静态页)。
- **principal 唯一可信**:登录主体只来自 `Bearer`/`X-Session-Token` → `principalFromContext`;**禁止** `X-User-ID` 头或 body `user_id` 覆盖(Phase 0 红线)。handler 一律 `req.UserID = user.ID`,不信请求体。
- **fail-closed**:生产/DB 模式下授权依赖异常默认拒绝([failClosedAuthz](../../internal/server/auth_helpers.go#L15));dev 内存模式才允许 legacy fallback。
三级门禁函数:`requireAuthenticatedUser`(401)→ `requireProjectAccess`(非成员 403 / 不存在 404,管理员直通)→ `requireAdmin` / `requireSystemPermission`(管理员判定 [IsSystemAdmin](../../internal/authz/service.go#L107))。
---
## 三、四类核心协作动作的权限矩阵
这是用户最关心的部分,逐动作给出"谁可以 + 代码位置"。
### 3.1 发起对话 / 进入项目会话
| 情形 | 判定 | 结论 |
|---|---|---|
| 账号名下无任何项目 | [enforceChatRequiresProject](../../internal/server/stage_access_helpers.go) | **禁止对话**,返回 `ERR_NO_PROJECT` |
| 会话绑定了项目 | [enforceChatProjectAccess](../../internal/server/stage_access_helpers.go) → `RequireProjectAccess` | **必须是该项目 active 成员**(owner/member/viewer 均可,管理员放行);SSE 在 Flush 前拒绝 |
| 成员进入后的自由对话 | [allowFreeLaneChatInitiation](../../internal/server/free_lane.go#L41) | **成员确认后总是放行发起**("自由车道",见 §3.2) |
| 读他人会话/消息 | [assertSessionOwnedByUser](../../internal/server/auth_helpers.go#L79)、[chatlog authorize](../../internal/app/chatflow/chatlog.go) | `owner_id != 当前用户` → 403,**读不到别人的私有会话** |
| 看同项目他人阶段消息 | [MessageRecordVisible](../../internal/projectinstance/message_scope.go) | 按阶段作用域过滤,跨阶段/私有消息对同项目其他成员不可见 |
**要点**:项目成员(含 viewer)都能进项目对话并发消息;会话的**所有权隔离**保证看不到别人的个人会话;阶段消息可见性另有一层作用域收窄。
### 3.2 自由协作通道(chat / 上传 / 总结 / 查询 / 影响分析 / 补充)
来自 [free-collab-claim-notify-design §3](2026-09-24-free-collab-claim-notify-design.md) + [free_lane.go](../../internal/server/free_lane.go#L12):
- **准入 = 项目成员**(`RequireProjectAccess`),**不查阶段 / duty / 实例状态**。
- **适用动作**:`chat`、`help`、各类 `query`、`impact.analyze`、`supplement`、材料上传、总结——共 14 个成员级自由意图键([freeLaneIntentKeys](../../internal/server/free_lane.go#L14))。
- **红线**:自由车道只放开"发起与查询",**受控文档的写动作仍走 duty + 阶段 + 认领**(见 §3.4)。
### 3.3 执行任务 / 阶段动作
| 动作 | 端点 | 权限 |
|---|---|---|
| 创建/运行 task run | `POST /api/v1/tasks/run*`、`/projects/{id}/workflows/{key}/run` | 需 `RequireProjectAccess`(成员);run 走 [CheckDocTaskAccess(run)](../../internal/projectinstance/duty_action.go#L48) → **成员级放行**;幂等键归属校验 |
| 查看 run / 事件流 | `GET /tasks/runs/{id}`、`/events` | admin ∥ run 发起人 ∥ project owner ∥ **任意项目成员**([view](../../internal/server/task_run_auth.go#L35)) |
| 取消 / 续跑 run | `POST /tasks/runs/{id}/cancel`、`/resume` | 仅 run 发起人 **∥ project owner**([cancel/resume](../../internal/server/task_run_auth.go#L46)),普通 member/viewer 不可终止他人任务 |
| 阶段推进 / 激活 / 终止实例 | `/workflow-instances/{id}/stages/{stage}/advance`、`/terminate`、activate | **仅项目创建人**(`isCreator`);推进还需门禁就绪(`CanAdvance`,未就绪 409) |
### 3.4 文档的发起编制、修改与三权审批
这是权限最细的部分。受控文档动作统一走 [CheckDocTaskAccess](../../internal/projectinstance/document_access.go#L35) → [classifyAccess](../../internal/projectinstance/duty_action.go#L48),遵循 **`deny_only_submit`** 原则:
| 动作 | 谁能做 | 拒绝码 |
|---|---|---|
| **view** 读 | 任意项目成员(view 豁免阶段收窄,[TaskKeyVisible](../../internal/projectinstance/stage_access.go#L119));正文读还要 `authorizeControlledRead` | 无项目归属文档仅管理员 |
| **edit / run** 编辑·跑 | **任意项目成员**(deny_only_submit:run/edit 降为成员级) | 实例未激活 → 202-blocked |
| **submit** 提交送审 | 仅该文档 **author** | `DOC_DUTY_FORBIDDEN` |
| **review** 审核 | 仅该文档 **reviewer** | `DOC_DUTY_FORBIDDEN` |
| **approve** 批准 | 仅该文档 **approver** | `DOC_DUTY_FORBIDDEN` |
| DutyMode=**partial**(职责未配全) | 除 view 外全部拒绝 | `DOC_DUTY_FORBIDDEN` |
| DutyMode=**none**(未纳管审批) | run/edit 成员可,但 submit/review/approve 全拒 | `DOC_DUTY_NOT_MANAGED` |
`★ Insight ─────────────────────────────────────`
`deny_only_submit` 是 2026-09-24 整改的核心([lesson](../ops/lessons/2026-09-24-deny-only-submit.md)):过去把 run/edit 也绑到 author,导致"非编制成员连草稿/上传/总结都 403"。修正后**放写、只deny审批链**——编辑成员级,但 submit/review/approve 三者仍严格绑定各自单一职责,创建人也不隐式越权。角色一律 [resolveDocGovRole](../../internal/server/auth_helpers.go#L182) 服务端按三槽位解析,绝不信客户端自报。
`─────────────────────────────────────`
**认领与提案(非作者如何"发起修改")**:
- 非模板文档被 author 查看/编辑 → `author_claimed=true`([free_lane maybeAutoClaimOnView](../../internal/server/free_lane.go#L50) 开关);已认领文档,非作者不能直改,须走**变更提案** [handleDocGovProposeModification](../../internal/server/handlers_docgov.go)(成员即可提,triggeredBy 强制 `user:{id}`)。
- 提案由谁拍板:仅该文档 **author**([engine_proposal.go](../../internal/docgov/engine_proposal.go) 校验 `AuthorID`,否则 `ErrUnauthorizedActor`→403)。采纳后以作者身份 auto-apply。
- 前端"修改"意图只在 `isClaimed && currentDocRole==='author'` 才路由到 propose([useSendMessage](../../web/src/hooks/useSendMessage.ts))。
### 3.5 补充信息 → 影响 → 确认卡
来自 [supplement_impact_handlers.go](../../internal/server/supplement_impact_handlers.go) + supplementimpact 服务:
| 环节 | 权限 |
|---|---|
| 查看影响批次 | [userCanAccessSupplementBatch](../../internal/server/supplement_impact_handlers.go#L146) = **项目成员或创建人** |
| 确认 / 取消批次 | **仅发起该补充的 initiator 本人**([service.go](../../internal/supplementimpact/service.go) `ActorUserID != InitiatorUserID` → "only initiator" 403),且需 `nonce + digest + expected_revision` CAS;过期 410 |
| 已认领文档落地 | 以 initiator 身份走 `ProposeModification`(回到 §3.4 作者拍板);未认领 → 通知作者信息卡 |
### 3.6 自由私密文档(个人 → 项目共享)
来自 [freeform_doc_api.go](../../internal/server/freeform_doc_api.go) + [internal/freedoc](../../internal/freedoc/service_share.go):
- **创建**:需登录;建到 `my_private` 空间必须带 `project_id` 且过 `RequireProjectAccessOrAdmin`——非成员不能向该项目挂私密文档。
- **读**:`my_private` 仅 owner;`project_shared` 经项目共享后对成员可读。
- **改 / 共享 / 撤回 / 删除**:仅 `owner_user_id == 当前用户`([service_share.go](../../internal/freedoc/service_share.go)),越权 403"仅文档所有者可共享"。
---
## 四、管理台权限(/api/v1/admin/*)
两类 gate([admin_system_handlers.go](../../internal/server/admin_system_handlers.go)、[principal_context.go](../../internal/server/principal_context.go)):
1. **粗粒度 requireAdmin**(= `role-admin` ∥ `perm:manage`):用户 CRUD、改角色/状态、[重置密码](../../internal/server/auth_handlers.go)(一次性临时密码、不落日志)、角色/工作流/模板管理、workspace 运维。
2. **细粒度 system:\***(`/admin/system/{overview,kb,features,settings,audits}`):各自 `requireSystemPermission(PermSystem*)`。**Phase-2 现状**:系统管理员拥有全部 `system:*`,非管理员对 `system:*` **fail-closed 一律 false**([HasSystemPermission](../../internal/authz/service.go#L91))——细粒度键当前是"管理员 all-or-nothing",拆分留待后续。
**两个"任何登录用户可读"的例外**(立项选人/权限目录展示用):`GET /admin/permissions`、`GET /users/directory`(轻量 active 目录)。
---
## 五、前端如何消费权限(能力 ≠ 唯一权威,服务端才兜底)
`★ Insight ─────────────────────────────────────`
前端权限是**体验层**,不是安全边界。Phase 0 术语冻结已声明 `hasPermission`/localStorage 属 UI 层;真正的对象级授权永远在服务端 middleware。所以前端"隐藏按钮"被绕过也没关系——后端各 handler 仍会独立 403。
`─────────────────────────────────────`
1. **capabilities 获取与缓存**:登录成功后 `fetchMe()` 取 `/auth/me` 的 `capabilities`,存 localStorage 会话;启动时先用快照渲染再被 `/auth/me` 覆盖,**拉取失败即清会话登出**([useAuthenticatedWorkspaceSync](../../web/src/hooks/useAuthenticatedWorkspaceSync.ts))。
2. **fail-closed**:[rbac.ts hasPermission](../../web/src/engine/rbac.ts#L86) 在 `capabilities === undefined` 时**直接返回 false**;`perm:manage` 视为全权。
3. **按职责显示审批按钮**:[docGovActionVisibility.ts holdsDocDuty](../../web/src/lib/docGovActionVisibility.ts) 直接比对 userId 与 author/reviewer/approver;三槽全空(unmanaged)则不显示任何审批动作([DocGovActionBar](../../web/src/components/doc/DocGovActionBar.tsx))。
4. **成员/角色 UI**:[ProjectMembersModal](../../web/src/components/project/ProjectMembersModal.tsx) 添加下拉只给 `member`/`viewer`,owner/creator 归一不可降级([normalizeEditableRole](../../web/src/components/project/ProjectMembersModal.tsx));改职责下拉也只"项目成员/查阅者"。文档职责(author/reviewer/approver)通过 [UserProjectRightsModal](../../web/src/components/user/UserProjectRightsModal.tsx) 的 `resolveCurrentDocRole` 匹配,**未知身份 fail-closed 为 viewer**。
5. **对话/任务**:[filterProjectSessionsForUser](../../web/src/data/projectsStorage.ts) 让非成员完全看不到项目会话,exited 成员只读留痕(输入框禁用);task run 无独立前端权限 gate,靠"进不去会话/退出即禁用"间接限制。
---
## 六、边界与已知缺口(如实标注,勿当已实施)
1. **member vs viewer 服务端不区分写动作**:§1.2 所述,viewer 的"只读"目前主要由前端隐藏写按钮保证;服务端 `IsProjectMember` 对 member/viewer 一视同仁。若需服务端级"viewer 禁写",是待实施的授权收窄。
2. **`doc:override_visibility` / `workflow:config_visibility` 仅前端消费**:这两个 capability 在服务端只做登记(fallback + catalog),**没有 handler 用 `HasSystemPermission` 检查它们**;服务端实际文档可见性走 `ResolveStageAccess` 的 `TaskKeyVisible` + 实例快照。配置结果落入 plan/实例后由 `CheckDocTaskAccess` 执行,但"覆盖规则写鉴权"未在服务端单独 gate(见子代理调研结论)。
3. **`system:*` 细粒度未拆分绑定**:Phase-2 现状 admin all-or-nothing,非 admin fail-closed(§4)。
4. **无 DB 时 authz 降级**:`Authorizer.enabled()==false`(stub/dev 内存)时 `IsProjectMember` 返回 `userID>0` 即放行——**仅 dev/stub,生产 fail-closed**(Phase 0 已知 gap)。
---
## 七、权限决策函数清单(速查)
| 函数 | 文件 | 语义 |
|---|---|---|
| `isPublicRoute` | [auth_middleware.go](../../internal/server/auth_middleware.go) | 匿名白名单 |
| `requireAuthenticatedUser` / `requirePrincipal` | [auth_helpers.go](../../internal/server/auth_helpers.go) | 需登录(401) |
| `requireProjectAccess` | [auth_helpers.go:115](../../internal/server/auth_helpers.go#L115) | 项目成员可访问(管理员直通) |
| `requireDocGovDocAccess` | [auth_helpers.go:140](../../internal/server/auth_helpers.go#L140) | 受控文档 = 所属项目成员 |
| `resolveDocGovRole` | [auth_helpers.go:182](../../internal/server/auth_helpers.go#L182) | 服务端按三槽解析 author/reviewer/approver |
| `IsSystemAdmin` / `HasSystemPermission` / `CanManageProjectMembers` | [authz/service.go](../../internal/authz/service.go) | 系统权限核心判定 |
| `IsProjectMember` / `IsProjectOwner` / `RequireProjectAccess(OrAdmin)` | [authz/authorizer.go](../../internal/authz/authorizer.go) | 项目成员/owner 判定 |
| `UpsertProjectMemberSpec` / `SetProjectMemberStatus` | [authz/authorizer.go:314](../../internal/authz/authorizer.go#L314) | 成员 + 独占 duty 写入(advisory lock + 清槽);退出清槽 |
| `CheckDocTaskAccess` / `classifyAccess` | [document_access.go](../../internal/projectinstance/document_access.go) / [duty_action.go](../../internal/projectinstance/duty_action.go) | deny_only_submit 六动作矩阵 |
| `Resolve` / `HealBinding` | [docduty/resolve.go](../../internal/docduty/resolve.go) | 以 document_duty 为权威解析三权 |
| `ResolveStageAccess` / `TaskKeyVisible` | [stage_access.go](../../internal/projectinstance/stage_access.go) | 阶段级可见/可运行集 |
| `assertTaskRunAccess` | [task_run_auth.go](../../internal/server/task_run_auth.go) | run view/cancel/resume 门禁 |
| `authorizeDocRevision` | [document_revision_access.go](../../internal/server/document_revision_access.go#L61) | 版本账本读=成员;写=drafting 期 +(受控)author 本人或管理员 |
| `userCanAccessSupplementBatch` + `Decide` initiator | [supplement_impact_handlers.go](../../internal/server/supplement_impact_handlers.go) | 补充批次查看=成员,确认=仅 initiator |
| `freedoc.Share/Unshare/Delete` | [freedoc/service_share.go](../../internal/freedoc/service_share.go) | 私密文档 owner 独占 |
---
## 附:相关权威与证据
- [Phase 0 API 授权矩阵](../audit/2026-09-12-phase0-api-authz-matrix.md) · [Phase 1 IAM 实施计划](../remediation/2026-09-12-phase1-iam-authz-implementation-plan.md)
- [authorization-matrix-v3 全路由盘点](../audit/authorization-matrix-v3-full.md)
- [deny-only-submit 经验](../ops/lessons/2026-09-24-deny-only-submit.md) · [非编制成员访问整改](../audit/2026-09-24-non-author-member-access.md) · [重验报告](../test-reports/2026-09-24-non-author-member-access-test-report.md)
- [自由协作与认领设计](2026-09-24-free-collab-claim-notify-design.md)
- 能力成熟度:[FEATURE-MATRIX](../status/FEATURE-MATRIX.md) `iam-authz` / `workflow-gov` / `docgov` / `web-sysadmin` 行
@@ -0,0 +1,304 @@
# 非容器化单二进制交付方案(dev / test / main)
| 字段 | 值 |
|---|---|
| status | proposed(设计评审;未授权实施) |
| task_id | single-binary-noncontainer-design-2026-09-24 |
| owner | Cursor |
| created | 2026-09-24 |
| catalog | R-single-binary-non-container-deploy |
| base_dev_sha | edbe59247872ef5861bafd30068955e22288c6ff |
| 授权 | 用户确认「纯单文件 server + server 自管 PG(managed)」;本文件仅为设计产物,不含业务实施/环境写操作 |
> 相关入口:[PROJECT.md](../../PROJECT.md) 环境拓扑 · [验证契约](../ops/2026-09-21-validation-contract.md) · [gap-matrix](../remediation/gap-matrix.md) · 任务 [../ops/short-term/2026-09-24-single-binary-deploy-design.md](../ops/short-term/2026-09-24-single-binary-deploy-design.md)
---
## 1. 目标与非目标
### 1.1 目标
1. **单一 Go 二进制交付** `agent-server`:内嵌前端 `web/dist`、工作流模板、agent 指令配置、goose 迁移;进程内合并 `cmd/events` 消费者。
2. **非容器化运行**:目标机不依赖 Docker Compose;PostgreSQL + pgvector 由本机安装,PI Agent Runner 以外置 sidecar 目录交付。
3. **覆盖三环境**:开发测试(dev)、内部测试(test)、生产上线(main),端口/数据隔离/密钥/模型 pin/晋升门禁与现拓扑语义对齐。
4. **渐进可回退**:`LOCALPG_MODE=off` 保留现有容器 DSN 语义;compose 路径在过渡期并存。
### 1.2 非目标(本设计明确不做)
- 把 Node/`pi-coding-agent`/pgvector `.so` 打进同一个可执行文件(全家桶)。
- 用 SQLite 重写业务库与向量检索层(`<=>` 硬依赖 pgvector)。
- 生产多机 HA / 自动故障转移(与现状单机 compose 等价,不降级也不夸大)。
- 未经单独授权的 main 晋升、远端 push、gap-matrix 放宽。
- 变更 FEATURE-MATRIX 完成度(纯设计文档)。
### 1.3 决策摘要(已确认)
| 决策点 | 选择 |
|---|---|
| 交付边界 | 纯单文件 server;PI runner 外置 sidecar |
| PG 托管 | `LOCALPG_MODE=managed\|attach\|off`;dev 默认 managed;main 默认 attach;test 可选 |
| 共享 KB | test/main 仍可连运维共享实例;dev managed 可在同实例建第二 database |
---
## 2. 现状依据
### 2.1 三环境拓扑差异
| 维度 | dev (`agent-dev`) | test (`agent-test`) | main (`agent-main`) |
|---|---|---|---|
| HTTP / 业务 DB / PI / events | 8080 / 5433 / 18865 / 8088 | 8081 / 5434 / 18866 / 8089 | 8000 / 5435 / 18867 / 8090 |
| 数据根 | `./data/dev` | `./data/test` | `./data/main` |
| 实际运行 | compose 跑 system-db+pi-agent;`launch.sh` 排除 app,宿主 `bin/server` + Vite :3100 | 全容器,镜像 `*:test` | 全容器,`restart: always`;app `depends_on: events healthy` |
| 模型 | MiniMax-M2.7-highspeed | MiniMax-M3(release pin) | MiniMax-M3 |
| 密钥 | 默认可缺省 | DB/ADMIN `:?required` | DB/ADMIN/RUNNER_TOKEN/KB `:?required`;`AUTH_REGISTRATION_ENABLED=false` |
| DB init 挂载 | `context_init.sql` | `extensions_init.sql` | `00001_baseline.sql` |
| 晋升 | — | rc tag + promotion-receipt | release tag(`release-to-main.sh`) |
| 共享 KB | 三环境共用 `shuimu-kb-shared:5432` / `regulations` | 同左 | 同左 |
### 2.2 代码事实(改造锚点)
| 能力 | 现状 | 单二进制化路径 |
|---|---|---|
| Go 服务 | `CGO_ENABLED=0` 静态编译([`deploy/app/Dockerfile`](../../deploy/app/Dockerfile)) | 天然可交付静态二进制 |
| 前端静态资源 | [`internal/server/static_assets.go`](../../internal/server/static_assets.go) 纯磁盘候选路径 | `go:embed` +「磁盘优先 → embed 回退」 |
| 文档模板 | [`templates/embed.go`](../../templates/embed.go) 已嵌 `docs/*.md`;[`internal/template/loader.go`](../../internal/template/loader.go) embed→磁盘双通道 | 扩展 configs embed;沿用双通道 |
| goose 迁移 | [`internal/db/migrate.go`](../../internal/db/migrate.go) 磁盘目录;goose v3 支持 `SetBaseFS` | embed.FS + 可选磁盘覆盖 |
| events | [`cmd/events`](../../cmd/events) 独立二进制 :8088/8089/8090 | 抽为 internal,server 内 goroutine;cmd 保留过渡 |
| PI runner | Node 22 容器 + `pi-coding-agent@0.85.1` + `deploy/pi-agent/*.mjs`;HTTP `PI_AGENT_RUNNER_URL`;另有 `PiAgentBin` CLI 回退 | 外置 sidecar;不进 Go 二进制 |
| 向量检索 | [`internal/kb/retrieve.go`](../../internal/kb/retrieve.go) 使用 `<=>` | 继续依赖本机 pgvector |
| 生产密钥门禁 | [`validateProductionSecrets`](../../internal/config/config.go)(ENV=main) | 保留,并由 preflight/EnvironmentFile 等价落地 |
---
## 3. 目标架构
```mermaid
flowchart TD
subgraph bundle["交付物 agent-server-VER-linux-amd64.tar.gz"]
BIN["agent-server 单二进制<br/>embed: web/dist + configs + goose<br/>in-process: events 消费者"]
SIDE["pi-runner-sidecar/<br/>node_modules + *.mjs + start.sh"]
UNIT["systemd 单元模板 ×3 环境"]
PREF["preflight.sh"]
end
BIN -->|"dev: managed"| PGD["localpg 子进程<br/>unix socket<br/>PGDATA=DATA_DIR/pg"]
BIN -->|"test: managed 或 attach"| PGT["本机原生 PG 实例"]
BIN -->|"main: attach"| PGM["独立 systemd postgresql@16<br/>崩溃隔离 / 独立备份"]
BIN -->|"PI_AGENT_RUNNER_URL"| NODE["node22 sidecar"]
PGM -.->|"POSTGRES_SHARED_KB_DSN"| KB["共享 KB PG regulations"]
```
### 3.1 PG 托管三级(`internal/localpg`)
环境变量 `LOCALPG_MODE`:
| 模式 | 行为 | 默认环境 |
|---|---|---|
| `managed` | 发现 `pg_ctl`/`initdb` → `initdb`(若 `PGDATA` 空)→ 拉起 postmaster(unix socket,可选 TCP 绑定环境端口)→ `createdb` + `CREATE EXTENSION vector` → 复用 `RunMigrations`;SIGTERM 逆序停库 | **dev** |
| `attach` | 不启停 postmaster;仅连接 `APP_DB_DSN` + 启动迁移;缺库/缺扩展由 preflight 拒绝 | **main**;test 可选 |
| `off` | 现状语义:完全依赖外部 DSN(含 Docker 网络主机名) | 过渡期 / 兼容 compose |
统一 bootstrap 覆盖今日 compose 三套 init SQL 差异:扩展创建 + 基线迁移由 goose 链承担,不再按环境挂不同 `docker-entrypoint-initdb.d` 文件。
共享 KB:
- **dev + managed**:同实例第二 database `regulations`(或 `KB_DB_NAME`),DSN 指向本地 socket。
- **test / main**:`POSTGRES_SHARED_KB_DSN` 指向运维管理的共享实例(保持「知识库共享、业务库隔离」)。
### 3.2 资产嵌入与解析优先级
| 资产 | 包建议 | 运行时解析 |
|---|---|---|
| `web/dist`(含 `.br`/`.gz`) | `web/embed.go` → `embed.FS` | **DATA_DIR 或 cwd 磁盘优先** → embed 回退(dev Vite/热更不破坏) |
| `configs/agents|shared|overlays` | `configs/embed.go` | 同 loader 双通道:embed 优先或磁盘覆盖(与现模板策略对齐后统一文档) |
| `deploy/postgres/goose/*.sql` | `goose/embed.go` + `goose.SetBaseFS` | 磁盘目录存在则优先(运维补丁);否则 embed |
| `templates/docs` | 已存在 | 保持 |
静态服务保留现有 Accept-Encoding 协商(br > gzip);embed 变体通过 `fs.FS` + `http.FileServer`/`ServeContent` 可读实现(需 `io.ReadSeeker`;可用字节缓冲包装)。
### 3.3 events 合并
- 将 `cmd/events` 消费循环抽到 `internal/app/eventsconsumer`(或等价包),由 `cmd/server` 启动时按 `EVENTS_INPROCESS=true`(默认 true)拉起。
- `/api/v1/ready`:迁移完成 **且** 消费者就绪后才放行(替代 main compose 中 `app depends_on events healthy`)。
- `cmd/events` 独立入口保留至少一个大版本,便于灰度与排障;端口语义在 in-process 模式下不再对外暴露(或仅 loopback 诊断)。
### 3.4 PI runner sidecar
目录布局(示意):
```text
pi-runner-sidecar/
start.sh # 自 entrypoint.sh 移植:写 models.json / settings.json
runner.mjs, pi-args.mjs, result-v1.mjs, settle-policy.mjs, ...
extensions/
package/ # 或预装 node_modules(含 @earendil-works/pi-coding-agent@钉扎版本)
```
- 绑定 `DATA_DIR/workspaces`、`DATA_DIR/agent_sessions`。
- server:`PI_AGENT_RUNNER_URL=http://127.0.0.1:<env-port>` + `RUNNER_AUTH_TOKEN`(main 必填,与现校验一致)。
- 可选回退:`PiAgentBin` + bridge(仅非产品验收路径;产品验收仍须真实 Runner HTTP)。
---
## 4. 三环境部署设计
### 4.1 dev — 开发测试
**目标**:去掉对本机 Docker 的硬依赖,同时保留热更新体验。
| 项 | 约定 |
|---|---|
| 前端 | 继续 Vite `:3100`;API 代理 → `127.0.0.1:8080`。生产静态由 embed 提供,dev 不强制走 embed。 |
| 后端 | `go run` / `bin/server`;`ENV=dev`,`DATA_DIR=./data/dev`,`LOCALPG_MODE=managed`,`PGDATA=$DATA_DIR/pg` |
| PI | 本机 sidecar `:18865`;模型保持 **M2.7-highspeed** |
| 启动 | `scripts/launch.sh --no-docker`:managed PG + sidecar + server + Vite;原 compose 路径保留为 `--docker`(默认可暂保持现行为,文档标明迁移日程) |
| demo seed | 语义不变;不因部署形态放宽生产红线 |
验收(工程层):`go test -short` 相关包、preflight 过、本机 `/health`/`/ready`;产品链路仍按验证契约在获授权时用真实 Runner。
### 4.2 test — 内部测试部署
**目标**:单二进制首次完整落地;对齐 rc 晋升。
| 项 | 约定 |
|---|---|
| 前置 | `postgresql-16` + `pgvector` + `node ≥ 22`;`preflight.sh` 缺项即失败 |
| PG | 默认 `attach`(内部机常由运维预装)或 `managed`(单人测试机);端口语义 **5434** |
| HTTP / PI | **8081** / **18866** |
| 配置 | `ENV=test`,`SEED_DEMO_USERS=false`,模型 **MiniMax-M3** |
| 安装 | 解包 tar.gz → preflight → 写入 `/etc/agent/test.env`(或 `$DATA_DIR/.env`)→ `systemctl enable --now agent-server-test` + `pi-runner-test`(可非开机自启,按站点策略) |
| 晋升 | `promote-to-test.sh` / promotion-receipt **门禁不变**;新增:**从 rc tag 源码构建** `agent-server-<rc>-linux-amd64.tar.gz`,**sha256 写入收据** |
| 验收 | 验证契约「产品 PI 基线」:真实 Runner 全链路 + `/health` + `/ready` + 范围冒烟;报告入 `.doc/test-reports/` |
### 4.3 main — 生产上线
**目标**:可运维、可备份、密钥与现 compose 硬校验等价;须**单独授权**。
| 项 | 约定 |
|---|---|
| PG | **强制 `attach`**:独立 `postgresql` systemd 单元;便于 `backup-system-db.sh`、崩溃隔离、小版本升级 |
| HTTP / DB / PI | **8000 / 5435 / 18867** |
| 密钥 | `EnvironmentFile=/etc/agent/main.env`(模式 `0600`);启动前 preflight 强校验:`SYSTEM_DB_PASSWORD`、`ADMIN_PASSWORD`、`RUNNER_AUTH_TOKEN`、`KB_DB_PASSWORD`;复用 `validateProductionSecrets` |
| 重启 | systemd `Restart=always`(等价 compose) |
| 就绪 | 进程内:迁移完成 + events 消费者就绪 → `/ready` |
| 红线保持 | `ALLOW_IN_MEMORY=false`、`AUTH_REGISTRATION_ENABLED=false`、`FAV_DEGRADED_READ=false`、`FAV_PUBLISHER_ENABLED=false`;不因形态变更放宽 [gap-matrix](../remediation/gap-matrix.md) |
| 发布 | `release-to-main.sh` 流程不变;`install-main.sh` **仅授权后**执行;制品身份(tag + sha256)入账 |
---
## 5. 交付物与构建
### 5.1 产物布局
```text
agent-server-<version>-linux-amd64.tar.gz
├── agent-server # 单二进制
├── pi-runner-sidecar/ # 外置
├── deploy/systemd/
│ ├── agent-server-dev.service
│ ├── agent-server-test.service
│ ├── agent-server-main.service
│ ├── pi-runner-dev.service
│ ├── pi-runner-test.service
│ └── pi-runner-main.service
├── scripts/preflight.sh
├── scripts/install-test.sh # 内部测试
├── scripts/install-main.sh # 生产;需授权标记
└── SHA256SUMS
```
### 5.2 构建脚本(拟)`scripts/build-single-binary.sh`
1. `web/`:`env -u VITE_ENABLE_DEMO_SEEDS npm ci && npm run build`(含 precompress)
2. 可选跑 `scripts/check-prod-bundle.sh`
3. `CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w -X main.version=…" -o dist/agent-server ./cmd/server`
4. 组装 sidecar(钉扎 `pi-coding-agent` 版本与 Dockerfile 一致)
5. 打包 tar.gz + `sha256sum`
构建机需要 Node(仅构建前端与 sidecar),目标运行机:Go 二进制无 Node(除 sidecar 外)。
### 5.3 环境变量对照(摘录)
| 变量 | 作用 | main |
|---|---|---|
| `ENV` | `dev`/`test`/`main` | `main` |
| `LOCALPG_MODE` | managed/attach/off | `attach` |
| `APP_DB_DSN` / `CONTEXT_*` | 业务库 | 必填 |
| `POSTGRES_SHARED_KB_DSN` | 共享 KB | 必填 |
| `PI_AGENT_RUNNER_URL` | Runner | 必填 + Token |
| `DATA_DIR` | 业务数据根 | `./data/main` 或绝对路径 |
| `HTTP_PORT` | 监听 | 8000 |
完整列表以 `.env.example` / `configs/.env.<env>.example` 为 SSOT;实施阶段同步增补 `LOCALPG_*` 键说明。
---
## 6. 实施阶段与验证
| 阶段 | 内容 | 验证(按契约选层) |
|---|---|---|
| **P1** 资产嵌入 | webdist/configs/goose embed;静态与 loader 双通道 | Go short 测 + 手工:无磁盘 dist 时仍能出 index;有磁盘覆盖优先 |
| **P2** events 合并 | in-process 消费者;ready 门闩;cmd/events 保留 | 单元/集成:投递→消费;ready 前后行为 |
| **P3** localpg | managed/attach/off + 优雅停 | 临时 PGDATA 冒烟;attach 负例(无 DSN 拒启) |
| **P4** 打包与单元 | build 脚本、sidecar、systemd、preflight、`launch.sh --no-docker` | 产物 sha;preflight 缺项;dev 无 docker 拉起 |
| **P5** |dev 全链路| | 工程冒烟 +(授权时)真实 PI |
| **P6** |test 部署演练| | rc 构建 + 安装 + 产品 PI 基线 + 报告 |
| **P7** |main(单独授权)| | release 制品 + install-main + gap-matrix 复核 + 生产冒烟 |
纯本设计文档任务的验收:**可审方案落盘 + 链接/拓扑/门禁一致性**;不记产品测试 PASS。
---
## 7. 风险与缓解
| 风险 | 环境 | 缓解 |
|---|---|---|
| pgvector `.so` 不随二进制分发 | 全环境 | preflight 检测;安装文档写明发行版包名 |
| 二进制体积 +~11MB(web/dist) | 全环境 | `-s -w`;后续可考虑压缩 embed(非必须) |
| embed 后模板热更新丢失 | 主要 main | 磁盘覆盖优先;运维可挂载补丁目录 |
| 与 compose 并存期状态噪音 | |dev| | `launch.sh` 明确互斥;文档标明切换步骤 |
| rc 产物未接入收据 | |test| | P6 把 sha256 写入 promotion-receipt 字段 |
| PG 子进程 vs 独立服务 | |main| | 本方案定 attach;managed 禁止作为生产默认 |
| 密钥从 compose 迁 EnvironmentFile | |main| | 0600 + preflight;禁止提交 env;操作审计记路径不记值 |
| 并发文档任务占用 `.doc` scope | 治理 | 本任务以文件级 scope 注册;与 `member-permissions-doc` 文件不重叠 |
---
## 8. 与现有规范的一致性声明
- **端口 / 数据路径 / 共享 KB**:与 [PROJECT.md](../../PROJECT.md) 表一致,不另起拓扑。
- **晋升**:dev→test(rc)→main(release)脚本与收据门禁保留;仅增加二进制制品身份。
- **验证**:实施后各阶段按 [验证契约](../ops/2026-09-21-validation-contract.md) 选层;产品链路禁止 stub 冒充 PASS。
- **红线**:FAV live / 注册关闭 / 禁止内存降级等与 compose main 对齐,不因非容器化放宽。
- **写入治理**:实施须新开 feature worktree + `agentctl` 租约;共享 CURRENT/MATRIX 走 docs apply。
---
## 9. 改造点清单(实施时回链)
| # | 改造 | 关键路径 | 阶段 |
|---|---|---|---|
| 1 | webdist embed + 磁盘优先 | 新 `web/embed.go`;`internal/server/static_assets.go` | P1 |
| 2 | configs embed | 新 `configs/embed.go`;`internal/template/loader.go` | P1 |
| 3 | goose `SetBaseFS` | `internal/db/migrate.go`;新 embed 包 | P1 |
| 4 | events 合并 | `cmd/events` → `internal/app/eventsconsumer`;`cmd/server` | P2 |
| 5 | localpg | 新 `internal/localpg/` | P3 |
| 6 | 构建/安装/systemd | `scripts/build-single-binary.sh`、`deploy/systemd/`、`preflight.sh` | P4 |
| 7 | launch 无 docker | `scripts/launch.sh`;`deploy/pi-agent-sidecar/` | P4 |
| 8 | 环境验收 | P5–P7 见上 | P5–P7 |
---
## 10. 开放问题(实施前确认)
1. test 内部机默认 `attach` 还是 `managed`?(本设计允许二者,站点选一写入 `configs/.env.test`)
2. sidecar 是否 vendor 完整 `node_modules`,或安装时 `npm ci --omit=dev`?(体积 vs 可复现)
3. 共享 KB 在「完全离线单机演示」场景是否允许 managed 同实例双库作为正式支持模式?
---
## 11. 修订记录
| 日期 | 说明 |
|---|---|
| 2026-09-24 | 初稿:调研三环境 compose/launch/embed 现状;确认纯单文件 + managed/attach 分级;覆盖 dev/test/main |
@@ -0,0 +1,66 @@
# 受控文档三权流转控制完善(审核/批准/归档/重开 + 锁定期补充消化)
> 落地版 · `task_id=doc-review-lifecycle-2026-09-25` · 2026-09-25
## 1. 目标
在既有四态状态机(`drafting→reviewing→approving→approved`)上补齐四条缺口,不重造状态机:
| ID | 缺口 | 处理 |
|---|---|---|
| G1 | 锁定期补充误生成提案后卡死 | 积压账本 + `skipped_locked` |
| G2 | 职责人流转零通知 | 生命周期事件 + 收件人按槽位路由 |
| G3 | 批注不落库 / 权限过宽 | 阶段化矩阵 + resolve API + 前端落库 |
| G4 | 重开无 UI / 审批人仅创建人 | Approver 优先 + 创建人兜底 + 前端入口 |
## 2. 状态机(语义不变,正交积压)
```mermaid
stateDiagram-v2
drafting --> reviewing : submit_review
reviewing --> approving : review_approve
reviewing --> drafting : review_reject
approving --> approved : approver_approve
approving --> reviewing : approver_reject
approving --> drafting : approver_reject
approved --> drafting : reopen_approve
```
积压表 `document_pending_supplements`(goose `00073`)独立于 `document_records` 状态列。回 drafting 时 `DigestPendingOnReturnToDrafting` 标记 digested 并通知 author。
## 3. 锁定期补充闭环
1. `CreateFromSupplement`:`LockedSnapshot = IsLocked || state != drafting`;`BusySnapshot` 仍为编辑租约。
2. `Decide`:锁定项 → `OutcomeSkippedLocked` + `PendingLedger.Record` + 知会当前职责人(reviewing→reviewer,approving/approved→approver,缺位→author)。
3. 回 drafting(驳回/重开)→ 消化积压 + `pending_supplements` digest。
## 4. 流转通知收件人
| 事件 | 收件人 |
|---|---|
| `document.review_requested` | ReviewerID |
| `document.approval_requested` | ApproverID |
| `document.rejected` / `reopened` / `pending_supplements` | AuthorID |
| `document.approved` | AuthorID |
`docnotify.RecipientForDocEvent` 统一解析;lifecycle hook 在 `SubmitForReview` / `Review*` / `Approver*` / `ReopenForRevision` 成功后触发。
## 5. 批注权限矩阵
| 状态 | 可新增批注 |
|---|---|
| drafting | author, reviewer |
| reviewing | reviewer, author(回应) |
| approving | approver, reviewer |
| approved | 禁止新增(`ErrDocumentLocked`) |
| viewer | 恒只读 |
`POST /api/v1/docgov/comments/{id}/resolve`:author 在 drafting 可 resolved;reviewer 可 reopen。
## 6. 重开审批
`handleProjectTraceReopenApprove`:文档 `ApproverID` 且成员仍 active → 可批;全部批准人缺位/退出 → 项目创建人兜底。前端 approved 态提供「申请再修订」。
## 7. 明确不做
- 不新增第五状态、不改 `IsLocked` 语义、不引入批量审批委托、不动 FAV 归档链路。
+19 -2
View File
@@ -20,7 +20,7 @@
| 项 | 链接 |
|-----|------|
| 主报告(SSOT) | [../remediation/2026-09-22-t20-hardening-design.md](../remediation/2026-09-22-t20-hardening-design.md) |
| 主报告(SSOT) | [./2026-09-22-t20-hardening-design.md](./2026-09-22-t20-hardening-design.md) |
| 本目录迁址桩 | [2026-09-22-t20-hardening-design.md](2026-09-22-t20-hardening-design.md) |
| 任务 | [../ops/short-term/2026-09-22-t20-design-items.md](../ops/short-term/2026-09-22-t20-design-items.md) |
| 一句话总结 | XFF/锁拆分/statement_timeout/turn 补偿/shutdown/SSE POST/前端 generation/密码与 Cookie/容器与备份等设计决策;F5/I8 见 lowrisk 批 |
@@ -182,6 +182,22 @@
---
### 10. 项目成员权限总览
| 项 | 链接 |
|-----|------|
| 主文档 | [2026-09-24-member-permissions-overview.md](2026-09-24-member-permissions-overview.md) |
| 一句话总结 | 三层模型(系统角色 / 项目成员角色 / 文档三权)下,对话、执行任务、补充信息、文档编制与修改各动作的服务端+前端授权整合 |
**核心要点**:
- 三层**正交**:系统角色定能力、`project_role` 定入项目、`document_duty` 定送审/审核/批准;author/reviewer/approver 不得写进 `project_role`。
- 服务端读项目对象只看"是否 active 成员",**不区分 member/viewer**;真正差异在 owner/creator(管成员、终止他人任务、改派职责、激活/推进/终止实例)。
- 受控文档动作走 `deny_only_submit`:view/edit/run 成员级,submit/review/approve 绑单一职责,创建人不隐式越权。
- 前端 capabilities 仅体验层,`undefined` 即 fail-closed;硬拒绝永远在服务端 handler。
---
## 🏗️ 在整体架构中的位置
```
@@ -248,6 +264,7 @@
├── 2026-09-20-module-development-standards.md ← 开发者入口:契约 / 接口 / 故障隔离
├── 2026-09-20-stage-backtrack-and-impact-loop-design.md ← 阶段回溯与影响闭环
├── 2026-09-22-t20-hardening-design.md ← 迁址桩 → remediation T20 设计 SSOT
├── 2026-09-24-member-permissions-overview.md ← 项目成员权限总览(对话/任务/补充/文档三权)
.tmp/ ← 中间分析文件
├── intent-recognition/
@@ -272,7 +289,7 @@
| 文档 | 说明 |
|------|------|
| [../remediation/2026-09-22-t20-hardening-design.md](../remediation/2026-09-22-t20-hardening-design.md) | T20 W4 设计决策 SSOT(本目录仅留迁址桩);配套 [任务](../ops/short-term/2026-09-22-t20-design-items.md) |
| [./2026-09-22-t20-hardening-design.md](./2026-09-22-t20-hardening-design.md) | T20 W4 设计决策 SSOT(本目录仅留迁址桩);配套 [任务](../ops/short-term/2026-09-22-t20-design-items.md) |
## 🔗 相关资源
+110
View File
@@ -127,6 +127,7 @@ imports:
- projectworkflow
- storage
- supplementimpact
- swboot
- sysadmin
- taskrun
- traceimpact
@@ -464,6 +465,115 @@ table_owners:
- sysadmin
maintenance_windows:
- maintenance
# FIND-ARCH-01 回归补登记(2026-09-26):以下为既有写者的真实表。
# 多 owner 条目是现状快照(历史多写者),新包写入仍会被 block;
# 单一写者收敛在各模块整改批次处理,不在本批扩大。
agentx_workspace_registry:
- workspace
asset_parses:
- materialindex
auth_sessions:
- auth
chat_read_positions:
- ctxmgr
chat_sessions:
- ctxmgr
context_memory_chunks:
- ctxmgr
- storage
document_access_audit:
- freedoc
document_agent_candidates:
- docrevision
document_audit_logs:
- docgov
document_change_proposals:
- docgov
document_change_reports:
- docrevision
document_comments:
- docgov
document_content_blobs:
- docrevision
document_content_projections:
- docrevision
document_duty_assignments:
- projectinstance
document_lineage:
- projectworkflow
document_pending_supplements:
- docgov
file_references:
- storage
freeform_document_versions:
- freedoc
iam_system_config:
- auth
material_chunks:
- materialindex
outbox_events:
- notification
project_activities:
- ctxmgr
project_blackboards:
- ctxmgr
project_context_snapshot_sources:
- projectcontext
project_context_snapshots:
- projectcontext
project_doc_task_instances:
- projectinstance
project_members:
- authz
- docduty
project_source_bindings:
- projectworkflow
project_stage_instances:
- projectinstance
project_workflow_instances:
- projectinstance
project_workflows:
- projectworkflow
projects:
- ctxmgr
- docgov
- projectinstance
- projectworkflow
storage_blobs:
- storage
swboot_controlled_executions:
- swboot
system_role_permissions:
- authz
system_roles:
- authz
task_run_events:
- taskrun
template_assets:
- workflowdef
template_versions:
- workflowdef
user_credentials:
- auth
user_password_reset_audits:
- auth
user_preferences:
- ctxmgr
user_role_bindings:
- auth
users:
- auth
- docgov
workflow_activation_audits:
- projectworkflow
workflow_activation_tokens:
- projectinstance
workflow_definitions:
- workflowdef
workflow_runs:
- projectworkflow
workflow_versions:
- workflowdef
path_owners:
output.md:
@@ -0,0 +1,92 @@
# 受控文档三权流转控制完善 测试报告
## 一、测试背景 (Background)
补齐受控文档审核/批准/归档/重开链路与锁定期补充积压闭环(G1–G4),对应设计见 `.doc/system-design/2026-09-25-doc-review-lifecycle-design.md`。
## 二、测试目标 (Test Objectives)
1. 锁定态补充 → `skipped_locked` + 积压落账,不生成提案。
2. 流转通知收件人按职责槽位路由。
3. 批注阶段化权限矩阵(负例:viewer / approving 期 author)。
4. 重开审批:Approver 优先,缺位回退创建人(代码路径;HTTP 集成待环境)。
5. 前端批注策略与 API 形状。
## 三、测试方案与环境 (Test Plan & Environment)
- OS: Linux;Go 短测;前端 `tsx --test`。
- 层级:工程单元 / 包级短测(验证契约「工程工具验收补充」)。
- **真实 PI E2E**:本回合未获授权共享环境与产品 Runner 槽位,记为 **未运行**(不得冒充 PASS)。
## 四、预期结果 (Expected Results)
见各用例断言。
## 五、实际测试结果与判定 (Actual Results & Evaluation)
### 5.1 Go:`internal/docgov` / `supplementimpact` / `app/docnotify`
- **测试输入**:`go test ./internal/docgov/... ./internal/supplementimpact/... ./internal/app/docnotify/... -count=1`
- **实际输出**:
```text
ok chat-agent-system/internal/docgov 0.003s
ok chat-agent-system/internal/supplementimpact 0.002s
ok chat-agent-system/internal/app/docnotify 0.002s
```
- **评价判定**:PASS(含 `TestDecideLockedSkipsAndRecordsPending`、`TestAddCommentStageMatrix`、`TestRecipientForDocEvent`、`TestHandleReviewRequestedRoutesToReviewer`)
- **性能与耗时**:约 1–2s 量级冷启动后单包毫秒级
### 5.2 Go:`internal/server` short
- **测试输入**:`go test ./internal/server/ -count=1 -short`
- **实际输出**:`ok chat-agent-system/internal/server`(约 19s)
- **评价判定**:PASS
### 5.3 前端 commentPolicy
- **测试输入**:`./node_modules/.bin/tsx --test src/lib/commentPolicy.test.ts`
- **实际输出**:4 tests pass(stage matrix / viewer / resolve gates)
- **评价判定**:PASS
### 5.4 对话触发链路(批注 / 重开 / 积压 / 送审真执行)
- **测试输入**:
```bash
go test ./internal/intent/... ./internal/coordinator/... ./internal/chat/ \
-run 'TestIntentRecognition_DocGov_CommentReopenPending|TestListDocResolver|TestHandleDocGov|TestExecuteAction_' -count=1
```
- **实际输出**(摘录):
```text
ok chat-agent-system/internal/intent 0.008s
ok chat-agent-system/internal/coordinator 0.005s
ok chat-agent-system/internal/chat 0.005s
```
覆盖:查询语气/裸词「重开」负例、批注矩阵剪枝、DocResolver 0/多匹配澄清、送审确认卡→拍板 `docgov.submit_review`、comment/reopen action kinds 成功与权限失败路径。
- **评价判定**:PASS(对话触发与误触防护单测)
- **说明**:`TestChatSession_SemanticMemoryRecallAndAsyncTurnRecord` 仍偶发超时,与本变更无关,未纳入本节判定。
### 5.5 真实 PI E2E 全链
- **评价判定**:未运行(待授权环境:编制→送审→锁定批注→驳回→积压消化→再送审→批准→归档→重开;以及对话通道两步确认)
## 六、自动化测试套件汇总 (Test Suite Execution)
| 套件 | 结果 |
|---|---|
| `go test` docgov / supplementimpact / docnotify | PASS |
| `go test ./internal/server -short` | PASS |
| `commentPolicy.test.ts` | PASS |
| `go test` intent / coordinator / chat(对话触发子集) | PASS |
| 产品 PI E2E | 未运行 |
## 七、测试结论与后续优化建议 (Conclusion & Next Steps)
- 单元与短测覆盖 G1–G3 主路径与负例;G4 审批人逻辑与对话触发四道防线(语法护栏、DocResolver、角色×阶段、确认卡)已落代码。
- 合入后建议:跑 goose `00073`、再跑一次真实 PI 全链(含对话送审/批注/重开)并回填本节 5.5。
@@ -0,0 +1,48 @@
# P10 backlog 价值评估与择优实施 测试报告
## 一、 测试背景 (Background)
总控 P10:两份 backlog(p6-backlog + rdev-phase2)逐项评估定做/不做。评估结论:B5(报价校验复核)与 A5(小队非关键降级)本批实施;A6/D5/R1/R4–R7 登记不做(依据见 [任务文](../ops/short-term/2026-09-25-p10-backlog-triage.md))。
## 二、 测试目标 (Test Objectives)
1. B5:`quote` 输入校验 fail-closed(空名/空表/负值/NaN/Inf);复核不变式(行合计=总额、buffer/margin/tax 费率自洽)。
2. A5:非关键步骤失败转 `degraded` 继续;关键步骤失败行为不变。
## 三、 测试方案与环境 (Test Plan & Environment)
- OS:Linux;Go 1.27.1;worktree `.worktrees/backlog-triage-p10-2026-09-25`(base dev `4bdbb0da`)。
- 层级:工程层单测(真实 WorkspaceEngine/PrepareWorkspace + fail-first backend)。
## 四、 预期结果 (Expected Results)
| # | 用例 | 预期 |
|---|---|---|
| T1 | `TestValidateInput`(7 组畸形输入) | 全部拒绝;合法输入通过 |
| T2 | `TestCalculateAndFillRejectsBadInput` | NaN hours 返回 error、无文件产出 |
| T3 | `TestReviewSummaryRateInvariants` | 自洽数据通过;buffer 失衡被拒 |
| T4 | `TestNonCriticalStepDegradesAndContinues` | Success=true + DegradedSteps=[step_01] + wf=degraded + step_02 completed |
| T5 | `TestCriticalStepFailureStillAborts` | err 非 nil + wf=failed + 后续步骤不跑 |
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
- T1:PASS(7/7 畸形拒绝 + 合法通过)
- T2:PASS
- T3:PASS(初版测试数据 TotalPrice 与行合计不一致被正确拦截——复核器按预期工作;修正测试夹具后通过)
- T4:PASS(backend.calls=2 证明降级后续跑;`step_degraded` 治理审计落 `gov_audit`)
- T5:PASS(backend.calls=1,默认关键语义零变更)
- 全量:`go test -short ./...` 无 FAIL;`arch-check --mode block` production gate passed
## 六、 自动化测试套件汇总 (Test Suite Execution)
| 套件 | 结果 |
|---|---|
| `go test ./internal/quote/` | PASS(4 用例含既有 TestCDOQuoteGeneration) |
| `go test ./internal/squad/` | PASS(含 2 新用例 + 既有全量) |
| `go test -short ./...`(全仓) | PASS(0 FAIL) |
| `arch-check --mode block` | PASS |
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
- B5/A5 达到交付终点;A6(已修复)、D5(维持共享)、R1(另立任务)、R4/R5/R6/R7(前置未满足/已落地/低优)评估结论入档。
- 后续:R1 N/A 生成模式若启动需跨 manifest/bizdev/squad/前端四点联动独立认领;squad 并行组降级(本批只覆盖串行路径)可作 A5 二期。
@@ -0,0 +1,80 @@
# P9 web-sysadmin 残差收口 测试报告
## 一、 测试背景 (Background)
MATRIX `web-sysadmin` 行尾注三项 deferred:Playwright 实跑、KB 运维动作、白名单项接消费方。总控 P9 批次授权收口。
## 二、 测试目标 (Test Objectives)
1. `ui.maintenance_notice` / `ui.read_only_mode` 白名单设置接运行时消费方(公开状态端点 + 前端横幅)。
2. admin-console Playwright spec 对真实 dev 栈实跑取证。
3. KB 运维动作给出做/不做结论与依据。
## 三、 测试方案与环境 (Test Plan & Environment)
| 项 | 值 |
|---|---|
| OS | Linux 7.0.0-31-generic |
| worktree | `.worktrees/websysadmin-residual-2026-09-25`(base dev `c5027788`) |
| dev 栈 | 本机 `bin/agent-server`(:8080,PG `agent_system_dev@5433` schema 72) |
| Playwright 通道 | docker `mcr.microsoft.com/playwright:v1.63.0-noble`(宿主缺 libatk 且无 sudo,改镜像跑;`--network host` 对真实 dev 栈) |
| 证据目录 | `assets/2026-09-25-websysadmin-residual/` |
## 四、 预期结果 (Expected Results)
- 白名单消费方:PUT `ui.maintenance_notice` → 公开 status 返回 notice(本批代码合入后生效;运行中旧版本服务不体现新字段属预期)。
- Playwright:`admin console smoke` 登录→管理台→8 分组渲染→返回工作台 PASS。
- 公开路由:`/api/v1/maintenance/site-status` 匿名 200。
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
### 5.1 白名单消费方(Go 层)
- **Input**:`maintenance.NewService(fakeStore{ErrNotFound})` + `SetSiteSettings`(返回 notice/readOnly)
- **Output**:`TestCurrentStatusCarriesSiteSettings`、`TestCurrentSiteStatus`、`TestCurrentStatusWindowPlusSite` 全 PASS(notice/readOnly 贯穿无窗口/有窗口路径)
- **判定**:PASS
- 耗时:<1s
### 5.2 公开端点
- **Input**:`TestMaintenanceSiteStatusPublic` 匿名 GET + `TestIsPublicRouteMaintenanceSiteStatus` 路由豁免表
- **Output**:均 PASS(200 + `site_notice` 状态 + notice/readOnly 字段)
- **判定**:PASS
### 5.3 Playwright 实跑(真实 dev 栈)
- **Input**:docker 镜像内 `node node_modules/playwright/cli.js test e2e/admin-console.spec.ts --project=chromium`,`RUN_UI_ACCEPTANCE=1`,`BASE_URL=http://127.0.0.1:8080`,admin 真实凭据
- **Output**:
```
Running 1 test using 1 worker
✓ 1 [chromium] › e2e/admin-console.spec.ts:22:1 › admin console smoke: enter, nav renders, exit back to workbench (1.2s)
1 passed (1.8s)
```
- **判定**:PASS(登录→管理台→8 分组→返回工作台全链路真实栈)
- **性能与耗时**:单用例 1.2s
- **证据**:`assets/2026-09-25-websysadmin-residual/playwright-report-main/`、`playwright-output-main/`
### 5.4 运行中 dev 栈写读回环(旧二进制)
- **Input**:admin PUT `ui.maintenance_notice` = "P9 验收:系统今晚 23:30 例行维护演练"
- **Output**:200 + 白名单返回更新值(写入生效);旧二进制 `/maintenance/status` 无 notice 字段(新端点未部署,属预期)
- **判定**:PASS(写入路径与既有审计链路正常;新消费端点待 dev 重建后生效)
### 5.5 KB 运维动作
- **结论**:不做(超边界)。`internal/kb` 为纯只读检索客户端,无 rebuild/index 写路径;重建/索引属共享基础设施容器 `shuimu-kb-shared` 侧能力(见 `scripts/migrate_shared_kb.sh` 口径)。管理台 KB 分组维持只读连接拓扑展示。
## 六、 自动化测试套件汇总 (Test Suite Execution)
| 套件 | 结果 |
|---|---|
| `go test -short ./internal/server/ ./internal/maintenance/ ./internal/sysadmin/` | PASS(3 包,含 5 个新用例) |
| `cd web && npm test` | PASS 34/34 |
| `cd web && npm run build` | PASS |
| docker Playwright admin-console | PASS 1/1 |
| `go vet`(maintenance/sysadmin/server) | PASS |
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
- P9 三项残差收口完成:白名单消费方已接线(代码层全绿)、Playwright 实跑取证 PASS、KB 运维登记不做(边界依据明确)。
- 后续:dev 栈重建后 `site-status` 端点生效,可补一条真实 HTTP notice 展示证据;其余白名单键(`chat.default_session_role` 等)消费方属各自业务模块后续任务。
@@ -0,0 +1,60 @@
# 语义摘要 REPLACE fail-closed 灰度接线 测试报告
## 一、测试背景 (Background)
FEATURE-MATRIX `chat-semantic-replace` 行关闭条件:用户独立授权(本任务授权来源:用户会话指令明确要求完成本行,满足 Wave5 X-2 密封解封条件)+ fail-closed 灰度设计。此前 `SEMANTIC_SUMMARY_REPLACE` 密封不接线。
## 二、测试目标 (Test Objectives)
1. fail-closed:master 开而 allowlist 空 → 不替换任何会话;任一校验失败(模型错误/超长/stale watermark)→ deterministic 保留
2. 灰度:仅 allowlist 会话在 shadow 报告 OK 且 served watermark 一致时替换 served Narrative;Facts/计数保持 deterministic
3. 回滚安全:替换后关闭开关,下一轮确定性再生成不含语义残留
4. digest(每日纪要)保持 advisory-only
## 三、测试方案与环境 (Test Plan & Environment)
- 单元:`internal/ctxmgr/semantic_replace_test.go`(7 用例:空 allowlist/命中/未命中/模型错误/超长/stale/flag 解析 + 回滚残留)
- 工程:`arch-check --mode block`、`go vet ./...`、`go test -short ./...`(候选 `cd1f846f`、`6004494e`)
- 运行时:本机 no-docker dev(`bin/agent-server` @ dev `6004494e`;PI Runner MiniMax-M2.7-highspeed;产品 PI no-tool summarizer 由组合根注入)
- 过程修复:dev localpg 的 `chat_summaries.freshness_note/shadow_json` 与 `chat_summary_shadow_jobs` 缺失(goose 62 版本已记但对象缺失的 schema 漂移)——按 62 号幂等 Up DDL 修复并留档
## 四、预期结果 (Expected Results)
| 用例 | 预期 |
|---|---|
| 单测矩阵(7+1) | 全 PASS |
| allowlist 会话溢出窗口 | source=semantic_replace、真实语义叙事、model=MiniMax |
| 非 allowlist 会话 | source=deterministic |
| 回滚(replace off + 新轮) | source=deterministic 且叙事无语义文本残留 |
## 五、实际测试结果与判定 (Actual Results & Evaluation)
### 5.1 单元/工程
- `go test ./internal/ctxmgr/ -run SemanticReplace`:**8/8 PASS**(含回滚残留用例)
- 既有密封负例 `TestSemanticSummary_ShadowOKKeepsDeterministic`(Replace:true 无 allowlist)保持 PASS——master 位单独打开不替换任何会话
- sysadmin 目录断言更新为新契约(shadow/degraded + allowlist 键默认空)PASS;`arch-check`/`vet`/`-short` 全 PASS
### 5.2 dev 运行时阶梯([runtime-ladder.txt](./assets/2026-09-26-chat-semantic-replace/runtime-ladder.txt))
1. **替换**:`sess-csr-hit2`(allowlist)窗口溢出后 `source=semantic_replace`,served Narrative 为真实 MiniMax 语义叙事(“用户启动手持超声新项目…客户为华西医院,预算约500万…”),freshness_note 记录 `semantic_replace: narrative replaced from MiniMax-M2.7-highspeed` **PASS**
2. **隔离**:同配置 `sess-csr-miss2` `source=deterministic`(shadow job 完成但未替换)**PASS**
3. **回滚**:重启 `SEMANTIC_SUMMARY_REPLACE=false` + 新增 15 轮 → rev5 `source=deterministic`,叙事为规则叙事(“双方开展了研发立项与合规细节沟通…”)**无语义残留 PASS**
### 5.3 过程缺陷与修复(运行时验证发现)
- **回滚残留缺陷**:确定性生成器合并 prior served 叙事(`summarizer.go` narrativeParts 以 `oldSum.Narrative` 起始),替换后回滚会把语义文本带入后续确定性叙事。修复(dev `6004494e`):替换时将被换下的确定性叙事存入 shadow 报告 `displaced_narrative`(随 `shadow_json` 持久化);确定性合并遇 `source=semantic_replace` 优先取回 displaced 叙事。单测 `TestSemanticReplace_RollbackLeavesNoResidue` + 运行时阶梯 3 覆盖。
## 六、自动化测试套件汇总 (Test Suite Execution)
| 套件 | 结果 |
|---|---|
| `go test ./internal/ctxmgr/ ./internal/sysadmin/` | PASS |
| `arch-check --mode block` / `go vet` / `go test -short ./...`(候选) | PASS |
| dev 运行时阶梯(替换/隔离/回滚) | PASS |
## 七、测试结论与后续优化建议 (Conclusion & Next Steps)
**结论**:fail-closed 灰度设计已实现并经单元 + dev 真实链路验收——双开关(master + 会话 allowlist,默认全关)、四重前置校验(OK 报告/digest/watermark/长度)、Facts 与 digest 不变式、回滚无残留。默认关闭下零行为变化(负例保持)。FEATURE-MATRIX 行可升 `done`。
**后续**:放量阶梯 `off → 白名单会话 → 更广`,各环境开启需单独授权;`chat_summaries` 无外部读端点,验证经 DB/内部状态,后续可在管理台补只读视图。
@@ -0,0 +1,67 @@
# 降级功能开关放量 dev — 测试报告
- **task_id**: degraded-flags-enable-2026-09-26-r4
- **日期**: 2026-09-26
- **环境**: dev 单二进制(`launch.sh --no-docker`,`bin/agent-server` PID 1432360,LOCALPG_MODE=managed,schema 75)
- **基线**: dev `66ea4e3e` → 集成 `6b317181`(代码:REPLACE SESSIONS `*` 通配 + compose 声明 + 目录/示例)
- **验证人**: pi(agent: pi / Claude)
## 一、验证范围
用户授权启动的降级项(授权来源见任务短文):`MULTI_INTENT_PLAN_TIER`(legacy→confirm,allowlist `*`)、U9–U12 域名 flag、`SEMANTIC_SUMMARY_SHADOW`、`SEMANTIC_SUMMARY_REPLACE(+SESSIONS=* 通配)`、`PI_CHANGE_REPORT_NARRATIVE`。不改动 `WORKFLOW_SCOPE_MODE=strict` 与 5 个 P8 逐键 live flag。
## 二、工程门禁(候选 6b317181,agentctl validate run a4289f75)
| 命令 | 结果 |
|---|---|
| `./scripts/arch-check.sh --mode block` | PASS(production gate passed) |
| `go vet ./...` | PASS |
| `go test -short ./...` | 72 包全 ok,0 失败 |
| 新增单测 | `TestSemanticReplace_WildcardAllowlistSwapsNarrative`、`TestSemanticReplace_WildcardMasterOffKeepsDeterministic`、`TestSemanticReplace_FlagParsing`(通配/混合/空/关 master)全 PASS |
## 三、运行时验证(真实链路)
### 3.1 进程开关快照(GET /api/v1/admin/system/features)
| 键 | 生效值 | 判定 |
|---|---|---|
| MULTI_INTENT_PLAN_TIER | `confirm` | ✅ |
| INTENT_PLAN_PROJECT_ALLOWLIST | `*` | ✅ |
| MULTI_INTENT_U9/U10/U11/U12 | `true`×4 | ✅ |
| SEMANTIC_SUMMARY_SHADOW | `true` | ✅ |
| SEMANTIC_SUMMARY_REPLACE | `true` | ✅ |
| SEMANTIC_SUMMARY_REPLACE_SESSIONS | `*` | ✅ |
| PI_CHANGE_REPORT_NARRATIVE | `true` | ✅ |
| WORKFLOW_SCOPE_MODE | `strict` | ✅(不变更) |
`adapter=degraded` 标签为 sysadmin 静态接线目录(源码事实,不随配置翻转),预期保留。
### 3.2 健康与制品
`/api/v1/health`、`/api/v1/ready` 均 `status=ok`(env dev、schema 75、kb/db/events ready);二进制为合并后代码重建(launch 构建日志 `.tmp/launch/server.log`)。
### 3.3 intentflow(confirm 档 + U9 分段 + allowlist)
- 真实对话(项目 6579「新的测试项目」/ 未绑项目会话各一轮):`intent_result.plan_shadow` = `{"enabled":true,"segmenter_version":"segmenter.v2","segment_count":2,"combo_hint":"read_only|needs_confirm","legacy_plan_attached":true,"counterfactual_auto_read":"would_execute"}` —— elevated tier 激活、规则分段 2 段、allowlist 放行、shadow 反事实链路运行;confirm 档确认前零写。
- 观察:两轮均未产生 `intent_plans` 新行(P8 后策略:域名 flag 开而逐键 live flag 关时保持 dry-run;matrix 已注「dev 运维侧逐键 flag 开启与 PI 证据采集待续」)。不判为回归,留待逐键放量任务。
### 3.4 语义摘要 shadow → REPLACE 通配(本次新代码)
- 会话 `sess-flags-verify-r4-20260926`(**开 flag 后新建、从未枚举进任何名单**)两轮真实对话后:
- `chat_summary_shadow_jobs` id=18 `status=done`(durable job 完成,真实 MiniMax reasoning 链路)
- `chat_summaries` served Narrative:`source=semantic_replace`,叙事「用户请求查询项目风险,并在此基础上进一步查询相关法规。」
- 判定:**通配符 `*` 覆盖全部会话(含后续新建)PASS**;Facts/计数不受影响(契约范围仅 Narrative)。
### 3.5 PI 变更报告叙事
flag 已生效(3.1 快照)。live 触发未在本轮重跑:能力经 2026-09-23 收口真实 MiniMax 复测 PASS(截断差异输入 + reasoning 落盘),本次为 env 翻转;待下次自然变更报告事件观察,未观察到启动期错误。
## 四、回归与回滚
- 回滚杠杆:根 `.env` 对应键改回 `legacy/false/*→空` 后重启即恢复;REPLACE 关 master 后下一轮摘要自然回 deterministic(既有 csr 任务已验证无残留)。
- 防泄漏:`configs/.env.test`、`configs/.env.main` 已钉默认(legacy/false/空),test/main compose 重建不继承根 `.env` 新键;`configs/.env.dev` 与根 `.env` 对齐(容器路径一致性)。
- 观察项:server.log 单条既有 WARN `ctxmgr_reflect_msgs_scan_incomplete`(NULL user_id 扫描),与本次变更无关,未处理。
## 五、结论
用户授权范围内的 5 组降级功能全部在 dev 运行态启动并验证:进程快照全生效;intentflow elevated tier + U9 分段真实激活;语义摘要 shadow→replace 通配链路在新建会话上端到端命中。**整体 PASS**(PI 叙事 live 触发与逐键放量留待后续,见任务短文观察项)。
@@ -0,0 +1,82 @@
# dialogue-ctx-injection 收口(dev 迁移 + 真实 PI 落盘 + 冲突确认卡冒烟)测试报告
## 一、测试背景 (Background)
FEATURE-MATRIX `dialogue-ctx-injection` 行关闭条件:dev 迁移 goose 00071(实际编号 00072,因 maintenance-windows 占号顺延)+ 真实 PI 落盘核验 + 冲突确认卡冒烟。收口分析发现 trigger_user 路由的 PendingExpectation 在 `service_task_run.go` 调用点被丢弃,本轮先补齐接线(dev `ebb82820`)再验收;另修复 no-docker dev sidecar 任务路径硬编码容器扩展路径导致 PI 任务全挂的问题(dev `f89b946d`)。
## 二、测试目标 (Test Objectives)
1. dev 环境应用迁移:`goose_db_version=73` 且 `context_conflict_adjudications` 可写
2. 真实 PI 任务链路:清洗后对话注入小队工作区 `context/dialogue/`(五文件 + TASK.md 导航 + 权威度指引)
3. 冲突裁决入库:同级时间相近冲突 → `needs_confirm + trigger_user` 持久化
4. 冲突确认卡冒烟:卡片到达触发用户会话;回复「确认」→ 期望命中、黑板同步、确认话术
## 三、测试方案与环境 (Test Plan & Environment)
- 环境:本机 no-docker dev(`bin/agent-server` @ dev `f89b946d` + localpg managed PG18+pgvector + PI sidecar :18865,模型 MiniMax-M2.7-highspeed)
- 数据:新建项目 6633(zhanggong/uid10 创建,成员 11/12),main 工作流仅启用 `bd_intake`(author 10 / reviewer 11 / approver 12)
- 层级:真实产品链路(HTTP API + 真实 PI Agent Runner 任务执行)
- 证据:[assets/2026-09-26-dialogue-ctx-closeout/](./assets/2026-09-26-dialogue-ctx-closeout/)
## 四、预期结果 (Expected Results)
| # | 用例 | 预期 |
|---|---|---|
| 1 | dev health/迁移 | schema_version=73;adjudications 表存在 |
| 2 | 项目对话种子(5 条含 budget 冲突对) | 清洗保留事实轮;噪声/状态卡排除 |
| 3 | intake 任务(真实 PI) | run completed;workspace `context/dialogue/` 五文件;TASK.md 导航 |
| 4 | 冲突裁决 | budget=10万 vs 20万 → needs_confirm + trigger_user 入库 |
| 5 | 冲突确认卡 | 会话收到 CTX_CONFLICT_CARD 消息;「确认」→ EXPECTATION_HIT + 黑板更新 |
## 五、实际测试结果与判定 (Actual Results & Evaluation)
### 5.1 dev 迁移与就绪
- `GET /api/v1/health`:`schema_version=73`、database/events/kb ready=true([dev-health.json](./assets/2026-09-26-dialogue-ctx-closeout/dev-health.json))**PASS**
- `context_conflict_adjudications` 查询与写入成功(见 5.4)**PASS**
### 5.2 真实 PI 任务落盘(run_1790372128945688932)
- **输入**:`POST /api/v1/tasks/runs`(intake,项目 6633);真实 PI Runner 三步(organize/draft/review)
- **实际输出**:run **completed**;工作区 `intake_1790372128959911040`:
- `context/dialogue/{digest.md, turns.md, facts.json, CONFIRMATIONS.md, README.md}` 五文件齐备
- digest.md:纳入 10 轮 / 噪声排除 14(状态卡等),覆盖窗口当日
- facts.json:`customer_name`、`classification`、`budget`×2(冲突对)等事实抽出
- 三个步骤 TASK.md 均含 `../../context/dialogue/` 导航行;`context/README.md` 含 collab_dialogue 权威度指引
- 证据:[workspace-evidence.txt](./assets/2026-09-26-dialogue-ctx-closeout/workspace-evidence.txt)
- **判定**:**PASS**
### 5.3 冲突确认卡冒烟(两次:失败 run 与 completed run 各一次)
- **输入**:budget 冲突对(「预算大概10万」 vs 「预算还是要20万吧…」,30 分钟内、无明确证据词)→ 任务运行
- **实际输出**:
- 会话收到 assistant 消息(intent=`CTX_CONFLICT_CARD`,branch=`EXPECTATION_HIT`):“⚠️ 检测到项目对话与现有事实存在说法冲突…回复「确认」采信推荐值(将同步项目黑板);回复「纠正」后直接告诉我正确的事实。”([06-chat-after-run2.json](./assets/2026-09-26-dialogue-ctx-closeout/06-chat-after-run2.json))
- 回复「确认」→ `✅ 冲突确认完成:已按您的确认采信「budget」=「还是要20万吧…」,并同步项目黑板`(EXPECTATION_HIT → supplement-info 黑板路径;[07-confirm2.json](./assets/2026-09-26-dialogue-ctx-closeout/07-confirm2.json))
- **判定**:**PASS**(任务失败路径与成功路径均能投递卡片——裁决与任务成败解耦)
### 5.4 裁决入库
- `context_conflict_adjudications`:`run_1790371496904633435` 与 `run_1790372128945688932` 两行 `budget → needs_confirm / trigger_user`([adjudications-db.txt](./assets/2026-09-26-dialogue-ctx-closeout/adjudications-db.txt))**PASS**
### 5.5 过程中修复(基础设施,非本行能力缺陷)
1. **冲突卡接线缺失**(dev `ebb82820`):expectations 原被丢弃;现经 taskrun `OnTerminal`(exactly-once)投递 + `confirm_context_fact` 期望命中处理。
2. **no-docker sidecar 任务路径**(dev `f89b946d`):runner.mjs 硬编码 `/app/extensions/tavily-search.mjs`,主机侧 PI 任务全部 spawn 失败;增加 `PI_AGENT_EXTENSION` 覆盖并在 start.sh 导出。另修正本机 `.env` 的 `PI_AGENT_BIN`(原为 macOS brew 路径,非仓库变更)。
## 六、自动化测试套件汇总 (Test Suite Execution)
| 套件 | 结果 |
|---|---|
| `go test ./internal/bizdev/ ./internal/coordinator/ ./internal/taskrun/ ./internal/server/ -short` | PASS |
| `./scripts/arch-check.sh --mode block` | PASS(候选 `ebb82820` 与 `f89b946d`) |
| `go vet ./...` / `go test -short ./...` | PASS(候选验证收据) |
| 新增单测:bizdev 卡片投影/期望重建、coordinator 确认/纠正/回退、server 会话投递 | PASS |
## 七、测试结论与后续优化建议 (Conclusion & Next Steps)
**结论**:dialogue-ctx-injection 关闭条件全部满足——dev 迁移已应用并验证、真实 PI 任务链路完成 `context/dialogue/` 落盘核验、冲突确认卡冒烟(投递 + 确认闭环 + 黑板同步)PASS。FEATURE-MATRIX 行可升 `done`。
**备注与后续**:
- 会话内实时推送(SSE 通道主动推卡)未做,卡片以会话消息落盘呈现(刷新/历史可见);后续增强另立。
- 「纠正」分支引导用户陈述正确值后由 SUPPLEMENT_INFO 吸收,本轮验收确认路径。
- no-docker dev 的 compose 构建路径(dockerignore 排除 web/dist 导致 go:embed 失败)与单二进制路径并存,属环境形态差异,另行登记。
@@ -0,0 +1,284 @@
# 全系统真实浏览器多人协作验收 测试报告(审计友好 FINAL)
## 数据保留声明(审计必读)
**测试数据已全部保留在 local `dev` 业务库中,请勿清库、删项目、删用户。**
- Wipe 仅发生在 2026-09-26T03:08–03:10(见 assets `wipe-receipt.md`)。
- 之后各 E2E 跑次账号与项目均保留:现 `e2e26_*` **60** 用户、E2E 项目 **6011–6020**。
- 登录密码见私密附件(主报告不贴密码):
`.doc/test-reports/assets/2026-09-26-full-system-browser-e2e/audit-login-credentials.md`
- 项目/文档/suffix 清单:
`.doc/test-reports/assets/2026-09-26-full-system-browser-e2e/retained-inventory.md`
---
## 一、测试背景 (Background)
对 local `dev`(`BASE_URL=http://127.0.0.1:8080`,schema 75)做完整 Playwright 多人协作验收。宿主缺 `libatk`,走 **Docker Playwright**(`mcr.microsoft.com/playwright:v1.63.0-noble --network host`)。
上一轮账本:`FS-DOC-REV-03/04` FAIL。根因:驳回弹层渲染在 `DocGovActionBar`(`position: sticky; zIndex: 30`)内,形成层叠上下文,弹层 `zIndex: 110` 无法压过聊天浮层,确认点击被上层元素截获,`confirmReject` 从未触发。本轮产品修复:`createPortal(..., document.body)` + overlay `zIndex: 1000`(对齐 `DocVisibilityModal`)。
## 二、测试目标 (Test Objectives)
- 实跑 `web/e2e/full-system-browser-e2e.spec.ts`(21 条 serial)真实 UI + 真实 PI
- 验证驳回弹层 portal 修复后 DOC-REV-03→04 主链
- 落盘 assets + 本 FINAL 报告;`agentctl with` 租约提交(不 push、不合入)
- **保留全部测试数据**供登录审计回放
## 三、测试方案与环境 (Test Plan & Environment)
| 项 | 值 |
|---|---|
| URL | `http://127.0.0.1:8080` |
| 环境 | local `dev`(MAIN 目录服务) |
| schema | **75**(`/health` → `schema_ready=true`) |
| MAIN tip(服务检出) | `09cc76eb8d3df6353da86be1e0a7b54e6c147f19` |
| worktree tip | `feature/full-system-browser-e2e-2026-09-26`(审计文档提交前 `7ab7d572…`) |
| 通道 | **headless Docker Playwright** |
| 镜像 | `mcr.microsoft.com/playwright:v1.63.0-noble` |
| DISPLAY | empty(`run-meta.json` → `"display":""`, `"headedHint":false`) |
| 入口 | `web/scripts/run-full-system-browser-e2e.sh` |
| FINAL 跑次 | `2026-09-26T07:40:03Z` → `07:46:47Z`(约 6.7m) |
| FINAL 项目 | `E2E全量-20260926-mui2xpg2`(id **6020**) |
| 前端制品 | WT `npm run build` + `rsync` → MAIN `web/dist`(`index-CrRH72Vb.js`) |
| 本轮修复 | `DocGovActionBar` 驳回弹层 `createPortal` + `zIndex: 1000`;`data-testid=docgov-reject-confirm` |
| 层级 | 产品 UI 真实浏览器验收(含真实 PI);禁止 stub 冒充 PASS |
| 账本 SSOT | `ui-results.json`(**不以** Playwright soft-continue 的 21 passed 冒充产品 PASS) |
| 清库确认 | `/health` ok;users 自 wipe 后 4 → ≥64;**未再 wipe** |
```text
E2E_START=2026-09-26T07:40:03Z
EXIT:0
E2E_END≈2026-09-26T07:46:47Z
证据: assets/.../e2e-rerun-20260926T074002Z.stdout + playwright.log
```
## 四、预期结果 (Expected Results)
- 21 条按 serial 执行;编队允许长等待真实 PI
- `ui-results.json` 记录 PASS/FAIL/SKIP;P0 产品缺陷记 FAIL,不得伪装 PASS
- 驳回确认点击应进入 `confirmReject`,文档回 drafting
- 跑次结束后账号与项目保留,可供人工登录审计
## 五、实际测试结果与判定 (Actual Results & Evaluation)
### 5.0 历史探针(msg 243 / muhu39da,只读;仍适用)
证据:`assets/.../msg243-readonly-probe.json`、`probe-summary-msg243.md`
| 层 | 观察 |
|---|---|
| DB `messages.id=243` | `task_status=completed`,正文已完成 / 质量 100 |
| API task run | `status=completed`(~4m) |
| UI 早期轮次 | `data-server-id=243` 曾卡在 `pending` |
因果三分已在更早轮次修复并验收;本轮 `FS-SQUAD-WF-01` 继续 **PASS**。
### 5.1 单元测试
```text
# draftingEditAffordance(先前产品修复;本轮未重跑)
✔ author can edit drafting when unlocked
✔ active project member can edit drafting when unlocked (deny_only_submit)
✔ non-member viewer cannot edit drafting
✔ lease blocks edit even for author and member
✔ reviewing is not editable via drafting affordance
ℹ tests 5 / pass 5 / fail 0
```
### 5.2 账本计数(`ui-results.json`,本轮 FINAL)
| Verdict | Count | IDs |
|---|---:|---|
| PASS | **20** | FS-IAM-01/02, FS-PROJ-01/02, FS-CHAT-01, FS-SQUAD-WF-01, FS-DOC-REV-01/02/**03/04**/05/06, FS-NONAUTH-01/02, FS-ASSIST-01, FS-SQUAD-FREE-01, FS-UPLOAD-01, FS-KB-01, FS-CTX-01, FS-CONSOLE-01 |
| FAIL | **0** | — |
| SKIP | **1** | FS-DOC-REV-07 |
相对上一账本(18/2/1):**FS-DOC-REV-03、FS-DOC-REV-04 已转 PASS**(reject portal 修复)。
### 5.3 Playwright 套件计数(`playwright.log` / stdout)
```text
✓ 1..21 …
21 passed (6.7m)
EXIT:0
```
说明:`FS-DOC-REV-07` 账本为 **SKIP**(批准后无 reopen 入口),Playwright 仍记 ✓(soft skip)。**以账本为准:20 PASS / 0 FAIL / 1 SKIP。**
### 5.4 逐条(账本)
| ID | Verdict | Duration | 实际摘要 |
|---|---|---:|---|
| FS-IAM-01 | PASS | 2087ms | 五账号 `e2e26_*_mui2xpg2` 开通 |
| FS-IAM-02 | PASS | 2126ms | 5/5 首次改密 |
| FS-PROJ-01 | PASS | 825ms | 立项;guestListed;member promoted |
| FS-PROJ-02 | PASS | 641ms | workflow activated |
| FS-CHAT-01 | PASS | 380ms | assistant bubble non-empty |
| FS-SQUAD-WF-01 | PASS | 291074ms | `doc_proj6020_bd_intake`;squadMs≈273156 |
| FS-DOC-REV-01 | PASS | 1135ms | author 编辑受控文档 |
| FS-NONAUTH-01 | PASS | 1109ms | member edit OK |
| FS-NONAUTH-02 | PASS | 575ms | submitCount=0;waiting=true |
| FS-DOC-REV-02 | PASS | 714ms | author 提交送审 |
| FS-DOC-REV-03 | PASS | 5671ms | reject confirmed(portal 修复验证) |
| FS-DOC-REV-04 | PASS | 1193ms | resubmitted |
| FS-DOC-REV-05 | PASS | 678ms | reviewer pass |
| FS-DOC-REV-06 | PASS | 1941ms | approver approved |
| FS-DOC-REV-07 | SKIP | 620ms | 批准后无 reopen/edit 入口 |
| FS-ASSIST-01 | PASS | 388ms | assistant reply visible |
| FS-SQUAD-FREE-01 | PASS | 90528ms | free-task path observed |
| FS-UPLOAD-01 | PASS | 492ms | `uploadedDocId=doc-free-1790408805539159882-60` |
| FS-KB-01 | PASS | 1092ms | KB section visible |
| FS-CTX-01 | PASS | 644ms | conflict=true;chip=false |
| FS-CONSOLE-01 | PASS | 0ms | errorCount=216;见 `console-errors-summary.json` |
#### FS-DOC-REV-03 PASS(本轮修复验证)
```text
✓ FS-DOC-REV-03 reviewer rejects with reason (5.7s)
actual: reject confirmed
```
根因与修复:sticky ActionBar 层叠上下文 → portal 到 `document.body` + `zIndex: 1000`。确认点击可到达 `confirmReject`;文档回 drafting,级联解锁 REV-04。
#### FS-DOC-REV-04 PASS
```text
✓ FS-DOC-REV-04 author fix and resubmit (1.2s)
actual: resubmitted
截图: screenshots/FS-DOC-REV-04-resubmitted.png
```
#### FS-DOC-REV-07 SKIP
```text
actual: no reopen/edit affordance after approve
截图: screenshots/FS-DOC-REV-07-probe.png
```
产品在批准终态未暴露 cascade reopen 入口;按契约 SKIP,非本轮回归。
#### FS-CONSOLE-01
```text
errorCount=216; summary=.../console-errors-summary.json
```
主要为 403/404 资源噪声(chat window / deliverables sync);用例本身 PASS(汇总落盘)。
### 5.5 严重缺陷表
| 级别 | ID / 主题 | 说明 |
|---|---|---|
| ~~P0~~ | ~~UI pending 遮盖 completed~~ | 已修复并验收 PASS |
| ~~P1~~ | ~~FS-NONAUTH-01~~ | 已 PASS(draftingEditAffordance) |
| ~~P2~~ | ~~FS-UPLOAD-01~~ | 已 PASS(expandRightDocRail) |
| ~~P1~~ | ~~FS-DOC-REV-03~~ | **本轮 PASS**(reject modal portal) |
| ~~P2~~ | ~~FS-DOC-REV-04~~ | **本轮 PASS**(级联于 REV-03) |
| P2 | FS-DOC-REV-07 | 批准后无 cascade reopen(SKIP) |
| P2 | Console 403/404 | 高频 chat-window/deliverables 噪声(不单独阻断) |
### 5.6 登录可用性核实(审计前置)
| 抽查 | 结果 |
|---|---|
| admin `POST /api/v1/auth/login` | HTTP **200** |
| `e2e26_{author,reviewer,approver,member,guest}_mui2xpg2` | 全角色 HTTP **200**(公式密码) |
| `e2e26_*_muhxbx7y` 全角色 | HTTP **200** |
| `e2e26_*_mui24fzd` 全角色 | HTTP **200** |
| 早期 author(`muhtqcok`/`muhtu9gc`/`muhu09f2`) | HTTP **200** |
密码推导:spec `FINAL_PASS` = `{Auth,Rev,App,Mem,Gst}-<suffix>9A`。完整表见 `audit-login-credentials.md`。
## 六、自动化测试套件汇总 (Test Suite Execution)
| 套件 | 入口 | 结果 |
|---|---|---|
| draftingEditAffordance unit | `tsx --test src/lib/draftingEditAffordance.test.ts` | **PASS** 5/5(先前轮次) |
| Docker Playwright E2E | `run-full-system-browser-e2e.sh` | 账本 **20 PASS / 0 FAIL / 1 SKIP**(整体 **PASS** 收口) |
| 真实 PI 编队 | FS-SQUAD-WF-01 | **PASS** |
| 审签主链 | DOC-REV-01…06 | **全部 PASS**;07 **SKIP** |
| 登录抽查 | `/api/v1/auth/login` | **PASS**(见 5.6) |
通过率(21 账本):20/21 ≈ 95.2%(唯一 SKIP 为预期产品缺口)。
## 七、修复摘要
| 阶段 | 问题 | 修复 | 验收 |
|---|---|---|---|
| pending heal | 气泡 UI 卡 `pending`,后端已 `completed` | 消息身份/状态 heal | FS-SQUAD-WF-01 PASS;msg243 探针 |
| FS-NONAUTH-01 | 成员无法就地编辑 drafting | `draftingEditAffordance` | PASS |
| FS-UPLOAD-01 | 右侧文档栏未展开导致上传不可见 | `expandRightDocRail` | PASS |
| FS-DOC-REV-03/04 | 驳回确认被层叠上下文挡住 | `createPortal` + zIndex 1000 | **本轮 PASS**(20/0/1) |
(历史中另有角色选择器 / promote 等前置修复,已合入本 worktree 产品提交。)
## 八、审计回放指南
**入口**:`http://127.0.0.1:8080`(确认 `/health` schema 75)。
**推荐主路径(FINAL `mui2xpg2`)**:
1. 用角色账号登录(用户名见下表;**密码见** `audit-login-credentials.md`)。
2. 打开项目 **E2E全量-20260926-mui2xpg2**(id 6020)。
3. 文档栏打开 **用户初始需求收集表**(`doc_proj6020_bd_intake`,应为 **approved**)。
4. 对照角色查看:
- **author**:修订标记 `E2E修订-mui2xpg2` / `E2E再送-mui2xpg2`;聊天闲聊与编队「请编制用户初始需求收集表」。
- **reviewer**:驳回原因痕迹 + 后续「审核通过」。
- **approver**:终审「批准」后的受控态。
- **member**:`E2E成员编-mui2xpg2` 编辑痕迹;无提交送审。
- **guest**:只读可见性。
5. 可选:上传文档 `doc-free-1790408805539159882-60`;助手/自由任务对话。
6. 历史对照:`muhxbx7y`(6018,intake approved)、`mui24fzd`(6019,portal 修复前 18/2/1)。
## 九、保留测试账号用户名表(按跑次)
密码一律见 `audit-login-credentials.md`(公式 `Role-<suffix>9A`)。
### FINAL — `mui2xpg2`(项目 6020)
| 角色 | username |
|---|---|
| author | `e2e26_author_mui2xpg2` |
| reviewer | `e2e26_reviewer_mui2xpg2` |
| approver | `e2e26_approver_mui2xpg2` |
| member | `e2e26_member_mui2xpg2` |
| guest | `e2e26_guest_mui2xpg2` |
### 其他仍存在跑次(每跑次 5 角色,模式 `e2e26_<role>_<suffix>`)
| suffix | 项目 id | 账本摘要 |
|---|---:|---|
| `mui24fzd` | 6019 | 18/2/1 |
| `muhxbx7y` | 6018 | intake approved;用户可登录 |
| `muhx1ncl` | 6017 | 5/2/0 |
| `muhwuua6` | 6016 | 9/2/0 |
| `muhwkdms` | 6015 | 5/1/0 |
| `muhwbtbv` | 6014 | 5/1/0 |
| `muhvyubx` | 6013 | 7/1/0 |
| `muhu39da` | 6012 | 5/1/0;msg243 |
| `muhu09f2` | 6011 | 立项后文档空 |
| `muhtu9gc` | — | 仅 IAM |
| `muhtqcok` | — | 仅 IAM |
合计 **12 × 5 = 60** 个 `e2e26_*` 账号均保留。完整 inventory:`retained-inventory.md`。
## 十、测试结论与后续优化建议 (Conclusion & Next Steps)
- **结论**:驳回弹层 portal 修复已验证;审签主链 DOC-REV-01…06 **PASS**;整套账本 **20 PASS / 0 FAIL / 1 SKIP**,整体记 **PASS**。
- **数据**:全部测试账号/项目/文档保留;**请勿清库**。
- **下一步(可选)**:批准终态 cascade reopen(FS-DOC-REV-07);降低 console 403/404 噪声。
- **部署/合入**:静态资源已 rsync 至 MAIN `web/dist`;**未 push**;**未 integrate**(本次仅 worktree `docs(test)` 提交)。
## 附件索引
| 文件 | 用途 |
|---|---|
| `assets/.../ui-results.json` | FINAL 账本 SSOT |
| `assets/.../run-meta.json` | 跑次元数据 / 用户名 |
| `assets/.../retained-accounts.json` | 本轮用户名(无密码) |
| `assets/.../audit-login-credentials.md` | **私密:用户名+密码+回放路径** |
| `assets/.../retained-inventory.md` | 项目/文档/suffix 清单 |
| `assets/.../wipe-receipt.md` | 唯一 wipe 收据(03:08) |
| `assets/.../e2e-rerun-20260926T074002Z.stdout` | FINAL stdout |
@@ -0,0 +1,65 @@
# jevdecide assist 真实轮浸泡 ≥200 与体验层收敛 测试报告
## 一、测试背景 (Background)
FEATURE-MATRIX `jevdecide-shadow` 行关闭条件:真实轮浸泡 ≥200 + 体验层检索空结果收敛(intent/risk 另立)。此前 assist 20 轮验收发生在 dev PI spawn 全挂窗口(模板回退污染体验层样本);本轮在 PI 链路修复后重测。
## 二、测试目标 (Test Objectives)
1. 决策层:assist 加成持续成立(B 组规则漏检被 jev 打开)、规则基线不被压低(A 组)、业务问句零误伤(C 组)
2. 体验层:B 组回复要么给出可核验实时事实、要么明确声明无法获取(fail-closed,不编造)——**预注册收敛阈值:handled ≥ 90%**
3. jev 调用零失败(fail-open 不触发)
## 三、测试方案与环境 (Test Plan & Environment)
- 环境:本机 no-docker dev(`bin/agent-server` @ dev `c373d6fb`;`JEV_DECIDE_MODE=assist`、`JEV_BASE_URL=http://127.0.0.1:8767`,启动日志 `jevdecide wired mode=assist`);PI Runner MiniMax-M2.7-highspeed + tavily
- 语料:A×4(规则命中)/ B×10(规则漏检候选)/ C×6(业务防误伤)= 20 轮 ×10 轮 = **200 真实轮**;轮间城市/措辞变体
- 逐轮 checkpoint(断点续跑);决策行取 app 日志 `jevdecide realtime shadow`(与轮次 1:1 对齐,200/200)
- 证据:[assets/2026-09-26-jevdecide-soak/](./assets/2026-09-26-jevdecide-soak/)(逐轮精简 + 汇总)
## 四、预期结果 (Expected Results)
| 组 | 预期 |
|---|---|
| A(n=40) | rule=true 路径保持,回复含实时事实或声明不可用 |
| B(n=100) | rule=false ∧ jev=true 加成;回复 handled ≥ 90% |
| C(n=60) | rule=false ∧ jev=false,零错误加成 |
| 全局 | jev_fail=0;无编造数值 |
## 五、实际测试结果与判定 (Actual Results & Evaluation)
### 5.1 决策层(200 轮,日志行 200/200 对齐)
| 指标 | 结果 | 判定 |
|---|---|---|
| assist 加成(rule=false ∧ jev=true) | **107**(B 组 100/100 + A 组规则漏检被 jev 补开 7) | PASS |
| 规则压制(rule=true ∧ jev=false) | **0**(assist 只加不减) | PASS |
| C 组错误加成 | **0/60** | PASS |
| jev 调用失败(fail-open) | **0** | PASS |
### 5.2 体验层(B 组 n=100,正则初分类 + 13 条人工复核)
| 分类 | 数量 | 说明 |
|---|---|---|
| realtime_ok | **92** | 含可核验实时事实(气温/汇率/股价/金价/AQI 等,含定性实时答复) |
| unavailable_ok | **2** | 明确声明检索未返回/无法确认,建议查权威渠道(未编造) |
| 真缺口 gap | **6** | 纯项目话术/问候模板(无编造数值) |
| **handled 率** | **94/100 = 94%** | **≥ 90% 预注册阈值 PASS** |
A 组 handled 38/40(2 条模板回退);C 组回复无编造实时数值。浸泡窗口 PI 执行 182 SUCCESS / 0 fail;18 轮经意图路由进入非对话模板通道——真缺口 6 条的机制即为此类误路由(jev 已打开检索但模板通道不消费),属意图路由层的既有行为,登记为后续增强方向(intent/risk 另立行)。
### 5.3 样本
- B 加成+实时事实(r4 t12 黄金):给出 $4,275~$4,296/盎司、924.45 元/克
- B 加成+fail-closed(r2 t4 温度):「实时网络检索未返回…无法给出精确数据,建议查看天气 App」
- B 真缺口(r4 t5 带伞):V0.5 项目推进话术(无实时处理、无编造)
## 六、自动化测试套件汇总 (Test Suite Execution)
NOT REQUIRED(运维配置 + 真实对话浸泡;产品单元门禁由 `c373d6fb` 既有收据覆盖,本任务无代码变更)。
## 七、测试结论与后续优化建议 (Conclusion & Next Steps)
**结论**:关闭条件满足——200 真实轮浸泡完成;决策层加成 100% 保持、零误伤、零失败;体验层 handled 94% ≥ 预注册 90% 收敛阈值且无编造(fail-closed 方向成立)。FEATURE-MATRIX 行可升 `done`。
**后续**:①6 条真缺口源于意图误路由至非对话模板通道(检索已开但不消费),建议在 intent/risk 另立行处理;②会话长上下文对个别轮出现上一问串答(A 组 1 条),建议对话轮相关性强化;③compose 默认仍 off,test/main 放量另授权。
@@ -0,0 +1,57 @@
# workflow-rdev P3 真 PI 三样本重跑 测试报告
## 一、 测试背景 (Background)
rdev 行唯一剩余关闭条件:P3 真 PI 三样本在当前 HEAD 重跑(2026-09-22 收口时缺 env:dev 而 blocked)。2026-09-19 首跑两处 FAIL(建议书模板标题未对齐、评审质量门禁 20 分)已于 2026-09-22 修复(标题门禁 + 法规表首表截止)但仅有 dry 验证。
## 二、 测试目标 (Test Objectives)
1. `rd_sw_plan` 规划期关闭(N/A 语义)
2. `rd_proposal` 真 PI 生成:终态 completed、无占位句、**含模板三标题**
3. 未批准不能离开 RD01(既有门禁负例,脚本审批链覆盖)
4. `rd_planning_review` 真 PI 生成:终态 **completed(非 quality_failed)**、含评审三章节、无占位句
## 三、 测试方案与环境 (Test Plan & Environment)
- 环境:本机 no-docker dev(`bin/agent-server` @ dev `5d5cd5fd` + PI Runner MiniMax-M2.7-highspeed)
- 项目 6634(main 仅 `bd_intake` stub 全链跨用户审批至 completed → 激活 rdev 仅 `rd_proposal`+`rd_planning_review`);驱动复用 09-19 资产脚本(创建者改用 zhanggong,admin 种子口令已轮换)
- 证据:[assets/2026-09-26-rdev-p3-rerun/](./assets/2026-09-26-rdev-p3-rerun/)
## 四、 预期结果 (Expected Results)
见 §二;两项历史 FAIL 必须在真 PI 上转 PASS,否则如实 FAIL。
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
### 5.1 三样本
| 样本 | 结果 | 判定 |
|---|---|---|
| `rd_sw_plan` | 激活回执 `enabled=false`(planning_disable) | PASS |
| `rd_proposal`(真 PI,430s 级) | `completed`;10894 字;无占位句;**含「项目背景与立项依据 / 产品定义与范围 / 主要风险与对策概览」** | **PASS**(标题门禁生效,09-19 FAIL 项转正) |
| `rd_planning_review`(真 PI,420s) | `completed`;10029 字;含「评审范围与对象 / 问题与决议 / 评审结论」;manifest 质量报告 **passed=true score=100 issues=[]** | **PASS**(首表截止修复生效,09-19 quality_failed 转正) |
主流程 `bd_intake`(stub)跨用户审批链 + main completed + rdev 激活 + 建议书批准后推进 RD02 全部 200。
### 5.2 过程中发现并修复的阻断缺陷(docgov,非 rdev 能力缺陷)
1. **装载丢快照**(dev `121b33f8`):`loadDocumentFromDBLocked` SELECT 漏 `review_snapshot_id` → 跨重启/缓存未命中的最终批准必报「requires frozen review_snapshot_id」。补列 + PG 回归测试。
2. **uow 行锁自死锁**(dev `5d5cd5fd`):`docflow Commands.run` 在 uow 事务内 `SELECT…FOR UPDATE` 锁文档行后,`persistApproveAndFAV` 自开第二连接 UPDATE 同行 → 语句超时(SQLSTATE 57014),所有最终批准失败。修复为加入环境 uow(同步 + FAV 同事务,提交归 uow);回归测试按生产形状(FOR UPDATE + FAV 接线 + Within)复现。
3. 遗留登记:`memDocs` 在持久化失败后不复原(状态机先改内存后落库,失败即缓存投毒,掩盖真实错误)——已登记 ISSUES(见台账),本轮未改。
4. 观测性:docgov 决策失败原先被错误信封完全吞掉(LooksInternal 全脱敏且无日志),补 WARN 日志(dev `6bd6e916`)。
以上修复均以「原例复现 → 修复 → 真实环境验证(doc_proj6634_bd_intake 批准 200、state=approved)→ 同链回归」闭环。
## 六、 自动化测试套件汇总 (Test Suite Execution)
| 套件 | 结果 |
|---|---|
| `go test ./internal/docgov/`(含新增 2 个 PG 回归) | PASS(隔离库 agent_verify) |
| `arch-check --mode block` / `go vet` / `go test -short ./...`(候选) | PASS |
| dev 真实链路:审批修复验证 + P3 三样本 | PASS |
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
**结论**:P3 真 PI 三样本在当前 HEAD 全 PASS,两项历史 FAIL 修复经真实链路验证转正。rdev 行关闭条件满足,可升 `done`。
**后续**:可选把 rdev Go PG 顶层纳入 nightly(rdev 收口任务既有建议);memDocs 投毒问题按 ISSUES 台账跟进。
@@ -0,0 +1,73 @@
# workflow-swboot 收口:SWBOOT-10 非 stub + L5 真实 PI + L6 UI 二次验收 测试报告
## 一、 测试背景 (Background)
swboot 行剩余关闭条件:SWBOOT-10 非 stub(受控补丁执行器)+ L5 真实 PI + L6 UI 二次验收(W5 关闭条件,本轮用户指令授权)。此前 `controlled_patch` 双门禁拒绝、`repo_path_allowlist`/`project_source_bindings` 零运行时读写、`ExecuteControlledPatch/ApproveMerge` 恒拒。
## 二、 测试目标 (Test Objectives)
1. SWBOOT-10:DB allowlist(deny-all 默认)+ 隔离 worktree 补丁执行 + 管理员命令白名单 + 证据记录;merge/push/deploy 永不执行(类型化边界)
2. 门禁:`controlled_patch` 创建/预览仅在绑定 allowlist 仓库时放行(fail-closed 不变)
3. L5:真实 PI docs_only advisor 建议 `software_delivery` 且不自动激活
4. L6:Playwright 真实栈软件向导二次验收(含医疗去污染抽查)
## 三、 测试方案与环境 (Test Plan & Environment)
- 单元:executor 真实临时 git 仓 6 用例;projectworkflow 门禁 1 用例;catalog 预览 1 用例;既有 stub 断言更新为边界契约
- 工程:`arch-check --mode block`(含 app→swboot 组合根边界登记)、`go vet`、`go test -short ./...`
- 运行时:no-docker dev(`86e0cf46`,schema 75 = goose 74/75 已应用);演示仓 /tmp/swboot-demo/repo
- L6:docker `mcr.microsoft.com/playwright:v1.63.0-noble` `--network host` 真实 dev 栈
- 证据:[assets/2026-09-26-swboot-closeout/](./assets/2026-09-26-swboot-closeout/)
## 四、 预期结果 (Expected Results)
| 用例 | 预期 |
|---|---|
| 预览/创建 controlled_patch(无绑定或未过 allowlist) | 拒绝(fail-closed 保持) |
| 预览/创建 controlled_patch(allowlist 绑定) | 放行 + `project_source_bindings` 落库 |
| 执行:补丁+白名单命令 | 201 succeeded;隔离分支;文件 hash+命令证据;仓库工作树不变 |
| 执行:非白名单命令/路径、非创建者 | 403/400;失败留证不留工作树 |
| merge | 恒拒(ERR_MERGE_REQUIRES_SEPARATE_AUTHORIZATION) |
| L5/L6 | 见 §二 3/4 |
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
### 5.1 单元/工程
- `go test ./internal/swboot/`:**8 项 PASS**(allowlist 拒绝 / 隔离落补丁+hash / 白名单命令执行+非白名单拒绝 / 坏补丁留证 / 命令失败即停 / merge 边界 / 预览门禁);`./internal/projectworkflow/` 门禁 PASS
- `arch-check`/`vet`/`-short` 全 PASS(候选 `4965e74d`、`70f3028c`、`86e0cf46`)
### 5.2 dev 运行时(真实 API,[runtime-evidence.txt](./assets/2026-09-26-swboot-closeout/runtime-evidence.txt))
- 种子 allowlist(/tmp/swboot-demo,test_commands=go,echo)→ 预览 valid → **创建 6638**:HTTP 201 `execution_mode=controlled_patch` 且绑定同批落库
- **执行成功**:HTTP 201 `status=succeeded`,隔离分支 `feature/swboot-p6635-*`,`main.go` sha256 证据,`echo demo-ok` exit 0;**仓库工作树保持 v1 未动**
- 负例:非白名单命令 403(未启动执行);非白名单路径 400 + 失败证据记录(无 worktree);非创建者 403
### 5.3 L5 真实 PI
`RUN_PI_E2E=1` LiveMiniMax **PASS**(9.8s):建议 `software_delivery` 并明确「禁止自动激活」——auto_activate=false 语义在当前 HEAD 成立。
### 5.4 L6 UI 二次验收
docker Playwright 真实栈 `swboot-wizard.spec.ts` **1 passed (1.2s)**:软件域切换 / solo 未独立评审横幅 / catalog「绿地立项」/ 必填三要素 / 创建进入项目 / 页面无「注册检验、GB 9706、器械分类」污染词。`playwright --list`:33 tests in 10 files(新 spec 已登记 README 矩阵 + npm 脚本)。
### 5.5 过程缺陷与修复
1. 绑定写入列名错误(`repo_path` → 实际列 `source_ref`):创建 500 且留下部分创建残留(项目 6635);修复后创建+绑定原子落库(6638 验证)。已知限制:绑定失败时项目行已插入(非同一事务),可用绑定端点补齐——登记后续增强。
2. 同类错误存在于执行端点绑定读取(409 误报);一并修复。
## 六、 自动化测试套件汇总 (Test Suite Execution)
| 套件 | 结果 |
|---|---|
| `go test ./internal/swboot/ ./internal/projectworkflow/` | PASS |
| `arch-check --mode block` / `go vet` / `go test -short ./...`(候选) | PASS |
| dev 运行时 SWBOOT-10 全链 + 三负例 | PASS |
| L5 `RUN_PI_E2E=1` LiveMiniMax | PASS |
| L6 docker Playwright swboot-wizard | PASS |
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
**结论**:W5 关闭条件全满足——SWBOOT-10 以 fail-closed 受控执行器形态非桩化(DB allowlist / 隔离 worktree / 命令白名单 / 证据记录 / merge 永不执行),L5/L6 在当前 HEAD 真实链路 PASS。FEATURE-MATRIX 行可升 `done`。
**后续**:①创建+绑定同事务化;②执行记录管理台只读视图;③admin allowlist 维护 UI;④更广命令白名单形态(如按项目授予)。
@@ -0,0 +1,5 @@
=== RUN TestRealFDHandoffE2E
maintpage listening (mode=maintenance) window=1
--- PASS: TestRealFDHandoffE2E (0.55s)
PASS
ok chat-agent-system/internal/handoff 0.549s
@@ -0,0 +1,6 @@
session_id | source | revision | model_version | narrative | freshness
----------------+---------------+----------+------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------
sess-csr-hit2 | deterministic | 5 | MiniMax-M2.7-highspeed | 双方开展了研发立项与合规细节沟通;双方开展了研发立项与合规细节沟通;双方开展了研发立项与合规细节沟通;双方开展了研发立项与合规细节沟通;讨论了包装按出口标准 |
sess-csr-miss2 | deterministic | 4 | MiniMax-M2.7-highspeed | 双方开展了研发立项与合规细节沟通;双方开展了研发立项与合规细节沟通;双方开展了研发立项与合规细节沟通;双方开展了研发立项与合规细节沟通 |
(2 rows)
@@ -0,0 +1,100 @@
{
"project_id": 6633,
"lifecycle_status": "active",
"active_workflow_key": "main",
"instance": {
"id": 367,
"project_id": 6633,
"workflow_version_id": 101,
"instance_no": 1,
"status": "active",
"config_revision": 2,
"plan_hash": "e21f2ed080702dc483607951c3b5a5ddf4478e87e3b6ca9ee82f013ae00e9365",
"config_snapshot": {
"workflow_definition_key": "main",
"workflow_version": 3,
"workflow_version_id": 101,
"stages": [
{
"stage_key": "V0.1_triage",
"stage_name": "V0.1 需求摸底",
"enabled": true,
"doc_tasks": [
{
"task_key": "bd_intake",
"task_title": "用户初始需求收集表",
"enabled": true,
"approval_configurable": true,
"duties": {
"author_user_id": 10,
"reviewer_user_id": 11,
"approver_user_id": 12
}
}
]
},
{
"stage_key": "V0.5_feasibility",
"stage_name": "V0.5 方案与可行性",
"enabled": true,
"doc_tasks": [
{
"task_key": "bd_feasibility_dev",
"task_title": "设计开发可行性评估报告",
"enabled": false,
"approval_configurable": true,
"duties": {}
},
{
"task_key": "bd_feasibility_reg",
"task_title": "注册路径可行性评估报告",
"enabled": false,
"approval_configurable": true,
"duties": {}
},
{
"task_key": "bd_prelim_design",
"task_title": "系统初步设计方案",
"enabled": false,
"approval_configurable": true,
"duties": {}
},
{
"task_key": "bd_research",
"task_title": "调研报告",
"enabled": false,
"approval_configurable": true,
"duties": {}
},
{
"task_key": "bd_user_requirements",
"task_title": "用户需求表",
"enabled": false,
"approval_configurable": true,
"duties": {}
}
]
},
{
"stage_key": "V1.0_quoting",
"stage_name": "V1.0 商务报价",
"enabled": true,
"doc_tasks": [
{
"task_key": "bd_cdo_quote",
"task_title": "CDO 报价单",
"enabled": false,
"approval_configurable": true,
"duties": {}
}
]
}
]
},
"activated_by": 10,
"activated_at": "2026-09-25T21:24:51.569007Z",
"created_by": 10,
"created_at": "2026-09-25T21:23:45.556244Z",
"updated_at": "2026-09-25T21:24:51.569007Z"
}
}
@@ -0,0 +1,32 @@
[
{
"msg": "我们这个项目主要面向三甲医院输液场景,临床反馈对流速精度要求比较高",
"http": 200,
"branch": "AMBIGUOUS_FALLBACK",
"reply_prefix": "完全理解您想再掂量一下。针对「dialogue-ctx收口验证-20260926」目前的节点,我帮您快速对照一下:\n\n• 若推进 V0.5(方案成型与法规对齐):\n 我可帮您梳理初步架构与注册分类路径,并预估型检成本,便于与客户深入沟通;"
},
{
"msg": "上周和客户开过会,客户名称是协和医院,他们希望第二季度能拿到样品",
"http": 200,
"branch": "AMBIGUOUS_FALLBACK",
"reply_prefix": "完全理解您想再掂量一下。针对「dialogue-ctx收口验证-20260926」目前的节点,我帮您快速对照一下:\n\n• 若推进 V0.5(方案成型与法规对齐):\n 我可帮您梳理初步架构与注册分类路径,并预估型检成本,便于与客户深入沟通;"
},
{
"msg": "注册分类是二类,走同品种临床评价路径,这个口径上次和法规老师确认过了",
"http": 200,
"branch": "AMBIGUOUS_FALLBACK",
"reply_prefix": "完全理解您想再掂量一下。针对「dialogue-ctx收口验证-20260926」目前的节点,我帮您快速对照一下:\n\n• 若推进 V0.5(方案成型与法规对齐):\n 我可帮您梳理初步架构与注册分类路径,并预估型检成本,便于与客户深入沟通;"
},
{
"msg": "预算大概10万,先按这个数做初步方案",
"http": 200,
"branch": "AMBIGUOUS_FALLBACK",
"reply_prefix": "用户,您好!针对「dialogue-ctx收口验证-20260926」的系统验证方案(SVP)与型式检验要求,我为您梳理以下核心难点项目与特别注意事项:\n\n### 一、 核心测试难点项目\n\n1. **声学输出安全与探头表面温升极限(GB 9"
},
{
"msg": "预算还是要20万吧,刚才和老板确认过范围包含型检",
"http": 200,
"branch": "NEW_INTENT_PREEMPT",
"reply_prefix": "用户,您好!针对「dialogue-ctx收口验证-20260926」的系统验证方案(SVP)与型式检验要求,我为您梳理以下核心难点项目与特别注意事项:\n\n### 一、 核心测试难点项目\n\n1. **声学输出安全与探头表面温升极限(GB 9"
}
]
@@ -0,0 +1,23 @@
{
"run_id": "run_1790371496904633435",
"session_id": "sess-dctx-6633",
"project_id": 6633,
"user_id": 10,
"client_turn_id": "",
"idempotency_key": "",
"task_key": "intake",
"stage": "",
"workflow_instance_id": 367,
"stage_instance_id": 563,
"workflow_stage_key": "V0.1_triage",
"status": "failed",
"workspace_id": "/home/weichen/projects/Agent-System/data/dev/workspaces/bizdev/intake_1790371496919459054",
"assistant_message_id": 5117,
"worker_id": "",
"lease_expires_at": null,
"created_at": "2026-09-25T21:24:56.904635685Z",
"updated_at": "2026-09-25T21:24:56.934365142Z",
"error_message": "step step_01_organize failed: RUN_FAILED",
"attempt": 1,
"resumable": false
}
@@ -0,0 +1,23 @@
{
"run_id": "run_1790372128945688932",
"session_id": "sess-dctx-6633",
"project_id": 6633,
"user_id": 10,
"client_turn_id": "",
"idempotency_key": "",
"task_key": "intake",
"stage": "",
"workflow_instance_id": 367,
"stage_instance_id": 563,
"workflow_stage_key": "V0.1_triage",
"status": "completed",
"workspace_id": "/home/weichen/projects/Agent-System/data/dev/workspaces/bizdev/intake_1790372128959911040",
"assistant_message_id": 5130,
"worker_id": "",
"lease_expires_at": null,
"created_at": "2026-09-25T21:35:28.945690762Z",
"updated_at": "2026-09-25T21:41:16.724742208Z",
"error_message": "",
"attempt": 1,
"resumable": false
}
@@ -0,0 +1,16 @@
{
"count": 38,
"cards_n": 2,
"last_card": {
"id": 5131,
"session_id": "sess-dctx-6633",
"user_id": 0,
"role": "assistant",
"content": "⚠️ 检测到项目对话与现有事实存在说法冲突,需要您确认:\n\n1. 对话与现有事实对「budget」说法不一致。推荐采信:还是要20万吧,刚才和老板确认过范围包含型检。请确认或纠正。\n 推荐采信:budget = 还是要20万吧,刚才和老板确认过范围包含型检\n 依据:同级时间相近且无明确证据,需人工确认\n\n回复「确认」采信推荐值(将同步项目黑板);回复「纠正」后直接告诉我正确的事实。",
"intent": "CTX_CONFLICT_CARD",
"branch": "EXPECTATION_HIT",
"day_key": "",
"category": "",
"created_at": "2026-09-25T21:41:16.723375Z"
}
}
@@ -0,0 +1,395 @@
{
"http": 200,
"resp": {
"reply_text": "✅ 冲突确认完成:已按您的确认采信「budget」=「还是要20万吧,刚才和老板确认过范围包含型检」,并同步项目黑板。\n\n已收到并为您记录最新信息:「budget」已更新为「还是要20万吧,刚才和老板确认过范围包含型检」。\n这些事实已沉淀至项目黑板,后续论证与核价将直接吸收这些设定。\n\n针对「dialogue-ctx收口验证-20260926」,我为您梳理了接下来的推进选项:\n[1] 进入 V0.5 方案成型与法规对齐 (推荐,可直接回复“好”或“1”)\n[2] 补充或微调事实信息 \n[3] 查阅当前立项成熟度与对外沟通建议 \n",
"branch": "EXPECTATION_HIT",
"intent_result": {
"raw_input": "确认",
"top_intent": {
"intent": "CONFIRM_ACTION",
"confidence": 1,
"branch": "EXPECTATION_HIT",
"filled_slots": {
"fact_key": "budget",
"target_action": "confirm_context_fact",
"value": "还是要20万吧,刚才和老板确认过范围包含型检"
},
"reasoning": "用户明确肯定上一轮参谋建议动作 [accept_winning: 采信 budget=还是要20万吧,刚才和老板确认过范围包含型检]",
"matched_option": {
"option_id": "accept_winning",
"title": "采信 budget=还是要20万吧,刚才和老板确认过范围包含型检",
"intent": "CONFIRM_ACTION",
"slots": {
"fact_key": "budget",
"value": "还是要20万吧,刚才和老板确认过范围包含型检"
}
}
},
"candidates": [
{
"intent": "CONFIRM_ACTION",
"confidence": 1,
"branch": "EXPECTATION_HIT",
"filled_slots": {
"fact_key": "budget",
"target_action": "confirm_context_fact",
"value": "还是要20万吧,刚才和老板确认过范围包含型检"
},
"reasoning": "用户明确肯定上一轮参谋建议动作 [accept_winning: 采信 budget=还是要20万吧,刚才和老板确认过范围包含型检]",
"matched_option": {
"option_id": "accept_winning",
"title": "采信 budget=还是要20万吧,刚才和老板确认过范围包含型检",
"intent": "CONFIRM_ACTION",
"slots": {
"fact_key": "budget",
"value": "还是要20万吧,刚才和老板确认过范围包含型检"
}
}
}
],
"context_snapshot_id": "ctx_1790370770364969745",
"requires_clarifying": false,
"branch": "EXPECTATION_HIT",
"shadow_score": 1,
"shadow_dialogue_act": "confirm",
"shadow_decision_hint": "allowed",
"intent_frame_v2": {
"version": "v2.0",
"action_key": "card.confirm",
"domain": "conversation",
"object": "system_ui",
"goal": "decide",
"dialogue_act": "confirm",
"slots": {
"fact_key": {
"value": "budget",
"source": "rule"
},
"target_action": {
"value": "confirm_context_fact",
"source": "rule"
},
"value": {
"value": "还是要20万吧,刚才和老板确认过范围包含型检",
"source": "rule"
}
},
"relation": "expectation_hit",
"evidence": [
{
"kind": "rule_match",
"detail": "用户明确肯定上一轮参谋建议动作 [accept_winning: 采信 budget=还是要20万吧,刚才和老板确认过范围包含型检]",
"weight": 1
},
{
"kind": "dialogue_act",
"detail": "confirm",
"weight": 0.1
}
],
"score": 1,
"legacy_intent": "CONFIRM_ACTION"
},
"ranked_frames": {
"candidates": [
{
"version": "v2.0",
"action_key": "card.confirm",
"domain": "conversation",
"object": "system_ui",
"goal": "decide",
"dialogue_act": "confirm",
"slots": {
"fact_key": {
"value": "budget",
"source": "rule"
},
"target_action": {
"value": "confirm_context_fact",
"source": "rule"
},
"value": {
"value": "还是要20万吧,刚才和老板确认过范围包含型检",
"source": "rule"
}
},
"relation": "expectation_hit",
"evidence": [
{
"kind": "rule_match",
"detail": "用户明确肯定上一轮参谋建议动作 [accept_winning: 采信 budget=还是要20万吧,刚才和老板确认过范围包含型检]",
"weight": 1
}
],
"score": 1,
"legacy_intent": "CONFIRM_ACTION"
}
],
"top_margin": 0
},
"plan_proposal": {
"segmenter_version": "segmenter.v2",
"digest": "f6233706dd88a25413e8ade5bf38711f92d7167f0f9630fc0407408643155052",
"combo_hint": "single",
"segments": [
{
"step_id": "1",
"text": "确认",
"normalized": "确认",
"span": {
"start": 0,
"end": 6
},
"evidence": "single",
"structure_confidence": "high",
"frame": {
"version": "v2.0",
"action_key": "card.confirm",
"domain": "conversation",
"object": "system_ui",
"goal": "decide",
"dialogue_act": "confirm",
"slots": {
"fact_key": {
"value": "budget",
"source": "rule"
},
"target_action": {
"value": "confirm_context_fact",
"source": "rule"
},
"value": {
"value": "还是要20万吧,刚才和老板确认过范围包含型检",
"source": "rule"
}
},
"relation": "expectation_hit",
"evidence": [
{
"kind": "rule_match",
"detail": "用户明确肯定上一轮参谋建议动作 [accept_winning: 采信 budget=还是要20万吧,刚才和老板确认过范围包含型检]",
"weight": 1
},
{
"kind": "dialogue_act",
"detail": "confirm",
"weight": 0.1
}
],
"score": 1,
"legacy_intent": "CONFIRM_ACTION"
}
}
],
"evidence": [
{
"kind": "segmenter",
"detail": "segmenter.v2",
"weight": 1
},
{
"kind": "split",
"detail": "single",
"weight": 0.5
}
]
},
"plan_shadow": {
"enabled": true,
"segmenter_version": "segmenter.v2",
"segment_count": 1,
"digest": "f6233706dd88a25413e8ade5bf38711f92d7167f0f9630fc0407408643155052",
"combo_hint": "single",
"legacy_plan_attached": false,
"legacy_dropped_write": true,
"counterfactual_auto_read": "would_confirm"
}
},
"coordination_result": {
"status": "ACCEPTED",
"intent": "CONFIRM_ACTION",
"branch": "EXPECTATION_HIT",
"natural_reply": "✅ 冲突确认完成:已按您的确认采信「budget」=「还是要20万吧,刚才和老板确认过范围包含型检」,并同步项目黑板。\n\n已收到并为您记录最新信息:「budget」已更新为「还是要20万吧,刚才和老板确认过范围包含型检」。\n这些事实已沉淀至项目黑板,后续论证与核价将直接吸收这些设定。\n\n针对「dialogue-ctx收口验证-20260926」,我为您梳理了接下来的推进选项:\n[1] 进入 V0.5 方案成型与法规对齐 (推荐,可直接回复“好”或“1”)\n[2] 补充或微调事实信息 \n[3] 查阅当前立项成熟度与对外沟通建议 \n",
"updated_context": {
"version": 73,
"snapshot_id": "ctx_1790370770364969745",
"assembled_at": "2026-09-25T21:12:50.364972515Z",
"user": {
"id": "u_sess-dctx-6633",
"name": "用户",
"role": "engineer",
"project_role": "composer"
},
"project": {
"id": "",
"name": "dialogue-ctx收口验证-20260926",
"customer_name": "水木东方客户",
"device_type": "一次性使用输液器",
"intended_use": "",
"target_market": "国内",
"active_workflow_key": "main",
"current_workflow": "intake",
"current_stage": "V0.1_triage"
},
"user_docs": {
"composed": null,
"reviewed": null,
"approved": null,
"claimed": null
},
"pending": {},
"blackboard_facts": {
"budget": "还是要20万吧,刚才和老板确认过范围包含型检",
"device_type": "一次性使用输液器",
"target_market": "国内"
},
"pending_expectation": {
"expires_at": "0001-01-01T00:00:00Z",
"context_snippet": "项目「dialogue-ctx收口验证-20260926」当前处于初始摸底期,基准产品画像已梳理完成。",
"default_option": {
"option_id": "1",
"title": "进入 V0.5 方案成型与法规对齐",
"description": "自动比选技术路线,并梳理分类路径与型检标准",
"intent": "ADVANCE_STAGE",
"slots": {
"target_stage": "V0.5_feasibility"
}
},
"options": [
{
"option_id": "1",
"title": "进入 V0.5 方案成型与法规对齐",
"description": "自动比选技术路线,并梳理分类路径与型检标准",
"intent": "ADVANCE_STAGE",
"slots": {
"target_stage": "V0.5_feasibility"
}
},
{
"option_id": "2",
"title": "补充或微调事实信息",
"description": "随时告知我客户的最新的预算、目标市场或使用场景",
"intent": "SUPPLEMENT_INFO"
},
{
"option_id": "3",
"title": "查阅当前立项成熟度与对外沟通建议",
"description": "获取进展研判与对外商务沟通话术",
"intent": "QUERY_PROGRESS",
"slots": {
"query_topic": "all"
}
}
],
"allow_affirmative": true,
"created_at": "2026-09-25T21:41:32.051327995Z"
},
"available_actions": [
"QUERY_PROGRESS",
"SUPPLEMENT_INFO",
"VIEW_DOC",
"TRIGGER_TASK:intake",
"ADVANCE_STAGE:V0.5_feasibility"
],
"task_state": {
"active_task": "CONFIRM_ACTION",
"topic_anchor": "请用一句话说明当前项目所处阶段和下一步建议(关于上海今天热不热)(关于你好)(关于确认)",
"collected_slots": {
"fact_key": "budget",
"query_topic": "testing_analysis",
"target_action": "confirm_context_fact",
"value": "还是要20万吧,刚才和老板确认过范围包含型检"
},
"missing_slots": [
"device_type",
"target_market",
"budget"
],
"updated_at": "2026-09-25T21:41:32.050808211Z"
}
},
"next_expectation": {
"expires_at": "0001-01-01T00:00:00Z",
"context_snippet": "项目「dialogue-ctx收口验证-20260926」当前处于初始摸底期,基准产品画像已梳理完成。",
"default_option": {
"option_id": "1",
"title": "进入 V0.5 方案成型与法规对齐",
"description": "自动比选技术路线,并梳理分类路径与型检标准",
"intent": "ADVANCE_STAGE",
"slots": {
"target_stage": "V0.5_feasibility"
}
},
"options": [
{
"option_id": "1",
"title": "进入 V0.5 方案成型与法规对齐",
"description": "自动比选技术路线,并梳理分类路径与型检标准",
"intent": "ADVANCE_STAGE",
"slots": {
"target_stage": "V0.5_feasibility"
}
},
{
"option_id": "2",
"title": "补充或微调事实信息",
"description": "随时告知我客户的最新的预算、目标市场或使用场景",
"intent": "SUPPLEMENT_INFO"
},
{
"option_id": "3",
"title": "查阅当前立项成熟度与对外沟通建议",
"description": "获取进展研判与对外商务沟通话术",
"intent": "QUERY_PROGRESS",
"slots": {
"query_topic": "all"
}
}
],
"allow_affirmative": true,
"created_at": "2026-09-25T21:41:32.051327995Z"
}
},
"pending_expectation": {
"expires_at": "0001-01-01T00:00:00Z",
"context_snippet": "项目「dialogue-ctx收口验证-20260926」当前处于初始摸底期,基准产品画像已梳理完成。",
"default_option": {
"option_id": "1",
"title": "进入 V0.5 方案成型与法规对齐",
"description": "自动比选技术路线,并梳理分类路径与型检标准",
"intent": "ADVANCE_STAGE",
"slots": {
"target_stage": "V0.5_feasibility"
}
},
"options": [
{
"option_id": "1",
"title": "进入 V0.5 方案成型与法规对齐",
"description": "自动比选技术路线,并梳理分类路径与型检标准",
"intent": "ADVANCE_STAGE",
"slots": {
"target_stage": "V0.5_feasibility"
}
},
{
"option_id": "2",
"title": "补充或微调事实信息",
"description": "随时告知我客户的最新的预算、目标市场或使用场景",
"intent": "SUPPLEMENT_INFO"
},
{
"option_id": "3",
"title": "查阅当前立项成熟度与对外沟通建议",
"description": "获取进展研判与对外商务沟通话术",
"intent": "QUERY_PROGRESS",
"slots": {
"query_topic": "all"
}
}
],
"allow_affirmative": true,
"created_at": "2026-09-25T21:41:32.051327995Z"
}
}
}
@@ -0,0 +1,6 @@
task_run_id | fact_key | resolution | hitl_route | winning_value | decided_by | created_at
-------------------------+----------+---------------+--------------+--------------------------------------------+------------+-------------------------------
run_1790371496904633435 | budget | needs_confirm | trigger_user | 还是要20万吧,刚才和老板确认过范围包含型检 | rule | 2026-09-25 21:24:56.91903+00
run_1790372128945688932 | budget | needs_confirm | trigger_user | 还是要20万吧,刚才和老板确认过范围包含型检 | rule | 2026-09-25 21:35:28.959449+00
(2 rows)
File diff suppressed because one or more lines are too long
@@ -0,0 +1,16 @@
{
"status": "ok",
"env": "dev",
"agent_backend": "pi-agent",
"version": "v1.0",
"shared_kb_port": 5433,
"kb_ready": true,
"database_ready": true,
"schema_version": 73,
"schema_ready": true,
"task_store_ready": true,
"vault_identity_ok": false,
"vault_connected": false,
"vault_lag_ok": true,
"events_ready": true
}
@@ -0,0 +1,54 @@
== workspace context/dialogue listing ==
total 32
drwxr-xr-x 2 weichen weichen 4096 Sep 25 21:35 .
drwxr-xr-x 7 weichen weichen 4096 Sep 25 21:35 ..
-rw-r--r-- 1 weichen weichen 408 Sep 25 21:35 CONFIRMATIONS.md
-rw-r--r-- 1 weichen weichen 249 Sep 25 21:35 README.md
-rw-r--r-- 1 weichen weichen 651 Sep 25 21:35 digest.md
-rw-r--r-- 1 weichen weichen 1244 Sep 25 21:35 facts.json
-rw-r--r-- 1 weichen weichen 5646 Sep 25 21:35 turns.md
== digest.md (head) ==
# 项目对话纪要
权威度:`collab_dialogue`(低于黑板事实与已批准文档;冲突时不得静默采信对话版本)
- 装配时间: 2026-09-25T21:35:28Z
- 纳入轮次: 18(私有排除 0 / 阶段不可见 0 / 噪声 19)
- 覆盖窗口: 2026-09-25 → 2026-09-25
## 按日要点
- **2026-09-26**: 张工: 我们这个项目主要面向三甲医院输液场景,临床反馈对流速精度要求比较高;张工: 上周和客户开过会,客户名称是协和医院,他们希望第二季度能拿到样品;张工: 注册分类是二类,走同品种临床评价路径,这个口径上次和法规老师确认过了
== CONFIRMATIONS.md ==
# 上下文冲突裁决记录
- 生成时间: 2026-09-25T21:35:28Z
## 1. `budget`
- 决议: **needs_confirm**
- 理由: 同级时间相近且无明确证据,需人工确认
- 胜者: budget=还是要20万吧,刚才和老板确认过范围包含型检(dialogue, rank=4)
- HITL: 是(路由 trigger_user)
- 并列矛盾: budget=大概10万,先按这个数做初步方案(dialogue, rank=4)
== facts.json keys ==
['customer_name', 'classification', 'budget', 'budget']
== TASK.md nav (01_organize) ==
- `../../context/project.md`:项目全局立项基线与产品定义
- `../../context/user.md`:用户个性化工作偏好与决策约束
- `../../context/dialogue/`:项目成员共享对话(纪要/近窗/事实/冲突裁决)
- `../../context/materials_text/README.md`:原始材料全文或基线说明
- `../../context/knowledge/hits.md`:法规与标准命中快照 (若存在)
== turns.md head ==
# 项目成员对话近窗(带元数据原文)
- 覆盖窗口: 2026-09-25 21:12 → 2026-09-25 21:35
- 条数: 18
[2026-09-25 21:12] 张工(engineer/owner/duty:author) 用户: 我们这个项目主要面向三甲医院输液场景,临床反馈对流速精度要求比较高
@@ -0,0 +1,24 @@
# doc-review-lifecycle-land re-validation 证据(2026-09-26)
落地内容:doc-review-lifecycle 分支 986d78cc + 09fe9723(三权流转 + 对话触发)cherry-pick 至 dev 6adf694f 之上,冲突 12 处按 dev 现行结构重解(per-docID 锁、gov()/authorizer() 访问器、U11 live 键函数化、migration 重编号 00072→00073、app/docnotify 去 stream 依赖)。
执行环境:Linux worktree feature/doc-review-lifecycle-land-2026-09-26 @ 985bc55f(MATRIX 收据提交前 HEAD b5a782bb)。
## 命令与结果(真实执行,2026-09-26 20:15 前后)
1. `go build ./internal/...` — PASS
2. `go vet ./...` — clean(无输出)
3. `go test -short ./...` — 全部 `ok`,无 FAIL(原始输出本会话留存,逐包 ok;未运行的真实 PI E2E 见下)
4. `go test ./internal/docgov/... ./internal/supplementimpact/... ./internal/app/docnotify/... ./internal/coordinator/... ./internal/intent/... ./internal/chat/... ./internal/traceimpact/... ./internal/app/intentflow/... -count=1` — 全部 `ok`,无 FAIL
5. `./scripts/arch-check.sh --mode block` — `arch-check block: production gate passed`(stream import 违规已在落地时修复)
6. `cd web && npm test -- --run` — tsx 全量 + vitest 3 files / 34 tests passed
7. `cd web && npm run build` — tsc + vite build + precompress(66 .br / 66 .gz)成功
## 未运行项(沿用原任务报告口径,不冒充 PASS)
- 真实产品 PI Agent Runner E2E(对话送审/批注/重开全链):本回合未获共享环境授权槽位,未运行;合入 dev 后按 §3 在获授权环境做 health/ready + 业务冒烟。
- PG 集成负例:goose 00073 于 dev 环境重启时执行,属合入后运行时验证。
## 证据归档说明
本文件为足够判定的摘要(原始终端输出见任务会话);go test 逐包原始行因 `.log` 全局 ignore 改为摘要登记,命令 digest 由 agentctl validate 收据留存。
@@ -0,0 +1 @@
shell write path ok
@@ -0,0 +1,15 @@
{
"http_status": 200,
"user": {
"id": 4,
"username": "admin",
"name": "系统管理员",
"status": "active",
"role_id": "role-admin",
"department": "系统运维部"
},
"env": "dev",
"has_token": true,
"error_code": null,
"message": null
}
@@ -0,0 +1,18 @@
{
"token": "<redacted>",
"user": {
"id": 4,
"username": "admin",
"name": "系统管理员",
"status": "active",
"must_change_password": "<redacted>",
"role_id": "role-admin",
"position": "系统管理员",
"employee_id": "SYS-000",
"department": "系统运维部",
"created_at": "2026-09-26 03:08:47",
"updated_at": "2026-09-26 03:08:47"
},
"must_change_password": "<redacted>",
"env": "dev"
}
@@ -0,0 +1,99 @@
# E2E 审计登录凭据(仅本地审计)
> **权限**:仅供本机 `env:dev`(`http://127.0.0.1:8080`)人工审计回放。
> **禁止**:推送到公开远端、贴进主报告正文、用于非本任务环境。
> **来源**:`web/e2e/full-system-browser-e2e.spec.ts` 中 `FINAL_PASS` 公式;首次登录后已改密为下列「终态密码」。
> **核实**:2026-09-26 对 `mui2xpg2` / `muhxbx7y` / `mui24fzd` 全角色及早期 author 抽样 `POST /api/v1/auth/login` → **HTTP 200**。
## 密码公式(全部跑次通用)
跑次 suffix 取自用户名末段(如 `e2e26_author_mui2xpg2` → `mui2xpg2`)。
| 角色 | 终态密码 |
|---|---|
| author | `Auth-<suffix>9A` |
| reviewer | `Rev-<suffix>9A` |
| approver | `App-<suffix>9A` |
| member | `Mem-<suffix>9A` |
| guest | `Gst-<suffix>9A` |
开通时初始密码为 `Init-<suffix>9A`(仅首次登录改密前有效;现用户均已改密)。
Admin(系统管理员)使用本机 `.env` 的 `ADMIN_USERNAME` / `ADMIN_PASSWORD`(不写入本附件)。
---
## FINAL 成功跑次(推荐审计主路径)— suffix `mui2xpg2`
- **项目**:`E2E全量-20260926-mui2xpg2`(id **6020**)
- **账本**:20 PASS / 0 FAIL / 1 SKIP
- **关键受控文档**:`doc_proj6020_bd_intake`(标题:用户初始需求收集表,lifecycle **approved**)
- **上传自由文档**:`doc-free-1790408805539159882-60`
| 角色 | 用户名 | 密码 | 建议查看路径 |
|---|---|---|---|
| author | `e2e26_author_mui2xpg2` | `Auth-mui2xpg29A` | 登录 → 选项目 `E2E全量-20260926-mui2xpg2` → 打开 `doc_proj6020_bd_intake`(修订标记 `E2E修订-mui2xpg2` / `E2E再送-mui2xpg2`)→ 聊天窗闲聊/编队痕迹 |
| reviewer | `e2e26_reviewer_mui2xpg2` | `Rev-mui2xpg29A` | 同项目 → 受控文档审签栏(驳回原因 / 审核通过痕迹) |
| approver | `e2e26_approver_mui2xpg2` | `App-mui2xpg29A` | 同项目 → 终审批准后的 approved 态 |
| member | `e2e26_member_mui2xpg2` | `Mem-mui2xpg29A` | 同项目 → 成员可编辑痕迹 `E2E成员编-mui2xpg2`;无「提交送审」 |
| guest | `e2e26_guest_mui2xpg2` | `Gst-mui2xpg29A` | 同项目 → 访客只读可见性 |
---
## 近成功 / 历史重要跑次 — suffix `muhxbx7y`
- **项目**:`E2E全量-20260926-muhxbx7y`(id **6018**)
- **关键文档**:`doc_proj6018_bd_intake`(**approved**)
- **上传体**:`upload-muhxbx7y.txt`(assets)
| 角色 | 用户名 | 密码 |
|---|---|---|
| author | `e2e26_author_muhxbx7y` | `Auth-muhxbx7y9A` |
| reviewer | `e2e26_reviewer_muhxbx7y` | `Rev-muhxbx7y9A` |
| approver | `e2e26_approver_muhxbx7y` | `App-muhxbx7y9A` |
| member | `e2e26_member_muhxbx7y` | `Mem-muhxbx7y9A` |
| guest | `e2e26_guest_muhxbx7y` | `Gst-muhxbx7y9A` |
---
## 上一账本(18/2/1,reject portal 修复前)— suffix `mui24fzd`
- **项目**:`E2E全量-20260926-mui24fzd`(id **6019**)
- **关键文档**:`doc_proj6019_bd_intake`(**approved**;当时 REV-03/04 账本 FAIL,后续修复后另开 `mui2xpg2`)
- **上传**:`doc-free-1790407584120676790-55`
| 角色 | 用户名 | 密码 |
|---|---|---|
| author | `e2e26_author_mui24fzd` | `Auth-mui24fzd9A` |
| reviewer | `e2e26_reviewer_mui24fzd` | `Rev-mui24fzd9A` |
| approver | `e2e26_approver_mui24fzd` | `App-mui24fzd9A` |
| member | `e2e26_member_mui24fzd` | `Mem-mui24fzd9A` |
| guest | `e2e26_guest_mui24fzd` | `Gst-mui24fzd9A` |
---
## 其余保留跑次(密码均按公式;用户均仍存在)
| suffix | 项目 id(若有) | author 用户名 | author 密码 |
|---|---:|---|---|
| `muhu09f2` | 6011 | `e2e26_author_muhu09f2` | `Auth-muhu09f29A` |
| `muhu39da` | 6012 | `e2e26_author_muhu39da` | `Auth-muhu39da9A` |
| `muhvyubx` | 6013 | `e2e26_author_muhvyubx` | `Auth-muhvyubx9A` |
| `muhwbtbv` | 6014 | `e2e26_author_muhwbtbv` | `Auth-muhwbtbv9A` |
| `muhwkdms` | 6015 | `e2e26_author_muhwkdms` | `Auth-muhwkdms9A` |
| `muhwuua6` | 6016 | `e2e26_author_muhwuua6` | `Auth-muhwuua69A` |
| `muhx1ncl` | 6017 | `e2e26_author_muhx1ncl` | `Auth-muhx1ncl9A` |
| `muhtqcok` | (无项目行,仅 IAM) | `e2e26_author_muhtqcok` | `Auth-muhtqcok9A` |
| `muhtu9gc` | (无项目行,仅 IAM) | `e2e26_author_muhtu9gc` | `Auth-muhtu9gc9A` |
同 suffix 的 reviewer/approver/member/guest:用户名将 `author` 换为对应角色;密码用上表角色前缀公式。
---
## 审计回放最短路径(FINAL)
1. 打开 `http://127.0.0.1:8080`,用上表任一角色登录(勿用错误环境)。
2. 进入项目 **E2E全量-20260926-mui2xpg2**。
3. 文档栏打开 **用户初始需求收集表**(`doc_proj6020_bd_intake`)→ 查看正文修订、审签状态 **approved**、审批历史。
4. 聊天:闲聊确认、编队「用户初始需求收集表」、助手任务、自由任务痕迹。
5. 切换 reviewer/approver/member/guest 对照权限与痕迹差异。
@@ -0,0 +1,120 @@
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:22:24.148Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:22:24.151Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:22:24.152Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:436:2697","ts":"2026-09-26T03:22:24.154Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:22:24.155Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at C_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7112)","ts":"2026-09-26T03:22:24.155Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:22:24.155Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:24.156Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:22:24.156Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at T_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7452)","ts":"2026-09-26T03:22:24.156Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:25:26.428Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:25:26.431Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:436:2697","ts":"2026-09-26T03:25:26.431Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:25:26.431Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:25:26.432Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:25:26.433Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at T_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7452)","ts":"2026-09-26T03:25:26.433Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:25:26.433Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at C_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7112)","ts":"2026-09-26T03:25:26.433Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:26.433Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:30:06.250Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:30:06.250Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:30:06.253Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:436:2697","ts":"2026-09-26T03:30:06.253Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:30:06.253Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:30:06.257Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at C_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7112)","ts":"2026-09-26T03:30:06.257Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:30:06.257Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at T_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7452)","ts":"2026-09-26T03:30:06.257Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:06.257Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:26.134Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:26.135Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:26.137Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:436:2697","ts":"2026-09-26T03:32:26.138Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:26.138Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at T_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7452)","ts":"2026-09-26T03:32:26.138Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:26.138Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:26.139Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:26.139Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at C_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7112)","ts":"2026-09-26T03:32:26.139Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:24:59.265Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:24:59.266Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:24:59.267Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:24:59.267Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:24:59.267Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:24:59.267Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:24:59.268Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:24:59.268Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:24:59.268Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:24:59.268Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:04.462Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:04.462Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:04.464Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:35:04.465Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:04.466Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:35:04.466Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:04.466Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:04.466Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:35:04.466Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:04.467Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:44.048Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:44.049Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:41:44.049Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:44.050Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:44.050Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:44.050Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:41:44.051Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:44.051Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:41:44.051Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:44.051Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:52.211Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:52.214Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:52.215Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:49:52.215Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:52.216Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:52.216Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:49:52.216Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:52.216Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:49:52.216Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:52.220Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:09.780Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:09.780Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:09.781Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:55:09.781Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:09.781Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:09.783Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:55:09.783Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:09.783Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:09.783Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:55:09.783Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:09.144Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:09.144Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:09.144Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T05:03:09.145Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:09.145Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:09.147Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T05:03:09.147Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:09.148Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T05:03:09.148Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:09.148Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:18.295Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:18.299Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:18.301Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:18.301Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:436:3330","ts":"2026-09-26T07:17:18.301Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:18.302Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at R_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7112)","ts":"2026-09-26T07:17:18.302Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:18.303Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7452)","ts":"2026-09-26T07:17:18.303Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:18.303Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:03.572Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:03.572Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:03.574Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:436:3330","ts":"2026-09-26T07:40:03.575Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:03.575Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at A_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7452)","ts":"2026-09-26T07:40:03.575Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:03.575Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:03.575Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:03.576Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7112)","ts":"2026-09-26T07:40:03.576Z"}
@@ -0,0 +1,39 @@
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:10.836Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:10.836Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:10.836Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:10.838Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:10:10.839Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:10:10.839Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:10.839Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:10:10.839Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T05:10:10.839Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:10:10.839Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T05:10:10.839Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:10:10.839Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T05:10:10.839Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:53.017Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:53.017Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:53.018Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:53.019Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:24:53.020Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:53.020Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:53.020Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7452)","ts":"2026-09-26T07:24:53.020Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:53.020Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:436:3330","ts":"2026-09-26T07:24:53.021Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:53.021Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at R_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7112)","ts":"2026-09-26T07:24:53.021Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:53.021Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:14.437Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:14.437Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:14.438Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:14.438Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:45:14.439Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:14.439Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:436:3330","ts":"2026-09-26T07:45:14.439Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:14.440Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:14.440Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at A_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7452)","ts":"2026-09-26T07:45:14.441Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:14.441Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7112)","ts":"2026-09-26T07:45:14.441Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:14.441Z"}
@@ -0,0 +1,117 @@
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:31.678Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:31.679Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:31.679Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:31.682Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at T_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7452)","ts":"2026-09-26T03:32:31.683Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:31.683Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:31.683Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:436:2697","ts":"2026-09-26T03:32:31.683Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:31.683Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:32:31.683Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:31.683Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at C_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7112)","ts":"2026-09-26T03:32:31.683Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:31.683Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:04.720Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:04.720Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:04.721Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:04.722Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:04.723Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:04.723Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:04.723Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:25:04.723Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:04.723Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:25:04.723Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:04.724Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:25:04.724Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:04.724Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:09.876Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:09.876Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:09.876Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:09.877Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:35:09.877Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:09.877Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:35:09.877Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:09.877Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:09.877Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:35:09.877Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:09.880Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:35:09.880Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:09.880Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:49.592Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:49.593Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:49.593Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:49.594Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:41:49.594Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:49.594Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:41:49.594Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:49.597Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:41:49.597Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:49.597Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:49.597Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:49.597Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:41:49.598Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:57.640Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:57.640Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:57.640Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:57.641Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:49:57.641Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:57.641Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:49:57.641Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:57.642Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:49:57.642Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:57.642Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:57.642Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:49:57.642Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:57.645Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:15.246Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:15.246Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:15.246Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:15.250Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:55:15.251Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:15.251Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:55:15.251Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:15.251Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:55:15.251Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:15.251Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:55:15.251Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:15.251Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:15.251Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:14.678Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:14.678Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:14.678Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:14.679Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:03:14.679Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:14.679Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T05:03:14.679Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:14.679Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:14.680Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T05:03:14.680Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:14.682Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T05:03:14.682Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:14.682Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:23.818Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:23.818Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:23.818Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:23.821Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:436:3330","ts":"2026-09-26T07:17:23.821Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:23.821Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:23.821Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:23.821Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at R_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7112)","ts":"2026-09-26T07:17:23.821Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:23.821Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7452)","ts":"2026-09-26T07:17:23.821Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:23.821Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:17:23.821Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:09.268Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:09.268Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:09.268Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:09.271Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:436:3330","ts":"2026-09-26T07:40:09.271Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:09.272Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:40:09.272Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:09.272Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:09.272Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:09.272Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7112)","ts":"2026-09-26T07:40:09.272Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:09.272Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at A_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7452)","ts":"2026-09-26T07:40:09.272Z"}
@@ -0,0 +1,39 @@
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:12:28.344Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:12:28.344Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:12:28.344Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:12:28.347Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T05:12:28.347Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:12:28.347Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:12:28.347Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T05:12:28.347Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:12:28.347Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T05:12:28.347Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:12:28.347Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:12:28.347Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:12:28.350Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:26:25.551Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:26:25.551Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:26:25.551Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:26:25.554Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:26:25.554Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:26:25.555Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:26:25.555Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:436:3330","ts":"2026-09-26T07:26:25.555Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:26:25.555Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at R_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7112)","ts":"2026-09-26T07:26:25.555Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:26:25.555Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:26:25.555Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7452)","ts":"2026-09-26T07:26:25.555Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:46:46.992Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:46:46.994Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:46:46.994Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:46:46.994Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:46:46.996Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:436:3330","ts":"2026-09-26T07:46:46.996Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:46:46.996Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:46:46.996Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:46:46.996Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at A_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7452)","ts":"2026-09-26T07:46:46.996Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:46:46.996Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7112)","ts":"2026-09-26T07:46:46.997Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:46:46.997Z"}
@@ -0,0 +1,39 @@
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:07.727Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:07.727Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:07.727Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:10:07.730Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:10:07.731Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T05:10:07.731Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:10:07.731Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T05:10:07.731Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:07.732Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:10:07.732Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:10:07.732Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T05:10:07.732Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:07.732Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:48.000Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:48.001Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:48.001Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:48.001Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:436:3330","ts":"2026-09-26T07:24:48.002Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:48.002Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:48.002Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:24:48.002Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:48.002Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7452)","ts":"2026-09-26T07:24:48.002Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:48.004Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at R_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7112)","ts":"2026-09-26T07:24:48.004Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:48.004Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:11.869Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:11.869Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:11.870Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:11.870Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:436:3330","ts":"2026-09-26T07:45:11.870Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:11.871Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:11.873Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:45:11.873Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:11.873Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at A_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7452)","ts":"2026-09-26T07:45:11.873Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:11.873Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7112)","ts":"2026-09-26T07:45:11.873Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:11.873Z"}
@@ -0,0 +1,39 @@
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:10.213Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:10.213Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:10.213Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:10.214Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:10:10.215Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:10:10.216Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T05:10:10.217Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:10:10.220Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T05:10:10.220Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:10:10.220Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:10:10.220Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T05:10:10.220Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:10.220Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:52.418Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:52.419Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:52.419Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:52.422Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:24:52.422Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:52.422Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:436:3330","ts":"2026-09-26T07:24:52.422Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:52.422Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7452)","ts":"2026-09-26T07:24:52.422Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:52.422Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:52.422Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:52.422Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at R_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7112)","ts":"2026-09-26T07:24:52.422Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:13.823Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:13.823Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:13.823Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:13.824Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:45:13.824Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:13.826Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7112)","ts":"2026-09-26T07:45:13.826Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:13.826Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at A_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7452)","ts":"2026-09-26T07:45:13.827Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:13.827Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:436:3330","ts":"2026-09-26T07:45:13.827Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:13.827Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:13.827Z"}
@@ -0,0 +1,70 @@
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:29:18.315Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:29:18.315Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:29:18.317Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:29:18.318Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:29:18.318Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:29:18.318Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:29:18.318Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:29:18.318Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:29:18.318Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:29:18.322Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:29:18.322Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:29:18.322Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:29:18.322Z"}
{"kind":"console","level":"error","text":"Loading the font 'data:font/woff2;base64,d09GMgABAAAAAA4oAA4AAAAAHbQAAA3TAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgRQIDgmcDBEICo1oijYBNgIkA14LMgAEIAWJAAeBHAyBHBvbGiMRdnO0IkRRkiYDgr9KsJ1NUAf2kILNxgUmgqIgq1P89vcbIcmsQbRps3vCcXdYOKSWEPEKgZgQkprQQsxIXUgq0DqpGKmIvrgkeVGtEQD9DzAO29fM9jYhxZEsL2FeURH2JN4MIcTdO049NCVdxQ/w9NrSYFEBKTDKpLKfNkCGDc1RwjZLQcm3vqJ2UW9Xfa3tgAHz6ivp6vgC2yD4/6352ndnN0X0TL7seypkjZlMsjmZnf0Mm5Q+JykRWQBKCVCVPbARPXWyQtb5VgLB6Biq7/Uixcj2WGqdI8tGSgkuRG+t910GKP2D7AQH0DB9FMDW/obJZ8giFI3Wg8Cvevz0M+5m0rTh7XDBlvo9Y4vm13EXmftt...mCahLsdlyA5fdQkRSan9LgnnLEyGSkaKJCJog0wAgvepWBt80+1yKln1bMVtCljfNWDueKLsWwaEbBSfSPTEmVRsUcYYMnEjcjeyCZzBXK9E9BYBXLKjOSpUDR+nEV3TFSUdQaz+ot98QxgXwx0GQ+EEUAKB2qZPkQQ0GqFD8UPFMqyaCHM24BZmSGic9EYMagKizOw9Hz50DMrDLrqqLkTAhplMictiCAx5S3BIUQdeJeLnBy2CNtMfz6cV4u8XKoFZQesbf9YZiIERiHjaNodDW6LgcirX/mPnJIkBGDUpTBhSa0EIr38D5hCIszhCM8URGBqImoWjpvpt1ebu/v3Gl3qJfMnNM+9V+kiRFyROTPHQWOcs1dNW94/ukKMPZBvDi55i5CttdeJz84DLngLqjcdwEZ87bFFR8CIG35OAkDVN6VRDZ7aq67NteYqZ2lpT8oYB2CytoBd6VuAx4WgiAsnuj3WohG+LugzXiQRDeM3XYXlULv4dp5VFYC' violates the following Content Security Policy directive: \"font-src 'self'\". The action has been blocked.","ts":"2026-09-26T04:29:18.729Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:43.303Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:43.303Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:43.303Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:43.306Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:53:43.306Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:53:43.306Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:53:43.306Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:53:43.306Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:53:43.306Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:53:43.306Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:53:43.312Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:53:43.312Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:43.312Z"}
{"kind":"console","level":"error","text":"Loading the font 'data:font/woff2;base64,d09GMgABAAAAAA4oAA4AAAAAHbQAAA3TAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgRQIDgmcDBEICo1oijYBNgIkA14LMgAEIAWJAAeBHAyBHBvbGiMRdnO0IkRRkiYDgr9KsJ1NUAf2kILNxgUmgqIgq1P89vcbIcmsQbRps3vCcXdYOKSWEPEKgZgQkprQQsxIXUgq0DqpGKmIvrgkeVGtEQD9DzAO29fM9jYhxZEsL2FeURH2JN4MIcTdO049NCVdxQ/w9NrSYFEBKTDKpLKfNkCGDc1RwjZLQcm3vqJ2UW9Xfa3tgAHz6ivp6vgC2yD4/6352ndnN0X0TL7seypkjZlMsjmZnf0Mm5Q+JykRWQBKCVCVPbARPXWyQtb5VgLB6Biq7/Uixcj2WGqdI8tGSgkuRG+t910GKP2D7AQH0DB9FMDW/obJZ8giFI3Wg8Cvevz0M+5m0rTh7XDBlvo9Y4vm13EXmftt...mCahLsdlyA5fdQkRSan9LgnnLEyGSkaKJCJog0wAgvepWBt80+1yKln1bMVtCljfNWDueKLsWwaEbBSfSPTEmVRsUcYYMnEjcjeyCZzBXK9E9BYBXLKjOSpUDR+nEV3TFSUdQaz+ot98QxgXwx0GQ+EEUAKB2qZPkQQ0GqFD8UPFMqyaCHM24BZmSGic9EYMagKizOw9Hz50DMrDLrqqLkTAhplMictiCAx5S3BIUQdeJeLnBy2CNtMfz6cV4u8XKoFZQesbf9YZiIERiHjaNodDW6LgcirX/mPnJIkBGDUpTBhSa0EIr38D5hCIszhCM8URGBqImoWjpvpt1ebu/v3Gl3qJfMnNM+9V+kiRFyROTPHQWOcs1dNW94/ukKMPZBvDi55i5CttdeJz84DLngLqjcdwEZ87bFFR8CIG35OAkDVN6VRDZ7aq67NteYqZ2lpT8oYB2CytoBd6VuAx4WgiAsnuj3WohG+LugzXiQRDeM3XYXlULv4dp5VFYC' violates the following Content Security Policy directive: \"font-src 'self'\". The action has been blocked.","ts":"2026-09-26T04:53:43.687Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:08:57.616Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:08:57.617Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:08:57.617Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:08:57.619Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:08:57.619Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:08:57.619Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T05:08:57.620Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:08:57.620Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T05:08:57.620Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:08:57.620Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T05:08:57.620Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:08:57.626Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:08:57.626Z"}
{"kind":"console","level":"error","text":"Loading the font 'data:font/woff2;base64,d09GMgABAAAAAA4oAA4AAAAAHbQAAA3TAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgRQIDgmcDBEICo1oijYBNgIkA14LMgAEIAWJAAeBHAyBHBvbGiMRdnO0IkRRkiYDgr9KsJ1NUAf2kILNxgUmgqIgq1P89vcbIcmsQbRps3vCcXdYOKSWEPEKgZgQkprQQsxIXUgq0DqpGKmIvrgkeVGtEQD9DzAO29fM9jYhxZEsL2FeURH2JN4MIcTdO049NCVdxQ/w9NrSYFEBKTDKpLKfNkCGDc1RwjZLQcm3vqJ2UW9Xfa3tgAHz6ivp6vgC2yD4/6352ndnN0X0TL7seypkjZlMsjmZnf0Mm5Q+JykRWQBKCVCVPbARPXWyQtb5VgLB6Biq7/Uixcj2WGqdI8tGSgkuRG+t910GKP2D7AQH0DB9FMDW/obJZ8giFI3Wg8Cvevz0M+5m0rTh7XDBlvo9Y4vm13EXmftt...mCahLsdlyA5fdQkRSan9LgnnLEyGSkaKJCJog0wAgvepWBt80+1yKln1bMVtCljfNWDueKLsWwaEbBSfSPTEmVRsUcYYMnEjcjeyCZzBXK9E9BYBXLKjOSpUDR+nEV3TFSUdQaz+ot98QxgXwx0GQ+EEUAKB2qZPkQQ0GqFD8UPFMqyaCHM24BZmSGic9EYMagKizOw9Hz50DMrDLrqqLkTAhplMictiCAx5S3BIUQdeJeLnBy2CNtMfz6cV4u8XKoFZQesbf9YZiIERiHjaNodDW6LgcirX/mPnJIkBGDUpTBhSa0EIr38D5hCIszhCM8URGBqImoWjpvpt1ebu/v3Gl3qJfMnNM+9V+kiRFyROTPHQWOcs1dNW94/ukKMPZBvDi55i5CttdeJz84DLngLqjcdwEZ87bFFR8CIG35OAkDVN6VRDZ7aq67NteYqZ2lpT8oYB2CytoBd6VuAx4WgiAsnuj3WohG+LugzXiQRDeM3XYXlULv4dp5VFYC' violates the following Content Security Policy directive: \"font-src 'self'\". The action has been blocked.","ts":"2026-09-26T05:08:58.053Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:37.558Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:37.558Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:37.559Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:37.560Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:23:37.560Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:37.560Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:23:37.562Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7452)","ts":"2026-09-26T07:23:37.562Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:23:37.563Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:23:37.563Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:436:3330","ts":"2026-09-26T07:23:37.563Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:23:37.563Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at R_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7112)","ts":"2026-09-26T07:23:37.563Z"}
{"kind":"console","level":"error","text":"Loading the font 'data:font/woff2;base64,d09GMgABAAAAAA4oAA4AAAAAHbQAAA3TAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgRQIDgmcDBEICo1oijYBNgIkA14LMgAEIAWJAAeBHAyBHBvbGiMRdnO0IkRRkiYDgr9KsJ1NUAf2kILNxgUmgqIgq1P89vcbIcmsQbRps3vCcXdYOKSWEPEKgZgQkprQQsxIXUgq0DqpGKmIvrgkeVGtEQD9DzAO29fM9jYhxZEsL2FeURH2JN4MIcTdO049NCVdxQ/w9NrSYFEBKTDKpLKfNkCGDc1RwjZLQcm3vqJ2UW9Xfa3tgAHz6ivp6vgC2yD4/6352ndnN0X0TL7seypkjZlMsjmZnf0Mm5Q+JykRWQBKCVCVPbARPXWyQtb5VgLB6Biq7/Uixcj2WGqdI8tGSgkuRG+t910GKP2D7AQH0DB9FMDW/obJZ8giFI3Wg8Cvevz0M+5m0rTh7XDBlvo9Y4vm13EXmftt...mCahLsdlyA5fdQkRSan9LgnnLEyGSkaKJCJog0wAgvepWBt80+1yKln1bMVtCljfNWDueKLsWwaEbBSfSPTEmVRsUcYYMnEjcjeyCZzBXK9E9BYBXLKjOSpUDR+nEV3TFSUdQaz+ot98QxgXwx0GQ+EEUAKB2qZPkQQ0GqFD8UPFMqyaCHM24BZmSGic9EYMagKizOw9Hz50DMrDLrqqLkTAhplMictiCAx5S3BIUQdeJeLnBy2CNtMfz6cV4u8XKoFZQesbf9YZiIERiHjaNodDW6LgcirX/mPnJIkBGDUpTBhSa0EIr38D5hCIszhCM8URGBqImoWjpvpt1ebu/v3Gl3qJfMnNM+9V+kiRFyROTPHQWOcs1dNW94/ukKMPZBvDi55i5CttdeJz84DLngLqjcdwEZ87bFFR8CIG35OAkDVN6VRDZ7aq67NteYqZ2lpT8oYB2CytoBd6VuAx4WgiAsnuj3WohG+LugzXiQRDeM3XYXlULv4dp5VFYC' violates the following Content Security Policy directive: \"font-src 'self'\". The action has been blocked.","ts":"2026-09-26T07:23:37.961Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:00.754Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:00.757Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:00.757Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:45:00.758Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:00.758Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:436:3330","ts":"2026-09-26T07:45:00.758Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:00.758Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:00.759Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:00.759Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at A_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7452)","ts":"2026-09-26T07:45:00.759Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:00.759Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:00.760Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7112)","ts":"2026-09-26T07:45:00.760Z"}
{"kind":"console","level":"error","text":"Loading the font 'data:font/woff2;base64,d09GMgABAAAAAA4oAA4AAAAAHbQAAA3TAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgRQIDgmcDBEICo1oijYBNgIkA14LMgAEIAWJAAeBHAyBHBvbGiMRdnO0IkRRkiYDgr9KsJ1NUAf2kILNxgUmgqIgq1P89vcbIcmsQbRps3vCcXdYOKSWEPEKgZgQkprQQsxIXUgq0DqpGKmIvrgkeVGtEQD9DzAO29fM9jYhxZEsL2FeURH2JN4MIcTdO049NCVdxQ/w9NrSYFEBKTDKpLKfNkCGDc1RwjZLQcm3vqJ2UW9Xfa3tgAHz6ivp6vgC2yD4/6352ndnN0X0TL7seypkjZlMsjmZnf0Mm5Q+JykRWQBKCVCVPbARPXWyQtb5VgLB6Biq7/Uixcj2WGqdI8tGSgkuRG+t910GKP2D7AQH0DB9FMDW/obJZ8giFI3Wg8Cvevz0M+5m0rTh7XDBlvo9Y4vm13EXmftt...mCahLsdlyA5fdQkRSan9LgnnLEyGSkaKJCJog0wAgvepWBt80+1yKln1bMVtCljfNWDueKLsWwaEbBSfSPTEmVRsUcYYMnEjcjeyCZzBXK9E9BYBXLKjOSpUDR+nEV3TFSUdQaz+ot98QxgXwx0GQ+EEUAKB2qZPkQQ0GqFD8UPFMqyaCHM24BZmSGic9EYMagKizOw9Hz50DMrDLrqqLkTAhplMictiCAx5S3BIUQdeJeLnBy2CNtMfz6cV4u8XKoFZQesbf9YZiIERiHjaNodDW6LgcirX/mPnJIkBGDUpTBhSa0EIr38D5hCIszhCM8URGBqImoWjpvpt1ebu/v3Gl3qJfMnNM+9V+kiRFyROTPHQWOcs1dNW94/ukKMPZBvDi55i5CttdeJz84DLngLqjcdwEZ87bFFR8CIG35OAkDVN6VRDZ7aq67NteYqZ2lpT8oYB2CytoBd6VuAx4WgiAsnuj3WohG+LugzXiQRDeM3XYXlULv4dp5VFYC' violates the following Content Security Policy directive: \"font-src 'self'\". The action has been blocked.","ts":"2026-09-26T07:45:01.161Z"}
@@ -0,0 +1,39 @@
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:07.027Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:07.028Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:07.028Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:07.029Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:10:07.029Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:10:07.030Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T05:10:07.030Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:10:07.030Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:10:07.030Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T05:10:07.030Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:10:07.030Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T05:10:07.030Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:07.032Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:47.408Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:47.409Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:47.409Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:47.414Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:24:47.415Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:47.415Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:47.415Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:436:3330","ts":"2026-09-26T07:24:47.415Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:47.415Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7452)","ts":"2026-09-26T07:24:47.415Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:47.415Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at R_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7112)","ts":"2026-09-26T07:24:47.415Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:47.415Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:11.185Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:11.187Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:11.187Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:11.187Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:11.188Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at A_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7452)","ts":"2026-09-26T07:45:11.188Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:11.189Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7112)","ts":"2026-09-26T07:45:11.189Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:11.189Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:45:11.189Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:11.189Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:436:3330","ts":"2026-09-26T07:45:11.189Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:11.189Z"}
@@ -0,0 +1,52 @@
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:46.284Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:46.284Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:46.284Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:53:46.287Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:53:46.287Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:46.287Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:53:46.287Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:53:46.287Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:53:46.287Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:53:46.288Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:53:46.288Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:53:46.288Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:46.288Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:09:00.695Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:09:00.695Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:09:00.695Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:09:00.695Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:09:00.696Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:09:00.696Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:09:00.696Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T05:09:00.696Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:09:00.697Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T05:09:00.697Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:09:00.699Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:09:00.699Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T05:09:00.699Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:41.108Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:41.108Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:41.109Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:41.111Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:23:41.111Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:23:41.111Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:436:3330","ts":"2026-09-26T07:23:41.111Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:23:41.113Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:41.114Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:23:41.115Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at R_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7112)","ts":"2026-09-26T07:23:41.115Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:23:41.115Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7452)","ts":"2026-09-26T07:23:41.115Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:04.289Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:04.289Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:04.289Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:04.291Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at A_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7452)","ts":"2026-09-26T07:45:04.291Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:04.292Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:436:3330","ts":"2026-09-26T07:45:04.292Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:04.292Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:04.292Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:45:04.292Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:04.294Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7112)","ts":"2026-09-26T07:45:04.294Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:04.294Z"}
@@ -0,0 +1,40 @@
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:09:36.397Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:09:36.397Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:09:36.397Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:09:36.400Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:09:36.400Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:09:36.401Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T05:09:36.401Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:09:36.401Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T05:09:36.401Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:09:36.401Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:09:36.401Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T05:09:36.401Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:09:36.401Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:16.781Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:16.781Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:16.782Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:16.782Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:24:16.782Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:16.782Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:436:3330","ts":"2026-09-26T07:24:16.782Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:16.783Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:16.783Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7452)","ts":"2026-09-26T07:24:16.783Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:16.783Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at R_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7112)","ts":"2026-09-26T07:24:16.783Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:16.783Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:09.977Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:09.977Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:09.978Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:09.982Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:45:09.982Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:09.982Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:436:3330","ts":"2026-09-26T07:45:09.982Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:09.983Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:09.983Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at A_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7452)","ts":"2026-09-26T07:45:09.983Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:09.983Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:09.983Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7112)","ts":"2026-09-26T07:45:09.983Z"}
{"kind":"console","level":"error","text":"Loading the font 'data:font/woff2;base64,d09GMgABAAAAAA4oAA4AAAAAHbQAAA3TAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgRQIDgmcDBEICo1oijYBNgIkA14LMgAEIAWJAAeBHAyBHBvbGiMRdnO0IkRRkiYDgr9KsJ1NUAf2kILNxgUmgqIgq1P89vcbIcmsQbRps3vCcXdYOKSWEPEKgZgQkprQQsxIXUgq0DqpGKmIvrgkeVGtEQD9DzAO29fM9jYhxZEsL2FeURH2JN4MIcTdO049NCVdxQ/w9NrSYFEBKTDKpLKfNkCGDc1RwjZLQcm3vqJ2UW9Xfa3tgAHz6ivp6vgC2yD4/6352ndnN0X0TL7seypkjZlMsjmZnf0Mm5Q+JykRWQBKCVCVPbARPXWyQtb5VgLB6Biq7/Uixcj2WGqdI8tGSgkuRG+t910GKP2D7AQH0DB9FMDW/obJZ8giFI3Wg8Cvevz0M+5m0rTh7XDBlvo9Y4vm13EXmftt...mCahLsdlyA5fdQkRSan9LgnnLEyGSkaKJCJog0wAgvepWBt80+1yKln1bMVtCljfNWDueKLsWwaEbBSfSPTEmVRsUcYYMnEjcjeyCZzBXK9E9BYBXLKjOSpUDR+nEV3TFSUdQaz+ot98QxgXwx0GQ+EEUAKB2qZPkQQ0GqFD8UPFMqyaCHM24BZmSGic9EYMagKizOw9Hz50DMrDLrqqLkTAhplMictiCAx5S3BIUQdeJeLnBy2CNtMfz6cV4u8XKoFZQesbf9YZiIERiHjaNodDW6LgcirX/mPnJIkBGDUpTBhSa0EIr38D5hCIszhCM8URGBqImoWjpvpt1ebu/v3Gl3qJfMnNM+9V+kiRFyROTPHQWOcs1dNW94/ukKMPZBvDi55i5CttdeJz84DLngLqjcdwEZ87bFFR8CIG35OAkDVN6VRDZ7aq67NteYqZ2lpT8oYB2CytoBd6VuAx4WgiAsnuj3WohG+LugzXiQRDeM3XYXlULv4dp5VFYC' violates the following Content Security Policy directive: \"font-src 'self'\". The action has been blocked.","ts":"2026-09-26T07:45:10.413Z"}
@@ -0,0 +1,52 @@
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:45.552Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:45.552Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:45.553Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:53:45.556Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:53:45.556Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:45.558Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:53:45.559Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:53:45.559Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:53:45.559Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:53:45.559Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:53:45.560Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:53:45.560Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:45.560Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:08:59.929Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:08:59.930Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:08:59.930Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:08:59.930Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T05:08:59.931Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:08:59.931Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T05:08:59.931Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:08:59.933Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:08:59.933Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:08:59.933Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:08:59.933Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T05:08:59.933Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:08:59.933Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:40.409Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:40.410Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:40.410Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:23:40.410Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:436:3330","ts":"2026-09-26T07:23:40.410Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:23:40.412Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:40.412Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:23:40.412Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:23:40.412Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at R_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7112)","ts":"2026-09-26T07:23:40.412Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:23:40.412Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7452)","ts":"2026-09-26T07:23:40.412Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:40.412Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:03.595Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:03.595Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:03.595Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:03.597Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:436:3330","ts":"2026-09-26T07:45:03.597Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:03.597Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:45:03.598Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:03.598Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7112)","ts":"2026-09-26T07:45:03.598Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:03.598Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at A_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7452)","ts":"2026-09-26T07:45:03.598Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:03.598Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:03.604Z"}
@@ -0,0 +1,221 @@
{
"count": 216,
"errors": [
"admin-iam: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"admin-iam: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"admin-iam: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"admin-iam: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"admin-iam: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"admin-iam: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"admin-iam: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"iam-firstlogin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"proj-create: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"proj-create: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"proj-create: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"proj-create: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"proj-create: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"proj-create: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"proj-create: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"proj-create: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"proj-create: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"proj-wf: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"proj-wf: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"proj-wf: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"proj-wf: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"proj-wf: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"proj-wf: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"proj-wf: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"proj-wf: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"proj-wf: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"chat-casual: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"chat-casual: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"chat-casual: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"chat-casual: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"chat-casual: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"chat-casual: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"chat-casual: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"chat-casual: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"chat-casual: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"squad-wf: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"squad-wf: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"squad-wf: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"squad-wf: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"squad-wf: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"squad-wf: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"squad-wf: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"squad-wf: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"squad-wf: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-edit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-edit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-edit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-edit: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-edit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-edit: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-edit: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-edit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-edit: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-edit: [error] Loading the font 'data:font/woff2;base64,d09GMgABAAAAAA4oAA4AAAAAHbQAAA3TAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgRQIDgmcDBEICo1oijYBNgIkA14LMgAEIAWJAAeBHAyBHBvbGiMRdnO0IkRRkiYDgr9KsJ1NUAf2kILNxgUmgqIgq1P",
"nonauth-edit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"nonauth-edit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"nonauth-edit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"nonauth-edit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"nonauth-edit: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"nonauth-edit: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"nonauth-edit: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"nonauth-edit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"nonauth-edit: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"nonauth-edit: [error] Loading the font 'data:font/woff2;base64,d09GMgABAAAAAA4oAA4AAAAAHbQAAA3TAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgRQIDgmcDBEICo1oijYBNgIkA14LMgAEIAWJAAeBHAyBHBvbGiMRdnO0IkRRkiYDgr9KsJ1NUAf2kILNxgUmgqIgq1P",
"nonauth-edit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"nonauth-submit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"nonauth-submit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"nonauth-submit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"nonauth-submit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"nonauth-submit: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"nonauth-submit: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"nonauth-submit: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"nonauth-submit: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"nonauth-submit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-submit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-submit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-submit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-submit: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-submit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-submit: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-submit: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-submit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-submit: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-reject: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-reject: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-reject: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-reject: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-reject: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-reject: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-reject: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-reject: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-reject: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-resubmit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-resubmit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-resubmit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-resubmit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-resubmit: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-resubmit: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-resubmit: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-resubmit: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-resubmit: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-resubmit: [error] Loading the font 'data:font/woff2;base64,d09GMgABAAAAAA4oAA4AAAAAHbQAAA3TAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgRQIDgmcDBEICo1oijYBNgIkA14LMgAEIAWJAAeBHAyBHBvbGiMRdnO0IkRRkiYDgr9KsJ1NUAf2kILNxgUmgqIgq1P",
"doc-pass: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-pass: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-pass: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-pass: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-pass: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-pass: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-pass: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-pass: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-pass: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-approve: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-approve: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-approve: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-approve: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-approve: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-approve: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-approve: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-approve: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-approve: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-cascade: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-cascade: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-cascade: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-cascade: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"doc-cascade: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-cascade: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-cascade: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-cascade: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"doc-cascade: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"assist: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"assist: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"assist: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"assist: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"assist: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"assist: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"assist: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"assist: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"assist: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"squad-free: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"squad-free: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"squad-free: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"squad-free: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"squad-free: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"squad-free: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"squad-free: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"squad-free: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"squad-free: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"upload: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"upload: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"upload: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"upload: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"upload: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"upload: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"upload: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"upload: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"upload: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"kb-admin: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"kb-admin: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"kb-admin: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"kb-admin: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"kb-admin: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"kb-admin: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"kb-admin: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"ctx: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"ctx: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"ctx: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"ctx: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"ctx: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"ctx: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)",
"ctx: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"ctx: [error] Failed to load resource: the server responded with a status of 404 (Not Found)",
"ctx: [error] Failed to load resource: the server responded with a status of 403 (Forbidden)"
]
}
@@ -0,0 +1,696 @@
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.178Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.179Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.179Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:22:26.183Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at T_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7452)","ts":"2026-09-26T03:22:26.184Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:22:26.184Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:22:26.185Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at C_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7112)","ts":"2026-09-26T03:22:26.185Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.185Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:22:26.185Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:22:26.185Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:436:2697","ts":"2026-09-26T03:22:26.185Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.187Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.335Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.336Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.336Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.339Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:22:26.339Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.580Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.580Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.582Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.582Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:22:26.583Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.738Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.739Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.741Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.745Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:22:26.745Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.948Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.948Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:22:26.948Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.950Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:26.950Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:27.105Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:27.105Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:27.105Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:27.108Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:22:27.108Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:27.336Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:27.337Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:22:27.337Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:27.337Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:27.338Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:27.493Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:27.495Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:27.510Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:27.511Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:22:27.511Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:27.711Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:27.713Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:27.713Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:22:27.714Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:27.714Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:27.869Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:27.871Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:27.871Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:27.875Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:22:27.875Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:28.448Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:28.448Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:28.448Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:25:28.451Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:436:2697","ts":"2026-09-26T03:25:28.452Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:25:28.452Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:28.452Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:25:28.452Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:25:28.453Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at T_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7452)","ts":"2026-09-26T03:25:28.454Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:25:28.454Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at C_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7112)","ts":"2026-09-26T03:25:28.454Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:28.455Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:28.581Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:28.581Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:28.582Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:28.590Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:25:28.591Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:28.816Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:28.817Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:28.817Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:28.818Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:25:28.818Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:28.981Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:28.982Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:28.982Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:28.982Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:25:28.983Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:29.187Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:29.189Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:29.189Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:25:29.190Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:29.190Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:29.350Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:29.350Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:29.351Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:29.353Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:25:29.353Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:29.554Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:29.554Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:29.554Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:29.555Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:25:29.555Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:29.736Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:29.736Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:29.737Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:29.737Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:25:29.737Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:29.913Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:29.915Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:29.915Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:29.915Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:25:29.916Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:30.076Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:30.077Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:30.077Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:30.079Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:25:30.079Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.219Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.219Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.219Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:30:08.221Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.221Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:30:08.222Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:30:08.223Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at C_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7112)","ts":"2026-09-26T03:30:08.223Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:30:08.223Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:436:2697","ts":"2026-09-26T03:30:08.223Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.223Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:30:08.223Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at T_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7452)","ts":"2026-09-26T03:30:08.223Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.367Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.367Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.367Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.369Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:30:08.369Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.611Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.612Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.612Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.612Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:30:08.613Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.768Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.769Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.769Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.771Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:30:08.771Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.989Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.989Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.992Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:08.992Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:30:08.992Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:09.146Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:09.147Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:09.148Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:09.155Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:30:09.155Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:09.374Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:09.375Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:09.376Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:09.376Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:30:09.376Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:09.542Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:09.542Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:09.542Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:09.542Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:30:09.542Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:09.722Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:09.723Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:09.723Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:09.726Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:30:09.726Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:09.884Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:09.884Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:09.886Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:09.887Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:30:09.887Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.177Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.178Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.179Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.181Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:32:28.182Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:28.182Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:28.182Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at T_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7452)","ts":"2026-09-26T03:32:28.182Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:28.182Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:436:2697","ts":"2026-09-26T03:32:28.182Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.182Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:28.182Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at C_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7112)","ts":"2026-09-26T03:32:28.182Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.330Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.331Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.331Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.331Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:32:28.332Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.565Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.565Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.567Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.567Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:32:28.568Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.724Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.724Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.724Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.725Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:32:28.725Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.954Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.954Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.954Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:28.956Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:32:28.956Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.108Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.110Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.110Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.112Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:32:29.112Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.337Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.338Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.338Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.338Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:32:29.338Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.498Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.498Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.498Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.499Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:32:29.500Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.716Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.716Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.717Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.717Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:32:29.717Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.875Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.876Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.876Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:29.876Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:32:29.876Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.241Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.241Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.243Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:01.243Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:25:01.244Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:01.244Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:25:01.244Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:01.246Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:25:01.246Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.246Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:01.247Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:01.247Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.247Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.395Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.395Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.395Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.396Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:01.396Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.610Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.611Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.611Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.611Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:01.611Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.767Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.767Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.767Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.769Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:01.769Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.995Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.996Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.997Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:01.997Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:01.997Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.152Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.152Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.152Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.154Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:02.154Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.377Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.377Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.377Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.377Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:02.378Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.532Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.532Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.533Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.534Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:02.535Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.762Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.763Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.763Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:02.763Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.763Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.910Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.910Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.910Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:02.911Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:02.911Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:06.594Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:06.594Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:06.594Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:06.596Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:35:06.596Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:06.597Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:35:06.597Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:06.597Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:35:06.598Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:06.598Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:06.598Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:06.598Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:35:06.598Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:06.737Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:06.737Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:06.737Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:06.740Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:35:06.740Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:06.969Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:06.969Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:06.969Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:35:06.970Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:06.970Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:07.123Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:07.124Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:07.124Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:07.126Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:35:07.126Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:07.347Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:07.347Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:07.347Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:07.348Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:35:07.349Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:07.507Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:07.507Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:07.507Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:07.509Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:35:07.509Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:07.715Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:07.715Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:07.715Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:07.716Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:35:07.716Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:07.885Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:07.886Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:07.886Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:07.886Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:35:07.886Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:08.050Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:08.050Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:08.050Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:08.052Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:35:08.053Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:08.201Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:08.201Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:08.202Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:08.219Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:35:08.219Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.109Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.110Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.110Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:46.110Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:41:46.110Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:46.111Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:46.113Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:41:46.113Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:46.114Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:41:46.114Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.114Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:41:46.114Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.115Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.271Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.272Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.272Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.275Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:41:46.275Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.582Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.583Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.583Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:41:46.584Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.584Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.744Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.744Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.744Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.746Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:41:46.746Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.949Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.949Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.951Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:46.953Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:41:46.953Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:47.108Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:47.108Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:47.109Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:47.110Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:41:47.110Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:47.331Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:47.331Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:47.332Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:47.333Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:41:47.333Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:47.487Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:47.489Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:47.489Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:47.504Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:41:47.504Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:47.665Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:47.665Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:47.665Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:47.665Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:41:47.666Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:47.820Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:47.820Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:47.820Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:47.821Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:41:47.821Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:54.268Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:54.268Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:54.268Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:54.269Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:49:54.270Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:54.270Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:49:54.270Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:54.270Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:49:54.270Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:54.270Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:49:54.270Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:54.270Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:54.273Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:54.405Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:54.405Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:54.405Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:54.414Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:49:54.414Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:54.631Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:54.631Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:54.634Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:54.635Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:49:54.635Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:54.799Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:54.800Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:54.800Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:54.802Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:49:54.803Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:54.998Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.000Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.000Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.001Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:49:55.002Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.163Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.163Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.163Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.165Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:49:55.165Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.363Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.363Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.363Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.363Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:49:55.364Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.524Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.525Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.525Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.526Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:49:55.526Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.728Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.728Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.728Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.729Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:49:55.730Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.887Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.887Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.887Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:55.890Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:49:55.891Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:11.814Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:11.814Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:11.814Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:11.815Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:55:11.815Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:11.817Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:55:11.817Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:11.817Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:11.817Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:55:11.817Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:11.817Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:55:11.817Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:11.817Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:11.963Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:11.964Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:11.964Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:11.967Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:55:11.968Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:12.185Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:12.186Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:12.186Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:12.189Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:55:12.189Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:12.336Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:12.337Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:12.337Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:12.339Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:55:12.339Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:12.533Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:12.533Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:12.534Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:12.534Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:55:12.535Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:12.704Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:12.705Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:12.705Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:12.705Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:55:12.705Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:12.883Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:12.884Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:12.884Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:12.885Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:55:12.885Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:13.038Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:13.038Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:13.055Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:13.055Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:55:13.055Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:13.238Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:13.238Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:13.238Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:13.238Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:55:13.239Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:13.392Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:13.393Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:13.393Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:13.397Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:55:13.397Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.196Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.197Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.197Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:11.201Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.201Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:03:11.202Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:11.202Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T05:03:11.202Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:11.202Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T05:03:11.203Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:11.203Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T05:03:11.203Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.203Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.346Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.346Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.346Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.349Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:03:11.349Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.586Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.586Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.586Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.587Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:03:11.587Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.745Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.745Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.747Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.748Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:03:11.748Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.966Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.969Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.969Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:11.970Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:03:11.971Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:12.127Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:12.128Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:12.128Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:12.131Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:03:12.131Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:12.353Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:12.354Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:12.354Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:03:12.354Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:12.355Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:12.519Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:12.519Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:12.519Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:12.519Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:03:12.519Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:12.698Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:12.700Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:12.700Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:03:12.701Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:12.702Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:12.857Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:12.857Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:12.858Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:12.860Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:03:12.860Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:20.297Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:20.298Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:20.298Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:20.300Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:17:20.300Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:20.301Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:436:3330","ts":"2026-09-26T07:17:20.302Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:20.304Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:20.304Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7452)","ts":"2026-09-26T07:17:20.305Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:20.305Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:20.306Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at R_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7112)","ts":"2026-09-26T07:17:20.306Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:20.442Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:20.444Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:20.444Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:20.445Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:17:20.445Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:20.663Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:20.663Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:20.663Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:20.665Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:17:20.665Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:20.822Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:20.823Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:20.823Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:20.826Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:17:20.826Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.058Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.060Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.060Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:17:21.061Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.061Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.230Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.230Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.230Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.230Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:17:21.230Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.410Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.412Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:17:21.412Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.413Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.413Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.576Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.576Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.577Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.579Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:17:21.579Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.782Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.782Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.782Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.783Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:17:21.783Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.938Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.939Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.939Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:21.940Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:17:21.940Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:05.690Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:05.690Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:05.690Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:05.692Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:436:3330","ts":"2026-09-26T07:40:05.693Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:05.693Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at A_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7452)","ts":"2026-09-26T07:40:05.693Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:05.693Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:05.695Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:40:05.695Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:05.696Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7112)","ts":"2026-09-26T07:40:05.696Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:05.696Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:05.858Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:05.859Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:05.859Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:05.859Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:40:05.860Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:06.072Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:06.075Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:06.075Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:06.075Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:40:06.076Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:06.232Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:06.232Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:06.232Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:06.235Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:40:06.235Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:06.456Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:06.457Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:06.460Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:06.460Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:40:06.460Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:06.641Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:06.641Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:06.641Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:06.644Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:40:06.644Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:06.946Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:06.947Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:06.947Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:06.947Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:40:06.947Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:07.092Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:07.092Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:07.093Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:07.094Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:40:07.094Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:07.287Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:07.287Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:07.287Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:40:07.287Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:07.288Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:07.458Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:07.458Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:07.458Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:07.459Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:40:07.459Z"}
@@ -0,0 +1,30 @@
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:12:27.217Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:12:27.217Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:12:27.217Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T05:12:27.217Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:12:27.218Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T05:12:27.218Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:12:27.218Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:12:27.220Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:12:27.220Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T05:12:27.220Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:26:24.448Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:26:24.449Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:26:24.451Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7452)","ts":"2026-09-26T07:26:24.452Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:26:24.452Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:436:3330","ts":"2026-09-26T07:26:24.452Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:26:24.452Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:26:24.454Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at R_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7112)","ts":"2026-09-26T07:26:24.454Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:26:24.454Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:46:45.888Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:46:45.888Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:46:45.890Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7112)","ts":"2026-09-26T07:46:45.890Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:46:45.890Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:436:3330","ts":"2026-09-26T07:46:45.890Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:46:45.890Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at A_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7452)","ts":"2026-09-26T07:46:45.891Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:46:45.891Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:46:45.891Z"}
@@ -0,0 +1,69 @@
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:29:19.454Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:29:19.454Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:29:19.454Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:29:19.457Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:29:19.457Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:29:19.458Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:29:19.458Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:29:19.458Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:29:19.458Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:29:19.458Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:29:19.458Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:29:19.458Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:29:19.458Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:44.433Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:44.433Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:44.436Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:44.436Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:53:44.437Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:53:44.437Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:53:44.437Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:53:44.437Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:53:44.437Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:53:44.437Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:44.438Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:53:44.439Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:53:44.439Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:08:58.802Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:08:58.802Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:08:58.803Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:08:58.805Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:08:58.805Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:08:58.807Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T05:08:58.807Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:08:58.808Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:08:58.808Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:08:58.808Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T05:08:58.808Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:08:58.808Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T05:08:58.808Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:38.687Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:38.687Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:38.688Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:38.688Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:23:38.689Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:23:38.691Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:436:3330","ts":"2026-09-26T07:23:38.691Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:23:38.691Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7452)","ts":"2026-09-26T07:23:38.691Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:23:38.692Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:38.692Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:23:38.692Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at R_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7112)","ts":"2026-09-26T07:23:38.693Z"}
{"kind":"console","level":"error","text":"Loading the font 'data:font/woff2;base64,d09GMgABAAAAAA4oAA4AAAAAHbQAAA3TAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgRQIDgmcDBEICo1oijYBNgIkA14LMgAEIAWJAAeBHAyBHBvbGiMRdnO0IkRRkiYDgr9KsJ1NUAf2kILNxgUmgqIgq1P89vcbIcmsQbRps3vCcXdYOKSWEPEKgZgQkprQQsxIXUgq0DqpGKmIvrgkeVGtEQD9DzAO29fM9jYhxZEsL2FeURH2JN4MIcTdO049NCVdxQ/w9NrSYFEBKTDKpLKfNkCGDc1RwjZLQcm3vqJ2UW9Xfa3tgAHz6ivp6vgC2yD4/6352ndnN0X0TL7seypkjZlMsjmZnf0Mm5Q+JykRWQBKCVCVPbARPXWyQtb5VgLB6Biq7/Uixcj2WGqdI8tGSgkuRG+t910GKP2D7AQH0DB9FMDW/obJZ8giFI3Wg8Cvevz0M+5m0rTh7XDBlvo9Y4vm13EXmftt...mCahLsdlyA5fdQkRSan9LgnnLEyGSkaKJCJog0wAgvepWBt80+1yKln1bMVtCljfNWDueKLsWwaEbBSfSPTEmVRsUcYYMnEjcjeyCZzBXK9E9BYBXLKjOSpUDR+nEV3TFSUdQaz+ot98QxgXwx0GQ+EEUAKB2qZPkQQ0GqFD8UPFMqyaCHM24BZmSGic9EYMagKizOw9Hz50DMrDLrqqLkTAhplMictiCAx5S3BIUQdeJeLnBy2CNtMfz6cV4u8XKoFZQesbf9YZiIERiHjaNodDW6LgcirX/mPnJIkBGDUpTBhSa0EIr38D5hCIszhCM8URGBqImoWjpvpt1ebu/v3Gl3qJfMnNM+9V+kiRFyROTPHQWOcs1dNW94/ukKMPZBvDi55i5CttdeJz84DLngLqjcdwEZ87bFFR8CIG35OAkDVN6VRDZ7aq67NteYqZ2lpT8oYB2CytoBd6VuAx4WgiAsnuj3WohG+LugzXiQRDeM3XYXlULv4dp5VFYC' violates the following Content Security Policy directive: \"font-src 'self'\". The action has been blocked.","ts":"2026-09-26T07:23:39.082Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:39.503Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:01.889Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:01.892Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:01.892Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:45:01.893Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:01.893Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:01.893Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:436:3330","ts":"2026-09-26T07:45:01.893Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:01.894Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:01.894Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at A_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7452)","ts":"2026-09-26T07:45:01.894Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:01.894Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:01.894Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7112)","ts":"2026-09-26T07:45:01.895Z"}
{"kind":"console","level":"error","text":"Loading the font 'data:font/woff2;base64,d09GMgABAAAAAA4oAA4AAAAAHbQAAA3TAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgRQIDgmcDBEICo1oijYBNgIkA14LMgAEIAWJAAeBHAyBHBvbGiMRdnO0IkRRkiYDgr9KsJ1NUAf2kILNxgUmgqIgq1P89vcbIcmsQbRps3vCcXdYOKSWEPEKgZgQkprQQsxIXUgq0DqpGKmIvrgkeVGtEQD9DzAO29fM9jYhxZEsL2FeURH2JN4MIcTdO049NCVdxQ/w9NrSYFEBKTDKpLKfNkCGDc1RwjZLQcm3vqJ2UW9Xfa3tgAHz6ivp6vgC2yD4/6352ndnN0X0TL7seypkjZlMsjmZnf0Mm5Q+JykRWQBKCVCVPbARPXWyQtb5VgLB6Biq7/Uixcj2WGqdI8tGSgkuRG+t910GKP2D7AQH0DB9FMDW/obJZ8giFI3Wg8Cvevz0M+5m0rTh7XDBlvo9Y4vm13EXmftt...mCahLsdlyA5fdQkRSan9LgnnLEyGSkaKJCJog0wAgvepWBt80+1yKln1bMVtCljfNWDueKLsWwaEbBSfSPTEmVRsUcYYMnEjcjeyCZzBXK9E9BYBXLKjOSpUDR+nEV3TFSUdQaz+ot98QxgXwx0GQ+EEUAKB2qZPkQQ0GqFD8UPFMqyaCHM24BZmSGic9EYMagKizOw9Hz50DMrDLrqqLkTAhplMictiCAx5S3BIUQdeJeLnBy2CNtMfz6cV4u8XKoFZQesbf9YZiIERiHjaNodDW6LgcirX/mPnJIkBGDUpTBhSa0EIr38D5hCIszhCM8URGBqImoWjpvpt1ebu/v3Gl3qJfMnNM+9V+kiRFyROTPHQWOcs1dNW94/ukKMPZBvDi55i5CttdeJz84DLngLqjcdwEZ87bFFR8CIG35OAkDVN6VRDZ7aq67NteYqZ2lpT8oYB2CytoBd6VuAx4WgiAsnuj3WohG+LugzXiQRDeM3XYXlULv4dp5VFYC' violates the following Content Security Policy directive: \"font-src 'self'\". The action has been blocked.","ts":"2026-09-26T07:45:02.276Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:02.697Z"}
@@ -0,0 +1,52 @@
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:44.964Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:44.964Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:44.964Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:44.967Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:53:44.967Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:53:44.968Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:53:44.968Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:53:44.968Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:53:44.968Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:53:44.968Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:53:44.968Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:53:44.968Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:53:44.968Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:08:59.326Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:08:59.326Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:08:59.327Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:08:59.327Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:08:59.327Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:08:59.328Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T05:08:59.328Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:08:59.328Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T05:08:59.328Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:08:59.328Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T05:08:59.328Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:08:59.329Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:08:59.329Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:39.803Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:39.803Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:39.803Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:39.804Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:23:39.804Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:23:39.805Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:436:3330","ts":"2026-09-26T07:23:39.806Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:23:39.806Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:23:39.807Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at R_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7112)","ts":"2026-09-26T07:23:39.807Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:23:39.807Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7452)","ts":"2026-09-26T07:23:39.807Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:23:39.807Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:03.008Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:03.008Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:03.009Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:03.010Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:45:03.010Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:03.010Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:03.016Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7112)","ts":"2026-09-26T07:45:03.016Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:03.016Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:436:3330","ts":"2026-09-26T07:45:03.017Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:03.017Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at A_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7452)","ts":"2026-09-26T07:45:03.017Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:03.017Z"}
@@ -0,0 +1,170 @@
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:28.247Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:28.248Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:28.248Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:22:28.251Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:436:2697","ts":"2026-09-26T03:22:28.251Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:28.252Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:22:28.252Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:22:28.252Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at T_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7452)","ts":"2026-09-26T03:22:28.253Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:22:28.253Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:22:28.254Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at C_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7112)","ts":"2026-09-26T03:22:28.254Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:28.254Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:33.247Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:38.248Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:43.246Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:48.247Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:53.248Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:22:58.247Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:22:58.248Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:30.477Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:30.478Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:30.478Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:30.480Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:25:30.481Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:25:30.481Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:25:30.482Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at T_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7452)","ts":"2026-09-26T03:25:30.482Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:25:30.482Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:436:2697","ts":"2026-09-26T03:25:30.482Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:25:30.483Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at C_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7112)","ts":"2026-09-26T03:25:30.483Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:30.483Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:35.478Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:40.479Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:45.477Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:50.476Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:25:55.478Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:26:00.476Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:26:00.477Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:10.369Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:10.369Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:10.369Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:30:10.371Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:436:2697","ts":"2026-09-26T03:30:10.371Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:30:10.371Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at T_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7452)","ts":"2026-09-26T03:30:10.372Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:30:10.372Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:10.372Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:30:10.372Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:30:10.373Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at C_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7112)","ts":"2026-09-26T03:30:10.373Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:30:10.374Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:30.260Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:30.261Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:30.261Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:30.264Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:30.264Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:32:30.264Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:30.264Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:436:2697","ts":"2026-09-26T03:32:30.264Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:30.264Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at T_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7452)","ts":"2026-09-26T03:32:30.264Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:30.265Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at C_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7112)","ts":"2026-09-26T03:32:30.266Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:30.266Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:03.283Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:03.283Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:03.284Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:03.286Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:25:03.287Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:03.287Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:03.288Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:03.288Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:03.288Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:25:03.289Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:03.289Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:25:03.289Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:03.289Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:08.525Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:08.525Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:08.525Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:08.526Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:35:08.527Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:08.527Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:35:08.527Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:08.528Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:35:08.528Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:08.528Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:08.528Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:35:08.529Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:08.529Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:48.175Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:48.175Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:48.175Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:48.175Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:41:48.176Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:48.176Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:41:48.176Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:48.177Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:41:48.177Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:48.178Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:48.178Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:41:48.178Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:48.178Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:56.255Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:56.255Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:56.256Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:49:56.256Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:56.256Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:56.257Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:49:56.257Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:56.257Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:56.257Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:56.258Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:49:56.258Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:56.258Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:49:56.258Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:13.778Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:13.778Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:13.778Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:13.778Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:55:13.779Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:13.779Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:13.779Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:55:13.779Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:13.781Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:55:13.781Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:13.781Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:55:13.781Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:13.781Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:13.241Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:13.242Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:13.242Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:13.244Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T05:03:13.244Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:13.245Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:13.245Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T05:03:13.246Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:13.246Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:03:13.246Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:13.247Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T05:03:13.247Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:13.247Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:22.339Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:22.339Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:22.340Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:22.342Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:22.342Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:436:3330","ts":"2026-09-26T07:17:22.342Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:22.343Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7452)","ts":"2026-09-26T07:17:22.343Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:22.343Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:17:22.344Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:22.344Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at R_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7112)","ts":"2026-09-26T07:17:22.344Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:22.345Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:07.782Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:07.783Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:07.784Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:07.785Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:40:07.785Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:07.785Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:436:3330","ts":"2026-09-26T07:40:07.785Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:07.785Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:07.785Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at A_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7452)","ts":"2026-09-26T07:40:07.785Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:07.787Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7112)","ts":"2026-09-26T07:40:07.787Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:07.787Z"}
@@ -0,0 +1,117 @@
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:31.045Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:31.045Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:31.045Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:31.046Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:32:31.046Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:31.049Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at C_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7112)","ts":"2026-09-26T03:32:31.050Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:31.050Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:436:2697","ts":"2026-09-26T03:32:31.050Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:31.050Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:31.050Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at T_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7452)","ts":"2026-09-26T03:32:31.050Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:31.050Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:04.102Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:04.102Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:04.102Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:04.104Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:04.104Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:25:04.105Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:04.105Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:04.105Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:04.105Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:25:04.106Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:04.108Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:25:04.108Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:04.108Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:09.277Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:09.277Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:09.278Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:35:09.278Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:09.278Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:35:09.278Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:09.278Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:09.278Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:09.278Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:35:09.278Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:09.281Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:35:09.281Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:09.281Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:48.976Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:48.977Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:48.977Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:48.979Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:41:48.979Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:48.979Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:41:48.979Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:48.979Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:41:48.980Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:48.980Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:41:48.980Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:48.982Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:48.982Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:57.042Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:57.042Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:57.042Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:57.045Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:49:57.045Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:57.045Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:49:57.045Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:57.045Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:57.045Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:49:57.045Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:57.045Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:49:57.045Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:57.045Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:14.599Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:14.599Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:14.600Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:14.605Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:55:14.606Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:14.606Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:14.606Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:55:14.606Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:14.606Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:55:14.606Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:14.606Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:55:14.606Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:14.606Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:14.058Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:14.058Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:14.059Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:14.059Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:03:14.059Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:14.060Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:14.060Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T05:03:14.060Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:14.060Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T05:03:14.060Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:14.060Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T05:03:14.061Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:14.061Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:23.171Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:23.171Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:23.171Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:23.174Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:17:23.174Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:23.174Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:436:3330","ts":"2026-09-26T07:17:23.174Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:23.174Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:23.176Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7452)","ts":"2026-09-26T07:17:23.176Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:23.176Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:23.176Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at R_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7112)","ts":"2026-09-26T07:17:23.177Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:08.617Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:08.618Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:08.619Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:08.621Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:08.621Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:436:3330","ts":"2026-09-26T07:40:08.622Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:08.622Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:40:08.622Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:08.622Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at A_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7452)","ts":"2026-09-26T07:40:08.622Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:08.622Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7112)","ts":"2026-09-26T07:40:08.622Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:08.622Z"}
@@ -0,0 +1,39 @@
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:11.258Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:11.258Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:11.259Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:10:11.262Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T05:10:11.262Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:11.262Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:10:11.262Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:10:11.262Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:10:11.262Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T05:10:11.262Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:10:11.262Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:10:11.263Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T05:10:11.263Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:53.435Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:53.436Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:53.436Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:24:53.436Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:53.438Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:53.438Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:53.438Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at R_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7112)","ts":"2026-09-26T07:24:53.439Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:53.439Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:436:3330","ts":"2026-09-26T07:24:53.439Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:24:53.439Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7452)","ts":"2026-09-26T07:24:53.439Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:24:53.440Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:14.838Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:14.838Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:14.841Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:45:14.841Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:14.841Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:14.842Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:436:3330","ts":"2026-09-26T07:45:14.842Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:14.842Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:45:14.842Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:14.842Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at A_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7452)","ts":"2026-09-26T07:45:14.842Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:45:14.842Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7112)","ts":"2026-09-26T07:45:14.842Z"}
@@ -0,0 +1,117 @@
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:32.029Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:32.029Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:32.032Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:436:2697","ts":"2026-09-26T03:32:32.032Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:32.032Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-I90hqfds.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-I90hqfds.js:463:3951","ts":"2026-09-26T03:32:32.032Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:32.032Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:32.032Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at T_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7452)","ts":"2026-09-26T03:32:32.033Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:32.033Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T03:32:32.033Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T03:32:32.033Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at C_ (http://127.0.0.1:8080/assets/index-I90hqfds.js:54:7112)","ts":"2026-09-26T03:32:32.033Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:05.135Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:05.135Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:05.135Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:25:05.135Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:05.135Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:05.136Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:25:05.136Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:05.136Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:05.136Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:25:05.136Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:25:05.139Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:25:05.139Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:25:05.139Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:10.259Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:10.259Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:10.259Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:10.261Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:35:10.262Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:10.262Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:10.262Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:35:10.262Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:10.264Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:35:10.264Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:35:10.264Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:35:10.264Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:35:10.264Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:49.964Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:49.964Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:49.964Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:41:49.964Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:49.965Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:49.965Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:41:49.965Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:49.965Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:49.965Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:41:49.965Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:41:49.966Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:41:49.968Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:41:49.968Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:57.989Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:57.989Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:57.989Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:57.989Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:49:57.989Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:57.989Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:49:57.990Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:57.990Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:57.990Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:49:57.990Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:49:57.990Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:49:57.990Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:49:57.992Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:15.633Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:15.633Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:15.633Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:15.640Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T04:55:15.640Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:15.640Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T04:55:15.641Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:15.641Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:15.641Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T04:55:15.641Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T04:55:15.642Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T04:55:15.642Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T04:55:15.642Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:15.027Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:15.027Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:15.027Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:15.029Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:03:15.030Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:15.030Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T05:03:15.030Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:15.030Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T05:03:15.030Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:03:15.030Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:15.030Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T05:03:15.030Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:03:15.030Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:24.190Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:24.190Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:24.190Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:24.193Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:17:24.193Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:24.193Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:24.193Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7452)","ts":"2026-09-26T07:17:24.193Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:24.193Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:436:3330","ts":"2026-09-26T07:17:24.194Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:17:24.194Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at R_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7112)","ts":"2026-09-26T07:17:24.194Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:17:24.194Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:09.677Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:09.677Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:09.678Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:09.678Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:40:09.678Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:09.678Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:436:3330","ts":"2026-09-26T07:40:09.679Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:09.682Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:09.682Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at A_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7452)","ts":"2026-09-26T07:40:09.682Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:40:09.682Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7112)","ts":"2026-09-26T07:40:09.682Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:40:09.682Z"}
@@ -0,0 +1,39 @@
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:11:41.789Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:11:41.790Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:11:41.790Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:11:41.793Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at z_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7452)","ts":"2026-09-26T05:11:41.793Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:11:41.793Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at sm (http://127.0.0.1:8080/assets/index-DnAAyRch.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:463:3941","ts":"2026-09-26T05:11:41.794Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:11:41.794Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:11:41.794Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at Jx (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DnAAyRch.js:436:3330","ts":"2026-09-26T05:11:41.794Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T05:11:41.794Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at I_ (http://127.0.0.1:8080/assets/index-DnAAyRch.js:54:7112)","ts":"2026-09-26T05:11:41.794Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T05:11:41.795Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:26:23.965Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:26:23.965Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:26:23.966Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:26:23.969Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:436:3330","ts":"2026-09-26T07:26:23.970Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:26:23.970Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-DiDScA-d.js:55:88607)\n at async http://127.0.0.1:8080/assets/index-DiDScA-d.js:463:3951","ts":"2026-09-26T07:26:23.970Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:26:23.970Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:26:23.970Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7452)","ts":"2026-09-26T07:26:23.970Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:26:23.970Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at R_ (http://127.0.0.1:8080/assets/index-DiDScA-d.js:54:7112)","ts":"2026-09-26T07:26:23.970Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:26:23.970Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:46:45.388Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:46:45.388Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:46:45.388Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:46:45.394Z"}
{"kind":"console","level":"warning","text":"[deliverables] 工作流受控文档同步失败: Error: list project workflow documents failed: 403\n at lm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:55:88595)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:463:3951","ts":"2026-09-26T07:46:45.394Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 403 (Forbidden)","ts":"2026-09-26T07:46:45.395Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:46:45.395Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:46:45.395Z"}
{"kind":"console","level":"warning","text":"Failed to load date stats: Error: fetchChatDates failed: HTTP 404\n at D_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7112)","ts":"2026-09-26T07:46:45.395Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:46:45.395Z"}
{"kind":"console","level":"warning","text":"[useChatWindow] fetch window failed, falling back to local cache/fallback Error: fetchChatWindow failed: HTTP 404\n at nm (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:6112)\n at async http://127.0.0.1:8080/assets/index-CrRH72Vb.js:436:3330","ts":"2026-09-26T07:46:45.395Z"}
{"kind":"console","level":"error","text":"Failed to load resource: the server responded with a status of 404 (Not Found)","ts":"2026-09-26T07:46:45.395Z"}
{"kind":"console","level":"warning","text":"Failed to load category stats: Error: fetchChatCategories failed: HTTP 404\n at A_ (http://127.0.0.1:8080/assets/index-CrRH72Vb.js:54:7452)","ts":"2026-09-26T07:46:45.395Z"}
@@ -0,0 +1,30 @@
IMAGE=mcr.microsoft.com/playwright:v1.63.0-noble BASE_URL=http://127.0.0.1:8080 ASSETS=/home/weichen/projects/Agent-System/.worktrees/full-system-browser-e2e-2026-09-26/.doc/test-reports/assets/2026-09-26-full-system-browser-e2e WT=/home/weichen/projects/Agent-System/.worktrees/full-system-browser-e2e-2026-09-26
Running 21 tests using 1 worker
✓ 1 [chromium] › e2e/full-system-browser-e2e.spec.ts:687:3 › full-system browser multi-user E2E › FS-IAM-01 admin creates multi-role users via UI (2.0s)
✓ 2 [chromium] › e2e/full-system-browser-e2e.spec.ts:739:3 › full-system browser multi-user E2E › FS-IAM-02 first-login password change for all e2e users (2.0s)
✓ 3 [chromium] › e2e/full-system-browser-e2e.spec.ts:784:3 › full-system browser multi-user E2E › FS-PROJ-01 create project + add members with roles (863ms)
✓ 4 [chromium] › e2e/full-system-browser-e2e.spec.ts:861:3 › full-system browser multi-user E2E › FS-PROJ-02 activate workflow with author/reviewer/approver duties (640ms)
✓ 5 [chromium] › e2e/full-system-browser-e2e.spec.ts:904:3 › full-system browser multi-user E2E › FS-CHAT-01 casual multi-turn dialogue (368ms)
✓ 6 [chromium] › e2e/full-system-browser-e2e.spec.ts:946:3 › full-system browser multi-user E2E › FS-SQUAD-WF-01 generate workflow intake document (real PI) (6.2m)
✓ 7 [chromium] › e2e/full-system-browser-e2e.spec.ts:1004:3 › full-system browser multi-user E2E › FS-DOC-REV-01 author edit controlled doc (1.1s)
✓ 8 [chromium] › e2e/full-system-browser-e2e.spec.ts:1049:3 › full-system browser multi-user E2E › FS-NONAUTH-01 non-author member can edit after claim (1.1s)
✓ 9 [chromium] › e2e/full-system-browser-e2e.spec.ts:1116:3 › full-system browser multi-user E2E › FS-NONAUTH-02 non-author submit gated (duty) (593ms)
✓ 10 [chromium] › e2e/full-system-browser-e2e.spec.ts:1176:3 › full-system browser multi-user E2E › FS-DOC-REV-02 author submit for review (698ms)
✓ 11 [chromium] › e2e/full-system-browser-e2e.spec.ts:1219:3 › full-system browser multi-user E2E › FS-DOC-REV-03 reviewer rejects with reason (35.7s)
✓ 12 [chromium] › e2e/full-system-browser-e2e.spec.ts:1268:3 › full-system browser multi-user E2E › FS-DOC-REV-04 author fix and resubmit (30.6s)
✓ 13 [chromium] › e2e/full-system-browser-e2e.spec.ts:1314:3 › full-system browser multi-user E2E › FS-DOC-REV-05 reviewer pass (636ms)
✓ 14 [chromium] › e2e/full-system-browser-e2e.spec.ts:1357:3 › full-system browser multi-user E2E › FS-DOC-REV-06 approver final approve (4.4s)
✓ 15 [chromium] › e2e/full-system-browser-e2e.spec.ts:1400:3 › full-system browser multi-user E2E › FS-DOC-REV-07 cascade re-review if UI reachable (598ms)
✓ 16 [chromium] › e2e/full-system-browser-e2e.spec.ts:1472:3 › full-system browser multi-user E2E › FS-ASSIST-01 assistant-style task prompt (406ms)
✓ 17 [chromium] › e2e/full-system-browser-e2e.spec.ts:1516:3 › full-system browser multi-user E2E › FS-SQUAD-FREE-01 complex free / adhoc task (1.5m)
✓ 18 [chromium] › e2e/full-system-browser-e2e.spec.ts:1567:3 › full-system browser multi-user E2E › FS-UPLOAD-01 upload attachment → freeform register (483ms)
✓ 19 [chromium] › e2e/full-system-browser-e2e.spec.ts:1633:3 › full-system browser multi-user E2E › FS-KB-01 admin KB console readonly check (1.1s)
✓ 20 [chromium] › e2e/full-system-browser-e2e.spec.ts:1678:3 › full-system browser multi-user E2E › FS-CTX-01 context injection observation (644ms)
✓ 21 [chromium] › e2e/full-system-browser-e2e.spec.ts:1737:3 › full-system browser multi-user E2E › FS-CONSOLE-01 aggregate console errors across roles (1ms)
Slow test file: [chromium] › e2e/full-system-browser-e2e.spec.ts (9.1m)
Consider running tests from slow files in parallel. See: https://playwright.dev/docs/test-parallel
21 passed (9.1m)
EXIT:0
@@ -0,0 +1,29 @@
IMAGE=mcr.microsoft.com/playwright:v1.63.0-noble BASE_URL=http://127.0.0.1:8080 ASSETS=/home/weichen/projects/Agent-System/.worktrees/full-system-browser-e2e-2026-09-26/.doc/test-reports/assets/2026-09-26-full-system-browser-e2e WT=/home/weichen/projects/Agent-System/.worktrees/full-system-browser-e2e-2026-09-26
Running 21 tests using 1 worker
✓ 1 [chromium] › e2e/full-system-browser-e2e.spec.ts:687:3 › full-system browser multi-user E2E › FS-IAM-01 admin creates multi-role users via UI (2.1s)
✓ 2 [chromium] › e2e/full-system-browser-e2e.spec.ts:739:3 › full-system browser multi-user E2E › FS-IAM-02 first-login password change for all e2e users (2.1s)
✓ 3 [chromium] › e2e/full-system-browser-e2e.spec.ts:784:3 › full-system browser multi-user E2E › FS-PROJ-01 create project + add members with roles (828ms)
✓ 4 [chromium] › e2e/full-system-browser-e2e.spec.ts:861:3 › full-system browser multi-user E2E › FS-PROJ-02 activate workflow with author/reviewer/approver duties (645ms)
✓ 5 [chromium] › e2e/full-system-browser-e2e.spec.ts:904:3 › full-system browser multi-user E2E › FS-CHAT-01 casual multi-turn dialogue (383ms)
✓ 6 [chromium] › e2e/full-system-browser-e2e.spec.ts:946:3 › full-system browser multi-user E2E › FS-SQUAD-WF-01 generate workflow intake document (real PI) (4.9m)
✓ 7 [chromium] › e2e/full-system-browser-e2e.spec.ts:1004:3 › full-system browser multi-user E2E › FS-DOC-REV-01 author edit controlled doc (1.1s)
✓ 8 [chromium] › e2e/full-system-browser-e2e.spec.ts:1049:3 › full-system browser multi-user E2E › FS-NONAUTH-01 non-author member can edit after claim (1.1s)
✓ 9 [chromium] › e2e/full-system-browser-e2e.spec.ts:1116:3 › full-system browser multi-user E2E › FS-NONAUTH-02 non-author submit gated (duty) (579ms)
✓ 10 [chromium] › e2e/full-system-browser-e2e.spec.ts:1176:3 › full-system browser multi-user E2E › FS-DOC-REV-02 author submit for review (717ms)
✓ 11 [chromium] › e2e/full-system-browser-e2e.spec.ts:1219:3 › full-system browser multi-user E2E › FS-DOC-REV-03 reviewer rejects with reason (5.7s)
✓ 12 [chromium] › e2e/full-system-browser-e2e.spec.ts:1268:3 › full-system browser multi-user E2E › FS-DOC-REV-04 author fix and resubmit (1.2s)
✓ 13 [chromium] › e2e/full-system-browser-e2e.spec.ts:1314:3 › full-system browser multi-user E2E › FS-DOC-REV-05 reviewer pass (683ms)
✓ 14 [chromium] › e2e/full-system-browser-e2e.spec.ts:1357:3 › full-system browser multi-user E2E › FS-DOC-REV-06 approver final approve (1.9s)
✓ 15 [chromium] › e2e/full-system-browser-e2e.spec.ts:1400:3 › full-system browser multi-user E2E › FS-DOC-REV-07 cascade re-review if UI reachable (623ms)
✓ 16 [chromium] › e2e/full-system-browser-e2e.spec.ts:1472:3 › full-system browser multi-user E2E › FS-ASSIST-01 assistant-style task prompt (391ms)
✓ 17 [chromium] › e2e/full-system-browser-e2e.spec.ts:1516:3 › full-system browser multi-user E2E › FS-SQUAD-FREE-01 complex free / adhoc task (1.5m)
✓ 18 [chromium] › e2e/full-system-browser-e2e.spec.ts:1567:3 › full-system browser multi-user E2E › FS-UPLOAD-01 upload attachment → freeform register (496ms)
✓ 19 [chromium] › e2e/full-system-browser-e2e.spec.ts:1633:3 › full-system browser multi-user E2E › FS-KB-01 admin KB console readonly check (1.1s)
✓ 20 [chromium] › e2e/full-system-browser-e2e.spec.ts:1678:3 › full-system browser multi-user E2E › FS-CTX-01 context injection observation (648ms)
✓ 21 [chromium] › e2e/full-system-browser-e2e.spec.ts:1737:3 › full-system browser multi-user E2E › FS-CONSOLE-01 aggregate console errors across roles (1ms)
Slow test file: [chromium] › e2e/full-system-browser-e2e.spec.ts (6.7m)
Consider running tests from slow files in parallel. See: https://playwright.dev/docs/test-parallel
21 passed (6.7m)
@@ -0,0 +1,4 @@
E2E_START=2026-09-26T05:03:07Z
WRAP_PID=2678967
EXIT:0
E2E_END=2026-09-26T05:12:28Z
@@ -0,0 +1 @@
{"status":"ok","env":"dev","agent_backend":"pi-agent","version":"v1.0","shared_kb_port":5433,"kb_ready":true,"database_ready":true,"schema_version":75,"schema_ready":true,"task_store_ready":true,"vault_identity_ok":false,"vault_connected":false,"vault_lag_ok":true,"events_ready":true}
@@ -0,0 +1 @@
{"status":"ok","env":"dev","agent_backend":"pi-agent","version":"v1.0","shared_kb_port":5433,"kb_ready":true,"database_ready":true,"schema_version":75,"schema_ready":true,"task_store_ready":true,"vault_identity_ok":false,"vault_connected":false,"vault_lag_ok":true,"events_ready":true}
@@ -0,0 +1 @@
{"status":"ok","env":"dev","agent_backend":"pi-agent","version":"v1.0","shared_kb_port":5433,"kb_ready":true,"database_ready":true,"schema_version":75,"schema_ready":true,"task_store_ready":true,"vault_identity_ok":false,"vault_connected":false,"vault_lag_ok":true,"events_ready":true}
@@ -0,0 +1,15 @@
✔ isSameMessage: clientTurnId match (0.511655ms)
✔ isSameMessage: serverId match without turn (0.095287ms)
✔ filterPendingLiveMessages: real temp vs server id (0.088758ms)
✔ mergeLiveOverHistory preserves server id from live (0.107677ms)
✔ mergeLiveOverHistory does not let inflight live mask terminal history (0.084268ms)
✔ mergeLiveOverHistory keeps live terminal over history inflight (0.053848ms)
ℹ tests 6
ℹ suites 0
ℹ pass 6
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 73.489258
EXIT:0
@@ -0,0 +1,103 @@
{
"probe_id": "msg243-readonly-probe",
"probed_at": "2026-09-26T04:24:49Z",
"authorization": "read-only; no secrets in this file",
"shell_status": {
"usable": true,
"error": null,
"impact": "live admin login + DB SELECT agent_system_dev + GET /api/v1/tasks/runs/{id}"
},
"login": {
"http_status": 200,
"user": {
"id": 4,
"username": "admin",
"role_id": "role-admin"
},
"has_token": true
},
"project": {
"name": "E2E全量-20260926-muhu39da",
"project_id": 6012,
"session_id": "sess-p6012-u20",
"session_owner_user_id": 20,
"api_chat_messages": "FORBIDDEN_FOR_ADMIN (403) — owner session; used DB instead",
"api_lookup": "OK"
},
"message_243": {
"ui_data_server_id": 243,
"ui_data_chat_status_observed": "pending",
"ui_observation_source": [
"playwright.log FS-SQUAD-WF-01",
"ui-results.json FS-SQUAD-WF-01",
"error-context.md page snapshot"
],
"ui_snapshot_at_timeout": {
"chip": "执行中",
"elapsed_label": "已用 14m 59s",
"phases": [
"组建小队已完成",
"专员执行已完成",
"质量门禁已完成",
"参谋简报已完成"
],
"quality_label": "用户初始需求收集表 · 质量 100",
"content_placeholder": "任务执行中…"
},
"db": {
"id": 243,
"session_id": "sess-p6012-u20",
"role": "assistant",
"content_prefix": "《用户初始需求收集表》已生成。\n\n当前状态:**已完成**\n质量评分:100/100\n\n📄 受控文档:`doc_proj6012_bd_intake`",
"task_status": "completed",
"run_id": "run_1790393552136040254",
"task_key": "bd_intake",
"workspace_id": "bizdev",
"created_at": "2026-09-26 03:32:32.141957+00"
},
"metadata_task_status_db_or_api": "completed",
"content_snippet_desensitized": "《用户初始需求收集表》已生成。\n\n当前状态:**已完成**\n质量评分:100/100\n\n📄 受控文档:`doc_proj6012_bd_intake`"
},
"task_run": {
"run_id": "run_1790393552136040254",
"from_db": {
"run_id": "run_1790393552136040254",
"status": "completed",
"workspace_id": "data/dev/workspaces/bizdev/bd_intake_1790393552151447446",
"project_id": 6012,
"user_id": 20,
"session_id": "sess-p6012-u20",
"assistant_message_id": 243,
"task_key": "bd_intake",
"stage": "",
"error_prefix": "",
"created_at": "2026-09-26 03:32:32.136168+00",
"updated_at": "2026-09-26 03:37:01.805334+00"
},
"api_http": 200,
"from_api": {
"run_id": "run_1790393552136040254",
"status": "completed",
"workspace_id": "data/dev/workspaces/bizdev/bd_intake_1790393552151447446",
"project_id": 6012,
"user_id": 20,
"session_id": "sess-p6012-u20",
"assistant_message_id": 243,
"task_key": "bd_intake",
"stage": "",
"error_message": ""
},
"api_path": "/api/v1/tasks/runs/run_1790393552136040254"
},
"mismatch_summary": {
"backend_task_run_status": "completed",
"db_metadata_task_status": "completed",
"ui_bubble_data_chat_status": "pending (stuck through ~15m Playwright wait)",
"metadata_updated_to_completed": "YES",
"hypothesis": {
"primary": "SSE_DONE_NOT_APPLIED_OR_LIVE_MASKS_HISTORY",
"detail": "DB metadata.task_status=completed and task_runs.status=completed; UI data-chat-status stayed pending. Client missed EventDone and/or inflight live bubble masked terminal history (fetchChatWindow 404).",
"fix_shipped": "mergeLiveOverHistory prefers history terminal over inflight live; E2E reload-heal + 2.1m describe timeout"
}
}
}
@@ -0,0 +1,4 @@
{
"status": "passed",
"failedTests": []
}
@@ -0,0 +1,28 @@
Running 21 tests using 1 worker
✓ 1 [chromium] › e2e/full-system-browser-e2e.spec.ts:687:3 › full-system browser multi-user E2E › FS-IAM-01 admin creates multi-role users via UI (2.1s)
✓ 2 [chromium] › e2e/full-system-browser-e2e.spec.ts:739:3 › full-system browser multi-user E2E › FS-IAM-02 first-login password change for all e2e users (2.1s)
✓ 3 [chromium] › e2e/full-system-browser-e2e.spec.ts:784:3 › full-system browser multi-user E2E › FS-PROJ-01 create project + add members with roles (828ms)
✓ 4 [chromium] › e2e/full-system-browser-e2e.spec.ts:861:3 › full-system browser multi-user E2E › FS-PROJ-02 activate workflow with author/reviewer/approver duties (645ms)
✓ 5 [chromium] › e2e/full-system-browser-e2e.spec.ts:904:3 › full-system browser multi-user E2E › FS-CHAT-01 casual multi-turn dialogue (383ms)
✓ 6 [chromium] › e2e/full-system-browser-e2e.spec.ts:946:3 › full-system browser multi-user E2E › FS-SQUAD-WF-01 generate workflow intake document (real PI) (4.9m)
✓ 7 [chromium] › e2e/full-system-browser-e2e.spec.ts:1004:3 › full-system browser multi-user E2E › FS-DOC-REV-01 author edit controlled doc (1.1s)
✓ 8 [chromium] › e2e/full-system-browser-e2e.spec.ts:1049:3 › full-system browser multi-user E2E › FS-NONAUTH-01 non-author member can edit after claim (1.1s)
✓ 9 [chromium] › e2e/full-system-browser-e2e.spec.ts:1116:3 › full-system browser multi-user E2E › FS-NONAUTH-02 non-author submit gated (duty) (579ms)
✓ 10 [chromium] › e2e/full-system-browser-e2e.spec.ts:1176:3 › full-system browser multi-user E2E › FS-DOC-REV-02 author submit for review (717ms)
✓ 11 [chromium] › e2e/full-system-browser-e2e.spec.ts:1219:3 › full-system browser multi-user E2E › FS-DOC-REV-03 reviewer rejects with reason (5.7s)
✓ 12 [chromium] › e2e/full-system-browser-e2e.spec.ts:1268:3 › full-system browser multi-user E2E › FS-DOC-REV-04 author fix and resubmit (1.2s)
✓ 13 [chromium] › e2e/full-system-browser-e2e.spec.ts:1314:3 › full-system browser multi-user E2E › FS-DOC-REV-05 reviewer pass (683ms)
✓ 14 [chromium] › e2e/full-system-browser-e2e.spec.ts:1357:3 › full-system browser multi-user E2E › FS-DOC-REV-06 approver final approve (1.9s)
✓ 15 [chromium] › e2e/full-system-browser-e2e.spec.ts:1400:3 › full-system browser multi-user E2E › FS-DOC-REV-07 cascade re-review if UI reachable (623ms)
✓ 16 [chromium] › e2e/full-system-browser-e2e.spec.ts:1472:3 › full-system browser multi-user E2E › FS-ASSIST-01 assistant-style task prompt (391ms)
✓ 17 [chromium] › e2e/full-system-browser-e2e.spec.ts:1516:3 › full-system browser multi-user E2E › FS-SQUAD-FREE-01 complex free / adhoc task (1.5m)
✓ 18 [chromium] › e2e/full-system-browser-e2e.spec.ts:1567:3 › full-system browser multi-user E2E › FS-UPLOAD-01 upload attachment → freeform register (496ms)
✓ 19 [chromium] › e2e/full-system-browser-e2e.spec.ts:1633:3 › full-system browser multi-user E2E › FS-KB-01 admin KB console readonly check (1.1s)
✓ 20 [chromium] › e2e/full-system-browser-e2e.spec.ts:1678:3 › full-system browser multi-user E2E › FS-CTX-01 context injection observation (648ms)
✓ 21 [chromium] › e2e/full-system-browser-e2e.spec.ts:1737:3 › full-system browser multi-user E2E › FS-CONSOLE-01 aggregate console errors across roles (1ms)
Slow test file: [chromium] › e2e/full-system-browser-e2e.spec.ts (6.7m)
Consider running tests from slow files in parallel. See: https://playwright.dev/docs/test-parallel
21 passed (6.7m)
@@ -0,0 +1,6 @@
captured_at=2026-09-26T03:10:34+00:00
users_total=4
usernames=admin,seed-admin,seed-lizhuguan,seed-zhanggong
seed_demo_present=0
projects=10
goose_version=75

Some files were not shown because too many files have changed in this diff Show More