Progress log
Newest first. The microsite shows the latest six entries. Format: ## YYYY-MM-DD · Title, then - bullets.
2026-10-23 · Terry stickers, locked
- The two approved Terry drawings (the T-face and the grin) are in the repo as byte-exact masters, each locked by sha256. Tests and CI fail if either changes.
- A small built-in SVG renderer draws them exactly, with no browser needed. Checked against Chrome, both masters match to within one pixel at 1024 and 256 px.
- Die-cut renders at 512, 256 and 128 px for UI and print: the art untouched on a white backing that follows its outline, with gaps filled the way a real die cut would be.
- In-world sizes (32, 24, 16, 12 px) are pixel candidates for a person to approve.
tools/approve-sticker.jslocks the chosen one, and builds then use that exact file. - Wall decals shear an approved sticker onto either wall face at the 2:1 slope without changing a pixel.
2026-10-23 · Richer lighting and a detail kit
- New default look,
rich: ambient occlusion darkens corners, recesses, the area under eaves and wall bases; lit convex edges catch the light; and every surface stays on its own material's colour ramp.flatkeeps the old look. - Material ramps fixed a long-standing snapping bug: shaded teal signs had turned dark green, and with any colour shift shaded clapboard turned grey.
- A built-in detail kit any blueprint can place: sash windows, shutters, planters, doors with frames and steps, lanterns, hanging signs, barrels, crates, benches, pots and chimneys, with
scaleandrecolor. - The brewery, print shop and false-front shop were rebuilt with it. Footprints and door anchors are unchanged, so the 48 × 24 World Kit sheets still fit.
- High-detail galleries at 96 and 128 px tiles (
npm run gallery:hd), gated in CI next to the 48 and 64 px ones. The sandbox has a Lighting switch.
2026-10-23 · Dogs, birds and vehicles
- Characters now have kinds: person, dog, bird and vehicle, each with its own options and animations, all in the same
igah.character/1sheets. - Dogs walk in diagonal pairs, gallop with an airborne moment, and sniff. Birds walk with a head bob, peck and fly. Vehicles (hatchback, sedan, van, pickup) come with two-tone paint, roof racks, light bars and ladders.
- Seven new presets: park dog, terrier, pigeon, gull, hatchback, delivery van, work pickup (17 in all).
- Engine fix: every frame is "planted" so its lowest point sits exactly at ground level (or at its jump height). The new 3D contact check showed swung leg corners dipping 1–2% of a tile below ground in the person walk too, which pixels couldn't show.
- Vehicles' wheels now poke out past the body: seen head-on from above, tucked-in wheels were hidden and the car looked like it floated.
- The creator has a Kind picker and builds its controls from each kind's definition. The scenes now have traffic, a dog walker, pigeons and a gull.
2026-10-23 · Characters: run, wave, reach and more outfits
- Three new animations, appended after idle and walk: run (with airborne frames), wave, and reach (arms out at chest height, the sticker-placing move).
- The foot gate knows which frames should touch down, so airborne run frames aren't flagged as floating.
- New options: glasses, sunglasses, beard, mustache, coat, dress, umbrella and carried box. An umbrella or box holds its arms in every animation.
- Two new presets, commuter (coat and umbrella) and mover (beard and box), make 10 in all. The creator gained a face slot and an animation picker.
- Cells are taller now that arms can go up. Read cell size and pivot from each manifest; idle and walk columns are unchanged.
2026-10-23 · Website ready for game.classiccottrell.ca
npm run build:sitebuilds the public site intodist/: home, docs, sandbox, character creator, gallery and scenes.vercel.jsondeploys it with no install step.- The docs are rendered from the repo's markdown (overview, spec, roadmap, progress, decisions) by a small built-in renderer, with an "on this page" rail.
- Internal files (agent instructions, handoff notes, machine notes) are kept out, and the build fails if one would ship. Links to the private repo were replaced with links to the docs.
- The README was refreshed as the public overview: 8 gates, characters, the website.
2026-10-23 · Characters and a character creator
- New
igah.character/1format, separate from props: 8 screen directions × idle + 6-frame walk, with one feet pivot so frames never jitter. - Everything is customizable: build, height, skin, hair, hat, top, bottoms, shoes and what they carry, with colours from the shared palette.
- Character creator page (
sandbox/characters.html): all 8 directions walk live as you edit, plus randomize, presets, share links and export of the sheet, manifest and character file. - Eight presets: three walking residents, street artist, shopkeeper, site worker, elder, skater.
- A new gate checks that the feet touch the ground in every frame, using the ground-depth map. A first version wrongly assumed the feet sit on the pivot row; it failed at 96 px until fixed.
- Limbs use new posable-part fields (
pitch,roll,pivotY). Scenes can place characters; the street block and heritage village now have the cast walking around.
2026-10-23 · Ground variants, shorelines, crosswalks, readable brick
patternSeedmakes ground-tile variants (grass ×3, water, cobble, road ×2), and the scene tool picks one per tile, so large areas no longer repeat.- Shorelines: a straight edge plus outer and inner corners, each one blueprint in four rotations, with a sand strip between grass and water. Also a zebra crosswalk.
- Brick mortar is now lighter than the brick, so courses still read on shaded walls.
- Scene legends accept rotations (
ground_shore@E) and variant lists. All three scenes were redrawn with these. - 144 tests; all 46 assets pass every gate at 64 and 48 px.
2026-10-23 · Scene assets for the planned games and sites
- New pixel-scale surface patterns (brick, clapboard, planks, shingles, paving, cobble, foliage, speckle, ripple), moving from glossy flat props toward the subdued, textured reference.
- Scene ground tiles (grass, road, road centre line, sidewalk, cobbles, water) with a per-blueprint
renderoption, so they butt together with no outline or shadow. - Three tiny residents for scale. The studio lost its baked pavement slab (the ground belongs to the scene) and gained brick and texture.
- Street kit for the Fight the Buff direction, unbranded: mailbox, dumpster, bin, hydrant, lamp, utility pole, alley wall and back door, a 2×1 print shop and a 2×2 brewery.
- Heritage kit for the Fort Langley direction, original designs: false-front shop with boardwalk, hall with cupola, palisade and bastion.
- Three scene mock-ups composited with ground-depth occlusion:
gallery/scenes/(foundation, street block, heritage village). npm run gallery:48bakes every asset at native 48×24 intogallery/world-kit-48/, and CI checks it. Ambient light went from 0.4 to 0.5, so shaded faces keep their texture.
2026-10-23 · Handoff: ready to continue on any machine
docs/handoff.mdis the message board between Claude and Codex, andAGENTS.mdtells every agent to read it first. The first entry briefs Codex on PRs #1–#3 and asks for World Kit captures.docs/operations.mdcovers new-machine setup (git, gh and Node 20 only), the everyday commands, Blender, the claude.ai preview and the merge flow.- The helper scripts from this session are now in the repo:
npm run review(3× sprite PNGs),npm run qa:browser(headless Chrome checks; Playwright optional) andnpm run stage:artifact(preview publishing). - Fix: the sandbox now loads a sample when only the
#hashchanges, as it does when following a gallery link while the sandbox is already open.
2026-10-23 · Occlusion and picking maps for World Kit
- Every build now writes
<id>_ground.pngand<id>_parts.pngbeside the sheet, with the same layout.manifest.mapsnames them and gives their encodings. - Ground depth is the screen y of the ground point under each visible pixel, relative to the pivot. An engine hides a resident behind a pixel when the resident's foot is higher on screen. This covers the "resident crossing in front of and behind the studio" case in
docs/cc-world-kit.md. - The parts map gives every pixel a named label (
roof,wall,door,window, …) for roof/wall picking. Alpha 0 means empty ground, so clicks pass through. - New
mapsgate (8 gates now) and tests for the occlusion rule, map round trips and studio labels. - The sandbox shows Colour / Ground depth / Parts, and hovering a sprite shows what an engine would read at that pixel.
- For Codex: the prop adapter can read both maps directly.
decodeGroundYinsrc/core/pack.jsis the reference decoder.
2026-10-23 · World Kit starter set and a scene-wide palette
- New 2×2 studio (sawtooth skylight roof, L-shaped occupancy) and a vegetation family: pine, birch, bush, hedge and flower bed. These are the IGAH-side assets Codex's World Kit plan asks for.
- IGAH-32 is now the default palette in the CLI, gallery and sandbox. Per-asset
autois still an option. - Fixed shaded colours snapping to the wrong hue. The palette gained a deep green and a warm near-black, and matching weights hue 3× over lightness. A regression test pins the dark cases.
- For Codex: blueprints can now name GLB models. Load them with
loadModels(blueprint)fromtools/models.jsbeforebuildAsset, or model samples (monkey statue, cargo crates) throw "isn't loaded".
2026-10-23 · World Kit export compatibility (Codex)
- Opened
codex/world-kit-bridgefrom Claude's implementation branch; generator and styling stay in Claude's lane. - Documented axis, tile scale, frame-local pivots, unequal frame sizes, object rotations versus avatar facings, occupancy, and shared palette requirements.
- Added 48×24 export checks for every sample using the existing seven gates. No renderer code was copied into World Kit; actual scene adoption remains a separate visual gate.
2026-10-23 · Textured models
- The rasterizer samples base-colour textures and drops alpha-masked texels, so cut-out leaves and fences work.
- New cargo crates sample: a 32×32 plank texture drawn pixel by pixel in Blender (
tools/blender/make_crates.py), readable even at 64 px. - The Node CLI decodes PNG textures with a new dependency-free decoder. The sandbox decodes any image format in its worker.
- Caught a Blender gotcha: the default cube's UVs give each face only an eighth of the texture. The script now maps each face to the whole image.
- 42 tests, including a hand-built textured GLB, an alpha cut-out check and a PNG round trip.
2026-10-23 · M7 started: real models in, sprites out
- New dependency-free GLB reader: node transforms, mirrored nodes, vertex colours, material base colours.
- New
modelpart type scales a GLB into a box on the footprint, alongside ordinary primitives. - Monkey statue sample: a Blender-made GLB (
tools/blender/make_statue.py, run through the software-GL wrapper) on a flower-bed tile. All gates pass. - Drop a
.glbonto the sandbox (or open one) to get a starter blueprint around it. - Smooth models flooded the palette and muddied small colours, so shading now snaps to 6 steps per colour, like a hand-made ramp. The primitive samples look the same.
- Still to do in M7: texture sampling, which most downloaded and Meshy models need.
2026-10-23 · Sandbox: background builds, orbit, share, compare
- Builds run in a Web Worker, so typing in the editor never freezes the page.
- New "Shape, any angle" panel: drag (or use the arrow keys) to turn the model, with no WebGL.
- "Copy share link" packs the blueprint into the link. Opening it rebuilds the same asset.
- "Pin for comparison" keeps one build next to the current one, for checking palette or outline changes.
- Rotations sit on one row that scrolls sideways, so the page stays short.
- 48 × 24 tiles (CC World Kit) are a sandbox option and part of the calibration tests. The 2:1 and seam gates pass at 48, and so do all six samples. The World Kit export itself is Codex's claimed lane in M9.
2026-10-23 · M2 done: richer blueprints
- New shapes: wedge, stairs and arch. Shapes can now be several convex pieces, so open shapes shade correctly.
- Groups (
use) andrepeatlet a blueprint place one fence picket or lamp many times. - Custom occupancy masks are validated and rotated per view. The new L-shaped gift shop sample uses one.
schema/blueprint.schema.jsongives editors autocomplete. A test keeps its shape list in step with the code.- Found a real limit: parts thinner than about 2 px vanish under the outline at 64 px. Logged under M8.
2026-10-23 · Bootstrap: working pipeline, sandbox and microsite
- Turned the Google Doc plan into a repo with a corrected spec (
docs/spec.md) and two decision records. - Chose 3D-first rendering over diffusion: one blueprint gives four rotations that match exactly (ADR 0001).
- Wrote a software renderer instead of using WebGL, so output is byte-identical in the browser, in Node and in CI, and the dev iMac's GPU driver is never involved (ADR 0002).
- Stages 1 to 4 work end to end: blueprint, render, clean (palette, shadow, outline, crop), sheet and manifest.
- Seven gates run on every build, including a 2:1 calibration check and a 3×3 tile seam check. All four samples pass.
- Sandbox page edits blueprints live; the microsite reads this log, the roadmap and the gallery straight from the repo.