diff --git a/STEP_RECORD.md b/STEP_RECORD.md
index 6fadaba..d9d3bcf 100644
--- a/STEP_RECORD.md
+++ b/STEP_RECORD.md
@@ -12,7 +12,7 @@ Remote: `ssh://git@nas:2222/tei/pbf.git`
当前页面版本体系:
-- `HTML: compare-r15-20260401-1705`
+- `HTML: compare-r16-20260401-1734`
当前页面支持 2 个 profile,但仍是同一张 HTML:
@@ -41,6 +41,9 @@ Remote: `ssh://git@nas:2222/tei/pbf.git`
- HTML / Style / PBF 三层版本可见
- 页面现在还支持 URL 相机参数,便于同一张页面切到热点区做自动截图:
- `?profile=karatsu20¢er=130.335,33.6385&zoom=12.2`
+- 页面现在还支持纯地图审计模式:
+ - `?profile=karatsu20&audit=1¢er=130.335,33.6385&zoom=12.2`
+ - 会隐藏 pane tag / inspect panel / status / 地图控件,避免截图被页面 UI 污染
## Current Truth
@@ -228,6 +231,12 @@ Remote: `ssh://git@nas:2222/tei/pbf.git`
- `20nm` backend 仍不适合当严格对象级审计
- 博多港 AOI 现在也已经纳入固定截图审计
- `r10` 的设施文字层试验让热点差异变大,已回退;当前线上保留 `r11`
+- `r12` 开始改用 `audit=1` 纯地图截图:
+ - overall changed ratio: `0.604496`
+ - `hakata_central_passage_marks`: `0.822115`
+ - `hakata_route_outline_facility`: `0.741461`
+ - `hakata_inner_harbor_facilities`: `0.697737`
+- 这说明此前 `r9/r11` 的 `0.80` 级别差异里,有相当一部分是页面 UI 噪音,不是地图本体差异
- 当前正式审计顺序已经明确为:
- 先 `object preservation audit`
- 再 `render audit`
diff --git a/report/strict_audit_20nm_hakata_r12/strict_audit_summary.json b/report/strict_audit_20nm_hakata_r12/strict_audit_summary.json
new file mode 100644
index 0000000..f9917b0
--- /dev/null
+++ b/report/strict_audit_20nm_hakata_r12/strict_audit_summary.json
@@ -0,0 +1,325 @@
+{
+ "compare_url": "http://192.168.200.184/newpec/navsea-compare-karatsu-20nm.html?profile=karatsu20&audit=1¢er=130.335,33.6385&zoom=12.2",
+ "compare_version": "compare-r16-20260401-1734",
+ "backend_audit_json": "/root/sourceserver/pbf/NavSea_Original_vs_Delivery_Render_Audit_Karatsu_20nm_2026-03-31.r7.json",
+ "visual_metrics": {
+ "image_width": 640,
+ "image_height": 400,
+ "total_pixels": 256000,
+ "changed_pixels": 154751,
+ "changed_ratio": 0.604496,
+ "mean_abs_rgb": [
+ 22.2124,
+ 22.2692,
+ 28.3782
+ ],
+ "rms_rgb": [
+ 47.361,
+ 45.344,
+ 50.87
+ ],
+ "diff_bbox": [
+ 0,
+ 0,
+ 640,
+ 400
+ ],
+ "full_crop_left": [
+ 0,
+ 150,
+ 640,
+ 550
+ ],
+ "full_crop_right": [
+ 640,
+ 150,
+ 1280,
+ 550
+ ],
+ "hotspots": [
+ {
+ "image_width": 256,
+ "image_height": 104,
+ "total_pixels": 26624,
+ "changed_pixels": 21888,
+ "changed_ratio": 0.822115,
+ "mean_abs_rgb": [
+ 23.1315,
+ 24.5684,
+ 31.9945
+ ],
+ "rms_rgb": [
+ 35.546,
+ 39.042,
+ 48.0697
+ ],
+ "diff_bbox": [
+ 0,
+ 0,
+ 256,
+ 104
+ ],
+ "id": "hakata_central_passage_marks",
+ "label": "博多港中央航路灯标区",
+ "notes": "校验 31135x 灯标、红绿小灯和航路文字是否仍然可见。",
+ "backend_focus": [
+ "p航路標識群",
+ "navigation_marks",
+ "display_code"
+ ],
+ "pane_box_norm": [
+ 0.02,
+ 0.1,
+ 0.42,
+ 0.36
+ ],
+ "pane_box_pixels": [
+ 13,
+ 40,
+ 269,
+ 144
+ ],
+ "left_image": "report/strict_audit_20nm_hakata_r12/hotspots/hakata_central_passage_marks_left.png",
+ "right_image": "report/strict_audit_20nm_hakata_r12/hotspots/hakata_central_passage_marks_right.png",
+ "diff_image": "report/strict_audit_20nm_hakata_r12/hotspots/hakata_central_passage_marks_diff.png"
+ },
+ {
+ "image_width": 269,
+ "image_height": 128,
+ "total_pixels": 34432,
+ "changed_pixels": 25530,
+ "changed_ratio": 0.741461,
+ "mean_abs_rgb": [
+ 20.8115,
+ 23.0896,
+ 36.146
+ ],
+ "rms_rgb": [
+ 33.8787,
+ 37.7114,
+ 52.8807
+ ],
+ "diff_bbox": [
+ 0,
+ 0,
+ 269,
+ 128
+ ],
+ "id": "hakata_route_outline_facility",
+ "label": "博多港航路边界与设施点区",
+ "notes": "校验紫色航路虚线是否存在,以及 class 505/520/530/550 设施点是否不再被画成通用图标。",
+ "backend_focus": [
+ "P航路ククリ",
+ "p施設・境界線等",
+ "route_outline",
+ "facility_boundary_point"
+ ],
+ "pane_box_norm": [
+ 0.2,
+ 0.2,
+ 0.62,
+ 0.52
+ ],
+ "pane_box_pixels": [
+ 128,
+ 80,
+ 397,
+ 208
+ ],
+ "left_image": "report/strict_audit_20nm_hakata_r12/hotspots/hakata_route_outline_facility_left.png",
+ "right_image": "report/strict_audit_20nm_hakata_r12/hotspots/hakata_route_outline_facility_right.png",
+ "diff_image": "report/strict_audit_20nm_hakata_r12/hotspots/hakata_route_outline_facility_diff.png"
+ },
+ {
+ "image_width": 243,
+ "image_height": 160,
+ "total_pixels": 38880,
+ "changed_pixels": 27128,
+ "changed_ratio": 0.697737,
+ "mean_abs_rgb": [
+ 24.8118,
+ 27.3435,
+ 36.5061
+ ],
+ "rms_rgb": [
+ 39.8053,
+ 44.6497,
+ 56.216
+ ],
+ "diff_bbox": [
+ 0,
+ 0,
+ 243,
+ 160
+ ],
+ "id": "hakata_inner_harbor_facilities",
+ "label": "博多港内港设施区",
+ "notes": "校验港湾、渔港、海之驿、码头设施点是否保留细分类图标。",
+ "backend_focus": [
+ "p施設・境界線等",
+ "facility_boundary_point",
+ "class_code"
+ ],
+ "pane_box_norm": [
+ 0.48,
+ 0.36,
+ 0.86,
+ 0.76
+ ],
+ "pane_box_pixels": [
+ 307,
+ 144,
+ 550,
+ 304
+ ],
+ "left_image": "report/strict_audit_20nm_hakata_r12/hotspots/hakata_inner_harbor_facilities_left.png",
+ "right_image": "report/strict_audit_20nm_hakata_r12/hotspots/hakata_inner_harbor_facilities_right.png",
+ "diff_image": "report/strict_audit_20nm_hakata_r12/hotspots/hakata_inner_harbor_facilities_diff.png"
+ }
+ ]
+ },
+ "backend_summary": {
+ "original_feature_instances": 258317,
+ "engineering_feature_instances": 258317,
+ "result_count": 516634,
+ "status_counts": {
+ "extra_in_engineering": 258317,
+ "missing_in_engineering": 258317
+ },
+ "top_annotation_issues": [
+ {
+ "issue": "extra_text_in_engineering",
+ "source_layer": "bathymetry_line",
+ "count": 24168
+ },
+ {
+ "issue": "text_missing_in_engineering",
+ "source_layer": "L海底地形",
+ "count": 24168
+ },
+ {
+ "issue": "extra_text_in_engineering",
+ "source_layer": "depth_contour",
+ "count": 11929
+ },
+ {
+ "issue": "text_missing_in_engineering",
+ "source_layer": "L等深線",
+ "count": 11929
+ },
+ {
+ "issue": "extra_text_in_engineering",
+ "source_layer": "seabed_text_point",
+ "count": 4499
+ },
+ {
+ "issue": "text_missing_in_engineering",
+ "source_layer": "p底質",
+ "count": 4499
+ },
+ {
+ "issue": "extra_text_in_engineering",
+ "source_layer": "navigation_marks",
+ "count": 1516
+ },
+ {
+ "issue": "text_missing_in_engineering",
+ "source_layer": "p航路標識群",
+ "count": 1516
+ },
+ {
+ "issue": "text_missing_in_engineering",
+ "source_layer": "p地名",
+ "count": 1444
+ },
+ {
+ "issue": "extra_text_in_engineering",
+ "source_layer": "place_label_sea",
+ "count": 1444
+ }
+ ],
+ "top_style_semantic_issues": [
+ {
+ "issue": "depth_numeric_missing",
+ "source_layer": "L海底地形",
+ "count": 24168
+ },
+ {
+ "issue": "depth_numeric_missing",
+ "source_layer": "L等深線",
+ "count": 11929
+ },
+ {
+ "issue": "safety_icon_missing",
+ "source_layer": "p航路標識群",
+ "count": 1885
+ },
+ {
+ "issue": "depth_numeric_missing",
+ "source_layer": "L概略等深線",
+ "count": 350
+ },
+ {
+ "issue": "clearance_numeric_missing",
+ "source_layer": "p高さ制限",
+ "count": 33
+ }
+ ],
+ "top_source_layer_issues": [
+ {
+ "status": "extra_in_engineering",
+ "source_layer": "baseline_outline",
+ "count": 87709
+ },
+ {
+ "status": "missing_in_engineering",
+ "source_layer": "P基本線ククリ",
+ "count": 87709
+ },
+ {
+ "status": "extra_in_engineering",
+ "source_layer": "baseline_area",
+ "count": 50421
+ },
+ {
+ "status": "missing_in_engineering",
+ "source_layer": "P基本線",
+ "count": 50421
+ },
+ {
+ "status": "extra_in_engineering",
+ "source_layer": "depth_contour",
+ "count": 36460
+ },
+ {
+ "status": "missing_in_engineering",
+ "source_layer": "L等深線",
+ "count": 36460
+ },
+ {
+ "status": "extra_in_engineering",
+ "source_layer": "bathymetry_line",
+ "count": 35940
+ },
+ {
+ "status": "missing_in_engineering",
+ "source_layer": "L海底地形",
+ "count": 35940
+ },
+ {
+ "status": "extra_in_engineering",
+ "source_layer": "onshore_structure_line",
+ "count": 10544
+ },
+ {
+ "status": "missing_in_engineering",
+ "source_layer": "L陸上構造物陸",
+ "count": 10544
+ }
+ ]
+ },
+ "notes": [
+ "Visual metrics are browser-rendered screenshot diff metrics from the fixed compare page.",
+ "Backend metrics are current render-audit summary metrics and may remain blind to sprite-load failures."
+ ]
+}
\ No newline at end of file
diff --git a/report/strict_audit_20nm_hakata_r12/strict_audit_summary.md b/report/strict_audit_20nm_hakata_r12/strict_audit_summary.md
new file mode 100644
index 0000000..fb5fcd1
--- /dev/null
+++ b/report/strict_audit_20nm_hakata_r12/strict_audit_summary.md
@@ -0,0 +1,104 @@
+# NavSea Strict Audit Summary
+
+## Scope
+
+- Compare page: `http://192.168.200.184/newpec/navsea-compare-karatsu-20nm.html?profile=karatsu20&audit=1¢er=130.335,33.6385&zoom=12.2`
+- Compare version: `compare-r16-20260401-1734`
+- Backend render audit: `/root/sourceserver/pbf/NavSea_Original_vs_Delivery_Render_Audit_Karatsu_20nm_2026-03-31.r7.json`
+
+## Visual Audit
+
+- changed pixels: `154751` / `256000`
+- changed ratio: `0.604496`
+- mean abs rgb: `[22.2124, 22.2692, 28.3782]`
+- rms rgb: `[47.361, 45.344, 50.87]`
+- left crop: `[0, 150, 640, 550]`
+- right crop: `[640, 150, 1280, 550]`
+
+Artifacts:
+
+- `report/strict_audit_20nm_hakata_r12/compare_full.png`
+- `report/strict_audit_20nm_hakata_r12/compare_left.png`
+- `report/strict_audit_20nm_hakata_r12/compare_right.png`
+- `report/strict_audit_20nm_hakata_r12/compare_diff.png`
+
+## Hotspot AOI Audit
+
+### 博多港中央航路灯标区
+
+- id: `hakata_central_passage_marks`
+- notes: `校验 31135x 灯标、红绿小灯和航路文字是否仍然可见。`
+- backend focus: `['p航路標識群', 'navigation_marks', 'display_code']`
+- changed pixels: `21888` / `26624`
+- changed ratio: `0.822115`
+- mean abs rgb: `[23.1315, 24.5684, 31.9945]`
+- pane box norm: `[0.02, 0.1, 0.42, 0.36]`
+- pane box pixels: `[13, 40, 269, 144]`
+- left image: `report/strict_audit_20nm_hakata_r12/hotspots/hakata_central_passage_marks_left.png`
+- right image: `report/strict_audit_20nm_hakata_r12/hotspots/hakata_central_passage_marks_right.png`
+- diff image: `report/strict_audit_20nm_hakata_r12/hotspots/hakata_central_passage_marks_diff.png`
+
+### 博多港航路边界与设施点区
+
+- id: `hakata_route_outline_facility`
+- notes: `校验紫色航路虚线是否存在,以及 class 505/520/530/550 设施点是否不再被画成通用图标。`
+- backend focus: `['P航路ククリ', 'p施設・境界線等', 'route_outline', 'facility_boundary_point']`
+- changed pixels: `25530` / `34432`
+- changed ratio: `0.741461`
+- mean abs rgb: `[20.8115, 23.0896, 36.146]`
+- pane box norm: `[0.2, 0.2, 0.62, 0.52]`
+- pane box pixels: `[128, 80, 397, 208]`
+- left image: `report/strict_audit_20nm_hakata_r12/hotspots/hakata_route_outline_facility_left.png`
+- right image: `report/strict_audit_20nm_hakata_r12/hotspots/hakata_route_outline_facility_right.png`
+- diff image: `report/strict_audit_20nm_hakata_r12/hotspots/hakata_route_outline_facility_diff.png`
+
+### 博多港内港设施区
+
+- id: `hakata_inner_harbor_facilities`
+- notes: `校验港湾、渔港、海之驿、码头设施点是否保留细分类图标。`
+- backend focus: `['p施設・境界線等', 'facility_boundary_point', 'class_code']`
+- changed pixels: `27128` / `38880`
+- changed ratio: `0.697737`
+- mean abs rgb: `[24.8118, 27.3435, 36.5061]`
+- pane box norm: `[0.48, 0.36, 0.86, 0.76]`
+- pane box pixels: `[307, 144, 550, 304]`
+- left image: `report/strict_audit_20nm_hakata_r12/hotspots/hakata_inner_harbor_facilities_left.png`
+- right image: `report/strict_audit_20nm_hakata_r12/hotspots/hakata_inner_harbor_facilities_right.png`
+- diff image: `report/strict_audit_20nm_hakata_r12/hotspots/hakata_inner_harbor_facilities_diff.png`
+
+## Backend Render Audit
+
+- original feature instances: `258317`
+- delivery feature instances: `258317`
+- result count: `516634`
+
+Status counts:
+
+- `extra_in_engineering`: `258317`
+- `missing_in_engineering`: `258317`
+
+Top annotation issues:
+
+- `extra_text_in_engineering` | `bathymetry_line` | `24168`
+- `text_missing_in_engineering` | `L海底地形` | `24168`
+- `extra_text_in_engineering` | `depth_contour` | `11929`
+- `text_missing_in_engineering` | `L等深線` | `11929`
+- `extra_text_in_engineering` | `seabed_text_point` | `4499`
+- `text_missing_in_engineering` | `p底質` | `4499`
+- `extra_text_in_engineering` | `navigation_marks` | `1516`
+- `text_missing_in_engineering` | `p航路標識群` | `1516`
+- `text_missing_in_engineering` | `p地名` | `1444`
+- `extra_text_in_engineering` | `place_label_sea` | `1444`
+
+Top style semantic issues:
+
+- `depth_numeric_missing` | `L海底地形` | `24168`
+- `depth_numeric_missing` | `L等深線` | `11929`
+- `safety_icon_missing` | `p航路標識群` | `1885`
+- `depth_numeric_missing` | `L概略等深線` | `350`
+- `clearance_numeric_missing` | `p高さ制限` | `33`
+
+## Interpretation
+
+- This report intentionally puts browser-rendered visual output and backend render-audit summary in one place.
+- If the browser screenshot improves but backend counts do not, the current backend audit is likely blind to a browser/runtime issue such as sprite resolution.
diff --git a/src/pbf/navsea-compare-karatsu-20nm.html b/src/pbf/navsea-compare-karatsu-20nm.html
index 307ef2c..74eb15c 100644
--- a/src/pbf/navsea-compare-karatsu-20nm.html
+++ b/src/pbf/navsea-compare-karatsu-20nm.html
@@ -221,6 +221,15 @@
text-overflow: ellipsis;
}
+ body.audit-mode .pane-tag,
+ body.audit-mode .inspect-panel,
+ body.audit-mode .status,
+ body.audit-mode .maplibregl-ctrl-top-right,
+ body.audit-mode .maplibregl-ctrl-bottom-right,
+ body.audit-mode .maplibregl-ctrl-bottom-left {
+ display: none !important;
+ }
+
@media (max-width: 980px) {
.layout {
grid-template-columns: 1fr;
@@ -314,7 +323,7 @@