Why: the 2026-10-12 approval covers the recovery U8 and account U7 additions, and the RDM U5 note still treated the lifecycle pull request as the whole export. Evidence: Backend 183 and 185 plus Dev 486 were already green; Dev 482, RDM 301, Frontend 73, and Dev 488 remain open and are not marked merged. Impact: proposal status only. No implementation or deployment claim changes. Refs: docs/proposals/2026-10-12-service-restart-data-recovery.md, docs/proposals/2026-10-12-svc-unified-deploy-and-login-key.md, docs/proposals/2026-10-11-rdm-two-trees-trace-audit-integration.md Co-authored-by: Cursor <cursoragent@cursor.com>
40 KiB
title, type, date, execution, artifact_contract, product_contract_source
| title | type | date | execution | artifact_contract | product_contract_source |
|---|---|---|---|---|---|
| RDM 两树一网集成、完善与追溯审计展示方案 | feat | 2026-10-11 | code | ce-unified-plan/v1 | ce-plan-bootstrap |
RDM 两树一网集成、完善与追溯审计展示方案
修订:r1(2026-10-11 并入用户裁定);确认状态:用户评审通过(2026-10-11,需求拆解至实施计划五阶段一并,含 KTD4 双层管理员裁定);推进状态:U1–U4 已合入。U5 的 #213 只交付了导出工件生命周期,水位重放、报告三段、草稿门和页面入口仍在进行(RDM #301、Frontend #73、Dev #488,2026-10-12,未合入)。管理区「项目追溯与审计」入口经通用声明机制补齐(扩展面 2.9.0 Registry.AddAdminZone;Backend #165、Frontend #63/#64、RDM #240、Dev #414,2026-10-12;rdm.audit 分区随 rdm 插件声明,区内能力仍由 rdm.inspect.* fail-closed);管理页插件清单另合并编译插件条目(Dev #404,2026-10-12)。U6(团队存储)独立后续;运行验收属部署环境。
需求负责人: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、原始输出和远端在途查询由工具保存于调查收据;收据为 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
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 用于校验导出/快照一致性,不宣称具备防数据库管理员篡改或电子签名保证。
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
关系展示示意,实际节点与连线必须来自已保存数据:
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 域管理员、仅基座超管六类主体(后两类均为跨项目审计正例,域管理员访问平台管理分区须为负例);空项目、伪造项目、跨项目对象、旧命令/模型工具绕过、撤权后的新请求与下载均有正负例。 增加首次启动、恢复后空台账、并发初始化、普通建项目不提权的验证。 完成条件:至少两个项目、多用户、真实认证入口下全部读取边界可复核;不依赖隐藏按钮。
进展(2026-10-11,RDM PR #195 merge 05b7d1a):U1 已实施合入——审计判定统一入口(创建者∨域管理员∨超管槽,AuthorizeAudit/AuthorizeCmd,命令面全接线,空 projectId 显式拒绝);KTD4 双层管理员落地(rdm_admins 单行台账+-bootstrap-admin 受信引导,project.create 不再自动引导);KTD5 宿主显式绑定(rdm_host_project_map+rdm.project.bind/unbind+EXT-8 映射解析+上传可信上下文解析);项目列表按主体过滤;旧客户端 web/app.js 统一注入 projectId。两项基座扩展申请已随该 PR 落盘(RDM:docs/proposals/2026-10-11-u1-base-extension-requests.md):超管槽在基座能力发版前保持 fail-closed,「仅基座超管」负例†待接线翻正;真实认证入口运行验收随 U4/U5 复核。
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 明确拒绝冒充完整;历史/导出截止落在批次中间时拒绝,上传发布/确认中断后状态与切片不重复、不矛盾。
进展(2026-10-11,RDM PR #197 merge fe8a75b):U2 已实施合入——Runtime.TxProject 事务批次(项目写锁+tx 绑定写穿+失败回滚并从库重建,零部分提交);入库拆事务内核/提交后宿主侧;结论确认/拒绝与上传五步同事务(rdm_uploads 表为事实源,meta.json 降为镜像);Retag 事件先行;重放保真(正式版 At/Actor 入载荷、CNode 升版重放重算 stale、cSnap 全量载荷+旧计数快照标 CountOnly、events schema_version 未知版本停止还原);rdm_op_log 幂等(结论/上传确认 opId);rdm_audit_outbox 同事务入箱+尽力投递+rdm.audit.status。写串行覆盖=事务面+已转换命令(用户裁定口径);进程级 kill 注入与运行验收随 U4/U5 复核。
完成条件:命令结果、持久记录、重建投影一致,故障不造成不可解释的部分成功。
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、差异、快照及导出副本中也不泄漏;游标换项目拒绝,分页期间新增事件不重不漏;动作审计同步延迟可见。 完成条件:无需读数据库即可通过受控接口回答来源、影响、变更与历史问题。
进展(2026-10-11,RDM PR #201 merge dbc41b6):U3 已实施合入——inspection.go 七面读服务(Capabilities/Summary/Tree/Object/Relations/Events/History)+统一响应壳(键集分页+截断+coverage 诚实标注);游标 base64 绑定项目(跨项目/过滤不一致拒绝);水位=已提交 max(seq);双网合流(layer 标注/kind 路由不串/ver 标注);schema v6 events.operation_id 列+TxProject BeginOperation 归组注入;披露标记(legacy-unattributed/model-candidate);rdm.inspect.* 七命令+审计面授权。基座侧动作审计待基座扩展(申请一/二)。
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 后标题和请求一致;模拟慢请求后快速切项目无串页;键盘、窄屏、长标题、千级节点懒加载、空/失败/受限/不可还原状态可理解。 完成条件:用户按三次主要点击任务完成取证,并人工评审界面是否直观;业务可用与视觉通过分别记录。
进展(2026-10-11,Dev PR #368 merge 7aa8fd9):U4 已实施合入——RdmAuditWorkspace.tsx 四入口(概览/资料文档/关联追溯/操作记录)Dev 前端 builtin 工作区,消费 U3 rdm.inspect.* 七命令面;rdmCommand 封装(receipt 解包+confirm-card 提示);DESIGN.md 令牌严格合规(0 裸色值/0 行内 fontSize/0 details/0 新增 keyframes)。附带修复 U5 遗留的 PreviewPane TS 类型错误(单参/双参签名匹配)。
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 证据。
进展(2026-10-11,RDM PR #213 merge 1dce69d):#213 只交付了导出工件生命周期——rdm_export_artifacts、三条 rdm.inspect.export.* 命令、截止水位被记录、文件名带 wm<seq>。导出内容当时仍读实时世界,报告没有三段,页面没有导出入口。
进展(2026-10-12,未合入):RDM #301 补水位重放、三段、草稿门和遮蔽;Frontend #73 与 Dev #488 补概览导出区。这些 PR 的 CI 结论以各自 HEAD 的作业为准,本文不把本地测试写成 GATE。
Deferred Integration
U6. 团队部署存储衔接(独立后续任务)
本项不纳入 U1–U5 的默认实施与验收范围,另经团队存储方案授权后立项。 目标/需求:R1、R5、R6、R9;依赖:U2,以及多人协作存储方案适用增量。 范围: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 单独立项,不把本轮范围确认当作连续实施授权。
后续再考虑跨项目引用审批、全局关系图、电子签名/外部防篡改存证及复杂图分析;这些不属于首个可用闭环。