diff --git a/STEP_RECORD.md b/STEP_RECORD.md
index 8de4d66..e1a677f 100644
--- a/STEP_RECORD.md
+++ b/STEP_RECORD.md
@@ -218,6 +218,111 @@
2. 先把“旧坏 tile”与“主线 style 差异”两类问题彻底拆开
3. 之后再决定是否把这套 rebuild 从热点 AOI 扩到全国更大范围
+## 2026-04-18 全国 full 重建进行中:分片重建 + staging 截图审计
+
+### 1. 本轮页面与脚本调整
+
+- 已把全国人工审计页继续扩成支持右侧 `deliveryTileUrl` 覆盖:
+ - [`src/pbf/navsea-compare-full-audit.html`](/root/sourceserver/pbf/src/pbf/navsea-compare-full-audit.html)
+- 当前页面版本已提升到:
+ - `full-audit-r3-20260418-1546`
+- 已部署到:
+ - `/mnt/sda1/www/newpec/navsea-compare-full-audit.html`
+- 已把全国 AOI 截图审计脚本扩成支持只跑指定 variant:
+ - [`navsea_full_aoi_visual_audit.py`](/root/sourceserver/pbf/navsea_full_aoi_visual_audit.py)
+ - 新增参数:
+ - `--variant full`
+ - `--variant semantic`
+
+### 2. 全国 full 重建策略调整
+
+- 因当前工作树中的 [`navsea_tile_builder.py`](/root/sourceserver/pbf/navsea_tile_builder.py) 还混有语义版 sprite 迁移试验改动
+- 本轮全国 `full` 重建没有直接用工作树文件
+- 而是固定使用 `HEAD` 版本临时 builder:
+ - `/tmp/navsea_tile_builder_head_20260418.py`
+- 重建方式改为:
+ - 以当前全国 `full` 目录为 reference footprint
+ - 对 `z0_8 / z9_10 / z11 / z12` 分片重建
+- 当前分片目录:
+ - `/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/z0_8`
+ - `/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/z9_10`
+ - `/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/z11`
+ - `/home/wwwroot/pbf-delivery-full-20260418-rebuild.parts/z12`
+
+### 3. 并发策略修正
+
+- 机器实际仅 `4` 核
+- 本轮中途确认:
+ - 之前直接对多分片同时开 `24 / 96 worker`
+ 会造成严重过度并发
+- 已改成当前更稳定的组合:
+ - `z12: workers=96`
+ - `z11: workers=4`
+ - `z9_10: workers=2`
+ - `z0_8: workers=1`
+- 当前目标不是一次把机器打满
+- 而是让 `z12` 热点风险先落盘,同时补齐其余 zoom
+
+### 4. z12 staging 目录
+
+- 为了在全国 rebuild 尚未全量完成前先做热点截图闭环
+- 已创建 staging 根目录:
+ - `/home/wwwroot/pbf-delivery-full-20260418-staging-z12`
+- 方式:
+ - 先复制当前 `full`
+ - 再持续用已重建的 `z12` 新 tile 覆盖
+- 用途:
+ - 让右侧截图优先加载新 `z12`
+ - 未重建到的地方仍由旧 `full` 兜底
+ - 避免人工审计页因为“未生成到”而出现伪空白
+
+### 5. 当前 staging 截图审计结果
+
+- 冲绳 `10nm z12` staging 复跑:
+ - [`report/full_rebuild_staging_okinawa_z12_2026-04-18/full_aoi_visual_audit.md`](/root/sourceserver/pbf/report/full_rebuild_staging_okinawa_z12_2026-04-18/full_aoi_visual_audit.md)
+ - [`report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/full_aoi_visual_audit.md`](/root/sourceserver/pbf/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/full_aoi_visual_audit.md)
+ - 当前 `changed_ratio = 0.786184`
+- 博多 / 唐津 `z12` staging 复跑:
+ - [`report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/full_aoi_visual_audit.md`](/root/sourceserver/pbf/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/full_aoi_visual_audit.md)
+ - 结果:
+ - `karatsu_5nm_full_z12 = 0.757473`
+ - `hakata_10nm_full_z12 = 0.529882`
+
+### 6. 当前视觉判断
+
+- 新 rebuild `z12` 覆盖后:
+ - 唐津右图中此前那类“岛屿错位 / 大片空白”现象未再出现
+- 当前 remaining diff 更像:
+ - delivery `full` 与原始 `newpec` 的底图 / 道路 / 色彩 / 文本表达差异
+- 也就是说本轮已经进一步确认:
+ - “坏片几何问题”
+ - 与
+ - “整体样式表达差异”
+ 应分开审计
+
+### 7. 当前重建进度快照
+
+- 截止本记录更新时:
+ - `z0_8 = 45`
+ - `z9_10 = 1212`
+ - `z11 = 2240`
+ - `z12 = 16261`
+- 目标参考总量:
+ - `z0_8 = 344`
+ - `z9_10 = 3969`
+ - `z11 = 12279`
+ - `z12 = 48556`
+
+### 8. 下一步
+
+1. 继续把全国 `full` 四个分片全部跑完并合并成:
+ - `/home/wwwroot/pbf-delivery-full-20260418-rebuild`
+2. 对最终 rebuild 根目录跑:
+ - extent / shift 审计
+ - geometry / native 风险审计
+3. 再用最终 rebuild 根目录做全国固定 AOI 的正式截图对比审计
+4. 完成后再更新最终结论与 commit
+
## 2026-04-18 全国高 extent 错重编码根因钉实
### 1. 本轮新结论
diff --git a/navsea_full_aoi_visual_audit.py b/navsea_full_aoi_visual_audit.py
index 75cfbe6..6d48e90 100644
--- a/navsea_full_aoi_visual_audit.py
+++ b/navsea_full_aoi_visual_audit.py
@@ -27,6 +27,7 @@ def parse_args() -> argparse.Namespace:
parser.add_argument("--bottom-trim", type=int, default=30)
parser.add_argument("--timeout-sec", type=int, default=120)
parser.add_argument("--virtual-time-budget-ms", type=int, default=30000)
+ parser.add_argument("--variant", action="append", choices=("full", "semantic"), help="只跑指定 variant,可重复传入")
return parser.parse_args()
@@ -153,7 +154,8 @@ def main() -> None:
aois = json.loads(args.aoi_json.read_text(encoding="utf-8"))
cases: list[dict[str, Any]] = []
- for variant in ("full", "semantic"):
+ variants = args.variant or ["full", "semantic"]
+ for variant in variants:
for aoi in aois:
for zoom in aoi["zoom_levels"]:
case_id = f"{aoi['id']}_{variant}_z{zoom}"
diff --git a/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/full_aoi_visual_audit.json b/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/full_aoi_visual_audit.json
new file mode 100644
index 0000000..9dbd3a9
--- /dev/null
+++ b/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/full_aoi_visual_audit.json
@@ -0,0 +1,73 @@
+{
+ "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-staging-z12%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf",
+ "cases": [
+ {
+ "id": "karatsu_5nm_full_z12",
+ "label": "唐津 5 海里",
+ "variant": "full",
+ "zoom": 12,
+ "center": [
+ 129.9697,
+ 33.4425
+ ],
+ "radius_nm": 5,
+ "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-staging-z12%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=129.9697%2C33.4425&zoom=12",
+ "changed_pixels": 276326,
+ "total_pixels": 364800,
+ "changed_ratio": 0.757473,
+ "mean_abs_rgb": [
+ 28.6339,
+ 29.7368,
+ 58.0848
+ ],
+ "rms_rgb": [
+ 48.2024,
+ 47.0653,
+ 75.8149
+ ],
+ "diff_bbox": [
+ 0,
+ 0,
+ 640,
+ 513
+ ],
+ "left_image": "/root/sourceserver/pbf/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/karatsu_5nm_full_z12/compare_left.png",
+ "right_image": "/root/sourceserver/pbf/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/karatsu_5nm_full_z12/compare_right.png",
+ "diff_image": "/root/sourceserver/pbf/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/karatsu_5nm_full_z12/compare_diff.png"
+ },
+ {
+ "id": "hakata_10nm_full_z12",
+ "label": "博多港中心 10 海里",
+ "variant": "full",
+ "zoom": 12,
+ "center": [
+ 130.335,
+ 33.6385
+ ],
+ "radius_nm": 10,
+ "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-staging-z12%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=130.335%2C33.6385&zoom=12",
+ "changed_pixels": 193301,
+ "total_pixels": 364800,
+ "changed_ratio": 0.529882,
+ "mean_abs_rgb": [
+ 20.6516,
+ 21.4763,
+ 26.4402
+ ],
+ "rms_rgb": [
+ 45.2293,
+ 45.5602,
+ 50.335
+ ],
+ "diff_bbox": [
+ 0,
+ 0,
+ 640,
+ 513
+ ],
+ "left_image": "/root/sourceserver/pbf/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/hakata_10nm_full_z12/compare_left.png",
+ "right_image": "/root/sourceserver/pbf/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/hakata_10nm_full_z12/compare_right.png",
+ "diff_image": "/root/sourceserver/pbf/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/hakata_10nm_full_z12/compare_diff.png"
+ }
+ ]
+}
diff --git a/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/full_aoi_visual_audit.md b/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/full_aoi_visual_audit.md
new file mode 100644
index 0000000..5c70e15
--- /dev/null
+++ b/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/full_aoi_visual_audit.md
@@ -0,0 +1,29 @@
+# 全国 AOI 截图对比审计
+
+## 总览
+
+- compare page: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-staging-z12%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf`
+- cases: `2`
+
+## 差异排序
+
+### 唐津 5 海里 · full · z12
+
+- changed ratio: `0.757473`
+- changed pixels: `276326` / `364800`
+- mean abs rgb: `[28.6339, 29.7368, 58.0848]`
+- compare url: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-staging-z12%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=129.9697%2C33.4425&zoom=12`
+- left image: `/root/sourceserver/pbf/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/karatsu_5nm_full_z12/compare_left.png`
+- right image: `/root/sourceserver/pbf/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/karatsu_5nm_full_z12/compare_right.png`
+- diff image: `/root/sourceserver/pbf/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/karatsu_5nm_full_z12/compare_diff.png`
+
+### 博多港中心 10 海里 · full · z12
+
+- changed ratio: `0.529882`
+- changed pixels: `193301` / `364800`
+- mean abs rgb: `[20.6516, 21.4763, 26.4402]`
+- compare url: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-staging-z12%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=130.335%2C33.6385&zoom=12`
+- left image: `/root/sourceserver/pbf/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/hakata_10nm_full_z12/compare_left.png`
+- right image: `/root/sourceserver/pbf/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/hakata_10nm_full_z12/compare_right.png`
+- diff image: `/root/sourceserver/pbf/report/full_rebuild_staging_hakata_karatsu_z12_2026-04-18/hakata_10nm_full_z12/compare_diff.png`
+
diff --git a/report/full_rebuild_staging_okinawa_z12_2026-04-18/full_aoi_visual_audit.json b/report/full_rebuild_staging_okinawa_z12_2026-04-18/full_aoi_visual_audit.json
new file mode 100644
index 0000000..50a0d9d
--- /dev/null
+++ b/report/full_rebuild_staging_okinawa_z12_2026-04-18/full_aoi_visual_audit.json
@@ -0,0 +1,39 @@
+{
+ "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-staging-z12%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf",
+ "cases": [
+ {
+ "id": "okinawa_10nm_full_z12",
+ "label": "冲绳 10 海里",
+ "variant": "full",
+ "zoom": 12,
+ "center": [
+ 127.67,
+ 26.21
+ ],
+ "radius_nm": 10,
+ "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-staging-z12%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=127.67%2C26.21&zoom=12",
+ "changed_pixels": 286800,
+ "total_pixels": 364800,
+ "changed_ratio": 0.786184,
+ "mean_abs_rgb": [
+ 35.1541,
+ 37.5348,
+ 57.2885
+ ],
+ "rms_rgb": [
+ 57.997,
+ 59.3287,
+ 80.8913
+ ],
+ "diff_bbox": [
+ 0,
+ 0,
+ 640,
+ 513
+ ],
+ "left_image": "/root/sourceserver/pbf/report/full_rebuild_staging_okinawa_z12_2026-04-18/okinawa_10nm_full_z12/compare_left.png",
+ "right_image": "/root/sourceserver/pbf/report/full_rebuild_staging_okinawa_z12_2026-04-18/okinawa_10nm_full_z12/compare_right.png",
+ "diff_image": "/root/sourceserver/pbf/report/full_rebuild_staging_okinawa_z12_2026-04-18/okinawa_10nm_full_z12/compare_diff.png"
+ }
+ ]
+}
diff --git a/report/full_rebuild_staging_okinawa_z12_2026-04-18/full_aoi_visual_audit.md b/report/full_rebuild_staging_okinawa_z12_2026-04-18/full_aoi_visual_audit.md
new file mode 100644
index 0000000..638de7b
--- /dev/null
+++ b/report/full_rebuild_staging_okinawa_z12_2026-04-18/full_aoi_visual_audit.md
@@ -0,0 +1,19 @@
+# 全国 AOI 截图对比审计
+
+## 总览
+
+- compare page: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-staging-z12%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf`
+- cases: `1`
+
+## 差异排序
+
+### 冲绳 10 海里 · full · z12
+
+- changed ratio: `0.786184`
+- changed pixels: `286800` / `364800`
+- mean abs rgb: `[35.1541, 37.5348, 57.2885]`
+- compare url: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-staging-z12%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=127.67%2C26.21&zoom=12`
+- left image: `/root/sourceserver/pbf/report/full_rebuild_staging_okinawa_z12_2026-04-18/okinawa_10nm_full_z12/compare_left.png`
+- right image: `/root/sourceserver/pbf/report/full_rebuild_staging_okinawa_z12_2026-04-18/okinawa_10nm_full_z12/compare_right.png`
+- diff image: `/root/sourceserver/pbf/report/full_rebuild_staging_okinawa_z12_2026-04-18/okinawa_10nm_full_z12/compare_diff.png`
+
diff --git a/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/full_aoi_visual_audit.json b/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/full_aoi_visual_audit.json
new file mode 100644
index 0000000..f04d0d2
--- /dev/null
+++ b/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/full_aoi_visual_audit.json
@@ -0,0 +1,39 @@
+{
+ "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-staging-z12%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf",
+ "cases": [
+ {
+ "id": "okinawa_10nm_full_z12",
+ "label": "冲绳 10 海里",
+ "variant": "full",
+ "zoom": 12,
+ "center": [
+ 127.67,
+ 26.21
+ ],
+ "radius_nm": 10,
+ "compare_url": "http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-staging-z12%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=127.67%2C26.21&zoom=12",
+ "changed_pixels": 286800,
+ "total_pixels": 364800,
+ "changed_ratio": 0.786184,
+ "mean_abs_rgb": [
+ 35.1541,
+ 37.5348,
+ 57.2885
+ ],
+ "rms_rgb": [
+ 57.997,
+ 59.3287,
+ 80.8913
+ ],
+ "diff_bbox": [
+ 0,
+ 0,
+ 640,
+ 513
+ ],
+ "left_image": "/root/sourceserver/pbf/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/okinawa_10nm_full_z12/compare_left.png",
+ "right_image": "/root/sourceserver/pbf/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/okinawa_10nm_full_z12/compare_right.png",
+ "diff_image": "/root/sourceserver/pbf/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/okinawa_10nm_full_z12/compare_diff.png"
+ }
+ ]
+}
diff --git a/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/full_aoi_visual_audit.md b/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/full_aoi_visual_audit.md
new file mode 100644
index 0000000..1cde73d
--- /dev/null
+++ b/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/full_aoi_visual_audit.md
@@ -0,0 +1,19 @@
+# 全国 AOI 截图对比审计
+
+## 总览
+
+- compare page: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-staging-z12%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf`
+- cases: `1`
+
+## 差异排序
+
+### 冲绳 10 海里 · full · z12
+
+- changed ratio: `0.786184`
+- changed pixels: `286800` / `364800`
+- mean abs rgb: `[35.1541, 37.5348, 57.2885]`
+- compare url: `http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-20260418-staging-z12%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf&variant=full&audit=1¢er=127.67%2C26.21&zoom=12`
+- left image: `/root/sourceserver/pbf/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/okinawa_10nm_full_z12/compare_left.png`
+- right image: `/root/sourceserver/pbf/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/okinawa_10nm_full_z12/compare_right.png`
+- diff image: `/root/sourceserver/pbf/report/full_rebuild_staging_okinawa_z12_r2_2026-04-18/okinawa_10nm_full_z12/compare_diff.png`
+
diff --git a/src/pbf/navsea-compare-full-audit.html b/src/pbf/navsea-compare-full-audit.html
index de50e1f..cd19e56 100644
--- a/src/pbf/navsea-compare-full-audit.html
+++ b/src/pbf/navsea-compare-full-audit.html
@@ -317,12 +317,13 @@