← all games

goblin-stampede-gpt-6-unknown — FRICTION.md

# Developer-experience findings

Environment: GPT-6, effort unknown, autonomous Codex run. YAGE 0.10.4 from the local built checkout.
The categories below follow the repository taxonomy. These are observed integration costs, not claims
that undocumented engine features are missing.

## API friction

**Transient graphics.** Drawing attack rings each frame accumulated geometry until the renderer slowed
and the scene filled with old marks. `BattleView.update` explicitly clears its GraphicsComponent context.
Shadows are drawn once. The inspected screenshots in `output/playwright/final3-2.png` show the current marks.

**Effect scope.** Filtering the whole battlefield made the browser driver slow. Explosion-local bloom
keeps the effect bounded. `tools/profile.mjs` and `output/playwright/profile.json` capture a headed
Chromium profile; its 120-frame sampling run took about 71ms of wall time on this host. This is a diagnostic
sample, not a claim about sustained frame rate on other devices.

## AGENTS.md ambiguity

**Inspector state contract.** The local gameplay guidance described component `serialize()` as the probe
surface. This engine checkout reflects public data/getters. `BattleController.battle` exposes a plain
snapshot, and `tools/drive.mjs` reads it by entity name and component name. Using the spawn key as the
entity name or relying on `serialize()` alone produced absent state.

## Asset gap

**Portrait and equipment variants.** The selected Tiny Swords set provides usable troop sheets but no
matching dedicated Grub portrait or authored pictures for these eight equipment names. Almanac portraits
crop available frames, and equipment reuses related art. The mapping is explicit in campaign/content.ts.

**Feet and transparent padding.** The inspected troop companion files describe frame grids but do not
supply the desired foot point or portrait crop. ActorEntity owns the foot anchor; menus/portraits.ts scans
frame alpha to remove empty borders. Large raw sheet previews were unsuitable for small almanac cards.

**Command sounds.** The available effects cover impacts, footsteps, UI and explosions. The selected library
assets do not supply distinct goblin command voices or the required command cues. audio/synth.ts defines
short charge, rally, rescue, wave and loss cues using the synth addon. There is no voiced dialogue.

## Infra/test gap

**Linked installation permissions.** `npm install --ignore-scripts` encountered cache permissions and tried
to chmod a binary in the read-only linked engine. Installation with a temporary cache and `--no-bin-links`,
followed by `tools/link-bins.mjs`, creates only game-local executable links.

**Host Chromium permission.** Sandboxed Chromium failed macOS process/Mach startup. Browser and lab checks
ran with host execution permission. The scripts require that permission on this machine; gameplay code
does not depend on an elevated browser.

**Stale development modules.** Source edits were present on disk while Vite continued serving an older
module. Polling in vite.config.ts and a server restart restored updates. Browser fixture imports also
need the live timestamped module URL to avoid a second store instance; check-state.mjs resolves it from
resource timing entries.

**Lab drive bounds.** A single long defeat drive exceeded the browser evaluation timeout. The defeat
scenario steps in bounded chunks and exits at the actual loss. `output/lab.log` records both passing
scenarios: command mechanics and captain defeat.

## Missing primitive and recipe gap

No confirmed finding in either category. The game does not require a new engine primitive.
Optional pathfinding was not used, so this run provides no evidence about its quality.

## What worked without friction

Linked Pixi and YAGE packages share runtime types. The headless steering, inventory, dialogue and quest
models fit pure gameplay data. Typed entity events connect feedback and quest tracking. Scene-owned
cleanup, relative asset preload paths and three save documents work in integrated browser checks.
Touch movement and synthetic gamepad actions use the ordinary input path. The production build completed
a title-to-win drive under `/stampede/`, with empty browser and Inspector error lists.