feat: add S-52 production pipeline v2

This commit is contained in:
OpenAI Codex
2026-09-18 07:33:17 +08:00
parent a7c9812bd8
commit b9c24ff5c7
5 changed files with 357 additions and 7 deletions

View File

@@ -0,0 +1,110 @@
# CM95 S-52 Production Pipeline v2
## 1. 目标
Production Pipeline v2 将已经通过单 Tile 验证的 S-52 runtime PBF 正式接入现有 CM95 生产编排层,并增加可审计 AOI 计划能力。
核心要求是:同一个 release identity 不允许混入不同 S-52 Lookup、不同 mariner mode 或不同 AOI 的 Tile。
## 2. Production Plan v2
新计划 schema:
```text
navsea.cm95.production-plan/v2
```
Pipeline 版本:
```text
cm95pbf-production/2.0-s52-aoi
```
Plan immutable hash 现在除 Dataset、mapping、policy、FID manifest、Builder Contract、jobs 外,还冻结:
- S-52 是否启用;
- S-52 Lookup SHA256;
- Point Table;
- Boundary Table;
- `runtime/reference` mariner mode;
- AOI name;
- AOI WGS84 bbox。
S-52 Lookup 路径本身不参与 identity,内容 SHA256 才参与 identity;同内容换路径不会制造新 release。
## 3. AOI 枚举
`plan-production` 新增:
```text
--aoi-name
--aoi-bbox west,south,east,north
```
AOI 在 Web Mercator 中与 Dataset coverage 几何相交并裁剪后再枚举 XYZ job。这样不是简单按 Tile 中心筛选,边界 coverage 也不会被漏掉。
Plan `source_stats` 同时记录 AOI 裁剪前后的 coverage piece 数量。
## 4. S-52 生产参数
`plan-production` 新增:
```text
--s52-lookups
--s52-point-table Simplified|Paper
--s52-boundary-table Plain|Symbolized
--s52-mariner-mode runtime|reference
```
`build-production` 不再从命令行临时接收这些值,而是只能读取冻结 plan,随后传给 `Cm95TileBuilder`。
Build 启动前重新校验 Lookup 文件存在且 SHA256 与 plan 一致;文件发生变化时 fail-closed。
## 5. Runtime release gate
`finalize-production` 在 S-52 runtime plan 下增加 release 级 runtime contract gate。
它会解码所有输出 PBF,并检查:
- `s52_mariner_dependent` 与 `s52_runtime_csp` 一致;
- DEPARE 存在 `depth_min_m`,且没有静态 `s52_area_color` 泄漏;
- DEPCNT 存在 `contour_depth_m`;
- SOUNDG 存在 `s52_sounding_depth_m`;
- OBSTRN/WRECKS 存在 `s52_hazard_depth_m`;
- 不允许 `s52_is_safety_contour`、`s52_isolated_danger`、`s52_display_base_promoted` 等动态最终状态泄漏。
失败会把整个 release 标记为 FAIL。
## 6. Style contract 过渡
当前旧 NavSea semantic style/sprite contract 不是 S-52 runtime Adapter 的最终 contract。
因此 CLI 新增:
```text
--skip-style-contract
```
它只跳过旧 style/sprite 审计,不跳过 PBF 计数、FID、hard gate、encoder、名称冲突和 S-52 runtime contract。待 NavSea `S52RuntimePresentationAdapter` 完成后,再接入正式 S-52 style/runtime contract。
## 7. 兼容性
Loader 继续接受历史 `production-plan/v1`,但新建 plan 一律生成 v2。
旧 release 若没有与新 plan 完全一致的 S-52 production contract,不允许直接通过 `migrate-production-release` 复用 Tile。
## 8. 九州首次运行
本次 AOI:
```text
name = kyushu-main-nearby-v1
bbox = 128.0,29.5,132.5,34.8
zooms = 0-12
profile = delivery
point_table = Paper
boundary_table = Plain
mariner_mode = runtime
```
该范围用于本轮工程验证,覆盖九州本岛、对马、五岛、种子岛/屋久岛及近海,不作为日本行政区边界定义。

View File

@@ -0,0 +1,57 @@
# CM95 S-52 Production Pipeline v2 与九州运行报告 v1
日期:2026-09-18
## Pipeline 升级
已完成 Production Plan v2、S-52 immutable contract、AOI coverage 裁剪、build 参数接线、Lookup SHA fail-closed、release runtime contract gate,以及旧 style contract 的显式过渡开关。
## 福冈湾端到端 Smoke
AOI:`130.3418,33.5780,130.4297,33.6512`,z12。
Plan 枚举 4 个 Tile,`build-production --workers 4` 结果:
- PASS:4/4
- PBF:4
- output features:3235
- 主 Tile `12/3531/1641`:3164 features / 22 layers
`finalize-production --skip-style-contract`:PASS。
S-52 runtime gate:
- `mariner_dependent_count = 2261`
- `DEPARE01 = 173`
- `DEPCNT02 = 188`
- `OBSTRN04 = 19`
- `SOUNDG02 = 1881`
- `dynamic_final_leaks = {}`
- `failure_count = 0`
planned/report/decoded feature count 均为 3235。
## 九州 Production Plan
工程 AOI:`128.0,29.5,132.5,34.8`,名称 `kyushu-main-nearby-v1`。
Plan:
- schema:`navsea.cm95.production-plan/v2`
- pipeline:`cm95pbf-production/2.0-s52-aoi`
- release:`cm95-d1-62a85bd40d3a-bbaaeafee1b4`
- jobs:1109
- S-52 mariner mode:runtime
- Lookup SHA256:`f63cbc0d3c9317b1873c0b0c470a5e7371d1b6d8d58393da660f70b837a52eb7`
各级 job 数:z5=2、z6=4、z7=12、z8=24、z9=70、z10=197、z11=503、z12=297。z0-z4 在该 AOI 内没有对应 1:20M coverage,因此不制造空 job。
## 当前运行
九州 `build-production` 已使用 4 workers、最多 3 attempts 启动。
日志:`build/logs/cm95_s52_kyushu_pipeline_v2.log`
Release root:`build/releases-s52-v2/cm95-d1-62a85bd40d3a-bbaaeafee1b4`
初始 ledger:1109 jobs,4 RUNNING,1105 PENDING。后续以 `status-production` 和最终 `finalize-production` 为权威。