> 注意:本文件记录 v1.4 初版。生产范围已在 v1.4.1 改为 z0–z12;以 `CM95_PBF生产化阶段_v1_4_1.md` 为准。 # CM95 PBF 生产化阶段 v1.4(历史:z10–z12 初版) ## 1. 基线 本版本以已经通过 21 张 AOI 双 Gate 的 v1.3 为冻结内核。以下行为不得在本阶段随意改变: - `cm95_to_navsea_v1.yaml` 语义映射; - z10/z11/z12 extent; - scale ladder / coverage mask; - relation20 助航合成; - `OBJNAM/NOBJNM` 直接名称规则; - stable FID manifest; - hard-gate quantization fallback; - encoder 写后 Feature ID 对账。 v1.4 只增加生产编排层。 ## 2. 新增生产闭环 ### `plan-production` 从 MySQL 只读读取 `chart_cell` 与 `chart_coverage`,按当前 tile policy 中每个 zoom 的 scale ladder 枚举真实需要的 tile。 优先使用真实 coverage polygon;若某 Cell 没有 coverage,则使用 Cell bbox 作为保守 fallback,避免漏图。 生产计划冻结: - Dataset fingerprint; - mapping SHA256; - tile policy SHA256; - FID manifest fingerprint/count; - profile; - zoom; - 完整 XYZ job 列表。 任何输入在计划创建后变化,`build-production` 必须拒绝继续。 ### `build-production` - SQLite 账本; - PASS 自动跳过; - 上次异常中断的 RUNNING 自动恢复 PENDING; - FAILED 最多重试指定次数; - 有限线程并发; - 每个 tile 继续使用 v1.3 builder 自带 hard-gate 与 encoder 对账; - 空 tile 允许 PASS,但不写 `.pbf`。 ### `finalize-production` 发布前重新读取所有 report 与真实 PBF,要求: - 所有计划 job = PASS; - hard-gate unmapped = 0; - encoder dropped = 0; - nav name conflict = 0; - planned output = report output = decoded PBF feature count; - tile 内同 layer Feature ID 无重复。 同时执行全量 style filter 契约与动态 sprite closure,并生成每个 PBF 的 SHA256/bytes/feature/layer inventory。 ## 3. 产物结构 ```text build/ production/ cm95_production_plan_v1.json releases/ / production_run_v1.sqlite production_run_summary_v1.json release_manifest_v1.json pbf/ delivery/ {z}/{x}/{y}.pbf reports/ delivery/ {z}/{x}/{y}.json {z}/{x}/{y}.trace.jsonl ``` `release_id` 由 Dataset fingerprint + plan hash 确定,相同输入得到相同 release identity。 ## 4. 当前阶段不做 - 不选择 HTTP/Nginx/FastAPI serving; - 不改变 NavSea 客户端; - 不改 importer/schema; - 不增加新正式 source-layer; - 不改变 v1.3 safety semantics; - 不自动清理旧 release。 Serving 在完整 Dataset production release PASS 后再单独决定。