Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ca9b128f18 | ||
|
|
5ac58dcd7e | ||
|
|
0be6c2d3ee | ||
|
|
d3e40c783d | ||
|
|
76f49b2bc7 | ||
|
|
336a90f0ad | ||
|
|
474955b64d | ||
|
|
b857595025 | ||
|
|
b3171b3d51 | ||
|
|
3e2d8c9049 | ||
|
|
a47ef7ffcf | ||
|
|
3304efee15 | ||
|
|
4ca58c3d8a | ||
|
|
95a7c111d5 | ||
|
|
95e5c9d307 |
@@ -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 回放基础。每次演练恢复到新目标并核对。
|
||||
@@ -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 # 环境变量定位文件
|
||||
```
|
||||
|
||||
|
||||
@@ -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,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 单独立项,不把本轮范围确认当作连续实施授权。
|
||||
|
||||
后续再考虑跨项目引用审批、全局关系图、电子签名/外部防篡改存证及复杂图分析;这些不属于首个可用闭环。
|
||||
@@ -6,6 +6,10 @@
|
||||
|
||||
## 先看哪一份
|
||||
|
||||
新增方向(已裁定取舍;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 |
|
||||
@@ -154,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 起另行立项授权。
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user