chore(task): archive 08-26-direct-edit-documents

This commit is contained in:
2026-08-27 09:01:21 +08:00
parent ba8eaba9d9
commit 98e8a770a3
6 changed files with 2 additions and 2 deletions

View File

@@ -0,0 +1,3 @@
{"file": ".trellis/tasks/08-26-direct-manipulation-road-editor/design.md", "reason": "逐条核对文档 schema、5 态 status、存储布局与快照规则是否与权威合约一致"}
{"file": ".trellis/spec/guides/code-reuse-thinking-guide.md", "reason": "检查是否出现第二套 hash、第二套 ID 校验或重复的 overrides 读写逻辑"}
{"file": ".trellis/tasks/08-26-direct-manipulation-road-editor/research/current-system.md", "reason": "核对 v1 overrides 文件格式与既有 import 目录未被改写"}

View File

@@ -0,0 +1,18 @@
# 设计
技术合约不在本文重复定义。权威定义见父任务 `.trellis/tasks/08-26-direct-manipulation-road-editor/design.md` 的以下小节:
- 「约束模型」— `RoadConstraintKind` 6 个取值、`SemanticAnchor` 4 种锚点、`transition``boundaryIndex` 范围、`station` 语义。
- 「文档、活动副本与 revision」— `RoadEditDocument``RoadConstraint``ConstraintStatus` 5 态表。
- 「存储布局与迁移」— 目录结构、惰性迁移、内容寻址与留存策略。
- 「area config 所有权」— 快照规则与 `areaConfigSha256`
- 「编译器几何版本变更」— `recheck` 策略。
- 「上线与回滚形态」— 服务端纯增量、v1 文件不动。
## 本子任务的局部决定
- 文档读写与 schema 校验放在编译器侧(`src/compile/` 下新增模块),不放在 `workbench/server.js`:预览、正式编译与 CLI 导出都要用它,放服务器会造成第二套实现。
- 校验只做结构与取值范围,不做几何可行性。几何不变量(最小车道宽、外缘不交叉等)属求解器职责,见 `direct-edit-solver-api`
- 惰性迁移在读取入口触发,不提供独立迁移命令:既有 import 目录数量少,且迁移是纯增量创建,失败可重试。
- `ConstraintStatus` 在本子任务只落地存储与校验;实际重放匹配逻辑属 `direct-edit-solver-api`。本任务的测试用手工构造的 status 值覆盖读写路径。
- 内容寻址采用 `sha256`,与 `RoadRevisionManifest.source.osmSha256` 同一摘要,避免两套 hash。

View File

@@ -0,0 +1,5 @@
{"file": ".trellis/tasks/08-26-direct-manipulation-road-editor/design.md", "reason": "父任务权威合约:约束模型、文档 schema、存储布局与迁移、area config 快照、编译器版本策略"}
{"file": ".trellis/tasks/08-26-direct-manipulation-road-editor/research/revisions.md", "reason": "RoadRevisionManifest 字段来源与不可变 revision 的设计理由"}
{"file": ".trellis/tasks/08-26-direct-manipulation-road-editor/research/current-system.md", "reason": "现有 ID 语义、v1 overrides 校验与 stale diagnostics 的可复用边界"}
{"file": ".trellis/spec/guides/code-reuse-thinking-guide.md", "reason": "sha256 摘要、ID 校验与 overrides 应用必须复用既有实现,不得新建第二套"}
{"file": ".trellis/spec/guides/cross-layer-thinking-guide.md", "reason": "新增 JSONL 文档与配置字段跨编译器/服务端/客户端,属该指南触发条件"}

View File

@@ -0,0 +1,40 @@
# 实施计划
对应父任务 `implement.md` 的第 0、2、3 步。每步一个提交,门禁不过就停。
## 1. 测试基础设施
- 目标:先建验证能力,避免后续"写完没法测"。
- 范围:`package.json` 增加固定版本 `vitest``test:client:unit` 脚本;建立客户端纯逻辑测试目录。不碰产品代码。
- 验证:`npm run test:client:unit`(空套件通过)、`npm run format:check``npm run test``npm run test:client``npm run build`
- 门禁:新脚本可跑通且不影响任何既有脚本。
- 回滚点:仅 `package.json` 与测试目录revert 无副作用。
## 2. v2 文档与 schema 校验
- 目标:`native-road-edits/v2` 的读写与结构校验。
- 范围:`src/compile/` 下新增文档模块6 个 kind、4 种锚点、`anchorSnapshot``ConstraintStatus``documentVersion``operations`。仅结构与取值范围校验。
- 验证:`npm run test` 新增 fixture——文档往返无损`boundaryIndex` 非整数或 `<1` 被拒;非法 station超出 `0..1``start>=end`)被拒;未知 kind 被拒kind 与锚点类型不匹配被拒provenance 指向未记录的 operation 被拒;每次写入 `documentVersion` 递增 1。
- 注意:`boundaryIndex >= laneCount` **不**属于 schema 校验——车道数是模型信息schema 层无从得知。按 `design.md`,该越界在重放时由求解器判定并转 `stale`,归 `direct-edit-solver-api`
- 门禁:校验错误信息能指出具体约束 id 与字段,不是笼统失败。
- 回滚点纯新增模块无调用方revert 无影响。
## 3. 存储布局、惰性迁移与 revision
- 目标:`active/``revisions/`、内容寻址 OSM 副本落地,既有目录可平滑接入。
- 范围:目录布局读写;读取入口触发的惰性迁移,把当前 `source.osm` + overrides + signals + area config 冻结为 `rev-0001`命名检查点创建revision 恢复读取;`RoadRevisionManifest` 写入。
- 验证:`npm run test` 新增 fixture——只含旧文件的目录被打开后生成 `rev-0001` 且既有文件字节不变;内容相同的 OSM 重复导入不产生第二份副本命名检查点冻结后可完整恢复读取manifest digest 与实际文件一致。
- 门禁:迁移对既有 `workbench-data/import-*` 只增不改revert 后旧代码仍能打开这些目录。
- 回滚点revert 后 `active/``revisions/` 只是残留目录,旧代码忽略它们。
## 4. area config 快照
- 目标:切断编译对外部区域配置文件的运行期依赖。
- 范围:活动副本与每个 revision 各写一份 `area-config.snapshot.json`;编译改读快照;`base.areaConfigSha256` 指向快照。
- 验证:`npm run test` 新增 fixture——冻结 revision 后修改外部 area config重新编译该 revision 结果不变;快照缺失时报明确错误而非静默读外部文件。
- 门禁:无 v2 文档时编译输出与快照一致。注意:仓库现有 `test/baseline/*.json` 已过期(`contract``native-road-package/v1`,当前为 `v1.1`18 个文件 hash 全部不符),且 `test/fixtures.js:26` 只断言文件存在、从不比对内容,仓库内也没有生成器。因此本步须先从当前 main 重新生成快照并接上真实比对,再谈"不变"。
- 回滚点revert 后编译回到读外部配置文件;已写快照被忽略。
## 步骤依赖
1 → 2 → 3 → 4 是硬顺序。第 4 步的 baseline 比对是本子任务能否交付的总门禁:无 v2 约束时编译输出必须与当前 main 完全一致。

View File

@@ -0,0 +1,38 @@
# 直接编辑文档与 revision 基础
父任务:`.trellis/tasks/08-26-direct-manipulation-road-editor`。需求来源与权威合约在父任务的 `prd.md` / `design.md`
## 目标
建立 `native-road-edits/v2` 文档、活动工作副本、不可变 revision 与 area config 快照,使后续求解、预览和编辑能力有可复现的持久化基础。本子任务不含任何 UI也不含约束求解。
## 顺序依赖
无前置。是 `direct-edit-solver-api``direct-edit-map-editor``direct-edit-junction-tools` 三者的前置:它们依赖本任务定义的文档 schema、`documentVersion` 与快照读取路径。
## 范围
- `vitest` 依赖与 `test:client:unit` 脚本(后续子任务的验证基础)。
- `native-road-edits/v2` 文档读写与 schema 校验6 个约束 kind、4 种锚点、`anchorSnapshot`、5 态 `ConstraintStatus``documentVersion`
- `workbench-data/import-<id>/` 内的 `active/``revisions/`、内容寻址 `osm/<sha256>.osm` 布局。
- 既有 import 目录的惰性迁移:首次打开时冻结 `rev-0001`,不移动或重写既有文件。
- `area-config.snapshot.json` 的写入与读取;编译与预览改读快照。
- 命名检查点创建与 revision 恢复读取。
## 不做
- `resolveDirectEditConstraints` 与任何几何求解(属 `direct-edit-solver-api`)。
- 预览、保存、rebase 的 HTTP 端点(属 `direct-edit-solver-api`)。
- 任何客户端改动。
- v1 `native-road-overrides.json` 的迁移或格式变更。
## 验收标准
- [ ] `vitest``test:client:unit` 可跑通空套件,且不影响既有 `test` / `test:client` / `build`
- [ ] v2 文档往返读写无损schema 校验拒绝越界 `boundaryIndex`、非法 station 与未知 kind。
- [ ] 每次成功写入使 `documentVersion` 递增 1。
- [ ] 只含旧文件的既有 `workbench-data/import-*` 目录,在新代码下可正常打开且未被改写,并生成 `rev-0001`
- [ ] 内容相同的 OSM 重复导入不产生第二份副本。
- [ ] 冻结 revision 后修改外部 area config重新编译该 revision 结果不变。
- [ ] 快照缺失时给出明确错误,不静默回退到读外部配置文件。
- [ ] `npm run format:check``npm run test``npm run test:client``npm run build` 全绿。

View File

@@ -0,0 +1,26 @@
{
"id": "direct-edit-documents",
"name": "direct-edit-documents",
"title": "直接编辑文档与 revision 基础",
"description": "native-road-edits/v2 文档、活动副本、不可变 revision、area config 快照与惰性迁移",
"status": "completed",
"dev_type": null,
"scope": null,
"package": null,
"priority": "P2",
"creator": "dingkang",
"assignee": "dingkang",
"createdAt": "2026-08-26",
"completedAt": "2026-08-27",
"branch": "feat/direct-edit-documents",
"base_branch": "main",
"worktree_path": null,
"commit": null,
"pr_url": null,
"subtasks": [],
"children": [],
"parent": "08-26-direct-manipulation-road-editor",
"relatedFiles": [],
"notes": "",
"meta": {}
}