# ZIP 道路包安全导入与纯消费 ## Goal 让 osmWorkflow 配置、校验、解压并消费 road-compiler Web 导出的 ZIP 道路包,移除 compiler runtime 耦合。 ## Requirements - 区域配置以 `nativeRoadPackage` 指向 ZIP,路径相对于该区域配置文件;native provider 不再 接受 compiler options、overrides 或输出目录作为输入。 - 宿主在任何 Blender / Cesium 副作用前,验证 ZIP 文件、条目数量/大小、root-flat 文件路径、 无重复路径、无符号链接、无绝对路径与 `..` 路径。 - 仅将已验证的文件解压至 `/_pipeline/native-road-import//`;解压目录是宿主 私有缓存,绝不写回 ZIP 或 road-compiler 导出目录。 - 共享 importer 为 Blender、preview traffic、diagnose/check 和 stage manifest 提供同一包路径与 文件记录;不能让下游自行按字符串拼接另一份 native-road 目录。 - 移除 compiler package、CLI wrapper、compile script、编译器输入配置、以及只覆盖旧调用链的测试。 ## Acceptance Criteria - [ ] 两个有效区域均从 ZIP 完成 `blender,cesium,package,preview`,构建日志没有 compiler CLI。 - [ ] 缺 ZIP、错误 ZIP、nested root、path traversal、symbolic link、错误 contract、错误 areaId 和 manifest/source 不匹配均在启动 Blender 前失败。 - [ ] stage manifest、`diagnose:area` 与 `check:area` 记录 ZIP hash 和已验证的导入目录;ZIP 修改后会被判 stale。 - [ ] `package.json`、lockfile、生产脚本与宿主测试不再引用 `@osm-asset/road-compiler`。 - [ ] Blender digest 对 P3 control 基线一致;legacy `osm2streets` 路径的单元测试不变。 ## Out of Scope - p5a 的 ZIP 生成与 Web 下载实现。 - ZIP 远程下载、解密、签名验证或制品库管理。 - 改道路内容、材质或 legacy QGIS 行为。 ## Key Decisions - ZIP 是只读输入;宿主缓存的生命周期和目录 ownership 完全属于 `_pipeline/`。 - ZIP 解码由明确声明的 Node ZIP 库完成,而不是依赖系统 `unzip`;这使路径/符号链接校验可控并 可在单元测试中覆盖。 - 只有 `native-road-package/v1.1` 可被导入;契约升级必须另开兼容任务。