buildings: two shared contracts, four countries (#150, #102, #105, #109) #160

Merged
art merged 11 commits from issue-150-shared-buildings into main 2026-08-19 04:44:48 +00:00
Owner

Closes #150
Closes #102
Closes #105
Closes #109

Buildings, end to end: the shared contracts, all four countries, and the review fixes.
Originally four stacked PRs (#160 #161 #162 #163) — folded into this one, since each
branch already contained its predecessors and the country partitions have no meaning
without the contract they land in.


Two contracts, not one

Buildings arrive as two different kinds of thing, so they get two shared layers.

buildings — one footprint polygon per building, building_class (a five-value
enum: residential, industrial_commercial, public, government, other) and a nullable
height. z12–14, filter_only. The zoom ladder is the contract's rule, expressed as
per-country zoom_filters: z12 the landmark classes (industrial_commercial +
public + government — what reads at 1:200 000), z13 all-but-other, z14
everything
. other is the escape hatch the contract is designed around: a country
whose source has no sensible classification puts everything there (legal by design),
and the style draws it exactly like residential, so an honest "we don't know" costs
the map nothing visible.

building_points — one point per building, the sixteen-value building_type
ladder, and a name. Same three rungs, same floors. This is the contract for
registers that survey buildings as points instead of polygons.

Why two. The first cut of this work had one contract and buffered Iceland's points
into it as ~25-unit dots. That trade was wrong twice over: a buffered point is not a
footprint (nothing downstream — area, extrusion, a real outline at z14 — means anything
on it), and squeezing a sixteen-value register through the five-value building_class
throws away exactly the information a point still has. Iceland lost its per-type icons
and its building names to fill a contract it does not fit. A point's whole payload IS
its class, so the class stays fine-grained and the rendering is a symbol, not a shape.

height is NULL across all three footprint partitions today — measured in each case,
not assumed. Sweden's Topo 10 surveys none; Poland's LICZBAKONDYGNACJI is storeys,
not metres; and Finland's korkeusarvo looks like a height but is the building's
highest point above sea level in millimetres (verified: korkeusarvo = 1000 × the
geometry envelope's Z — 40 000–77 000 for "1–2 floor residential" rows on a 60–130 m
plateau). The column stays for a future 3D extrusion.

Contract-level R119/R120 hold every partition of both layers.

The four countries

source rows z12 z13
se Topo 10 Byggnadsverk 9 494 641 363 118 3 625 756
pl BDOT10k OT_BUBD_A 16 351 829 1 070 175 9 169 004
fi MTK-rakennus 5 627 446 151 345 2 064 631
is IS 50V mannvirki_punktar (building_points) 23 607 814 11 164

Sweden maps objekttypnr 2061 Bostad → residential, 2062/2064 → industrial_
commercial, 2063 Samhällsfunktion → public except andamal1 Kommunhus / Polisstation
/ Kriminalvårdsanstalt → government (1 423 — the only place any source names the
class directly)
, 2065–2067 → other. Only andamal1 is read: the source allows five
purposes and 131 buildings name a government purpose in a secondary slot, but the
primary purpose wins.

Poland maps on PRZEWAZAJACAFUNKCJABUDYNKU, the prevailing function — 165
single-valued labels — because that is what makes mixed-use unambiguous, with FSBUD
as fallback for the 0.92% where it is NULL. Geometry is EGiB cadastral footprints,
glob-merged from all 380 county packages.

Finland is the coarsest of the three: the kohdeluokka ladder cannot split offices
from public buildings (all → public), has no government class at all (fi's government
partition is empty by design, and tested), and dumps shops, barns and sheds into a
3.56M-row muu catch-all → other.

Iceland feeds building_points and has no buildings partition. The 16-code
mannvirki ladder became the shared building_type enum unchanged, so the style still
picks a per-type icon with ["get", "building_type"].

The style

buildings is one fill layer: warm grey for residential/other, neutral grey for
industrial_commercial, warmer tan for public, warmest for government. The outline is a
step on zoom that equals the fill below z14 and darkens at z14+ — below that a
footprint is a pixel or two and a 1 px outline would eat it.

buildings_dots / buildings_icons / building_names read building_points. All
sixteen building_type values are drawn exactly once: five as plain dots, eleven as
Maki sprite icons, names labelling from z13 (text-optional).

68 style layers now: 63 from map, 4 Iceland-only from is, 1 sourceless.

Two bugs the review found in Poland's ladder

Both found by counting the ladder's output against the source rather than by reading
it, and both worth recording because the shape recurs in any regex mapping:

  • urzad matched nothing. The register always writes urząd. So ~9 800 town
    halls, customs and voivodeship offices fell through every branch to other — which
    z12 and z13 drop — making Poland's town halls invisible above z14, while
    government still looked populated (6 784 rows, the ones that also matched
    starostwo/policj/graniczn) so no test noticed. Now urz[ąę]d: government is
    16 935
    . A diacritic-free alternative in this ladder is always a bug.
  • A bare opera alternative also matched 'placówka operatora pocztowego',
    filing 3 002 post offices as public — the opposite of what the config's own comment
    says they get. Now \mopera\M. A short alternative in a 165-value ladder needs a word
    boundary.

Both got a regression test. government is now pinned against the source's urząd count
(the old government > 0 passed throughout the bug), and the opera alternative's word
boundary is asserted on the pattern itself — no table, one millisecond.

Also from the review

  • pl_bubd added to Poland's R105 staging check — the staging block had 26 tables and
    the check named 25, leaving Poland's largest staging table unchecked.
  • The contract's claim that Finland carries a measured height, corrected (see above).
  • Poland's z12 figure corrected 1.35M → ~1.07M; Finland's 149k → 151 345.
  • The Makefile's pre-fetch BUBD_A guess (~7.5M, "roughly a third") replaced with the
    measured 16 351 829 / "roughly a quarter", and the wrong attribute name fixed.
  • A duplicated line in docs/style.md, a mid-sentence paragraph break in
    docs/country-poland.md, and committed conflict markers in the Poland and Finland
    country docs — all fixed.
  • importer/tiles_test.go no longer uses a per-country buildings layer as its
    fixture; that config shape cannot exist any more.

Verified

  • 197 acceptance tests across all five configs, 0 failures. Both Go modules build
    and test clean; every query prepares (check-queries, 0 PROPERTYNAME violations).
  • Row counts equal the source parts in every partition, nothing unclassified.
  • R121 decoded tiles carry [building_class height country] and
    [building_type name country].
  • The point/footprint split is clean in the tiles: Reykjavík z15 is 0 bytes of
    footprints and 3 884 of points; Stockholm is 6 394 of footprints and 0 points.
  • Tile budget holds under 16.35M unsimplified Polish footprints: the densest z14
    buildings tile is 126 kB, the full zxy_map tile over it 160 kB.
  • Iceland's rendering is byte-for-byte the behaviour that predates this work:
    z12/z13/z14 = 814 / 11 164 / 23 607, all 23 607 named.

Known, deliberately not fixed here

Buildings currently draw over streets and place labels. That is a style-ordering
problem the whole map has, not something this contract introduces — tracked separately.

Closes #150 Closes #102 Closes #105 Closes #109 Buildings, end to end: the shared contracts, all four countries, and the review fixes. Originally four stacked PRs (#160 #161 #162 #163) — folded into this one, since each branch already contained its predecessors and the country partitions have no meaning without the contract they land in. --- ## Two contracts, not one Buildings arrive as two different kinds of thing, so they get two shared layers. **`buildings`** — one footprint polygon per building, `building_class` (a five-value enum: residential, industrial_commercial, public, government, other) and a nullable `height`. z12–14, `filter_only`. The zoom ladder is the contract's rule, expressed as per-country `zoom_filters`: **z12 the landmark classes** (industrial_commercial + public + government — what reads at 1:200 000), **z13 all-but-`other`**, **z14 everything**. `other` is the escape hatch the contract is designed around: a country whose source has no sensible classification puts everything there (legal by design), and the style draws it exactly like `residential`, so an honest "we don't know" costs the map nothing visible. **`building_points`** — one point per building, the sixteen-value `building_type` ladder, and a `name`. Same three rungs, same floors. This is the contract for registers that survey buildings as points instead of polygons. **Why two.** The first cut of this work had one contract and buffered Iceland's points into it as ~25-unit dots. That trade was wrong twice over: a buffered point is not a footprint (nothing downstream — area, extrusion, a real outline at z14 — means anything on it), and squeezing a sixteen-value register through the five-value `building_class` throws away exactly the information a point still has. Iceland lost its per-type icons and its building names to fill a contract it does not fit. A point's whole payload IS its class, so the class stays fine-grained and the rendering is a symbol, not a shape. `height` is NULL across all three footprint partitions today — measured in each case, not assumed. Sweden's Topo 10 surveys none; Poland's `LICZBAKONDYGNACJI` is storeys, not metres; and Finland's `korkeusarvo` looks like a height but is the building's highest point **above sea level** in millimetres (verified: `korkeusarvo` = 1000 × the geometry envelope's Z — 40 000–77 000 for "1–2 floor residential" rows on a 60–130 m plateau). The column stays for a future 3D extrusion. Contract-level R119/R120 hold every partition of both layers. ## The four countries | | source | rows | z12 | z13 | |---|---|---|---|---| | **se** | Topo 10 Byggnadsverk | 9 494 641 | 363 118 | 3 625 756 | | **pl** | BDOT10k OT_BUBD_A | 16 351 829 | 1 070 175 | 9 169 004 | | **fi** | MTK-rakennus | 5 627 446 | 151 345 | 2 064 631 | | **is** | IS 50V mannvirki_punktar (`building_points`) | 23 607 | 814 | 11 164 | **Sweden** maps `objekttypnr` 2061 Bostad → residential, 2062/2064 → industrial_ commercial, 2063 Samhällsfunktion → public *except* `andamal1` Kommunhus / Polisstation / Kriminalvårdsanstalt → **government (1 423 — the only place any source names the class directly)**, 2065–2067 → other. Only `andamal1` is read: the source allows five purposes and 131 buildings name a government purpose in a secondary slot, but the primary purpose wins. **Poland** maps on `PRZEWAZAJACAFUNKCJABUDYNKU`, the *prevailing* function — 165 single-valued labels — because that is what makes mixed-use unambiguous, with `FSBUD` as fallback for the 0.92% where it is NULL. Geometry is EGiB cadastral footprints, glob-merged from all 380 county packages. **Finland** is the coarsest of the three: the kohdeluokka ladder cannot split offices from public buildings (all → public), has no government class at all (fi's government partition is empty by design, and tested), and dumps shops, barns and sheds into a 3.56M-row `muu` catch-all → other. **Iceland** feeds `building_points` and has no `buildings` partition. The 16-code mannvirki ladder became the shared `building_type` enum unchanged, so the style still picks a per-type icon with `["get", "building_type"]`. ## The style `buildings` is one fill layer: warm grey for residential/other, neutral grey for industrial_commercial, warmer tan for public, warmest for government. The outline is a `step` on zoom that equals the fill below z14 and darkens at z14+ — below that a footprint is a pixel or two and a 1 px outline would eat it. `buildings_dots` / `buildings_icons` / `building_names` read `building_points`. All sixteen `building_type` values are drawn exactly once: five as plain dots, eleven as Maki sprite icons, names labelling from z13 (`text-optional`). 68 style layers now: 63 from `map`, 4 Iceland-only from `is`, 1 sourceless. ## Two bugs the review found in Poland's ladder Both found by counting the ladder's output against the source rather than by reading it, and both worth recording because the shape recurs in any regex mapping: * **`urzad` matched nothing.** The register always writes `urząd`. So ~9 800 town halls, customs and voivodeship offices fell through every branch to `other` — which z12 **and** z13 drop — making Poland's town halls invisible above z14, while `government` still looked populated (6 784 rows, the ones that also matched `starostwo`/`policj`/`graniczn`) so no test noticed. Now `urz[ąę]d`: **government is 16 935**. A diacritic-free alternative in this ladder is always a bug. * **A bare `opera` alternative** also matched 'placówka **opera**tora pocztowego', filing 3 002 post offices as `public` — the opposite of what the config's own comment says they get. Now `\mopera\M`. A short alternative in a 165-value ladder needs a word boundary. Both got a regression test. `government` is now pinned against the source's urząd count (the old `government > 0` passed throughout the bug), and the opera alternative's word boundary is asserted on the pattern itself — no table, one millisecond. ## Also from the review * `pl_bubd` added to Poland's R105 staging check — the staging block had 26 tables and the check named 25, leaving Poland's largest staging table unchecked. * The contract's claim that Finland carries a measured height, corrected (see above). * Poland's z12 figure corrected 1.35M → ~1.07M; Finland's 149k → 151 345. * The Makefile's pre-fetch BUBD_A guess (~7.5M, "roughly a third") replaced with the measured 16 351 829 / "roughly a quarter", and the wrong attribute name fixed. * A duplicated line in docs/style.md, a mid-sentence paragraph break in docs/country-poland.md, and committed conflict markers in the Poland and Finland country docs — all fixed. * `importer/tiles_test.go` no longer uses a per-country `buildings` layer as its fixture; that config shape cannot exist any more. ## Verified * **197 acceptance tests across all five configs, 0 failures.** Both Go modules build and test clean; every query prepares (`check-queries`, 0 PROPERTYNAME violations). * Row counts equal the source parts in every partition, nothing unclassified. * R121 decoded tiles carry `[building_class height country]` and `[building_type name country]`. * The point/footprint split is clean in the tiles: Reykjavík z15 is 0 bytes of footprints and 3 884 of points; Stockholm is 6 394 of footprints and 0 points. * Tile budget holds under 16.35M unsimplified Polish footprints: the densest z14 buildings tile is 126 kB, the full `zxy_map` tile over it 160 kB. * Iceland's rendering is byte-for-byte the behaviour that predates this work: z12/z13/z14 = 814 / 11 164 / 23 607, all 23 607 named. ## Known, deliberately not fixed here Buildings currently draw over streets and place labels. That is a style-ordering problem the whole map has, not something this contract introduces — tracked separately.
art added 12 commits 2026-08-18 20:40:49 +00:00
The buildings contract (conf/common.yaml): footprint polygon + `building_class`
(five values: residential, industrial_commercial, public, government, other —
deliberately coarse so every country's unrelated source ladder collapses into
one set) + nullable `height` (metres; only Finland's MTK carries one today, the
column exists for the future 3D extrusion). z12–14, filter_only; the zoom
rungs are the contract's rule (z12 landmark classes, z13 all-but-other, z14
everything) expressed per country. Contract-level R119/R120 acceptance tests
hold every partition.

Iceland folds in: its IS 50V mannvirki is a POINT layer (no footprints exist
in the delivery), so the is partition carries the points buffered to ~25-unit
dots — the old dot rendering, as a polygon. The 16-code mannvirki ladder maps
to the five classes (mapping + judgement calls next to the query). The old
point layer, its building_type enum, its icons and its names are gone: the
style's buildings_dots/buildings_icons/building_names trio (source `is`)
becomes one `buildings` fill (source `map`), `other` rendering exactly like
`residential`, outline only at z14 where a footprint is big enough to carry
one.

Verified against the live DB: 23 607 footprints (1:1 with the source points,
acceptance-tested), all zooms populated, decoded tile carries exactly
[building_class height country], all 34 ismap acceptance tests pass, R30
probes added for the new layer (floor z11, maxz z15 over Iceland's densest
mannvirki tile, mid-Atlantic z5).
Adds the byggnadsverk_sverige.zip theme as its own geotorget entry
(`topo10-byggnadsverk`), separate from the topo10 order for the same
reason topo10-text is: delivery ids rotate, and adding the file to the
order's `files:` list would re-download every theme the day the delivery
id changes. 3.7 GB unzipped, 9 494 641 building polygons (R5 recorded in
docs/country-sweden.md with the layer).
Adds OT_BUBD_A to the fetch set and renames the extraction marker to
`pt-sw-sk-oikm-oipr-skpp-kuk-bubd`, which forces the ~25 GB re-pull the
widening needs (county zips are deleted after extraction — the marker
encodes WHICH classes were extracted, per the rule in the Makefile
comment). BUBD_A is BDOT10k's most numerous class (~7.5M objects
nationally, roughly a third of the database): the buildings layer's
source. 380/380 counties fetched and extracted; per-class GB/rows go in
docs/country-poland.md with the layer (R5).
Adds the MTK-rakennus_25-04-03.gpkg download (4.39 GB zipped, recorded on
first fetch per R5) to fimap.yaml's downloads. The full MTK set is nine
files and 112 GB; this is the one the buildings layer reads (issue #150's
shared contract).
The se partition of the shared buildings layer (conf/common.yaml contract,
#150): 9 494 641 footprints staged from the byggnadsverk theme (R5: 3.7 GB
unzipped), ST_Dumped to single polygons, and mapped from the seven-value
objekttypnr ladder — Bostad → residential, Industri + Verksamhet →
industrial_commercial, Samhällsfunktion → public except the andamal1
government set (Kommunhus/Polisstation/Kriminalvårdsanstalt, 1 423
buildings — the one place any of the four sources names the government
class directly), Ekonomibyggnad/Komplementbyggnad/Övrig byggnad → other.
No height: Topo 10 surveys none (the future 3D source is a separate
not-yet-negotiated product), so the column is NULL throughout.

Zoom rungs are the contract's three: z12 the 363k landmark footprints,
z13 the 3.62M all-but-other set, z14 all 9.49M. Densest Stockholm z14
tile measures 115 kB — no area filter needed.

Acceptance: footprints = sum of source parts, nothing unclassified,
government = the andamal1 count (a new andamal value drifting those rows
to public fails the test), z12 keeps all three landmark classes; plus the
contract's R119/R120. All 40 fast se tests pass; decoded tile carries
[building_class height country].
The zxy_map source function (conf/world.yaml) concatenates every shared
layer's MVT output — buildings was added to the shared contracts and to
every country config, but not to the source's layer list, so the served
tiles silently lacked the layer while zxy_map_buildings worked in
isolation. Caught by the CDP render (queryRenderedFeatures returned 0
buildings while the tile tool showed 1.7k in the same tile).

The R30 maxz probe for buildings moves from Iceland's densest mannvirki
tile to the central-Stockholm tile the other maxz-14 layers use: with all
four partitions live, the probe exercises the densest country, and the
comment records why Iceland's own densest tile (IS 50V marks structures,
and its densest cluster is in the Faxaflói hinterland, not the capital)
is empty there.
The pl partition of the shared buildings layer (conf/common.yaml contract,
#150): 16 351 829 cadastral footprints (EGiB geometry) glob-merged from the
380 county packages, ST_Dumped to single polygons, and mapped from
PRZEWAZAJACAFUNKCJABUDYNKU — the *prevailing* function, 165 single-valued
labels measured nationally on first fetch (FSBUD, the raw pipe-combined
ladder, is the fallback for the 0.92% of rows where the prevailing function
is NULL). Mapping on the prevailing function is what makes mixed-use
buildings unambiguous: 'budynek wielorodzinny|obiekt handlowo-usługowy'
carries PRZEWAZAJACA 'budynek wielorodzinny' → residential. The regex
ladder assigns all 165 values — government (urzędy, sądy, policja, zakłady
karne, straż graniczna…), public (szkoły, kościoły, szpitale, dworce,
sport, koszary…), residential, industrial_commercial (handel, magazyny,
produkcja, elektrownie, hotele, stacje paliw… — with apteka and the post
office following FUNKCJAOGOLNA's own commerce/office grouping), and the
unmatched remainder (gospodarczy, garaż, szklarnia, zabytek…) as `other`
per the contract's escape hatch. No height: the schema carries
LICZBAKONDYGNACJI (storeys), not metres.

Zoom rungs: z12 the ~1.35M landmark footprints, z13 the ~9.2M all-but-other
set, z14 all 16.35M. Densest z14 tile (Warsaw region) measures ~130 kB —
no area filter needed.

Acceptance: footprints = sum of source parts (16 351 829), nothing
unclassified, the z12 rung keeps all three landmark classes; plus the
contract's R119/R120. All 11 pl buildings tests pass; decoded tile carries
[building_class height country]; CDP render over Warsaw shows 3 533
footprints at z14 (all five classes) and 9 821 landmark footprints at z12.
The fi partition of the shared buildings layer (conf/common.yaml contract,
#150): 5 627 446 footprints staged from the rakennus table (4.39 GB zipped,
R5 recorded in docs/country-finland.md), ST_Force2D + ST_Dump, and mapped
from the kohdemalli's floor-count ladder — the coarsest of the four
countries: 4221x asuin → residential, 4222x toimisto- tai julkinen →
public (the source cannot split offices from public buildings; R137: stop
at the class the source distinguishes), 4223x loma → residential, 4224x
teollinen → industrial_commercial, 4225x + 42270 kirkko → public, 4226x
muu → other (3.56M rows: MTK has no commercial/storage/agricultural
classes, so shops, barns and sheds all live in the catch-all — the
contract's escape hatch). No government class exists, so fi's government
partition is empty by design (tested).

NO HEIGHT, measured on the delivery: rakennus carries korkeusarvo, but its
values are the building's highest point ABOVE SEA LEVEL in millimetres —
verified korkeusarvo = 1000 × the geometry envelope's Z (40 000–77 000 for
"1–2 floor residential" rows in the 60–130 m-ASL lake plateau), not a
height above ground. The 0.2% of rows carrying it are unusable for the 3D
map, so the partition's height is NULL throughout; the finding is recorded
next to the query (R6-style: measured, not assumed) and in
docs/country-finland.md.

Zoom rungs: z12 the 149k landmark footprints (industrial + public),
z13 the ~2.05M all-but-other set, z14 all 5.63M.

Acceptance: footprints = sum of source parts, nothing unclassified, class
counts equal the kohdeluokka ladder's (a remapped or new kohdeluokka drifts
the counts and fails), the z12 rung keeps the two classes Finland has; plus
the contract's R119/R120. All 13 fi buildings tests pass; decoded tile
carries [building_class height country]; CDP render over Helsinki shows 976
footprints at z14.
The buildings theme is its own geotorget entry (same delivery-id-rotation
reasoning as topo10-text), so the config now declares four orders.
art force-pushed issue-150-shared-buildings from ef9305b198 to 1f7b95a821 2026-08-18 20:50:08 +00:00 Compare
Iceland's IS 50V mannvirki is a POINT theme. #150 buffered those points into the
polygon `buildings` contract, which cost the map twice: a buffered dot is not a
footprint, and squeezing a 16-value register through the five-value
`building_class` threw away exactly the information a point still has. Iceland
lost its per-type icons and its building names to fill a contract it does not fit.

So the point register gets its own shared contract instead:

  * `building_points` (z12-14, geom + building_type + name) in conf/common.yaml,
    alongside `buildings` rather than inside it. Shared, not Iceland-only, so a
    second point-only country maps into the same ladder and gets the same icons.
  * `building_type`, the 16-code mannvirki ladder, promoted from Iceland's private
    enum to a shared one. No `other` escape hatch, on purpose: a footprint with an
    unknown class still has a shape to draw, a point has nothing.
  * conf/ismap.yaml goes back to the pre-#150 query (renamed attrs: mannvirki ->
    building_type, nafnfitju -> name), the pre-#150 cascade, and no partition of
    `buildings` at all. The ST_Buffer staging table is gone with it.
  * The style's buildings_dots / buildings_icons / building_names trio comes back,
    reading `map`/`building_points`. All 16 enum values are drawn exactly once:
    5 as dots, 11 as sprite icons.

Verified: 23 607 points, z12/z13/z14 = 814 / 11 164 / 23 607 — identical to
pre-#150 — all named; decoded tile carries [building_type name country]; the
Reykjavik z15 tile is 0 bytes of footprints and 3 884 of points, Stockholm the
reverse.

Two bugs in Poland's regex ladder, both found by counting its output against the
source rather than by reading it:

  * `urzad` matched nothing — the register always writes `urząd`. ~9 800 town
    halls, customs and voivodeship offices fell through to `other`, which z12 and
    z13 both drop, so Poland's town halls were invisible above z14 while
    `government` still looked populated (6 784 rows that also matched
    starostwo/policj/graniczn). Now `urz[ąę]d`: government is 16 935.
  * bare `opera` also matched 'placówka OPERAtora pocztowego', filing 3 002 post
    offices as `public` — the opposite of what the config's own comment says they
    get. Now `\mopera\M`.

Both get a regression test: government is pinned against the source's urząd count
(the old `government > 0` passed throughout the bug), and the opera alternative's
word boundary is asserted on the pattern itself, no table needed.

Also from the review: pl_bubd added to Poland's R105 staging check (the staging
block had 26 tables, the check named 25 — the largest one was unchecked); the
buildings contract's claim that Finland carries a measured height corrected
(no source carries one, and Finland's korkeusarvo is metres above SEA LEVEL);
Poland's z12 figure corrected to ~1.07M and Finland's to 151 345; the Makefile's
pre-fetch BUBD_A guess replaced with the measured count and the right attribute
name; Sweden's andamal1-only decision written down; the duplicated line in
docs/style.md and the mid-sentence paragraph break in docs/country-poland.md
fixed; and the tiles_test fixture no longer describes a per-country `buildings`
layer, which cannot exist any more.

197 acceptance tests pass across all five configs; both Go modules build and test
clean; all queries prepare.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
art-bot changed title from #150: shared buildings layer — one contract, four partitions, style reads map to buildings: two shared contracts, four countries (#150, #102, #105, #109) 2026-08-18 22:44:39 +00:00
art merged commit 55c0ce86a7 into main 2026-08-19 04:44:48 +00:00
art deleted branch issue-150-shared-buildings 2026-08-19 04:44:48 +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!160
No description provided.