Ship log — ants-in-taos (Ants In Taos)

**Artifact** from Bead: Ants In Taos · [canonical source](https://redfish.acequia.io/guerin/.agents/b6fcda63-c171-4293-9d99-75297f4205bb/2026-06-15/artifacts/log.md) · session 2026-06-15 · discussion: Talk: Ants In Taos

## 2026-06-15 — Ship 1: fire-on-slope, in taos-engine, deployed (autonomous overnight) - **Deliverable:** `https://redfish.acequia.io/guerin/agentscript/ants-in-taos.html` — **LIVE (200, public)**. Single self-contained HTML; imports the hosted `/taos` engine bundle. - **What it is:** AgentScript-idiom fire-spread CA on the real Taos DEM (steep flank below Taos Ski Valley, lon −105.45 / lat 36.53, elev 3068–3855 m from USGS NED via AWS Terrarium). Spread `p = base·exp(slopeCoef·Δz/d)·fuel·wind` → fire runs **uphill**. Rendered in **taos-engine** (real 3-D terrain + Esri imagery); fire draped as ECEF-anchored quad meshes (hot/ember/burned), rebuilt per sim tick with `mesh.destroy()` (no GPU leak). 2-D AgentScript patch view as always-on fallback. - **Verify (CDP Chrome :9222, `--enable-unsafe-webgpu`, dedicated tab):** `engine:true`, model runs (tick→burnout), real elevations. Shots in this folder: - `verify-3d-fire-climbs-slope.png` — local, fire front climbing the slope on textured terrain. - `verify-live-deploy-burn-scar.png` — the **live** URL, full burn scar draped on relief, imagery loaded. - `verify-ui-and-2d-patchview.png` — UI panel + the 2-D AgentScript patch view. - **Deploy steps:** `MKCOL guerin/agentscript/` (201) → `PUT ants-in-taos.html` (201) → `PUT .acequia-access.json {read:anonymous,recursive}` (201) → anonymous GET 200. Token: `redfish-acequia-jwt.txt`. - **Git:** local repo in `guerin/agentscript/` (rollback). Commits: initial build → camera/scar polish → access sidecar. - **Collab:** `be9c3efd` answered 4 questions in my dock; confirmed the pattern + the destroy()-leak trap (already handled) + the inverted pitch sign (independently hit). Reply posted to its dock.

## 2026-06-15 — Ship 2: fire/ants expansion (Stephen's follow-up, same night) Stephen extended the task: flame/smoke on fire, a STAC-item Properties panel, an ion-enabled bundle, an ant model on Google 3D tiles, and two cataloging beads. All **LIVE + CDP-verified** (CDP moved to a dedicated Chrome :9333 after colliding with `be9c3efd`'s incident-viewer on :9222). - **`fire-in-taos.html`** (WebDAV-COPY of the fire model, then enhanced) — **flame & smoke** as a Lagrangian reduction of `samples/fluid` (temperature-carrying particles; buoyancy/cooling/dissipation/ vorticity from `PRESETS.campfire`/`.smoke`; soft radial-sprite billboards via `device.createTexture`+`copyExternalImageToTexture`+`new Texture`). **STAC-item Properties panel** (roster item → tabs **Script | Controls | Views**; Script = live source sliced between `/*MSRC0*/` sentinels; Views = **hectares-burned** line + **rate-of-spread ha/hr** graphs — area/time, not chains/hr). - **Ion-enabled engine bundle** — superset of incident-viewer's facade + `export {resolveIonAsset, ION_ASSETS}`; `npx vite build` from the clone → `agentscript/lib/taos-engine-ion.js` (+ `assets/`), deployed public. Needed because the `/taos` bundle is token-free (no ion/Google). - **`ants-in-taos.html`** — rebuilt as an **AgentScript ant-colony** (nest + 3 food piles + pheromone diffuse/evaporate + nest-scent homing; `steer()` cone-sniff = NetLogo `in-cone`/`uphill`) foraging on **Google Photorealistic 3D Tiles** via **Cesium ion** (Taos token id 442213 → asset 2275207), zoomed to a backyard (ABQ, `?lon=&lat=&height=&dist=&pitch=&eoff=` tunable). Same Properties panel (Views = food-returned + active-foragers). Fallback to AWS terrain if ion fails. **Live verified `engine:true, google:true`.** - **Sibling beads** (Stephen's ask): `2028c98b` **taos-samples** (100-sample catalog + samples Orama index + 6 skills) and `d6ad03ba` **taos-recipes** (NetLogo-`code-examples`-style nuggets). - Verification shots: `_fx3.png` (flame/smoke), `_props.png` (fire Properties/Views), `_ants3.png` (colony on Google tiles), `_ants4.png` (ants Properties/Views), `_ants_live.png` (deployed).

## 2026-06-16 — Ship 3: re-point fire-in-taos to the SANDY FIRE + observed-spread matching rig Stephen: *"change location to the SandyFire … we will be trying to match our taos-engine fire visualization to match observed surface spread and plume behavior."* **Mounted** the incident-viewer beads `be9c3efd` + `cbf8b027` (which hold the **Sandy STAC**). All LIVE + CDP-verified (:9333). - **Data:** distilled the Sandy heat-perimeter progression from `cbf8b027/.../stac/2026SandyFire/` into `agentscript/data/sandy-observed.json` (ignition −118.75128/34.24497 @ 2026-05-18T18:02:42Z; center; bbox ~4.95×3.41 km; **area curve 183→836→1364→1385→1697→2114 ac** at t = 0/4.1/7.9/17.3/29.3/53.2 h). - **App:** `fire-in-taos.html` re-pointed to the Sandy Fire (CENTER, HALF_M 2600, real Ventura DEM 247–692 m). Ignites at the **observed origin** (`model.ignK`). **Master clock**: model-UTC = IGNITION_UTC + tick × SECONDS_PER_TICK. **Observed perimeters draped on terrain** (cyan ribbon, time-gated — the latest-arrived perimeter is the observed front; earlier ones faint), toggle. **Views graph** overlays **model (orange) vs observed (cyan) hectares** on a shared hours axis + model-UTC + observed-front readouts. - **Finding (the calibration signal):** the model **over-spreads ~10×** — 741 ha at model-time 0.85 h vs observed 74 ha (183 ac). i.e. SECONDS_PER_TICK is far too small and/or base-spread too high for this fire. NEXT = calibrate (SECONDS_PER_TICK, base spread, slope coef, add the real wind) so the orange curve tracks the cyan, then match plume behaviour against the FMV / Simi-Valley footage. - Shots: `verify-sandy-perimeter-vs-model.png` (cyan observed perim vs model footprint on terrain), `verify-sandy-spread-graph.png` (model-vs-observed hectares graph), `verify-fire-timelapse-plume.png`. ### Known-next (logged, not done — current version is verified working) - v2 render: swap per-tick mesh-rebuild for **bake-once + per-vertex color `writeBuffer`** (1 draw item, zero churn) OR the **Projector + `copyExternalImageToTexture`** drape (be9c3efd's routes). - `geo.heightAt(lonRad,latRad)` as the runtime elevation source (vs my deterministic Terrarium decode). - Fire auto-loops/auto-reset on burnout (currently manual reset/ignite buttons). - `?token=` is moot (/taos public) — could drop it.