Wild Orbs Opus

repo: ~/Projects/wild-orbs-opus · 7 commits · 0 in last 24h, 0 in last 7d ·

Search the build

7 commits indexed

  1. 40f3e99 2026-09-09 chore: lint, refactor, v1.0.1 (session close)
  2. 4e055c9 2026-09-09 Keep the neutral build comparator; leave the Qwen3 repo pristine
  3. 8a61163 2026-09-09 Split out as the standalone Claude Opus arena entry
  4. e78346c 2026-09-08 Verify the touch + cross-browser claims; fix the pointer-capture bug they exposed
  5. 81c6680 2026-09-08 Nova shockwaves chain; lock the cascade bounds in tests
  6. 9854c68 2026-09-08 Wild Orbs: rebuild from the Opus artifact — 13 orb types, tested
  7. db229b2 2026-09-08 Wild Orbs: complete single-file canvas arcade shooter

Authors

Agents used

  • none detected

Skills used

  • /claude7
  • /code7
  • /wild-orbs2
  • /compare1
  • /catch1
  • /browsers1
  • /effect1
  • /ship1
  • /bullets1
  • /hunters1
  • /sentries1
  • /pickups1
  • /banner1
  • /visibilitychange1
  • /boss1
  • /smoke1
  • /wave1
  • /death1
  • /respawn1
  • /gameover1
  • /restart1
  • /resize1
  • /pause1
  • /game-over1

Creative ideas + design notes

Commits with substantial prose (≥120 chars) — the rationale behind each move.

40f3e99 · 2026-09-09 · chore: lint, refactor, v1.0.1 (session close)
Refactor (behavior-preserving): extracted the duplicated wrapped-delta ->
force -> velocity step from six gravity-well / black-hole pull sites into one
applyPull() helper. Each site keeps its own constants and falloff formula; only
the shared 'divide by distance, add to velocity' step is centralized. An
independent reviewer had scored maintainability 6/10 citing exactly this.
(One site regroups (dx/d)*f*1.1 as (dx/d)*(f*1.1) — a last-ULP float
associativity difference, not a semantic one.)

Fix found by the close-out gate: the adaptive-resolution controller could not
shed pixels when it most needed to. Downscale and upscale shared one cooldown
counter, and a recovery step sets it to 300 frames — so a recent upscale locked
out an urgently-needed downscale for ~10 seconds, leaving the game pinned at
29fps while refusing to lower resolution. A clearly-dropping framerate now
bypasses the cooldown, and a downscale reseeds frameAvg just under the trigger
instead of down at a healthy value (which had forced the average to re-climb
from scratch after every step). Measured on a loaded machine: convergence to
the floor went 9s -> 6s and the settled framerate 49fps -> 66fps.

This was surfacing as an intermittent 56/57 'holds framerate under load'
failure that I had been attributing to machine load. Sampling renderScale once
a second showed it stuck at 0.95, which is unreachable by downscale steps and
therefore proved an upscale cooldown was blocking it. Suite is back to 57/57
with cross-engine + touch green.

Also removed four stray *-dtd.mjs probe files left in the repo by panel
subagents.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XP13P5ZKs7oWJQ3pjbvpnG
4e055c9 · 2026-09-09 · Keep the neutral build comparator; leave the Qwen3 repo pristine
test/compare.mjs is the internals-agnostic head-to-head harness written during
the decision panel: it knows nothing about either build's variable names, so
neither candidate gets a home-field advantage. It measures only what is
observable from outside — console errors, whether the canvas actually animates,
response to synthetic input, resize survival, 25s of input hammering, and
framerate before and after. It found a dead heat between the two arena entries,
which is what moved the verdict off 'pick a winner'.

It was sitting untracked in the Qwen3 entry's directory; moved here where it
belongs. That directory is now pristine — index.html, README.md, .gitignore and
.git, nothing of mine left in it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XP13P5ZKs7oWJQ3pjbvpnG
8a61163 · 2026-09-09 · Split out as the standalone Claude Opus arena entry
The Wild Orbs challenge was run against multiple models' artifacts in parallel:
this build descends from the Claude Opus artifact, while a concurrently-running
session built its own from Qwen3 14B's artifact in ~/Projects/wild-orbs. Both
were landing in the same directory, which cross-contaminated the working tree
and made one look like a successor to the other.

Separated so each arena entry stands alone. ~/Projects/wild-orbs is left exactly
as it was — no writes to it. README now states the provenance instead of
implying a branch hierarchy.

Verified in place: 57/57 assertions pass from the new location (an earlier 56/57
was a Spotlight-indexing load spike, not a regression — the file is byte-identical
by md5 to the copy that passed four consecutive runs).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XP13P5ZKs7oWJQ3pjbvpnG
e78346c · 2026-09-08 · Verify the touch + cross-browser claims; fix the pointer-capture bug they exposed
The README claimed touch and cross-engine support that was never actually
tested. Testing it found a real bug: cv.setPointerCapture() ran first in the
pointerdown handler and throws NotFoundError when the pointer is already gone
(fast taps, browser gesture cancellation). Thrown from the top of the handler it
aborted everything after it, so fire and PULSE inputs were silently dropped on
touch devices. Moved it last and wrapped it in try/catch.

Also: the pulse HUD hint read 'PULSE (SHIFT)' on phones, which have no Shift key.

test/browsers.mjs: boots and plays the game in Chromium, Firefox and WebKit,
detonates all 13 orb behaviours in each, verifies the WebAudio graph and
localStorage path, then runs a touch pass on an emulated iPhone (stick steers +
thrusts, right side fires, on-screen PULSE fires, thumb UI stays hidden for mouse
users). All green in all three engines.

Fixed a race in the wave-clear assertion: it cleared orbs while a spawnGuard
countdown was still in flight, which suppresses the clear detector, so the test
intermittently waited forever. 57/57 across four consecutive runs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XP13P5ZKs7oWJQ3pjbvpnG
81c6680 · 2026-09-08 · Nova shockwaves chain; lock the cascade bounds in tests
Measuring the nova cascade showed peak concurrent shockwaves = 1: dmg 1 could
never kill an hp-2 nova, so the type never chained into itself despite its own
description. Raised the shockwave to dmg 2 so it shatters what it crosses.

The recursion is bounded by construction (a shockwave damages each orb at most
once via its hit Set, and waves expire), which the new regression test now
asserts rather than assumes: a 20-nova cluster peaks at ~87 shockwaves, clears
the field, and settles to zero in ~61 frames with no errors.

Also replaced the fixed-sleep assertions with polling — they failed on a loaded
machine, measuring the load average instead of the game.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XP13P5ZKs7oWJQ3pjbvpnG
9854c68 · 2026-09-08 · Wild Orbs: rebuild from the Opus artifact — 13 orb types, tested
Built on the Claude Opus Model-Arena artifact rather than replacing it: kept
the orb bestiary, field/effect model and juice, fixed its defects, extended it.

Correctness fixes:
- `continue` inside a nested for..of over black holes continued the INNER loop,
  so a bullet was spliced then used after free; later splices removed the wrong
  bullet.
- Respawn ran on setTimeout, so the ship could respawn while paused and a stale
  timer could fire across a restart. Now frame-counted.
- Ship trail streaked across the screen on every wrap-seam crossing.
- Entities popped at the screen edges: collision was wrap-aware but rendering
  was not. Added wrap-aware draw for orbs/ship/bullets/hunters/sentries/pickups.
- Rubber orbs spawned off-screen and snapped to the border on frame one.
- `if(!byChain) G.combo++; G.comboT = 70;` — brace-less if made the second
  statement unconditional.
- Orb velocity had no ceiling; wells + shockwaves + rubber boosts could stack an
  orb past collision resolution.
- Wave-clear raced its own guard; toast/banner state leaked across restarts.
- A 'nova' sound effect existed with no orb type to trigger it.

Robustness: auto-pause on blur/visibilitychange, synth voice budget so a 20-orb
cascade can't detonate the mixer, adaptive particle cap, and dynamic resolution
scaling (the game is fill-rate bound, so it scales the backing store instead of
dropping frames), prefers-reduced-motion respected.

Content: 3 new orb types (NOVA shockwave, SENTINEL turrets, WARP position-swap),
elder/boss orbs every 5th wave, 5 powerups, pulse bomb, hyperspace, turret
enemies, end-of-run stats, persistent best, pause menu, touch + gamepad.

Tests: test/smoke.mjs drives the real game in Chromium — 55 assertions covering
every orb type at every tier including elders, a 24-orb chain cascade, all
abilities, pause/wave/death/respawn/gameover/restart/resize, failing on any
console error. Perf assertion measures the environment's own rAF ceiling first
(headed Playwright is vsync-capped at 30fps; headless is software-rasterised).

Branched off master so the independently-built version at db229b2 stays intact.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XP13P5ZKs7oWJQ3pjbvpnG
db229b2 · 2026-09-08 · Wild Orbs: complete single-file canvas arcade shooter
Rebuilt from a broken starting artifact. Fixed along the way: undefined
'timestamp' in the fire handler (shooting threw on every press), gameLoop
called with no argument (NaN delta poisoned every position), per-frame
velocities multiplied by dt (everything crawled ~60x too slow), orbs spawned
off-screen at negative coordinates, splice-during-forEach skipping entities,
recursive spawn handlers that multiplied orbs without bound, hex colours
interpolated into rgba(), particles that re-randomised direction every frame,
a game-over overlay that covered the start screen, and a ship heading 90
degrees out of phase with its thrust vector.

Added: 12 distinct orb types with unique silhouettes and on-hit rules, gravity
wells / black holes / stasis bubbles / shockwaves as real force and time fields,
ricocheting shards, homing swarmlings, wrap-aware collision and homing, a glow
sprite cache, motion trails, trauma screen shake, combo scoring, waves with
staggered type unlocks, lives and extra lives, per-type WebAudio synthesis with
a wave-scaled bassline, and start/pause/game-over screens with a live bestiary.

Verified with node --check plus a Playwright suite: every orb behaviour, the
field-effect lifecycles, death to game-over to restart, pause, mid-game resize,
and a 20s soak. Zero console errors, 73fps under load.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013NMeFvLtrZNgG2sQnYqmUp

File tree

8 files tracked. Click any to browse the source at HEAD.

Other build journals

← Wild Orbs  ·  all 4 projects  ·  Wild Wallcoverings →

Export

commits.csv · feed.atom · project.json · commits.json

rendered in 0ms