#125: the rest of the global/MVT acceptance tests in conf/common.yaml #140

Merged
art merged 2 commits from issue-125-global-acceptance-tests into main 2026-08-16 06:31:02 +00:00
Owner

Closes #125


#125 — Global/MVT acceptance tests: the rest of the config-level checks

Config-only change (conf/common.yaml + the R30/R121 Check: lines in
docs/country-requirements.md): the rest of the global/MVT candidates from
#115's plan. No import was needed — every test reads data already live in the
DB, and they are the first tests to exercise the MVT functions themselves.

What ships (5 tests, all 10 s bucket; measured 1–1245 ms live)

candidate check shape
R30 floor a request below a layer's floor returns an empty tile 19 rows: every shared layer at z=2 (below the global min_zoom), the five floored layers (places 4, roads 5, water_points 8, transit 9, stations 9) at stop_z−1, plus zxy_map and zxy_is
R30 ceiling a request above maxz serves the maxz table 12 rows: every shared layer at z=maxz+1 over a tile where it provably draws at maxz (central Stockholm z15 for the maxz-14 layers, Tornio–Haparanda for country_borders, Berlin z11 for background_land — Sweden is masked out of it by design)
empty-vs-missing an all-ocean tile is genuinely empty (0 bytes) 14 rows: every shared layer + zxy_map at mid-Atlantic z5 (11,12), zxy_map at z8 (95,100)
per-country budgets each country's capital tile stays under 8 MB @ z5 / 2 MB @ z8 8 rows through the shared zxy_map: is/se/pl/fi capitals
index coverage every table the tile path reads has a valid gist index on geom the #119 map_* test's scope extended with ismap_*

The #119 Stockholm z5 test is untouched.

Design notes for the reviewer

  • The floor test is the R30 sharp form. The generated MVT function is an
    IF/ELSIF chain over z (importer/layer.go mvtFunc): below bottomZ no branch
    matches, result stays NULL, the function returns '\x'. z=2 is below the
    global min_zoom (3) and therefore below every layer's floor; the stop_z−1
    rows additionally exercise the five layers whose floor is a deliberate
    choice above the global one. zxy_is is included because it is the other
    source function tiles go through (Iceland's own layers, floors 8–12).
  • The ceiling test asserts non-empty, not byte-equality. f(maxz+1, x, y)
    re-encodes the maxz table relative to the finer envelope, so it can never
    byte-equal f(maxz, x, y); asserting "serves the maxz table" without a
    decoder is the asymmetry R30 itself records — below the floor: empty; above
    maxz: served. Every row was chosen by measuring the live maxz data (the
    comment records each probe tile); a layer clamping to empty above maxz goes
    red.
  • The per-country budget replaces the per-country sources the issue named.
    The shared-layer unification left no zxy_se/zxy_pl/zxy_fi (se/pl/fi declare
    sources: []) — zxy_se exists only as a legacy stub whose tables are gone.
    The modern per-country check is the capital tile through the shared zxy_map,
    at z5 + z8. zxy_is is not budgeted separately: it measured 101–295 bytes
    over Reykjavík (point/line layers) and the shared Reykjavík tile covers it.
  • The index test's scope is the tile path, not every prefix. map_* +
    ismap_* is exactly what the zxy functions read (verified: 176 tables, 0
    unindexed). se_/pl_/fi_* are staging since the unification, and two
    staging scratch tables (pl_oikm_probe, pl_ptlz_ingest) are deliberately
    unindexed — a blanket prefix sweep would fail on them, which is the reason
    #12's cleanup is a prerequisite for it.

Not shipped — R121's decoded-tile half

The issue's MVT attribute-set candidate (R121: a decoded tile's keys match the
contract's mvt_exclude-adjusted attr_names) is not a SQL test: MVT is
protobuf, Postgres has no decoder, and a SQL reimplementation of the wire
format is thousands of lines for a check that should be cheap. The stop_z
half of R121 is now covered by the R30 floor test. The decoded half is
filed as #139 (mapsrv-side Go test; mapsrv's glyph test already decodes
protobuf in Go, and scripts/mvt-decode.py is the hand decoder). The R121
Check: line in docs/country-requirements.md says exactly this.

Verification (live DB, no writes)

$ make build && make test
ok  github.com/art4711/ismap/importer
ok  github.com/art4711/ismap/mapsrv

$ make acceptance
conf/ismap.yaml   acceptance: 30 test(s): 30 passed, 0 failed, 0 skipped, 0 not run
conf/semap.yaml   acceptance: 17 test(s): 16 passed, 0 failed, 0 skipped, 1 not run (needs -acceptance all)
conf/plmap.yaml   acceptance: 17 test(s): 17 passed, 0 failed, 0 skipped, 0 not run
conf/fimap.yaml   acceptance: 16 test(s): 16 passed, 0 failed, 0 skipped, 0 not run
conf/world.yaml   acceptance: 13 test(s): 13 passed, 0 failed, 0 skipped, 0 not run

(semap's single not-run is the pre-existing R35 at 100 s — needs
-acceptance all, unrelated to this change.)

New-test highlights from the run:

R30 floor:        PASS checks=19 offending=
R30 ceiling:      PASS checks=12 offending=
ocean empty:      PASS checks=14 offending=
per-country:      PASS tiles=8 offending=
index coverage:   PASS unindexed=0 tables=

Nothing left undone that I know of: #139 carries the decoded-tile half, and
#127 (tile weight) is the standing performance work the budget tests guard.

Closes #125 --- #125 — Global/MVT acceptance tests: the rest of the config-level checks Config-only change (`conf/common.yaml` + the R30/R121 `Check:` lines in `docs/country-requirements.md`): the rest of the global/MVT candidates from #115's plan. No import was needed — every test reads data already live in the DB, and they are the first tests to exercise the MVT functions themselves. ## What ships (5 tests, all 10 s bucket; measured 1–1245 ms live) | candidate | check | shape | |---|---|---| | R30 floor | a request below a layer's floor returns an empty tile | 19 rows: every shared layer at z=2 (below the global min_zoom), the five floored layers (places 4, roads 5, water_points 8, transit 9, stations 9) at stop_z−1, plus zxy_map and zxy_is | | R30 ceiling | a request above maxz serves the maxz table | 12 rows: every shared layer at z=maxz+1 over a tile where it provably draws at maxz (central Stockholm z15 for the maxz-14 layers, Tornio–Haparanda for country_borders, Berlin z11 for background_land — Sweden is masked out of it by design) | | empty-vs-missing | an all-ocean tile is genuinely empty (0 bytes) | 14 rows: every shared layer + zxy_map at mid-Atlantic z5 (11,12), zxy_map at z8 (95,100) | | per-country budgets | each country's capital tile stays under 8 MB @ z5 / 2 MB @ z8 | 8 rows through the shared zxy_map: is/se/pl/fi capitals | | index coverage | every table the tile path reads has a valid gist index on geom | the #119 map_* test's scope extended with ismap_* | The #119 Stockholm z5 test is untouched. ## Design notes for the reviewer - **The floor test is the R30 sharp form.** The generated MVT function is an IF/ELSIF chain over z (importer/layer.go `mvtFunc`): below bottomZ no branch matches, `result` stays NULL, the function returns `'\x'`. z=2 is below the global min_zoom (3) and therefore below *every* layer's floor; the stop_z−1 rows additionally exercise the five layers whose floor is a deliberate choice above the global one. zxy_is is included because it is the other source function tiles go through (Iceland's own layers, floors 8–12). - **The ceiling test asserts non-empty, not byte-equality.** `f(maxz+1, x, y)` re-encodes the maxz table relative to the *finer* envelope, so it can never byte-equal `f(maxz, x, y)`; asserting "serves the maxz table" without a decoder is the asymmetry R30 itself records — below the floor: empty; above maxz: served. Every row was chosen by measuring the live maxz data (the comment records each probe tile); a layer clamping to empty above maxz goes red. - **The per-country budget replaces the per-country sources the issue named.** The shared-layer unification left no zxy_se/zxy_pl/zxy_fi (se/pl/fi declare `sources: []`) — zxy_se exists only as a legacy stub whose tables are gone. The modern per-country check is the capital tile through the shared zxy_map, at z5 + z8. zxy_is is not budgeted separately: it measured 101–295 bytes over Reykjavík (point/line layers) and the shared Reykjavík tile covers it. - **The index test's scope is the tile path, not every prefix.** map_* + ismap_* is exactly what the zxy functions read (verified: 176 tables, 0 unindexed). se_*/pl_*/fi_* are staging since the unification, and two staging scratch tables (pl_oikm_probe, pl_ptlz_ingest) are *deliberately* unindexed — a blanket prefix sweep would fail on them, which is the reason #12's cleanup is a prerequisite for it. ## Not shipped — R121's decoded-tile half The issue's MVT attribute-set candidate (R121: a decoded tile's keys match the contract's `mvt_exclude`-adjusted `attr_names`) is not a SQL test: MVT is protobuf, Postgres has no decoder, and a SQL reimplementation of the wire format is thousands of lines for a check that should be cheap. The `stop_z` half of R121 is now covered by the R30 floor test. The decoded half is **filed as #139** (mapsrv-side Go test; mapsrv's glyph test already decodes protobuf in Go, and scripts/mvt-decode.py is the hand decoder). The R121 Check: line in docs/country-requirements.md says exactly this. ## Verification (live DB, no writes) ``` $ make build && make test ok github.com/art4711/ismap/importer ok github.com/art4711/ismap/mapsrv $ make acceptance conf/ismap.yaml acceptance: 30 test(s): 30 passed, 0 failed, 0 skipped, 0 not run conf/semap.yaml acceptance: 17 test(s): 16 passed, 0 failed, 0 skipped, 1 not run (needs -acceptance all) conf/plmap.yaml acceptance: 17 test(s): 17 passed, 0 failed, 0 skipped, 0 not run conf/fimap.yaml acceptance: 16 test(s): 16 passed, 0 failed, 0 skipped, 0 not run conf/world.yaml acceptance: 13 test(s): 13 passed, 0 failed, 0 skipped, 0 not run ``` (semap's single not-run is the pre-existing R35 at 100 s — needs `-acceptance all`, unrelated to this change.) New-test highlights from the run: ``` R30 floor: PASS checks=19 offending= R30 ceiling: PASS checks=12 offending= ocean empty: PASS checks=14 offending= per-country: PASS tiles=8 offending= index coverage: PASS unindexed=0 tables= ``` Nothing left undone that I know of: #139 carries the decoded-tile half, and #127 (tile weight) is the standing performance work the budget tests guard.
The #119 review comment asked for "checks that the MVT is sensible"; #119
landed the mechanism and two tests (gist index on map_*, z5 Stockholm < 8 MB).
This is the rest of #125's candidate list, all config-level tests in
conf/common.yaml that run in every country's acceptance run:

- R30 floor: a request below a layer's floor returns an empty tile. The MVT
  functions are an IF/ELSIF chain over z; below bottomZ no branch matches and
  the function returns '\x'. Asserted at z=2 (below the global min_zoom) for
  every shared layer and at stop_z-1 for the five layers with a deliberate
  floor (places 4, roads 5, water_points 8, transit 9, stations 9), plus the
  zxy_map/zxy_is source functions. This is the first test that calls the MVT
  functions at all.
- R30 ceiling: a request above maxz serves the maxz table. Asserted as
  non-empty at z=maxz+1 over tiles where each layer provably draws at maxz
  (central Stockholm z15, Tornio-Haparanda for borders, Berlin z11 for
  background_land since Sweden is masked out of it by design). Byte-equality
  with the maxz request is impossible (ST_AsMVTGeom re-encodes relative to the
  envelope), so non-empty over a data tile is the observable.
- R30 sibling: an all-ocean tile is genuinely empty (0 bytes), the check that
  catches a layer serving its floor table at an in-range zoom. Open
  mid-Atlantic tiles at z5 (per layer, so a leak names the layer) and z8.
- Per-country tile budgets: the z5 Stockholm check extended per country. The
  shared-layer unification left no per-country MVT sources (se/pl/fi declare
  sources: []), so the per-country check is each capital's tile through the
  shared zxy_map at z5 and z8, 8 MB / 2 MB caps against measured 171 kB-1.84 MB
  and 25-264 kB.
- Index coverage extended from map_* to the ismap_* family (Iceland's own
  layers and the legacy tables that still have live zxy functions until #12).
  se_*/pl_*/fi_* stay out: they are staging-only since the unification, and
  two staging scratch tables (pl_oikm_probe, pl_ptlz_ingest) are deliberately
  unindexed — the reason a blanket prefix sweep would be wrong.

R121's decoded-tile half (tile keys vs mvt_exclude-adjusted attr_names) is not
shipped: MVT is protobuf and Postgres has no decoder, so a SQL check would
reimplement the wire format. Recorded on #125 and filed as #139 for a
mapsrv-side Go test.

Verified: make test green; make acceptance — ismap 30 / semap 16+1 pre-existing
100s not-run / plmap 17 / fimap 16 / world 13, all new tests PASS against the
live DB (floor 19 checks, ceiling 12, ocean 14, budgets 8, index sweep 0
unindexed). Docs: R30 and R121 Check: lines updated to name the tests.
art changed title from Closes #125 to #125: the rest of the global/MVT acceptance tests in conf/common.yaml 2026-08-16 01:19:50 +00:00
Collaborator

Review

Verified: go test ./... green, and the five new tests pass against the live database on all five configs (conf/ismap.yaml 30/30, conf/semap.yaml 16 passed + 1 not-run, conf/fimap.yaml 16/16, conf/plmap.yaml 17/17, conf/world.yaml 13/13). The R30 floor test's 19 checks are the right 19 — z2 for every shared layer plus stop_z−1 for exactly the five floored ones (places 3, roads 4, water_points 7, transit 8, stations 8), plus zxy_map and zxy_is.

The all-ocean tile test cannot catch the failure its comment claims

The comment says this check is "what catches a layer serving its floor table to every request at an IN-RANGE zoom (the same #28 failure mode the floor test catches below the floor)". It cannot. In the generated function (importer/layer.go mvtFunc) the zoom picks the table and the spatial filter is independent:

IF z >= 14 THEN
  SELECT ST_AsMVT(...) INTO result FROM (
    SELECT ST_AsMVTGeom(geom, bounds, ...) ...
    FROM map_roads_14 WHERE geom && margin
  ) q;

WHERE geom && margin runs whichever branch was taken, so a mid-Atlantic tile returns zero rows no matter which zoom table is read. Reading the wrong zoom table is invisible to this probe.

The test is still worth keeping — it is a real smoke check on clipping and projection, and it would catch a function that ignored its bounds or data landing at null island. The recorded rationale just isn't what it discriminates, and since these comments are the durable record of why a check exists, that matters more here than usual.

The floor half (z2, and stop_z−1) genuinely does catch the #28 mode, because there the branch chain is the only thing under test.

Three of the twelve R30 ceiling probes rest on a single feature

The ceiling tiles were measured against current data, and two of them are one feature wide:

zxy_map_ferries(15, 17776, 8977)       →  75 bytes, 1 row in map_ferries_14
zxy_map_water_points(15, 18245, 8246)  →  69 bytes, 1 row in map_water_points_14
zxy_map_country_borders(15,18580,8357) → 3 rows

The dense Stockholm probes are robust; these are not. Any re-import that re-merges, re-simplifies or shifts that one ferry chain or that one rapids point out of the tile turns the test red for a reason that has nothing to do with R30's property (that maxz+1 serves the maxz table). Picking tiles with a comfortable feature count for those two — or deriving the probe tile from the data at test time — would make the check fail only for the reason it names.

Note

These five tests live in conf/common.yaml, so they run once per config; make acceptance therefore renders the same tile-budget probes five times over. Trivial at ~1.2 s each, just worth knowing that the cost scales with the number of countries rather than with the checks.

## Review Verified: `go test ./...` green, and the five new tests pass against the live database on all five configs (`conf/ismap.yaml` 30/30, `conf/semap.yaml` 16 passed + 1 not-run, `conf/fimap.yaml` 16/16, `conf/plmap.yaml` 17/17, `conf/world.yaml` 13/13). The R30 floor test's 19 checks are the right 19 — z2 for every shared layer plus stop_z−1 for exactly the five floored ones (places 3, roads 4, water_points 7, transit 8, stations 8), plus `zxy_map` and `zxy_is`. ### The all-ocean tile test cannot catch the failure its comment claims The comment says this check is "what catches a layer serving its floor table to every request at an IN-RANGE zoom (the same #28 failure mode the floor test catches below the floor)". It cannot. In the generated function (`importer/layer.go` `mvtFunc`) the zoom picks the table and the spatial filter is independent: ``` IF z >= 14 THEN SELECT ST_AsMVT(...) INTO result FROM ( SELECT ST_AsMVTGeom(geom, bounds, ...) ... FROM map_roads_14 WHERE geom && margin ) q; ``` `WHERE geom && margin` runs whichever branch was taken, so a mid-Atlantic tile returns zero rows no matter which zoom table is read. Reading the wrong zoom table is invisible to this probe. The test is still worth keeping — it is a real smoke check on clipping and projection, and it would catch a function that ignored its bounds or data landing at null island. The recorded rationale just isn't what it discriminates, and since these comments are the durable record of *why* a check exists, that matters more here than usual. The floor half (z2, and stop_z−1) genuinely does catch the #28 mode, because there the branch chain is the only thing under test. ### Three of the twelve R30 ceiling probes rest on a single feature The ceiling tiles were measured against current data, and two of them are one feature wide: ``` zxy_map_ferries(15, 17776, 8977) → 75 bytes, 1 row in map_ferries_14 zxy_map_water_points(15, 18245, 8246) → 69 bytes, 1 row in map_water_points_14 zxy_map_country_borders(15,18580,8357) → 3 rows ``` The dense Stockholm probes are robust; these are not. Any re-import that re-merges, re-simplifies or shifts that one ferry chain or that one rapids point out of the tile turns the test red for a reason that has nothing to do with R30's property (that maxz+1 serves the maxz table). Picking tiles with a comfortable feature count for those two — or deriving the probe tile from the data at test time — would make the check fail only for the reason it names. ### Note These five tests live in `conf/common.yaml`, so they run once per config; `make acceptance` therefore renders the same tile-budget probes five times over. Trivial at ~1.2 s each, just worth knowing that the cost scales with the number of countries rather than with the checks.
The reviewer (PR #140 comment 1492) was right on both counts.

- The all-ocean test's comment claimed it catches a layer serving its floor
  table at an in-range zoom. It cannot: in the generated zxy function
  (importer/layer.go mvtFunc) the zoom branch picks the table, but
  `WHERE geom && margin` runs whichever branch was taken, so a mid-Atlantic
  tile returns zero rows no matter which table is read. Rewritten to what the
  check actually is — a smoke test on clipping and projection (a function
  ignoring its bounds, or geometry landing at null island, goes red) — and
  retitled accordingly. The floor half's z2 / stop_z-1 rows remain the real
  #28 guards, since there the branch chain is the only thing under test.
- Two of the twelve R30 ceiling probes were one feature wide (a 75-byte
  ferry tile, a 69-byte rapids tile) and could go red on any re-import that
  shifts that one feature — failing for a reason unrelated to maxz+1 serving
  the maxz table. Re-picked against the live data with a comfortable count:
  zxy_map_water_points(15, 17971, 9412) over the Dalälven rapids at
  Älvkarleby (13 features, 273 bytes) and zxy_map_ferries(15, 18342, 9479)
  over the Archipelago Sea ferry network off Nauvo (6 features, 170 bytes).

Verified: make test green; acceptance passes on all five configs
(ismap 30/30, semap 16 passed + 1 not-run, plmap 17/17, fimap 16/16,
world 13/13); the ceiling test reports checks=12 with both re-picked probes
non-empty. Config-only change; no import was run.
Author
Owner

Review addressed (845f7af)

Both points fixed on issue-125-global-acceptance-tests; the note is acknowledged.

1. All-ocean test — comment rewritten to the true rationale

You're right: the zoom branch picks the table, WHERE geom && margin runs whichever
branch was taken, so a mid-Atlantic tile returns zero rows no matter which table is
read — the wrong-floor #28 mode is invisible to this probe. The comment now says so
explicitly and states what the check actually is: a smoke test on clipping and
projection that would catch a function ignoring its bounds or geometry landing at
null island. Retitled to match ("a clipping and projection smoke check"). The floor
half's z2 / stop_z−1 rows are still described as the real #28 guards, since there the
branch chain is the only thing under test.

2. R30 ceiling probes — both re-picked with a comfortable feature count

Measured live against the current data, the two one-feature-wide probes are gone:

layer old probe old new probe rows in maxz table bytes
ferries (15, 17776, 8977) 75 B / 1 row (15, 18342, 9479) — Archipelago Sea ferry network off Nauvo 6 ferry links 170
water_points (15, 18245, 8246) 69 B / 1 row (15, 17971, 9412) — Dalälven rapids at Älvkarleby 13 rapids 273

Both new tiles sit in dense, stable national data (Digiroad ferry links in the
Archipelago Sea; Lantmäteriet Topo 50 rapids at the Dalälven mouth — the z14 table
holds the full source count, no z14 filtering), and the ceiling comment records the
counts so a future re-pick has a reference. A re-import shifting one feature can no
longer turn these rows red.

3. Note — acknowledged

Added a two-line note at the top of common.yaml's config-level block: the whole block
runs once per config, so make acceptance renders the MVT probes five times over
(~1.2 s each), and the cost scales with the country count rather than the number of
checks.

Verification

  • make test green (importer + mapsrv).
  • Acceptance on all five configs against the live DB, read-only, no import:
    conf/ismap.yaml 30/30, conf/semap.yaml 16 passed + 1 not-run (the pre-existing
    R35 at 100 s, needs -acceptance all), conf/plmap.yaml 17/17, conf/fimap.yaml
    16/16, conf/world.yaml 13/13.
  • R30 ceiling reports checks=12, offending= with both re-picked probes non-empty.
## Review addressed (845f7af) Both points fixed on `issue-125-global-acceptance-tests`; the note is acknowledged. ### 1. All-ocean test — comment rewritten to the true rationale You're right: the zoom branch picks the table, `WHERE geom && margin` runs whichever branch was taken, so a mid-Atlantic tile returns zero rows no matter which table is read — the wrong-floor #28 mode is invisible to this probe. The comment now says so explicitly and states what the check actually is: a smoke test on clipping and projection that would catch a function ignoring its bounds or geometry landing at null island. Retitled to match ("a clipping and projection smoke check"). The floor half's z2 / stop_z−1 rows are still described as the real #28 guards, since there the branch chain is the only thing under test. ### 2. R30 ceiling probes — both re-picked with a comfortable feature count Measured live against the current data, the two one-feature-wide probes are gone: | layer | old probe | old | new probe | rows in maxz table | bytes | |---|---|---|---|---|---| | ferries | (15, 17776, 8977) | 75 B / 1 row | (15, 18342, 9479) — Archipelago Sea ferry network off Nauvo | **6** ferry links | 170 | | water_points | (15, 18245, 8246) | 69 B / 1 row | (15, 17971, 9412) — Dalälven rapids at Älvkarleby | **13** rapids | 273 | Both new tiles sit in dense, stable national data (Digiroad ferry links in the Archipelago Sea; Lantmäteriet Topo 50 rapids at the Dalälven mouth — the z14 table holds the full source count, no z14 filtering), and the ceiling comment records the counts so a future re-pick has a reference. A re-import shifting one feature can no longer turn these rows red. ### 3. Note — acknowledged Added a two-line note at the top of common.yaml's config-level block: the whole block runs once per config, so `make acceptance` renders the MVT probes five times over (~1.2 s each), and the cost scales with the country count rather than the number of checks. ### Verification - `make test` green (importer + mapsrv). - Acceptance on all five configs against the live DB, read-only, no import: `conf/ismap.yaml` 30/30, `conf/semap.yaml` 16 passed + 1 not-run (the pre-existing R35 at 100 s, needs `-acceptance all`), `conf/plmap.yaml` 17/17, `conf/fimap.yaml` 16/16, `conf/world.yaml` 13/13. - R30 ceiling reports `checks=12, offending=` with both re-picked probes non-empty.
Collaborator

Re-review

Both findings are fixed, and the fixes are right for the right reasons.

The all-ocean test's rationale. The rewritten comment now states what the check cannot catch (the wrong-floor #28 mode is invisible, because WHERE geom && margin runs whichever zoom branch was taken) and what it actually is (a clipping and projection smoke check — a function ignoring its bounds, or geometry at null island, goes red). That matches mvtFunc exactly. The title carries the correction too, and the floor test's z2 / stop_z−1 rows are correctly left as the real #28 guards.

The one-feature ceiling probes. Both re-picked tiles are comfortably wide now:

                    old            new
water_points    1 row,  69 B   →   13 rows, 273 B   (Dalälven rapids, Älvkarleby)
ferries         1 row,  75 B   →    6 rows, 170 B   (Archipelago Sea, off Nauvo)

The commit's "13 rapids, 6 ferry links" counts match only when measured through the margin envelope (ST_TileEnvelope(z,x,y, margin => 256.0/4096)) rather than the plain tile envelope — which is the right way to count, since that is what the generated function actually reads. Nice detail to have got right.

Also picked up the note about the block running once per config, which is the useful half of that observation.

Verification

This branch is 7 commits behind main and merges cleanly, so I ran everything on the merged result — the state that will actually exist after merge, not the branch in isolation:

conf/ismap.yaml   30 passed, 0 failed
conf/semap.yaml   30 passed, 0 failed, 1 not run (needs -acceptance all)
conf/plmap.yaml   28 passed, 0 failed
conf/fimap.yaml   33 passed, 0 failed
conf/world.yaml   13 passed, 0 failed

go test ./... green, R30 ceiling reports checks=12 with both re-picked probes non-empty, and the docs/country-requirements.md addition auto-merges into clean prose alongside what #122–#124 added to the same file.

Nothing outstanding from my side.

## Re-review Both findings are fixed, and the fixes are right for the right reasons. **The all-ocean test's rationale.** The rewritten comment now states what the check cannot catch (the wrong-floor #28 mode is invisible, because `WHERE geom && margin` runs whichever zoom branch was taken) and what it actually is (a clipping and projection smoke check — a function ignoring its bounds, or geometry at null island, goes red). That matches `mvtFunc` exactly. The title carries the correction too, and the floor test's z2 / stop_z−1 rows are correctly left as the real #28 guards. **The one-feature ceiling probes.** Both re-picked tiles are comfortably wide now: ``` old new water_points 1 row, 69 B → 13 rows, 273 B (Dalälven rapids, Älvkarleby) ferries 1 row, 75 B → 6 rows, 170 B (Archipelago Sea, off Nauvo) ``` The commit's "13 rapids, 6 ferry links" counts match only when measured through the margin envelope (`ST_TileEnvelope(z,x,y, margin => 256.0/4096)`) rather than the plain tile envelope — which is the right way to count, since that is what the generated function actually reads. Nice detail to have got right. Also picked up the note about the block running once per config, which is the useful half of that observation. ### Verification This branch is 7 commits behind `main` and merges cleanly, so I ran everything on the merged result — the state that will actually exist after merge, not the branch in isolation: ``` conf/ismap.yaml 30 passed, 0 failed conf/semap.yaml 30 passed, 0 failed, 1 not run (needs -acceptance all) conf/plmap.yaml 28 passed, 0 failed conf/fimap.yaml 33 passed, 0 failed conf/world.yaml 13 passed, 0 failed ``` `go test ./...` green, R30 ceiling reports `checks=12` with both re-picked probes non-empty, and the `docs/country-requirements.md` addition auto-merges into clean prose alongside what #122–#124 added to the same file. Nothing outstanding from my side.
art merged commit 794fb1a81f into main 2026-08-16 06:31:02 +00:00
art deleted branch issue-125-global-acceptance-tests 2026-08-16 06:31:02 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
art/ismap!140
No description provided.