Files
pbf/docs/报告/NAVSEA-PBF-MULTISOURCE_阶段B2-4_原始Feature身份重放与组件关联_RDC完成报告_v1.md

8.4 KiB
Raw Blame History

NAVSEA-PBF-MULTISOURCE 阶段 B2.4:原始 Feature 身份重放与组件关联 RDC 完成报告 v1

  • 日期:2026-10-12
  • 阶段结论:原始 PBF 特征实例重放与 Composite 组件同源性样本验证 PASS;PRIMARY、跨瓦片全局身份与业务执行契约尚未完成。
  • 最高优先级依据:NavSea《多源 PBF:通用解释器与标准层映射强制原则 v1》及现行 Chart Provider Contract v3、004 Style Visual Object 契约候选。
  • 重要状态差异:本报告中的“475/475”指全量 Catalog 的每个不同 Visual Object 各取一条已记录实际 Feature 样本。不是全量 976,534 次 Visual Occurrence 的逐项检查。

1. 实际环境与边界

  • 执行机器:RDC / tei-ThinkPad-X220(Linux),代码仓库:/root/sourceserver/pbf-provider-pipeline-v1,分支 feature/provider-pipeline-v1。
  • HEAD 基线:d046d7ee0d9f2030d974d0e5435ae6571b0b4489。当前 Worktree 继承 B2.1、B2.3 修改及未跟踪报告;没有创建或切换分支/Worktree。
  • NavSea 当前参考仓库为 CARBON7i:D:\React\NavSea-PBF-Multisource,分支 feature/pbf-multisource,HEAD 78d7ffeccc95469ef3be62701b7b805b5a50c1f8;本轮未修改 NavSea Runtime。
  • 使用原始 PBF:/root/sourceserver/cm95/build/releases-s52-v2/cm95-d1-62a85bd40d3a-ae61b8866e80/pbf/delivery。
  • 使用原始 Style/Sprite 的同 SHA 快照:dist/cm95/s52-full/1.1.0/resources-style.json 等;Style SHA 为 b1d3d0060012a8e4b55a6053231231d742ec415b3a8398f9ae0867bbdfa5290b。
  • 原 CM95 1.1.0 ZIP SHA 为 fb5bc2606ab61662c16eccd22225532779830779e931f623bac4cf049e6b737f,本轮结束仍不变。未重建正式 ZIP、未重写原 PBF/Style/Sprite、未 Tag/Commit/Push、未进行 Android/iOS 编译安装或 Jest/Codex。

2. 重新核实的原有算法事实

tools/visual-object-instantiation/instantiate_pbf_visual_objects.py 通过如下方式制作原始证据:

  1. 遍历每个 PBF Tile 的每个原始 tile Layer 与 Feature;
  2. 对单个 raw Feature 的原始属性依 Style 层顺序判断其 filter 与 zoom,并由同一 Feature 的属性解析所有绘制组件;
  3. 对单个 Feature 形成 Composite Render Signature,计算 Visual Object 类型标识 visual_object_id;
  4. 记录该原始 Feature 的 tile、source-layer、feature_id、相关组件和 matched Style Layer。

因此单个 Visual Object 的绘制组件不是通过地理位置靠近而被拼接。但是类型 ID 并不等于物理海上实体的跨瓦片身份,更不等于 PRIMARY 的业务审查结论。

  • 全量 Catalog:475 类视觉组合、976,534 次 matched visual occurrence、177,383 个 Tile。
  • 原有全量 Catalog 仅包含每类一条 example.tile/feature_id 与计数;实际 不含完整 occurrences 数组。不能把它误认为 976,534 条逐实例证据已被本轮重新验证。
  • 工作目录中的三张样本瓦片对应 2,077 次 Occurrence;样本中含 574 次多绘制组件,同一 tile+source-layer+feature_id 没有重复。三张样本之间未发现同一 source-layer+feature_id 跨 Tile 重用,但不能据此证明它是 Provider 全域唯一的实体 ID。

3. 实际实施

新文件:tools/provider-pipeline/feature_lineage_replay_audit.py。

  • 使用现有 Visual Object 实例化器的解码、原始 Style 表达式评价、组件构造与签名算法(不另造 CM95 语义分类器)。
  • 对 Catalog 中每个 Visual Object 的一个真实 example,根据 tile+source-layer+feature_id 在原始 PBF 文件精确找回 Feature。Feature ID 缺失、重复,Tile/原始 source-layer 不存在,均 fail-closed。
  • 重新执行 Style 原始 filter、zoom 判断、icon/text/line/fill 的资源和视觉签名组合,生成同一 Feature 的 Composite Visual Object 类型 ID,与 Catalog 记录比较。
  • Style 两个不同 Source 同名 source-layer 时拒绝假定唯一 source;同一 PBF Tile 有重复的 source-layer 名称时拒绝接受,不把歧义变成可执行绑定。
  • 只输出静态证据数据。每条结果 primaryComponentAuthorized=false、displaySelectorAuthorized=false;不生产 Runtime Binding、不会指定 PRIMARY,也不向 NavSea 执行计划自动增权。
  • CLI 允许单独指定原 Catalog、Style、Sprite JSON/PNG、PBF 根目录及输出报告,不硬编码 CM95 资源名。执行时核对 Catalog 所声明原 Style 快照与当前 Style 文件的 SHA-256。
  • 真实运行须用仓库既有 .venv/bin/python。系统 python3 未安装 mapbox_vector_tile,初次执行因此退出;改用已有虚拟环境后可正常执行,没有临时安装新依赖。

新增测试:tests/test_feature_lineage_replay_audit.py。以不同 Provider 的属性字段 symbol 与 providerIconCode 构造两套合成原始 PBF,验证单组件、多组件、Feature 不存在/重复、Composite 改动、同名 source-layer 的跨 Source 歧义、缺失 Tile 等保护。

4. 实际数据与结果

真实 CM95 全量 Catalog 示例重放:

  • 475/475 个不同 Visual Object 类型各抽取其 Catalog 中记录的一个原始 Feature example;
  • 使用原始 Style、Sprite 和 PBF 原始瓦片重算后,475 个均为 SAME_RAW_FEATURE_REPLAY_CONFIRMED;
  • 475 类所用原始 Feature example 分布于 261 个不同 Tile;
  • primaryComponentAuthorizedCount=0,displaySelectorAuthorizedCount=0;
  • 报告位置:docs/报告/NAVSEA-PBF-MULTISOURCE_阶段B2-4_原始Feature实例重放审计_v1.json。
  • 三张旧样本的同一 tile+source-layer+feature_id 重复数为 0,Feature ID 缺失数为 0;这是三张样本的事实,不能扩大为全区域保证。

执行与自动检查:

  • ./.venv/bin/python -m unittest discover -s tests -p 'test_*.py' -v,24/24 PASS(新增 B2.4 测试 5,原 B2.3 / B2.1 测试 19),退出码 0。
  • 原始 475 类实地证据重放 CLI:返回退出 0,所有 475/475 匹配。
  • B2.3 既有静态证据审计的 29 个混合 Style Layer 与 146 个 UNKNOWN/AMBIGUOUS 对象不因为本轮组件同源性验证而转为已确认业务类别。
  • git diff --check 及受本轮写入的文件完整性检查在末尾另行记录。

5. 仍然缺失的正式契约

  1. PRIMARY:本轮只证明“一条原始 Feature 被原始 Style 的多个 Layer 命中并重算成同一复合视觉类型”,未证明其中哪一个渲染 component 应成为 PRIMARY,更不能把 Composite visual_object_id 当成真实实体 ID。
  2. 全域 Feature identity:tile + source-layer + feature_id 只用于当前原始 Tile 内的单次重放定位,不等于跨瓦片、跨更新、跨设备稳定对象身份。真实 Pickup 多层去重需要显式的 Provider 身份规则和相应作用域;不能按显示位置或未经验证的 feature_id 去重。
  3. 同源和 filter 全量性:475 类各验证一个 example,并不保证同类中其他全部 occurrence 的 Style/filter、组件组合在后续数据版本中继续一致。未来可靠 Package 必须描述适用样本/全量覆盖证明和校验指纹。
  4. 标准显示组:还没有由 NavSea 正式批准的、对全部 standardLayer 可审核的产品显示组映射。不能根据名字自动将 fixed_fishing_gear_area 分配给 fishery_gear,尽管名称看似关联。
  5. 逐层 selector:即使同源证明通过,也必须证明用于隐藏该 Feature 的 selector 在每一条原始 Style Layer 可达且不会误隐藏 UNKNOWN/其他类别,不能把多个 component selector 全部 AND 后一律应用到每层。
  6. 能力分层:Display、Pickup、Danger、Planning 各有独立的可信证据与覆盖门槛;无证据时保留/降级,不能把视觉判断当成航行安全结论。

6. 后续 B2.5 推荐

先确定真正的身份范围,建议区分 CompositeVisualTypeId、TileLocalFeatureKey 和 Provider 可承诺的 StableEntityId 三种互不混同的概念;对多组件以真实原始 Feature 命中作为同源基础,由上游人审或正式受控规则标记唯一 PRIMARY 与从属 COMPONENT。再结合 NavSea 固定显示组 Catalog 的正式映射,独立做逐 Style Layer selector 证明;一个纵向切片通过 UNKNOWN 保留和原 Style 恢复检查后,才扩大 Compiler 实际 EXECUTABLE 授权。

正式 Provider ZIP 九文件架构不修改。历史 CM95 Fishery/LIGHTS05 过渡兼容不动,直到新通用路径通过实机对比。没有源数据和正式 Contract 不能凭记忆自动生成此授权。