Why: The user approved the W3 remainder at stage 6 on 2026-10-20 and authorized merging RDM #451 into RDM main. Evidence: RDM #451 merged at 76b4c05 after head f3fa0c0 status success; merged tree 4cfacf16 matches the pre-merge merge-tree. Impact: Task cards and review package only; W4 write entry points must first add node placement checks. Refs: Agent-System-RDM#451, Agent-System-Dev#641 Co-authored-by: Cursor <cursoragent@cursor.com>
6.0 KiB
6.0 KiB
两棵树后续 W3 余项:阶段 6 评审包
- 状态:用户阶段 6 通过(2026-10-20)。确认第 3 节切分:W4 开放结构写入口前必须先补节点种类放置检查。RDM PR #451 经用户授权已合入 RDM main(
76b4c05);本子任务 PR 合入 initiative 分支。 - 日期:2026-10-19;作者:host;子任务分支:Dev
feature/rdm-two-trees-followup-w3-rest(父feature/rdm-two-trees-followup)、RDMfeature/rdm-two-trees-followup-w3-rest(base RDM main5a27d78)。 - 依据:阶段 5 计划 W3(已批准);A1 评审包第 2 节差距核对。
1. 本增量交付
| 差距项(A1 第 2 节) | 交付 | RDM 提交 | 目标测试 |
|---|---|---|---|
| 图形不透明块 | ContentBlock.Kind 新增 figure:不透明叶子,禁子块/重复/跨格,必须引用带 SHA-256 的附件或 Word 槽位;实例化、重放、NodesOf 逐字节保持 |
013b8b1 |
TestRecursiveBlockFigure* |
| 重复表格(待复核) | 补精确用例:重复行与 v2 重复章节通过校验、实例节点 ID 各异、保留 Repeat 与 RowSpan/ColSpan、可重放;非法位置拒绝 |
013b8b1 |
TestRecursiveBlockRepeat* |
| 移动/改名保持引用 | 领域原语 MoveNode/RenameNode,新事件 doc.node.move/doc.node.rename:节点 ID、模板块、内容不变;兄弟序连续重排;文档结构修订 +1,乐观并发;拒绝环、陈旧修订、旧章节节点、空标题、只读日志;live 与 replay 共用同一算法;前缀重放可取回更早结构 |
96d53f6 |
TestRecursiveBlockMove*、TestRecursiveBlockRename*、TestRecursiveBlockMoveRenameNodeRefsSurviveStoreRestart |
| 旧库备份迁移两次同值;已批准版与旧下载可回取 | 新增 TestLegacyDocMigration*:旧形态库(文档/章节/版本/批准)复制为备份副本后两次独立打开与重放,事件行、序号、迁移版本与 NodesOf 一致,第二次不写入;未知未来事件类型在启动时写前拒绝;迁移后已批准版与审批提交下载字节/哈希不变(只增测试,未改生产代码) |
f3fa0c0 |
TestLegacyDocMigration* |
Dev:删除无效 SVC_RCFWEB_ADDR |
tests/test_svc_realcombo.py 删除 svc.sh 从不读取的 SVC_RCFWEB_ADDR |
Dev 80ac3fa |
py_compile |
2. 验证
- host 本地验证(SELF)@RDM
f3fa0c0:gofmt、go vet ./internal/domain/... ./internal/rdmapp、git diff --check通过;目标选择器GOWORK=off go test ./internal/domain ./internal/rdmapp -run 'TestRecursiveBlock|TestLegacyDocMigration|TestTemplateBinding' -count=120 项 PASS;./internal/domain/... ./internal/rdmapp全量 PASS。 - CI(GATE):RDM 草稿 PR #451 与本子任务 PR 当前 HEAD 检查(见 PR)。
- 独立 Review(全新会话 code-reviewer,只接收需求、base/head 与 diff;评审者自跑为 SELF):
5a27d78..f3fa0c0PASS-with-fixes,无阻塞项。确认:克隆与摘除无共享切片、校验全过才写入;live 与 replay 共用算法;伪造节点 ID/旧章节/未知 op 被拒;validateDocNodes对既有调用方等价;无新增写入口;测试断言非空。非阻塞项(建议 W4 开放写入口前修):- 移动不检查节点种类放置关系(row 可移出 table、cell 可移出 row),
rendererNodeKind会照常渲染为表格行;应在movedDocNodes加放置检查并把相应测试改为预期拒绝——列为 W4 写入口的前置条件。 TestLegacyDocMigration在 WAL 模式下计算哈希可能漏掉-wal中的写入。- Postgres 用例的“第二次不写库”写入次数硬编码为 0。
figure在渲染时退化为空段落(超出本增量需求,导出前须映射或显式报错)。 另:移动/改名事件Target与载荷DocID未做一致性校验;重放查找不过滤已删除文档(当前无删除路径)。
- 移动不检查节点种类放置关系(row 可移出 table、cell 可移出 row),
3. 风险与需人审确认
- 与 W4 的边界:移动/改名只提供领域原语,没有 HTTP 路由、插件命令或 rdmapp 写入口;按阶段 5 计划,结构变更须经 W4 结构提案与人工确认后才能调用。W4 开放写入口前须先补节点种类放置检查(独立 Review 非阻塞项 1)。请确认这一切分。
- 合入冲突:
internal/domain/template_asset.go(figure 校验)同时被在途的 project-access-lifecycle 任务修改;本增量只新增一个 case 和一个函数,后合入的一方需要按最新 main 解决冲突。 - 事件契约新增:两种新事件对旧二进制属于未知未来事件,旧版本读到时会拒绝启动写入(符合计划的“未知未来事件拒绝”);部署顺序须先升级再产生新事件。
- 完成条件中的业务项:“真实项目实例表达新项目建议书及用户需求 12 组要求”依赖 W11 DHF 资产 published,本增量只验证实例机制,不宣称正式标准模板可用。
4. 执行记录
| 单元 | CLI/候选 | 终态 | 收据(源码外) |
|---|---|---|---|
| w3-rest-u1-figure-opaque-repeat-table | Cursor attempt 1 | success | /tmp/leftover-20261019b/w3-u1-receipt.json |
| w3-rest-u2-node-move-rename-refs | Cursor attempt 1 | success | /tmp/leftover-20261019b/w3-u2-receipt.json |
| w3-rest-u3-legacy-migration-approved-retrieval | Cursor run 1 failed-unknown(host 在其运行期间集成 u1,HEAD 变化);用户授权全新 run 2 |
run 2 blocked(隔离区缺 pins/ 无法编译 rdmapp);修正单元包后经用户授权 run 3 success |
/tmp/leftover-20261019b/w3-u3-receipt*.json |
| w3-rest-dev-drop-svc-rcfweb-addr | Cursor run 1 invalid-config(单元包未就绪)、run 2 failed-unknown(Cursor 连接反复失败);用户授权全新 run 3 |
success | /tmp/leftover-20261019b/w3-dev-receipt*.json |