Compare commits
13
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ca9b128f18 | ||
|
|
5ac58dcd7e | ||
|
|
0be6c2d3ee | ||
|
|
d3e40c783d | ||
|
|
76f49b2bc7 | ||
|
|
336a90f0ad | ||
|
|
474955b64d | ||
|
|
b857595025 | ||
|
|
b3171b3d51 | ||
|
|
3e2d8c9049 | ||
|
|
a47ef7ffcf | ||
|
|
3304efee15 | ||
|
|
4ca58c3d8a |
@@ -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 # 环境变量定位文件
|
||||
```
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
title: Generative UI research and plugin proposal
|
||||
date: 2026-10-10
|
||||
type: feat
|
||||
revision: r1
|
||||
revision: r2
|
||||
product_contract_source: user-request-and-current-source
|
||||
---
|
||||
|
||||
@@ -374,7 +374,7 @@ AG-UI 仅在需要跨 Agent 框架互通时评估事件适配;MCP Apps 仅在
|
||||
|
||||
### U1. 受控价值与选型试验
|
||||
|
||||
- 关联 R1/R4/R10;依赖:已满足——2026-10-11 用户批准试验范围(见文末“用户裁定记录”);作为独立任务另行启动并评审。
|
||||
- 关联 R1/R4/R10;依赖:已满足并**已执行**(2026-10-11,任务 feature/generative-ui-u1);结果见下节“U1 结果与 r2 修订”。
|
||||
- 对象:固定当前组件 SHA,在隔离工作区用合成或获准的脱敏材料,覆盖调研比较、任务概览、需求输入三类。
|
||||
- 方法:先比较“固定 UI/文本”与“原生 UINode 动态组合”;再用少量相同样本比较 json-render/A2UI renderer 接 @ui 的复杂度与缺口。后者是 renderer 选型挑战,不另建全套后端。
|
||||
- 文件范围:专用实验目录、组件契约夹具与评测说明;全部明确为原型,不替换生产路径。
|
||||
@@ -436,6 +436,33 @@ AG-UI 仅在需要跨 Agent 框架互通时评估事件适配;MCP Apps 仅在
|
||||
|
||||
---
|
||||
|
||||
|
||||
### 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 预算缺陷已修复重跑(事故记录见报告第六节)。
|
||||
|
||||
## 验证与评估
|
||||
|
||||
### 试点评价方法
|
||||
|
||||
@@ -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,7 +6,7 @@
|
||||
|
||||
## 先看哪一份
|
||||
|
||||
新增方向(2026-10-11 用户已裁定关键取舍):[Generative UI 调研与插件方案 r1](2026-10-10-generative-ui-plugin.md)。
|
||||
新增方向(已裁定取舍;U1 试验完成,r2 含结果与修订):[Generative UI 调研与插件方案 r2](2026-10-10-generative-ui-plugin.md)。
|
||||
首试点为对话内完整分析页,交付采用可信编译插件;U1 试验限 MiniMax M3 + M2.7-highspeed、合成或脱敏材料、费用上限 ¥200,作为独立任务另行评审启动。
|
||||
此记录独立于下方历史核验快照,不改写历史方案/PR 数量或验收结论。
|
||||
|
||||
@@ -158,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