- kerb_height ramp run now derives from --max-ramp-grade (default 8%), giving
1.63 m instead of the fixed 1.5 m (8.7%). Crossing route measures 3.4 cm at
0.25 m sampling.
- site_assembly pre-check: coverage is independent of --sample (it used to shrink
the route), and it now prints the grade and the s/offset location of the worst
step so a step can be located instead of guessed.
- Documents the remaining south s=198 / north s=251 strip discontinuity as a
finding on the 'audit collision gaps' item rather than claiming it fixed.
- Street + site rebuilt, site re-imported (7/7), DemoMap rebuilt; packaged
-qaselftest PASS.
The sidewalk stood the full 0.15 m kerb height above the DEM at *both* edges, so
the outer (building-side) lip was a 15.8 cm ledge where the walk route crossed
from Terrain_DEM onto Sidewalk_South. sidewalk_z now tapers the upstand from full
at the road-side edge to zero at the building-side edge (a ~3-4 % ramp, walkable
and visually negligible).
Pre-check: south max step 20.5 -> 13.4 cm, north 15.1 -> 7.2 cm (the residual
13.4 cm is the crossing-ramp gradient, tracked separately). Street and site
rebuilt, site re-imported (7/7 meshes, collision flags intact), DemoMap rebuilt;
packaged -qaselftest still PASS. README step table updated.
- Converted 13 individual .adoc section files to .md via
asciidoctor→docbook5→pandoc(gfm) + post-processing, placed alongside
the .adoc sources in Docs/Architecture/
- Rebuilt architecture.md from the individual section .md files
- Ran prettier --write on all .md in the repo (23 files changed):
normalised table column alignment, trailing whitespace, line breaks
- Added .agents/ to .prettierignore (vendored third-party content)
- All .md now passes prettier --check
94 MIT-licensed skill packs plus their shared references, copied unedited from
the local checkout of github.com/arjun988/blender-skills at commit 8f778d2
(1.2 MB, 269 Markdown files). They are agent instructions, not add-ons; the
pipeline still drives Blender headlessly through bpy, so the optional Blender MCP
server is not required. Provenance recorded in THIRD_PARTY_NOTICES.md and the
version, source, and update procedure in Docs/toolchain.md.
site-2026-11-06.blend gathers terrain, street and blockout into categorised
collections: 281 objects, ~58k triangles. A downward raycast on a 1 m grid along
both sidewalks and the designated crossing finds no holes, so nothing drops the
player on either side. Two steps are flagged: 15.8 cm at the sidewalk's outer
terrain seam and 10-13 cm ramps at the crossing flush transitions, steeper than
a real 8% ramp.
Sampling is projected through PROJ: placing points with the OSM spherical
approximation put them metres off the UTM meshes and reported 91 phantom holes.
Tools/street_mesh.py builds the corridor in the project frame from the measured
profile: carriageway -10.5..+10.5 m, kerbs 0.15 m (0.13 m as built), sidewalks
4.0 m south and 5.3 m north, all elevations sampled from the DEM. Kerbs flush at
the three signalised crossings. Crown at mid-block reproduces the cross-sections
to the centimetre.
Tools/terrain_from_dem.py builds a 191x106 grid at 2 m over the block, Z being
NAVD88 minus the origin ground. Building footprints from the OSM extract are cut
out so rooftops never become terrain (72 footprints, 6310 cells). Spot checks
reproduce the measured profile: origin 0.00, Orange Dr +3.39, south gutter
+0.93, crown +1.38, north sidewalk +1.43.
Blosm projects with a sphere, not an ellipsoid, so its frame was ~0.4% oversized
and rotated by meridian convergence: about 2 m at the theatre. The blockout now
fits a six-parameter affine into EPSG:26911 on five control points (0.0 cm
residual) and transforms root objects only, since children inherit and double
transforming them read as a 2 m placement error.
Tools/blosm_blockout.py imports the committed extract in 3Dsimple mode and
reports per-building dimensions so a units failure is visible in the log. The
result (87 meshes) is committed as the blockout baseline: hero 25.68 x 54.88 x
14.50 m against 25.75 x 54.88 m of OSM geometry, so the import is 1:1 metres.
Two headless defects needed working around: the asset-directory check that
fires before mode is honoured, and an empty default-level table sending the
add-on down a broken relative import. Member fetching stays off so the import
does not depend on Overpass.