Three.js turn-based tactics

Carpet Front

A repository skeleton became a deterministic, three-mission tactics slice played by molded-plastic soldiers across a room-scale battlefield.

Outcome

Four leaves accepted; fifth held at REVISE

This report separates accepted product truth from preserved candidate work. A missing critic or device proof is treated as an open gate, not a semantic technicality.

Before

A game promise, benchmark matrix, and orchestration shell with no accepted playable loop.

After

Three authored missions, deterministic preview/commit combat, campaign unlocks, scoring, persistence, original presentation, audio, accessibility, and renderer telemetry.

Accepted boundary

  • CF-L001 deterministic playable spine and corrected production serving
  • CF-L002 four-class teaching mission with exact trace hashes
  • CF-L003 production identity, accessibility, telemetry, and nested-route safety
  • CF-L004 three-mission campaign, persistence, results, cold boot, and audio lifecycle

Held, candidate, or unstarted

  • CF-L005 review, settings, recovery, and focus candidate returned REVISE
  • Four full-matrix failures were traced to a stale cadence oracle, not waived
  • CF-L006 completion audit was intentionally never opened

Gate history

Decision timeline

The useful unit is not the turn. It is the gate: a bounded claim, its evidence, and the verdict that controlled promotion.

02:43 UTC

Baseline and six-leaf plan frozen.

04:30

CF-L001 accepted after production-artifact identity repair.

08:39

CF-L002 accepted after reduced-motion, favicon, and crash recovery work.

11:27

CF-L003 accepted after nested-route repair.

17:06

CF-L004 accepted after cold-shell and audio lifecycle loops.

22:30

CF-L005 re-critic found renderer failure UI bleeding through the title.

23:18

Budget wind-down preserved the candidate without promotion.

Existing evidence

Frames from the run.

No images were generated for this report. These are existing repository artifacts with shortened SHA-256 anchors. Candidate frames remain visibly labeled.

Testable now

Reproduce the current truth.

Commands are repository-root commands from the project's canonical debrief. They are shown for technical review, not as a public playable deployment claim.

npm ci
npm run typecheck
npm run lint
npm run test:unit
npm run build
npm run test:routes
npm run test:e2e -- --workers=1 --retries=0

These commands exercise the accepted CF-L004 baseline. The preserved CF-L005 branch is not the release baseline.

28accepted unit tests
32/32accepted browser cases
59.88median FPS samples
96.8 KBcritical entry after split

Git anchors

  • Accepted product c68a529
  • Wind-down checkpoint fdffaf5
  • Candidate branch b4a9b80

Known token floor

6,290,180

Known manager subtotal only. Builder and critic descendant usage was not exposed, so this is a floor rather than total consumption.

Candid postmortem

Failures that changed the run.

The point of the case study is not that agents wrote code. It is that the system found reasons not to trust its own first answer.

Loops, stalls, and defects

  • A Vite development artifact initially masqueraded as a production build.
  • Nested asset routes returned successful HTML fallbacks until MIME and byte checks caught them.
  • A stale audio cadence oracle penalized correct source cleanup.
  • Visual criticism caught failure UI that behavioral focus tests could not see.

What carries forward

  • HTTP 200 is not proof of artifact integrity.
  • Accessibility has behavioral and perceptual layers; both need evidence.
  • A truthful paused checkpoint is better than weakening a test to claim completion.
Exact next safe action

Resume only CF-L005: repair the cadence oracle, refresh the stale evidence identity, rerun the unchanged matrix at both viewports, and obtain one fresh critic PASS before promotion.