You are W-ROADS6 (round 6). Operator review (8 Oct 2026, 23:20 CET): "it still reads as a very cheap village/town:
roads are not smooth/no curves, weird holes sometimes ... the church esplanade is plain and geometrical". Your job: the
GROUND reads like a real old town: smooth curved streets, organic squares, edges that blend, and no holes.
Read first: CITY-LAYOUT.md (sections 3 and 5), SETTLEMENT.md, ground.mjs, settlement.mjs (roads, squares, grading),
settlement-render.mjs ("the ground" section), test/ground.test.mjs.

Files you own: omg/kit/building/ground.mjs, the road/square/grading parts of settlement.mjs, the "the ground" section of
settlement-render.mjs (terrain, roads, paving, squares), test/ground.test.mjs, test/roads6.test.mjs (new).
W-LIFE6 works in parallel on vegetation, props and the church square's furniture (new files dress.mjs /
dress-render.mjs plus one call line each in settlement.mjs and settlement-render.mjs): do not touch those.

1. Curves: street centrelines are smooth (Catmull-Rom or Chaikin, resampled about every 1.5 m) BEFORE plots are laid,
   so rows follow the bend; main roads bend gently, lanes more. Junctions get rounded corners (a fillet patch / fan, no
   overlapping ribbons, no sharp V). Keep every round 5 law: flat across, <= 12 % along, pads, door clearance, rows.
2. Surfaces: main streets and squares paved (cobble), lanes dirt/gravel, village tracks dirt with a grass strip in the
   middle where traffic is light. Edges blend: a 0.6-1.2 m worn verge (vertex colour / second material fading from road
   to grass, a curb or gutter stone line in towns), never a razor edge on grass. Vary tone along the street (wet patches,
   wear in the cart tracks) with vertex colours, not new textures.
3. Squares: organic polygon (5-8 sides, follows the streets that enter it, not a rectangle), paving with a pattern
   change (a border band of larger stones, a gutter), slight fall for drainage within the flat-ground law. The church
   forecourt (parvis) in front of the church door: paved, irregular, joined to the square or street, low steps where
   the levels differ. W-LIFE6 adds the trees, well, benches, graves on it: expose plan.squares[i].poly and a
   plan.parvis { poly, y } for them.
4. Holes: find every place where the sky or the void shows through the ground (seams between the 1 m carved grid and the
   4 m outer terrain, road ends, square edges, under pads, around retaining walls, water banks). Method: GPU eye-level
   sweep shots over town/hill/1, town/hill/5, village/hill/1, city/river/1, village/plain/2 + a numeric check (sample the
   rendered ground: no gaps between neighbouring ground meshes). Fix the cause, add a test.
Budget: town auto view at most +0.4 M triangles and +10 draw calls vs today (town/hill/1: 3.65 M tris, 341 calls; the
page badge shows them, window.__fps). Plan time + build time at most +30 %.
Evidence: tests (curvature: no road corner sharper than X; squares are not rectangles; verges present; no holes test),
GPU shots before/after that you LOOK at (eye level on a curved street, the square, the parvis, a junction, a top view).
Tools: local server port 8985; GPU probe `FAL_PORT=8986 FAL_PROBE_FILE=<shots.json> tools/gpu/run.sh
tools/gpu/shots_probe.py <out>` (shots.json = [{name, page:"settlement.html", js:["await window.__show('town','hill',1,'walk','auto'); window.__walkStreet();"], wait:3000}],
hooks: __show(tier,site,seed,view,detail), __cam(x,y,z,tx,ty,tz), __walkTo(x,z,heading,pitch), __walkStreet(), __plan(), __built()).
settlement.test.mjs takes ~15 min: run it once at the end; run ground/roads tests while iterating.
Copy changed omg/kit/building/*.mjs to browse/building/ (the page imports those copies).
Coordination: your worktree and ports are private. No coord claims. Commit after each numbered item.
Time box: stop by 01:50 CET with what works committed; write W-ROADS6-REPORT.md (what changed, numbers, shots, gaps).
