# 当前实现与目标规范差距 > 信息性文档,校准于 2026-08-11,最新审阅基线 `main@fda346b`。本文件描述当前仓库,不覆盖规范性文档。状态必须由源码、当前提交的本地验证,以及后续 CI 或结构化人工验收证据共同决定;历史测试计数、旧 README、零散截图和未绑定提交的日志不能继承为当前证据。 2026-08-12 当前修复:Fleet Bearer/CAS 单测原先以固定历史 `last_seen` 注册 Agent,却遗漏 `RemoteFleetServer.now` 注入,超过 30 秒离线窗口后会在 Kernel 鉴权前稳定返回 409。测试现统一注入固定时钟,保留“stale Agent 先 409、fresh Agent 才进入 Kernel 并验证 401”的既定产品语义;约束场景见 `acceptance-tests.md` 的 `fleet-clock-determinism`。 2026-08-12 UI 修复(GUIDE-01/UI-02/UI-03,状态“已实现未验收”):`SURVEYING + frozen Corpus + jobs=[]` 现在显示“调研已就绪”,Runs 在存在 frozen Corpus、`idea_generate` NextAction 且尚无 Job 时显示“调研已完成、尚未创建实验运行”与只导航到 Overview 的 CTA,不伪造任务;其他零 Job 与筛选无匹配仍使用各自空态。standalone 后台刷新改为串行合并:ShadowRoot 内可编辑控件聚焦时延迟结构重绘,失焦后只补一次;已启动的异步 render 在重绘前捕获并恢复控件 identity、文本选区与滚动,同时不从外部新焦点抢焦。自动证据:`ui-survey-phase-runs-empty` / `ui-refresh-focus-stability` 模型与 i18n 测试、严格 typecheck、build、docs verifier,以及根测试 81 files / 1227 tests 全绿;本地 headless Chrome 对 `demo1` 验证正确阶段/空态,并跨 8 秒轮询验证 Sidebar Search 与项目 Chat composer 的 sameNode/focused/value/selection 均保持。真实 IME、17 秒两轮询、Workspace/Manuscript/Terminal 持续流观感仍按 `manual-acceptance.md` §9 记 `NOT_RUN_MANUAL_PENDING`,因此不得标为“已验收”。 ## 1. 状态定义与证据规则 状态只允许使用下列值: | 状态 | 含义 | |---|---| | 未实现 | 没有可运行实现,或只有文档/占位代码 | | 部分 | 已有骨架或局部能力,但存在规范缺口、已知阻断缺陷或关键验收缺失 | | 已实现未验收 | 代码表面完整,但当前提交尚无全部阻断验收证据 | | 已验收 | 当前 commit 的全部对应 acceptance 场景在目标环境通过;证据可来自零 SKIP CI,或结构化人工验收记录 | | 已关闭 | 经明确决策不再实施;必须记录责任人、日期、边界和重新开启条件 | “已实现”不等于“已验收”。开发期可先完成代码,将真实环境场景标记 `NOT_RUN_MANUAL_PENDING` 并继续后续实现;这类项最多进入“已实现未验收”。标记“已验收”时必须同时记录 commit SHA、acceptance 场景,以及 CI run/job 或符合 `manual-acceptance.md` 的人工记录。CI 中出现 SKIP、人工记录缺少环境/步骤/实际结果、缺少 Docker/TeX/DSH fixture、缺失 git base ref 或 `continue-on-error`,均不得计入 PASS。状态矩阵与“具体不一致”、USAGE、README 或源码冲突时,自动取较低状态并阻断完成声明。 ## 2. 当前可复用基础 | 范围 | 当前可复用实现 | |---|---| | Kernel/CAS | TypeScript、node:sqlite、WAL、项目/Gate/Job/Artifact/Evidence/Claim/Budget、SHA-256 CAS | | HTTP | v1 主接口、局部 v2 adapter、Zod 校验、binary Artifact、Terminal SSE | | Plugin | Cordis Agent tools/commands/subagents、角色 ACL、四组 Skills、sidecar;无浏览器嵌入面 | | UI | standalone 原生 DOM Workspace;Chat/Overview/Approvals/Runs/Terminal/Artifacts/Evidence/Manuscript/Budget | | Runner | Docker/subprocess adapter、快照物化、lease、heartbeat、cancel、Terminal chunk、可选 Ed25519 Manifest | | Analysis | Metric/RunSet/AnalysisPlan 与 paired bootstrap 基础 | | Connectors | OpenAlex/Crossref/arXiv、缓存、Unicode 去重、部分失败透明 | | TeX | 文件树、文本编辑、版本保存、快照、latex-compile、诊断/PDF 基础 | | Release | 私有 bundle 清单、脚本化 verify/clean-room 基础 | 这些基础不代表符合 v2 规范;以下矩阵是后续执行的约束来源。 ## 3. 校准后的目标差距矩阵 > 权威校准:同一 ID 在 §3 与第 5 节(2026-08-11 审阅阻断项)冲突时,一律采用第 5 节状态。2026-08-11 修复轮(commit 4b92ed8/d63abca/aa6d3e0/431085f)已把下列 ID 的服务端/逻辑层全部闭环为“已实现未验收”:API-01、SIDE-01、PTY-01、TEX-01、TEX-02、TEX-03、SNAPSHOT-01、RUN-REMOTE-01、RUN-01a、RUN-01b、ART-01、GOV-01、ONBOARD-01、UPLOAD-01、GUIDE-01、WORK-01、TRAJ-01、SUBAGENT-01、CONFIG-01、UI-02、UI-03、STORE-01、CI-01;剩余真实环境/浏览器验收统一记 NOT_RUN_MANUAL_PENDING(见 §6 决策与 manual-acceptance.md),状态上限“已实现未验收”,不越级宣称。§3 各行保留历史证据文本,与第 5 节冲突处以第 5 节为准。 > 2026-08-14 Artifact 独立复核与修复:多轮只读审计无 P0;发现的 Manuscript 跨项目迟到 PDF/轮询覆盖、并发轮询、权威/preview 串区、Save→Compile/Regenerate 上下文漂移、“最新成功 build 无 PDF 仍显示旧 PDF”、未保存编辑未即时 stale 与新 PDF 拉取失败后旧稿显示 fresh 等 P1 均已关闭。实现使用 generation+document+project guard、每路 single-flight、AbortController、按最新 succeeded build 的 `pdf_artifact` 替换或清空、按 build_id 判 stale、编辑时局部更新 stale 标志,以及切文档/离开面板 URL 释放。空/缺 MIME 回退登记 active MIME、缺失/错误 Content-Length 的有界流读取、批量下载取消、Artifact 详情 locale/Escape/同项目重绘后的焦点回退也已实现。自动证据包含纯分类/解析模型、源码 lifecycle wiring、真实 standalone HTTP CSP、整仓 92 files / 1304 tests、research-ui strict typecheck、全包 build 与 docs 21/21;这些仍不等价于浏览器 DOM/codec/PDF 证明,真实浏览器保持 `NOT_RUN_MANUAL_PENDING`。 | ID | 目标 | 当前状态 | 当前阻断与关闭条件 | |---|---|---|---| | GOV-01 | 认证 Human Principal durable | 已实现未人工浏览器验收 | Kernel Decision 路由保持 fail-closed(完整 principal 必填,裸 actor/仅 header→422)。**2026-08-12 浏览器 Gate Decision 阻断已关闭**:Approvals 单项/批量 UI 改走规范 Human BFF `/bff/research/gates/{id}/decision`,只发送 decision/reason;BFF 校验 bearer+CSRF+same-origin、解析 gate 所属 project、fresh membership 与 PI/operator role,由 0600 session.json 注入完整 Principal/session 和服务端 request_id,再映射 Kernel v1 Decision;客户端 actor/principal/session/request_id 即使伪造也全部忽略。Human BFF 在路由入口即生成 request_id,预检及上游错误统一保留 `error.code/message/request_id`。UI 不再显示统一“桥接错误”,而是区分身份、权限、资源、冲突、校验与网络失败。证据:`tests/unit/gate-human-bff.test.ts` 5/5 + standalone-web/kernel 定向 154/154;`tests/security/run-standalone-http-tests.sh` 247/247(业务字段-only 请求 200、Decision session 与 session.json 对账、forged identity 不落账、Kernel 缺 principal 仍 fail closed);本地实例不存在 Gate 的无副作用 404 冒烟含服务端 request_id。剩余仅真实浏览器点击/刷新观感人工验收。 | | GOV-02 | Gate target freeze 与原子 Decision | 已实现未验收 | 六类 Gate(scope/idea/contract/budget/release/direction)已登记;前五类保持既有状态流程/映射,direction 为 semantic-only Gate,strict payload 绑定 proposal/synthesis/direction 且不推进 Project 状态;gate-state-cannot-transition(Gate 控制状态经 transitions 422);concurrent-decision CAS 竞争 409 gate_already_decided 恰好一次;budget-gate-resume 仅接受与超额阻断同事务、同 Gate 持久的 `budget_block_provenance`,并精确校验 project/revision/created_at/resume_to/payload hash;human-principal-durable 重读含 principal/tenant/auth_method/session;decideGate contract 分支校验跨项目 target(contract.project_id!==gate.project_id→422 contract_foreign)。证据:tests/security/run-gate-tests.sh 15/15(含并发决策、principal 重读、budget resume、跨项目 contract 422)、tests/unit/governance.test.ts 扩展;尚未绑定 CI job 报告,待验收§4 P0 阻断项已关闭(commit 22b2ec6):内部 approve 路由要求 x-service-token(浏览器 bearer/自报 principal 均拒→403 service_token_required),contract approve 绕行 Human Gate 已封闭(负向:unit server 矩阵五路由×四种凭据、run-formal-binding-tests.sh 9/9)。 | | API-01 | v2 + BFF AuthZ | 已实现未验收 | v2(handleV2):x-principal-id membership 404 + x-principal-role 角色能力(viewer/auditor 只读,researcher 禁治理写 transitions/gates/decisions/budget/approve/accept,非法 role→403 role_required);BFF 从自身 membership 解析角色并注入头(客户端值永不信任),BFF 层同策略纵深(403 role forbidden 稳定文案);CSRF 会话 token(/api 写强制,Origin 第二层)。证据:tests/security/run-standalone-http-tests.sh 180/180(角色矩阵、非成员 404、BFF 注入断言、FC/forged 组)、tests/unit/kernel.test.ts v2 角色用例;完整 /bff/research 面仍待验收§4 P0 阻断项已关闭(commit 22b2ec6):内部路由(jobs-claim/runner-keys/recover/leases/evidence verified+accept/contracts approve)独立 service bearer——kernel 配置 serviceToken 后强制 x-service-token(常数时间比较),浏览器 bearer Authorization 与自报 x-service-principal 均不满足(403 service_token_required);sidecar 自动生成 0600 dataDir/service-token 并以 env(DSH_SCHOLAR_SERVICE_TOKEN)传给 kernel/runner,BFF 注入自身凭据且不转发客户端头。负向:tests/unit/kernel.test.ts server 矩阵、run-evidence-tests.sh 13/13、run-hardening-tests.sh 18/18(claim bearer-vs-token)、run-formal-binding-tests.sh 9/9。 | | EVID-01 | accepted Evidence only from 受控 Worker/Verifier | 已实现未验收 | 状态机 draft_unverified→verified→accepted 已实现:public 路由只创建 draft/legacy(伪造 provenance=verified/accepted→422);POST /v1/projects/{id}/evidence/verified 要求 x-service-principal: analysis-worker 且 x-service-token(否则 403);POST /v1/projects/{id}/evidence/{eid}/accept 要求 x-service-principal: verifier|auditor 且 x-service-token(否则 403),重验 RunManifest(verifyRunManifest)、Contract(approved)、RunSet(succeeded+metrics_artifact)、Analysis Artifact(artifact_refs 属本项目),记录 acceptance{accepted_by,accepted_at,request_id} 并 emit evidence.accepted outbox;跨项目 accept→422 evidence_foreign;verifyClaim 只接受 provenance=accepted(draft/legacy/verified 一律 inconclusive)。证据:tests/security/run-evidence-tests.sh 13/13(含无 token/自报 principal 403 负向)、run-lower-is-better-tests.sh 5/5、run-analysis-spec-tests.sh 31/31(manuscript 排除 draft evidence、verified→accept→manuscript 全链)、demo-full-flow 15/15(verified→accept→verify 全链)、单元测试新增 acceptEvidence 用例;尚未绑定 CI job 报告,待验收§4 P0 阻断项已关闭(commit 22b2ec6):verified/accept 内部路由要求独立 service bearer(x-service-token;自报 principal 单独不信任→403 service_token_required);draft/unverified Evidence 不进 Manuscript(claims_used=0 且语句缺失,spec 测试断言)。 | | STAT-01 | 单一正式分析实现 | 已实现未验收 | resamples 固定 10,000(ANALYSIS_RESAMPLES,内核不再传 1000,artifact n_resamples=10000);minimum_n 由绑定 contract stop_conditions.min_completed_seeds 驱动,调用者降低→422 minimum_n_too_low(§12);canonical output key 顺序核对(worker 测试);golden vector 与字节一致性(STAT-01b)、MetricsFileV1、lower-is-better、Analysis→accepted Evidence 链均已实现;worker 公式按 §12 重写:seed=FNV-1a 32 over UTF-8 canonical JSON(plan+按 seed 升序的 run_ids+metric_values)、B=10000 生产固定、索引 CI floor(0.025(B−1))/ceil(0.975(B−1))、pLow/pHigh=(1+count)/(B+1) 两尾 raw_p、Holm 单调 step-down(名称平局)、effect_size=paired mean difference、数值 12 位有效数字 round-half-to-even、−0→0、重复 metric 名拒绝、零差→direction_ok=false 且 raw_p=1。证据:pnpm test 337/337(含 STAT-01 新用例)、run-analysis-consistency-tests.sh 30/30、run-analysis-spec-tests.sh 31/31(独立镜像重算 CI/p 相等);尚未绑定 CI job 报告,待验收§4 额外阻断已关闭(commit 22b2ec6):重复 seed→422 duplicate_seed(内核);统计公式与规范 golden vector 一致(公式重写+golden 重生成+spec 镜像断言)。 | | STAT-01a | lower-is-better claim direction(acceptance-tests.md §6) | 已验收 | research-schemas:ExperimentContract.metrics 新增 `direction`('higher_is_better'\|'lower_is_better',默认 higher,experiment.ts:30-31);EvidenceItem.result 新增 `direction`(evidence.ts:26-29);kernel computeAnalysis 从绑定 contract 解析方向传给 analysis worker(kernel.ts:2160-2171,worker 本就支持);verifyClaim 按方向解释 effect 符号:lower 时负 effect+CI<0→supported、正 effect→contradicted(kernel.ts:1983-2006)。证据:tests/security/run-lower-is-better-tests.sh 3/3,不再 SKIP,已默认启用并接入聚合器(run-all-v2-blocking-tests.sh SCRIPTS);尚未绑定 CI job 报告,待验收验收绑定:commit 6e4d302 + scripts/ci-gate.sh 全量运行(4/4 PASS,142s,零 SKIP,日志 /tmp/ci-gate-full.log)+ 对应 acceptance 场景(阻断脚本 CI=true 零 SKIP)。 | | STAT-01b | 确定性 + golden vector + Analysis/图表/稿件数字一致(§6、§12) | 已实现未验收 | tests/fixtures/analysis-v1.json golden vector 已按 §12 公式重生成(resamples 10000、raw_p_value 字段、zero-diff case mz);analysis-worker.test.ts 断言相同输入双次运行输出逐字节一致且与 golden vector 一致;tests/unit/analysis-determinism.test.ts 覆盖 ≥5 组输入矩阵;tests/security/run-analysis-consistency-tests.sh 当前 30/30:真实 Docker 跑 baseline+formal 配对作业→analysis 两次调用 artifact 字节一致、artifact/chart/manuscript 数字一致,并验证 terminal formal Run 的 exact execution-only observation、scientific-only classification 与幂等 replay。非 2xx 会保留 HTTP status/body,不再被 curl exit 22 隐藏。run-analysis-spec-tests.sh 31/31 继续覆盖独立公式镜像;尚未绑定 CI job 报告。 | | RUN-01 | 正式 Docker/快照/fencing/Manifest | 已实现未验收 | secure kind 拒 subprocess、approved Contract 绑定、严格 lease fencing、MetricsFileV1、data_artifact_ids 同项目+hash 校验、Run attempt(runs 表)、快照资源上限、**必签 Manifest 默认开启**(kernel requireSignedManifest 默认 true;runner 总是注册临时 Ed25519 密钥并签名;未签名 manifest→422 manifest_signature_required;单元测试显式 opt-out 只测无关路径)全部实现。Runner、Kernel、outcome observation 与安全夹具复用同一递归 canonical JSON module,嵌套 resources/environment/outputs/lease 均进入签名与 stale hash。证据:run-manifest-tests.sh 11/11、golden-v2/clean-room/release-bundle/demo 在默认签名下全绿,analysis consistency 30/30 使用真实 signed Docker Manifest 的 `run_id` 完成 observation/classification/replay;尚未绑定 CI job 报告。 | | RUN-01a | secure 作业 Contract 绑定(P0,acceptance-tests.md §4 前段) | 已实现未验收 | kernel submitJob 对 baseline/pilot/formal/reproduce 强制:contract_id 缺失→422 contract_required;getContract 失败→422 contract_unknown;跨项目→422 contract_foreign;status!=='approved' 或缺 approval.gate_decision_id→422 contract_not_approved(kernel.ts:1303-1323)。server.ts 内部批准路由 POST /v1/projects/{id}/contracts/{cid}/approve(actor 必填,server.ts:386-394)现要求 x-service-token(service identity,浏览器 bearer/自报 principal 均拒→403 service_token_required),供 evals/orchestrator 用;交互路径走 Contract Gate 决策(GOV-02 原子冻结,approveContract 幂等,kernel.ts:992-1004)。证据:pnpm test 337/337(本会话运行,含 service-token server 矩阵);tests/security/run-formal-binding-tests.sh 9/9、run-gate-tests.sh 15/15§4 P0 阻断项已关闭(commit 22b2ec6):approve 绕行封闭(service token 强制,浏览器不可达)。 | | RUN-01b | 全字段 lease fencing(P0,acceptance-tests.md §4 末段) | 已实现未验收 | kernel heartbeatJob/completeJob 对 leased/running 作业:缺 generation/token→409 lease_stale;提供时精确匹配;无 owner-only 兼容放行(kernel.ts:1413-1432、1478-1485)。runner 侧所有 completeJob/heartbeat 调用点补齐 fencing 字段(workers/runner-gateway/src/index.ts:664-665、801、1028-1041;bin/runner.ts:133、157-158)。证据:tests/unit/kernel.test.ts §12.6 用例(519-595:stale token 409、缺字段 fail-closed);tests/security/run-manifest-tests.sh 11/11(stale generation/token→409 lease_stale、当前 token→200,并覆盖坏/好深层 canonical 签名);专项 tests/security/run-fencing-tests.sh 12/12(heartbeat/terminal/complete 缺字段、旧/未来 generation、错 token 均 409 lease_stale;terminal frame 缺 lease_generation 已 fail-closed,内核不再默认放行)§4 P0 阻断项已关闭(commit f94fac5):Terminal frame 校验 owner/generation/token/attempt(409 lease_stale,负向测试) | | RUN-01c | MetricsFileV1 强制(§4:formal/baseline/pilot/reproduce 成功必须存在 output_contract.metrics 指定路径的 MetricsFileV1) | 已实现未验收 | runner(workers/runner-gateway)对 secure 作业:缺 output_contract.metrics→code_error 失败;缺文件/非 MetricsFileV1(schema_version=1+非空 metrics)/run_id 不匹配/contract_id 不匹配/seed 缺失或非有限数/NaN/Infinity/重复 metric/非 Contract metric→不得 succeeded;secure 作业禁用 stdout fallback(index.ts:908-1011)。kernel submitJob 注入 payload.contract_metrics(contract primary+secondary,kernel.ts:1322、1330);runner 注入容器环境 DSH_RUN_ID/DSH_CONTRACT_ID/DSH_SEED(index.ts:741-743)。证据(本会话运行):golden-v2 29/29、clean-room 9/9、release-bundle eval 21/21 + release-bundle-tests 8/8、demo-full 15/15、demo-standalone 15/15,所有 secure 作业真实写 MetricsFileV1 文件;尚未绑定 CI job 报告,待验收§4 P0 阻断项已关闭(commit f94fac5):Metrics 文件路径 realpath 校验必须位于 outputs 内(../ 逃逸拒绝) | | RUN-02 | 固定容器安全基线(images.lock digest 强制) | 部分 | Docker flags 基本具备;configs/runner-profiles/images.lock.json 已提交(schema_version=1,node_fixture=node@sha256:c610fcdf…,texlive=texlive/texlive@sha256:8957c916…)。kernel submitJob 对 secure 作业强制:baseline/pilot/formal/reproduce 缺 digest→422 image_digest_required;tag(node:22-alpine)、latest、锁外 digest→422 image_digest_untrusted;latex-compile 缺 digest 由内核注入锁内 texlive 条目,显式提供时也必须与锁完全一致(packages/research-kernel/src/images-lock.ts validateImageDigest;DSH_IMAGES_LOCK 可覆盖 lock 路径)。单元测试新增 4 个 digest P0 用例,pnpm test 228/228。所有 eval/security 脚本已改用锁内 digest。**smoke 宿主 subprocess 执行面已封闭(commit 040e796)**:runner 在 mode!=='docker' 时对未标记 `payload.trusted_fixture=true` 的 smoke job 一律 completeJob failed/failure_class=environment,错误消息含 trusted-smoke-fixture(execution-runtime.md §1)且带 lease_generation/lease_token fencing 字段;显式 trusted_fixture 的 smoke 仍可在隔离 subprocess 运行(echo 不变,docker 模式 smoke 不受影响)。源码修复:workers/runner-gateway/src/index.ts executeJob 前置拒绝(§3.2 门禁扩展 smoke 分支);负向验收:subprocess runner + smoke(script 写宿主 marker)+ 无标记 → failed/environment 且宿主 marker 文件不存在(证明宿主未执行);正向验收:同 runner + trusted_fixture=true → succeeded 且 metrics artifact 可断言。证据(本会话运行):tests/security/run-hardening-tests.sh 21/21(含新增 smoke 负向/正向与适配的取消、空命令用例)、run-release-bundle-tests.sh 16/16(docker 模式 smoke 正常)、run-fencing-tests.sh 15/15、pnpm vitest tests/unit/kernel.test.ts 97/97;commit 040e796,§4 P0 行 RUN-02 已标注关闭。尚未绑定 CI job 报告,待验收§4 审阅校准为较低状态:见第 4 节对应阻断项与强制关闭条件。 | | TERM-01 | 实时有序可恢复 Terminal | 部分 | reconnect-after-seq(按 seq 续传无重复无缺失)、retention-gap(淘汰 seq 返回 gap+dropped bytes)、overflow truncated+log Artifact 可下载、exit-replay(exit_code/signal/timed_out/cancelled 可读)、log-authz(跨项目 404)、cancel-timeout-distinct。证据:tests/security/run-terminal-tests.sh 11/11、tests/unit/terminal.test.ts;UI 侧 DOM 有界/ANSI 消毒/backpressure 属浏览器层,未纳入本行验收§4 审阅校准为较低状态:见第 4 节对应阻断项与强制关闭条件。 | | PTY-01 | 可操作 Interactive Terminal | 部分 | 当前 Runner `stdio=['ignore','pipe','pipe']`,UI Terminal 只有 SSE 读取,无 stdin/resize/signal/PTY/reconnect control。关闭条件:独立 PtySession/Events、Local/Remote PTY adapter、WebSocket 或等价双向协议、AuthZ/generation/client_seq/TTL/gap、真实 TUI 浏览器验收;证明不能产 Evidence。**深 Interface/Schema/migrations 已完成(commit aeb71c9)**:research-schemas `pty.ts`(PtySession/PtyControlFrame client_seq 幂等/PtyOutputFrame server_seq+gap+retention/PtyOpenRequest preset+relative cwd);kernel `pty-session.ts` 状态机 open→attached→detached→closed(attach/detach generation 递增、权限撤销→detach、idle TTL/lease/close→closed)+ PtyAdapter 接口/NullPtyAdapter 挂载点 + client_seq 幂等(重复回放、乱序/跳号 409)+ 输出 server_seq 单调 + retention_bytes 有界淘汰先发 gap;migration 0011(pty_sessions/pty_frames,SCHEMA_VERSION 10,幂等);HTTP /v1/pty/*(POST sessions 校验后 adapter 未注册 501 pty_adapter_not_implemented 不创建惰性会话;control/frames 在 kernel-created 会话上完整可用,delivered=false 如实标注);PTY 输出永不进入 Metrics/Manifest/Evidence/Gate(注释 + pty-not-evidence 断言)。证据:tests/unit/pty-session.test.ts 13/13(状态机/TTL/撤销/幂等/seq/gap/HTTP/not-evidence)、migrations.test.ts 8/8、pnpm test 全绿、research-schemas/research-kernel build 全绿。**LocalPtyAdapter 已实现(commit f54bfe3)**:`pty-local.ts` 真实 pseudo-terminal——Node 无内置 PTY,spawn `python3` 桥(嵌入脚本落 runtime dir),桥内 `pty.fork()` + `os.execvpe(preset shell)` 分配真实 tty;preset→argv 白名单(sh/bash/zsh/fish,宿主缺 shell→spawn 失败)、cwd 相对 workspace 根且 adapter 层防御性重校验(`..`/绝对路径拒绝)、env 缩减为白名单(PATH/TERM/LANG…,`$HOME` 重定向进 `/pty-workspaces/` sandbox,host `$HOME` 不可达;桥再按 `DSH_*`/token/secret/credential 名称过滤);信号按 pty 前台进程组投递(INT/TERM 中断/终止前台作业而交互式 shell 存活——真实终端语义;KILL 终止 shell 并产生 signal=SIGKILL 的 exit frame);**断开不杀进程**(桥归 kernel adapter 所有,detach 后输出继续流入 store,reconnect 按 generation+after_seq 重放);显式 close/idle TTL(kernel 持有 30s sweep 定时器)经 adapter.kill 拆除真实 tty,无孤儿进程组;输出经 server seq 帧化进 pty_frames(复用接口层 seq/gap/retention),exit frame 严格晚于最终输出;HTTP open 路由替换 501——注册真实 adapter 后要求 `x-principal-id`(BFF 注入)+ 项目 membership(422 principal_required / 404 project_not_found / 201 真实会话),control 携带他人 principal→403 pty_principal_mismatch;无 adapter 时保持 501 不建惰性会话;kernel bin 默认注册 LocalPtyAdapter(workspaceRoot=数据目录下 pty-workspaces),standalone/plugin sidecar 经同一 bin 获得真实 PTY。证据:tests/unit/pty-local.test.ts 11/11(真实 tty 回显/写回、resize、INT/TERM/KILL 前台进程组语义、detach 存活+reconnect 无重复、显式 close 拆 tty、idle TTL 拆 tty、env 白名单含 DSH token/host HOME 负向、cwd/preset 边界、HTTP open principal/membership、not-evidence)、pty-session.test.ts 13/13 不破坏、research-kernel build 全绿、node scripts/verify-docs.mjs 18/18。**剩余(如实记录)**:Remote 传输与浏览器 TUI(LocalDockerPty/RemoteRunnerPty 共享同一 wire、WebSocket 双向 attach、真实终端渲染浏览器验收);idle TTL/retention 的 Config Schema registry 键。**SSE frames 实时流已实现(commit d01d415,api-contracts.md §22,acceptance-tests.md §21)**:kernel `GET /v1/pty/sessions/{id}/frames/stream?after_seq=`(text/event-stream、frame/gap/exit/心跳事件、owner+lease 校验与轮询 frames 一致 422/403/404、exit 结束连接可重放)+ BFF 透传(bearer 401、非成员首字节前 404、x-principal-id 注入);证据:tests/unit/sse-streams.test.ts 7/7 + tests/security/run-sse-tests.sh 67/67(真实 tty 回显 live 帧/续传无重复/gap/exit/鉴权矩阵/BFF 透传);浏览器事件源观感 NOT_RUN_MANUAL_PENDING。 | | WORK-01 | VS Code 式通用 Workspace | 部分 | 当前只有 TeX text workspace 与有限 manuscript textarea;无通用 code/scratch tree、binary CAS、tabs/search/watch/upload、move/history UI、Problems 和集成 PTY。关闭条件:统一 Workspace Interface/DB/CAS/Revision/ETag,TeX 作为 facade,桌面/窄屏与冲突/路径/二进制验收。**深 Interface/Schema/migrations 已完成(commit aeb71c9)**:research-schemas `workspace.ts`(WorkspaceNode path/kind/media/size/revision/etag/hash、WorkspaceRevision、WorkspaceOp create/write/delete/move target version CAS、write/move/delete 请求 schema、workspaceEtag);kernel `workspace-store.ts` 统一 code/scratch/manuscript 树(list/read/write/delete/move + workspace revision/每路径 version/strong etag、预期 version/etag 冲突 409、create-if-absent、二进制走 artifact CAS blob_sha256 服务端 sha256、文本写二进制 422 read-only、路径安全复用 snapshot-walk 契约、move 目标冲突 409、op ledger history、dir 前缀投影);`tex-facade.ts` TexWorkspaceFacade 把 TeX store 映射到同一 WorkspaceStoreLike 契约(TeX 作为 facade,无第二套 bytes/revision 权威,顺带修复 tex history 死代码对不存在 revision 列的查询);migration 0011(workspaces/workspace_nodes/workspace_ops,SCHEMA_VERSION 10,幂等)。证据:tests/unit/workspace-store.test.ts 8/8(revision/etag/409/二进制 CAS/路径安全/facade)、migrations.test.ts 8/8、pnpm test 全绿、research-schemas/research-kernel build 全绿。**磁盘 adapter 已实现(commit e298cee)**:`workspace-store.ts` 真实磁盘存储——每项目树根 `dataDir/workspaces/{project_id}/{workspace_id}/`(0750 链/0640 文件,ensure 即建根),节点字节以规范化路径落盘、`workspace_nodes` 只存元数据(磁盘 adapter 不写 content 列);写=目标目录临时文件+原子 rename(无半写/无 tmp 残留);revision 单调、etag=version+sha256[0..12] 绑定;任意字节二进制节点(multipart assets ≤32 MiB 复用 UPLOAD-01 上限,服务端 sha256,blob_sha256 同时注册 artifact CAS 幂等引用、工作字节以树文件为准);大小上限 WORKSPACE_MAX_FILE_BYTES=32 MiB → 413 workspace_file_too_large;move/delete 带 target-version CAS(409)、move 原子 rename 磁盘文件;路径安全:规范化负向 + 磁盘层任意 symlink 拒绝(422 workspace_symlink,读/写/删/移动前 lstat,snapshot-walk 严格超集);history:每路径保留最近 8 个版本字节于树外 `.ws-meta/{wsid}/history/{path}@{version}`,`readVersion(path,N)` 回退读(删除后仍可读,超窗 404);watch/search:`listSince(revision)` 变更节点+deleted tombstone、`search` 路径前缀/glob(`*` 不跨 `/`);**内容搜索已实现(commit 98243ff)**——`searchContent({q, case_sensitive?})` 线性 UTF-8 行扫描(文本节点 binary=0+media 文本类+NUL magic 三重过滤、>512 KiB 整文件跳过、每文件 20 匹配上限且 match_count 为真实总数、单次 50 命中文件上限+truncated、空/纯空白 q 422 invalid_query、并发槽位 2 search_busy 429、非法 UTF-8 容错),**无全文索引**(线性扫描,大数据集性能受限,索引属后续增强);server `/v1/projects/{id}/workspaces*` 全路由(create/list/tree/nodes 读读写删+watch+rollback/moves/search/assets multipart/blobs 原始字节),跨项目 404、BFF multipart 原字节透传 + membership/role 保持;TeX facade 对齐新契约(listSince 保守整树、readVersion 仅当前版本——tex store 无 per-op ledger/per-file 历史,取舍记录于 execution-runtime.md §12.2)。证据:tests/unit/workspace-store.test.ts 15/15(原子写/0750 根/无 tmp、revision-etag、409、move/delete CAS、二进制 round-trip、路径负向+symlink、历史回退+保留窗口、listSince/search、大小上限、per-project 根、facade)、tests/security/run-workspace-tests.sh 38/38(真实 curl 创建/写/读/移动/冲突/上传/下载/watch/search/history/跨项目 + BFF 透传与 401/403/404 负向,已接入 run-all-v2-blocking-tests.sh)、pnpm vitest 全绿、research-schemas/research-kernel build 全绿、node scripts/verify-docs.mjs 18/18。**剩余(UI 轮,如实记录)**:浏览器编辑器 UI(tabs/search/watch/upload、move/history 面板、Problems、集成 PTY)与桌面/窄屏/冲突/路径/二进制浏览器验收(Playwright 类环境不可用);远程文件系统 adapter 未实现。**SSE watch 实时流已实现(commit d01d415,api-contracts.md §22,acceptance-tests.md §21)**:kernel `GET /v1/projects/{id}/workspaces/{wid}/watch/stream?after_revision=`(change/delete 事件 + revision 前进、命名心跳、principal+membership fail-closed 422/404、跨项目 404)+ BFF 透传(bearer 401、非成员首字节前 404、x-principal-id 注入);证据:tests/unit/sse-streams.test.ts 7/7 + tests/security/run-sse-tests.sh 67/67;浏览器事件源观感 NOT_RUN_MANUAL_PENDING。 | | TEX-03 | 保存后实时 LaTeX Preview | 部分 | 当前 save/build 分离且 2s 轮询,无 debounce/supersede preview、live build stream、freshness;保存冲突后仍可能继续 compile。关闭条件:save-success event→preview、旧 PDF stale、live log/diagnostics/PDF、显式 Compile 固定 manifest 且与 preview 权威分离。**kernel/逻辑层已闭环(commit 1907897)**:POST /v1/documents/{id}/preview-builds(server 端 debounce 默认 800ms 可配置、持久化 tex_preview_pending、Kernel 持有定时器,重启自动重挂)+ preview build 状态机(queued→running→succeeded/failed;queued→cancelled、running→superseded,superseded_by/at,job 尽力取消)+ 同一固定 texlive image/禁网/no-shell-escape 复用 latex-compile runner(payload.preview=true,不产 Evidence、不冻结权威 manifest)+ stale 判定(build.revision、首写 version=1、冲突 gap tex_path_conflict 不静默覆盖);代码文件/展开条目→项目 code workspace(workspace-store write expected version 0 create-if-absent,冲突 gap),代码物化后经 snapshotCodeArchive workspace 语义生成可选 CodeSnapshot(receipt.code_snapshot_refs);物化结果写入 AdoptionReceipt.import_mappings(source→目标 workspace path/document_id + status materialized|gap + reason;非 TeX/code 条目 gap entry_type_not_materialized);物化失败(含超上限条目)adopt 保持成功;证据 tests/unit/intake-materialize.test.ts 15/15(zip/tar.gz 解包视图、路径逃逸/重复/大小写/特殊条目/zip bomb(比率/条目/总量/单文件)拒绝、单文件 gzip unsupported、TeX 物化 version=1+document_id 规则+映射、代码物化+CodeSnapshot、直接文件物化、超限物化 gap+adopt 成功、跨归档路径冲突 gap、幂等重放含 mappings、零权威写保持)、pnpm test 1026/1026、research-kernel build 全绿。**剩余(如实记录,属浏览器/后续轮次)**:拖拽/向导 UI 浏览器视觉验收、quarantine/scan 进度展示(**批量分块队列已由 CHUNK-01 行承接(2026-08-12)**:服务端 upload-sessions 分块协议 + client 队列状态机已实现,浏览器视觉验收仍 NOT_RUN_MANUAL_PENDING)、merge 冲突 keep/current/import/rename 交互、v2/BFF accept 面(**Agent tool 面已实现,2026-08-11,commit 98243ff**:`research_intake_begin`/`research_intake_stage`/`research_intake_scan`/`research_intake_answers`/`research_intake_propose` 五个 prepare 工具注册于 src/plugin/tools.ts——ACL scholar(researcher)允许;当时的 unknown-role 全拒绝策略现已废止,当前 root/unknown 只允许 `dsh_scholar` 与五个 exact-session methodology tools,仍不允许 Intake prepare surface;**无 adopt 工具**(research-onboarding.md §2.1 Agent 无 accept,adopt 仅 Human PI/BFF 面);错误码→稳定文案 INTAKE_ERROR_COPY(覆盖 INTAKE_ERROR_CODES 全 13 码);stage base64 ≤32 MiB;证据 tests/unit/intake-tools.test.ts 9/9、run-dsh-plugin-tests.sh 55/55)、浏览器验收(Playwright 类环境不可用)。**§5 P1(2026-08-11)已闭环**:intake ADOPT 与 project archive/unarchive 加入 PI-only capability route table(BFF/Kernel 双层校验,researcher/viewer/auditor 403),详见 §5 表 GOV-01/ONBOARD-01 行。 | | UPLOAD-01 | 用户文件与研究包上传 | 部分(服务端/BFF 层已闭环,浏览器层剩余) | 现有 v1 JSON/base64 Artifact 和 text-only TeX;BFF 强制 JSON,无 multipart/staged browser intake、binary Workspace asset 或 resume/preflight/quarantine。关闭条件:<=32MiB multipart + intake staged upload、hash/scan/path/archive/security/rollback/recovery UI 验收。**服务端/BFF 层已闭环(commit 1907897)**:kernel 原生 `POST /v1/projects/{id}/uploads` multipart 端点(uploads.ts 无依赖 multipart parser + staged→finalize)——≤32 MiB 单文件强制(`ResearchKernel.UPLOAD_MAX_FILE_BYTES` 可覆写,请求体 32 MiB+1 MiB envelope 上限,流式中途 413 `payload_too_large` 不完整缓冲);服务端计算 sha256(stage 计算 + finalize 复算核对,客户端不可声明 hash);路径安全(绝对路径/`..`/NUL/Windows 盘符/分隔符 → 422 `invalid_file_name`);staged 上传(会话 id 命名的 `stage_.part/.json` 于 CAS root 下 staged-uploads/,finalize 原子 rename 进 CAS blob 槽 + artifact 行,失败回滚零残留,缺 stage → 409 `artifact_stage_expired`);幂等(同 project+sha256+file_name 重传 → 200 `reused:true` 原 artifact 不重复写);GC/恢复(`cleanupStagedUploads(maxAgeMs)`,默认 TTL 24h,grace-period 同 CAS 孤儿 GC,finalize 后 blob 不受 GC 触碰);BFF 透传(standalone 对 multipart 以原始字节 + 原 boundary Content-Type 转发,bearer/Origin/CSRF/membership/role 检查与其它 /v1 写一致,33 MiB 在 BFF 层即 413);协议负向(415 unsupported_media_type、400 invalid_multipart、422 missing_file/multiple_files/invalid_kind、404 project_not_found)。证据:tests/unit/upload.test.ts 20/20(≤32MiB 成功含恰好 32 MiB、>32MiB 413 流式与静态上限双路径、路径穿越、hash 绑定、staged→finalize 原子与篡改回滚、幂等重传、GC、parser 单元)、tests/security/run-upload-tests.sh 18/18(真实 curl -F 上传/回读、33 MiB 413、路径穿越、BFF 透传+幂等+401/403/404 负向,已接入聚合器 run-all-v2-blocking-tests.sh)、pnpm test 437/437、research-kernel/research-ui build 全绿。**剩余(浏览器层,Playwright 类环境不可用,如实保留)**:拖拽上传 UI、intake quarantine/scan 展示、上传进度/恢复/冲突 UI 验收;研究包 archive 的 scan/quarantine 属 ONBOARD-01 intake(archive 路径/symlink/重复规范化路径由既有 code-snapshot walk 强制,本端点只登记原字节不拆包)。 | | INIT-GRILL-02 | Name-only Init + Chat Grill Me(init-grill-upload-models.md §1/§2) | 已实现未验收(服务端+client 逻辑层 2026-08-12;浏览器视觉验收剩余) | 契约:POST /v2/projects 最小默认请求只有 {name};name 去空白 1–120;Idempotency-Key + Human Principal 必填;单事务 DRAFT+collecting+creator PI+默认 Budget+active Init Intake、零 Scope Gate;同 key 同 hash 幂等、异 hash 409;collecting NextAction 只能指向 intake_answer/intake_resume;Orchestrator 不自动补 Gate;Grill 确定性状态机(固定 7 题顺序 + question_revision + required);`/new`、`/confirm-brief` 一级 slash command;消息只保存 attachment/stage ref。**代码侧已闭环(2026-08-12)**:kernel `createProjectForGrill`(brief 占位 `[collecting]` 标记、不进 Gate/Run/导出)+ v2 路由(Idempotency-Key/Principal 422 fail-closed、幂等重放/409、ZodError→422 validation_error);`projectGrillProjection`/`answerProjectGrill`/`confirmProjectGrill`(PI 显式确认事务:revision 校验→canonical Brief→唯一 pending Scope Gate→outbox);next-action `brief_status='collecting'` 只出 intake 覆盖动作;orchestrator engine `decideActions(DRAFT, …,'collecting')=[]` + engine 级 pollOnce 零 Gate 写;`/grill/confirm` 加入 BFF/Kernel 双侧 PI-only 能力表(researcher/viewer/auditor 403);v2 create 弹窗/chat `/new` 均 name-only(无 endpoint/credential/host path 字段);chat composer 附件按钮/拖拽/粘贴接线 + `ChatMessage.attachment` ref(浏览器视觉 NOT_RUN_MANUAL_PENDING);**chat 引导卡已实现(2026-08-12,commit e2590cb)**——创建项目成功后已跳转 Chat(project.ts `activeTab='chat'`),输入框上方渲染引导卡(grill-guide-model.ts PURE 模型 + chat.ts 接线:GET `/v2/projects/{id}` + `/v2/projects/{id}/grill` 投影——grill 路由只在 kernel v2 前缀下提供,与 executeChatInput 一致;按项目 id 缓存、answers/confirm 写后原位刷新;7 题逐题 prompt+提交/跳过/标记未知、错误码稳定文案、答完显示 Brief 预览+「确认 Brief」(Idempotency-Key+expected revisions)、已答列表可折叠、confirmed 项目隐藏并一次性提示「项目已就绪」;i18n `grill-guide` 命名空间 zh/en 新增)。证据:tests/unit/grill-guide-model.test.ts 23/23(模型状态机/载荷三态/错误码映射/可注入 fetcher/双 locale 零缺 key)、i18n-chrome 扫描绿、research-ui typecheck+build 绿。浏览器视觉验收(引导卡观感、逐题交互)NOT_RUN_MANUAL_PENDING。证据:tests/unit/kernel.test.ts INIT-GRILL-02 组(v2 HTTP 全链:创建/必填 422/幂等/NextAction/Grill 顺序/confirm 唯一 Gate/非 PI 403)、orchestrator.test.ts 43/43(engine 级 collecting 零 Gate)、chat-command.test.ts、i18n-chrome 扫描绿。剩余:真实浏览器 Grill 逐题交互/编辑历史/skip/unknown、刷新恢复观感、确认前刷新不依赖 localStorage(服务端投影续接已实现)——全部 NOT_RUN_MANUAL_PENDING(manual-acceptance.md §6 MANUAL-INIT-GRILL-I18N)。 | | CHUNK-01 | 批量分块上传(init-grill-upload-models.md §3) | 已实现未验收(服务端+client 逻辑层 2026-08-12;浏览器/大文件验收剩余) | 契约:服务端整文件 multipart ≤32MiB 之外的分块会话——stage 绑定 intake/project/Principal/文件名/media type/expected size/hash/expiry/committed offset;chunk 默认 8 MiB、实例可收紧、最大 32 MiB;单 Intake 预留总量默认 2 GiB、硬上限 10 GiB;Content-Range + SHA-256;`start==committed_offset` 才追加、旧范围同字节/hash 重放 replayed=true、gap/overlap 不同内容/total 不同 409;finalize 只在 offset==expected size 时进行、服务端流式重算 size/SHA-256、不一致 422 且不产生 IntakeArtifact;abort 幂等;开放 stage ≥24h 可查询 offset;扫描前字节只在隔离 intake staging。**代码侧已闭环(2026-08-12)**:migration 0021(upload_sessions/upload_chunks,SCHEMA_VERSION 19);kernel beginUploadSession(配额事务性预留 413 upload_quota_exceeded)/appendUploadChunk(协议全负向)/finalizeUploadSession(流式重算、重复 finalize 幂等、注册 sha256 命名 staged artifact)/abortUploadSession(幂等)/listUploadSessions/cleanupUploadSessions(24h GC,挂常驻 sweep);scanIntake 大文件适配(>32MiB 流式 hash + 有界 head 静态扫描 + 深 archive 扫描 >256MiB 记录 too_large 如实标注);server `/v1/projects/{id}/intake/{iid}/upload-sessions*`(begin/list/finalize/abort JSON + chunk PUT 原始字节,Content-Range/X-Chunk-SHA256 头,跨项目 404);client `chunked-upload.ts` 队列状态机(hashing/queued/uploading/paused/finalizing/scanning/needs_input/ready/quarantined/failed + offset/hash/retry/pause/resume/shouldContinue + queueSummary + chatAttachmentRef)+ driveUpload 注入式传输 + browserTransport;composer 附件按钮/拖拽/粘贴接线(消息只存 attachment/stage ref)。协议实现选择(2026-08-12):端点挂 v1 项目域(BFF 全量透传),api-contracts.md §16 的 /v2/intakes artifact-stages 面为同一协议目标形状;chunk 上限 = min(请求, 实例配置 ≤32MiB)。证据:tests/unit/chunked-upload.test.ts 31/31(begin/append 顺序/乱序 gap 409/offset 冲突 409/hash 不匹配 422/finalize 拼接 sha256 一致/重复 finalize 幂等/abort 幂等/GC/配额 413/>32MiB scan/HTTP 全路由)、intake.test.ts 32/32 不破坏。剩余:真实浏览器拖拽/粘贴观感、断网重连、2–10 GiB 文件与配额边界——NOT_RUN_MANUAL_PENDING(manual-acceptance.md §6 MANUAL-UPLOAD-2G、§7 MANUAL-CHAT-ATTACH-SLASH)。 | | MODEL-01 | Model Provider 注册表、SecretRef 与项目绑定(init-grill-upload-models.md §4/§5) | 已实现未验收(服务端与 MinerU 配置面 2026-08-14;真实 Provider/OCR 服务验收剩余) | 契约:Provider 是 instance/global 资源;项目/Intake 只能引用 opaque provider_id/model_id;SecretRef 严格 schema(value/token/password 拒绝);base URL 服务端 scheme/host/redirect/DNS/代理 allowlist 与 SSRF 校验;浏览器响应只显示 SecretRef metadata + available 布尔;Provider 修改 revision CAS;项目 binding 同时钉 binding 与 provider revision。**代码侧已闭环**:research-schemas `provider.ts`;migration 0021;Kernel Provider CRUD、redaction、SSRF 与项目 binding;BFF/Kernel 双层 PI/Operator 权限;损坏 credential metadata fail closed;连接期 redirect/DNS-rebinding 复检仍由未来模型客户端承担。证据:tests/unit/provider-registry.test.ts 16/16。剩余:真实私有 Provider 调用与浏览器视觉验收为 `NOT_RUN_MANUAL_PENDING`;OCR 异步请求/worker/provenance 仍属 OCR-01 未实现,不能由本行升级。 | | OCR-CONFIG-01 | Settings 中配置 MinerU OCR Provider 与当前项目模型绑定 | 已实现未验收(2026-08-17 UI 修复轮) | 首期只支持 MinerU:Kernel 固定 provider/kind、官方 `https://mineru.net/api/v4` 与 `flash/pipeline/vlm` 目录,拒绝其他 path/port/query/fragment;Flash 可无 credential,Pipeline/VLM 强制严格 SecretRef;binding purpose 由所选 model capability 判断;Provider 编辑 revision CAS,当前项目 binding 携带 binding/provider 双 revision且只提交 opaque IDs;BFF/Kernel 双层 PI/Operator;读取失败 fail closed;两次写部分成功有明确 zh/en 提示;JSON/multipart 非幂等写不自动重试;安全错误用 `role=alert`/`aria-live`。**OCR-UI-01 已闭环**:根因是多字段 OCR 表单误用横向 `.settings-row`(604px 容器内 4 项越界、2 项宽度塌缩为 0);现改为独立纵向容器,按服务商/项目模型/访问凭据分组,桌面双列、≤720px 单列,SecretRef 折叠和保存语义不变;真实 Chrome 回归 `pnpm test:ui:ocr` 检查横向打包、塌缩与越界。真实 Provider/OCR 执行仍为 `NOT_RUN_MANUAL_PENDING`;明确不包含 OCR request/worker/provenance,OCR-01 继续保持未实现。 | OCR-CONFIG-01 审阅关闭约束(2026-08-14):内置 MinerU 的固定 id/kind/官方 origin/model catalog 与 Pipeline/VLM credential 要求必须由 Kernel 强制,不能只依赖浏览器;Provider global 写和项目 binding 写都必须在 BFF 与 Kernel 两层从 durable membership 解析 PI/Operator,客户端 role 无效。binding GET、项目 GET 或 Provider GET 失败不得折叠成“未配置”并省略 CAS;binding 必须同时携带 binding revision 与本次 Provider 写响应的 provider revision。Provider 与 binding 当前是两个持久化写,不能宣称原子:第二步失败时 UI 必须明确“Provider 已保存、项目绑定失败”,保留可重试状态。非幂等 POST/PATCH/PUT 不得在 transport error 后自动重放;稳定错误只显示 zh/en 安全文案,不直接回显 Kernel message;错误节点使用可访问性通知。 OCR-CONFIG-01 最终安全审阅增量(2026-08-14):MinerU base URL 必须由 Kernel 固定为官方 `https://mineru.net/api/v4`(允许规范化末尾 `/`),拒绝 userinfo、非 443 端口、其他 path、query 与 fragment,避免把 Token 等秘密塞入会回显的 URL。项目 binding 必须以所选 model 自身的 capability 判断 purpose,Provider 的聚合 capability 不能替代 model capability;因此 Flash/Pipeline 只能绑定 OCR,VLM 才能绑定 OCR/vision。HTTP SecretRef 含明文字段时必须返回稳定 `secret_value_forbidden`;所有共享请求 helper(含 multipart POST)都不得自动重放非幂等写。 | GUIDE-01 | 全程结构化下一步引导 | 部分 | **Kernel 层已闭环(commit f64690b)**:NextAction schema(code/label/reason/required/route/capability/revision/state + blocking/refs/required_by,research-schemas `NextAction`);`nextActionProjection` 纯函数按状态机每阶段投影结构化动作(17 个 status 每个 ≥1 动作:scope_gate_submit/survey_run/idea_generate/idea_gate_approve/contract_register/baseline_reproduce/pilot_formal_submit/evidence_verify/manuscript_write/reviewer_run/release_bundle/release_gate/gate_resolve/budget_resolve/job_retry/project_stop/终态 done 等),含 BLOCKED_GATE+budget 超限→`budget_resolve` blocked、pending gate→`gate_decide`(base 已引用不重复)、失败作业→`job_retry`(attempts 耗尽→blocked+`repair_decision`)、required 缺口(`approved_contract`/`succeeded_runs`/`proposed_idea`);`projectProjection` 返回权威 `next_actions_v2` 且 legacy `next_actions: string[]` 由非 done 动作 label 稳定派生;未知/未来状态退化 `code='unknown'` 只读动作不抛错。Intake/Grill 覆盖动作已落地(2026-08-11):`intake_resume`/`intake_scan`/`intake_answer`/`intake_propose`/`intake_adopt`(capability=pi,`NextActionContext.intakes` 可选输入、projectProjection 从 listIntakes 投影,终态零动作,详见 §5 P1 行)。证据:tests/unit/next-action.test.ts 16/16、pnpm test(排除并行子代理 in-flight 文件后 355/355)、run-gate-tests.sh 15/15、verify-docs 18/18。关闭条件剩余:每阶段/Intake/失败/Gate 的浏览器验收(Playwright 类环境不可用,如实保留)。 | | GUIDE-CORPUS-READINESS | Idea 动作必须绑定有效语料 | 自动实现 / 浏览器待验收 | `SURVEYING` 不再被当成语料就绪事实。无 complete+frozen+non-empty Corpus 时 `idea_generate` 为 blocked (`frozen_nonempty_corpus_snapshot`) 并同时提供 ready `survey_run` 修复动作;满足条件后动作固定 snapshot ref 才 ready。`next-action.test.ts` 覆盖无/空/pending/valid snapshot 与 Kernel 空语料投影;真实浏览器文案/CTA 仍 `NOT_RUN_MANUAL_PENDING`。 | | TRAJ-01 | 移植 DSH Web Trajectory | 部分(standalone 投影与拓扑 API 层已实现,commit e298cee;浏览器拓扑渲染/进入 child 与 10k node 浏览器验收剩余) | Scholar UI 无 trajectory tab/projection/history/timeline;DSH 组件依赖 slot/SessionHistoryFace,不能直接复用。关闭条件:standalone safe projection、Research vs Session 泳道、分页/SSE/gap/redaction/virtualization/inspect 与 10k node 验收。**standalone 投影与拓扑 API 层已实现**:research-schemas `trajectory.ts`(TrajectoryEntry/Page/Lanes、TopologyNode/Children、ChildDetail(breadcrumb)、ChildHistory、FollowupReceipt、ChildLinkInput——对齐 trajectory-subagents.md §2/§3/§4 契约,token 四桶/cost/permissions/retention 字段标注"服务端已覆盖(投影基础)/DSH session 集成与 UI 后续");research-kernel `trajectory.ts`(TrajectoryStore:只读 outbox 投影 `projectTrajectory`(`(event_seq,event_id)` keyset 分页、单页上限 500、total/has_more、`lane` 过滤)、`projectTrajectoryLanes`(research/session 双泳道各自游标)、redaction(白名单 summary、token/secret/绝对路径 scrub、240 字符截断,写入+读取双次脱敏)、child_links/child_history/child_followups 存储、exact-parent+breadcrumb(cycle-safe/orphan fail-soft/深度 32)、只读 history、one-shot 只读 followup(记录 message 返回 message_id,state_unchanged 断言,不冒充已执行);KernelEventKind 新增 `trajectory.child.started/updated/followup`(session 泳道);migration 0013(child_links/child_history/child_followups + `idx_events_project_seq`,SCHEMA_VERSION 12);server.ts `/v1/projects/{id}/trajectory|trajectory-lanes|topology(+/children)` 与 `/v1/topology/{child_id}(*|history|state|followup)`——全部 principal+membership fail-closed(缺 x-principal-id 422 principal_required、非成员/未知 child 404);standalone BFF child 路由 project 解析(childProjectId 镜像 jobProjectId)+ x-principal-id 注入;research-client 方法(projectTrajectory/projectTrajectoryLanes/projectTopology/childDetail/childHistory/childFollowup/registerChildLink/updateChildState)。证据:tests/unit/trajectory.test.ts 12/12(分页跨 bucket 平局续传、脱敏断言、10k 事件 21 页不丢不重、拓扑 tree/breadcrumb/exact-parent/orphan/cycle、history/followup 只读、HTTP 权限矩阵)、migrations.test.ts 8/8、pnpm test 555/555、research-schemas/research-kernel/research-client build 全绿、research-ui typecheck+build 全绿、verify-docs 18/18。**client SSE 消费已实现(2026-08-11 修复轮,commit d01d415)**:Trajectory 面板经 `TrajectoryStreamClient`(client/sse-client.ts——fetch ReadableStream + SSE 帧解析(event/data/id/retry/多行 data)+ 指数退避重连从最后 seq 续传 + 心跳超时断开 + AbortController 取消)消费 `GET /v1/projects/{id}/trajectory/stream?after_seq=&lane=research|session` 增量条目(lane 过滤、entry_id 去重;流重连失败回退 keyset 分页);离开 Trajectory tab 关闭两 lane 流(`stopTrajectoryStream`,同 stopWorkspaceWatch 机制)。**剩余(如实记录)**:浏览器拓扑渲染/进入 child/breadcrumb 导航、SSE 增量流浏览器事件源观感(client 消费已实现,观感仍 NOT_RUN_MANUAL_PENDING)。**服务端 SSE 实时流已实现(commit d01d415,api-contracts.md §22)**:kernel `GET /v1/projects/{id}/trajectory/stream?after_seq=&lane=research|session`(keyset (after_seq, after_event_id) 续传、双 lane 过滤、redaction 由投影保证、命名心跳、principal+membership fail-closed 422/404)+ BFF 透传(bearer 401、非成员首字节前 404、x-principal-id 注入);证据:tests/unit/sse-streams.test.ts 7/7 + tests/security/run-sse-tests.sh 67/67(三流 kernel/BFF 真 HTTP 断言)、10k node 浏览器 DOM 虚拟化与键盘/ARIA/zh-en 验收(Playwright 类环境不可用)、research_panel 插件侧 registerChildLink/updateChildState 接线(插件代码本轮未动,kernel/服务端已就绪)。 | | SUBAGENT-01 | 可见拓扑并进入 child | 部分(standalone exact-parent/breadcrumb/history/followup API 层已实现,commit e298cee;插件接线与浏览器拓扑渲染/进入 child 剩余) | `research_panel` 能启动独立 child 并返回 summary/child_id,但 UI 无 direct-child tree、实时 activity、breadcrumb/enter/history/followup;无 standalone exact-parent API/redaction。关闭条件:trajectory-subagents.md list/history/stream/followup、one-shot 只读、history 不激活、权限/脱敏/a11y 验收。**standalone 拓扑 API 层已实现(见 TRAJ-01 行)**:child_links 拓扑存储(child_id/project_id/parent_id/label/summary/mode/role/state/ended_at,re-register 不复活终态、state 只经 PATCH 变更、ended_at 首次终态钉定)、direct-child tree(`GET /v1/projects/{id}/topology?parent_id=`,只返回 exact direct children + has_children/children_count/seq 游标)、exact-parent+breadcrumb(`GET /v1/topology/{child_id}`,cycle-safe/orphan fail-soft)、只读 history(`GET .../history`,started/registered/state/followup 追加账本,读取不激活、不改变 state——断言)、one-shot 只读 followup(`POST .../followup` 返回 message_id、read_only=true、state_unchanged=true、不冒充已执行)、权限(trajectory/topology 全部路由 principal+membership fail-closed,BFF 先解析 child→project 再查成员,kernel 侧 x-principal-id 422/非成员 404)、脱敏(child summary 写入+读取双次 redaction+240 截断)。证据:tests/unit/trajectory.test.ts 12/12(含拓扑 tree/breadcrumb/orphan/cycle/history/followup 只读/HTTP 权限矩阵)、pnpm test 555/555(详见 TRAJ-01 行)。**剩余(如实记录)**:research_panel 插件侧调用 registerChildLink/updateChildState(本轮未动 plugin 代码)、浏览器 direct-child tree/进入 child/breadcrumb/activity 渲染、real-time stream、exact live-parent + capability 校验(需 DSH host)、a11y/键盘/zh-en 浏览器验收(Playwright 类环境不可用)。 | | UI-SIMPLE-01 | 简洁页面与 Settings 渐进披露 | 已实现未验收(client 逻辑层 commit 1907897;Start 三入口显式选择 2026-08-11;浏览器层剩余) | **逻辑层闭环**:(1) Start 三卡——未选中项目即显示三张启动卡(新建研究/打开已有项目/上传·接入),定义于纯模型 nav.ts startActions()(code/route 稳定契约,label/desc 随 locale 求值),DOM 层按 route 接线:new-project→openNewProjectModal、open-project→openProjectSwitcherModal、import→**真实 intake 向导 openIntakeModal(2026-08-11,modals/intake.ts,不再占位 toast)**;Start 屏内嵌「打开已有项目」列表(filterProjects/pickProject 纯函数显式选择,`projects[0]` 自动回退已删除)。(2) 四 primary tabs + More——主导航收敛为四个 primary(总览 phase/运行 runs/证据 evidence/文稿 manuscript)+ More 下拉(对话 chat/Gate gates/产物 artifacts/预算 budget/终端 terminal + Settings modal),分组为纯函数 tabGroups()(nav.ts,全覆盖:ALL_TAB_KEYS 每键恰属一组);More 每项稳定深链 `#tab=`/`#settings`(parseDeepLink,query 路由不受影响;reload/back-forward 可达,hashchange 应用),Alt+1..9 沿 navOrder() 覆盖 primary→More→Settings;tab 恢复 TAB_IDS 对齐 ALL_TAB_KEYS(含 manuscript/terminal)。(3) Settings 渐进披露——内容分组为 Accordion(默认折叠、展开记忆可选,localStorage dsh-scholar-ui-settings-open),分组为纯数据 settingsSections()(settings-model.ts:连接/外观/偏好/runner/workspace/terminal/TeX/agent/config provenance 九组,每项带来源/生效状态 summary 行);config provenance 有 registry 数据(/v1/health config_pin)时显示 pin hash,否则占位并如实记录;runner/workspace/terminal/TeX/agent 为诚实占位(后续阶段生成 UI)。证据:tests/unit/ui-simple.test.ts 15/15(三卡、三入口显式选择、四+More 全覆盖、九组默认折叠、深链 id 稳定、zh/en 键存在+parity+零缺 key、locale 重求值)、i18n-chrome.test.ts 3/3(R2 硬编码扫描覆盖新 chrome)、i18n-runtime.test.ts 12/12、research-ui typecheck+build 全绿、根 pnpm test 全绿(详见 §4 行 98 与 §5 P1 行)。**剩余(浏览器层,如实记录)**:640/720/1024 视口、键盘导航/a11y、Start/More/Accordion/导入向导的 DOM 有界断言需 Playwright 类环境,未验收。 | | UI-BUDGET-OPT-IN | 运维 Budget 页面按需启用 | 已实现未人工验收(2026-08-17) | Budget 页面默认从 Operations 导航、Dock 选择器、快捷键顺序和深链隐藏;Settings → Preferences 提供浏览器本地显式开关并持久化单一 boolean,损坏/旧值 fail closed。关闭活动 Budget 时纯 reconciliation 使主区回 Overview、Budget Dock 关闭;Overview 预算摘要保持只读可见,Budget NextAction 在页面隐藏时转到 Approvals,因此 Kernel 预算记账、硬限制和 Budget Gate 治理始终有效。自动证据:`ui-simple.test.ts` 19/19(默认隐藏、显式全覆盖、nav/shortcut/deep-link、主区/Dock reconciliation、偏好 round-trip/损坏值)、i18n runtime/chrome、Dock/NextAction 定向共 78/78;整仓 96 files / 1406 tests、research-ui strict typecheck 与 build、docs 22/22 全绿。真实浏览器切换/焦点/窄屏按 manual-acceptance §9 `MANUAL-BUDGET-PAGE-OPT-IN` 保持 `NOT_RUN_MANUAL_PENDING`。 | | TEX-01 | TeX workspace/editor/version | 部分 | expected_version 语义修正:0=create-if-absent(UI 新建文件路径),HTTP schema 由 positive 改为 nonnegative;已存在+0→409 冲突;tree/GET 返回 path/kind/media/version(TexFileKind + fileMediaType 派生);保存 expected version→新 revision、并发 409、delete/move 版本校验;compile 冻结 manifest(既有)。证据:tests/unit/tex-workspace.test.ts + tex-build.test.ts 12/12、curl 集成(0→200、重复→409、tree 含字段);dirty 判断/窄屏布局属 UI 层待验收§4 审阅校准为较低状态:见第 4 节对应阻断项与强制关闭条件。**§4 行 95 kernel/工作区层闭环(commit 64a0649)**:snapshot 冻结可物化字节(tex_snapshot_files 表 + GET /v1/documents/{id}/snapshot-files?revision=&path=;tex-workspace.test.ts snapshot-frozen-bytes 用例、tex-build.test.ts HTTP 集成);dirty 基线修复(UI 用文件 GET/最近保存内容,不再查 tree——tree 无 content;清空非空文件('')dirty=true、revert 到已保存字节 dirty=false,manuscript-dirty.test.ts 4/4);clear/revert 与 revision CAS 覆盖(清空='' 是 CAS 可见变更、过期 expected_version 一律 409,tex-workspace.test.ts clear/revert 用例);保存冲突终止编译(见 TEX-02 行)。dirty 的浏览器展示(编辑即时 dirty 标识、窄屏布局)仍属 UI 浏览器层,Playwright 类环境不可用,未验收。 | | TEX-02 | latex-compile/诊断/PDF | 部分 | 锁内 texlive digest 强制(缺 digest 内核注入 texlive@sha256:8957c916…);compile 冻结 manifest;诊断含 file/line 定位(tex-diagnostics.ts);shell-escape/network 拒绝(docker flags);build history 可重放。证据:evals/latex-compile-e2e.sh 13/13(含 write18 inert)、tests/unit/tex-kernel.test.ts;实时 Build Terminal/freshness 展示属 UI 层§4 审阅校准为较低状态:见第 4 节对应阻断项与强制关闭条件。**§4 行 95 kernel/工作区层闭环(commit 64a0649)**:Runner 只物化冻结 revision 的可物化字节(getDocumentSnapshotFile→snapshot-files 接口,逐文件 hash 校验 manifest;不可读/hash 不匹配/路径逃逸一律硬失败,tex-build.test.ts 负向:revision 不可物化、字节篡改、traversal);compile 期间文件被修改,构建输入仍是冻结 revision 字节(tex-kernel.test.ts frozen-bytes 用例 + HTTP snapshot-files 集成);保存冲突终止编译:冻结与提交两处 document-revision CAS(texSnapshot expectedRevision + submitJob 重校验),carried manifest revision 与 tex_revision 不一致→409,409 后不创建 Job/build 行(tex-kernel.test.ts save-409 用例、tex-build.test.ts HTTP 集成);提交响应携带 build.job_id/build.revision/job 供 UI 接入 Terminal SSE 与 stale 判定(execution-runtime.md §12)。Manuscript 页内嵌 live Terminal DOM、PDF freshness 浏览器展示、防重复按钮浏览器验收仍属 UI 浏览器层,Playwright 类环境不可用,未验收。 | | UI-01 | standalone 单一业务实现 + DSH session workspace/配置卡 | 已实现未验收(2026-08-20 compact upgrade tolerance 修复) | 完整业务 UI/BFF 仍只有 standalone,DSH `conversation.view` 不再 iframe 或压缩完整工作台,而是通过 trusted-host `session-workspace/session-bind/session-create` 渲染当前会话的紧凑 Host 原生视图。未关联时可从同一稳定操作员有权项目中显式绑定或 name-only 创建,归档/跨 Principal/改绑/墓碑/悬空均拒绝;已关联时只显示项目、阶段、NextAction、Gate/Job 摘要。共享 runtime normalizer 由 Host producer 与浏览器 consumer 共用:session/project/revision/已知类型 fail closed,普通 additive 字段剥离;旧缺失/null Knowledge/Manuscript/Runs/Topology 使用 inactive/null/zero 默认,单个畸形块独立记录 unavailable 并显示 zh/en 文案,不拖垮时间线;token/Secret/payload/content 不进入 state。客户端保持 4 秒串行读取、session switch abort + busy reset;完整工作台仅通过按钮或 `Alt+Shift+S` 新页面打开。Kernel internal list/link 同时要求 bearer、service token 与 dsh-plugin token,same-pair 幂等且 exclusive link fail closed;standalone 默认 Principal 改为与 DSH sidecar 同一 token 派生身份,保证两处项目集合一致。配置卡的 URL/快捷键/Token 复制边界保持不变。自动证据:`dsh-native-scholar.test.ts`、`plugin-client-config.test.ts`、root/client typecheck;真实 DSH 跨版本双进程、窄容器、项目绑定视觉、Clipboard/a11y 按 manual-acceptance 保持 `NOT_RUN_MANUAL_PENDING`。 | | DSH-NATIVE-CHAT-01 | DSH 本体自然语言研究入口 + 同会话阶段可视化 | 已实现未验收(2026-08-15) | `dsh_scholar` 已支持未关联 session 从原生 Chat 直接 name-only 创建并绑定:只接受单一整句肯定指令与确定性语法解析出的完整同名,缺名自然语言追问;名称子串/模型补名/疑问/否定、无标点“不创建/not create/先别创建”、标点或“然后/并/and/then”连接的多子句均零写,同时“风险评估/方法学/类别识别/并行计算/What/Research and Development”等合法名称不误拒。internal route 同时要求 Kernel bearer、共享 service token、0600 非空 DSH-plugin 专用 token 与固定 principal;专用 token 配置/header 缺失、空或空白均 403。creator 仅由持久 DSH plugin credential 的固定 HMAC 域派生,同一 Kernel 的全部 session 共用稳定本机 Principal;专用 token 签出的 route/session/name HMAC、同事务 idempotency + raw link fence、exclusive insert 阻断 public-first/internal-first 双向 row 认领、活动/墓碑/悬空/并发改绑。fetch、响应头或成功响应体读取/解析失败、超时/abort 后仅以 replay-only 读取同 key 已提交回执,再做无 caller signal 的权威 link/projection 对账。显式跨 session project id、survey revision/session CAS、blocked/Human-only、projection allowlist/AbortSignal/i18n/a11y 等既有约束保持。自动证据:定向 `dsh-native-scholar.test.ts` 25 + `v2.test.ts` 17 + `sidecar.test.ts` 11 = 53/53;本轮全量 unit 94 files / 1359 tests、全包 build/typecheck、docs 22/22、standalone HTTP 268/268 与 DSH plugin 55/55 全绿;修复后独立 blocker 复核 PASS。当前 checkout 已重新安装到 `/home/dev/.dsh` web profile(local link)并重启 `dsh-web.service`,Web 3080 与 Kernel 7412 health 均 200,专用 token 为 0600 普通文件;运行态三凭据 create/link smoke `local_smoke_1786785439287065153` 创建 `rsp_v5a4yrogwgvj6nujhsroux5vay`(`DRAFT/collecting`),replay-only 与权威 session link 均返回同一 project。真实 Harness 模型是否稳定选择该 tool、空白 session 首条消息后的浏览器阶段条视觉/a11y/会话切换仍为 `NOT_RUN_MANUAL_PENDING`。 | | UI-CURSOR-01 | Slash 补全保持 composer caret 且首次显示候选 | 已实现未人工验收(2026-08-17) | 首个根因是页面级 `window.keydown` 只检查被 Shadow DOM 重定向成 Scholar host 的 `event.target`,导致 composer 内的 `/` 被误判成全局快捷键:重绘后的 textarea 值仍为 `/`,selection 却回到 0,下一字符得到 `n/`。修复后使用 `event.composedPath()` 识别内部 editor,真正的全局 `/` 则显式把 caret 放到末尾。后续回归发现补全又把合法 prefix 与旧 `completionOpen` 状态绑定,稳定页面首次 `/` 因“此前未打开”而显示 0 候选;现删除该循环门槛,用纯 `chatCompletionPrefix(draft)` 决定显示与筛选,`/` 首次即显示全部候选。回归证据:`ui-refresh-guidance` composed-path 与 `chat-command` slash prefix 单测均先红后绿;本地 standalone Chromium 已分别复现 caret 错位和稳定 composer 候选缺失。最终浏览器需断言 `/` selection=1/menu flex/rows>0,继续输入 `/n` selection=2;DSH Host 与真实 IME/repeat 人工观感仍按 `MANUAL-CHAT-SLASH-CARET` 保持 pending。 | | ART-UI-01 | Artifact 项目 scope、预览与下载语义 | 已实现未验收 | Artifact 行、右键、详情和批量下载统一经 `artifactContentPath(project_id, artifact_id)`;下载名优先安全 `Content-Disposition`/登记 `file_name` 并提供稳定扩展名 fallback。BFF 仅为 Artifact GET/HEAD 转发 Range/If-None-Match,并保持 206/416;206 透传 Content-Range/Accept-Ranges/Content-Disposition/ETag,416 无 body 且保留 Content-Range/Accept-Ranges/ETag;Kernel 严格拒绝反向/越界/零 suffix Range,主动 HTML/SVG/XML 强制 attachment,文件名拒绝控制字符/超长并以 RFC 5987 编码。预览关闭、切项目、重复打开与 unload 均统一 revoke Blob URL;SVG 不允许顶层新标签打开。自动证据:`artifact-transfer.test.ts` 4/4、`artifacts.test.ts` 4/4、`upload.test.ts` 21/21、`run-standalone-http-tests.sh` 268/268(含双项目共享 CAS、scope 200/无 scope 404、206/416 精确头/字节)。真实浏览器 PDF/image/text 下载与 Blob 计数仍按 manual-acceptance §9 为 `NOT_RUN_MANUAL_PENDING`。 | | UI-02 | 全页面 zh/en i18n | 已实现未验收 | localeParityReport/assertLocaleParity(zh/en key 精确一致,dev warning + build/CI 硬失败);i18n-static-chrome 静态扫描测试(tests/unit/i18n-chrome.test.ts 3/3:扫描 client 源码硬编码中文与 chrome 位置英文字面量,命中即 fail,已修真实硬编码;zh/en key 集合一致断言);全部命名空间双语;根 pnpm test 已覆盖。证据:pnpm test 316/316;浏览器级 a11y/键盘/响应式仍待 Playwright 类 UI 验收已绑定 ci-gate.sh 运行(commit 6e4d302)的类型检查/静态层面;浏览器级场景(键盘/a11y/响应式/DOM 有界)需 Playwright 类环境,待验收。**§4 行 99 逻辑层闭环(commit f64690b)**:locale 切换运行时重建——i18n adapter 新增缺 key 告警(t() 全字典缺失时返回 raw key,dev console.warn 一次/键+字典路径提示,setMissingKeyReporter 注入收集器可测)与 open-overlay registry(setLocale→listener+relocalizeOpenOverlays,已开 modal 重开);shell 静态 chrome(header/tabs/model/density/aria/document title)由纯 chrome 模型 i18n/chrome.ts 渲染时求值并随 locale 重绘(不再初始化快照);pipeline 步骤由模块级 PHASE_PIPELINE 快照改为 phasePipeline() 渲染时求值;Terminal 元数据/exit 硬编码英文改 terminal.meta/exitLine 键(zh/en 含 dropped/truncated/exit 片段);状态 pill/sidebar/search 状态文案改 status 命名空间 statusLabel()(en 保持 kernel enum 镜像、zh 翻译、unknown enum 原样显示)。证据:tests/unit/i18n-runtime.test.ts 12/12(切换重建 tab/pipeline/overlay registry/Terminal/状态 pill、缺 key 告警、zh/en 往返、parity 保持)+ i18n-chrome.test.ts 3/3、research-ui typecheck + build(tsdown+verify-research-ui-bundle)全绿、根 pnpm test 全绿;浏览器级(键盘/a11y/窄屏、一个 render tick 内 DOM 断言)需 Playwright 类环境,如实保留 | | UI-03 | standalone locale/theme adapter | 已实现未验收 | 解锁页(首屏+token gate)双语:BOOTSTRAP_HTML 内联 zh/en 字典 + data-i18n 键 + html lang 按 persisted dsh.locale→navigator.languages→zh;invalid-token 文案双语且键存在于 zh/en 字典(packaging.test 断言 data-i18n 键与字典一致性);locale/theme 持久化与 adapter 既有。证据:packaging.test.ts 新增解锁页双语用例(10/10)、首页 curl 含 data-i18n 键;首屏闪英文仍可能有残余,待 UI 验收已绑定 ci-gate.sh 运行(commit 6e4d302)的类型检查/静态层面;浏览器级场景(键盘/a11y/响应式/DOM 有界)需 Playwright 类环境,待验收。**§4 行 99 关联(commit f64690b)**:persisted dsh.locale→setLocale→全页重建的运行时闭环(i18n adapter overlay registry + chrome 模型重绘 + panels/Terminal/状态重渲染)已由 tests/unit/i18n-runtime.test.ts 逻辑层覆盖(见 UI-02 行);解锁页浏览器级切换仍待 Playwright 类环境 | | UI-04 | browser client strict typecheck/模块边界 | 已实现未验收 | client/index.ts 由 ~8400 行拆分为 1070 行装配入口 + 模块(api/state/ui/types/sidebar/chat/terminal + panels/(phase/gates/runs/artifacts/evidence/budget/manuscript) + modals/(commands/detail/project/search/settings)),模块边界按职责;根 package.json "test" 现在包含 pnpm --filter @dsh-scholar/research-ui typecheck(tsc --noEmit strict,不再只靠 tsdown 转译)。证据:research-ui typecheck/build 全绿、pnpm test 304/304、standalone 新 client.js 正常服务;尚未绑定 CI job 报告,待验收已绑定 ci-gate.sh 运行(commit 6e4d302)的类型检查/静态层面;浏览器级场景(键盘/a11y/响应式/DOM 有界)需 Playwright 类环境,待验收 | | ART-01 | binary/SSE 真流式 | 已验收 | binary round-trip(media type/ETag/bytes)已有;SSE 真流式验收:tests/security/run-sse-tests.sh 23/23——text/event-stream 真实 body、连接后 live tail、after_seq 续传无重复无缺失、跨项目 404(kernel 与 BFF 双面)、BFF 无 token/wrong token 401、非成员在首字节前 404;撤权(revoke-on-disconnect)与背压源码未实现,已注明未覆盖验收绑定:commit 6e4d302 + scripts/ci-gate.sh 全量运行(4/4 PASS,142s,零 SKIP,日志 /tmp/ci-gate-full.log)+ 对应 acceptance 场景(阻断脚本 CI=true 零 SKIP)。**§21 SSE 实时流扩展(commit d01d415,api-contracts.md §22)**:pty frames/stream、workspace watch/stream、trajectory/stream 三个增量流端点(重放/live/心跳/gap/exit、鉴权与轮询一致)+ BFF 透传;证据 tests/unit/sse-streams.test.ts 7/7 + run-sse-tests.sh 67/67(三流 kernel/BFF 真 HTTP:首字节 event、after_seq 续传无重复、live 追加、gap/exit、跨项目 404、无 token 401、非成员首字节前 404、BFF 透传;原 23 断言不破坏);浏览器事件源消费观感 NOT_RUN_MANUAL_PENDING。 | | ART-PREVIEW-01 | Artifact 多格式安全预览 | 已实现未验收(2026-08-14) | 已实现三档矩阵:PDF、PNG/JPEG/GIF/WebP/AVIF/BMP、allowlist audio/video 原生只读;Markdown/Rmd/Qmd、JSON/NDJSON/ipynb、CSV/TSV、text/code/log/TeX/Bib/YAML/TOML 有界结构化/文本预览;HTML/SVG/XML、Office/ODF、archive/model/scientific/unknown binary 只显示元数据并按需下载。分类使用 MIME essence + 安全扩展名/kind 辅助,通用文本 MIME 可安全细化,冲突向安全侧降级;active/unknown 打开弹窗零完整 body/`Blob.text()`/Blob URL,关闭会取消延迟下载;JSON 保留大整数、`-0` 与重复键字面量并限制深度/输出;Markdown/表格/列表/文本有界且只生成 text node;fetch/parse/native decode 失败 zh/en `role=alert`;PDF iframe 与完整 CSP 的 `object-src none`/`frame-src blob:`、媒体与 `media-src blob:` 一致,CSP 仅允许配置的精确 HTTPS 或 loopback HTTP `frame-ancestors` 并为内联 bootstrap 注入逐响应 nonce。切产物/项目/卸载会使 fetch/text-read 全阶段失效并 revoke URL,迟到回调不得写脱离 DOM 或创建泄漏 URL;已开预览随 locale 重建且清理 overlay registry;本地化关闭按钮、dialog 初始焦点、ShadowRoot 内含下载链接的焦点圈闭与关闭恢复完整;下载文件名过滤控制字符并补安全扩展名。自动证据由纯模型、renderer/CSP 接线、MIME/扩展名/恶意内容/上限/异步失效、真实 standalone HTTP CSP、i18n、配置注册表、UI typecheck/build 与整仓回归组成,当前证据:整仓 92 files/1304 tests、research-ui strict typecheck、全包 build 与 docs 21/21 均通过。真实 codec/PDF、窄屏、键盘与 Shadow DOM 浏览器交互仍为 `NOT_RUN_MANUAL_PENDING`,所以状态不得提升为“已验收”。 | | ART-02 | media type/Range/hash | 已实现未验收 | Kernel/BFF 已实现项目域读取、media type、ETag、Content-Disposition 与严格单 Range 206/416;206 透传实体相关下载头,416 无 body 且保留 Content-Range/Accept-Ranges/ETag,不要求虚构 Content-Disposition。仍需把当前 commit 绑定完整 CI 报告,并完成人工浏览器预览/下载验收后才能升级为“已验收”。 | | STORE-01 | 显式迁移与 schema parity | 已验收 | SCHEMA_VERSION 6→7,迁移 0008_outbox_envelope:events 表增 outbox 列(event_seq/event_version/aggregate_*/request_id/session_id/attempts/last_error/next_attempt_at/dead_lettered_at)+聚合内唯一索引、新增 runs 表(job attempt 行,§3.1 parity)、session_links 增 principal/tenant/issuer;幂等且兼容旧库。证据:tests/unit/migrations.test.ts 全绿(schema 升级后列存在、旧行回填 event_seq);尚未绑定 CI job 报告,待验收验收绑定:commit 6e4d302 + scripts/ci-gate.sh 全量运行(4/4 PASS,142s,零 SKIP,日志 /tmp/ci-gate-full.log)+ 对应 acceptance 场景(阻断脚本 CI=true 零 SKIP)。 | | STORE-02 | durable CodeSnapshot | 已验收 | 快照资源上限:SNAPSHOT_MAX_FILES=10000/MAX_FILE_BYTES=64MiB(stat 后先拒再读)/MAX_TOTAL_BYTES=512MiB,超限 422 snapshot_too_large;宿主绝对路径不再写入 archive/metadata(root 占位符);path/traversal/symlink 逃逸保护保留;data_artifact_ids 同项目+hash 可重验(RUN-01 补充:缺失 422 data_artifact_missing、跨项目 422 data_artifact_foreign)。证据:tests/unit/kernel.test.ts 新用例(上限、root 不含绝对路径、data refs 三态);尚未绑定 CI job 报告,待验收验收绑定:commit 6e4d302 + scripts/ci-gate.sh 全量运行(4/4 PASS,142s,零 SKIP,日志 /tmp/ci-gate-full.log)+ 对应 acceptance 场景(阻断脚本 CI=true 零 SKIP)。 | | EVENT-01 | 事务 Outbox | 已验收 | events 写入带 event_seq(max+1 单写事务,聚合内单调)+event_version=1+aggregate 身份+request/session 跟踪+attempts/dead-letter 字段;emit 在调用方事务内复用同一事务(node:sqlite 无嵌套 BEGIN 处理);已淘汰 seq 回填。证据:tests/unit/kernel.test.ts 连续 emit 断言 event_seq 单调递增、字段存在;尚未绑定 CI job 报告,待验收验收绑定:commit 6e4d302 + scripts/ci-gate.sh 全量运行(4/4 PASS,142s,零 SKIP,日志 /tmp/ci-gate-full.log)+ 对应 acceptance 场景(阻断脚本 CI=true 零 SKIP)。 | | DSH-01 | DSH Agent tools/commands/lifecycle | 部分 | canonical catalog 当前为 42 个工具;`dsh_scholar` 与七个 exact-session methodology tools 可由 root/unknown role 使用,其他普通研究工具继续 fail closed,Knowledge activate/deactivate 与 Assurance run 要求 Host confirmation。直接一级 slash command、Skill package-root 解析、Cordis lifecycle/实例隔离与 headless 路径已实现;DSH 不注册聚合 command descriptor。当前 checkout 有 unit/security 文件,但最终自动结果由主验收记录;真实 DSH Host 中的 ask/deny、session 切换与浏览器 panel 仍未人工验收。 | | SIDE-01 | sidecar identity/ownership | 部分 | kernel 支持 --endpoint-file(port 0 时上报实际端口);sidecar(插件+standalone)复用前校验 0600 runtime/endpoint.json 的 protocol/schema/database/dataDir,缺失→sidecar_identity_unknown、不匹配→sidecar_identity_mismatch,均拒绝复用且绝不 kill 非本实例进程;spawn 后写自身 endpoint.json,stop 时按 pid 清理。证据:tests/unit/sidecar.test.ts 8/8(同 dataDir 复用、跨 dataDir 拒绝且原 kernel 存活、port=0 实际端口、无文件拒绝);运行中 standalone 的 endpoint.json 已生效(0600);尚未绑定 CI job 报告,待验收§4 审阅校准为较低状态:见第 4 节对应阻断项与强制关闭条件。**§4 行 100 P1 阻断项已关闭(commit 64a0649)**:插件 apply await `sidecar.start()` 完成后才读取 `sidecar.endpoint` 并发布 client/`ctx.research`——port=0 时 endpoint 恒为真实绑定端口;sidecar disposer 在 apply 开头注册,启动期间 dispose/reload 亦停 kernel(owned endpoint.json 按 pid 清理)。证据:run-dsh-plugin-tests.sh 47/47(host fixture port=0 组:endpoint 与 0600 endpoint.json 一致、client 真实 kernel 调用、reload/dispose 后端口释放+进程终止),tests/unit/sidecar.test.ts 8/8。 | | SKILL-01 | Skills 安装发现与确定性选择 | 部分 / canonical runtime skill 已更新 | provider 从发布包根 `skills/` 解析四组 skill(research-core + 2 domain + venue),domain/venue 按 Brief 确定性选择;package-root `skills/research-core/SKILL.md` 已内化 Protocol、两层循环、Knowledge/Writing、Assurance 与 exact-session tool 边界,两个 prepared/static mirror 已同步为相同内容/hash。仍需用 clean install 验证实际 tarball 的 package-root source 与 Host 模型遵循性;最终自动结果由主验收记录,真实 DSH 模型遵循性保持待人工验收。 | | PACK-01 | clean remote install | 已验收 | 7 包 tarball 完整;clean consumer install 用 file: 覆盖 + overrides,断言 node_modules 是真实文件非符号链接、无原 checkout/../test-lzszq 路径、@deepseek-ai/* 宿主 peer optional 且无 registry 环境不强制安装;skills frontmatter 校验。证据:tests/unit/packaging.test.ts 10/10;真实 registry 发布仍待(环境无 registry,以 tarball+overrides 等价验收)验收绑定:commit 6e4d302 + scripts/ci-gate.sh 全量运行(4/4 PASS,142s,零 SKIP,日志 /tmp/ci-gate-full.log)+ 对应 acceptance 场景(阻断脚本 CI=true 零 SKIP)。 | | SELFMOD-01 | dev-only Cordis self tools | 已实现未验收 | production 静态否定(tarball/lib/src 无 cordis self 工具字符串、依赖图无 dsh-tool-cordis、verify-docs fail-closed)+ **真实 DSH host fixture 动态验收**:隔离 DSH_HOME 下 --profile web --dump-config 生产 0 引用、叠加 dev overlay patch 后 tool-cordis 出现在组合配置树(2 引用)、无 opt-in env 时 start-selfmod-dev.sh 拒绝启动。证据:tests/security/run-selfmod-tests.sh 19/19(含 host fixture 组,已接入聚合器);cordis_inspect 六类信息的会话级 inspect 仍属 harness 深层交互,记录为后续 | | REL-01 | 自包含 Release Bundle + bundle-only clean-room | 部分 | build-bundle.sh 在 manifest 增加 runtime 段(node 版本、kernel_bin/runner_bin sha256、images.lock 的 node_fixture/texlive digest);reproduce.sh 把 bundle 复制到空目录执行、拒绝指向原 checkout 的 KERNEL_BIN/RUNNER_BIN(external checkout access prohibited)、node 版本不匹配→fail、作业重放强制使用锁内 digest;reproducibility-report.json 增加 bundle_manifest_sha256、runtime_verified、images_used、compared{manifest_hash,metrics,analysis,run_manifest,tex},任一 false→status=fail。证据:tests/security/run-release-bundle-tests.sh 16/16(含 checkout 拒绝用例与 report 新字段断言)、run-release-eval.sh 21/21(reproduce 段 pass);尚未绑定 CI job 报告,待验收§4 审阅校准为较低状态:见第 4 节对应阻断项与强制关闭条件。**§4 REL-01 P1 阻断项已关闭(commit 040e796)**:build-bundle.sh 把成功 latex-compile 作业引用的 TeX workspace 导出进 bundle(tex-workspace// + manifest.tex 每文件 sha256/大小);reproduce.sh 在全新 kernel 中重建 TeX document(old→new 映射)、经 POST /v1/documents/{id}/builds 以原 idempotency key 重建 latex-compile 作业(HTTP jobs 路由 schema 不接受 latex-compile kind);compared 升级为逐字段:metrics(name/unit/value 容差+seed)、analysis(mean 容差+n/effect_size/baseline_value)、run_manifest(key 集合+数量+每 key kind+run_manifest 存在性)、tex(TeX 输入文件清单+每文件 sha256、PDF 字节大小);报告新增 cleanroom{snapshot_dir,kernel_db,kernel_cas,work_dir}(全新 mktemp 目录,不含原 checkout/bundle 路径)与 tex_comparison 明细;负向测试新增:原 checkout 改名后重放仍 pass(不读原路径)、checkout 外 digest 不匹配二进制立即拒绝(sha256 do not match)、node 版本不匹配→status=fail。证据:tests/security/run-release-bundle-tests.sh 25/25(含断言 8-12)、run-release-eval.sh 25/25(含真实 texlive latex-compile 段,reproduce 段 pass);commit 040e796,§4 表第 101 行已标注关闭。尚未绑定 CI job 报告,待验收§4 审阅校准为较低状态:见第 4 节对应阻断项与强制关闭条件。 | | CI-01 | 完整阻断 CI | 已实现未验收(本地网关) | 用户决策不用 GitHub Actions;新增 scripts/ci-gate.sh 本地 CI 网关(一条命令:pnpm test+verify-docs+CI=true 聚合器+plugin typecheck,exit 非零即阻断,--skip-security 可选并注明降级);根 package.json test:ci。证据:bash -n 通过、各步骤单独全绿;DSH host fixture(SELFMOD 动态 overlay、Agent 全链)仍待外部 host 环境 | | DOC-01 | Markdown 是生成权威 | 部分 | 2.3 文档集含 research-onboarding 与 trajectory-subagents;verify-docs.mjs 对 18 篇文档的结构/链接/关键 contract/删除面/SELFMOD 违规 fail-closed,`node scripts/verify-docs.mjs` 当前通过 18/18。`--diff-check` 和持续语义一致仍需当前提交/CI 证据,不能把静态验证当功能验收。§4 审阅校准为较低状态:见第 4 节对应阻断项与强制关闭条件。 | | DOC-02 | change-aware docs sync | 部分 | --diff-check 覆盖扩展到根 src/、configs/、migrations/、scripts/(除自身)、tests/(unit+security)、docs/、evals/;改动范围必须伴随 ledger 移动;base ref 不可达保持 fail-closed。证据:node scripts/verify-docs.mjs --diff-check origin/main 通过(本会话全量改动已同步);待长期语义一致性持续验证§4 审阅校准为较低状态:见第 4 节对应阻断项与强制关闭条件。 | | REPRO-01 | 论文复现生成契约(docs/reproduction-contracts.md,2026-08-12 规范性文档) | 已实现未验收(commit 8c11e71;浏览器 Chat 向导视觉 NOT_RUN_MANUAL_PENDING) | **代码侧已实现(2026-08-12 实现轮)**:research-schemas `reproduction.ts`(PaperRef(doi/arxiv/artifact_id 正则+paperRefFromToken)/CodeSource(git exact commit 或 immutable CodeSnapshot;branch/tag 不可执行)/DataSource(artifact 或 recipe+expected_sha256)/EnvironmentLock/ExecutionBinding(opaque profile+target)/MetricComparator(unit/direction/aggregation/absolute+relative tolerance)/PaperReproductionSpec(schema_version/owner Principal/claims 非空/revision/status 状态机 draft→confirmed→completed|blocked)/ReproductionAttempt(generation/spec_revision/lease token hash 落库)/ReproducibilityReport(不可变,paper_comparisons 与 run_comparisons 两个独立比较组,绝不合并 tolerance)+ReproductionReportInput(status/checks 一致性 refine));research-kernel `reproduction-compare.ts` 纯比较器(allowed=max(absolute, abs(expected)*relative)、expected=0 零安全、NaN/Infinity/missing/duplicate metric/unit/direction/aggregation 不匹配一律不能 pass、direction 不是误差替代、table 稳定 row/column key、figure data hash 权威+visual similarity 仅诊断、manuscript TeX/PDF required+缺输入→inconclusive 绝不 skipped-pass、evaluateReportStatus 与 suggestFailureClass(metric_mismatch 等,绝不 code_error));migration 0022_reproduction_contracts(SCHEMA_VERSION 19,幂等,四表 reproduction_specs/attempts/reports/links,Report body 进 CAS 行存 body_hash+cas_ref);kernel 方法 createReproductionSpec(paper ref 格式/claims 非空/code/data 源/opaque profile 校验、跨项目 404/422、Idempotency-Key 幂等异 hash 409)/updateReproductionSpec(revision CAS 409、状态机 422)/listSpecs/getSpec/startReproductionAttempt(draft 409 spec_not_confirmed、generation 1+lease token 明文只回一次、幂等重放)/reportReproductionAttempt(verifier service principal 403、generation+lease token hash fencing 409 lease_stale、attempt→reported、spec→completed|blocked、out-of-tolerance fail/inconclusive 不伪装 code_error)/getReport/getAttempt/list*;NextAction:reproduction 覆盖动作(reproduction_plan_confirm/run/compare/report_review/retry_or_repair,blocked 报告→blocked+reproduction_environment 缺口),`baseline_reproduce` 只有持久化 Report status=pass 才 done(legacy 无 reproduction 上下文保持 job 语义);HTTP:`POST /internal/reproduction-attempts/{attempt}/reports`(SERVICE_ROUTES+x-service-token+verifier principal,201/403/409)+`POST/GET /v2/projects/{p}/reproduction-specs(+/spec PATCH)`+`POST .../spec/attempts`+`GET /v2/projects/{p}/reproduction-attempts/{attempt}`+`GET /v2/projects/{p}/reproduction-reports/{report}`(memberOr404 先解析 project 再 AuthZ,跨项目 404 防枚举);slash command `/reproduce ` 重写为 createReproductionSpec(不再提交通用 baseline Job);research-client 增 createReproductionSpec/updateSpec/listSpecs/getSpec/startAttempt/getAttempt/reportReproductionAttempt(x-service-principal: verifier)/getReport。证据:tests/unit/reproduction.test.ts 33/33(spec 校验/attempt 生命周期+fencing/report CAS+hash/比较器全负向/跨项目 404/service identity/NextAction done 语义)、tests/unit/migrations.test.ts 17/17(0022 列/版本)、根 pnpm test 全绿(除并行子代理 in-flight 的 browser Chat 向导 i18n-chrome R2 硬编码项,属对方未提交工作)、research-schemas/research-kernel/research-client/research-plugin build+typecheck 全绿、run-hardening-tests.sh REPRO-01 HTTP 段(passed 见运行日志)。剩余(如实记录,NOT_RUN_MANUAL_PENDING):真实 DOI/arXiv/PDF 网络获取、Chat 复现向导浏览器视觉、真实 Docker/远端 SSH/TeX/PDF 重建与 clean-room 执行、Report 的 Markdown Artifact 面与 Overview/Runs/Evidence/Manuscript 深链展示(`#tab=runs&reproduction=`);acceptance-tests.md §23 `reproduction-comparison-report`/`reproduction-spec-provenance`/`reproduction-environment-pinned`/`reproduction-attempt-report-fencing`/`slash-command-direct-only` 代码侧闭环见场景行注记。 | > 2026-08-20 REL-01/GOV-03 回归修复:release eval 与其生成的 clean-room `reproduce.sh` 曾继续调用已删除的公开 `POST /v1/gates/{gate_id}/decisions`,`curl -f` 在首个 Scope Gate 404 后退出,外层测试只观察到缺少 `BUNDLE_DIR`。两处夹具现统一通过 standalone Human BFF 内部端点提交固定 server-verified principal,公开决策路由仍保持删除;`bash tests/security/run-release-bundle-tests.sh` 当前 25/25 PASS,覆盖主 eval、生成脚本与 clean-room 重放。 > 2026-08-15 DSH-01 校准:上表 DSH-01 中“聚合子命令 handler”属于历史证据,已被 direct-only 契约取代。当前插件注册 17 个直接一级 descriptor 且不注册聚合别名;standalone parser 同样拒绝旧聚合形式。当前 DSH 已把 Cordis peer 迁至私有 `@deepseek-ai/cordis`,并把文件设置 provider 的 canonical 包名调整为 `@deepseek-ai/dsh-settings-file`;插件 checkout 夹具与本地链接脚本必须跟随当前 workspace 包名,不再引用已移除的 `dsh-settings-local`。更新后的 direct descriptor fixture、固定私有 `@deepseek-ai/*` 包和真实 DSH host 尚未验收,因此 DSH-01 仍为“部分”。current `dsh-skill-local` 公共 `list()` 暴露了旧 fixture 读取内部 provider collection 与未引用 YAML description 的兼容缺口,代码/Skill 已修;本地 checkout/link 只用于开发反馈,不能替代私有包 clean-install 验收。 > 2026-08-20 DSH-01 当前兼容基线:安装入口为 `@deepseek-ai/dsh@next`,每次必须记录 tag 实际解析的精确版本;本轮实际解析并全局安装 `0.1.0-rc.8`。Scholar 尚未发布,当前安装顺序是全局安装该 DSH、正式 build 本仓库,再以绝对路径执行 `dsh plugin --profile web add`。RC8 Host/Profile 运行 smoke 已通过:真实 npm CLI/Web 启停、profile compose、Cordis plugin lifecycle、共享 Kernel/standalone、3080/7412/18610 loopback HTTP、全新 Chrome profile 基础页面加载且插件/slot/运行时 console 错误为 0,以及整仓 1425/1425 与插件安全脚本 52/52 均为 GREEN;详细证据和边界见 `manual-acceptance.md`。进一步的真实页签验收中,已关联会话与 Settings 配置卡通过,但未关联会话因两条持久化项目缺 required-nullable `execution.runner_profile_id` 而使整个项目选项数组 422,页面退化为通用阶段读取失败;该项为明确 FAIL,关闭条件与证据已记录在 `manual-acceptance.md`,不得用清库代替修复。源码 checkout 仅用于开发和补充验证。 > 历史证据(2026-08-17,DSH-01 RC7):真实 DSH `0.1.0-rc.7` Web 启动把 `settings.plugin.item` 强制为 keyed slot,旧 Scholar 注册缺少 `options.key`,导致整个插件 browser bundle 进入 `Failed to load plugins`。根因已在正确调用点关闭:注册 key 固定为 Host Settings namespace `research-plugin`,移除 keyed slot 不接受的 `id/order`;`plugin-client-config.test.ts` 锁定该形状;当时根包 DSH peer 下限和全部 DSH 开发依赖统一到 RC7,避免旧类型/新运行时漂移。真实 Chrome 回归:插件连续两次加载成功;已关联 session workspace 返回 `cnn测试/SURVEYING/rev 3` 与 `idea=current`,未关联 session 返回 5 个可绑定项目和新建入口,均零 page/console error。该源码 profile smoke 只保留为 RC7 历史证据;不能替代当前 RC8、clean tgz 或 private published install 验收。 ### 3.1 2026-08-15 CSP 与实验环境增量状态 - `UI-CSP-STYLE-01 — 已实现未验收`:根因不是 CSS 资源 404。standalone client 把主样式动态插入 ShadowRoot;当 `style-src` 同时带 nonce 时浏览器忽略 `unsafe-inline`,旧实现创建的 `