You are W-LANDMARK. Goal: `omg/kit/building/landmarks.mjs` per SETTLEMENT.md section 3: `church(seed, opts, kitInfo)`
and `cathedral(seed, opts, kitInfo)` return a Layout (instances only, each with `kit: 'medieval-church'` or
`'medieval-cathedral'`, plus `bbox`, `footprint`, `findings`) assembled from the slice modules of section 1
(medieval-church and medieval-cathedral tables): slices joined on x planes using their slice lengths (read the real
lengths from kitInfo bounding boxes when given, else the table numbers), tower stages stacked by height, porch on the
door bay, transepts mirrored on -Z, spires on the west towers, apse or flat east end. Seeded variation: bay counts,
tower top, porch side, spires 0/1/2, east end. Also `landmarkFootprint(kind, opts)` for the planner, and churchyard
props (`churchyard(seed, footprint)` -> wall segments + lychgate + gravestones + cross as instances, kit
'medieval-church'). Checks: no gaps between slices (sum of lengths = footprint), the door bay faces +Z, the west front
is at -X. Render: build the layout with render.mjs (instances from one kit; if the kit is missing, grey boxes sized by
the table, so it looks like a massing model). Page: browse/landmarks.html (church, cathedral, new seed, a churchyard;
same HUD/camera conventions as browse/buildings.html; window.__ready/__show/__stats for probes).
Files: omg/kit/building/landmarks.mjs, omg/kit/building/test/landmarks.test.mjs, browse/landmarks.html,
tools/gpu/landmarks_probe.py. Local server port 8973, GPU probe FAL_PORT 8974.
Evidence: tests (slice joins, counts, determinism per seed, footprint), GPU screenshots of a church and a cathedral.
