Compare commits

...
Author SHA1 Message Date
weichen ca9b128f18 Document the storage-migrate tool and the switch/drill runbook (U4)
Why: U4 ships the managed migration entry; the runbook is the operator-facing contract for inventory/backup/migrate, migration identity and resume rules, verification semantics, and the authorized-window switch sequence.

Evidence: backend branch feature/collab-storage-u4-migrator - integration tests green against real PostgreSQL (idempotent rerun, resume, foreign-data refusal, wrong-snapshot refusal, unknown-owner block).

Impact: docs only.

Refs: proposals/2026-10-11-collaboration-storage-and-distribution.md U4 and section 6.
2026-10-11 08:29:38 +00:00
weichen 5ac58dcd7e Merge pull request 'Document the execution budget settings and the KTD13 action-authz compat plan' (#64) from feature/collab-storage-u3-budget-authz into main 2026-10-11 05:16:45 +00:00
weichen 0be6c2d3ee Document the execution budget settings and the KTD13 action-authz compat plan
Why: U3 slice 2 ships admission budgets (runtime.* keys, lease semantics, yield/reacquire) and the host-side action matrix; the runbook is the single source for operators and records the versioned public-contract plan KTD13 requires.

Evidence: backend branch feature/collab-storage-u3-budget-authz (admission.go, action matrix in server.go) with admission/matrix tests green.

Impact: docs only.

Refs: proposals/2026-10-11-collaboration-storage-and-distribution.md KTD13/R8, section 5 U3.
2026-10-11 05:15:49 +00:00
weichen d3e40c783d Merge pull request 'Publish the approved two-trees traceability plan r1 with user rulings' (#63) from feature/rdm-two-trees-audit-plan into main 2026-10-11 04:43:31 +00:00
weichen 76f49b2bc7 Merge authoritative main into the task branch
Why: branch protection requires the head to contain the current base before merge.

Evidence: fetched origin/main=336a90f0ade0ffe049879ca5159a61f0a3948708.

Impact: integrate upstream changes without rewriting task history.

Refs: Documents PR #63
2026-10-11 04:43:23 +00:00
weichen 336a90f0ad Merge pull request 'Revise the Generative UI proposal to r2 with the U1 trial results' (#62) from feature/generative-ui-u1 into main 2026-10-11 04:42:48 +00:00
weichen 474955b64d Revise the Generative UI proposal to r2 with the U1 trial results
Why: The U1 controlled trial (three arms on synthetic materials,
MiniMax M3 + M2.7-highspeed, CNY 3 spent of the 200 cap) finished on
2026-10-11; its evidence changes the plan and must live in the master
record: goal-driven structure divergence holds (6/6), generation must
go through tool arguments (text-channel JSON discipline is the floor),
highspeed is rejected as the generator, and the first release keeps the
in-house renderer.

Evidence: Full data and failure taxonomy in Dev task
feature/generative-ui-u1 (.task/genui-u1/report.md, SELF; CI gate on
the Dev PR). Tool-channel and response_format probes recorded there.

Impact: Proposal r1 -> r2 (new results section, catalog/model/channel
revisions); INDEX entry updated. No code or contract changes.

Refs: Dev task feature/generative-ui-u1; Documents PR #60 (r1)
2026-10-11 04:42:37 +00:00
weichen b857595025 Publish the approved two-trees traceability plan r1 with user rulings
Why: the user reviewed and approved the plan (2026-10-11, five stages bundled) and chose a two-tier admin model for KTD4 instead of strict ledger separation.

Evidence: SELF user session rulings recorded in the Dev task card; document-check receipt follows in the task card evidence section.

Impact: proposal r1 and INDEX now record approval and the two-tier admin ruling; no code or deployment change.

Refs: Dev feature/rdm-two-trees-audit-plan
2026-10-11 04:41:29 +00:00
weichen b3171b3d51 Plan RDM project traceability and audit integration
Why: assess existing two-tree and trace-network capabilities and define project-scoped inspection.

Evidence: SELF source receipt and document checks; business and runtime verification were not run.

Impact: pending-review proposal and index only; no product implementation or deployment.

Refs: Dev feature/rdm-two-trees-audit-plan
2026-10-11 04:02:38 +00:00
weichen 3e2d8c9049 Merge pull request 'Add the team-storage runbook for U1 and cross-link usage' (#61) from feature/collab-storage-pg-tier into main 2026-10-11 03:14:09 +00:00
weichen a47ef7ffcf Merge authoritative main into the task branch 2026-10-11 03:14:06 +00:00
weichen 3304efee15 Merge pull request 'Publish the Generative UI research and plugin proposal r1 with user rulings' (#60) from feature/generative-ui-research into main 2026-10-11 03:10:49 +00:00
weichen 4ca58c3d8a Add the team-storage runbook for U1 and cross-link usage
Why: the approved collaboration plan U1 requires a fixed deployment manifest, tier config contract, migration mapping, capacity contract, isolation test scheme and KTD14 copy-protection contract as the single source of truth for team-tier operations.

Evidence: contract keys match backend config.go tier/pool fields (U2, backend branch feature/collab-storage-pg-tier); local verification used svc.sh collabtest on 127.0.0.1:8897 and Redis on 6399.

Impact: docs only (new guide + usage.md cross-links); no code change.

Refs: proposals/2026-10-11-collaboration-storage-and-distribution.md sections 5 (U1/U2), KTD1/KTD8/KTD12/KTD14.
2026-10-11 03:10:45 +00:00
weichen 95a7c111d5 Add the Generative UI research and plugin proposal r1 with user rulings
Why: The user ruled on 2026-10-11 the three open product choices (first
pilot = full analysis page inside the conversation; enable/disable via a
trusted compiled plugin; U1 trial on MiniMax M3 + M2.7-highspeed with
sanitized materials and a CNY 200 cap), so the proposal now publishes as
the direction's master record instead of a local draft.

Evidence: Doc self-check receipts live in the Dev task card
feature/generative-ui-research; the rulings are recorded in the doc's
"用户裁定记录" section and mirrored in INDEX.md.

Impact: Documents-only change (new proposal + index entry). No runtime,
contract, or code changes; U1 trial start and deployment stay separately
reviewed.

Refs: Dev task feature/generative-ui-research
2026-10-11 03:10:16 +00:00
weichen 95e5c9d307 Merge pull request 'Add the approved collaboration storage and distribution plan r1' (#59) from feature/collaboration-storage-plan into main 2026-10-11 02:41:05 +00:00
weichen 228cf74468 Merge authoritative main into the task branch 2026-10-11 02:40:54 +00:00
weichen 0f5df5147e Add the approved collaboration storage and distribution plan r1
Why: freeze the direction for 10-100 user multi-project collaboration storage (PostgreSQL team tier, migration, staged multi-instance) before U1+U2 implementation starts.

Evidence: static review record and SELF audit receipt included; user approval recorded in Dev task card 2026-10-11 (instruction to start the transformation per the plan).

Impact: docs only - new proposal, index entry, review record, audit receipt; no code or runtime change.

Refs: Dev .task/feature-collaboration-storage-plan.md; plan section 5 names U1+U2 as the first increment.
2026-10-11 02:40:02 +00:00
weichen b3ca409cfc Merge pull request 'Backfill the S0-1 completion in the plan and index' (#58) from feature/s0-progress into main 2026-10-11 02:29:57 +00:00
weichen 4a3ca0eb5a Backfill the S0-1 completion in the plan and index 2026-10-11 02:29:16 +00:00
weichen 9a46785ee0 Merge pull request 'Backfill the E4 completion in the plan and index' (#57) from feature/e4-progress into main 2026-10-11 01:34:48 +00:00
weichen cc54cdac76 Backfill the E4 completion in the plan and index 2026-10-11 01:34:07 +00:00
weichen b37f45ff61 Merge pull request 'Backfill the E5 MiniMax-family A/B result' (#56) from feature/e5-progress into main 2026-10-10 17:28:06 +00:00
weichen 077ebdf184 Backfill the E5 MiniMax-family A/B result in the plan and index 2026-10-10 17:27:25 +00:00
weichen e986a85436 Merge pull request 'Backfill the E3 completion in the plan and index' (#55) from feature/e3-progress into main 2026-10-10 16:39:56 +00:00
weichen 19b77a28bc Backfill the E3 completion in the plan and index 2026-10-10 16:39:02 +00:00
weichen 3a82eec74c Merge pull request 'Backfill the E1 increment completion in the plan and index' (#54) from feature/e1-progress into main 2026-10-10 10:03:49 +00:00
weichen 352b7aa540 Backfill the E1 completion status in the index row too 2026-10-10 09:47:50 +00:00
weichen a379a9fbe6 Backfill the E1 increment completion in the plan and index
Why: The E1 quick-fix increment landed (delegate full text, MiniMax
reasoning split, sandbox deps layer, parallel tool execution with kernel
ordering) and the proposal is the master record, so its stage table and
the index row must reflect the actual progress with links.

Evidence: Agent-Native #42/#43/#44, Backend #127, Dev task
feature/agent-e1-parallel-fixes (live verification receipts: F2 zero
think-leak, F3 sandbox IMPORTS-OK, F5 concurrent overlap; eval
toolFailures 19->11, unverifiedFacts 7->12 recorded honestly).

Impact: Documents-only progress backfill; E2-E5/S0 remain unauthorized.
2026-10-10 09:47:25 +00:00
weichen 0f6d6974ef Merge pull request 'Propose the delegation, model-routing and task-sandbox plan' (#53) from feature/agent-exec-routing-sandbox-plan into main 2026-10-10 07:40:41 +00:00
weichen 3947a12700 Propose the delegation, model-routing and task-sandbox plan
Why: The user asked for a researched design covering subagent use,
tiered model routing (Claude via dmxapi for complex work, MiniMax for
the rest), a millisecond/sub-second task sandbox (record-only), and a
verdict on why the agent still feels weaker than codex/claude-code/kimi.
Why: Four research threads (external frontier survey, subagent/routing
evidence, harness-vs-model attribution, local code audit and probes)
converge on role/stage routing instead of whole-task routing, and on
three corrections to the sandbox assumptions (overlay is not a snapshot;
snapshots defer conflicts to merge time; destroy must follow sealing).

Evidence: Local measurements are SELF receipts in the Dev task card
(bwrap namespace ~7ms, overlay same, docker ~142ms; MiniMax reasoning
split; dmxapi /v1/messages cache_read; EXT-16 sandbox missing the
python-docx layer). External claims carry per-item source URLs in the
proposal's section 8.

Impact: Documents-only addition: new proposal 2026-10-10 (E1-E5/S0
increments, D/R workstreams, sandbox tiers L0-L2) plus INDEX rows for it
and the previously unlisted G1 package. No product code changes; all
implementation increments stay unauthorized until approved.

Refs: proposals/2026-10-09-agent-quality-improvement-plan.md (P4/P5,
model A/B), 2026-10-09-ext-g1-b1-b3-exec-backend.md (EXT-16),
Dev task feature/agent-exec-routing-sandbox-plan.
2026-10-10 07:39:56 +00:00
weichen 3e43193f45 Merge pull request 'Propose the G1 extension package: EXT-13..16 (shared retrieval, commands-as-tools, shared project list, exec backend)' (#52) from feature/g1-ext-b1-b3-proposal into main 2026-10-09 14:50:07 +00:00
weichen 1f8ad3b99b Propose the G1 extension package: shared in-run retrieval, commands-as-tools, shared project list, exec backend
Why: RDM G1/G2 are blocked on four base capabilities - the member agent
cannot see published project knowledge inside a run, plugin commands are
unreachable as tools, members cannot see or open conversations in shared
projects, and the isolated exec tier needs a backend seam.
Evidence: SELF - code citations verified at Dev main (runmgr.go:726-736
owner-only Retrieve; hostcaps.go:64-66 owner-only search; server.go:438-441
owner-only listProjects; store/projects.go:124-130 owner-scoped conversation
creation); bwrap availability tested on this host (2026-10-09).
Impact: Docs only. New proposal docs/proposals/2026-10-09-ext-g1-b1-b3-exec-backend.md
registering EXT-13..EXT-16 per the compat-policy template; no code change.
Refs: RDM plan V1.1 sections 3.3/3.4/5.3; owner Q1-Q8 (Q4=option A, Q2)
2026-10-09 14:49:56 +00:00
weichen 9206e0d77c Merge pull request 'Record the agent quality improvement plan and six user rulings' (#51) from feature/agent-quality-plan into main 2026-10-09 14:12:56 +00:00
weichen 238f90e92a Record the agent quality improvement plan and its six user rulings
Why: The 2026-10-09 diagnosis on real run transcripts identified the direct
conversation path's failure chain and a phased plan was approved with six
explicit user rulings (open up tools, kernel-transcript-authoritative context,
markdown-source deliverables with all file types retained, gate demotions,
uncapped stronger-model evals, real-model eval required for behavior changes).
The plan needs a durable main record per the long-term-direction policy, and
the 2026-09-30 preview proposal's "fs tools hidden by default" ruling is
superseded by ruling 1, which must be discoverable from the index.

Evidence: SELF - the record cites the diagnosis session, the transcript
sources (pg1 + legacy SQLite, 62 assistant turns) and the before-baseline
report location on the task card; no code or pointers changed in this repo.

Impact: New proposal 2026-10-09-agent-quality-improvement-plan.md plus one
index row. Subsequent phase tasks reference this record instead of restating
the plan.

Refs: Dev task feature/agent-quality-phase01; supersedes the fs-tool default
in 2026-09-30-file-preview-and-reserved-capabilities.md §2.3.
2026-10-09 12:42:33 +00:00
weichen d3c9b4554e Merge pull request 'Record the v0.2.0 base release scope and owner tag steps' (#50) from feature/v020-release-notes into main 2026-10-09 10:46:32 +00:00
weichen 176db44c4b Record the v0.2.0 base release scope and owner tag steps
Why: v0.2.0 is the hard prerequisite for RDM shared work, and the release
checklist referenced a stale SurfaceVersion and tag message.
Evidence: SELF - scope lines are tied to merged Backend PRs (#66-#110);
Backend #110 CI success; UI composite run 1369 shows 14 files/103 tests.
Impact: Adds docs/records/2026-10-09-base-v0.2.0-release.md and points the
compat policy and the EXT-1 proposal at the actual 2.5.0-experimental line.
Tag creation and push stay with the owner (dual-key rule).
Refs: Dev feature/base-v020-release; Backend #110
2026-10-09 10:44:33 +00:00
weichen 69360de5bb Merge pull request 'Propose the C1-C7 base extension package for RDM shared contracts' (#49) from feature/ext-c1-c7-applications into main 2026-10-08 15:22:39 +00:00
15 changed files with 2046 additions and 4 deletions
+198
View File
@@ -0,0 +1,198 @@
# 团队存储运行手册(协作存储 U1)
适用范围:[协作存储与分布式方案](../proposals/2026-10-11-collaboration-storage-and-distribution.md) U1/U2
(已批准,2026-10-11)落地后的 **team 部署档** 运维与验证。个人 `local` 档(SQLite)
用法不变,见 [usage](usage.md)。本文是 U1 的固定部署清单、配置合同、迁移映射、
容量合同、隔离测试方案与 KTD14 副本保护合同的单一事实源;实施状态以各任务卡为准。
## 1. 目标实例与固定部署清单
| 项 | 值 | 说明 |
|---|---|---|
| 部署形态 | svc.sh 管理的 `runtime/<name>` 实例 | 非容器;单机多实例按名隔离 |
| 当前团队候选 | `runtime/dev`(8788,SQLite)→ 目标切 team 档 PG | 切换窗口与回退按方案 §6,须另行授权 |
| 数据库(本机验证) | PostgreSQL 18.6 + pgvector 0.8.7(brew) | 本机验证用;正式实例待指定 |
| 数据库(CI 门禁) | Ubuntu 24.04 apt:postgresql 16 + postgresql-16-pgvector | 版本以 CI job 输出为准 |
| 缓存/限流 | Redis 8.10.2(本机);CI apt redis-server | 只存可重建状态(KTD10) |
| 应用制品 | `agent-system` 单二进制(make build) | 拷贝即运行;team 档需 `--tier team` |
未知项(正式实例主机、pgvector 正式启用版本、对象存储选型)在正式切换授权前
必须补齐;本清单不把本机验证环境当作正式部署事实。
## 2. team 档配置合同(U2 已实施)
启动语义(KTD1 fail-closed):
- `tier=team`:必须配置 `dsn` 且认证开启(`auth=on`;`auth=auto` 随 DSN 自动开);
任一缺失**拒绝启动**。PG 打开失败**拒绝就绪**,绝不回落 SQLite。未配置执行隔离
(`disableExecTools` 或 `execBackend`)时启动警告(多用户开放前必须补齐)。
- `tier=local`:SQLite;配置 `dsn` 是配置错误,拒绝启动。
- `tier` 缺省(auto):现状语义——`dsn` 非空走 PG,否则 SQLite。
配置键(四源合并:默认 → 文件 → 环境 → 显式 CLI,与 usage §启动一致):
| 键 | env | CLI | 语义(team 档) |
|---|---|---|---|
| `tier` | `AGENT_SYSTEM_TIER` | `--tier` | `local` / `team` / 空=auto |
| `dsn` | `AGENT_SYSTEM_DSN` | `--dsn` | PG 连接串;team 必填 |
| `auth` | `AGENT_SYSTEM_AUTH` | `--auth` | team 档要求最终为 on |
| `instance` | `AGENT_SYSTEM_INSTANCE` | `--instance` | 空=主机名:监听地址(多实例必须互异) |
| `pgMaxOpen` | `AGENT_SYSTEM_PG_MAX_OPEN` | `--pg-max-open` | 每进程最大连接(默认 16) |
| `pgMaxIdle` | `AGENT_SYSTEM_PG_MAX_IDLE` | `--pg-max-idle` | 每进程空闲连接(默认 8) |
| `pgConnMaxIdleSec` | `AGENT_SYSTEM_PG_CONN_MAX_IDLE_SEC` | `--pg-conn-max-idle-sec` | 空闲回收(默认 300s) |
| `pgConnMaxLifetimeSec` | `AGENT_SYSTEM_PG_CONN_MAX_LIFETIME_SEC` | `--pg-conn-max-lifetime-sec` | 连接寿命(默认不限) |
| `pgQueryTimeoutSec` | `AGENT_SYSTEM_PG_QUERY_TIMEOUT_SEC` | `--pg-query-timeout-sec` | statement_timeout 秒(默认不限) |
连接预算(KTD12):预算覆盖全部 API/Worker/LISTEN/migrator/监控连接;
100 在线用户 ≠ 100 连接。`agent-system config explain` 输出脱敏有效值
(DSN 密码打码)。启动日志打印 `storage tier: team (dialect=postgres pool=… schema=v…)`。
迁移(KTD8,U2 已实施):DDL 与版本登记同事务(中途失败整体回滚,不存在
「表已建、账本未记」中间态);PG 并发迁移者按会话咨询锁串行化;SQLite 写事务
`_txlock=immediate` 跨进程排队。库内出现比二进制新的 schema 版本时拒绝启动。
## 3. 迁移映射(SQLite → PG,U4 工具消费)
| SQLite 侧 | PG 侧 | 备注 |
|---|---|---|
| `agent-system.db`(WAL) | 同名逻辑库 | 活跃 WAL 不能只拷 `.db`;一致性备份用 VACUUM INTO |
| INTEGER 0/1 布尔列 | BOOLEAN | v9/v10/v11 起双方言已分型 |
| `INTEGER PRIMARY KEY AUTOINCREMENT` | `BIGSERIAL`/`SERIAL` | events、command_audit、audit_events |
| FTS5 虚表 + 触发器 | tsvector 生成列 + pg_trgm GIN | v4;中文子串走 trigram |
| `vec BLOB` | `BYTEA` | pgvector 类型切换在 U6,不在本映射 |
| `<data>/artifacts/` 工件对象 | 本期仍本地目录 + PG 清单 | 共享对象存储在 U5/U9 |
RDM 独立业务库与旧 Agent-System 治理库**不在**本映射内;迁移工具(U4)只处理
Backend 库,非空目标拒绝、同快照才可续传。
## 4. 容量合同(验收目标,非性能结论)
方案 §3 的量化指标(100 在线 / 300 SSE / 20 执行中 Agent / P95≤300ms 等)是
**待验证合同**。区分两个计数:**接纳的 run 数**(进入队列)与**执行许可**
(同时真正执行,含子代理、初始全局 20、每用户 2、索引 4);等待子代理/HITL 的
父 run 让出执行许可、保留会话所有权。压测在 U7 执行并绑定组件 SHA 出证。
## 5. 隔离测试库/目录/端口方案
| 资源 | 约定 | 生命周期 |
|---|---|---|
| 本机 PG 实例 | `scripts/svc.sh db create collabtest --port 8897 --tag test` | svc.sh 管理;用毕 `svc.sh collabtest stop` + `rm --purge` |
| 测试库/扩展 | 库 `agent_test`;`pg_trgm` 预装 public | 测试辅助幂等预装;CI 启动步显式预装 |
| 用例 schema | `t_*` / `pgbus_*` 前缀,随机名 | 每用例建、Cleanup 级联删 |
| 本机 Redis | `redis-server --port 6399 --save '' --appendonly no` | 纯内存、用毕即停 |
| CI | job `test-pg`:apt 安装 PG16+pgvector+Redis,端口 5432/6399 | 每次 PR 必跑;缺服务失败不跳过 |
本地跑真实库门禁:
```bash
export AGENT_PG_TEST_DSN="$(scripts/svc.sh db dsn collabtest --db agent_test --reveal | tail -1)"
export AGENT_REDIS_TEST_ADDR=127.0.0.1:6399
make test-backend-pg
```
禁止对共享/现役实例(如 `runtime/dev` 的库)跑测试;DSN 不入命令历史与任务卡。
## 6. KTD14 副本保护与保留合同
- 备份/导出/WAL/测试副本使用专用数据库角色(非应用角色),存放于受限目录
(0700,非工作区);传输与静态备份加密,解密材料存独立受管秘密存储。
- 保留期限:迁移演练副本用毕即删,最长 7 天;正式备份保留 30 天滚动 +
每月 1 份年度副本(待正式实例指定后确认)。
- 日志/报告只留统计与哈希:不落 DSN、密钥、文档正文;测试一律用脱敏数据。
- 恢复演练:每次演练恢复到新目标并核对应用可用与权限/文件完整性;
「备份命令成功」不等于可恢复。
- 阻塞项:正式导出前,未知 owner 的数据、未定位的权威文件、缺失的保留期限
任一存在即阻塞(不静默继续)。
## 7. 暂态 Worker 文件分类
| 类 | 内容 | 处置 |
|---|---|---|
| 可重建 | 构建产物 `bin/`、`node_modules/`、测试数据目录、`__pycache__` | 随时删除重建 |
| 必须迁移 | SQLite 库、`artifacts/` 工件、`.agentx/checkpoints.jsonl`、Squad FileStore/续跑标记 | U4 迁移 + 联合备份;U5 前禁止跨机接管 |
| 只读参考 | svc.env(600)、history.jsonl | 保留在实例目录,不入副本外流 |
## 8. 已知边界(诚实清单)
- CLI 子命令(apikey/user 等)不校验 tier;team 档语义只在 `serve` 入口强制。
- 迁移仍随启动执行(已原子 + 锁化);完全独立的 migrator 入口留待 U4 工具。
- 多实例安全**未**因此声明(R4/U5);本档只交付单实例 team 档与真库门禁。
- pgvector 扩展已安装 ≠ 启用;向量检索仍是应用内扫描(U6)。
## 9. 执行预算与动作授权(U3 切片 2 已实施)
### 执行许可(admission,R8)
- 设置键:`runtime.execBudgetGlobal`(全局并发执行上限,含子代理;0=不限,
默认)、`runtime.execBudgetPerUser`(每租户上限;0=不限)、
`runtime.execQueueMax`(待执行队列上限,默认 200)。数值为容量合同初值,
U7 压测后调整。
- 语义:会话回合与子代理同池计数;账本在数据库(`admission_leases`,PG 咨询
锁下原子清点),多实例天然共享;队列满时 API 在落库前 429(不写数据);
父 run 同步等待子代理或等待 HITL 时让出执行许可、保留会话所有权,恢复
执行重新获取——额度占尽时父子不互等。
- 接纳与执行分别计数:队列深度(接纳)与活跃租约(执行)是两个量,
诊断分别看 `Manager.QueueDepth()` 与 `store.ActiveExecutionSlots()`。
### KTD13 动作授权矩阵与公开契约兼容计划
矩阵(宿主侧 `server.ProjectAction`):
| 动作 | 语义 | 未注册 action-aware 时 |
|---|---|---|
| read | 读取项目资源(会话/消息/检索/下载) | 回落旧 EXT-8 只读适配器(兼容现网) |
| edit | 写入与修改 | **默认拒绝** |
| approve | 审批(HITL/命令确认) | **默认拒绝** |
| execute | 触发执行 | **默认拒绝** |
| admin | 管理 | **默认拒绝** |
规则:action-aware 适配器(组合根注入 `SetProjectActionAuthorizer`)注册后
对全部动作权威、出错 fail-closed;旧只读适配器不得自动获得写入能力。
**公开契约兼容计划**(后续版本落地):以版本化扩展把动作级判定并入
EXT-8 的 `ProjectAuthz` 公开契约(新增 action 参数的变体接口 + 契约版本号),
下游适配器按动作逐一声明能力;未声明动作保持默认拒绝,与宿主侧矩阵同语义。
旧 bool 契约在该版本内继续可用(映射为仅 read);Core/Host 与下游适配器
(RDM 的 ProjectAuthz 实现)一起验收,不另建成员权威。
## 10. SQLite → PostgreSQL 切换与恢复演练(U4 已实施)
工具:`make build` 产出 `bin/storage-migrate`(受管迁移入口;只处理 Backend 库,
不执行 SQLite dump 作为 PG SQL)。三个子命令:
```bash
# 1) 只读盘点:schema 版本、完整性、逐表计数、工件清单与哈希(§6.1)
storage-migrate inventory --source runtime/dev/data/agent-system.db \
--artifacts runtime/dev/data/artifacts --out inv.json
# 2) 一致性快照:VACUUM INTO(在线安全含 WAL)+ 可打开校验 + 逐表计数对账(§6.2)
storage-migrate backup --source runtime/dev/data/agent-system.db --out snap.db
# 3) 受管迁移:目标建 schema/扩展后按行复制;身份登记 + 逐表校验和 + 终验(§6.3)
storage-migrate migrate --source snap.db --target "$DSN" \
--migration-id <名> --artifacts runtime/dev/data/artifacts --out report.json
```
迁移身份与续传:`migration_id + source_snapshot_id(快照 SHA-256)+
source_schema_version` 登记在目标 `migration_control`;**仅同一冻结快照可续传**
(换快照/换身份均拒绝);目标业务表已有数据而身份为空即拒绝(不覆盖)。
校验与报告:逐表源/目标计数与主键序哈希链校验和(布尔列按目标 schema 对称
归一);复制后推进 SERIAL 序列;未知 owner(users 之外,''/'local' 单租户默认
除外)阻塞迁移;报告只含计数/校验和/清单哈希——无 DSN、密钥与行正文(KTD14)。
类型映射以目标 schema 为准(SQLite 0/1→BOOLEAN、BLOB→BYTEA、生成列不迁、
FTS5 影子表不迁——PG 侧生成列与索引自动重建);`admission_leases` 为运行态
不随迁。
### 切换顺序(正式窗口须另行授权;当前仅隔离演练已验证)
1. 固定源制品与路径,`inventory` 盘点;指定迁移 owner、窗口、回退判据。
2. `backup` 冻结快照(活跃 WAL 库不得只拷 `.db` 文件)。
3. 预演:独立测试目标 PG 上 `migrate`,核对报告全绿;预演库不作为正式目标。
4. 正式窗口:停新写 → 等待/收口在途 run(未知副作用记 recovery hold)→
停旧写者 → 终快照 → 空正式目标 `migrate` → 报告全绿。
5. 单入口切 team 档冒烟(登录/项目/会话/审批/检索/下载);fail-closed 不回 SQLite。
6. **PG 接受新写入前**可撤回;**之后**禁直切回旧 SQLite(向前修复或专项回迁)。
备份基线(正式目标启用后):pg_dump 逻辑备份 + pg_basebackup 物理基础备份与
WAL 归档/PITR;pg_dump 不能作 WAL 回放基础。每次演练恢复到新目标并核对。
+2 -1
View File
@@ -36,7 +36,7 @@ agent-system config explain [--config envs/prod.json] # 只读诊断:逐字
agent-system version
```
启动参数四源合并,优先级从低到高:**内置默认 → 配置文件(`--config`,显式 JSON,无自动发现)→ 环境变量(`AGENT_SYSTEM_ADDR/DATA/PLUGINS/DSN/ARTIFACTS/AUTH/MOCK`)→ 命令行**;未显式传入的命令行参数不参与覆盖,删除 override 恢复继承。字段:`addr`(监听)、`data`(工作区根目录)、`plugins`、`dsn`(空 = 嵌入式 SQLite 档,非空 = PostgreSQL 档)、`artifacts`、`auth`(auto/on/off)、`mock`;未知键与类型错误在启动时定位报错,不静默失效。
启动参数四源合并,优先级从低到高:**内置默认 → 配置文件(`--config`,显式 JSON,无自动发现)→ 环境变量(`AGENT_SYSTEM_ADDR/DATA/PLUGINS/DSN/ARTIFACTS/AUTH/MOCK`)→ 命令行**;未显式传入的命令行参数不参与覆盖,删除 override 恢复继承。字段:`addr`(监听)、`data`(工作区根目录)、`plugins`、`dsn`(空 = 嵌入式 SQLite 档,非空 = PostgreSQL 档)、`artifacts`、`auth`(auto/on/off)、`mock`;未知键与类型错误在启动时定位报错,不静默失效。team 部署档(`tier`/连接预算键)与真实数据库门禁见[团队存储运行手册](team-storage.md)。
**多环境启动**——仓库自带隔离示例 `envs/{dev,test,prod}.json`(data 根与 DB 互不重叠):
@@ -44,6 +44,7 @@ agent-system version
agent-system serve --config envs/dev.json # mock 开、./data-dev
agent-system serve --config envs/test.json # 127.0.0.1:8788、./data-test
agent-system serve --config envs/prod.json # PostgreSQL 档、auth on、独立卷
agent-system serve --tier team --dsn "$DSN" --auth on # team 档:缺 DSN/未认证拒绝启动,PG 故障拒绝就绪(见团队存储手册)
AGENT_SYSTEM_CONFIG=/etc/agent-system.json agent-system serve # 环境变量定位文件
```
@@ -8,7 +8,7 @@
| 面 | 标识 | 规则 |
|---|---|---|
| 插件清单 | `apiVersion` | 接受 `1.0` 与 `2.0-experimental`。其他值整包拒绝(fail-closed) |
| 公开 Go 包 | `extension.SurfaceVersion` | `2.0.0-experimental`。实验窗口内允许破坏性调整,但必须改契约快照并在提案里写一句 |
| 公开 Go 包 | `extension.SurfaceVersion` | 实验系列 `2.x.0-experimental`(2026-10-09 v0.2.0 时为 `2.5.0-experimental`,每次加法升次版本号)。实验窗口内允许破坏性调整,但必须改契约快照并在提案里写一句 |
| HTTP API | 路径前缀 `/api/` 与 `/host/v1/` | 已发布路径只加字段,不改语义、不删字段。新能力用新路径 |
弃用:公开符号先标记注释 `Deprecated:`,至少一个下游可升级的版本之后才删除。实验窗口内的删除仍要改快照测试,不能静默。
@@ -45,10 +45,11 @@ replace agent-system-core => ../Agent-System-Dev/modules/core
## 5. 发版命令(owner 执行,本次未执行)
tag 名以 V1.2 实施推进方案批复的 `v0.2.0` 为准(2026-10-05 对齐;五仓 backend/core/frontend/ui/Dev 同打):
tag 名以 V1.2 实施推进方案批复的 `v0.2.0` 为准(2026-10-05 对齐;五仓 backend/core/frontend/ui/Dev 同打)。
具体提交、tag 消息与核对命令以 [v0.2.0 发版记录](../records/2026-10-09-base-v0.2.0-release.md) 为准(消息里的 SurfaceVersion 写发版时的实际值):
```
git tag -a v0.2.0 -m "extension surface 2.0.0-experimental"
git tag -a v0.2.0 <该仓对应提交> -m "<发版记录里的消息>"
git push origin v0.2.0
```
@@ -9,6 +9,7 @@
- **希望符号**:`pkg/extension` 新增 `Request` / `Handler` / `Host`(owner 作用域宿主句柄最小集)与 `Registry.AddCommandHandler(spec, h)`;基座侧配套 `cmdbus.Bus.RegisterPluginCommand`。
- **为何现有注册点组合不出来**:`RegisterPluginCommands` 仅登记 spec;`HostClient` 走 sidecar HTTP 且需要进程内不可得的 host token;owner 作用域必须由基座在分发时构造,插件无法自造。
- **兼容**:只加符号与方法,不改既有路径语义;`SurfaceVersion` 保持 `2.0.0-experimental`,实验窗口内的接口调整以本提案为记录。
(2026-10-09 注:此后 EXT-8/9/11/12 与执行原语硬开关按 compat-policy 逐次加法升级,v0.2.0 发版时为 `2.5.0-experimental`,见 [v0.2.0 发版记录](../records/2026-10-09-base-v0.2.0-release.md)。)
## 2. 公开面变更(surface.txt 12 → 15 项)
@@ -0,0 +1,86 @@
# 智能体工作流质量改进:诊断、裁定与分期计划
状态:**已获实施授权(2026-10-09,六项裁定见 §3)**;owner:weichen;
主任务:Dev 仓 `feature/agent-quality-phase01`(Phase 0+1 首个增量)。
撰写日期:2026-10-09。诊断依据:dev 实例真实运行转录(PG pg1 13 次 run + 旧
SQLite 53 次,共 62 条助手消息、263 次工具调用;模型 MiniMax-M2.7-highspeed,
direct 入口),对照本机 ZCode v3.14.3 源码与 codex/opencode/pi/Kimi CLI/Cursor
公开资料(2026-10-09 抓取)。诊断证据级别 SELF(本地观察与复算)。
本文件是该改进方向的主记录:目标、裁定、分期与验收以本文为准;
各阶段实施细节与结果记在对应任务卡,不回写复述。
---
## 1. 问题陈述
与 codex / pi / kimi / cursor / zcode / opencode 相比,本系统直连对话路径在
「工作细致、详细、完善」上存在可测差距。真实转录中定位到的失败链(均已复核):
1. **信息逐轮衰减**:跨轮上下文由界面消息有损重建——工具结果只回放 160 字
摘要、参数截断、二进制原件占位、思考内容丢弃;上传材料只在「本轮」注入。
后续轮次在摘要的摘要上工作,细节靠编造补齐(实测:「详细方案」中 85%/95%
准确率、8000–10000 字等数字在原始转录中不存在;日期星期错配)。
2. **修改模型倒挂**:交付物由一次性整段生成脚本产出(docx 无源文件),任何
修改=整篇重写重跑(实测一轮 24 次工具调用 9 次失败、6KB 脚本重跑 8 次)。
3. **检查失效且误报**:终轮评分的 lint 子进程无 PYTHONPATH 而静默失败(同一
docx 带 PYTHONPATH 9 个 error,评分器里 0 个);终轮检查重评已被替代的旧
工件导致死循环;可读性规则把表格单元格「项目概述撰写」判成栏目式标题;
历史工件渲染格式 `[产出工件 …]` 与伪造标记检查同形,模型照抄即被拦。
4. **最终答复与事实脱节**:composeFinal 只见 160 字摘要,产出了不存在的章节
列表和「我会调整后再提交」类未兑现承诺。
5. **过程性根因**:无任务级评测。任务卡验证=单测+mock,真实模型被列为非目标;
evalgold 只有 1 条规则,eval/ab.go 无运行记录。
## 2. 根因归纳(按影响排序)
1. 上下文保真度不足(影响最大)——产品没有把内核的追加式会话记录当权威上下文。
2. 工具与修改流程不适合交付物领域——没有「读源码→精确改→编译→看诊断」的对应物。
3. 质量控制是事后把关而非让模型自己做好,且把关本身不可靠。
4. 行为指引薄弱(何时建计划/失败换路/坚持到完成),工具描述只有一行。
5. 没有以真实模型结果为准的评测回路。
内核能力(read/edit/grep/glob、超长落盘、压缩、会话树)大多已在 agent-native
就位,问题主要在产品组装层(`modules/backend/internal/runtime|ctxasm|quality`)。
## 3. 用户裁定(2026-10-09,授权实施)
| # | 事项 | 裁定 |
|---|---|---|
| 1 | 直连对话开放工具与能力 | **开放,尽可能实现和开放所有的工具和能力**(推翻 2026-09-30 预览案「fs 工具实现但不默认提供」的默认关闭裁定) |
| 2 | 跨轮上下文以内核会话记录为准 | **同意**(重新生成/排除/回滚映射为会话树分支操作) |
| 3 | 交付物 Markdown 源码化 + 构建器 | **可以,但必须保留生成各类文件(docx/xlsx/pptx/pdf/图片等)的能力** |
| 4 | composeFinal 与关键词评分降级 | **按建议**:Phase 2/3 落地后 composeFinal 默认关闭(仅异常兜底);关键词评分移出拦截路径、只作评测指标 |
| 5 | 更强模型评测 | **可以,预算无上限** |
| 6 | 行为面改动须附真实模型评测 | **按建议**:写入 Dev 仓 policy/delivery.md |
## 4. 分期与验收
每阶段独立任务卡 + PR;改动提示词/工具/上下文/门禁的 PR 须附 eval/live
真实模型前后对照(裁定 6)。评测口径:`modules/backend/eval/live/`
(golden 任务集 + 指标:工具失败率、整篇重跑数、是否读原件、计划使用率、
检查误报/死循环、终轮与工件一致性、未核实数字)。
| 阶段 | 内容 | 验收 |
|---|---|---|
| **P0 评测基线** | eval/live 运行器 + tasks.json + 指标报告;before/after 各跑一次 | 基线报告能复现 §1 失败链 |
| **P1 缺陷修复** | §1.3 的检查失效与误报七项 | 检查误报清零;两条死循环链消失 |
| **P2 上下文保真** | 内核会话记录为权威跨轮上下文;窗口按模型真实窗口(token,实测校准);被清结果落盘留路径+预览;上传材料持久 `inputs/*.md`;交错思考模型回传 `<think>`;接上 9 段压缩模板 | 后续轮 100% 读原件;「更详细」不整篇重写;未核实数字显著下降 |
| **P3 工具开放 + 交付物源码化** | 内核 read/edit/grep/glob 接入直连(沙箱=会话工作区);交付物 = Markdown 源文件 + `housestyle.build` 确定性渲染(自动 lint,诊断指向源行);写入即诊断;`housestyle.api` 签名查询;保留 run_python 全类型生成能力(裁定 3) | 工具失败率 ≤8%;修改请求整篇重建 ≤1 次;API 幽灵调用消失 |
| **P4 行为指引** | 基座提示词「工作方法」段(建计划/失败两次换路/先查 API/坚持到完成/结论先行终稿);重写高频工具描述;计划提醒常开;按模型分提示词(先 MiniMax) | 多步任务计划使用率 ≥80%;终稿承诺未兑现清零 |
| **P5 门禁精简** | 拦截型检查只留硬事实(工件存在/lint 零 error/引用存在);新增事实一致性检查(数字/日期/人名回溯材料);验证器按需触发+异模型 | 检查死循环 0;未核实数字显著下降 |
| **模型 A/B** | 同一评测集换更强主模型对照(裁定 5,无预算上限) | 区分模型与 harness 各自的贡献,输出选型建议 |
## 5. 不在本文范围
- 操作系统级沙箱、多租户隔离策略(沿用现状与既有声明)。
- 小队(squad)路径的同批改造——先修直连主路径,squad 经 A/B 对照跟进。
- AGENTS.md/DESIGN.md 层面的仓库治理变更。
## 6. 记录与证据
- 诊断细节与复现命令:2026-10-09 会话记录(本文件只留结论与指针)。
- before 基线:`eval-live/before-main-1ebd46e.json`(任务卡 evidence 引用)。
- 关联:[Agent 栈总案](2026-10-02-agent-stack-completion.md)(库分期不受本文影响)、
[文件预览与保留能力](2026-09-30-file-preview-and-reserved-capabilities.md)(其 §2.3
的 fs 工具默认关闭裁定被本文裁定 1 推翻,以本文为准)。
@@ -0,0 +1,124 @@
# EXT 申请包 · G1:回合内共享检索、命令即工具、项目列表共享与执行后端接口(B-1/B-2/B-3 + B-5②)
状态:**proposed(2026-10-09)**;owner:weichen;需求依据 = RDM 评审与实施方案 V1.1
(`Agent-System-RDM docs/proposals/2026-10-09-V22-review-and-implementation-plan.md` §3.3/§3.4/§5.3,
owner 2026-10-09 Q1–Q8 批复;Q4=方案 A,Q2=暂时禁用+隔离档)。
撰写日期:2026-10-09。配套:[扩展面兼容与演进](2026-10-01-extension-compat-policy.md)、
[EXT 申请包 C1–C7](2026-10-08-ext-c1-c7-rdm-shared-contracts.md)(EXT-6…EXT-12)。
## 0. 总则
- 本包四条申请按既有序列顺延 **EXT-13…EXT-16**;最终编号以受理评审为准。
- 分期(对齐 RDM 方案 §5.2):B-1(EXT-13)与 B-3(EXT-15)为 **G1 序 4 的硬前置**
(成员智能体看不到项目知识 = R04 路径不通);B-2(EXT-14)为 G2/V0.1 端到端的硬前置
(对话入口无法触达 `rdm.*`);B-5②(EXT-16)为 G2-8 原型的前置。
- SurfaceVersion 影响:EXT-14 触及 `pkg/extension` 导出面(命令规格新字段)→ 需升
SurfaceVersion 并同步 surface.txt;EXT-13/15/16 为 internal 行为扩展,不改导出面
(EXT-16 若只加 `Options` 字段则属加法,见 §4)。
## 1. EXT-13(←B-1)回合内共享检索:智能体的检索遵循项目共享授权
- **场景**:RDM R04/R05——成员 B 的智能体在**回合内**(ReAct 循环的 `knowledge_search`
工具与自动知识注入)必须能检索到成员 A 已发布的项目知识;现状只能看到本人 owner 的
知识。HTTP 面(`/api/…/search`)已走 `RetrieveShared`(EXT-8 余项,Dev #269/#273),
但回合内两条路径仍是 owner-only:
- `internal/runmgr/runmgr.go:726-736` `runCtx.Retrieve` → `retriever.Retrieve(ctx, c.run.Owner, q)`(owner-only);
- `internal/app/hostcaps.go:64-66` `hostcaps.search`(进程内 `Host.KnowledgeSearch` 底座)→ `pipe.Retrieve(owner)`(owner-only)。
结果:同一个成员,页面搜索能看到共享知识,**智能体对话里看不到**——「所有用户的智能体
应当能够看到项目级的共享信息」(用户补充材料 §2树1图)走不通。
- **希望公开面**:组合根把 EXT-8 适配器(`Server.ProjectAuthz` 同款判定函数)注入
runmgr 与 hostcaps:两条检索路径在本人 owner 两路(全文+向量)如常之外,追加
「经适配器放行的共享两路」——与 HTTP 面 `rag.Pipeline.RetrieveShared` 完全同一实现与
同一授权判定(复用 `sharedVisible`/`SearchKnowledgeShared`,不另造第二套语义)。
进程内 `Host.KnowledgeSearch` 同步走共享版。
- **为何组合不出**:`RetrieveShared` 已存在,但 runmgr/hostcaps 没有适配器的引用——
适配器槽在 `internal/app/hostcaps.go` 的 `projectAuthz`,由组合根在装载扩展后注入
Server;runmgr 的构造早于扩展装载,且 `Manager` 无该依赖。下游无法经任何公开面把
「按 owner 判定共享」的回调递进回合执行路径。
- **兼容方式**:适配器未注册=现状(本人两路);注册后共享命中追加、RRF 融合。
不动 `pkg/extension` 导出面,SurfaceVersion 不变。
- **验收**:同项目两人+另一项目一人(RDM 成员表桩):成员 B 发起对话,模型经
`knowledge_search` 命中 A 已发布的知识切片(共享命中出现在工具结果);未授权者与
跨项目者为零命中;`Host.KnowledgeSearch`(hostapi 与进程内两形态)行为一致;
未注册适配器时与现状逐字节一致(回归)。
## 2. EXT-14(←B-2)插件命令即工具:`exposeAsTool`(Q4 方案 A)
- **场景**:RDM V0.1 端到端(C-11)要求「从空项目创建到生成项目建议书,全对话完成」;
RDM 的全部能力(两树一网读写、上传、起草、追溯查询)都登记为 `rdm.*` 命令,而智能体
回合的工具清单里没有任何插件命令——模型既不能检索笔记树,也不能发起 `rdm.draft.compose`。
U0 §3.3/方案 §3.3 裁定走**方案 A**:命令经命令总线暴露为工具,四入口同源
(button/card/slash/chat)自然延伸出第五入口「智能体」。
- **希望公开面**:命令规格(`agentcommand.CommandSpec` 经 `Registry.AddCommandHandler`
登记的 JSON)新增可选字段 `"exposeAsTool": {"risk": "low|medium|high"}`(缺省不暴露)。
runmgr 装配工具清单时,把带该字段的命令投影为工具描述(名称=命令 id,参数=命令
paramsSchema);模型调用该工具时,**不分发为工具执行,而是构造 `cmdbus.Request` 经
命令总线分发**(Entrance="agent",Actor=会话 owner,ConversationID=当前会话)——
同一审计信封、同一 HITL 内联确认卡(`risk=high` 或命令规格要求确认时照常弹卡)、
同一危险分级。
- **为何组合不出**:`Registry` 只有 AddSkill/AddCommand/AddCommandHandler/Note/
RegisterResourceAuthorizer;工具注册表(`tools.Registry`)与命令总线之间没有任何
桥接;MCP 通道(方案 B)绕过命令总线与确认卡,与 SR-E6/HITL 门禁冲突,已被 Q4 否决。
- **兼容方式**:`pkg/extension` 命令规格加可选字段=导出面加法,SurfaceVersion 升
(建议 2.6.0-experimental)+ surface.txt 同步。缺省(不写 exposeAsTool)=现状零差异。
- **验收**:带 `exposeAsTool` 的 `/rdm.ping` 出现在模型工具清单且调用返回回执,
审计信封 Entrance="agent" 与按钮入口同源;`risk=high` 的暴露命令在对话内触发内联
确认卡;不带字段的命令不出现;RDM 侧 `rdm.trace`/`rdm.baseline` 等只读命令可在
回合内被模型调用(成员 B 场景结合 EXT-13)。
## 3. EXT-15(←B-3)项目列表与建会话的共享放行(SR-G10)
- **场景**:RDM R03——成员 B 被加入项目后「界面自动出现该项目,可直接开始工作(新建
对话)」。基座 `projects` 表按 owner 硬隔离(`store/projects.go:22-34`):
- `GET /api/projects`(`server.go:438-441` `listProjects`)只返回本人 owner 的项目——成员看不到共享项目;
- `POST /api/projects/{id}/conversations`(`store/projects.go:124-130`)校验「项目属于请求者」——成员在共享项目下建会话被 404。
EXT-8 已放行的入口(工件三入口、SSE 项目流、检索)不含这两处。
- **希望公开面**:这两处入口在 owner 自有判定未命中时咨询同一 EXT-8 适配器:
`listProjects` 追加经适配器放行的项目(去重、标注 `shared: true` 字段供前端区分
展示);`CreateConversation` 的归属校验放宽为「本人自有 **或** 适配器放行」。会话
本身仍归属创建者(owner 不变),只是创建权扩展到成员。
- **为何组合不出**:`ListProjects(owner)` 的 SQL 按 owner 过滤,无回调;建会话校验在
store 层硬编码。与 C4(EXT-8)同因:纯下游无法改变基座 owner 过滤。
- **兼容方式**:未注册适配器=现状;放行结果带审计。internal 行为扩展,SurfaceVersion
不变。
- **验收**:成员 B 的 `GET /api/projects` 含共享项目(shared 标注)且不含未授权项目;
B 在共享项目下 `POST conversations` 成功、会话 owner=B;撤销成员后两者立即拒绝;
项目拥有者视角无任何变化。
## 4. EXT-16(←B-5②)执行后端接口:隔离执行档(Q2 阶段二,G2-8 原型)
- **场景**:Q2 裁定「暂时禁用,但后续执行任务时肯定还是要代码执行能力」。v0.2.0 已
交付启动级硬关闭(`Options.DisableExecTools`,Backend #110);隔离档是恢复执行能力的
路径:执行的是**模型生成的代码**,须按不可信代码对待(方案 §3.4):只读系统根、仅挂
会话工作目录与技能目录、默认无网、cgroup 资源限额、硬超时、按项目 venv 只读挂载;
本机已实测 `bwrap --unshare-all` 可用(无特权 userns 被 AppArmor 限制,bwrap 专门
策略放行)。
- **希望公开面**:`internal/tools/exec_interpreter.go` 的进程启动点抽象为「执行后端」
接口(`ExecBackend`:`Run(spec) → result`),启动参数选择后端:
`ExecBackend = direct | sandbox`(缺省 direct=现状)。sandbox 后端以 bwrap 实现
(资源限额经 systemd-run/cgroup v2)。`extension.Options` 增加
`ExecBackend string`(加法;空=direct)。`DisableExecTools` 保留为最终兜底,优先级
高于后端选择。
- **为何组合不出**:现实现直接 `exec.Command`(`runInterpreter`),无后端抽象;沙箱
参数组装(bind 清单、网络命名空间、限额)属平台面,下游插件无法注入。
- **兼容方式**:缺省 direct=逐字节现状;`Options` 加字段=SurfaceVersion 升。RDM 在
G3-7 才切换 sandbox;G1–G2 期间维持 `DisableExecTools=true`。
- **验收**:sandbox 后端下逃逸负例全部被拦——读 `~/.secrets`、读其他会话目录、访问
外网、fork 炸弹、超时不可杀均为拒绝/杀灭;会话工作目录内 docx 生成任务成功且产物
可登记;direct 后端与现状一致(回归)。
## 5. 不在本申请包(显式排除)
- EXT-6/7/10/12 完整形态:仍在 C1–C7 包(EXT-6…12)受理轨道,节奏不变。
- 提示词随执行可用性切换(`base.deliverables` 在禁用期的降级文案):基座自有任务,
不占 EXT 编号。
- UI 仓 nightly runner 修复:与代码无关(rolldown 原生绑定缺失),另立任务。
## 6. 受理建议
| 申请 | 内容 | 优先级 | 兼容 |
|---|---|---|---|
| EXT-13 回合内共享检索 | G1 序 4 硬前置(R04/R05) | **P0 最先** | 不变(internal) |
| EXT-15 项目列表/建会话共享 | G1 序 4(R03/SR-G10) | P0 | 不变(internal) |
| EXT-14 命令即工具 | G2/V0.1 端到端硬前置(Q4 方案 A) | P1 | 升(加字段) |
| EXT-16 执行后端接口 | G2-8 原型(Q2 阶段二) | P1 | 升(加字段) |
@@ -0,0 +1,242 @@
# 子代理分工、模型分级路由与任务沙箱:调研与方案
状态:**proposed(2026-10-10)**;owner:weichen;方向来源:用户 2026-10-10 会话
(①充分利用子代理;②复杂任务用 dmxapi 的 Sonnet/Opus,常规任务用 MiniMax-M2.7-highspeed;
③记录并规划毫秒/亚秒级任务沙箱,**暂不实现**;④对「体感不如 codex/claude code/kimi」的判断)。
本文是这四件事的主记录;未经评审的部分一律为「待确认」,不因被记录而视为已批准。
依据级别:本机实测为 **SELF**(命令与输出见任务卡 evidence 与 §7 复现脚本);外部资料为
一手页面抓取(访问日 2026-10-10,URL 在 §8);推断明确标注「推断」。
## 0. 结论先行
1. **方向对,落点要改。** 子代理只在「读多写少、可并行、输出冗长」的环节净收益为正;
交付物的写作与关键决策保持单线程(单一写者)。把复杂任务**整单**交给 Claude,会把最贵、
最慢的模型放在 token 最多的工具循环里——A/B 里 opus-5-5 耗时约 4.7 倍、工具失败更多。
证据更支持**按阶段/角色路由**:Claude 只做 token 少、杠杆大的环节(复杂任务的规划简报、
终稿综合、独立核查),检索、阅读、抽取、跑 Python、排版留给 MiniMax。
2. **「体感差」不能主要归因于 MiniMax。** 同一模型换 harness 的分差与相邻代际换模型同量级
(MiniMax-M2.1 换 harness 差 7.0 分;同 harness 换成 Opus 4.5 差 3.9–7.4 分 [H11])。
本机实测还发现两处直接拖累体感的协议层问题(§1.2),应先修再下结论。
3. **「编造数字」更像模型属性,但可以用机制压住。** 同 harness 下 7→0 支持这一点;但
24 个相关观测里「0 处」的 95% 置信上界约 12.5%,不足以宣称清零(§1.3)。数字溯源闸门
比换模型便宜,且两者可叠加。
4. **沙箱:现在的需求表述里有三处需要修正**(§4.1)——overlay 不是快照、快照只是把冲突
推迟到合并、「立即销毁」必须先留存审计材料。修正后,本机条件下 **bwrap + 冻结基底 +
overlay** 能做到约 7ms 启动(实测),足够作为默认档;microVM 档只在需要更强隔离时启用。
## 1. 现状核实(SELF,2026-10-10)
### 1.1 已有能力(源码,backend `421fee8`,其 deps/agent-native `3b92cb6`)
| 能力 | 现状 | 位置 |
|---|---|---|
| 子代理委派 | 模型可调 `delegate_task`,参数 `agent∈{general,explore,research,plan,verify,writer}`、`task`、`background`;深度 1(子不能再派) | `internal/runtime/llm.go:310`、`internal/runtime/llm_direct.go:668`、`internal/runmgr/runmgr.go:1462` |
| 子代理模型 | 由画像 frontmatter 决定:`writer` 用 `chat` 档,其余 7 个用 `lightweight` 档;调用方**不能**指定模型 | `internal/prompts/library/agent-sub-*.md`、`internal/runtime/sub_loop.go:48` |
| 模型档位 | 只有两档:`models.chat` 与 `models.lightweight`(轻量档空则回落主档),另有 `models.chat.fallbacks` 回退链 | `internal/runtime/model.go:54,84`、`internal/settings/settings.go:73-84` |
| 评审/验证 | `review_findings` 并行 1–3 个审查子代理再逐条验证;验证子代理输出 `VERDICT` | `internal/runtime/llm.go:311`、`agent-sub-verify.md` |
| LLM 协议 | 后端恒走 OpenAI chat 协议(`openLLMClient` 不设 `Protocol`);内核已实现 Anthropic Messages 客户端(含 `cache_control`)但**产品未接线** | `internal/runtime/llm.go:491`、`deps/agent-native/runtime/llm/anthropic.go` |
| 工具并行 | 内核支持 `ExecParallel`,直连路径未设置 → 默认**串行**执行同一回合的多个工具调用 | `deps/agent-native/runtime/loop.go:203,596`、`internal/runtime/llm_direct.go:268` |
| 执行隔离 | EXT-16:`run_shell`/`run_python` 可选 bwrap 档(断网、只读根、tmpfs 遮蔽 `/home` `/tmp`、仅会话目录可写、ulimit、超时杀命名空间);缺省 direct | `internal/tools/exec_backend.go` |
### 1.2 本机实测发现的问题
| # | 发现 | 影响 | 证据 |
|---|---|---|---|
| F1 | **子代理结论被压成 160 字**:直连路径 `delegate_task` 只把 `res.Summary` 回给父,而 `Summary` 是子代理全文的前 160 字(全文在 `res.Text` 里,被丢弃) | 子代理做完的检索/调研结论,父代理只看到开头一句;这与「上下文防火墙」的用法正好相反,也会诱发父代理凭摘要补细节 | `llm_direct.go:697-700`、`runmgr.go` finishChild(`Summary = truncate(fullText, 160)`) |
| F2 | **MiniMax 思考内容混在正文流里**:OpenAI 兼容流式接口默认把思考放进 `content` 的 `<think>` 块;后端在回合结束时才剥离 | 回合进行中前端收到的 `message.delta` 先是一大段思考原文,界面上「正文」区域先显示推理过程;思考计时也不准。官方提供 `reasoning_split=true`,实测开启后思考改走独立的 `reasoning_content`/`reasoning_details` 字段(3/3 次),TTFT 中位数 0.69s | `llm_direct.go:418-475`;probe2 实测(§7) |
| F3 | **sandbox 档下交付物生成跑不通**:python-docx/openpyxl/python-pptx 装在 `~/.local`,被 `--tmpfs /home` 遮蔽;`run_python` 描述里「缺失时 pip install --user」在断网档也失效 | RDM 计划 G3-7 切 sandbox 时,docx/xlsx/pptx 生成会直接失败;EXT-16 的「docx 生成任务成功」验收用的是 `printf` 桩,未覆盖真实库 | bench2/bench3 实测:EXT-16 同形参数下 `import docx` → ModuleNotFoundError;只读挂载依赖层后 `import docx, openpyxl, pptx` 成功 |
| F4 | **Claude 走兼容协议丢能力**:经 dmxapi/lmuai 的 OpenAI 兼容接口,4 个 Claude 型号都不返回思考字段;改走 dmxapi 的 `/v1/messages` 原生接口,第二次调用 `cache_read_input_tokens=5043`(缓存生效) | A/B 中 Claude 一侧每步按全价重算前缀、没有思考回传——47 分钟的耗时与工具失败部分可归因于此(推断,需日志确认) | anthropic_probe 实测(§7) |
| F5 | 直连路径工具串行 | 模型一次发出多个独立检索时逐个等待;4 个被测模型都能在一个回合里给出 2 个并行 tool_calls | probe 实测(§7) |
### 1.3 A/B 数据的正确读法
内部 A/B(`.task/model-ab/ab-opus.json` 对 `.task/phase05-eval/after-p5.json`,4 任务 6 回合):
MiniMax 编造数字 7、约 10 分钟、工具 97/失败 19;opus-5-5 编造 0、约 47 分钟、工具 99/失败 33。
- 样本小且相关:「0 处」的 95% 置信上界约 3/24≈12.5%(rule of three)[R39],不能宣称清零。
- 两侧都不在最佳状态:Claude 一侧走兼容协议(F4);MiniMax 一侧思考回传已实现
(`context.thinkReplay=auto`,`ctxasm.go:206`),但流式分流有 F2 问题。
- 速度:公开测速两者相近(opus-5-5 约 96 t/s [H25],M2.7-highspeed 官方约 100 TPS [H4];
本机短文本实测 48.9 对 50.7 t/s),所以 4.7 倍耗时更可能来自思考量、步数、重试与无缓存(推断)。
- Vectara 有据摘要幻觉率 M2.7 12.9%、Opus 4.6 12.2%、Sonnet 4.6 10.6% [R40]:「读懂原文」差距
不大;差距更可能出在「缺数据时去猜」(推断)。
### 1.4 其余现状(补充核实,SELF)
- 评测:`eval/live` 是 go test(env:`AGENT_EVAL_BASE` 实例地址、`AGENT_EVAL_TASKS` 过滤、
`AGENT_EVAL_TURN_TIMEOUT`),golden 任务 4 个(`tasks.json`);A/B 工具 `eval/ab.go`、`switch.go`。
- 打断/插话:有 `CancelRun`(停止按钮)与子代理中断续跑;**没有**「运行中用户输入排队、
当前工具结束后本轮送达」的 steering 队列(未找到实现)。
- 检查点:文件写入有改前快照日志(`runmgr/rewind.go` `NoteFileCheckpoint`)。
- 直连路径声明 13 个工具;提示词库 base-* 共约 6.7KB(base-deliverables 5.2KB 最大)。
## 2. 子代理分工:证据与方案
### 2.1 证据要点(外部,来源见 §8)
- **有益面**:广度优先检索(Anthropic 多智能体研究系统:主+子比单 Opus 高 90.2%,复杂查询
耗时最多降 90%,代价 token 约 15 倍 [R13]);上下文防火墙——18 个模型都随输入变长退化
[R14],子代理只回 1–2k token 摘要 [R17];fresh-context 审阅(Devin Review 均 2 bug/PR,
58% 严重 [R20])。
- **有害面**:写入耦合(并行写手风格冲突,「多代理贡献智能、写入保持单线程」是当前可行解
[R19][R20]);顺序任务 −39%~−70%、单代理基线 >45% 时加代理为负收益、无中心校验时误差
放大 17.2 倍 [R21];Claude Code 官方也建议迭代密集/共享上下文/延迟敏感时留在主会话 [R1]。
- **契约**:委派带目标/输出格式/工具面/边界/预算;回传浓缩结论 + 证据指针(文件/行),
大产物落盘只回引用 [R13][R17];限额:禁嵌套、并发 3–5、按复杂度分档 [R7][R13][R21]。
### 2.2 方案(增量,每项独立任务卡)
| # | 内容 | 验收(可判定) |
|---|---|---|
| D1 | **修 F1**:`delegate_task` 回传改为「子代理全文(上限 4k 字)+ 超长落盘 `subagent-result.txt` 只回指针 + 工件摘要行」——内核 `subagent.CapParentText` 已有此语义(backend 侧没走它) | eval/live 前后对照:父代理引用子代理结论的回合,其终稿中来自子代理的事实不再凭摘要补齐;单测覆盖超长截断 |
| D2 | **委派简报规范**:`delegate_task` 描述与 base-method 提示补「简报四要素」(目标、输出格式、工具/来源边界、完成判据),禁止把大块原文粘进 task | 提示词 diff + eval/live 计划/委派质量指标不回退 |
| D3 | **并行工具执行**:直连路径设置 `ToolExecution=parallel`(读类工具并发、写类串行的区分后续再议) | 同回合多工具调用 wall-time 下降(评测记录);事件序号仍单调 |
| D4 | **证据账本子代理**:research/explore 画像的输出格式改为「结论 + 原文引用(文件/页/行)+ source_id」,数字必须带 source_id 或 Python 计算 ID;终稿前由确定性校验拦截(接质量计划 P5 的事实一致性检查) | 编造数字在闸门处被拦且计数;子代理回传含引用率 100% |
| D5 | **角色×模型矩阵**(依赖 §3 R2):新增/调整画像的 `model:` 支持 `claude-*` 档;`writer` 保持 chat 档,新增 `composer`(终稿综合)与 `planner-complex`(复杂任务规划简报)画像走强模型档 | 画像 frontmatter 生效(SubagentSpec 解析);评测 A3/A5 组可配置 |
边界:子代理深度维持 1(现状即禁嵌套);并发上限维持产品侧 3;本方案不引入子代理间通信。
## 3. 模型分级路由:证据与方案
### 3.1 证据要点
- **整单路由不划算**:我们的 A/B 中 opus-5-5 耗时约 4.7 倍、工具失败 33 vs 19;公开测速两者
相近(§1.3)。Devin Fusion 的教训:强模型当全程主控只降本 33%,且「判断即交付物」的难题
上掉分 [R30][R31]。
- **按阶段/角色路由有正证据**:Sonnet 执行 + Opus 顾问 +2.7pp 且降本 11.9%;Haiku + Opus 顾问
在 BrowseComp 19.7%→41.2% [R32];Aider「强规划+便宜编辑」$13.29 得 64.0% 胜 o1 单跑 $186.5
得 61.7% [R12]。反例也存在(BrowseComp-Plus 上弱编排+强子代理更好 [R21])——**放哪一层必须
实测**,这正是 R3 实验的目的。
- **协议与缓存**:Claude 经 OpenAI 兼容层不回思考、不支持缓存、忽略 strict(官方文档 [H37],
本机 F4 实测缓存恢复);缓存按 tools→system→messages 前缀匹配,中途改工具集会整缓存失效
[R35][R36] → 模型切换只应发生在阶段边界,每角色固定 system/tools 前缀。
### 3.2 方案
| # | 内容 | 验收 |
|---|---|---|
| R1 | **Claude 原生协议接线**:`models.chat.protocol = openai-chat \| anthropic`(设置项),anthropic 时用内核现成的 `llm/anthropic.go` 客户端(base 指向 dmxapi `/v1/messages` 根),回传 thinking 块与 signature、挂 `cache_control` 断点、usage 记缓存读写(N3 计费拆分已有字段) | 同会话第二次调用 `cache_read_input_tokens>0`(SELF 复现 F4 的探针即验收集);thinking 块原样回传(删改会 400 [H24]) |
| R2 | **角色路由表**:设置新增 `models.<role>`(role∈composer/planner/verifier,缺省回落 chat 档);画像 frontmatter `model: <role或具体型号>`。默认建议:chat=MiniMax-M2.7-highspeed(不变)、composer=claude-sonnet-5(dmxapi,原生协议)、verifier=异模型(deepseek-v4-flash 或 claude)、复杂任务 planner=claude。Opus 系列留给最难任务手动指定 | 角色解析链单测;`models` 列表来自各端点 `/v1/models`(已核实 dmxapi 有 sonnet-4-6/sonnet-5/opus-4-6/opus-5-5 等,见任务卡 evidence) |
| R3 | **路由 A/B 实验**(扩展现有 eval/ab.go):组别 A0 全 MiniMax / A2 MiniMax+数字闸门 / A3 A2+Claude 终稿 / A4 A2+Claude 核查 / A5 Claude 规划+终稿+核查、MiniMax 执行;关键组加 Sonnet 变体。指标:无来源数字占比、含编造交付物比例、pass^3、p50/p95 耗时、分角色成本(含缓存)、工具失败分类。样本:30–50 任务×3 次(宣称编造率<5% 需 ≥60 份零编造样本 [R39]);<3pp 差异慎下结论 [R49] | 选型报告入任务卡,来源 GATE/SELF 标注 |
| R4 | **升级规则进 harness**(不依赖模型自觉 [R20]):连续 N 次工具失败、闸门拦截无来源数字、检索「未找到」三类事件触发 advisor 咨询或角色升级 | 评测中升级触发可观测;误升级率记录 |
运维事实(2026-10-10,SELF):lmuai 月额度已耗尽($1303.32/$1300,2026-11-05 重置)——R1/R3
的 Claude 侧建议先走 dmxapi(余额 ¥0.48,**需充值**,此前 A/B 卡估算全量对照 ¥50–100)。
## 4. 任务沙箱:记录与规划(**不立即实现**)
### 4.1 对原始思路的三处修正
1. **「overlay 隔离他人变更」不成立**:内核文档明确「下层在挂载期间被修改的行为是未定义的」
[S1];本机实测运行中的沙箱能看到下层后续修改(bench2 第 5 段)。**一致视图必须来自不可变
基底**(冻结副本或 git commit 物化),而不是叠在活动目录上的 overlay。
2. **快照只是把冲突推迟到合并**:Codex cloud/container-use/Cursor 都以 diff/PR 回收,冲突在
写回时用基线校验暴露 [S23][S28][S26]。「互不影响」的成本是写回时的三方合并与人工兜底,
设计里必须显式包含这一步,否则快照只是把失败挪到了最后。
3. **「立即销毁」与审计有张力**:销毁的应是计算资源与可写层;转录、diff、工件哈希、环境
清单要按 TTL 封存(Codex 删前存快照 [S23]、container-use 留命令史 [S28]、Cursor 留工件
[S26])。本仓的证据门禁(AGENTS.md)同样要求可复核输出——封存记录是硬约束。
另一处简化:硬链接克隆(cp -al)对「原子替换写入」是安全的(rename 换 inode),但对原地
写入会穿透(共享 inode)——本机实测(bench3 第 3 段)。只可作为「可检测」方案并配
sha256/mtime 清单复核,不可当作完整快照。
### 4.2 目标形态(任务工作区沙箱)
一次任务 = 冻结基底(会话/项目材料的不可变视图)+ 私有可写层 + 确定性依赖层 + 出口管控 +
回收(diff 与工件清单)+ 封存后销毁。智能体在其中任意折腾不破坏原始资料;产出经校验写回。
### 4.3 分层架构与延迟预算(本机实测,SELF)
| 层 | 机制 | 启动 | 适用 | 备注 |
|---|---|---|---|---|
| L0 进程沙箱 | bwrap(EXT-16 现状)+ 依赖层只读挂载 | **p50 7.3ms**(/bin/true,n=30);带 overlay 同为 ~7ms | 默认:解释器执行、交付物生成 | 修 F3 后 python-docx 全链路可用(import 60ms、1 页 docx 76ms) |
| L0.5 工作区沙箱 | L0 + `--overlay-src <冻结基底> --overlay <宿主upper>` | ~7ms(实测) | **多任务并发、需要一致基底与可回收 diff 时** | upper 即增量;快照语义来自冻结基底而非 overlay |
| L1 容器 | docker(overlayfs 驱动) | `run --rm` p50 142ms(redis:7 true,n=10) | 依赖隔离更强、镜像化环境 | 可加 warm pool 压冷启动;单机自托管无障碍 |
| L2 microVM | Firecracker/gVisor | 未实测;E2B 等托管方当前文档只称 "fast Linux VM"(量化数字已不可得,**未经证实**) | 不可信代码、最强隔离 | 本机有 /dev/kvm;引入与维护成本高,暂缓 |
支撑件(与层正交):
- **冻结基底**:git 材料以 commit SHA 物化(同 SHA 只物化一次、多任务只读共享);非 git 材料
用 cp -al + sha256 清单(写回前复核,变了即判基底失效)。git worktree add 实测 192 文件
11ms,overlay 直接盖工作树 ~10ms,两者都够快。
- **依赖层**:项目 venv / site-packages 只读 bind(实测修复 F3;RDM 方案 §3.4 原有此意)。
- **数据库**:SQLite 用 `VACUUM INTO` 取一致快照 [S32];PG 用零连接模板库克隆(PG18 XFS 上
有 CLONE,ext4 上是复制 [S11][S37]——量级以库大小为准,必要时评估独立 XFS 卷给 reflink)。
- **网络**:默认无网(现状);将来要放开时,按 sandbox-runtime 的形态做出口代理白名单 +
代理侧凭据注入(密钥不进沙箱)[S-RT]。
- **回收与写回**:沙箱退出后读 upper → 生成 `git diff --binary` 补丁 + 工件 sha256 清单;
写回用 CAS(目标当前哈希==基底哈希 → 原子替换;不等 → `git merge-file` 三方合并,冲突停给
人);写回前留前像。git 目标用 `update-ref <ref> <new> <old>`(本身就是 CAS)[S46]。
- **封存**:base SHA、补丁、工件哈希、转录指针、环境清单(依赖层版本)、退出码,按 TTL 留存
后销毁工作区目录。
### 4.4 与现网的关系
- EXT-16 sandbox 档是**进程级**隔离(单次命令);本节是**任务级工作区**,两者叠加而非替代。
首个落地形态:ExecSpec 增加工作区概念,sandbox 档把「会话目录 bind」换成「冻结基底 overlay
+ 私有 upper」。
- 已知缺口顺带记录:小队内核 ExecConfig、工作流 ScriptCommand 仍 direct(EXT-16 卡内遗留);
沙箱档覆盖它们是前置条件之一。
### 4.5 非目标与开放问题
- 不做多租户硬隔离与 OS 级安全声明(沿用质量计划 §5 边界)。
- 开放:是否划独立 XFS 卷换 reflink;gVisor 试用;warm pool 是否值得(L0 已 7ms,大概率不值);
Windows/macOS 不在范围。
## 5. 分期与验收总表
| 增量 | 内容 | 依赖 | 备注 |
|---|---|---|---|
| E1(P0 快修)✅ | F1 委派回传、F2 reasoning_split、F5 并行工具、F3 依赖层 | 无 | **已完成(2026-10-10)**:Agent-Native #42/#43/#44 + Backend #127 + Dev PR(任务卡 feature/agent-e1-parallel-fixes)。验证:F2 实测正文 0 泄漏、F3 sandbox 实测 IMPORTS-OK、F5 实测同回合并发重叠;eval 对照工具失败 19→11,未核实数字 7→12(E3 待做,见任务卡) |
| E2 | R1 Claude 原生协议 + 缓存观测 | E1(F2 同类协议改动可同批) | dmxapi 需充值 |
| E3 ✅ | D4 证据账本 + 数字闸门 | 无(接质量计划 P5) | **已完成(2026-10-10)**:Backend #130、Dev #311(任务卡 feature/agent-e3-evidence-gate)。标注感知豁免(分句判定)+ 两轮修正(变化才二拦)+ base.deliverables v6 数字溯源规则 + 子代理引用格式;eval 对照未核实数字 12→5(未标注 3)、工具调用 93→63 |
| E4 ✅(R4+账本) | R2 角色路由 + D5 画像 | E2 | **R4 与账本已完成(2026-10-11,MiniMax 版)**:Backend #131–#134、Dev #315(任务卡 feature/agent-e4-escalation-ledger)——滑窗失败提醒(端到端日志实证)、检索空命中提醒、source_id 账本(83 标记);Claude 角色档按模型指示暂缓;eval 四轮对照无恶化 |
| E5 ✅(R3 部分) | R3+R4 路由 A/B 与升级规则 | E2–E4 | **R3 已完成(2026-10-10,MiniMax 家族版)**:Dev #313(任务卡 feature/agent-e5-model-ab)三臂对照(hs / 全M3 / hs+M3轻量)——建议默认 chat=MiniMax-M3(未标注编造 1、失败最少、时长持平、单价减半);R4 升级规则仍待做 |
| S0-1 ✅ | §4.4 首个落地形态:冻结基底 overlay + CAS 回收 + 变更摘要(--exec-workspace overlay) | 用户 2026-10-11「继续完成下一步」 | **已完成(2026-10-11)**:Backend #135/#136、Dev #318(任务卡 feature/agent-s0-workspace-overlay)——bwrap 集成 3 + live 端到端(失败零落地/新增/修改/-ws 清理);S0-2(fs 联合读/任务级工作区/封存)待授权 |
## 6. 与既有规划的关系
- [智能体工作流质量改进](2026-10-09-agent-quality-improvement-plan.md):本文是其「模型 A/B」
结论的后续与 P4/P5 的延伸(D4 与 P5 合流;E5 继承 A/B 方法论并扩大样本)。
- [EXT 申请包 G1](2026-10-09-ext-g1-b1-b3-exec-backend.md):E1-F3 修复其 sandbox 档的交付物
缺口;§4 工作区沙箱是 EXT-16 的演进方向。
- [RDM 阶段总案](2026-10-07-rdm-phase-plan.md):G3-7 切 sandbox 前置依赖 F3 修复。
- Agent 栈 N2 WP5(子代理/后台派生):D1–D5 在产品层消费其内核端口,不改内核契约。
## 7. 本机实测的复现要点(SELF,脚本存于任务卡 evidence 同目录说明)
- 启动延迟:bwrap 命名空间 / +overlay / +持久 upper 各 30 次(bench.sh、bench2.sh §3)。
- F2:`reasoning_split=true` 前后各 3 次流式(probe2.py,观察 delta 字段分布)。
- F3:EXT-16 同形参数下 `import docx` 失败 vs 只读挂载 `~/.local/.../site-packages` 后成功
(bench2 §1–2、bench3 §1–2)。
- F4:dmxapi `/v1/messages` 连续两次调用,第二次 `cache_read_input_tokens=5043`。
- overlay 非快照:运行中沙箱读到下层并发修改(bench2 §5);cp -al 对 rename 安全、对原地写
穿透(bench3 §3)。
- docker 冷启动 10 次(bench.sh)。
## 8. 来源(除标注 SELF 外均为 2026-10-10 抓取的一手页面)
- [S1] Linux 内核 overlayfs 文档:https://docs.kernel.org/filesystems/overlayfs.html
- [S11] BoringSQL instant database clones:https://boringsql.com/posts/instant-database-clones/
- [S23] Codex environments/git-worktrees:https://learn.chatgpt.com/docs/environments/git-worktrees
- [S26] Cursor cloud agent:https://cursor.com/docs/cloud-agent
- [S28] container-use CLI:https://container-use.com/cli-reference.md
- [S32] SQLite VACUUM INTO:https://www.sqlite.org/lang_vacuum.html
- [S37] PostgreSQL 18 release notes:https://www.postgresql.org/docs/release/18.0/
- [S46] git-update-ref:https://git-scm.com/docs/git-update-ref
- [S-RT] Anthropic sandbox-runtime(Linux=bwrap+seccomp、网络默认全拒+代理白名单+凭据注入、
Apache-2.0):https://github.com/anthropics/sandbox-runtime
- [S-CX] Codex sandboxing(Linux 用 bwrap;read-only/workspace-write/danger-full-access):
https://learn.chatgpt.com/docs/sandboxing
- [H4] MiniMax 定价与速度:https://platform.minimax.io/docs/pricing/overview 、
https://platform.minimax.io/docs/guides/text-generation
- [H24] Claude thinking 块回传要求:https://platform.claude.com/docs/en/build-with-claude/extended-thinking
- [H25] Artificial Analysis(opus-5-5 96.4 t/s 等):https://artificialanalysis.ai/models/claude-opus-5-5
- [H37] Claude OpenAI SDK 兼容层限制:https://platform.claude.com/docs/en/api/openai-sdk
- [R1][R12][R13][R14][R17][R19][R20][R21][R30][R31][R32][R35][R36][R39][R40][R49] 子代理与
路由调研来源清单见任务卡「调研来源」节(Claude Code docs、Anthropic/Cognition 工程博客、
arXiv 2512.08296 等,URL 全量随卡保存)。
@@ -0,0 +1,532 @@
---
title: Generative UI research and plugin proposal
date: 2026-10-10
type: feat
revision: r2
product_contract_source: user-request-and-current-source
---
# Generative UI 调研与插件方案
确认状态:**三项关键取舍已由用户裁定(2026-10-11,见文末"用户裁定记录")**;全文随发布 PR 评审。推进状态:方案成稿并进入发布评审;原型、业务实现、运行验收、部署均为 **NOT_RUN**。
来源:2026-10-10 用户请求——先调研参考与仓库,再判断能否加入本系统,给出可随时启禁的插件方案。
负责人:裁定与验收 weichen(用户);方案整理与执行 Agent;更新时间:2026-10-11。
本文是唯一主记录;任务卡引用本文。文内路径除相对链接外,均相对 Agent-System-Dev 根目录。
用户授权本轮调研、思考和完整方案准备,不表示已批准本文的产品取舍、原型试验或后续实施。
## 结论与目标
**可以加入,而且当前系统已有合适基础。推荐新增独立的 Generative UI 插件,配合小范围、通用的宿主能力扩展。**
Agent 负责决定何时需要页面、采用哪些组件、怎样排列内容与交互;宿主负责设计系统、身份权限、事实读取、渲染、动作执行和恢复。
页面结构可以每次不同,组件实现与权限规则保持确定。
首选路线:复用现有 Agent-Native、Go Backend、Core UINode 和 React UI;以版本化 Surface 表达可保存、可更新的动态页面。
借鉴 A2UI 的组件目录与数据/交互协议,以及 json-render 的 catalog/registry 分工;首期不要求替换现有运行时或另起 Node 服务。
外部 renderer 是否比扩展现有 UIRenderer 更划算,由受控试验决定,当前没有实际集成证据。
建议先覆盖对话产出的完整阅读/分析页面,再加入交互表单与任务工作页,最后扩展到项目工作区。
登录、项目切换、停止执行、设置和审批保留可预测的宿主入口;业务主内容可以动态组织。
该演进顺序已于 2026-10-11 获用户确认:首试点为对话中的完整分析页(场景 1);它不把长期目标缩减为“几个固定卡片模板”。
插件首期采用**可信 Go 编译扩展 + 声明资产**(该交付方式已于 2026-10-11 获用户确认):功能开关实时生效,安装/升级插件代码需要重新构建组合二进制并重启。
“功能随时启禁”与“无需重启安装任意插件包”是不同能力;用户未把后者列为本期硬要求,sidecar 路线保留为备选并随实际需求重评。
---
## 外部调研
调研日期:2026-10-10。引用来自官方文档或官方源码,说明的是当场文档/仓库状态;本轮未安装或运行这些项目。
不以 star 数量、演示视频或作者自述推断生产可靠性;正式选依赖时仍须固定版本、审许可证与传递依赖并进行组合验证。
### Generative UI 的不同层次
| 类型 | Agent 实际决定什么 | 与本目标的关系 |
|---|---|---|
| 固定工具结果组件 | 调用什么工具、向预制组件传什么参数 | 适合起点,但单独使用不足以实现自由组织页面 |
| 声明式生成页面 | 组件树、布局、内容重点、数据绑定与动作引用 | 本方案主路线;页面可变,执行边界明确 |
| 可持续交互的生成工作区 | 页面随用户输入、任务进展和数据版本变化 | 本系统中期目标;需要状态、版本、权限与回放协议 |
| 生成 HTML/JS/React 小应用 | 连组件实现和程序逻辑一起生成 | 表达力高;需独立沙箱、资源与网络边界,后续单独评估 |
运行时按任务生成页面,与开发期间让 Agent 写前端代码不同。后者交付后仍可能是固定页面。
AG-UI 这类事件协议、A2UI 这类 UI 描述协议、MCP Apps 这类嵌入式应用契约解决的层面也不同,不能互相替代。
### 核心参考与采用判断
| 参考/官方仓库 | 能力定位 | 本系统采用判断 |
|---|---|---|
| [A2UI](https://github.com/a2ui-project/a2ui) / [文档](https://a2ui.org/) | 声明式组件、Surface、数据绑定和用户动作;组件目录可映射自己的设计系统 | 最值得借鉴的协议。Go 可产生 JSON,前端可保持自身 UI。是否严格实现某版本,留给独立适配器与一致性测试 |
| [json-render](https://github.com/vercel-labs/json-render) / [Catalog](https://json-render.dev/docs/catalog) | 为 AI 定义组件与动作词汇,由 registry 绑定真实 React 等实现 | 最值得试验的 renderer 依赖;可将目录映射到 @ui。不能未经比较就再建一套状态和渲染系统 |
| [CopilotKit](https://github.com/CopilotKit/CopilotKit) / [AG-UI](https://github.com/ag-ui-protocol/ag-ui) | Agent 与应用之间的流式事件、状态与交互集成 | 参考工具 UI、共享状态和事件设计;现有系统已有 runtime/SSE/store,首期不整体替换。AG-UI 本身不定义完整页面布局 |
| [Vercel AI SDK](https://github.com/vercel/ai) / [Generative UI 指南](https://ai-sdk.dev/docs/ai-sdk-ui/generative-user-interfaces) | 工具调用与结果驱动组件渲染,应用开发者实现组件 | 很好的最小入门与工具组件范例;不是整页自主规划的全部方案,不为此把 Go 后端迁到 TypeScript |
| [assistant-ui](https://github.com/assistant-ui/assistant-ui) / [生成 UI 文档](https://www.assistant-ui.com/docs/tools/generative-ui) | 除工具 UI 外,当前有 present 工具生成组件 JSON 树、动作注册与流式 props | 借鉴显式 present 入口;不必替换聊天壳。官方明确 renderer 不按 props schema 执行校验,仍需自己的运行时验证 |
| [Thesys OpenUI](https://github.com/thesysdev/openui) / [现行文档](https://www.openui.com/docs) | OpenUI Lang、parser、React 流式 renderer 与自定义组件;Crayon 旧仓已转向该仓 | 作为表达能力/流式体验备选。可用自己的模型;开源 runtime 与可选 OpenUI Cloud/Gateway(原 C1)分开评估,不把开源许可等同托管服务条款 |
| [Tambo](https://github.com/tambo-ai/tambo) | 注册 React 组件与 schema,Agent 选择组件并更新状态;包含后端编排 | 设计参考。官方已公告 Tambo Cloud 将于 2026-10-31 关闭 API,2026-11-30 删除托管数据;开源可自托管,但不建议作为新系统的默认托管依赖 |
| [MCP Apps](https://github.com/modelcontextprotocol/ext-apps) | 工具返回交互式 UI resource,宿主通过桥接在隔离容器内嵌应用 | 适合未来插件小应用与外部工具 UI 互通;它不自动生成页面,也不代表现有 Agent-Native MCP 工具支持已具备 Apps 宿主能力 |
A2UI 官方主页当前列出 v0.9.1 为 current、v1.0 为 candidate;它的 [catalog 指南](https://a2ui.org/concepts/catalogs/) 建议成熟应用围绕现有设计系统定义目录。
已有[官方 React renderer](https://a2ui.org/reference/renderers/);这证明有实现可供验证,不证明该版本已经在本系统构建/运行通过。
不能混合旧 v0.8 的消息字段和新版本字段后声称协议兼容。
json-render 的 [registry 文档](https://json-render.dev/docs/registry) 将组件实现与动作处理留在应用侧,适合本系统“生成数据、宿主执行”的边界。
Tambo 的停服状态以[官方仓库公告](https://github.com/tambo-ai/tambo#readme)为依据,旧教程中的 Cloud 快速接入方案已不适合作为新项目默认选型。
许可初筛:A2UI、json-render、AI SDK 为 Apache-2.0;CopilotKit、AG-UI、Tambo、assistant-ui、OpenUI 的当前仓库为 MIT,具体包及附带资产在锁版本时再核对。
[MCP Apps LICENSE](https://github.com/modelcontextprotocol/ext-apps/blob/main/LICENSE) 处于 MIT 向 Apache-2.0 迁移,部分旧贡献保留 MIT,文档另有 CC-BY-4.0,不能统一简写为“任选双许可”。
当场仓库活动检查未发现上述候选被归档;活动不等于稳定或维护承诺,Tambo Cloud 公告说明需要把代码可用与运营持续性分开判断。
AI SDK 的 [RSC 路径仍为实验状态](https://ai-sdk.dev/docs/ai-sdk-rsc/overview),首期没有理由为此将现有 Vite 应用迁到 Next.js/RSC。
### 三条可行路线
| 路线 | 优点 | 主要代价 | 结论 |
|---|---|---|---|
| A. 原生 UINode/Surface 插件 | 复用权限、Agent、事件流、设计系统与部署形态;无强制新服务 | 要补齐 schema 校验、版本、交互和启禁 | **首选** |
| B. json-render/A2UI renderer 嵌入插件 | 利用现成组件目录、绑定和流式能力 | React 集成之外还需 Go 校验、动作授权、版本与状态适配;可能重复 UIRenderer | 受控试验中的挑战方案;显著减少总维护成本才采用 |
| C. 隔离的代码生成小应用或整套平台 | 表达力最高,适合复杂专用工具 | 沙箱、网络、会话桥、制品供应链、依赖升级和审计面明显增加 | 后续独立方向,不作为首个增量 |
路线 A 不是从零重造外部框架:首期范围只包含本系统用得到的有限词汇、快照、授权动作和页面容器。
若需求发展为大量复杂表单、表达式和跨平台 renderer,重新比较 B;不要不断扩展内部 DSL 以维持最初选型。
---
## 当前系统的可行性依据
以下为 **SELF·源码级观察**,不是运行能力验收。审计基线为 Dev `104a4142c918f7325d3a78e3e6e270e46739baea`。
| 组件 | 固定 SHA |
|---|---|
| Core | `a253a40b8e5563119b00c4e71fb61fe0d11d6d6a` |
| Backend | `017b40f76156905eabe8323ae2bfe800f47fb8bd` |
| Frontend | `339a9ebc2d827eaf990346b91d36f4ad5a13f090` |
| UI | `76d6633736a7abb36ac1ecca42fe4e6f120d0558` |
| Agent-Native | `c348441691e8bdab784a03aa9be64d53dacff341` |
| Documents | `3a82eec74ce6b2b548a7a943f8382d64df14316e` |
| 当前源码事实 | 依据(上述固定版本) | 设计影响 |
|---|---|---|
| React 19、Vite 6;Core 已有 16 种有限 UI 词汇 | `modules/frontend/package.json`;`modules/core/ui.go:9-50` | 不必另换技术栈或设计系统 |
| UIRenderer 能画 table、compare、tabs、timeline 等 | `modules/ui/src/UIRenderer.tsx:22-35` 及各 case | 动态选择和组合已有组件有基础 |
| submit_card 的 body 仍是字符串,包装成 Markdown | `modules/backend/internal/runtime/hostbridge.go:128-148` | 当前 Agent 还不能通过这个工具输出任意结构化页面 |
| form 没有提交回传,节点按数组 index 作为 key;table 行 action 未渲染 | `modules/ui/src/UIRenderer.tsx:22-29,73-95,184-200` | 有类型不等于完整交互;稳定 nodeId、草稿与动作桥必须补 |
| 卡片 body 渲染未传 onAction | `modules/ui/src/ActivityCardView.tsx:66-74` | 不能只把按钮塞进 body 就声称接通动作 |
| cardsvc 有保存与事件发布;运行管理有卡片端口 | `modules/backend/internal/cardsvc/cardsvc.go:73-139`;`internal/runmgr/runmgr.go:637-715` | 复用其分层与持久化后发布原则,避免第二条无审计通道 |
| 上下文回灌仅取卡片顶层 markdown/kv | `modules/backend/internal/ctxasm/ctxasm.go:373-411` | 需要递归语义投影;否则下一轮 Agent 不知道页面里有哪些内容 |
| SSE 服务端先订阅再重放并按 seq 过滤;前端没有完整拒旧/切会话保护 | `modules/backend/internal/server/server.go:375-429`;`modules/frontend/src/api.ts:189-194`、`store.ts:375-414` | Surface 投影须明确 seq、revision 与 generation 防卫 |
| enabled 写入 owner+plugin grants,主要被 ListFor 消费 | `modules/backend/internal/server/platform_api.go:130-142`;`internal/store/platform.go:13-32`;`internal/plugins/host_v2.go:160-175` | 现有“禁用”不能当作请求/执行禁用;新能力必须服务端闭环 |
| ESM loader 存在,但未找到实际页面挂载调用;桥未接主认证/命名事件处理 | `modules/frontend/src/pluginHost.ts:9-13`;`modules/ui/src/pluginSdk.ts:9-25` | 首期不能依赖现成 ESM 页面宿主;动态 import 也不是代码沙箱 |
| 公开扩展可注册命令 handler,命令可 exposeAsTool | `modules/backend/pkg/extension/extension.go:34-48`;`internal/cmdbus/cmdbus.go:47-64`;`internal/app/app.go:417-422` | 插件命令可供现有 Agent 调用,无须新增任意 native executor 插口 |
| 公开 Host 缺会话/任务完整上下文及 Surface 发布端口 | `modules/backend/pkg/extension/host.go:26-68` | 需申请最小公开契约,不能从插件导入 Backend internal |
现有 context assembler 可复用消息、附件、可见知识和用户偏好;不等于已经自动读取所有项目背景。
跨会话读取仍须满足现有开关、同项目/租户与隐私限制(`internal/runmgr/runmgr.go:934-1005`);生成页面不能扩大数据可见范围。
当前 `Host.Complete` 是简单 prompt→string,且主要走 owner 路由,不能当作已有 project 级结构化/流式生成接口。
本轮阅读了规划索引、基座路线图、插件 v2 与扩展兼容相关记录;没有发现既有 Generative UI 专项主记录。
2026-10-10 本轮查询 Dev/Documents/Core/Backend/Frontend/UI 的 open PR,结果均为空;这是当时快照,后续开工须重验。
规划索引中的 Agent 质量、模型路由、RDM 扩展仍有剩余范围,不因没有 open PR 就视为全部完成或不冲突。
---
## 需求与用户体验
### 需求表
所有实施需求当前为候选,待人工确认。符合度“需调整后符合”表示本方案指出了必需宿主改动,不表示已实现。
| ID | 需求与来源 | 符合度 / 优先级 | 可判定验收条件 | 处理与依赖 |
|---|---|---|---|---|
| R1 | 根据内容、上下文、任务、项目背景自主组织页面(用户) | 需调整后符合 / P0 | 同一组事实分别完成“比较、风险分析、进度查看”,生成不同且合适的结构;不是同模板换标题 | 纳入试点;U1/U3/U4 |
| R2 | 以插件封装,随时启禁(用户) | 需调整后符合 / P0 | 禁用后 UI、直接 API、旧按钮、在途发布均受控;原有系统仍可用;重启后保持禁用 | 纳入首期;U2/U3/U4 |
| R3 | 页面可追溯事实与来源(本系统约束) | 符合 / P0 | 数据值来自授权数据引用;分析结论标为生成判断;能定位材料与版本 | 纳入首期;U2/U3 |
| R4 | 使用本系统设计系统、易用且可访问(DESIGN) | 符合 / P0 | 令牌/动效/折叠守护通过;键盘与窄屏可完成主要流程;唯一预览落位 | 纳入首期;U4 |
| R5 | 页面可保存、刷新恢复、版本可解释(长期工作流) | 需调整后符合 / P0 | 刷新恢复已保存视图;同版本可确定渲染;断线、旧帧与切项目不串页 | 纳入首期;U2/U4 |
| R6 | 用户继续修改页面,Agent 理解当前结构(用户目标的闭环) | 需调整后符合 / P0 | “改为对比、突出风险”生成新 revision;上下文包含结构、来源与已确认用户输入 | 纳入首期;U3/U4 |
| R7 | 动态表单和动作,沿用权限与审批(扩展交互) | 需调整后符合 / P1 | 表单可提交、校验、重试;旧 revision/越权/重复动作受控;必要审批不能由模型伪造 | 后续增量;U5 |
| R8 | 任务/项目工作区随阶段组织(用户长期目标) | 需调整后符合 / P1 | 当前任务可组织计划/产物/待决策信息;项目聚合符合跨会话读取权限;固定布局可恢复 | 后续增量;U6 |
| R9 | 外部协议可演进,禁用不丢历史(可维护性) | 符合 / P1 | 固定 schema/catalog/插件版本;不兼容时静态/文本降级;旧动作不自动重放 | U2/U7 |
| R10 | 有真实收益与成本证据(交付规范) | 符合 / P0 | 对照固定 UI 的任务成功率、耗时、事实错误、延迟和 token 成本;真实模型结果可复核 | U1/U7;当前 NOT_RUN |
### 三个试点场景
1. **调研和文档分析页**:比较多个方案时,Agent 组织“结论→对比表→证据→风险”;用户改问实施顺序后,调整为阶段与依赖。数据与判断分开,来源能打开原工件。
2. **当前任务工作页**:需求阶段突出待澄清项,执行阶段突出步骤和产物,验收阶段突出验证结果与缺项。完成状态取自真实任务记录,模型不能画一个绿色标记就更改任务状态。
3. **方案选择和需求表单**:Agent 根据缺失信息组织输入项;用户填写后形成明确的结构化输入,再触发下一轮。表单提交不自动批准其后所有业务操作。
首个完整增量以场景 1 为主;保留场景 2/3 的契约扩展空间,但不要求同时交付所有交互。
普通文本回答仍是有效结果;没有可视化价值时 Agent 应保持文本,不强行生成页面。
### 页面落位与自主程度
对话中的卡片是生成页面的入口与简短摘要,完整页面进入现有预览位置的 Surface 模式;全屏是同一实例的放大。
预览区关闭时,用户仍能从对话入口打开或在对话中继续操作,遵守 DESIGN 的“右栏收起零功能缺失”。
之后的项目工作区只是同一 Surface 的另一种打开入口,不复制另一套事实与状态。
可以保留多份页面,活动预览只有一个;新结果不抢占用户当前打开的其他对象。同一 Surface 的入口聚合到同一实例,用户从对话引用选择历史页面。
建议提供三档产品行为:关闭;按需生成;自动建议/生成。
首期默认关闭,启用后按需触发;用户明确请求页面时直接生成,Agent 在复杂比较/时间线等任务中可自主选择组件与结构。
自动触发只监听明确任务阶段/材料完成等语义事件,后续增量再开启;不按每个 token 或每条 SSE 事件重排页面。
用户可以固定布局、切回原视图、重新组织;“固定布局”冻结结构,授权范围内的数据仍可更新,需显示数据时间。
用户正在输入、选择或执行动作时,结构更新暂存并提示应用,不挪动焦点或覆盖草稿。
---
## 架构与关键决策
### KTD1. 插件策略与宿主执行分离
插件拥有组件使用策略、生成提示、布局选择、schema 修复策略、试点场景与质量评估。
宿主拥有授权上下文、持久化、稳定渲染容器、请求鉴权、事件序列、动作执行和插件启禁。
通用组件实现归 UI;契约归 Core;前端投影与导航归 Frontend;Backend 实现受限公开接口。
新目录/仓库位置建议为独立 Generative UI 组件仓,在 Dev 固定组合中引用;正式建仓和最终名称待实施前确认。
```mermaid
flowchart TB
A[用户任务与展示偏好] --> B[既有 Agent Runtime]
C[宿主授权上下文与组件能力] --> B
P[Generative UI 插件策略与命令] --> B
B --> D[插件 present 命令:声明式页面]
D --> E[宿主校验与 Surface 服务]
E --> F[保存快照与事件]
F --> G[Frontend 唯一状态投影]
G --> H[SurfaceHost 与 UI Renderer]
H --> I[用户交互]
I --> J[宿主动作校验与命令总线]
J --> B
K[插件启禁与资源权限] --> C
K --> E
K --> J
```
### KTD2. 复用现有 Agent,不增加独立 UI 模型调用
首选由当前工作 Agent 根据插件提供的能力目录,通过公开命令的 `exposeAsTool` 生成并提交页面规格。
插件命令可概念性分为“读取可用展示能力/上下文”“提交或替换页面”“恢复原视图”;准确命名在接口评审中确定。
页面规格由主 Agent 作为工具参数产生;插件负责校验与发布编排,无需默认再调用一次 `Host.Complete`。
工具返回已接受的 Surface/revision 与语义摘要,或者带字段路径的有限校验错误;后者允许原 Agent 至多重提一次。这会增加原回合的模型轮次,必须计入成本,不能宣称零额外 token。
因此插件可以自主组织页面,而不接管主 Agent 的对话循环、模型凭据或任务执行权。
后续只有真实评测显示收益,才加入专用 UI planner 或轻量模型修复;届时单独定义 project 级模型路由、预算与取消接口。
### KTD3. Surface 是有版本的呈现产物
方向性数据模型(不是已实现接口):
| 层 | 必需内容 | 权威来源 |
|---|---|---|
| 身份信封 | surfaceId、owner、projectId、conversationId、sourceRunId、pluginId | 服务端分配/从当前请求绑定;模型不能自报 owner |
| 兼容标识 | schemaVersion、catalogVersion、pluginVersion、rendererCompatibility | 已安装组件与宿主协商 |
| 版本 | revision、baseRevision、contextVersion、activationEpoch | 服务端事务与当前授权状态 |
| 页面 | title、稳定 nodeId、受限 layout、UINode 内容及结构 | 模型提议,服务端验证 |
| 数据 | resourceRef、源版本、字段白名单、读取时间 | 宿主解析后的授权数据 |
| 交互 | 服务端保存的 action binding、参数 schema、执行级别 | 命令目录与当前授权;模型仅引用允许动作 |
| 回放 | semanticText/结构摘要、来源、生成用途、静态降级文本 | 服务端递归投影为主,不能只信模型自述 |
首期采用完整、经过校验的快照原子替换,不渲染半截 JSON,不把流式 token 当作结构更新。
revision 单调递增,更新必须带 baseRevision;版本冲突拒绝并返回当前版本,不自动覆盖他人更新。
发布以当前身份、插件、sourceRunId、toolCallId/发布请求 ID 建幂等键,重复工具结果返回已保存 revision,不能生成重复页面;相同键但不同规格拒绝。
复杂的流式 patch、表达式求值和跨页面组件引用均后置;若后续引入 patch,必须保留同样的原子性与版本检查。
现有卡片保存 Surface 引用与文本摘要,不把一份可交互页面同时复制进卡片 body、工件和工作区三处。
持久化建议增加宿主通用 Surface 及 revision 记录,支持现有 SQLite/PG 档位;按 owner/project/conversation 建权限索引。
页面快照、最小 action binding 与待发事件在同一事务落盘,再由宿主事件管道发布;发布失败靠持久事件或重建快照恢复,不能只依赖内存总线。
业务实体仍由原业务服务维护,Surface 不成为项目/任务事实的第二份数据库。
新表采用增量迁移,默认关闭功能时不影响老路径;回退应用不删除表和用户产物。保留周期沿用所属会话/工件策略,最终清理策略随数据契约评审,不在开关中隐式删除。
### KTD4. 上下文是授权后的事实快照
宿主根据当前身份和请求,提供任务目的、当前会话摘要、项目允许读取的背景、指定工件、相关检索结果、用户展示偏好与允许动作目录。
浏览器只提供关注对象 ID 和偏好,不能提交可信权限声明或任意数据库查询。
先按权限过滤再裁剪;只按当前任务相关度取必要字段;不直接将整个项目、原始系统提示或敏感凭据塞入模型。
材料与工具结果作为不可信数据处理,不能覆盖组件目录、开关或动作权限;页面内容里的指令不能自行触发后续动作。
上下文快照记录源版本与裁剪情况;缓存必须包含身份、权限版本、项目/会话、源版本、catalog 和配置,不按问题文本跨用户复用。
已有跨会话读取限制保持有效;缺少授权时只生成当前会话范围的页面,并明确范围。
事实字段尽量采用宿主数据绑定,展示值由服务端解析;模型生成的解释、建议和风险判断显式属于分析内容。
快照记录完整来源集合,包括自由文本分析的来源。读取/导出/回放时任一来源权限失效,首版拒绝整份旧快照并提供重新生成入口,不能只隐藏引用链接而继续显示泄露内容。
下一轮上下文提供经过权限复核的结构摘要、来源和确认过的交互结果;不只回灌 markdown/kv,也不把前端未提交草稿当作用户指令。
禁用插件时不再注入生成策略/动作能力;历史语义内容按正常授权保留为普通文本上下文。
### KTD5. 组件目录约束表达,不固定页面模板
首期选取已有 section、markdown、kv、list、table、compare、timeline、steps、chart-lite、doc-ref;需要时扩展受控 row/grid 布局。
每个节点必须有稳定 ID;组件目录定义 props、嵌套、数据类型和支持的动作,禁止任意 CSS、脚本、eval、远程组件 URL。
只允许语义尺寸/密度/强调枚举,映射 @ui tokens;新视觉规则按 DESIGN 与 UI gitlink 组合变更评审。
渲染器采用既有 safeHtml、Collapsible 和 motion 原语;表格提供溢出与分页/截断提示,不能静默丢数据。
未知组件或版本产生可见降级原因与文本视图;未知动作一律拒绝。不能沿用“未知节点静默消失”作为新 Surface 成功状态。
初始试验上限建议:每页 200 节点、8 层嵌套、256 KiB 规格、单表首屏最多 100 行;值为待测的资源预算,不是既有性能承诺。
同时限制字符串、数据总量、图表点数、解析时间和外部资源;图片/链接沿用宿主来源策略。
可访问性检查覆盖标签、标题层级、键盘顺序、焦点、屏幕阅读器状态提示和 reduced-motion;不能只验证 JSON 合法。
### KTD6. 动作由宿主重新授权
生成的按钮不是批准。模型只能选择已允许的 action 名称/资源引用,宿主解析为当前 Surface 的 binding。
客户端提交 surfaceId、revision、actionId、requestId 与受限表单数据;服务端重新验证当前身份、项目、插件状态、参数、资源版本与命令权限。
简单筛选、排序、页签切换留在客户端确定逻辑,不额外调用模型;需要重组织或分析时才进入现有 Agent 回合。
业务变更通过既有命令总线和 HITL,表单通过不扩大其授权范围。
幂等记录绑定身份、Surface、revision、action 和请求内容;重复点击返回已有结果,未知外部结果先查询,不因超时自动重做。
同一 requestId 但不同参数必须拒绝;重试先做当前读权限/启禁检查,再查询已有执行回执,已执行回执不能因资源版本已变化而被当作新动作重放。
```mermaid
sequenceDiagram
participant U as 用户
participant F as SurfaceHost
participant S as 宿主 Surface 服务
participant C as 命令总线
participant A as 既有 Agent
U->>F: 提交输入或点击动作
F->>S: revision、action、requestId、data
S->>S: 当前权限、启禁、参数、资源版本和幂等检查
alt 需要业务审批
S->>C: 既有审批流程
C-->>U: 展示真实动作与参数
else 允许读取或已满足审批
S->>C: 执行已授权动作
end
C-->>S: 确定结果或未知结果状态
S-->>F: 动作状态与最新投影
S->>A: 必要时追加已确认交互结果
A->>S: 新页面提议
S-->>F: 已保存且校验后的新 revision
```
### KTD7. 真正可验证的插件启禁
新插件默认关闭,不沿用现有“缺少 grant 默认 true”的行为。适用关系是安装存在、全局允许、owner 显式启用、manifest 范围与当前资源权限的交集。
首期采用实例总开关 + owner opt-in;project 开关可后续新增,不能允许项目设置覆盖实例禁用或扩大 manifest 范围。
管理员可以全局禁用;用户仅在管理员允许的范围控制自己的使用。
| 状态/动作 | 必须发生的行为 |
|---|---|
| 关闭 | 不贡献可调用工具/提示策略,不启动生成,不接受写页面与动作;原有固定 UI 可用 |
| 启用 | 校验组件兼容与配置,建立新的 activationEpoch,按请求授权能力;不重放旧动作 |
| 禁用请求成功返回 | 先持久化禁用并提升 epoch,再通知前端;返回后新请求、旧按钮和旧 generation 的提交都应被拒绝 |
| 禁用时有生成在途 | 取消该 owner/plugin 的独立宿主操作,撤销发布资格;提交前再次核对 epoch 并拒绝迟到页面。共享主模型回合继续,不调用 CancelRun 取消整个主任务 |
| 禁用时已有动作在执行 | 尚未进入执行的动作拒绝;已提交业务操作按原命令记录收尾,不能承诺撤销既成副作用;结果不明则查询恢复 |
| 历史页面 | 权限仍有效时以宿主通用静态渲染/文本查看,动作禁用;资源权限撤销后旧快照也不能继续泄露数据 |
| 再次启用 | 重验 schema、来源与权限,创建新 capability/binding;保留产物,不自动执行先前点击 |
| 卸载/升级 | 功能停用与代码包移除分开;旧产物靠宿主降级;代码升级走构建兼容验证 |
```mermaid
stateDiagram-v2
[*] --> Disabled
Disabled --> Enabled: 授权启用且兼容
Enabled --> Generating: 当前 Agent 请求页面
Generating --> Ready: 校验与事务提交
Generating --> Fallback: 无效规格或失败
Ready --> Generating: 请求重组织
Ready --> Disabled: 禁用并撤销动作
Generating --> Disabled: 撤销发布并拒绝旧 epoch 提交
Fallback --> Generating: 有限重试或用户重试
Fallback --> Disabled: 禁用
```
该状态图描述呈现能力,不等同业务任务状态。历史快照存在不代表插件 Enabled。
主 Agent 已收到的生成提示和已发生的 token 成本不能在禁用后收回;下一次能力组装移除插件策略,当前回合即使继续提议页面也会被执行端拒绝并转为文本结果。
epoch 核对与页面提交/新动作准入必须共享可证明的事务或串行化边界,不能“先查开关、释放锁、再执行”。禁用返回是准入截止点,截止点前已准入的操作按上表在途语义处理。
启禁守卫覆盖发现、命令分发、工具执行、上下文能力注入、Surface 读取/提交与动作;标明归属的能力不能通过另一入口绕过。
编译插件是可信代码扩展,不是恶意第三方代码的隔离边界。sidecar 目前继承环境并使用共享 Host token 的现状,不足以承担不可信插件沙箱。
首期只补这条能力闭环及共享执行边界;通用热重载原子化、插件市场和所有旧插件资产清理另立任务,不无限扩大本次范围。
### KTD8. 一个状态所有者,明确恢复规则
后端是 Surface 与业务状态权威;Frontend store 维护一份投影;UI 只渲染 props 并发出用户事件。
表单草稿、页签与展开状态归前端按 surfaceId/nodeId 管理;提交后成为服务器确认的输入,不能同时被模型与组件局部 state 无序覆盖。
复用主认证与 SSE 通道,不另用现有未接完整的 pluginSdk EventSource 作为第二所有者。
事件绑定会话/项目/Surface 与 seq;前端丢弃过期 seq、旧 revision、旧页面 generation;检测缺口后获取授权快照重建。
切项目、退出登录、撤权或禁用立即作废在途请求和可见敏感投影;不同身份不复用浏览器缓存。
撤权阻止继续访问和重新加载,不承诺抹去用户此前已合法下载的数据;敏感快照不写入持久浏览器存储。
普通 reconnect 不重新调用模型,先恢复已保存的快照;重新生成是用户动作或经允许的策略动作。
### KTD9. 可演进但不虚报标准兼容
内部首版使用系统自己的版本化 Surface + UINode 扩展,不能命名为“A2UI 兼容实现”后省略协议测试。
未来可加 A2UI 适配器:固定协议版本与目录版本,只支持明确子集,不支持的组件/动作显式报错,不静默损失含义。
AG-UI 仅在需要跨 Agent 框架互通时评估事件适配;MCP Apps 仅在需要外部工具应用时评估宿主资源与沙箱能力。
三者不作为首期串联依赖;避免为了 Generative UI 同时迁移模型运行、传输与前端框架。
---
## 最小宿主改动与插件交付边界
| 模块 | 建议变更 | 明确保留的职责 |
|---|---|---|
| Core | Surface/版本/节点 ID/受控布局/动作信封与兼容标识;保持旧 UINode/卡片可读 | 跨仓公开类型权威;同步 Go、TS 及契约快照 |
| Backend public extension | 授权 ContextSnapshot、Surface 读写/发布、插件 capability/activation;按需要增加受限上下文投影扩展 | 不暴露 raw DB、完整 session、通用任意 HTTP 或事件发射器 |
| Backend internal | 实现上述端口、执行级启禁、事务存储、事件恢复与动作鉴权 | 服务端最终授权与业务事实 |
| UI | 稳定节点与受控布局的通用 renderer;表单事件、行操作、无障碍、降级 | 纯展示、token/motion/Collapsible/safeHtml;不持网络状态 |
| Frontend | SurfaceHost、单一状态投影、预览落位、开关、结构更新/草稿协调 | 身份、路由、事件、用户输入草稿 |
| Generative UI 插件 | prompts/skills、目录选择、present/revise 等命令、生成校验编排、试点策略 | 只消费公开扩展,默认随当前 Agent 生成;无独立任务事实库 |
| Documents/Dev | 契约申请、使用说明、评测结论、精确组件组合与索引 | 方案/实现/验证/部署状态分别记录 |
公开扩展优先使用新增可选能力接口或版本协商,避免给现有必实现 Host 接口直接加方法而破坏所有消费者。
修改公开导出时更新 `SurfaceVersion`、`pkg/extension/surface.txt` 与相关兼容快照;Core/UI/Frontend/Backend 的依赖 gitlink 同步验证。
已有命令投影可以承载 Agent 工具,因此不申请通用 native executor 注册口作为前置。
首期不需要开放任意前端 ESM 注入;插件只输出既有/新批准的通用 UI 词汇。
如果要求“下载插件包后不重启安装”,则改为隔离 sidecar + 同一 Surface 契约。
增加独立身份、最小环境、按插件/owner capability 令牌、健康检查、取消/退出协议、版本升级与回滚;前端仍可用通用 renderer,不必加载任意 JS。
这属于另一档交付成本,不应通过当前 `exec.Command` 与共享 token 简单包装后宣称完成。
---
## 分阶段计划
下列为可评审的实施候选,不是已经获准执行的待办。每个增量继续按 `policy/delivery.md` 人工评审;试验结果允许回改选型和范围。
功能代码与生产实例本轮不变。近期 U1 具体,其余单元在试验评审后细化精确 API 与数据迁移。
### U1. 受控价值与选型试验
- 关联 R1/R4/R10;依赖:已满足并**已执行**(2026-10-11,任务 feature/generative-ui-u1);结果见下节“U1 结果与 r2 修订”。
- 对象:固定当前组件 SHA,在隔离工作区用合成或获准的脱敏材料,覆盖调研比较、任务概览、需求输入三类。
- 方法:先比较“固定 UI/文本”与“原生 UINode 动态组合”;再用少量相同样本比较 json-render/A2UI renderer 接 @ui 的复杂度与缺口。后者是 renderer 选型挑战,不另建全套后端。
- 文件范围:专用实验目录、组件契约夹具与评测说明;全部明确为原型,不替换生产路径。
- 试验预算:3–5 人日;30 个固定任务、每项至少 2 次模型运行;首轮最多 60 次/方案。费用上限已由用户指定为 **¥200**(2026-10-11);模型限 MiniMax M3 与 M2.7-highspeed,材料限合成或已脱敏样本;超限即停。
- 判据:结构选择确实随目标变化;信息来源可追溯;可通过现有设计令牌渲染;列出外部依赖节省与新增的实际代码/状态维护面。
- 停止:出现越权数据、无法限制生成代码执行、超过预算、依赖要求替换既有 runtime,暂停该路线并提交调整。
- 产物:A/B 结果、renderer 取舍、失败样本、建议目录与修订版方案;不是生产代码验收。
### U2. 通用契约、启禁与持久化
- 关联 R2/R3/R5/R9;依赖 U1 的设计评审。
- 文件范围:`modules/core/ui.go`、Core 新 Surface 契约及对应测试;`modules/backend/pkg/extension/`、`internal/plugins/`、`internal/store/`、`internal/server/` 及对应测试/迁移。
- 方法:先固定兼容与授权信封,再实现 owner 隔离的 Surface 存储、revision CAS、activationEpoch 和命令执行守卫;能力缺失明确拒绝。
- 验证:旧消费者可用;关闭状态下 direct API/工具/旧 action 不绕过;并发更新有一方冲突;写快照后事件发布失败可恢复;SQLite/PG 路径一致。
- 完成条件:最小公开契约审过,故障/拒绝路径有证据,插件能通过公开接口保存/读取页面;此时不宣称生成体验完成。
### U3. 生成插件与上下文闭环
- 关联 R1/R2/R3/R6;依赖 U2。
- 文件范围:独立插件的 manifest、commands、prompts/skills、目录和测试;Backend `internal/ctxasm/` 的通用语义投影、授权快照适配及测试。
- 方法:沿用 AddCommandHandler/exposeAsTool;当前 Agent 接收可用词汇和授权快照,产出页面参数;插件校验,宿主原子发布。解析/语义修复最多 1 次,失败回到文本,禁止无限自修复循环。
- 验证:同素材换任务得到合适不同结构;伪造数据引用与未知动作被拒;下一轮可以解释并修改之前的 table/compare/tabs;禁用不再注入能力。
- 完成条件:真实模型“任务→规格→保存→继续修改”闭环可回放,来源与成本被记录;不另造 Agent runtime。
### U4. 只读生成页面与可恢复体验
- 关联 R1/R2/R4/R5/R6;依赖 U2,最终集成依赖 U3。
- 文件范围:`modules/ui/src/UIRenderer.tsx` 及测试、通用 Surface 展示组件、`modules/frontend/src/store.ts`、`api.ts`、预览/卡片入口、插件设置及对应组件/浏览器测试。
- 方法:稳定 nodeId、布局语义、受控 renderer、唯一 SurfaceHost;加载/失败/回退/来源/重新组织入口;单一 store 校验 seq/revision/generation。
- 验证:刷新/断线/切项目/迟到响应;关插件固定界面仍完整;页面未知版本可读;键盘、窄屏、暗浅主题;输入焦点与布局变化规则。
- 完成条件:场景 1 可通过真实浏览器完整使用;此增量提供展示和重新组织,业务写动作未开放。
### U5. 动态表单和动作闭环
- 关联 R7,依赖 U2/U3/U4;必须先评审本阶段动作范围。
- 文件范围:Core 动作/字段 schema、UI 表单与行操作及测试、Frontend 草稿/提交桥、Backend action service/cmdbus 适配及权限/幂等测试。
- 方法:输入草稿由宿主管理;服务端绑定 action;必要时进入既有 HITL;失败留在当前页面并保留可恢复输入。
- 验证:旧 revision、资源被删、撤权、关插件、双击、超时未知结果、两个标签页同时提交;无审批旁路;用户未提交输入不传给模型。
- 完成条件:场景 3 可完成明确读取/决策动作,再逐类批准业务写动作,不能一次开放所有命令。
### U6. 自适应任务与项目工作区
- 关联 R8,依赖 U4/U5 的收益与可靠性证据。
- 文件范围:Frontend workspace/任务页容器、插件上下文选择与触发策略、Backend 授权聚合适配、相关测试。
- 方法:先当前任务,后项目;任务阶段触发有限更新;固定布局/恢复原视图;自动模式单独 opt-in。
- 验证:不同阶段突出不同信息;任务事实不能被页面改写;私有会话不泄露;输入时不自动重排;自动触发有预算且不递归自激。
- 完成条件:实际任务效率改善,关闭后原工作区完整,跨会话汇总授权能复核。
### U7. 组合验收、兼容与交付
- 关联 R2/R5/R9/R10;按每个可交付增量执行,不只在最后一次执行。
- 文件范围:各模块相关测试、Documents 使用/评测记录、Dev 任务卡和精确 gitlink 组合;涉及治理脚本才追加治理测试。
- 方法:先组件 PR,再组合 PR,固定 Dev SHA+组件 SHA+schema/catalog/model/profile;复放正常、异常、权限、禁用与恢复链路。
- 验证:CI `make test`/`make build` 与独立重放;业务智能体改动附真实模型前后对照;本地 SELF 不升级为 GATE。
- 完成条件:用户批准该增量、功能与回退均有证据、文档和开关说明完整;是否部署仍是独立授权与运行验收。
粗估:U1 3–5 人日,U2–U4 首个可靠只读闭环再需约 10–18 人日,U5 约 5–8 人日,U6 约 5–10 人日。
这些是范围估计,假设熟悉现有代码且使用可信编译插件;不含人工等待、全量外部协议兼容和不可信插件沙箱,不是交付承诺。
---
### U1 结果与 r2 修订(2026-10-11)
U1 三臂对照(B=Markdown 基线 30 任务;G=M3 UINode 生成 30 任务含一次修复;G-hs=highspeed 子集 10)
与 renderer 挑战已完成,全部材料为合成样本,总开销 ≈¥3.0(上限 ¥200)。详细数据与失败样本:
Dev 任务卡 feature/generative-ui-u1 及其 `.task/genui-u1/report.md`(SELF 记录;随任务 PR 留 CI GATE)。
关键结论与修订(构成本 r2 相对 r1 的差异):
1. **R1 结构分化成立**:同料不同目标 6/6 对照全部分化(类型多重集 Jaccard 0.17–0.50)。
2. **生成通道硬约束(修订 KTD2)**:页面规格只能经插件命令工具参数(exposeAsTool)提交,
不接受聊天文本 JSON。依据:文本通道首过合法 60%/修复后 83%,终判失败全部为长中文 JSON
语法违纪;工具参数通道探针解析干净、仅剩可修复语义错误;`response_format` 探针无效。
3. **目录文档要求(修订 KTD5)**:每类型附完整最小示例;按目标类别给推荐/禁用词汇
(实测 order/handover 目标下存在未被要求的 form/actions 超生成);校验器升级为 schema
驱动、目录=提示=校验三同源(借鉴 json-render,不引入其运行时)。
4. **模型路由(修订 KTD2)**:生成档固定 MiniMax-M3(highspeed 文本通道合法率 20%,否决其
生成用途;轻量步骤仍可用 highspeed)。成本实测 ¥0.067/任务(M3),可忽略。
5. **renderer 取舍确认**:首期扩展自研 UIRenderer;json-render(0.21.0)端到端可用但组件
契约重且状态/动作运行时与我方重叠,记为 U5 交互期重评项;A2UI(0.13.0)导入即需 DOM 且
客户端 signal 绑定与 KTD4 宿主解析冲突,不推荐。
6. **验收线移位**:首过 ≥90%/修复后 ≥98% 维持为 U3 工具通道验收线;本轮 60%/83% 记为文本
通道下界。稳定 nodeId 纪律良好(25/25 合法规格全提供),U2 信封先行得到支持。
局限:人类可用性对照 NOT_RUN;合成材料、n=30、每任务单次采样;G-hs 有效样本 n=2 不具统计
意义;首轮 harness token 预算缺陷已修复重跑(事故记录见报告第六节)。
## 验证与评估
### 试点评价方法
采用相同材料、权限、模型/profile、任务和重复次数比较固定 UI/文本基线与生成 UI。
分别记录冷启动/缓存、模型时间、验证时间、渲染时间、额外 token 与调用次数;不把缓存命中混作生成加速。
默认观测记录规格/目录版本、耗时、字节数、token、错误码和回退原因;原始上下文、输入值与模型全文不进入普通日志,评测原始材料按既有 eval 规则保存在受控环境且不进仓。
以下阈值为**建议评审目标**,本轮无实测结果:
| 维度 | 建议目标/方法 |
|---|---|
| 任务有效性 | 任务成功率至少不低于基线;选定比较/梳理场景的人类中位完成耗时改善约 20% 才考虑扩大自动模式 |
| 事实可靠性 | 验证集中的资源/数值引用可追溯;关键事实错误为 0;分析判断独立标注 |
| 规格有效率 | 首次合法页面 ≥90%;最多一次修复后 ≥98%;最终失败 100% 有可用文本降级 |
| 延迟 | 浏览器先给确定加载状态;本地校验+渲染 P95 目标 <300ms;模型生成单独统计。显式页面请求的初始展示等待预算为 20s,超时转文字等待/回退并撤销该次发布,不因此中断共享主 Agent 回合 |
| 干扰 | 普通文本任务不额外调用 UI 模型;不会每个 token 重排;用户输入与焦点不丢失 |
| 开销 | 展示额外 token、调用数、失败重试成本与收益;是否可接受在真实模型对照后决定,不先声称“更快更省” |
| 开关正确性 | 禁用成功后所有新副作用入口拒绝;旧 epoch 页面不能提交;保留授权历史与原 UI |
30 个任务的小试验用于发现问题和决策,不足以证明长期生产可靠率;报告样本量、失败数和每类任务结果,不只报百分比。
若收益只体现在“更好看”而任务成功率/效率下降,保留按需模式,收窄场景或停止推广。
### 必测故障与权限矩阵
- 正常:同材料不同任务、纯文本无需页面、生成后改布局、来源打开、刷新恢复。
- 结构:未知节点、循环/过深结构、超大表格、非法数据类型、畸形 JSON、未知 schema/catalog、非法 URL/脚本属性。
- 权限:跨 owner/project/doc 引用、跨会话私有内容、生成后撤权、切账号/项目、直接 API 调用、伪造动作 ID。
- 异步:重复/乱序/缺口事件、断线重放、两个标签页、旧 revision、切页后的迟到响应、保存成功但事件未发布。
- 启禁:生成前/中/提交前禁用,动作前/审批后/执行中禁用,服务重启,重新启用,兼容版本缺失。
- 交互:表单校验、重复提交、业务冲突、输入中更新、取消、失败后保留草稿、外部结果未知不重复执行。
- 回退:插件完全缺失、模型不可用、预算耗尽、renderer 出错;固定 UI 和授权文本历史仍可用。
- 回归:旧 UINode、卡片、命令、工件预览、侧栏关闭、单二进制构建、SQLite/PG、设计守护与可访问性。
正式实现期按各组件 PROJECT 的命令验证,并在 Dev 精确组合运行 `make test`、`make build`。
涉及智能体提示/工具/上下文变化时,按 `policy/delivery.md` 的真实模型任务级前后对照要求执行;mock 只能证明机制。
证据由 `make evidence` 写入任务卡,保留 SELF/REPLAY/GATE 和固定对象,未运行项保持 NOT_RUN。
本轮只检查方案差异、引用与链接、源码对应关系;没有运行上述功能试验或业务测试。
---
## 风险、待确认项与下一步
| 风险 | 具体处置 |
|---|---|
| 页面自主性变成固定模板填充 | 用同事实不同目标的验证例证明结构变化;逐步开放组合能力,而非预设三种页面硬路由 |
| 模型幻觉变成“业务事实” | 事实字段绑定授权源、生成判断标注、来源版本可回查;业务状态只走原服务 |
| 自主重排破坏可用性 | 稳定宿主入口、布局固定、输入期间冻结结构、按语义事件有限更新 |
| 声明式 schema 被误当安全边界 | 仍对资源、URL、动作、执行权限和数据泄露做服务端校验;可信插件代码另有信任边界 |
| 禁用只藏按钮 | 执行端统一守卫、epoch 与提交前复核;直接 API 和在途测试列为必过项 |
| 引入第二套状态/runtime | 复用主 Agent、主 SSE 和 Frontend store;外部包只在明确 renderer 边界试验 |
| 公开接口扩大过快 | 小型能力接口、版本协商、兼容快照;不暴露内部 store,避免泛化插件市场 |
| 外部项目快速变化 | 固定依赖版本,锁 catalog,保留适配层;Tambo Cloud 停服作为实际供应商生命周期样例 |
### 用户裁定记录(2026-10-11)
以下三项已由用户(weichen)裁定,原“进入试验前需确认”问题随之关闭:
1. **接受“动态业务页面 + 稳定宿主入口”**:首试点为对话中的完整分析页(场景 1),随后推进任务/项目工作区。
2. **“随时启禁”采用可信编译插件交付**:功能启禁无需重启,插件代码安装/升级需重建并重启;不要求本期免重启安装,sidecar 路线保留为备选。
3. **试验参数**:裁定与验收负责人为用户(weichen),执行由 Agent 承担;模型限 MiniMax M3 + M2.7-highspeed;材料限合成或已脱敏样本;U1 费用上限 ¥200。
注:裁定后权威 main 又合入前端三栏工作台(Dev PR #322)。本文“当前系统的可行性依据”按调研时固定 SHA 记录、不改写;U1 开工时须在新 HEAD 上重验该源码事实表。
首选下一任务是 **U1 受控价值与选型试验**,不是直接实现所有宿主契约。
其前置(批准试验范围与预算)已由 2026-10-11 裁定满足;产物为固定样本 A/B 报告、实际 renderer 取舍、失败清单与 r2 方案。
验收依据为 R1/R4/R10 的可判定结果,随后再决定 U2–U4 的正式投入。
U1 按独立任务启动并继续逐阶段人工评审;本文发布(推送、合入)随裁定记录一并进入 PR 评审,部署仍不在本轮范围。
@@ -0,0 +1,253 @@
---
title: 多人协作存储与分布式演进方案 - Plan
type: refactor
date: 2026-10-11
execution: code
product_contract_source: ce-plan-bootstrap
---
# 多人协作存储与分布式演进方案 - Plan
修订:r1;确认状态:**已批准(2026-10-11 用户指示「按方案开始改造」)**;推进状态:方案获批发布,实施自首选增量 U1+U2 启动;业务实施/迁移/压测/部署仍为 NOT_RUN,逐项以实施任务卡为准。
需求来源:2026-10-11 用户要求完善 SQLite、PostgreSQL/pgvector、Redis 分工;随后确认“10–100 人,多人多项目多会话并行,未来支持多服务分布式”。
需求负责人:weichen;方案编制:Codex;实施及运维负责人:待指定。更新时间:2026-10-11(Asia/Shanghai)。
关联任务:Dev `.task/feature-collaboration-storage-plan.md`(方案任务,已发布);后续 U1+U2 实施由独立任务承接。
正文中的源码路径以 Agent-System-Dev 为根;工作包中的 `internal/` 简写指 `modules/backend/internal/`;文内相对链接以本文为根。
## 1. 推荐结论与边界
团队部署以 PostgreSQL 作为共享业务状态的唯一权威,pgvector 承担数据库内向量查询,Redis 承担可丢失的缓存与限流。SQLite 保留给个人嵌入式使用、离线工具及可以重建的本机状态,不承载团队共享写入或跨主机运行所有权。
第一阶段交付单应用实例的可靠团队部署;第二阶段补齐执行所有权、持久命令、共享工件与事件追赶,再开放多个应用实例和 Worker。通过接口和数据归属为服务拆分做准备,当前不要求微服务化、Kubernetes、分片或引入另一套消息中间件。
“不会出现错误”不能成为无条件承诺。工程目标是:在定义的故障模型下,不静默丢失已确认数据、不覆盖他人的并发更新、不产生未经识别的重复副作用、不越权;异常可发现、可追踪、可恢复。冲突可以返回明确的 409,超载可以返回 429,依赖故障可以返回 503,它们必须有清楚的重试语义。
本方案是[双档存储 D17–D24](2026-09-30-dual-tier-storage-and-multitenancy.md)的候选增补,批准前不改写原已采纳决策。拟调整的是团队部署的默认与必需条件,以及 D24 原来排除的跨实例执行能力;保留个人 SQLite 档、非容器部署、现有检索契约与序号语义。
## 2. 当前事实与差距
源码调查基线:Dev `73c901fa341a3653d6e0826d0da3497507995482`,Backend `eda90ed310f37f7352e24a8096d932dbf320cd73`,Documents `9a46785ee0f19540c79f83b4e4544572b5217ac2`,Agent-Squad `490b0b2dfa1567cb16ff7a7230fd78e52bc2938e`,Agent-Native `c348441691e8bdab784a03aa9be64d53dacff341`。
来源均为 **SELF·源码/本机只读观察**;没有真实并发故障重放。命令、对象 SHA 和原始输出见[调查收据](../records/2026-10-11-collaboration-storage-audit-receipt.json),启动收据见任务卡。
| 对象 | 当前可核实事实 | 方案含义 |
|---|---|---|
| Dev 运行实例 | `runtime/dev/bin/agent-system`、8788 端口打开 `runtime/dev/data/agent-system.db` 及 WAL;二进制 build revision 为 `017b40f76156905eabe8323ae2bfe800f47fb8bd` | 当前服务确实使用 SQLite;运行版本与上述源码基线不同,源码缺陷不冒充已在该二进制重现 |
| 本机安装 | Homebrew 列出 PostgreSQL 18.6、pgvector 0.8.7、Redis 8.10.2 | 仅证明安装;目标 PG 实例、目标库扩展启用、角色与可用性未验证,不据此批准切换 |
| Backend 存储 | `internal/app/app.go:105` 按 DSN 选 PG,否则 SQLite;`store/store.go:50` SQLite WAL、busy_timeout=5000、单连接;PG 池固定 16/8 | 无需重写全部存储层;需团队档显式配置、连接预算和真实 PG 测试 |
| 已有一致性基础 | `store/dialect.go:49` PG 事务咨询锁;消息 seq 唯一约束、requestId 去重和 HITL 条件更新 | 保留并扩展,不把已有能力列作全新建设;这些能力不等于跨实例运行互斥 |
| Run 所有权 | `runmgr/runmgr.go:1113` 用进程内 map 占用会话;`store/messages.go:120` 直接创建 run | 两实例可能各自认为空闲;需共享占用和有效执行代次 |
| 取消与审批 | `runmgr/runmgr.go:1326,1422` 依赖本实例 active 句柄;HITL 先落卡,再查句柄 | 请求落在非执行实例时存在命令不生效或卡已处理但执行未被唤醒的风险 |
| 跨实例事件 | `pgbus/pgbus.go` 每批通知末 seq,Listener 只 `EventAt` 取末条;断线后对原连接继续 Wait | 静态可见批内中间事件遗漏及重连缺口;`server/server.go:376` 的 SSE 重放/去重不能修复已越过的游标 |
| schema 迁移 | `store/migrate.go:migrate` 每次 Open 执行迁移;DDL 事务提交后另行插入迁移版本 | 并发启动与两步间崩溃存在风险;切 PG 前先改为单迁移入口与原子版本登记 |
| 向量查询 | `store/vectors.go` 读取 BYTEA,应用内计算余弦;`migrate.go` 未把向量列建成 pgvector 类型 | 安装 pgvector 不代表启用;复用 RRF 管线,分阶段改为数据库 top-k |
| Redis | `ratelimit/ratelimit.go:65` 独立 INCR/EXPIRE,EXPIRE 错误未处理;请求异常默认放行;app 默认限额 0 | 当前只是可选共享限流,需原子窗口、鉴权/TLS配置、容量保护与可观察的降级 |
| 本地文件 | `blobstore` 默认本地目录;Backend Squad 入口未传 Store,回落 FileStore;checkpoint 写 `.agentx/checkpoints.jsonl` | PG DSN 不会迁走这些状态;工件、执行工作区、checkpoint 要分别处理 |
| 独立 Squad | 独立 CLI 使用 `adapters/sqlite/runstore.go` 的 `orchestration.db`;这不是 Backend 实际接线 | 不把迁移该 SQLite 文件当作 Backend 分布式改造完成 |
| 验证 | PG/Redis 集成由 `AGENT_PG_TEST_DSN`/`AGENT_REDIS_TEST_ADDR` 控制;当前 CI YAML 没有显式准备这两种服务 | 缺变量会跳过关键测试;CI 通过不能自动证明真 PG/Redis 或双进程链路通过 |
已有规划衔接:Q1 已记录 Store 收敛但仍留 platform→squad 队列桥接等余项;N3 原案与归档卡的 JournalOnly 落地不同,应以当前接线确定权威。共享权限沿用 EXT-8 授权适配器与 RDM 的成员/角色职责,不新建第二套成员模型。历史报告用于定位,不能替代当前验收。远端调查发现 Backend [#135](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Backend/pulls/135) 正在增加 S0 工作区 overlay/frozen base/CAS apply;U5 必须复用并核对其契约,不能另造冲突的工作区实现。该 PR 尚未作为本案已合入依赖。其他被查仓当时未返回 open PR,详见收据;实施启动时重新核对。
## 3. 需求与可判定结果
| ID | 需求 | 优先级 | 验收条件 |
|---|---|---|---|
| R1 | 支持 10–100 人、多项目、多会话并行 | P0 | 在固定环境与下述负载下完成真实业务链路;容量结果绑定组件 SHA、配置和数据集 |
| R2 | 团队数据有唯一共享权威 | P0 | 团队档无有效 PG 配置或连接失败时拒绝就绪,不自动建立本地 SQLite 继续服务 |
| R3 | 并发提交和编辑不静默覆盖 | P0 | 同 requestId 返回同一逻辑结果;同版本竞争写入最多一个成功,其余明确冲突;不同会话并行 |
| R4 | 跨实例运行与命令可恢复 | P1,多实例前置 | 同会话主 run 单一有效 owner;旧 epoch 写入拒绝;任意 API 实例取消/HITL 均到达执行者 |
| R5 | 事件有序、可追赶 | P0/P1 | 批处理、掉通知、重连和慢消费者后可按游标补齐全部已提交事件;不因收到末 seq 而跳过中间事件 |
| R6 | 项目权限在所有数据入口一致 | P0 | 读取、写入、SSE、检索、下载与工具入口均校验当前授权;撤权后的新请求无泄漏 |
| R7 | 数据和运行状态可恢复 | P0 | SQLite→PG 演练无遗漏;备份恢复含文件与权限映射;未知副作用停在可见恢复状态,不盲目重试 |
| R8 | 高负载下有界且可观察 | P0 | 队列、活跃 Agent、DB 连接、工具/模型请求都有上限;超载行为、等待时间和错误分类可观测 |
| R9 | 向量检索随数据增长扩展 | P1 | 数据库 top-k 与原精确基线对照;授权过滤正确;模型/维度/版本不混用;ANN 有召回率与延迟证据 |
| R10 | 支持未来多服务部署 | P1/P2 | 先验证两个真实 API/Worker 进程共享服务;业务表有模块 owner,后续服务通过契约操作他方数据 |
R1 的人数及未来分布式方向由用户确认;下列量化指标是**建议的验收合同,待批准,不是当前性能结论**:
- 基准环境建议:Linux、8 vCPU、32 GiB RAM、NVMe,记录 PG/应用的实际配额与网络;两实例验证分为同机多进程和后续双主机两种证据。
- 阶梯负载:10→30→100 在线用户,最多 300 SSE 连接;初始全局活跃 Agent 执行预算 20(包含子代理)、每用户 2、索引任务 4。待执行队列最多 200,按用户/项目公平分配。已接纳 run 数与实际执行许可分别计数;父 run 等待子代理/HITL 时让出执行许可、保留会话所有权,恢复执行须重新获许可,避免额度用尽时父子互等。以上阈值由实测调整。
- 数据量建议:100 万条消息/事件量级、10 万知识分块、多个项目与交叉授权用户;另测 100 万分块扩展档。记录数据分布与热点,不能只测空库。
- 非模型普通 API:P95≤300ms、P99≤1s;SSE 持久事件可见延迟 P95≤1s;非预期失败率≤0.1%。预期限流/冲突单列,不能排除后不报告。
- 先跑 60 分钟稳定负载,再跑 2 小时混合长稳;持续记录实际成功吞吐、排队、CPU/内存/IO、连接等待和模型配额。模拟模型用于容量基线,另保留真实模型少量全链路验证。
- 数据正确性不变量在全部测试中零违反。数据库/Worker 故障恢复建议 RTO≤15 分钟;灾难恢复建议 RPO≤5 分钟、RTO≤60 分钟。主机/存储全毁不在单机“零丢失”承诺内;若要求该场景 RPO=0,需另行批准同步复制、故障域与可用性取舍。
## 4. 技术决策与目标结构
KTD1. **区分 local 与 team 部署档。** local 保留 SQLite;team 强制 PG、认证、独立实例 ID、受控工具执行和启动诊断。PG 暂时不可用时返回未就绪,不切回 SQLite。个人档不因浏览器人数变多而自动升级。
KTD2. **PG 保存持久业务与调度事实。** 用户/项目/会话/消息/卡片/运行/幂等记录/命令/事件/checkpoint 元数据以 PG 为准。Redis 不成为任务完成、审批通过或永久幂等的唯一证据。初期使用同一 PG 实例和有归属的逻辑表/角色;后续拆服务时明确表的唯一写入模块,避免所有服务无约束共享整库。
KTD2 的全部状态收敛以 U5 完成为界;此前有明确的单实例过渡边界,不能提前把本地状态当成缓存:
| 数据 | 首期单实例团队版 | U5 后多实例版 |
|---|---|---|
| Backend 业务记录、幂等与恢复隔离标记 | PG 权威 | PG 权威 |
| 尚未改造的 Squad FileStore、checkpoint、续跑标记 | 唯一实例的本地权威文件,联合备份,禁止跨机接管 | 版本/归属元数据在 PG,大内容在共享对象存储 |
| 工件 | 本地对象目录,持久备份与 DB 清单绑定 | 共享不可变对象与 PG 发布记录 |
| 临时执行目录 | 单实例/单 owner;先分类再清理 | owner+epoch 控制的可恢复工作区 |
KTD3. **一个会话一次主执行,不同会话并行。** 推荐独立 conversation_execution 占用行,以 owner/会话唯一键、run_id、epoch、lease_until 约束;不对所有 runs 加“会话唯一”,以免禁止正常子代理。事务内完成权限检查、请求幂等、消息、主 run 和调度记录,接收成功以事务提交为准。
KTD4. **短事务领取,租约与 fencing 配套。** Worker 通过 PG 行锁和 SKIP LOCKED 领取到期任务;事务提交后执行,模型/工具等待不得持有数据库事务。续租、事件追加、checkpoint、终态写入都校验 run+epoch。租约用 DB 时间,执行实例 ID 与每次启动的 generation 分开。旧 Worker 恢复后不能提交;租约过期也不等于外部命令已经停止。
KTD5. **持久命令与提交事件同事务。** 取消/HITL/调度命令写入 PG inbox/outbox,带唯一 command_id、逻辑 run、执行代次与处理状态。运行级取消意图交给当前 owner,即使接受后发生接管也不能丢失;HITL 绑定稳定 gate_id+gate_version,新 owner 消费时重验 gate 与权限,过期审批明确拒绝而不静默丢弃。执行结果及确认仍须校验当前 epoch。批准数据与待投递命令原子提交,执行者幂等消费,处理确认与执行效果分别记录。关键外部动作必须有目标端幂等键、可查询凭据或人工恢复路径;超时结果未知时进入 recovering,不宣称任意工具 exactly-once。
KTD6. **事件表是重放依据,NOTIFY 仅作唤醒。** 事件提交与 outbox 同事务;需要时在同事务使用 pg_notify。监听端维护每流连续 cursor,从 EventsAfter 分页追赶到通知水位;不能直接跳到末 seq。重建连接→LISTEN 生效→补查水位/积压,再转实时。增加周期补查,覆盖通知丢失、断线与通知前后竞争。只有落库事件才能发布可恢复的 SSE ID;纯瞬时进度明确可丢失,不冒充已确认业务数据。
KTD7. **数据库乐观并发控制。** 项目设置、卡片、文档元数据等读改写带 version/expected_version;冲突返回 409 及新版本引用。重要唯一性/外键落在数据库,事务失败按错误类型有界重试整笔事务;提交结果未知先按幂等键查询。不能无限重试模型调用或发送动作。[PG 事务隔离与重试](https://www.postgresql.org/docs/current/transaction-iso.html)。
KTD8. **数据库迁移独立于普通启动。** 单一 migrator 取得数据库锁,执行 append-only 版本;可事务化 DDL 与版本登记同事务。应用仅核对兼容版本和就绪状态。不能放入事务的在线索引变更单列可恢复运维步骤,不夹入普通迁移后声称原子。使用扩展→回填→切读写→收缩,保留兼容窗口。
KTD9. **工件共享,工作区有执行 owner。** 先保留 blobstore 接口;跨主机上线前实现并验收 S3 兼容对象存储,DB 保存不可变对象键、校验和、版本与就绪状态。发布前先完整写对象再提交引用,失败孤儿可清理;删除采用标记和延迟 GC。工作区、检查点与 Squad 状态分开设计:checkpoint/调度版本入 PG,大内容入对象存储,本地工作区是受 owner/epoch 控制的暂存执行目录;需要接管时按清单恢复。共享目录和文件 rename 不能替代跨机所有权。
KTD10. **Redis 只保存可恢复的加速状态。** 保留共享限流,改为 Lua 原子计数+过期或等价原子算法,键包含实例群/完整时间窗/owner,支持 ACL 凭据/TLS、连接与请求超时。故障时普通读取可降到本地保守限流;创建 Agent/昂贵工具等写入口仍受 PG admission 硬预算保护,不能无界放行。缓存带授权/内容版本,撤权同步失效或重新校验;先证明命中收益再加缓存。[Redis INCR 限流模式](https://redis.io/docs/latest/commands/incr/)、[分布式锁限制](https://redis.io/docs/latest/develop/clients/patterns/distributed-locks/)。
KTD11. **pgvector 按“正确→测量→ANN”推进。** 复用现有全文+RRF+可选 rerank,先补 embedding profile/model/revision/dimension/content_hash/generation 身份,禁止同维不同模型混查;迁移为 vector 列并在 PG 做过滤和精确 top-k,再用基线对照决定 HNSW。权限适配器不能直接变成 SQL 时,由适配器提供受限授权候选集合或采用有界分批取候选+最终实时鉴权,不得无界加载所有 owner 后在内存过滤。授权过滤后的召回率单独验证;ANN 需要迭代扫描/分区等策略时以模型维度和版本实测选择。[pgvector 官方说明](https://github.com/pgvector/pgvector)。
KTD12. **先管理连接池,再决定 PgBouncer。** 使 MaxOpen/Idle/IdleTime/Lifetime、查询超时可配置并输出脱敏有效值;总连接预算包含所有 API、Worker、LISTEN、migrator、监控与维护预留。100 在线用户不等于 100 DB 连接。未来接 PgBouncer transaction pooling 时 LISTEN 必须使用直连或 session pool 独立 DSN,迁移也走直连,并验证 pgx prepared statement 配置。[PgBouncer 兼容表](https://www.pgbouncer.org/features.html)。
KTD13. **共享可读不等于可写或可批准。** 当前 EXT-8 `ProjectAuthz` 是只读 bool 契约。U3 先列 read/edit/approve/execute/admin 的动作授权矩阵,复用下游角色,不另建成员权威;需要共享写入时以版本化公开契约扩展 action-aware 授权,旧只读适配器不得自动获得写入能力。未配置的动作默认拒绝,Host/工具/API 均走同一授权结论;审批职责分离仍由下游规则判定。SSE 发送后续数据、异步任务开始和工件下载时重新校验当前授权,缓存失效不承担唯一安全责任。
KTD14. **迁移副本按原数据敏感级别保护。** 备份、导出、WAL、工件和测试副本使用专用角色及受限目录;传输与静态备份加密,解密材料保存在独立受管秘密存储并纳入恢复演练。日志/报告只留统计与哈希,禁止正文、令牌及密钥明文;测试使用脱敏数据。U1 固定保留期限、存放位置、访问者与清理责任,未知项阻塞正式导出。正式恢复演练同时验证凭据可用性与非授权者无法访问副本。
```mermaid
flowchart LR
U[10–100 用户] --> G[入口与认证]
G --> A[API 实例 A / B]
A --> P[(PostgreSQL + pgvector)]
A --> R[(Redis 限流 / 可重建缓存)]
P --> W[Worker 领取任务 / 持久命令]
W --> P
W --> X[受控工具工作区 / 模型服务]
W --> O[(共享对象存储)]
A --> O
P --> E[事件追赶 / 本地订阅]
E --> U
```
```mermaid
sequenceDiagram
participant C as 用户
participant A as 任意 API
participant P as PostgreSQL
participant W as 执行 Worker
C->>A: 提交 requestId / expected_version
A->>P: 短事务:鉴权、幂等、占用、消息、run、任务
P-->>A: commit / 冲突
A-->>C: 已受理与 runId / 明确冲突
W->>P: 领取任务并取得 epoch
W->>W: 事务外执行模型与工具
W->>P: 按 epoch 提交结果与事件
P-->>A: 唤醒后按 cursor 补齐
A-->>C: SSE 已提交事件
```
```mermaid
stateDiagram-v2
[*] --> queued
queued --> running: 原子领取并分配 epoch
running --> waiting: 持久 HITL
waiting --> running: 幂等命令消费
running --> completed: 有效 epoch 原子结算
running --> recovering: 失联或副作用结果未知
waiting --> recovering: owner 失效
recovering --> queued: 已核对可安全重试
recovering --> interrupted: 需人工处理或不可恢复
queued --> cancelled: 取消命令生效
running --> cancelled: 执行者确认停止
```
## 5. 实施顺序与工作包
每个阶段评审后再进入下阶段;以下均为待批准计划,不因写入文档取得实施授权。新测试文件标“新增”;现有测试只作为扩展入口,本次未运行。普通基座改动在 Backend;公开持久接口确需变化时才同步 Native/Squad/Core,并由 Dev 固定组合测试,不全库改造。
### U1. 冻结目标、数据归属与基准环境
对应 R1/R2/R7/R8。先确定目标为 Dev 团队实例及其实际发布制品,记录脱敏配置来源、DB 实例/版本/扩展、数据数量与归属、文件清单、磁盘容量、峰值和恢复目标。RDM 独立业务库、旧 Agent-System 治理库另列,不能把一次 DSN 切换宣称覆盖它们。
范围:`runtime/dev` 部署配置(实施时核对文件位置)、`modules/backend/internal/config/config.go`、文档运行手册。
产物:固定部署清单、迁移映射、容量合同(区分接纳与执行许可)、隔离测试库/目录/端口方案、KTD14 的副本保护与保留合同;确认暂态 Worker 文件哪些可重建,哪些必须迁移。
验收:仅操作批准的实例和测试资源;共享数据凭据不打印;未知 owner 或未定位的权威文件阻塞迁移。测试:脱敏配置诊断及缺项校验,业务压测依后续 U7。
### U2. 团队 PG 档、迁移器与真实数据库门禁
依赖 U1;对应 R2/R3/R7。修改 `internal/config/config.go`、`internal/app/app.go`、`internal/store/store.go`、`internal/store/migrate.go` 及 CLI;按 KTD1/KTD8/KTD12 实施。
CI 增加隔离原生 PG/Redis 生命周期及明确必跑标记,固定组件/扩展版本;缺少真实测试服务时该 job 失败而非跳过。
测试:扩展 `internal/config/config_test.go`、`internal/store/store_test.go`;新增 `internal/store/migrate_atomic_test.go`。覆盖 team 缺 DSN/PG 故障拒绝启动、local SQLite 正常、两个 migrator 竞争、DDL 与账本中间崩溃、旧 schema 升级、PG bool/时间/空 JSON/唯一约束与全文扩展。
出口:真 PG 完整 CRUD/认证/会话/SSE/检索/卡片链路通过;仅该出口不宣布多实例安全。schema 变更的组合测试与业务迁移是不同动作。
### U3. 请求原子性、版本冲突与受控容量
依赖 U2;对应 R3/R6/R7/R8。修改 `internal/server/server.go`、`internal/store/messages.go`、`internal/store/cards.go`、`internal/cardsvc/cardsvc.go`、设置读改写及 `internal/runmgr`。收口 KTD3/KTD7 的事务边界;保留现有 seq 约束。按 KTD10 完成 Redis 原子限流、配置与异常策略;PG 记录共享 admission 预算。按 KTD13 完成动作授权矩阵与所需公开扩展的兼容计划;涉及共享编辑时 Core/Host 与下游适配器一起验收。
先补最小持久恢复隔离:为未知副作用记录 recovery hold,`ResumeInterruptedChildren` 等所有启动续跑入口必须跳过,人工核对后显式解除。概念状态 recovering 可以先由独立隔离记录表达;扩展 Core 枚举时走公开契约版本,不假定当前已有此状态。完整租约接管留 U5。
测试:扩展 `internal/server/admission_test.go`、`internal/ratelimit/ratelimit_test.go`;新增 `internal/store/admission_pg_test.go`、`internal/store/card_version_test.go`、`internal/runmgr/recovery_hold_test.go`。覆盖相同请求重放、事务部分失败、同版本竞争、动作越权、子代理预算计入全局、所有父 run 占满额度后同时派生仍能前进、未知副作用重启不自动续跑、队列满、Redis 断连/恢复/键过期。
出口:单 API 团队模式达到不变量与有界行为;不会把 20 个 Agent 配置值当作已证明容量。
### U4. 可切换的迁移与恢复演练
依赖 U2/U3;对应 R2/R7。新增 `modules/backend/cmd/storage-migrate/` 或等价受管运维入口,明确只处理 Backend 库;不得直接执行 SQLite dump 作为 PG SQL。迁移实例以 migration_id、source_snapshot_id、source_schema_version 固定来源,记录表级完成与最终验证完成标记;仅同一冻结快照可续传,其他非空目标拒绝。迁移报告包括每表计数、主键映射、按主键分批规范化内容校验和、外键/owner/权限检查及工件哈希。
测试:新增迁移工具的 `main_test.go` 与 `integration_test.go`,固定脱敏 SQLite 夹具覆盖全部当前 schema、布尔/空值/时间/JSON/Unicode/二进制向量/秘密字段、幂等重复导入、缺文件、未知 owner、断点重试及目标已含数据拒绝。
操作顺序与回退见第 6 节。出口:隔离环境迁移与恢复验证完成,由用户批准窗口后才切正式服务。
### U5. 执行所有权、持久命令与共享状态
依赖 U3,团队现网切换不必等待整个 U5;对应 R4/R6/R7/R10。修改 `internal/runmgr`、`internal/store/recovery.go`、`internal/squadadapter`、`internal/runtime/squad_runner.go`、`internal/blobstore`;新增 Store 的 lease/inbox/outbox 与 PG RunStore 适配器。
按 KTD4/KTD5/KTD9 设计 Native checkpoint 接口,继续支持 local 文件实现;不把 JournalOnly 日志误当作业务上下文权威。Worker 工具沙箱与访问范围沿用现有方向,在执行端检查当前身份和 epoch。
测试:新增 `internal/runmgr/multi_instance_test.go`、`internal/store/lease_pg_test.go`、`internal/blobstore/object_store_test.go`;扩展 `internal/runmgr/recovery_test.go`。必须启动两个真实进程:同会话争抢、不同会话并行、跨实例取消/HITL、命令提交后消费前 owner 换代、旧 gate 的审批明确失效、Worker 被杀、旧 Worker 迟到结算/写事件/写文件、失联重连、副作用结果未知、文件缺失/重复发布。
出口:所有写入和工具副作用的失效 owner 处理有实证后,才允许第二实例承接写请求;故障状态可见,不能仅靠粘性路由。
### U6. 事件追赶与数据库向量检索
U6 内分三个交付切片,稳定工作包 ID 不变:事件追赶/重连修复依赖 U2,可与 U3 并行;事务 outbox 与投递闭环依赖 U5;向量 schema 与查询改造依赖 U2 迁移器及 U3 授权合同。对应 R5/R6/R9。
事件:修改 `internal/pgbus/pgbus.go`、`internal/runmgr/events.go`、`internal/server/server.go`、Store 事件接口。扩展 `internal/pgbus/pgbus_test.go`,新增 `internal/server/sse_gap_test.go`:批次 64 条全部可见、断线补齐、通知丢失、订阅与补查竞争、1000+ 分页、慢消费者、撤权后新事件拒绝。第一切片完成只证明追赶修复,不声称 KTD6 的事务 outbox 已就位。
向量:修改 `internal/store/vectors.go`、`internal/store/migrate.go` 与现有知识索引管线;新增 `internal/store/pgvector_test.go`。验证模型身份/维度隔离、内容更新/删除原子性、回填中重启、索引未完成可降级、中文全文混合、共享授权后 top-k、撤权、与精确检索 Recall@10 对照(建议≥0.95,待批准)。索引构建不得拖垮前台连接/IO。
出口:先验证正确与有界,再按容量结果决定 HNSW 与缓存;绝不以 extension 存在替代查询计划/召回证据。
### U7. 压测、故障验收与分布式放行
依赖 U2/U3/U4;双实例验收另依赖 U5/U6。对应全部 R。首期单实例放行必须完整重放现有入口的 R6 权限矩阵(含 SSE 后续事件、共享检索、下载、Host/工具与撤权),并证明 U3 恢复隔离;不能等 U5/U6 才验证这些 P0 要求。跨实例传播与接管的新增验证随 U5/U6。新增 Dev `tests/load/collaboration/` 与 `tests/integration/multi-instance/`,由隔离测试入口负责启动/回收自己创建的资源。
按第 3 节负载合同和第 7 节矩阵测量,记录原始 k6/pgbench、服务指标与数据不变量;pgbench 只测数据库能力,不能替代业务 API/SSE/Agent 验收。正式测试不打生产服务。
出口:单实例团队、双进程、双主机分别出具结果;CI 身份/链接/SHA 或独立 REPLAY 可核验才用于放行。本地 SELF 只能作辅助。变更智能体行为时补真实模型前后任务级对照。
远期 P2:需求达到后再拆 API/Worker/索引服务,按表归属收紧角色;引入 PG 高可用与自动故障转移、对象存储冗余、可选 PgBouncer。服务拆分与 DB 复制是两件事;Redis 集群、读副本和缓存不能替代主库一致性,读后写敏感路径保持主库读取或显式一致性令牌。
## 6. SQLite → PostgreSQL 切换和恢复
1. 固定源服务制品、全部数据库/文件路径与目标空库;指定迁移 owner、窗口、可接受中断和回退判据。先做只读盘点与隔离演练,不接触其他服务的数据。
2. 为 SQLite 做一致性备份(应用已有 Backup/VACUUM INTO 或官方备份路径),同时生成工件/checkpoint/工作区清单。活跃 WAL 数据库不能只复制 `.db` 文件;检查备份可打开且内容与清单匹配。
3. 预演使用独立测试目标 PG,由 migrator 建 schema/扩展,再按依赖顺序导入。显式保留 ID、幂等键、事件 seq、哈希/秘密、用户归属、共享范围、审批状态,调整序列值和类型。预演库不成为正式目标;所有副本遵守 KTD14。
4. 最终窗口暂停新写与调度,等待或安全收口在途 run;无法确认外部副作用的 run 写入 U3 的持久 recovery hold。停止全部旧写者后取最终一致性快照,导入新空正式目标;按 U4 的同快照迁移身份续传。全量对账与验收抽样完成并写入完成标记后才可切入口,保留只读源备份及过渡期权威文件。目标已服务或身份不同的非空库不得覆盖。
5. 仅一个入口切到 PG,检查版本/配置指纹、库身份与数据归属,执行用户登录、项目、会话、审批、检索、下载的冒烟;应用 fail-closed,不能故障后回 SQLite。原库不再写,不使用临时双写制造两个权威。
6. **PG 接受新写入前**可撤回切换,确认目标未产生业务写后恢复 SQLite。**PG 接受新写入后**禁止直接指回旧 SQLite;优先保留 PG 回退兼容应用或向前修复。确需反向迁移,重新冻结写者、导出 PG 增量、对账并批准专门回迁方案。
7. 建立 pg_dump 逻辑备份,以及 pg_basebackup(或等价物理基础备份)+ 连续 WAL 归档/PITR,并与对象存储版本/清单联合恢复;pg_dump 不能用作 WAL 回放的基础备份,保留足够不可变对象。每次演练恢复到新目标,核对应用可用与权限/文件完整性,不能把“备份命令成功”当作可恢复。
SQLite 本身支持可靠事务与多人经同一应用访问;WAL 提升读写并发,但同一数据库仍只有一个 writer,且不适合多主机通过网络文件系统共享 WAL。取舍基于写负载、进程拓扑、恢复与运维目标,不用“超过某人数 SQLite 就出错”的判断。[SQLite WAL 官方文档](https://sqlite.org/wal.html)。
## 7. 最小验收矩阵
| 场景 | 必须观察到的结果 | 对应 |
|---|---|---|
| 同 requestId 并发/网络超时后重试 | 一个逻辑请求和同一 run,不重做已经确认的副作用 | R3/U3/U5 |
| 两实例同会话不同请求 | 仅一个主执行;另一个排队或明确冲突,子代理不受错误唯一约束阻断 | R3/R4/U5 |
| 多项目并行、热点会话、满额度父子派生 | 公平、有界;等待父 run 不阻塞子 run 获得许可,所有任务能前进或得到有界拒绝 | R1/R8/U3/U7 |
| 并发修改同卡/设置 | 成功与冲突可辨认,无最后写入静默覆盖 | R3/U3 |
| 在 B 提交 A 所有 run 的取消/HITL,消费前换 owner | 命令持久、唯一消费;取消随逻辑 run 生效,HITL 重验 gate 版本,卡片与 run 最终一致 | R4/U5 |
| Worker 崩溃/暂停超过租约后恢复 | 新 owner 可受控接管;旧 epoch 不能提交;不明副作用不自动重放 | R4/R7/U5 |
| PG 断连/提交响应丢失 | 依赖不可用有界失败;恢复按幂等记录核对,不自动切 SQLite | R2/R3/U3 |
| Redis 断连/INCR 后崩溃 | 不改变业务事实;昂贵任务仍受硬预算;恢复无永久计数键错误 | R8/U3 |
| 批事件/断开 LISTEN/通知丢失 | 所有已提交事件按连续 cursor 追赶,重放不跳洞 | R5/U6 |
| 撤销成员权限/跨 owner 猜测 ID | 新请求、流后续事件与下载/检索/工具均不泄漏 | R6/U3/U5/U6 |
| 多模型向量/过滤后 top-k | 不混模型,权限正确,召回/延迟达批准阈值 | R9/U6 |
| 迁移崩溃/坏文件/未知 owner | 阻止切换;重试不重复导入,不隐式公开历史数据 | R7/U4 |
| 磁盘满/备份恢复/整机失效 | 清楚拒绝写入和报警;在约定故障模型与 RPO/RTO 下恢复 | R7/U4/U7 |
## 8. 工具、观测与交付
本轮未安装软件、修改配置、运行迁移、重启服务或压测。brew 已有三项服务软件,当前瓶颈主要是接线与一致性机制,暂不重复安装。未来压测可通过 [brew 安装 k6](https://formulae.brew.sh/formula/k6);PgBouncer 只在连接测量证明有必要后安装。安装授权不等于对共享数据库升级、创建扩展或变更服务的授权;执行前核对目标、版本与既有占用。
必需观测:API P95/P99与预期/非预期错误,DB pool wait/连接数/慢查询/锁等待,队列长度/最老年龄,run 租约/过期写拒绝/未知副作用,SSE cursor lag/补查次数,Redis 错误与降级,检索耗时/召回抽样,备份时间与恢复结果。日志只记录 request/run/owner 的安全标识,不记录 DSN、密钥或文档正文。
当前交付仅为 r1 方案与 SELF 调查记录。需求人数已确认;容量阈值、正式数据/部署目标、迁移窗口、灾难恢复等级和实施阶段尚待人工评审。没有业务测试 PASS、独立 REPLAY、CI GATE 或已部署声明。
方案静态审阅及修订处置见[审阅记录](../records/2026-10-11-collaboration-storage-plan-review.md)。Agent 审阅不替代人工批准或实现验收。
首选下一增量是 **U1 + U2 的详细实施与测试合同**:固定目标实例与 PG 测试环境,解决团队档、迁移原子性和真实数据库测试门禁。U6 的事件正确性修复可在单独授权后并行;不要先增加应用副本。各实现任务启动前复核在途 PR 与依赖 SHA,再按 Dev 的 evidence/task-sync/组合验证流程交付。
@@ -0,0 +1,391 @@
---
title: RDM 两树一网集成、完善与追溯审计展示方案
type: feat
date: 2026-10-11
execution: code
artifact_contract: ce-unified-plan/v1
product_contract_source: ce-plan-bootstrap
---
# RDM 两树一网集成、完善与追溯审计展示方案
修订:r1(2026-10-11 并入用户裁定);确认状态:用户评审通过(2026-10-11,需求拆解至实施计划五阶段一并,含 KTD4 双层管理员裁定);推进状态:方案已批准,业务实施、迁移、运行验收均为 NOT_RUN。
需求负责人:weichen;方案编制:Codex;实施负责人:待实施立项时指定。
来源:2026-10-11 用户要求检查两树一网现状,并设计简单直观的项目追溯、审计展示;同轮明确选择“完善 RDM,并补齐必要的基座能力”。
目标仓:Agent-System-RDM;下文 `RDM:` 路径相对于该仓,`Dev:` 路径相对于 Agent-System-Dev;所有建议接口名均为候选契约。
关联任务:Dev `.task/feature-rdm-two-trees-audit-plan.md`;本文件是本次方案唯一正文。
## Goal Capsule
推荐按**每项目一套笔记树、文档树和追溯网**管理,在现有 RDM 实现上补齐隔离、历史完整性和产品入口。
项目创建者查看自己创建项目的追溯审计;RDM 域管理员与基座超管(基座 isAdmin)查看全部项目。
管理员使用跨项目目录和筛选器进入各项目,默认不展示混合的全局关系大图。
本轮只交付现状、方案和实施验收计划;方案已于 2026-10-11 获用户评审通过,业务实施与数据迁移仍须另行立项授权。
项目独立是数据归属、授权、版本和查询范围独立,不要求每项目部署一套服务或建立一个数据库。
先用一个项目跑通业务闭环,同时用第二项目验证隔离;管理员全项目目录与历史导出随后接入,本批默认范围为 U1–U5。
---
## Product Contract
### Current State
**结论:已经实现相当一部分,适合做集成与完善;尚不能认定为满足本次要求的完整产品。**
调查基线(SELF·源码检查):
| 对象 | 固定提交 |
|---|---|
| Dev 集成仓 | `5771d4f1e5b692bce95eb64cc30dc9931079ad12` |
| Dev Backend | `ea4651b1f870d84ab9b72cfa79363b3432d113b3` |
| Dev Frontend | `3ed10e122042a64180fb24a42d9cc6438cd2d2d6` |
| RDM | `0081628a10ec48a36537c6eced11a57439c986fa` |
| RDM 实际 Backend pin | `421fee81c314c05530bc809e224b5d0818ec3472` |
| RDM 实际 Frontend pin | `84b73ab32848e623d0a0ab7ade552784dca8cf3c` |
Dev 当前源码与 RDM 实际依赖不是同一组合,升级前须分别核验公开契约。
本次没有运行业务测试、登录服务、读取业务数据库或进行浏览器验收;下列“已有”指源码存在,不能转换为“已部署/已验收”。
命令、对象 SHA、原始输出和远端在途查询由工具保存于[调查收据](../records/2026-10-11-rdm-two-trees-source-receipt.json);收据为 SELF,不是 GATE 或独立 REPLAY。
| 对象 | 源码现状 | 本次需要补齐 |
|---|---|---|
| 笔记树 | `RDM:internal/domain/notetree.go` 已有骨架、切片、锚点、标签、多点挂载、软删除;树是浏览骨架,切片可多挂载 | 独立浏览和详情读取接口;完整树导航;层级与挂载一致性 |
| 文档树 | `RDM:internal/domain/doctree.go` 已有文档、章节、正文版本与依据、状态;已有基线和审签能力 | 树式浏览、真实版本元数据、来源与变更联动 |
| 一般追溯网 | `tracenet.go`、`rdmapp/trace.go` 已有关系生命周期、邻域、多跳和图查询 | 端点完整性、同项目约束、版本定位及统一读模型 |
| 受控合规图 | `compliance.go`、`chainviews.go`、`cgraph_export.go` 已有受控节点、版本边、链视图、矩阵及导出 | 与一般关系网整合展示;补重放一致性和历史快照 |
| 项目分片 | `events.project`、`WorldFor`、按项目重放已经存在 | 清除外部入口的空项目全量回退;贯通基座项目与 RDM 项目;端到端鉴权 |
| 结构历史 | `eventlog.go`、`replay.go` 已有 seq、操作者、时间、来源、payload 和重放 | 原子批次、幂等、完整状态还原、对用户可读的时间线 |
| 现有界面 | `RDM:web/app.js` 有基线表、章节弹层、SVG 追溯图和多跳高亮 | 缺独立笔记树、统一审计页、完整项目上下文;合规图与导出尚未接入 Web |
| 基座审计 | `Host.Audit`、`audit_events`、`command_audit` 已有通用记录 | 缺显式项目作用域、结构事件关联、跨项目管理员查询及稳定分页 |
旧 `RDM:docs/design/data-model.md` 中“当前单 World、需求无产生路径”等结论已被后续代码改变,不作为当前缺口依据。
旧追溯网和受控合规图目前是分别维护的边集合;共用事件日志不等于已有一张覆盖所有对象的完整网。
### Material Gaps
以下为源码事实及控制流推导,失败/越权场景尚未动态重放。
| 编号 | 问题与依据 | 影响与处理 |
|---|---|---|
| G1 | `runtime.go:108` 空项目返回全库重放的 `rt.World`;`plugin.go:737` 的 trace/graph/hops 未检查 actor;实际 pinned Backend 的 `compiled.go:31` 和 `cmdbus.go:228` 没有领域项目授权 | 只隐藏页面入口无法隔离;旧命令、工具、图、计数、详情、导出均须使用同一服务端策略 |
| G2 | `web/app.js:69,170` 使用基座项目,命令不自动注入领域项目;`projects_api.go:43` 列出全部 RDM 项目 | 必须先建立项目身份绑定及授权后的目录,不能依赖前端选择器过滤 |
| G3 | `projects.go:18` 的 CreatedBy 与 `members.go` 的 owner 角色分离;`rdm_admins` 与基座 isAdmin 分离 | 按创建者事实授权;不能用“负责人”“成员”替代创建者;审计可见性按 KTD4 双层口径(基座超管+RDM 台账域管理员)执行,域管理员不因此获得平台管理权 |
| G4 | `notetree.go:77` 的入库/挂载逐事件提交;`tracenet.go:67` 的 candidate/confirm 分开提交;`Retag` 等先改内存再写日志 | 中途失败可能遗留部分事件或内存/数据库不一致;先补事务批次和提交后投影 |
| G5 | `compliance.go:170` 升版标 stale,但 `replay.go:230` 未对等重建;快照事件仅保存计数/hash;`replay.go:379` 正式版审签重建缺少时间/操作者 | 重启和历史回看可能与提交时不同;不得在修复前展示“历史已完整还原” |
| G6 | `conclusions.go:264` 取提案只有 id 没有 project 条件;`tracenet.go:59` 未校验关系端点归属 | 全部节点、版本、提案和关系必须在同一项目作用域解析;跨项目对象拒绝 |
| G7 | 成员/权限主要保存当前态;部分 `h.Audit` 错误被忽略;`review.go:95` 职责事件 Actor 使用受托编制人 | 补真实操作者与被操作主体分离、变更历史及可靠审计投递 |
| G8 | `Dev:modules/backend/internal/store/platform.go:187` 审计无 project 字段;命令审计按 owner/会话读取 | 不能按 target 字符串猜项目,也不能把创建者自己的动作记录冒充整个项目审计 |
### Requirements
用户明确的范围与权限优先于旧方案:RDM 负责领域,基座只补通用能力(session-settled: user-directed — chosen over 所有基座项目内建两树一网:用户选择完善 RDM)。
| ID | 需求 | 可判定验收条件 |
|---|---|---|
| R1 | 每项目独立两树一网 | A 项目查询、遍历、计数、详情、历史、导出均不出现 B 项目对象;跨项目建边被拒绝 |
| R2 | 仅项目创建者和系统管理员查看追溯审计 | 创建者可读所建项目;RDM 域管理员与基座超管可读全部;非创建者负责人、成员、非成员均不能访问审计能力;域管理员不因此获得平台管理权 |
| R3 | 展示来源与影响 | 任一支持的对象能查看来源、去向、版本与待确认关系,并打开有权限的证据 |
| R4 | 操作记录直观可读 | 能回答谁、何时、改了什么、为什么、结果如何;未知信息明确标缺失 |
| R5 | 历史真实且可重建 | 同一项目同一 seq 下,重启前后节点/关系/版本/审签/缺口一致;不可重建时明确报错 |
| R6 | 提交与记录一致 | 单命令多事件全部提交或全部不生效;重试不重复生效;并发覆盖返回明确冲突 |
| R7 | 简单、渐进展示 | 默认显示摘要、树和所选对象的一跳关系;不强制用户理解节点类型、内部事件码或原始 JSON |
| R8 | 可导出可复核结果 | 导出绑定项目、截止 seq、对象版本、规则版本、身份与生成时间;文件下载再次鉴权 |
| R9 | 复用现有能力和开发边界 | 保留 RDM 模型/计算/导出器,基座扩展经公开契约交付;无下游导入基座 internal |
| R10 | 历史数据及私人资料有清楚边界 | 未归属记录不自动塞入默认项目;项目审计不绕过私人原文访问控制 |
R2 约束项目审计中心及能返回等价审计数据的接口;普通文档阅读、协作、合法的引用展示继续遵守既有业务权限,不能顺手全部收紧为创建者专属。
模型工具同样受调用者权限约束,不通过智能体转述绕过审计读取限制。
---
## Planning Contract
### Key Technical Decisions
以下为待评审的推荐技术决策;只有显式 session-settled 标注的用户选择已在本轮确认。
- KTD1. **项目为隔离根,逻辑分区共享存储。** 查询及复合键携带实例域与 projectId;项目内对象采用稳定 ID,受控对象另带不可变版本。关系两端在同项目内解析,项目归属创建后不随意改动。共享模板/法规以固定版本引用或项目内快照进入,保留来源;第一版不建立项目 A 到项目 B 的业务边。
- KTD2. **复用两套图,通过读适配器形成统一项目视图。** 一般事实关系与受控合规关系保留不同确认及版本规则,避免一次重写两套存储。统一对象引用包含项目、类型、ID、版本、图层,防止 ID 碰撞或把不同版本误并为一个节点。`candidate` 显示“待确认”、active 显示“已确认/已生效”、retired 显示“已废止”;stale 显示“依据版本已变更”。不将模型候选画成已生效事实。
- KTD3. **一个服务端授权入口。** RDM 审计能力判定为“可信认证主体是 RDM 域管理员或基座超管(isAdmin),或等于项目 CreatedBy”。CreatedBy 固定;负责人调整不转移此权利。另设审计 read/export/history 能力映射,普通成员不能被项目负责人额外授予这些能力。权限异常拒绝读取,授权后的项目范围再进入存储,禁止先读全量后前端过滤。
- KTD4. **双层管理员:基座超管保底+RDM 台账域管理员。**(session-settled: user-directed — chosen over 两套真值完全分离与基座 isAdmin 单层直通:用户 2026-10-11 评审裁定)基座提供认证身份;基座 isAdmin 作为超管始终可查看全部项目审计,是跨项目审计的保底入口。RDM 现有唯一管理员台账继续判定域审计管理员:域管理员可读全部项目,但不因此获得平台用户/插件等管理权。基座管理区承载的 RDM 审计分区对两类管理员开放;capability 仍由服务端下发,前端只消费、不自行合并角色。历史身份不一致需显式核对,不自动提升为域管理员。普通 project.create 不自动引导域管理员;首个域管理员经受信部署引导产生,初始化唯一性由事务及数据库约束保证。台账为空、多管理员或来源不明时,域管理员路径关闭等待授权核对,超管保底路径不受影响。超管的审计访问同样落入动作审计并标记身份层级。
- KTD5. **基座项目与 RDM 项目显式一对一绑定。** 新增受约束的 hostProjectId 映射并带实例域;查询会话/工件所属基座项目后解析到 RDM 项目。不得用项目名称或默认第一个项目推断。两库创建无法单事务时用可恢复的 provisioning→ready/failed 流程和幂等标识,绑定未就绪不开放审计。EXT-8 共享资源检查使用映射后的领域项目,但不扩大成审计授权。
- KTD6. **项目命令原子写,事件为结构历史依据。** 在 RDM 存储事务内验证预期版本、端点归属与幂等键,一次提交整批事件、必要台账和 outbox;提交后更新内存投影。缓存失效或更新失败时重建,不暴露半新状态。关键事件落库失败则命令失败;跨库基座审计通过可靠 outbox 补送,不能用两次独立写入冒充事务。
- KTD7. **历史按项目+截止 seq 固定。** 可见水位只取已提交操作批次的结束 seq,时间按批次提交时间解析;显式 seq 落入批次内部时拒绝并提示可选的完整水位,不展示半次操作。保留当前全局 seq 的顺序语义,项目过滤后允许 seq 有间隙,不把它当作丢事件。快照保存完整节点/版本/边/审签/规则版本及哈希,含事件 schemaVersion;只有计数的旧快照不可作为恢复依据。未知事件版本须停止还原并说明缺口,不能静默跳过。
- KTD8. **先沿用单实例,再与团队 PG 方案衔接。** RDM 当前领域库仍是 SQLite,基座配置 PG 不会迁移它。先修事务和项目串行写入;团队档上线前将 RDM 权威事件/台账纳入有唯一写入 owner 的 PG 存储适配。多实例需数据库发号/并发控制及缓存刷新验证,不因基座支持 PG 就宣称 RDM 支持多实例。
- KTD9. **当前项目公开事实与私人过程分开。** 项目创建者能看项目审计,不因此得到成员私人会话/原件全文。内部重放载荷与对外审计 DTO 分离,原始 payload 不直接返回。摘要、正文、差异、历史快照和导出中的复制内容统一进行披露检查:当前来源 ACL 允许,或存在可核验的项目发布快照,方可输出。旧数据无来源/发布依据时默认遮蔽并标“来源受限/归属待核实”,不泄漏标题、摘要或路径。管理员看全部项目审计,仍不把凭证、模型隐藏推理或无关私聊放进审计输出。
### Architecture
```mermaid
flowchart TB
U[创建者:自己项目 / 域管理员与基座超管:全部项目] --> A[认证身份 + 审计能力校验]
A --> P[解析当前项目绑定]
P --> Q[RDM统一审计读服务]
Q --> N[笔记树与文档树投影]
Q --> G[一般追溯与受控合规图适配]
Q --> H[事件历史与完整快照]
Q --> B[基座动作审计:经授权关联查询]
Q --> V[同一追溯审计工作区]
```
两树说明“资料怎样整理、文档怎样组织”;关系说明“依据来自哪里、影响到哪里”;审计说明“谁在什么时候作出了什么变更”。
它们共用项目和对象身份,各回答一个问题,不要求用户先学习图数据库概念。
### Data and Event Contract
领域事件补足项目、operationId/requestId、真实 actor、actorType、被操作主体、对象版本、发生时间、提交 seq、原因、事件 schemaVersion,以及必要的前后差异。
一个 operationId 关联多个结构事件和基座动作审计;前端按一次操作归组,技术明细按需展开。
纠正错误通过新事件完成,保留更正者和原因;关系失效、软删除和权限变更不覆盖原历史。
权限变更审计保留当时的政策版本/决策摘要,便于解释过去为何允许;**现在能否查看**仍按当前权限判断。
前端自报审计只能标为客户端报告,不得伪装成服务端核实的批准或业务成功。
普通 hash 用于校验导出/快照一致性,不宣称具备防数据库管理员篡改或电子签名保证。
```mermaid
sequenceDiagram
participant C as 调用者
participant A as RDM命令应用层
participant D as RDM存储
participant B as 基座审计
C->>A: 项目、操作、预期版本、幂等键
A->>A: 当前授权与同项目端点检查
A->>D: 原子提交事件批次、幂等结果、outbox
D-->>A: 已提交seq及结果
A-->>C: 业务结果与可追溯操作编号
A->>A: 刷新或重建项目投影
D->>B: outbox可靠补送关联审计
```
基座暂不可用时,已提交结构事实继续保存,动作审计显示“同步中”;恢复后幂等补送。
关键业务规则需要同一库的证据记录才能放行时,在业务事务内保存;不将异步投递当作批准的前提已满足。
导出需先固定截止水位、检查完整性;审计关联仍缺失时明确标为不完整,正式完整报告应阻止导出或要求用户选择带缺口的草稿。
### Read Interfaces
优先通过现有命令总线及页面 SDK 提供 RDM 查询,所有入口落到同一应用服务;不另建绕过权限的调试 API。
| 候选读契约 | 返回内容与限制 |
|---|---|
| inspect.capabilities / inspect.projects | 可见项目、当前项目是否可审计、是否可跨项目;管理员全项目目录独立分页 |
| inspect.summary | 两树规模、待确认关系、缺口、最新动作、数据截止水位;不把缺失当作零 |
| inspect.tree / inspect.object | 树子节点分页;所选对象版本、出处、状态;只展开需要的分支 |
| inspect.relations | 方向、图层、关系状态、版本、深度;默认一跳,后续点选扩展;有数量上限和截断提示 |
| inspect.events | 按项目、对象、时间、操作者、动作、结果过滤,游标分页;可展开一次操作的差异 |
| inspect.history | 固定 seq/基线下的对象、关系和当时规则;缺少重放材料返回明确不可还原状态 |
| inspect.export | 导出同一筛选条件和截止水位;生成、取状态、下载都重新校验主体及项目权限 |
分页游标绑定项目/筛选条件/排序/权限版本,不能拿 A 项目游标读 B。
缓存、导出缓存及订阅键包含主体能力范围、项目和截止水位,撤权后不可复用旧授权结果。
异步数据只有一个状态所有者:项目切换取消旧请求并递增 generation,过期响应丢弃;事件按 seq 去重、有序应用。
### Base Extension Requests
先验证现有注册点能否组合;不足部分按 RDM 的四要素扩展申请办理,保持公开面可选、向后兼容。
| 场景 | 希望的通用能力 | 现有能力不足 | 兼容方式 |
|---|---|---|---|
| 创建者看项目内所有人的动作 | 审计 envelope 的 projectId、operationId、对象版本及按项目查询 | Host.Audit 只有 owner/action/target/evidence;按 owner 会遗漏其他成员动作 | 增加可选的结构化审计能力/接口,不直接强改所有 Host 实现;旧记录标项目未知 |
| 宿主页面展示 RDM 审计入口 | 插件提供当前主体的审计能力和可见项目,宿主提供可信身份与项目上下文 | EXT-8 只有资源共享读取布尔判断;基座 AdminZone 仅看 isAdmin | 新增可选的动作级 capability/provider;不改变旧资源授权器含义 |
| 私人来源与项目发布证据联动 | 已授权工件/版本链接与受限占位,导出后下载再校验 | 不能让全项目审计器任意扩大 owner-scoped Host | 复用现有工件访问契约,仅按实测缺口增加窄接口;禁止任意 owner impersonation |
两树对象、边规则、合规矩阵和领域重放保留在 RDM,基座不内置这些领域表。
---
## Display Design
### Entrances and Layout
项目创建者从当前项目菜单进入“追溯与审计”;RDM 域管理员与基座超管从管理区“项目追溯与审计”进入项目目录,选定项目后复用同一页面。
管理员选择项目后,审计工作区的项目上下文必须更新为实际被审计项目,所有请求与标题保持一致。宿主支持审计项目切换时,项目身份集中显示在宿主项目位置;宿主不能切至该项目时,审计页必须显示明确项目标题和“返回项目目录”,并避免让宿主旧项目标题被误认为审计范围。管理员目录显示项目名、创建者、最近活动、待关注数量。
第一版为只读审计工作区,审批、确认关系和编辑仍跳回原受控业务流程,不在审计页面创造第二套写入口。
页面保留四个入口:**概览、资料与文档、关联追溯、操作记录**。
左侧按需显示笔记树/文档树导航;主区显示当前选择;对象详情在页面内展开,原件仍进入宿主唯一文件预览区。
不叠加弹窗,不默认铺满全部节点。
| 入口 | 默认看到什么 | 深入查看 |
|---|---|---|
| 概览 | 已收集资料、已形成文档、需要确认的关系、需要补齐的证据;最近几次重要变更 | 点击数字进入带筛选的列表;明确“统计截至…”和“不完整”状态 |
| 资料与文档 | 笔记树:阶段→事项→主题→资料切片;文档树:阶段→文档→章节 | 同一资料多个挂载不重复计数;缺主题可显示未分类,不伪造层级 |
| 关联追溯 | 所选对象居中,左右分别为“来源依据”和“影响对象” | 列表优先;切换为局部关系图;合规链/矩阵在此页按需切换 |
| 操作记录 | 自然语言时间线,按一次业务操作归组 | 展开前后差异、批准依据、对象版本与技术记录 |
### Human-readable Trace
关系展示示意,实际节点与连线必须来自已保存数据:
```mermaid
flowchart LR
A[会议纪要中的原文] -->|支持| B[用户需求]
B -->|落实到| C[方案章节 v3]
C -->|由此验证| D[验证记录]
```
点选“方案章节 v3”后首先看到:这是什么、当前版本、依据哪几条材料、影响哪几项需求/验证、最近谁改过。
缺少验证记录时显示“验证依据待补齐”,不画虚构的完整链;候选边使用虚线和文字“待确认”,不能仅靠颜色区分。
“没有已知关联”与“尚未完成关系索引/本次查询被截断”分开呈现。
关系被废止后可在历史模式中看到;跨版本关系明确标注版本,不让 v4 的证据替代 v3 的事实。
### Audit Timeline
时间线示意:
- 10:32 张三将《需求说明》从 v2 更新为 v3;修改了“使用环境”章节,依据为评审纪要第 4 条。
- 10:41 李四确认该章节与 UR-012 的关联;确认理由为“已覆盖用户场景”。
- 11:05 王五批准 v3;点击可查看批准时的版本和证据。
每条默认仅显示时间、操作者、动作、对象、结果;“查看变更”再展开前后差异与理由。
后台归档、重试等技术事件默认归组收起,失败、拒绝、未知结果有文字说明;原始 JSON 不作为主界面。
Actor 为真实执行者,Subject 为被分配职责或被变更权限的人,界面不混写两者。
默认显示北京时间并注明时区,底层保留 UTC;历史模式顶部醒目标注“查看截至某时间/某基线的记录”。
### Interaction Boundaries
提供“当前/历史”切换,历史可选择时间或基线;从批准记录可直接打开批准时的版本。两树、关系与记录共用一个截止水位,“返回当前”恢复对象当前版本;对象已删除则显示删除说明,不切到同名对象。
对象名称支持搜索;树节点懒加载;记录使用“加载更多”;关系默认一跳,上限和截断状态由服务端返回。
加载、空项目、无权限、部分数据、同步中、历史不可还原、请求失败分别展示,不都渲染成“暂无数据”。
首屏不显示 SQL、事件 opcode、内部 UUID、hash;复制技术编号放在详情中。
推荐验收任务:创建者在三次主要点击内找到某章节的原始依据和最近修改原因;管理员能清楚确认当前查看哪个项目。
实现遵循 `Dev:DESIGN.md`:颜色/圆角/字号消费 `@ui` 令牌;折叠用 Collapsible;动效只用 `mk-*`;键盘可导航,状态同时有文字与形状。
优先在当前宿主工作区体系内以 RDM 插件页面提供,避免长期维护第二套静态工作台。
旧 `web/app.js` 保留过渡兼容范围,但图与审计能力接同一授权服务;最终页面交付形式在 U4 固定,不能假设在途 Generative UI 已能直接承载。
---
## Implementation Units
本批默认顺序:U1→U2→U3→U4→U5,按 `policy/delivery.md` 分增量评审。U6 是独立后续衔接项,不纳入本批完成条件。
U1 是首选下一任务;这份方案不构成启动它的授权。
### U1. 项目身份与读取授权闭环
目标/需求:R1、R2、R9、R10;依赖:方案已批准(2026-10-11)、KTD4 已按双层口径裁定;剩余既有项目映射盘点在立项时完成。
范围:`RDM:internal/projects`、`members`、`perms`、`rdmapp/runtime.go`、`projects_api.go`、`perms_api.go`、`plugins/rdm/plugin.go`、`web/app.js` 的旧客户端项目上下文;测试 `rdmapp/perms_test.go`、`sharding_test.go`、`plugins/rdm/plugin_test.go`;必要基座 capability 扩展单独申请。
建立显式项目绑定;增加审计读取策略和管理员受信引导门禁;统一包裹旧/新 trace、cgraph、项目列表、历史和导出入口。
U1 同批接通旧客户端的项目选择和命令封装,并解析可信会话/工件上下文到显式绑定;随后启用对外 projectId 必填门禁。无映射时显示“项目待绑定”,不回退全量世界。仅管理员专用迁移/调查路径能够处理未归属域,并单独留痕。
检查结论提案、引用、关系两端和版本归属,不接受来自别的项目的 ID。
普通文档协作仍使用原业务权限,避免用审计策略误封工作流程。
验证:创建者、非创建者负责人、成员、非成员、RDM 域管理员、仅基座超管六类主体(后两类均为跨项目审计正例,域管理员访问平台管理分区须为负例);空项目、伪造项目、跨项目对象、旧命令/模型工具绕过、撤权后的新请求与下载均有正负例。
增加首次启动、恢复后空台账、并发初始化、普通建项目不提权的验证。
完成条件:至少两个项目、多用户、真实认证入口下全部读取边界可复核;不依赖隐藏按钮。
### U2. 原子事件与历史还原
目标/需求:R5、R6、R10;依赖:U1 的项目合同。
范围:`RDM:internal/domain/{eventlog,notetree,doctree,tracenet,compliance,replay,persist,review}.go`、`domain/store/store.go`、`rdmapp/conclusions.go`、`upload.go` 及上传状态台账,对应 `persist_test.go`、`integrity_test.go`、`compliance_test.go`、`conclusions_test.go`、`upload_test.go`。
补事件批次事务、项目内写入串行/预期版本和操作幂等;内存变更置于提交之后。
上传原件先不可变留存,再由同一 RDM 数据库事务发布引用、状态、项目归属、切片关联、pending 关闭和幂等结果;meta.json 降为可重建镜像。上传确认/拒绝中断后按操作结果恢复,不重复入库;此项在 SQLite 首期完成,不等待 U6。
修复升版 stale、正式版审签元数据和完整快照重放;记录成员/权限/职责变化及真实 actor。
建立结构事件到基座审计的 outbox,显示投递状态;旧缺失事实明确为不可恢复,不能补造批准人或时间。
验证:第二条/最后一条事件失败、提交后进程退出、投影刷新失败、相同请求重试、并发同版本更新;重启前后对节点/版本/边/审签/缺口深比较;旧快照与未知 schemaVersion 明确拒绝冒充完整;历史/导出截止落在批次中间时拒绝,上传发布/确认中断后状态与切片不重复、不矛盾。
完成条件:命令结果、持久记录、重建投影一致,故障不造成不可解释的部分成功。
### U3. 统一项目审计读服务
目标/需求:R3、R4、R5、R8;依赖:U1、U2。
范围:`RDM:internal/rdmapp/trace.go`、`baseline.go`、`cgraph_export.go`、拟增 inspection 读投影;`plugins/rdm/plugin.go`;测试 `trace_test.go`、`chainviews_test.go` 及新增 inspection 集成测试。
把两树、一般关系、受控关系、结构事件和基座动作记录适配到统一对象详情及分页查询。
为查询绑定项目、当前授权、截止水位及版本;返回覆盖状态和截断状态。
补公开面需要的 project/operation 审计查询与能力 provider;不从字符串解析项目归属。
验证:旧网和合规网的同名 ID 不冲突,历史 v3 与当前 v4 不串用;未知/受限来源在旧 payload、差异、快照及导出副本中也不泄漏;游标换项目拒绝,分页期间新增事件不重不漏;动作审计同步延迟可见。
完成条件:无需读数据库即可通过受控接口回答来源、影响、变更与历史问题。
### U4. 项目追溯审计工作区
目标/需求:R2、R3、R4、R7;依赖:U3;页面载体在本增量设计评审时固定为宿主支持的 RDM 插件工作区。
范围:RDM 页面资源及宿主注册声明;必要时 `Dev:modules/frontend/src/components/{Workspaces,AdminZone,adminSections}.tsx`、`store.ts`、`api.ts`;交互测试沿用 frontend test/e2e 体系,旧 Web 的兼容测试留在 `RDM:web/workbench_test.mjs`。
实现四入口、两树导航、对象详情、一跳关系和自然语言记录;普通用户无入口且接口拒绝。
管理员目录按授权后的项目查询,选项目复用页面;RDM 管理 capability 不解锁其他平台管理分区。
沿用宿主文件预览、令牌和折叠;删除/替换旧重复图入口需另列兼容清单。
验证:真实浏览器完成来源查询、选择历史时间/基线并返回当前、管理员从宿主 A 打开审计 B 后标题和请求一致;模拟慢请求后快速切项目无串页;键盘、窄屏、长标题、千级节点懒加载、空/失败/受限/不可还原状态可理解。
完成条件:用户按三次主要点击任务完成取证,并人工评审界面是否直观;业务可用与视觉通过分别记录。
### U5. 历史导出与正式集成验收
目标/需求:R5、R8、R9、R10;依赖:U2、U3、U4。
范围:`RDM:internal/rdmapp/{cgraph_export,docx,xlsx}.go`、页面导出入口、导出临时工件及下载授权;测试 `domain/export_test.go`、`plugins/rdm/xlsx_export_test.go` 和浏览器下载场景。
复用 docx/xlsx 导出器,固定项目/版本/规则/截止 seq,补证据来源清单和完整性说明。
导出按请求身份和范围生成,撤权后下载失败;历史受限来源不随导出泄漏。
固定基座发布版本、RDM pins 与页面资源组合后,重放真实端到端流程。
验证:导出中途有新写入不改变已固定内容;历史来源软删除仍可按授权追溯;未归属/缺失事件可见;跨项目下载、过期下载、权限撤销均拒绝。
完成条件:同一版本在 UI 与报告中结论一致,并有正式 GATE/REPLAY 证据。
---
## Deferred Integration
### U6. 团队部署存储衔接(独立后续任务)
本项不纳入 U1–U5 的默认实施与验收范围,另经团队存储方案授权后立项。
目标/需求:R1、R5、R6、R9;依赖:U2,以及[多人协作存储方案](2026-10-11-collaboration-storage-and-distribution.md)适用增量。
范围:RDM 领域 store/迁移、项目/成员/权限/结论/慢通道台账、上传原件与导出清单;基座只补通用连接/生命周期公开契约。
明确 RDM SQLite 与团队 PG 的适配和备份清单,避免一半事实在 PG、一半未受保护地留在本机文件。
先验证单实例团队档;多实例的发号、执行所有权、缓存失效与故障恢复在独立验收前保持关闭。
本次不复制基座在途 PG 档位和迁移能力,也不把基座 PR 完成当作 RDM 迁移完成。
验证:真实 PG 的隔离/事务/重放、迁移前后对象与事件数及哈希对账、备份恢复含原件;PG 不可用不静默退回空 SQLite。
完成条件:团队部署具备明确权威存储与恢复证据;若本批仅交付单实例 SQLite,验收报告必须声明该限制。
---
## Migration and Delivery
历史归属先做只读盘点:未归属事件、缺少项目绑定、对象依赖闭包、旧快照和私人来源。
现有 seq 区间迁移接口不能作为任意截取的安全保证;归属以完整对象及依赖闭包为单位校验,并保留批准映射和原因。
不把存量自动分给首个项目,不根据当前 owner 猜历史创建者。
迁移前保存备份和对账清单,在隔离副本上验证,再取得共享环境迁移授权。
采用新增字段/投影、保留原事件、按项目启用;观察期内可关闭新页面和新读取投影,但不能恢复越权的全量读取入口。
停止条件:发现跨项目泄漏、重放不一致、无法确定历史归属、投影滞后超出可解释范围或恢复失败;保留现场和失败证据。
跨仓顺序为基座扩展申请→基座实现/测试/发布→RDM 升级固定版本→RDM 集成验证→Dev 文档与组合记录更新。
必要令牌调整按 DESIGN.md 成对关联 UI 与 Dev 组合;仅消费令牌时不制造无关令牌 PR。
在途核对(本次 Gitea API 只读,SELF;实施前须刷新):Dev #325 为团队 PG 档与迁移组合,#317 为服务启动 DSN;RDM #194 为已合入 xlsx 工作的任务卡闭合,不能重复安排 xlsx 从零实现;Backend、Documents 查询未返回开放 PR。
关联规划为 RDM 阶段总案 P3/MS3、U0 项目共享合同、V2.2 合规图方案和上述团队存储方案;本案补充集成/授权/显示,不声称这些里程碑已验收。
---
## Verification Contract
以下为实施时的验收计划,本轮结果均 NOT_RUN;文档自检另以任务收据记录。
| 组 | 覆盖需求 | 最小可复核场景 |
|---|---|---|
| 授权/隔离 | R1、R2、R10 | 六类角色×两个项目;列表、统计、详情、关系、历史、工具、导出、下载、订阅均验证;普通文档协作无误封 |
| 数据完整性 | R3、R5、R6 | 跨项目提案和边拒绝;多事件中途失败;重试/并发;重启及指定 seq 深比较;完整快照哈希 |
| 真实业务闭环 | R3–R6 | 项目创建→纪要入库→切片→需求→章节 v1→依据变化→v2→审签→历史回看→报告;缺失链节明确显示 |
| 可用性 | R4、R7 | 创建者找依据/变更原因,管理员选项目,键盘/窄屏/长文本,加载/失败/受限状态,过期响应丢弃 |
| 导出 | R8、R10 | 同一 cutoff UI/报告一致;创建与下载分别鉴权;撤权/受限来源/不完整记录不泄漏或冒充完整 |
| 组合与运行 | R9 | 固定 Backend/Core/Frontend/UI/RDM SHA;RDM 测试与构建、Dev 适用组合检查;部署后二进制身份和真实浏览器路径 |
| 团队档(U6另行立项时) | R1、R5、R6 | 真 PG、迁移与恢复;单实例和多实例证据分别记录,无变量或无环境即 NOT_RUN/SKIP |
性能建议作为待批准目标:单项目 1 万对象/5 万关系、100 万事件的样本;首屏仅取分页摘要与当前树分支;普通分页查询 P95≤1s,首屏可操作≤2s。
记录实际硬件、数据分布、过滤条件和组件版本,不能以空库或缓存命中替代容量结论。
正式审核先重放最小集再读作者证据;来源标记遵循 GATE/REPLAY/SELF,用户界面演示与正式验收分开。
---
## Definition of Done
本方案阶段完成条件:现状依据可定位、原有能力不重复建设、项目和角色边界明确、展示可理解、工作项与验收对应;r1 已于 2026-10-11 经用户评审通过(五阶段一并,含 KTD4 双层管理员裁定)。
实现阶段完成条件:R1–R10 对应证据齐备,固定组合通过正式测试和独立审核,部署与浏览器验收有独立记录;源码存在不等于完成。
已裁定决策:KTD4 采用双层管理员——基座 isAdmin 超管保底+RDM 台账域管理员(session-settled: user-directed,2026-10-11)。剩余待定决策:RDM 宿主工作区入口的具体交付契约(U4 设计评审时固定);U6 如需提前并入本批,应另行批准范围及目标环境,默认不包含。
推荐先批准 U1 的细化设计与测试范围;U2–U5 按依赖逐阶段评审,U6 单独立项,不把本轮范围确认当作连续实施授权。
后续再考虑跨项目引用审批、全局关系图、电子签名/外部防篡改存证及复杂图分析;这些不属于首个可用闭环。
+12
View File
@@ -6,12 +6,17 @@
## 先看哪一份
新增方向(已裁定取舍;U1 试验完成,r2 含结果与修订):[Generative UI 调研与插件方案 r2](2026-10-10-generative-ui-plugin.md)。
首试点为对话内完整分析页,交付采用可信编译插件;U1 试验限 MiniMax M3 + M2.7-highspeed、合成或脱敏材料、费用上限 ¥200,作为独立任务另行评审启动。
此记录独立于下方历史核验快照,不改写历史方案/PR 数量或验收结论。
| 要回答的问题 | 主记录导航 | 规划中的阶段 | 原文负责人 |
|---|---|---|---|
| 通用系统的原始边界与架构是什么 | [系统骨架](2026-09-29-system-skeleton-design-and-plan.md),结合下表专题修订 | 骨架 P0–P5;D1–D16 | weichen |
| 基座与下游如何分工,如何申请扩展 | [基座路线图](2026-10-01-base-extension-roadmap.md),配套插件契约与兼容规则 | 公开扩展面、插件 v2、质量回路、工程基座 | weichen |
| 三个智能体库如何继续演进 | [Agent 栈总案](2026-10-02-agent-stack-completion.md),阶段细化见 N1/Q1/I1、N2、N3、Q2/Q3 | R0/R1/D1、N1–N3、Q1–Q3、I1–I2、阶段评测 | weichen |
| RDM 下游的大目标和消费者里程碑是什么 | [RDM 阶段总案](2026-10-07-rdm-phase-plan.md) | P0–P4,对应 MS0'、MS1–MS4及发布前置 | weichen |
| 10–100 人协作与未来分布式如何演进 | [协作存储与分布式方案](2026-10-11-collaboration-storage-and-distribution.md) | 团队 PG 档 → 迁移恢复 → 多实例执行与故障验收;r1 已批准(2026-10-11),实施自 U1+U2 启动 | 需求:weichen;实施/运维待指定 |
以上是依据文内显式范围和引用形成的阅读入口,不是新增优先级或批准结论。N2 阶段案未单列 owner,
应由负责人补齐;不能仅凭任务创建人推断全部规划的负责人。
@@ -74,7 +79,10 @@ Dev 链接均指向对应任务 PR,可从其任务卡继续追溯组件 PR;
| [N2 实施案](2026-10-07-agent-stack-n2-plan.md) | 栈总案 N2 的六 WP:上下文、协议、工具、skills、子代理、装配 | 未单列确认状态及 owner;正文称 N2 开工 | Documents [#42](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/42) 已合入;Dev [#244](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/244) 已合入(merge `7e3ba10`),闭卡 [#247](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/247)。卡内自述六 WP 落地;本索引未重放 |
| [N3 实施案](2026-10-07-agent-stack-n3-plan.md) | 栈总案 N3:持久与可观测 | 页首未单列确认状态及 owner;正文称 N3 开工 | Documents [#43](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/43) 已合入;Dev [#248](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/248) 已合入(merge `2836a87`),闭卡 [#249](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/249)。卡内自述六 WP 落地;本索引未重放 |
| [Q2/Q3 实施案](2026-10-07-agent-stack-q2q3-plans.md) | 栈总案 Q2 拓扑与 Q3 收敛互通 | 页首未单列确认状态及 owner | Documents [#44](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/44) 已合入;Dev [#250](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/250) 采纳方案,[#251](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/251)(merge `452c00a`)与 [#253](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/253)(merge `c8ce4eb`)已合入。卡内自述 Q2/Q3 落地;本索引未重放 |
| [智能体工作流质量改进](2026-10-09-agent-quality-improvement-plan.md) | 直连主路径质量:诊断→六项裁定→P0–P5 分期 + 模型 A/B;推翻 fs 工具默认关闭裁定 | 已获实施授权(2026-10-09 六项裁定);首个增量 feature/agent-quality-phase01 | 随本提案 PR;诊断 SELF(真实运行转录);基线报告见任务卡 |
| [EXT 申请包 C1–C7](2026-10-08-ext-c1-c7-rdm-shared-contracts.md) | RDM 多人共享契约的基座最小扩展申请(EXT-6…EXT-12):身份停用/受管配置/授权适配器/索引发布/分发守卫/Host 工厂/投影过滤 | proposed;需求依据=RDM U0 主记录(D1–D9 裁定,2026-10-08 合入) | 随本提案 PR;每条现状证据为 SELF·源码级(Dev 34a2bbe/backend fe7c245),运行态 NOT_RUN;受理后逐条另立实现任务 |
| [EXT 申请包 G1](2026-10-09-ext-g1-b1-b3-exec-backend.md) | EXT-13…16:回合内共享检索、命令即工具、项目列表共享、执行后端接口 | proposed;需求依据=RDM 方案 V1.1 §3.3/§3.4/§5.3(2026-10-09 批复) | Documents [#52](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/52) 已合入;EXT-16 已实施(Dev #285,见其任务卡),其余受理评审待定。本行由本次索引维护补充 |
| [子代理分工、模型分级路由与任务沙箱](2026-10-10-agent-delegation-routing-sandbox.md) | 方向主记录:委派契约与角色路由方案(E1–E5 增量)+ 任务工作区沙箱设计(仅记录不实施);修正 overlay≠快照等三处假设 | proposed(2026-10-10);E1、E3、E4(R4+账本)、E5(R3)、S0-1 已完成(E4:Dev #315;S0-1:Backend #135/#136、Dev #318,2026-10-11);E2 暂缓(模型指示)、S0-2 待授权 | 随本提案 PR;现状核查与启动延迟为 SELF(任务卡 evidence);外部来源 URL 全量随任务卡 |
原查询的 19 份原文中,14 份显式标注 owner 为 weichen。双档存储、启动配置面、跨会话读取、文件预览和
N2 实施案这五份未单列 owner,其中预览案仅写“作者:weichen + Agent”。同步新增的 N3 与 Q2/Q3 案页首也未单列 owner。
@@ -150,3 +158,7 @@ RDM 总案把库分期作为支撑与依赖,不覆盖库分期的原始范围
后续维护:主案或任务变化时先更新其唯一主记录,再更新这里的导航和核验快照。
更换 Docs/Dev 基线后重新核对 PR、版本与在途任务;新的索引状态不自动产生实施授权。
## 2026-10-11 规划补充
- [RDM 两树一网集成、完善与追溯审计展示方案 r1](2026-10-11-rdm-two-trees-trace-audit-integration.md):对应 P3/MS3,源码已有部分实现;优先补项目绑定、创建者/管理员读取隔离与历史完整性,再接统一展示。用户确认范围为 RDM 与必要基座能力;r1 已获用户评审通过(2026-10-11,五阶段一并,含 KTD4 双层管理员裁定),业务实施与运行验收 NOT_RUN,U1 起另行立项授权。
@@ -0,0 +1,102 @@
# 基座 v0.2.0 发版记录
| 项 | 内容 |
|---|---|
| 状态 | **候选已就绪,tag 待 owner 执行**(高后果操作双钥匙:发布版本由 owner 亲手打 tag 并推送) |
| 发版授权 | owner 2026-10-09 会话:「越快越好,你来执行即可,我已同意」(Q3)。Agent 完成候选组合、验证与本记录;tag 创建与推送按 AGENTS.md 双钥匙规则由 owner 执行 |
| 主任务 | Dev 仓 `feature/base-v020-release`(任务卡即本次发版的主记录) |
| 规范依据 | Agent-System-RDM `docs/materials/12-基座发版核对清单.md`;[扩展面兼容与演进](../proposals/2026-10-01-extension-compat-policy.md) §5 |
## 1. 范围
v0.2.0 是第二段发版:在 v0.1.0 评估基线之上,附 experimental 兼容承诺(实验窗口内仍可破坏性调整,但须改快照并在提案记录)。
相对 v0.1.0 的公开面(`pkg/extension`,SurfaceVersion `2.0.0-experimental` → **`2.5.0-experimental`**):
| 扩展 | 公开面 | 来源 |
|---|---|---|
| EXT-1 | `Handler`、`Host`、`Request`、`Registry.AddCommandHandler` | Backend #66 |
| EXT-5 | `Host.ParseDocument`;内置 xlsx/pptx 解析 | Backend #67、#68 |
| EXT-8 | `ResourceAuthorizer`、`Registry.RegisterResourceAuthorizer`;工件/检索/项目流/向量/hostapi 共享读取 | Backend #105、#107、#109 |
| EXT-9 | `Host.KnowledgePublish`、`Host.KnowledgeDelete`、`Options.DisableUploadIndexing` | Backend #106 |
| EXT-11 | `SetScopedHostFactory`、`NewScopedHost` | Backend #108 |
| EXT-12 | `Options.DisableConvCardMirror` | Backend #107 |
| 执行原语硬关闭 | `Options.DisableExecTools`;CLI `--disable-exec-tools`、配置键 `disableExecTools`、环境变量 `AGENT_SYSTEM_DISABLE_EXEC_TOOLS` | Backend #110 |
同时包含的缺陷修复与行为变化(不改公开面):
- 命令审计按 owner 存储与查询(v0.1.0 的 `GET /api/commands/audit` 跨租户可见;Backend `e0b1c27`,随 #105 合入);
- DOCX 解析保留修订插入、超链接与域结果内的文字;删除/移走的原文与域代码不进正文;含修订时显式告警(Backend #110);
- agent-stack N1–N3、Q1–Q3、I1–I2 阶段的库与接线(见 Backend #69–#103)。
**升级须知(下游)**:
- 多用户共享部署在执行隔离就位前,应设置 `Options.DisableExecTools = true`。只关闭用户设置 `runtime.exec` 不够,因为任何用户都能经 `PUT /api/settings/user` 把它改回 true。
- 下游 go.mod 的 8 条 deps replace 不变(compat-policy §4)。
- 下游兼容验证:RDM PR #113 头 `d49d5c9` 的源码在 replace 指向本次 backend 候选时 `go build ./...` 与 `go test ./...` 通过(SELF,2026-10-09)。
## 2. 候选组合
| 仓 | 提交 | 依据 |
|---|---|---|
| Backend | 由 Dev 合入提交的 gitlink 决定(Backend main `f1c9cc0` 或其后) | Backend #110 合入;CI `ci / vet-and-test (push)` success |
| Core | `a253a40b8e5563119b00c4e71fb61fe0d11d6d6a` | == Dev gitlink == backend `deps/agent-system-core`(同 commit 约束) |
| Frontend | `84b73ab32848e623d0a0ab7ade552784dca8cf3c` | == Dev gitlink == Frontend main |
| UI | `76d6633736a7abb36ac1ecca42fe4e6f120d0558` | == Dev gitlink == UI main |
| Dev | 本任务 PR 合入 main 后的合入提交 | Dev CI(PR HEAD `make test` + `make build`) |
最终 SHA 以 Dev 合入后 `git ls-tree <Dev 合入提交> modules/` 的实际输出为准,执行前按 §4 核对。
**UI 仓自身 CI 现状**:UI 仓 `ci.yml` 跑在 `nightly` 运行器上,自 2026-10-04 起每次都失败于 vitest 启动(`Cannot find native binding`,rolldown 可选依赖),与代码无关。同一 UI 提交在 Dev 组合 CI 中 `npm ci && tsc && vitest` 通过(14 文件 / 103 用例;Dev run 1369),本地 Node 26 复验同样通过。v0.2.0 以 Dev 组合 CI 为 UI 的权威验证;UI 仓 runner 修复另列后续任务。
## 3. tag 消息(五仓一致)
```
SurfaceVersion 2.5.0-experimental. Adds in-proc command handlers, the owner-scoped host handle, document parsing, resource authorization, knowledge publish/revoke, scoped host recovery, the card mirror switch and the exec hard switch.
```
## 4. owner 执行步骤
先在 Dev 主检出确认合入后的组合(只读):
```bash
cd /home/weichen/projects/Agent-System-Dev && git fetch origin && git checkout main && git pull --ff-only
git status --porcelain # 必须为空
DEV=$(git rev-parse origin/main); echo $DEV
git ls-tree $DEV modules/backend modules/core modules/frontend modules/ui
# core 同 commit:以下三行必须相同
git ls-tree $DEV modules/core | awk '{print $3}'
git -C modules/core rev-parse HEAD
git -C modules/backend/deps/agent-system-core rev-parse HEAD
```
然后子仓先、Dev 后,逐仓打 tag(`<SHA>` 用上面 `ls-tree` 打印的该仓 gitlink):
```bash
MSG='SurfaceVersion 2.5.0-experimental. Adds in-proc command handlers, the owner-scoped host handle, document parsing, resource authorization, knowledge publish/revoke, scoped host recovery, the card mirror switch and the exec hard switch.'
for m in backend core frontend ui; do
SHA=$(git ls-tree $DEV modules/$m | awk '{print $3}')
git -C modules/$m fetch origin && git -C modules/$m tag -a v0.2.0 "$SHA" -m "$MSG" && git -C modules/$m push origin v0.2.0
done
git tag -a v0.2.0 "$DEV" -m "$MSG" && git push origin v0.2.0
```
推完核对(五处一致):
```bash
for m in backend core frontend ui; do
echo "$m tag=$(git -C modules/$m rev-parse v0.2.0^{commit}) gitlink=$(git ls-tree v0.2.0 modules/$m | awk '{print $3}')"
done
git ls-remote --tags origin v0.2.0
```
## 5. 发版后(Agent 可执行,tag 在位后启动)
- RDM 升钉到 v0.2.0 五仓 tag,并重定基合入 #113/#114(RDM 计划 G1-1);
- RDM 二进制设置 `DisableExecTools: true`(RDM 计划 G1-7);
- Releases 仓按 `scripts/build-release.sh 0.2.0` 构建制品与 manifest(另立任务,内部发布,不公开)。
## 6. 不做的事
- 不使用 `v0.2.0-experimental` 这类 tag 名;不在实验窗口发布 npm;不改 Go module path。
- RDM 仓 v0.2.0 tag 不在本次范围(RDM 升钉完成后另行评估)。
File diff suppressed because one or more lines are too long
@@ -0,0 +1,31 @@
# 协作存储方案 r1 静态审阅记录
对象:[方案 r1](../proposals/2026-10-11-collaboration-storage-and-distribution.md)。
日期:2026-10-11(Asia/Shanghai)。来源:SELF,Agent 辅助静态审阅。
三个 Agent 分别兼任两个视角:coherence/scope-guardian、feasibility/adversarial、security/product。
同一 Agent 的两个视角不互相独立;没有跨模型审阅、独立测试重放、CI GATE 或人工批准。
使用 ce-doc-review 的检查视角,覆盖与边界以本记录为准,不声称已运行额外外部模型审阅。
## 发现与处置
| 发现 | 原方案后果 | 修订处置 | 复核 |
|---|---|---|---|
| 正式导入与非空目标拒绝冲突 | 预演后可能无法最终导入,或放宽规则混入其他快照 | U4/§6 分开预演与正式空目标;migration_id+快照身份,只有同快照可续传,验证完成后切入口 | 原审阅 Agent 已确认文本闭合 |
| 恢复隔离晚于首期切换 | 现有 ResumeInterruptedChildren 可能自动重派未知副作用任务 | U3 前移持久 recovery hold,启动续跑跳过,U7 放行前验证 | 原审阅 Agent 已确认文本闭合 |
| 命令只绑定旧 epoch | owner 切换后取消或审批意图可能丢失 | KTD5 区分逻辑 run 取消、gate/version 审批与按 epoch 验证的执行结果 | 原审阅 Agent 已确认文本闭合 |
| 父子共享额度可能互等 | 父 run 占满许可并等待不能启动的子 run | §3/U3 区分接纳数与执行许可,等待父 run 让出许可但保留会话所有权 | 原审阅 Agent 已确认文本闭合 |
| U6 先于 outbox 依赖 | 提前声明事务投递机制完成或重复建设 | U6 分追赶修复、outbox、向量三个切片并分别列前置 | 原审阅 Agent 已确认文本闭合 |
| P0 权限检查落到后期 | 首期团队版可能未验证 SSE/检索/工具撤权 | U7 单实例放行前验证完整现有 R6 入口矩阵;新增跨机能力另验 | 原审阅 Agent 已确认文本闭合 |
| 过渡期本地权威未说清 | 尚未迁移的 checkpoint/续跑文件可能被当缓存清除 | KTD2 增加首期与多实例期归属表,联合备份,U5 前禁止跨机接管 | 原审阅 Agent 已确认文本闭合 |
| 只读适配器不足以判断写入/审批 | 可能把共享可读扩大成可写 | KTD13/U3 指定动作授权矩阵、版本化兼容与默认拒绝,不新建成员权威 | 原审阅 Agent 已确认文本闭合 |
| 迁移/备份敏感副本保护未列 | 源库秘密可能经备份旁路暴露 | KTD14 指定访问、加密、密钥分离、保留与恢复验证;正式导出前缺项阻塞 | 原审阅 Agent 已确认文本闭合 |
主编另依据 PostgreSQL 官方 PITR 文档修正备份描述:pg_dump 是逻辑备份,不能作为 WAL 回放基础;PITR 使用物理基础备份加连续 WAL。未改变用户确认的规模与未来分布式方向。
## 剩余决策与验证边界
- 10–100 人、多项目、多会话及未来多服务分布式:用户已确认需求方向。
- 量化容量/恢复目标、正式实例和数据归属、迁移窗口、资源与实施阶段:待人工评审。
- 本记录只说明文档中的九项问题已经改写并由原 Agent 复读,不说明实现缺陷已修复。
- 实施、真实 PG/Redis 测试、压测、故障注入、数据迁移、恢复演练与部署:全部 NOT_RUN。
- 方案正文与调查收据的字节摘要由文档检查命令写入 Dev 任务卡,作为本次候选身份;本文件不手写命令结果。
File diff suppressed because one or more lines are too long