Commit History
-
feat(game): escalating, per-target hint ladder (#73)
Ben Blaker +1: Claude Opus 4.8 (1M context)Unverified signatureReplace 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>66ebc4d -
feat(game): add run stats to the win screen (#71)
Ben Blaker +1: Claude Opus 4.8 (1M context)Unverified signatureTally 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>d6d25e1 -
feat(game): nudge players toward guardrails in the delete-data modal (#67)
Ben Blaker +1: Claude Opus 4.8 (1M context)Unverified signatureAdd "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>c154db4 -
feat(game): reword the welcome modal around prompting a small AI (#65)
Ben Blaker +1: Claude Opus 4.8 (1M context)Unverified signatureLead 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>b841999 -
feat(game): add "delete all data" wipe chain on the glitch board (#64)
Ben Blaker +1: Claude Opus 4.8 (1M context)Unverified signatureA 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>fb34922 -
Merge pull request #61 from benjosaur/hint-button-improvements
Ben BlakerUnverified signaturefeat(game): improve the hint button and clues5871a15 -
feat(levels): reword the victory modal to crown a master prompter (#60)
Ben Blaker +1: Claude Opus 4.8 (1M context)Unverified signatureTitle 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>e403e10 -
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>73db430 -
feat(game): add hint lightbulb with confirm modal on boards 1 & 3 (#56)
Ben Blaker +1: Claude Opus 4.8 (1M context)Unverified signatureA 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>a02f97f -
feat(levels): glitch bonus board — context bombs, shrink/hug, portal round-trip (#54)
Ben Blaker +1: Claude Opus 4.8 (1M context)Unverified signatureA 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>a341239
-
feat(social): wordmark share card and refreshed tagline (#51)
Ben Blaker +1: Claude Opus 4.8 (1M context)Unverified signatureReplace 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>78266fb -
fix(onboarding): tidy the welcome modal layout (#46)
Ben Blaker +1: Claude Opus 4.8 (1M context)Unverified signatureVisual 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>3037fcd -
feat(onboarding): add a line-art welcome modal on game open (#45)
Ben Blaker +1: Claude Opus 4.8 (1M context)Unverified signatureGreet 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>8429f6a
-
feat(nav): swap boards by hopping a one-way progression tile (#25)
Ben Blaker +1: Claude Opus 4.8 (1M context)Unverified signatureReplace the two bottom-corner nav buttons with an in-world keycap that sits just off the board edge. Once every target on a board is collected, a "→ <next>" tile appears; hopping onto it transports the doodle to the next board's start tile and rains the rest of the keycaps in from the sky, staggered by distance, before play resumes. Progression is one-way (no back tile). The same drop-in plays as the board intro. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>b9f18ee -
feat(audio): background music and an in-game volume mixer (#21)
Ben Blaker +1: Claude Opus 4.8 (1M context)Unverified signatureAdd a fully procedural background music loop (generative C-pentatonic melody over a soft I–vi–IV–V bass, on its own Web Audio bus) and an in-game volume mixer. Tapping either top-right icon opens a hand-drawn popover with two wobbly-ink sliders — music and sfx — each with a mute icon; it closes on an outside tap or Escape. Each channel carries a 0..1 volume on an independent bus, squared into a perceptual loudness curve; dragging snaps the gain live while mute/unmute ramps it and restores the prior level. Levels persist in localStorage and the bar icons show a red ink slash when a channel is at zero. Music defaults on and starts on the player's first gesture. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>7d3cc83 -
refactor(ui): drop redundant labels and the extra check tick (#15)
Ben Blaker +1: Claude Opus 4.8 (1M context)Unverified signatureThe "targets:", "sentence:", and "hops:" labels stated the obvious — the checklist pills, the prompt strip, and the "N/budget" counter each read clearly on their own — so remove them and the now-dead CSS (including the tiny-phone rule that only hid the "targets:" word). A collected target already reads as collected via the fade + strikethrough, so drop the redundant green ✓ tick. checkOff now gives a brief scale pop on the pill itself for feedback in place of the tick animation. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>ff1852e -
feat(levels): modular drop-in level API + animal board
Make adding a board a one-file drop-in, and ship a second level. - levels/ package: each board is a self-contained Level (grid + its own judge spec — category, few-shot, labels), auto-discovered from its file; order/home set play order and the boot board. Replaces the single level.py. - judge is now category-agnostic: score_labels takes a Level, and judge() resolves the board from the level_id the client sends (labels/few-shot stay server-side). - engine: empty "" tiles are walkable but wordless; board build factored into buildTiles/buildTargets/loadLevel so boards swap client-side; camera reframes to board size; checked targets persist per board. - nav: hand-drawn ink arrows walk between boards — "next" unlocks after the first target is collected, "back" returns to the previous board. - animal board: 5x5, central start, four ⏎ corners, walkable blanks, ten animals to collect. 25 fast tests pass; verified both boards in-browser with the offline judge. Co-Authored-By:…4a497b2 -
feat(mobile): swipe controls and responsive layout (#13)
Ben Blaker +1: Claude Opus 4.8 (1M context)Unverified signatureMake the game playable on phones. The board was keyboard-only and assumed a desktop window. Controls: a swipe maps 1:1 onto the existing arrow keys. Pointer Events on the stage read the gesture's dominant axis on release and feed the same DIRS vector through a shared handleDir() (keyboard + swipe), so mid-hop buffering still applies. Touch/pen only — mouse stays on the keyboard. A <28px drag is a tap and is ignored. Layout: 100dvh, touch-action/overscroll locked so swipes don't scroll/zoom; safe-area insets; a compact pass for narrow (portrait) and short (landscape) viewports keeps the HUD on one line and recenters the board into the clear band; tiny phones (<=340px) drop the "targets:" word so the hop counter never clips. Viewport meta is locked from JS (single tag, no pinch/double-tap zoom) and Gradio's wrapper padding is zeroed for a true full-bleed. Verified with Playwright at 320/360/390 portrait + 844x390 landscape: all four swipes hit the correct tile, tap/mouse ignored, keyb…a808a72 -
refactor(ui): replace LLM jargon with friendlier game labels (#12)
Ben Blaker +1: Claude Opus 4.8 (1M context)Unverified signatureMake the game read like a puzzle, not a model-internals demo: - HUD "context window: N/10" -> "hops: N/10"; overflow copy reworded ("last hop\! one more and you're out…", death/stamp "out of hops…") - <bos> tile -> blank home square; <eos> tile -> ⏎ (carriage-return symbol) - "prompt:" strip -> "sentence:", enlarged + bolder, start marker hidden Tokens stay "start"/"⏎" internally (level grid + JS comparisons); only the player-facing text changed. README and level tests updated to match. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>27f427c
-
feat(targets): replace single target with collect-them-all checklist (#11)
Ben Blaker +1: Claude Fable 5Unverified signatureAll four emotions now show as a checklist in the HUD. Winning a round checks off the emotion the judge picked; checks persist across rounds. The judge payload sends the still-unchecked targets, so a repeat emotion stamps "<emotion>, again." instead of a win, and the verdict bars highlight only the targets still left to collect. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>557ba69 -
feat(prompt): move prompt strip from bottom to just under the HUD (#9)
Ben Blaker +1: Claude Fable 5Unverified signatureCo-authored-by: Claude Fable 5 <noreply@anthropic.com>3d6fe70
-
refactor(hud): drop token-slot boxes, keep plain N/10 context counter (#4)
Ben Blaker +1: Claude Fable 5Unverified signatureCo-authored-by: Claude Fable 5 <noreply@anthropic.com>09952e9 -
feat(game): 3D keycap board, fleshed character, context-overflow death (#3)
Ben Blaker +1: Claude Opus 4.8 (1M context)Unverified signature- Tiles are now 3D buttons: a shared ExtrudeGeometry of the rounded hand-drawn outline (no square slab) with ink-rimmed cap, hatched paper sides, and a bold bottom silhouette line — one drawn object. Keycaps depress and spring back when landed on. - Board leans away 22 degrees from vertical under a perspective camera viewed slightly from below, so button depth and presses read clearly. - Character is a fleshed doodle (tube limbs, paper-filled bean torso, scarf) with pose frames: idle, think, hop-up/mid/land crouch-tuck-bend, dead-dizzy and dead (X eyes). Billboard now composes inverse-parent rotation and a charTilt spin channel so wobbles/spins render on the tilted board. - HUD reads as an LLM context window: "context window: N/10" counter plus ten token slots that fill with landed words; red warning at 10/10. - Exceeding the context window now KILLS the character (crumple, slide off the board, fade) and shows a "context exceeded!" card without ever calling the ju…45f65df -
feat(app): gr.HTML shell with templates and server function
Proves the wiring: three.js via ESM dynamic import, GSAP + fonts via head, level passed as component value, judge exposed via server_functions. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>e911f6b