You are W-GRASS7. Repo forge-assets (your worktree). The settlement renderer (omg/kit/building/settlement-render.mjs, the
page browse/settlement.html, its copy browse/building/) draws villages, towns and cities. Operator review (9 Oct 2026):
"Let's consider adding procedural grass, like we did already in a couple of games". Today the open ground is a flat
meadow texture; the only blades are a thin strip at wall feet (dress-render.mjs, createGrassField with tileSize 64,
maxDistance 26, 28 blades/m2, dark colours).

Goal: living grass on ALL open grass ground of a settlement (meadows between houses, gardens, churchyard, around trees,
outside the walls, river banks), using the engine grass module already vendored at browse/vendor/fge-look/grass-field.mjs
(FGE module/look/grass-field.mjs; read its header; the FGE copy at ~/forge-build/forge-game-engine/module/look/ and its
village adapter village-grass.mjs show how the FPS village and tycoon towns feed it a density from the terrain).
1. Density map: grass only where the ground is grass. Never on roads, squares, paved forecourts, stairs, fields (crops),
   water, bridges, house/building footprints, yards that are paved, nor under stalls. Thin and short along road verges
   and wall feet (worn edges), full in meadows. Bake it once per settlement (bakeField) from the same ground cover the
   terrain mesh uses (ground.mjs / settlement-render.mjs cover parts), so grass and the meadow texture agree.
2. Look: blade colours matched to the meadow texture under it (sample its mean, as village-grass.mjs does) so the field
   melts into the ground at the fade distance; no lime carpet, no dark stripe. Height about 0.25-0.45 m, clumps,
   wind on. Merge or replace the existing wall-foot strip so there is ONE grass field (no double draw).
3. Speed: camera-centred tiles as the module does; maxDistance around 45-60 m at eye level. From the air (camera
   high above the ground) the far fade must not show a visible circle: shrink or fade the field with camera height.
   Budget on top of today's main, measured with the page badge (window.__fps / renderer.info.__main): town/hill/1
   walk (`__walkStreet()`) and village/plain/3 walk: at most +1.5 ms GPU frame and +6 draw calls; city aerial unchanged
   within noise. Use grassQuality presets; keep a toggle (`?grass=0` and a page button "grass: on/off").
4. Trample: the walker (walk view) presses the grass (addInfluence on the walker object), if cheap.
Evidence: a test in omg/kit/building/test/ (density 0 on roads/squares/footprints, >0 in meadows; one field only),
GPU before/after eye-level shots you LOOK at (village/plain/3 walk, town/hill/1 walk, town aerial, city aerial) and
the frame numbers. Write W-GRASS7-REPORT.md (plain words: what changed, numbers, what is NOT done).
Files you may change: dress-render.mjs, settlement-render.mjs (grass hook only), browse/settlement.html (toggle only),
a new grass adapter file if you want (omg/kit/building/town-grass.mjs), tests, the report. Copy changed
omg/kit/building/*.mjs to browse/building/. Do not touch render.mjs, heroes.mjs, roofs, roads layout, the vendored
module itself (if it has a real bug, describe it in the report), or tree code (another worker owns trees).
Tools: local server on port 8971 if you need one; GPU probe on the test GPU box:
`FAL_PORT=8972 FAL_PROBE_FILE=<shots.json> tools/gpu/run.sh tools/gpu/shots_probe.py <out>` (shots.json = list of
{name, page:"settlement.html", js:[...], wait}; page hooks: window.__show(tier, site, seed, view, detail),
__walkStreet(), __cam(x,y,z,tx,ty,tz), __built(), __plan(), __fps). Note: browse/vendor is gitignored; if missing in
your worktree, symlink it from ~/forge-build/forge-assets/browse/vendor. Full test suite: `node --test omg/kit/building/test/`.
Your worktree and ports are private; no coord claims; never deploy, never touch the server's live kit.
Commit after each working step. Time box: stop by 13:04 CET with what works committed and the report written.
