You are seat H1 (styles data, village, page, probe). Build:
1. kits-src/medieval/style.json and kits-src/modern/style.json in the TYPES.md shape, from the kit briefs
   jobs/medieval-atom-kit-v1/STYLE.md and jobs/modern-atom-kit-v1/STYLE.md (node names there are the role targets) and
   BLUEPRINT section 2-4 + the architect notes in BLUEPRINT section 11. Medieval: ground storey stone 2.6, upper timber
   storeys 2.4 jettied 0.4 out, bays 1.8-2.4 with posts on the axes, window 0.70 x 1.00 on every timber storey, pitch 55,
   tile roof, no gutters, tavern with door_arched_double + tavern_sign + ridge chimney; types house, tavern, smithy,
   shop. Modern: storey 3.0, bays 1.5-3.0, window_tall 1.20 x 2.40 or window_std 1.20 x 1.50 one head line per storey,
   flat roof with parapet 0.5 + coping, types villa, terrace, block3 (3 storeys), shop. Add `wall` kinds 'timber_frame'
   (medieval upper storeys) and 'render' / 'cladding' / 'concrete' (modern) and say in a `notes` field what the code
   must generate for them.
2. omg/kit/building/village.mjs (pure JS): `village(style, seed, { count = 24, plots = null, makeSpec })` returns
   [{ spec, x, z, yaw }]; `makeSpec(style, type, seed, overrides)` is passed in (seat S1 writes it; for your tests use a
   tiny stub). Draws ONE village palette from the seed (style.palette: 2 wall materials, 1 roof, 3 paint colours),
   a type mix (houses ~70 %, 1 tavern per 10, 1-2 shops, longhouse/barn), a street layout when plots is null (two
   rows facing a street along X, plot widths from each spec's width + 1.5-3 m gaps, small yaw jitter, back rows
   facing the other way), and passes overrides { look } so every building uses the village palette. Repetition allowed.
   Test omg/kit/building/test/village.test.mjs: same seed = same village; every building's look comes from the palette;
   no two plots overlap (footprint rectangles + 1 m).
3. browse/buildings.html: copy the structure of browse/houses.html (renderer, sky, sun, ground, OrbitControls, HUD,
   window.__ready / __show / __cam / __stats). Imports: ./building/spec.mjs, check.mjs, layout.mjs, render.mjs,
   village.mjs (the root copies omg/kit/building/*.mjs into browse/building/ at integration; reference them there).
   Style buttons for every style whose kit exists in ./kits/<style>/kit.json (Breton now; medieval and modern appear
   when their kits land), type buttons, views: 'front' (one building, street facade), 'back', 'eaves' (gutter
   close-up), 'roof', 'village' (24), 'new' (new seed). HUD: buildings, instances, draw calls, triangles, per-building
   bytes, check findings count (errors in red, with the sentences listed for the single-building views).
4. tools/gpu/buildings_probe.py: copy tools/gpu/houses_probe.py's pattern (playwright on gex44 via tools/gpu/run.sh):
   load buildings.html for each available style, run each view, save a PNG per view, read window.__stats, also a phone
   viewport pass (390 x 844, deviceScaleFactor 2) for the village view; print fatal page errors and console errors;
   write stats.json.
Files you own: kits-src/medieval/style.json, kits-src/modern/style.json, omg/kit/building/village.mjs,
omg/kit/building/test/village.test.mjs, browse/buildings.html, tools/gpu/buildings_probe.py. You cannot run the page
end-to-end until S1 and S2 land: make it correct against TYPES.md, the root integrates.
