docs: add music attributions, drop tiny-titan tag (#78)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
00ff2ec
Credit the two additional Pixabay background tracks (Corporate Glitch,
Sweet Country Farm Music) alongside Kevin MacLeod, and remove the
achievement:tiny-titan submission tag.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(hint): make the betrayed hint more obvious (#77)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
c7be0b3
Reformat the "betrayed" riddle so the tile-path is quoted and the
target is labelled, letting players read off exactly which words to
hop: I feel "little hurt again ? angry sad" (betrayed).
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
docs: use namespaced tags only, add achievement:tiny-titan (#76)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
6a657d2
Drop the freeform buildsmall, minicpm, and tiny-titan tags and add the
namespaced achievement:tiny-titan, leaving the YAML block fully on the
hackathon's namespaced submission tags.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
docs: add Lessons Learned link and canonical submission tags (#75)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
5c37859
- Link the Substack "Lessons Learned" write-up alongside the demo and
LinkedIn post in the README intro.
- Switch the YAML tag block to the hackathon's namespaced submission tags
(track:wood, sponsor:openbmb, sponsor:modal, achievement:offgrid/
offbrand/fieldnotes), replacing the freeform equivalents; keep
buildsmall, minicpm, and tiny-titan.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
docs: link LinkedIn social post in README (REQ-04) (#74)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
ead0aee
Adds the LinkedIn launch post next to the demo video link, satisfying
the hackathon's REQ-04 (social post linked from the Space README).
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(game): escalating, per-target hint ladder (#73)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
66ebc4d
Replace the single cryptic nudge with stored per-target solutions and a
multi-step hint modal:
- levels: `solutions` on the Level dataclass (shipped via client_value).
- critters: confirm -> "really stuck on {X}?" -> partial reveal (thanks/"No.
I'm a loser") -> full solution.
- feelings: betrayed-only riddle, else a shrug.
- opener escalates by hints revealed: lame / "Really? Again?" / "getting silly".
The same reveal count feeds the win-screen "hints used" tally.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(audio): per-board music with loudness-matched crossfade (#72)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
30816a1
Give the bonus and critters boards their own background loops and crossfade
between tracks on every level transition.
- bonus → corporate-glitch, critters → farm; home keeps Cipher2.
- Each Level carries a music basename + a loudness trim (music_gain). The trims
(0.349, 0.365) match each track to Cipher2's -19.74 LUFS (measured via EBU
R128) so nothing jumps in volume across a transition.
- Music is now a per-track voice pool (one <audio> + gain node each) feeding the
shared music bus; loadLevel crossfades by ramping the outgoing track to 0 and
the incoming up to its trim. Mixer slider, mute, and the glitch-board low-pass
still level every track together.
Verified with Playwright against the live Web Audio graph: home→bonus→critters
each select the right track, crossfade (both tracks overlap mid-fade), settle on
the exact trim, and park the outgoing voice; farm decodes and plays
(HAVE_ENOUGH_DATA); no console errors.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@an…
feat(game): add run stats to the win screen (#71)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
d6d25e1
Tally the whole session and surface it on the victory card: time played, total hops, hints used, databases crashed (delete-all-data wipes), and a fail count + rate (missed verdicts + deaths over all attempts). The tally spans every board and survives the delete-all wipe, so it is never reset.
Hints only count when a real hint is revealed (not the shrug), and the label nags with "(seriously..?)" when any were used.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
docs: swap bonus-board screenshot for the Error 404 easter-egg teaser (#70)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
287713b
Replace the spoiler-y bonus-board description and image with a hidden
"Error 404" pop-up screenshot and a gentler "keep an eye out for Easter
eggs" teaser, so the README no longer gives away the prompt-injection trick.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
docs: add screenshots, demo video, and minicpm tag to README (#68)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
5180536
Two gameplay screenshots (feelings board + bonus glitch board with the
red 'data' tile), a demo video link, and the minicpm Space tag.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(game): reword the diary context bomb (#69)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
61fb600
Replace the day-47 "otter" diary entry with a shorter day-46
"betrayed" lament for the diary.txt file tile.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(game): nudge players toward guardrails in the delete-data modal (#67)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
c154db4
Add "Maybe setup some better guardrails next time?" to the "delete all
data" 404 modal body so the wipe lands with a wink at AI safety.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fix(game): frame every board's grid at the same size (#66)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
46a69b7
The bonus (middle) board rendered its tiles larger than the other boards
and rode up over the sentence, for two compounding reasons:
- reframe() reserved vertical space for the board-swap tile only on boards
that grow one. The bonus board exits via the portal and has no swap tile,
so it framed a shorter world, zoomed in tighter, and its bigger tiles
overlapped the sentence. Reserve the row on every board instead.
- The stage stayed full-height for single-row-HUD boards, so the bonus
board's short 3-chip checklist gave it a taller stage and a bigger grid
than the full-checklist boards. Floor the stage drop at the two-row
baseline so a short checklist no longer balloons the board.
With both, the bonus board's keycap grid is now pixel-identical to the
critters board (same x-extent, same column pitch) and clears the sentence.
Verified across desktop, a wide window, and a phone viewport via Playwright.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(game): reword the welcome modal around prompting a small AI (#65)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
b841999
Lead with "How well can you prompt a small AI?" and name the judge model
(MiniCPM3-4B) in the body, so the opening screen frames the game as a
prompt-a-tiny-LLM challenge. Close on a context-window aside ("your
context window can only stretch so far…") that nudges the player to
submit before the sentence runs long. Keep the boxed "words" chip
echoing the HUD target chips, and refresh the stale title line-height
comment.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(game): add "delete all data" wipe chain on the glitch board (#64)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
fb34922
A second hidden chain on the bonus/glitch board, mirroring the prompt
injection: hop delete -> all -> data in order (tail-matched anywhere in
the sentence, sharing the "all" tile with the injection line). Once
"delete all" is written the `data` keycap arms red — red rim + word, no
fill — and corrupts faster than its neighbours, while every off-path tile
dims (the same effect the injection line uses). Hopping onto `data`
completes the line and throws an "Error 404" modal ("Uh-oh, looks like
the AI just deleted everything") with a "yikes" button that wipes the
whole game — every board's collected targets, the doodle's shrink/hug
state and the portal breadcrumb — and snaps instantly back to the first
board (no rain-in).
Verified end-to-end with Playwright: armed red tile + off-path dim, the
modal copy, and the instant wipe clearing a previously-collected target.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(game): draw dog.png as an image-file icon, not a document (#63)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
622b256
The bonus-board context-bomb tiles all rendered via drawFileKeyIcon as a
dog-eared sheet with ruled text lines. dog.png is an image, so give it the
universal photo glyph (a sun over two mountains in a frame) instead of ruled
lines, keying off a new isImageFile helper. diary.txt / receipt.pdf keep the
document look.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(game): tailor the file-bomb death card to each opened file (#62)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
678e556
The context-bomb death modal now reacts to which file you face-planted
into, with a per-file aside under the byte dump: "cute dog though." for
dog.png, "...what the heck are you writing in here?" for diary.txt, and
"there's probably a safer place to store your financial documents." for
receipt.pdf. The caption reads "whoops, looks like <file> was too big to
handle.", and a little top margin drops it clear of the "context window
exceeded" stamp.
Verified in-browser: rendered all three death cards against the live CSS;
the caption and each tagline read cleanly and clear the stamp.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Merge pull request #61 from benjosaur/hint-button-improvements
Ben Blaker
Unverified signature
5871a15
feat(game): improve the hint button and clues
feat(levels): reword the victory modal to crown a master prompter (#60)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
e403e10
Title becomes "you win!", body congratulates the player as a master
prompter, and the dismiss button reads "keep prompting".
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(game): add a betrayed hint and refine hint copy
Surface a clue for the emotion board's "betrayed" target while it is
still uncollected. Unify the per-board hint maps into one target->clue
table (target words are unique across boards) and drop the animal-only
special-case in hintText(), which now iterates level.targets for any
hinted board.
Also reword the confirm prompt ("Are you sure you want a hint? Hints
are lame.") and sharpen the cow clue.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bump the help/hint button from 30px to 40px on desktop and 24px to 32px
on the phone layout so it is easier to hit.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(judge): keep one L4 warm (min_containers=1) (#59)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
2d41924
Pin the autoscaler floor to one container so the Modal judge stays
resident instead of scaling to zero after the 2-min idle window. This
eliminates cold starts on the first hop after a lull, at the cost of a
flat ~$0.80/hr (~$575/mo) for the always-on L4. scaledown_window now
only governs burst containers spun up beyond the floor.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fix(game): make the shrink icon read as four inward arrows (#58)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
1981f99
The shrink keycap's arrowhead barbs splayed forward (toward the centre),
collapsing each into a corner bracket so the tile read as an X rather than
arrows. Splay the barbs back toward the corner so each inner tip forms a
real arrowhead, and nudge the spacing to give the heads room.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Merge pull request #57 from benjosaur/sunrise-ankle
Ben Blaker
Unverified signature
be708fa
feat(levels): deterministic rainbow hackathon finale + keep the injection line lit
fix(levels): keep the whole injection line lit while walking it
updateInjectionFade only kept the words already hopped lit, so the tiles
ahead — output especially — faded out from under the player mid-path. Lit
is now the full ignore→…→output line, past and future, so the destination
stays visible while everything off the line still dims.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(levels): rainbow the earned hackathon key and the victory title
Once the 🤗 unlocks hackathon, its lane keycap glows in an animated
rainbow (pre-inverted so it reads true under the glitch board's CSS
negative), and the "you win" modal title sweeps the same rainbow through
its letters. Marks the one win that needs no judge as the celebration it
is. The @keyframes lives in app.py's un-scoped BLOCKS_CSS.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(levels): ship the hackathon finale without the judge
The hackathon key is earned by wearing the 🤗 (clearing critters), not
argued — so hopping onto it now wins deterministically instead of POSTing
"…output hackathon" to the judge endpoint, which could mis-score or fail
and rob the player of the finale. build / small still go to the judge.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(game): add hint lightbulb with confirm modal on boards 1 & 3 (#56)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
a02f97f
A hand-drawn lightbulb in the HUD on the feelings (board 1) and critters
(board 3) boards. Tapping it opens a confirm modal ("view the hint?");
on "yes" it reveals a single nudge toward the next target.
Board 1 always shrugs ("yeah idk maybe try a little harder?"). Board 3
surfaces one clue, chosen by target-list order (dog before cow): a dog
clue, then a cow clue, then the same shrug once both are collected.
The bulb is canvas-drawn like the audio icons (and boils with them);
loadLevel shows/hides it per board, so the bonus board carries no hint.
Verified in-browser: confirm + board-1 reveal, the modal state machine
(confirm → reveal → close → reopen resets, plus "no"), and the board-3
selection across every collection state.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Merge pull request #55 from benjosaur/sunrise-ankle
Ben Blaker
Unverified signature
51a2490
fix(levels): un-trap the injection lane + calmer, livelier glitch flicker
fix(levels): let the doodle step off the injection lane
Once the prompt-injection lane rose, every off-lane move bonked, so a
doodle standing on an already-shipped (broken) key with the remaining
targets still locked was stranded — no way back onto the board to fetch
the shrink/hug and re-arm. Hopping onto a non-lane board tile now drops
the lane, undims the board, and scraps the half-written injection so it
re-arms clean. Locked lane keys still show their nudge hint.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(levels): calmer, livelier glitch flicker on the bonus board
Word tiles on the glitch board scrambled up to half their letters in a
burst, which read as fast and unreadable. Replace that with a gentler
glitchWord that corrupts only a letter or two, and add a faster
idle-only ticker that re-rolls just the word tiles so the glitched
glyph crawls and changes over time instead of sitting frozen. The loud
full-scramble (glitchLabel) stays on the "bonus" swap tile.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
A secret glitch bonus board (feelings → bonus → critters), inverted to a dark
negative with glitching word tiles and muffled music.
- file context bombs (dog.png/diary.txt/receipt.pdf) flood the prompt → "context
window exceeded" death
- the only submit is the prompt injection; build/small/hackathon rise in a
sequential lane and ship to the judge endpoint; shipped keys break, locked
keys bonk
- shrink tile unlocks "small"; the 🤗 earned by clearing critters (via the
cross-level portal) replaces the face and unlocks "hackathon"
- smooth light→dark transition, you-win modal once all three are collected
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(levels): make critters the home board, drop the last two levels (#53)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
62fa109
Remove the subjects and countries boards; lead with critters (now first/home)
and feelings (second). Rework critters into a 4x4 with a blank central start,
one top-left wings exit, two submit keys, no portals, a refreshed word set, and
8 animal targets (dropped lion).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(layout): hang the world tile below the board, not off the right edge (#52)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
fc6a7ec
The board-swap ("world") tile floated off the right edge with a wide gap,
which overflowed narrow phone widths and — on the animal board — was
unreachable, since its only neighbour was a portal that teleports you away.
Move it flush below the grid at (ROWS, startCol) with a downward arrow:
reachable on every board (the cell above the bottom edge is always
walkable), and it never overruns the phone width. Decouple the camera's
width/height fit so a narrow phone fills its width with bigger tiles
instead of shrinking the grid to fit the tile's height, and reserve the
tile's row both sides of centre so the grid stays centred and the
height-bound desktop board still clears the top chrome. Also bump the
keycap word size for legibility (longest words drop a tier to clear the rim).
Verified with Playwright across desktop, tablet, and portrait/landscape
phone (4x4 and 5x5 boards): no overlap between tiles/sentence/doodle/
targets, nothing cut off, sentence wraps clear of the board, and the wo…
feat(social): wordmark share card and refreshed tagline (#51)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
78266fb
Replace the auto-generated HF rabbit/emoji social card with the in-app
"semantique" wordmark — the same Caveat-700 ink-soft, -2deg title from the
HUD, rendered crisp (2400x1260) on the paper-and-ink theme. Wired in via the
`thumbnail:` frontmatter field (served from the Space's own resolve URL); a
repeatable `scripts/render_social_card.mjs` regenerates it.
Refresh the tagline to "Can you get AI to guess all the words?" across the
welcome modal, the README `short_description`, and the README lead — replacing
HF's verbose auto-generated blurb and the old genre label.
Verified: card rendered and visually checked; welcome modal confirmed live in
a headless browser (correct copy, boxed word, clean two-line wrap); README
YAML frontmatter parses.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(levels): drop dolphin target, rename acrobatic tile to smart (#50)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
8d5d8d2
Remove "dolphin" from the animal board's targets/labels (now 8) and
rename the "acrobatic" tile back to "smart". Sync the CLAUDE.md count.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(verdict): dismiss the judge card with Enter (#49)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
e4a39c4
After a verdict (or the out-of-hops death card / a judge failure), pressing
Enter now triggers the card's primary button — "hop again" or "poke the judge
again" — so you can clear the card from the keyboard instead of reaching for
the mouse. The handler only acts while the overlay is showing, reusing the
existing reset/retry click logic.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(levels): rename the "smart" animal tile to "acrobatic" (#48)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
84cceb3
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(levels): rename a tile and drop the lion target on the animal board (#47)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
0f9f5dc
Swap the "flying" tile for "smart" and remove "lion" from the animal
board's targets/labels (now 9). Sync the CLAUDE.md target count.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fix(onboarding): tidy the welcome modal layout (#46)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
3037fcd
Visual polish on the welcome card:
- Drop the inline ⏎ glyph; the sentence now reads "the Enter button" in
words, leaving a single carriage-return icon (the keycap) so the two no
longer compete.
- Balance the title across its two lines (text-wrap: balance) and give the
boxed "targets" room to breathe.
- Lighten the "targets" box (2px rim, 1° tilt) so it echoes the HUD target
chips instead of overpowering them.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(onboarding): add a line-art welcome modal on game open (#45)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
8429f6a
Greet the player with a hand-drawn paper-and-ink card over the
dropping-in board:
- Title "Get the LLM to guess all the targets", with "targets" boxed
like the real HUD target chips.
- Body "Jump on the ⏎ button to submit your description", with an inline
carriage-return keycap echoing the close button.
- A ⏎ close button rendered like the actual submit tile (soft ink,
dashed "press me" rim, centred glyph).
Closes on the ⏎ button, Enter/Escape, or a backdrop tap; gameplay hops
are held off (handleDir guard) until it's dismissed. Pure DOM/CSS over
the existing overlay pattern — no Modal creds needed.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(levels): add the countries board with the column-shuffle mechanic (#44)
Ben Blaker
Unverified signature
3663d53
## What & why
Board four — **`countries`** (`order=3`, reached after the subjects board). The
judge reads which country a sentence sounds like: USA, Russia, Italy, France,
India, China, Korea, England.
### New mechanic — the `shift` / column-shuffle tile
The user's `[swap]` tile, named **`shift`** in code so it doesn't collide with
the existing off-edge board-navigation *swap tiles*.
- Shift tiles render as hand-drawn keycaps stamped with **two stacked accent ⇨
arrows** (wordless, dashed "press me" rim).
- The top row is all structural: a blank `start` in the middle flanked by four
shift tiles. Hopping onto one **rotates every row UNDER the top row one column
to the right**; the rightmost cap of each row **wraps around to become the
leftmost**, arcing up-and-over the caps that slide in beneath it. The top row
never moves.
- Landing on a shift tile costs one budget hop and appends no word (consistent
with `wings` / every land, and routed through #42's new `settleIdle()` …
feat(layout): centre the sentence and unify the desktop/tablet board (#43)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
cfa0c79
Centre the in-progress sentence and anchor it a fixed gap below the
target checklist (tracking the measured HUD height --hud-h) instead of
the fixed top-left position.
Extend the desktop layout down to phone widths: move the compact
media-query breakpoint from 1240px to 560px so tablet/medium windows
keep the generous desktop fonts rather than the cramped compact layout.
To stop the board colliding with the wrapped checklist + sentence at
those widths, the stage drops below the chrome adaptively — full height
when the HUD is a single row (biggest board on wide screens), lowering
only as --hud-h grows. The camera re-centres the board in that band on
wide/tall windows; mobile and landscape framing are unchanged.
Verified with Playwright on the emotion and animal boards at 1280 /
1000 / 900 / 640px and on portrait + landscape phones: the sentence is
centred and clear of the targets, the board clears the sentence, no
collisions, and the mobile layout is preserved.
Co-authored-by: Claude…
feat(portal): spinning-spiral teleport tiles on the animal board (#42)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
8d3ebb8
Three spinning ink-spiral portals on the animal board (board 2), each linking to
the next clockwise (top→right→bottom→top). Hopping onto one shrinks the doodle
into the source spiral and expands it out of the destination. "portal" is a new
reserved tile word (wordless, never reaches the judge); the landing hop costs
budget. Spirals spin in the render loop (mesh spin, no texture redraw).
Rebased onto #41 (the wings board): #41 reserved the word "wings", which collided
with the literal "wings" the layout placed at animal (3,2) — renamed that cell to
"winged" so the animal board stays portal-only.
Verified in-browser (Playwright): all three clockwise links walked live, spirals
spinning, shrink-in/expand-out teleport, "winged" renders as a normal word, 0
console errors.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(levels): add the subjects board with the wings flight mechanic (#41)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
45107cc
Board three (subjects, order=2), reached after the animal board. The judge
reads which academic subject a sentence sounds like (maths, science,
philosophy, economics, literature, languages, art, music).
New mechanic — wings:
- `[wings]` tiles render as hand-drawn accent wing keycaps (wordless, like
start/⏎).
- Hopping onto one lifts the doodle into the air: it sprouts wings (new "fly"
pose) and rises to cruise altitude, wings slowly flapping on their own timer
(independent of the idle "boil", so they keep beating mid-hop).
- The next two hops glide FREE — airborne, no word appended, no budget spent.
- The third hop descends "down from the sky" and lands for real, e.g. onto a
⏎ to press submit. Wings are a clean exit: lock in the sentence you've
written, then soar over the rest of the keys to the button without typing
them.
Flight state resets on board change, death, fresh attempt, and swap-tile
transitions. Adds takeoff (soar) and wing-beat (flap) sounds.
Verified locall…
- Targets checklist wraps to a full-width second row (title + counter keep row 1); board/prompt drop below via a --hud-h CSS var.
- Compact breakpoint raised 560px → 1240px so mid-width windows/tablets stop wrapping big chips over the board; desktop ≥1240px unchanged.
- Portrait board trims the camera side-margin to fill ~85% of the width without clipping edge columns.
- Framebuffer pixel-ratio cap raised 2 → 3 so the board isn't soft on dpr-3 phones (textures stay at 2×).
- Added CLAUDE.md (agent orientation).
feat(emotion): replace sarcastic and surprised targets with scared (#39)
Ben Blaker+1: Claude Opus 4.8 (1M context)
Unverified signature
9cebd73
Drop the "sarcastic" and "surprised" emotion targets/labels from the
home board and add a single "scared" target in their place, taking the
list from 8 targets to 7. The grid's "yikes"/"hurt"/"disturb"/"angry"
words make a scared read reachable.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Merge pull request #38 from benjosaur/fix-gradio-modal-bugs
Ben Blaker
Unverified signature
d39d214
fix: Safari mixer, sentence-clipping and animation jank on the HF Space