Files
road-compiler/.trellis/tasks/08-26-direct-edit-map-editor/design.md
que01 93f09e399e chore(road-editor): plan direct-edit task tree and add client test infra
Planning: parent design.md becomes the single authoritative contract
(constraint model with 6 kinds, handle manifest, coordinate/unit
layering, preview sequencing, storage layout and lazy migration, area
config snapshot, API contract). Work is split into four independently
verifiable child tasks with per-step gates and rollback points.

Test infra: pin vitest 4.1.11, add test:client:unit for client pure
logic, extend prettier globs to root *.ts so vitest.config.ts is checked.

Add .gitignore: the repo had none, so inputs/, outputs/, workbench-data/
and the client build output were untracked rather than ignored.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-26 17:33:42 +08:00

1.9 KiB
Raw Blame History

设计

技术合约不在本文重复定义。权威定义见父任务 .trellis/tasks/08-26-direct-manipulation-road-editor/design.md 的以下小节:

  • 「Handle manifest」— 客户端读取的字段与 reserves 禁入区语义。
  • 「坐标与单位分层」— 客户端渲染用 EPSG:3857指针位移换米必须先回 4326 再用球面距离。
  • 「预览时序与延迟预算」— 80ms 防抖、pointerup 最终请求、previewSeq 乱序丢弃、degraded 处理。
  • 「交互与预览」「编辑所有权」— 只读基线图层、三个独立 source、道路区间与 junction reserve 的边界。
  • 「客户端边界」— 遗留 app.js 不在范围、vitest 覆盖范围。
  • 「上线与回滚形态」— directEdit 开关默认关闭时的行为。

输入 adapter 的候选、探针退出条件与回退优先级见父任务 research/canvas-integration.md

本子任务的局部决定

  • 三个 source 严格分离:editHandles(手柄)、editGhost(客户端即时轮廓与辅助线)、editPreview(服务端权威几何)。基线图层始终只读,绝不写入。
  • 手柄 feature 的 properties 只带 handleId,语义一律回 manifest 查。这样客户端没有第二份约束模型。
  • ghost 只画手柄、辅助线与半透明预估轮廓,不承担权威几何。服务端预览到达后替换 editPreviewghost 随即淡出。
  • EditSession 是纯逻辑对象,不持有 OpenLayers 引用命令栈、undo/redo、previewSeq 仲裁都可在 node 环境下单测。OL 只作为它的输入输出适配层。
  • previewSeq 仲裁放在 EditSession 而非请求层:请求层只负责发与取消,丢弃决策要可测。
  • 探针独立成可删除目录,不进 MapCanvas。探针结论只影响"手柄命中与拖拽由谁实现",不影响上面任何一条。
  • 开关关闭时不注册 interaction、不请求 manifest、不创建三个 source确保零残留开销。