4.8 KiB
CM95 S-52 静态运行时边界与四项物化修复阶段报告 v1
日期:2026-09-17
本阶段目标
本阶段先解决 NavSea 用户可自定义水深显示与 CM95 固定 S-52 参考参数之间的架构冲突,再继续修复此前发现的四项 PBF Presentation 物化问题。
已完成的架构调整
新增 runtime / reference 两种 S-52 mariner mode。
runtime 为 NavSea Delivery 默认方向。以下依赖船员水深设置的 CSP 不再按固定 S52MarinerSettings 提前物化最终结果:
DEPARE01 / DEPARE02DEPCNT02SOUNDG02OBSTRN04WRECKS02
PBF 改为保留运行时所需事实,包括:
depth_min_m / depth_max_mcontour_depth_ms52_sounding_depth_ms52_hazard_depth_m- hazard 周围水深摘要和相关 S-57 code
s52_mariner_dependents52_runtime_csp- 未解析的
s52_csp
reference 继续按固定 S52MarinerSettings 解析,专用于 OpenCPN/S-52 对照。
本次 Delivery 字段与语义发生变化,因此 Builder Contract 已提升为 cm95pbf-builder/0.4.8-s52-mariner-runtime-boundary;后续正式 Production Plan 必须重新生成,旧 Plan 不应复用于本版本全国构建。
四项物化问题修复
1. DisplayBase / Priority side effect
reference 模式下,isolated danger 触发后现在会把:
s52_display_category更新为Displaybases52_display_priority更新为Hazards
runtime 模式不会写入该动态提升结果。
2. OP priority override
OP(6---) 等 priority override 现在按 S-52 priority code 映射到最终 s52_display_priority,同时保留原始 s52_priority_override 供审计。
3. 多 SY / LS 保真
- 多
SY:保留s52_symbol_sequence,新增s52_symbol_count - 多
LS:新增s52_line_sequence与s52_line_count
第一条兼容字段继续保留,避免破坏当前消费者。
4. SY ORIENT
通用 SY(symbol,ORIENT) 现在根据对象属性解析角度,并输出:
s52_symbol_rotation_degs52_symbol_rotation_sources52_symbol_rule_sequence
无法解析角度时 fail-closed,不制造默认方向。
验证结果
定向 Python 验证已通过:
compileall:PASS- runtime DEPARE/DEPCNT/SOUNDG/WRECKS 不再固化 mariner-dependent 最终结果:PASS
- reference WRECKS isolated danger →
Displaybase / Hazards:PASS - runtime WRECKS 不产生
s52_display_base_promoted:PASS OP(6---)→Area Symbol:PASS- 双
LSsequence 保留:PASS SY(...,ORIENT)123.5° 解析:PASS- Delivery allowlist 对新增深度事实和 structured symbol rule scalarize:PASS
已知边界
Plain / Symbolized Boundaries 本身也是 mariner presentation 设置,但它涉及 Area Lookup Table 选择,不只是 CSP 输出。当前 v1 没有伪装成已完全 runtime 化;后续需由 S-52 Style Compiler / NavSea Runtime 持有两套边界规则后再解除构建时选择。
福冈湾单 Tile PBF 合同回归
已对 z12/3531/1641 分别生成 Delivery runtime/reference PBF。两种模式均:
- 输出 Feature:3164
- 输出 Layer:22
hard_gate_unmapped:0
runtime 模式中共有 2260 个 s52_mariner_dependent=1 Feature:
SOUNDG02:1881DEPCNT02:188DEPARE01:172OBSTRN04:19
这些 Feature 中 s52_area_color、s52_is_safety_contour、s52_sounding_prefix、s52_sounding_is_shallow、s52_isolated_danger、s52_display_base_promoted 均为 0 个,确认固定 mariner 结果没有泄漏进 runtime PBF。
同时实际进入 runtime Delivery PBF 的事实字段包括:
depth_min_m:172depth_max_m:168(其余对象源数据无有效 DRVAL2)contour_depth_m:188s52_sounding_depth_m:1881s52_hazard_depth_m:19- 周围水深摘要字段:19
reference 模式中:
- runtime marker:0
s52_is_safety_contour=1:91- 多 SOUNDG
s52_symbol_count:1684 个 Feature - ORIENT rotation 字段:60 个 Feature
本 tile 没有触发 isolated danger / OP override / 多 LS,因此这三项仍由定向规则验证覆盖;reference isolated danger、OP(6---) 和双 LS 的定向验证均已 PASS。
已新增可重复执行的合同审计工具 tools/cm95_s52_runtime_contract_check.py。对本次 runtime/reference 两张 PBF 执行结果为 PASS,dynamic_final_leaks={}。
NavSea Runtime 消费契约
已新增 docs/CM95_S52_NavSea运行时呈现契约_v1.md,冻结 DEPARE、DEPCNT、SOUNDG、hazard 的 Runtime Adapter 输入/输出、设置快照、ContourCatalog、fail-closed 和无需重载 PBF 的更新流程。
下一步
CM95/PBF 侧本阶段可以冻结。下一阶段应在 NavSea 当前实际代码基线上调查现有水深颜色设置、MapLibre style 更新入口和图层 Adapter,再按该契约做最小接入;在 NavSea Runtime 接口验证前,不做全国 PBF 重建。