facett-map/tests/data/building_height_corpus.jsonl
# building_height_corpus.jsonl — ONE decision, TWO texts, and the file that catches them drifting.
#
# The decision is "what metres does this OSM building's tagging mean?". It is written
# twice, on purpose and unavoidably:
#
# A) osm_katana::shared::height (znippy-zoomies, osm-katana/src/shared/height.rs)
# — the one writer of buildings.parquet's height_m / height_source columns.
# B) facett_map::height (facett, facett-map/src/height.rs)
# — the per-way parser korp's 3D map view runs on tile tags.
#
# facett MUST NOT depend on osm-katana: facett is a UI component library, and an edge
# from a widget crate to a planet-scale OSM cutter would drag arrow/parquet into every
# consumer of a map widget. So LAW 5 is NOT satisfied by construction here. This file is
# the cheapest honest substitute: the duplication is made DETECTABLE instead of hidden.
#
# PROVENANCE of the `height_m` / `source` columns: they were PRODUCED by running arm (A),
# `shared::height::of_tags`, verbatim from znippy-zoomies commit 04248be, over the `tags`
# column below. They were not transcribed by hand. Measured 2026-08-31.
#
# THE TWO ARMS THAT MUST BOTH RUN:
# facett cargo test -p facett-map --test building_height_corpus
# osm-katana (hand-off, NOT landed by lane SPIKE — see .nornir/building-height.md)
#
# TO REGENERATE after a deliberate change to the decision: re-run arm (A) over these
# `tags` values, replace the DATA lines of this file in BOTH repos, and update
# CORPUS_DIGEST in facett-map/tests/building_height_corpus.rs (the failure message
# prints the new value). The digest covers the data lines only — `#` comments and blank
# lines are excluded, so each repo may word its own header — and it is what makes a
# one-sided edit loud instead of quiet.
#
# Fields: tags = the OSM tag object; height_m = metres or null (null means "no usable
# height — draw the default box"); source = shared::height's HeightSource name, recorded
# for a future facett that wants the stamp. facett consumes `tags` and `height_m` only.
#
{"tags":{"building":"yes"},"height_m":null,"source":"absent"}
{"tags":{"building":"house"},"height_m":null,"source":"absent"}
{"tags":{"building":"yes","name":"Klara kyrka"},"height_m":null,"source":"absent"}
{"tags":{"building":"yes","height":"99999"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"1;12"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"25'"},"height_m":7.62,"source":"tagged_feet"}
{"tags":{"building":"yes","height":"102,5"},"height_m":102.5,"source":"tagged_metres"}
{"tags":{"building":"yes","building:levels":"3-4"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"12"},"height_m":12,"source":"tagged_metres"}
{"tags":{"building":"yes","height":"12.5"},"height_m":12.5,"source":"tagged_metres"}
{"tags":{"building":"yes","height":"0.7"},"height_m":0.7,"source":"tagged_metres"}
{"tags":{"building":"yes","height":"118.7"},"height_m":118.7,"source":"tagged_metres"}
{"tags":{"building":"yes","height":"3"},"height_m":3,"source":"tagged_metres"}
{"tags":{"building":"yes","height":"30"},"height_m":30,"source":"tagged_metres"}
{"tags":{"building":"yes","height":"828"},"height_m":828,"source":"tagged_metres"}
{"tags":{"building":"yes","height":"1000"},"height_m":1000,"source":"tagged_metres"}
{"tags":{"building":"yes","height":"12 m"},"height_m":12,"source":"tagged_metres"}
{"tags":{"building":"yes","height":"12m"},"height_m":12,"source":"tagged_metres"}
{"tags":{"building":"yes","height":"20 M"},"height_m":20,"source":"tagged_metres"}
{"tags":{"building":"yes","height":"14.5 m"},"height_m":14.5,"source":"tagged_metres"}
{"tags":{"building":"yes","height":"1 meter"},"height_m":1,"source":"tagged_metres"}
{"tags":{"building":"yes","height":"3 metres"},"height_m":3,"source":"tagged_metres"}
{"tags":{"building":"yes","height":"3 meters"},"height_m":3,"source":"tagged_metres"}
{"tags":{"building":"yes","height":"3 metre"},"height_m":3,"source":"tagged_metres"}
{"tags":{"building":"yes","height":" 8.0 m "},"height_m":8,"source":"tagged_metres"}
{"tags":{"building":"yes","height":"8,5"},"height_m":8.5,"source":"tagged_metres"}
{"tags":{"building":"yes","height":"21,5"},"height_m":21.5,"source":"tagged_metres"}
{"tags":{"building":"yes","height":"39'"},"height_m":11.8872,"source":"tagged_feet"}
{"tags":{"building":"yes","height":"39'6\""},"height_m":12.0396,"source":"tagged_feet"}
{"tags":{"building":"yes","height":"39' 6\""},"height_m":12.0396,"source":"tagged_feet"}
{"tags":{"building":"yes","height":"6'11\""},"height_m":2.1082,"source":"tagged_feet"}
{"tags":{"building":"yes","height":"39 ft"},"height_m":11.8872,"source":"tagged_feet"}
{"tags":{"building":"yes","height":"39ft"},"height_m":11.8872,"source":"tagged_feet"}
{"tags":{"building":"yes","height":"39 feet"},"height_m":11.8872,"source":"tagged_feet"}
{"tags":{"building":"yes","height":"100 FT"},"height_m":30.48,"source":"tagged_feet"}
{"tags":{"building":"yes","height":""},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":" "},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"B"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"Österbybruks hembygdsgård"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"5 må"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"höjdä"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"ö"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"45 m;37 m"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"32;81"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"0"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"-4"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"0 m"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"12000"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"999999999"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"1,500"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"1,2,3"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"12,"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"12,x"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"1e9"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"inf"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"NaN"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"12.5.5"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"'6\""},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"39'13\""},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"39'6"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"gabled"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"50000 m"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"99999'"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","height":"1001"},"height_m":null,"source":"rejected"}
{"tags":{"building":"apartments","building:levels":"1"},"height_m":3.2,"source":"derived_from_levels"}
{"tags":{"building":"apartments","building:levels":"2"},"height_m":6.4,"source":"derived_from_levels"}
{"tags":{"building":"apartments","building:levels":"3"},"height_m":9.6,"source":"derived_from_levels"}
{"tags":{"building":"apartments","building:levels":"4"},"height_m":12.8,"source":"derived_from_levels"}
{"tags":{"building":"apartments","building:levels":"5"},"height_m":16,"source":"derived_from_levels"}
{"tags":{"building":"apartments","building:levels":"10"},"height_m":32,"source":"derived_from_levels"}
{"tags":{"building":"apartments","building:levels":"18"},"height_m":57.600002,"source":"derived_from_levels"}
{"tags":{"building":"apartments","building:levels":"163"},"height_m":521.60004,"source":"derived_from_levels"}
{"tags":{"building":"apartments","building:levels":"3.5"},"height_m":11.2,"source":"derived_from_levels"}
{"tags":{"building":"apartments","building:levels":"0.5"},"height_m":1.6,"source":"derived_from_levels"}
{"tags":{"building":"yes","building:levels":"0"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","building:levels":"2;1"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","building:levels":"4;4.5"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","building:levels":"gabled"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","building:levels":"K1, 0"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","building:levels":"F6"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","building:levels":"9999"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","building:levels":"500"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","building:levels":"99999"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","building:levels":"-2"},"height_m":null,"source":"rejected"}
{"tags":{"building":"yes","building:levels":""},"height_m":null,"source":"rejected"}
{"tags":{"building":"house","building:levels":"2","roof:levels":"1"},"height_m":9.6,"source":"derived_from_levels"}
{"tags":{"building":"house","building:levels":"4","roof:levels":"2"},"height_m":19.2,"source":"derived_from_levels"}
{"tags":{"building":"house","building:levels":"2","roof:levels":"#ffb5b5"},"height_m":6.4,"source":"derived_from_levels"}
{"tags":{"building":"house","roof:levels":"1"},"height_m":null,"source":"absent"}
{"tags":{"building":"yes","building:levels":"4","height":"9"},"height_m":9,"source":"tagged_metres"}
{"tags":{"building":"yes","building:levels":"4","height":"15"},"height_m":15,"source":"tagged_metres"}
{"tags":{"building":"yes","building:levels":"5","height":"gabled"},"height_m":16,"source":"derived_from_levels"}
{"tags":{"building":"yes","building:levels":"5","height":"99999"},"height_m":16,"source":"derived_from_levels"}
{"tags":{"building":"yes","building:levels":"3-4","height":"12"},"height_m":12,"source":"tagged_metres"}
{"tags":{"building":"yes","building:levels":"0","height":"8"},"height_m":8,"source":"tagged_metres"}