HOODOO ANATOMY / BCC / 2026-10-02 / v1.0.0 Original BCC procedural geometry and vector artwork, 2026. Factual references are paraphrased; no source media are reproduced. EVIDENCE Every model, color band, groove and plate is illustrative. No scan, photograph, aerial terrain or named hoodoo was used to generate these surfaces. No dating, stability assessment, erosion rate or future collapse prediction is supplied. No Thor's Hammer replacement is included. COORDINATES Right-handed coordinates: X right, Y up, Z front. Units are dimensionless model units, abbreviated u. Every complete model has y=0 to y=10. One unit has no assigned physical length. Source resolution is not applicable: procedural, not sampled. Radial and height tessellation parameters are in catalog.json. Plate meshes use 40 radial segments / 32 height divisions (plus authored profile knots); full OBJ meshes use 64 / 64. No UV map or raster texture is required. Normals are computed from outward-wound triangles; flat face shading preserves the sculpted teaching relief. REPRODUCE From website/: node scripts/park-packs/hoodoo-anatomy/build.mjs Test: node --test tests/park-packs/hoodoo-anatomy/*.test.mjs The builder writes only this pack and asset-hoodoo-anatomy.html. MODULES geometry.js: createModel(id, {radial, levels, relief, thickness, seed}), sectionModel(mesh, axis, coordinate), analyzeMesh(mesh), toOBJ(mesh). createModel rounds radial to the nearest multiple of 4 in 16..128, levels to 8..128, relief to 0..1.5, thickness to 0.35..1.8, and seed to 0..65535. Unknown IDs use ha-cap. Share-fragment numbers use 0.01 precision. sectionModel retains the halfspace coordinate <= cut. Only x/y/z and finite cuts are accepted. It closes the cut using nested boundary loops and hole-aware triangulation. At the minimum bound (within 1e-8 u) it returns an empty mesh; at the maximum it retains the full model. A cut position is not a percentage of volume removed. viewer.js: initialize(exhibitRoot, {initialState, onState}) returns getState, setState, pause, resume, getDiagnostics and dispose. Repeated initialization on the same root returns its existing instance. dispose releases observers, event listeners, meshes, materials, WebGL context and cached geometry. state.js: parseState and stateHash validate public version-1 fragment state. Unknown keys are dropped; no private data is used. DEPENDENCIES Existing local Three.js 0.186.1: ../../../vendor/three/three.module.js and three.core.js; MIT license at ../../../vendor/three/LICENSE. No package installation, runtime account or external API is required. The demo uses existing local Inter and Gelasio fonts; their SIL OFL notices remain at /fonts/OFL-Inter.txt and /fonts/OFL-Gelasio.txt. STATIC USE plates/ contains 12 standalone SVGs with title and description elements. All eight models have OBJ exports with unit comments. Plate 12 is a static relationship sequence, not a dated time series. catalog.json contains supported source claims and the per-model inventory. Preserve these evidence labels with any reuse.