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>
2.0 KiB
2.0 KiB
设计
技术合约不在本文重复定义。权威定义见父任务 .trellis/tasks/08-26-direct-manipulation-road-editor/design.md 的以下小节:
- 「架构边界」—
resolveDirectEditConstraints在compileGeometry()之前的插入位置与数据流。 - 「约束模型」— 6 个 kind 与各自的锚点、value、单位。
- 「Handle manifest」—
HandleManifest/EditHandle/JunctionReserve字段。 - 「坐标与单位分层」— 服务端在局部米制框架求解,传输一律 EPSG:4326 加方位角。
- 「预览时序与延迟预算」—
previewSeq回显、degraded标记、p95 ≤ 300ms。 - 「编辑所有权」「不变量」— 两域划分与必须验证的几何不变量。
- 「API 合约」— 5 个新端点、409 前置条件、既有端点的增量字段。
- 「编译器几何版本变更」—
recheck策略。
本子任务的局部决定
- 求解器是纯函数,放在
src/compile/下独立模块,不依赖fs与http:预览、正式编译与 CLI 导出共用同一实现,这是"浏览器不维护第二套几何算法"的落点。 - 米制换算全部走
src/geometry/lane-geometry.js现有的metersAt()/haversineMeters()/projectedDistanceAlong()/lateralOffsetFrom()。禁止新增换算函数;缺能力就扩展该模块。 - handle manifest 与 diagnostics 是求解器的返回值,不是编译产物文件:预览不写盘,正式编译才落 GeoJSON。
axisAzimuth由服务端算好,客户端只做投影。这样"哪个方向可拖"是语义决定而非 UI 猜测。- 重放匹配与求解分两个阶段:先把约束解析成
exact/recheck/pending/conflicted/stale,只有前两态进入求解。这样诊断与几何互不污染。 POST /api/edit-preview复用现有请求体读取与sendJson工具,不引入新的 HTTP 框架。- 端点顺序:先
GET /api/edit-state与POST /api/edit-preview(只读/无写入,风险最低),再POST /api/edits与 revision 写入端点。