From fa0d6f265bc261d985b91e2ad90b3d2a468bca37 Mon Sep 17 00:00:00 2001 From: OpenAI Codex Date: Sat, 19 Sep 2026 00:00:48 +0800 Subject: [PATCH] fix: gate complete AOI tile footprint --- src/cm95pbf/cli.py | 1 + src/cm95pbf/release.py | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/cm95pbf/cli.py b/src/cm95pbf/cli.py index b9bc7fd..e2c25fa 100644 --- a/src/cm95pbf/cli.py +++ b/src/cm95pbf/cli.py @@ -300,6 +300,7 @@ def main() -> None: "semantic_backlog": result.get("semantic_backlog"), "non_renderable_omissions": result.get("non_renderable_omissions"), "non_renderable_omission_layers": result.get("non_renderable_omission_layers"), + "tile_footprint_contract": result.get("tile_footprint_contract"), "style_sprite_contract": { "overall": (result.get("style_sprite_contract") or {}).get("overall"), "contract_unmatched_count": (result.get("style_sprite_contract") or {}).get("contract_unmatched_count"), diff --git a/src/cm95pbf/release.py b/src/cm95pbf/release.py index 6976779..b488fa3 100644 --- a/src/cm95pbf/release.py +++ b/src/cm95pbf/release.py @@ -481,7 +481,27 @@ def finalize_release( "failure_examples": s52_runtime_failures[:100], } + tile_enumeration_mode = str(plan.get("tile_enumeration_mode") or "coverage") + tile_footprint_contract = { + "status": "NOT_APPLICABLE", + "mode": tile_enumeration_mode, + "planned_tile_jobs": int(plan["job_count"]), + "pbf_file_count": len(pbf_files), + "report_file_count": len(report_files), + } + if tile_enumeration_mode == "aoi-complete": + tile_footprint_contract["status"] = ( + "PASS" + if len(pbf_files) == len(report_files) == int(plan["job_count"]) + else "FAIL" + ) + failures = [] + if tile_enumeration_mode == "aoi-complete": + if len(report_files) != int(plan["job_count"]): + failures.append("aoi_complete_report_count_mismatch") + if len(pbf_files) != int(plan["job_count"]): + failures.append("aoi_complete_pbf_count_mismatch") if hard_gate: failures.append("hard_gate_unmapped") if encoder_dropped: @@ -513,6 +533,8 @@ def finalize_release( "policy_sha256": plan["policy_sha256"], "builder_contract_version": plan.get("builder_contract_version"), "production_pipeline_version": plan.get("production_pipeline_version"), + "tile_enumeration_mode": tile_enumeration_mode, + "tile_footprint_contract": tile_footprint_contract, "s52": plan.get("s52"), "aoi": plan.get("aoi"), "s52_runtime_contract": s52_runtime_contract,