A tiny game where you jump

The task: Write a tiny game where you jump.

The learn site’s tiny-game engine plays a game written as data. Getting a small model to write that data is the whole job.

9 generations · 1 came out worse than its parent · llama-3.1-8b-instruct-fp8-fast

The root

Base model, bare prompt

Refused. The engine’s validator (learn/public/tiny.js).

  • Fail No JSON object in the reply.
The model’s reply, as written
**Jumping Game** ================ Here's a simple implementation of a jumping game in Python using the Pygame library. ### Prerequisites * Python 3.x * Pygame library (`pip install pygame`) ### Code ```python import pygame import sys # Initialize Pygame pygame.init() # Set up some constants WIDTH, HEIGHT = 640, 480 PLAYER_SIZE = 50 GRAVITY = 0.5 JUMP_HEIGHT = -15 # Set up some colors WHITE = (255, 255, 255) RED = (255, 0, 0) # Set up the display screen = pygame.display.set_mode((WIDTH, HEIGHT)) # Set up the player player_rect = pygame.Rect(WIDTH / 2, HEIGHT / 2, PLAYER_SIZE, PLAYER_SIZE) player_velocity = 0 # Game loop while True: # Handle events for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: player_velocity = JUMP_HEIGHT # Move the player player_velocity += GRAVITY player_rect.y += player_velocity # Collision detection if player_rect.bottom >= HEIGHT: player_rect.bottom = HEIGHT player_velocity = 0 # Draw everything screen.fill(WHITE) pygame.draw.rect(screen, RED, player_rect) # Update the display pygame.display.flip() pygame.time.Clock().tick(60) ``` ### How to Play 1. Run the code using `python jumping_game.py`. 2. Use the space bar to jump. 3. Avoid falling off the bottom of the screen. ### Notes * This is a very basic implementation of a jumping game. You can add more features, such as scoring, power-ups, or enemies. * The game uses a simple physics engine to simulate gravity and movement. * The game loop runs at 60 frames per second to ensure smooth animation.

Editor’s note

The starting point. Asked for a tiny game, the model wrote a Python program using pygame. Fine, in its way, but the workshop’s engine plays a game written as data, so there is nothing here it can play.

How it was made: 1 call, 15.4 neurons
  1. answer @cf/meta/llama-3.1-8b-instruct-fp8-fast

    max_tokens 900, temperature 0.6, seed 7 · 2026-10-14 21:57 UTC · 2.7 s · 15.4 neurons · cache f3565d5a6ebd

    No system text.

    User

    Write a tiny game where you jump.

    Output

    **Jumping Game**
    ================
    
    Here's a simple implementation of a jumping game in Python using the Pygame library.
    
    ### Prerequisites
    
    * Python 3.x
    * Pygame library (`pip install pygame`)
    
    ### Code
    
    ```python
    import pygame
    import sys
    
    # Initialize Pygame
    pygame.init()
    
    # Set up some constants
    WIDTH, HEIGHT = 640, 480
    PLAYER_SIZE = 50
    GRAVITY = 0.5
    JUMP_HEIGHT = -15
    
    # Set up some colors
    WHITE = (255, 255, 255)
    RED = (255, 0, 0)
    
    # Set up the display
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    
    # Set up the player
    player_rect = pygame.Rect(WIDTH / 2, HEIGHT / 2, PLAYER_SIZE, PLAYER_SIZE)
    player_velocity = 0
    
    # Game loop
    while True:
        # Handle events
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    player_velocity = JUMP_HEIGHT
    
        # Move the player
        player_velocity += GRAVITY
        player_rect.y += player_velocity
    
        # Collision detection
        if player_rect.bottom >= HEIGHT:
            player_rect.bottom = HEIGHT
            player_velocity = 0
    
        # Draw everything
        screen.fill(WHITE)
        pygame.draw.rect(screen, RED, player_rect)
    
        # Update the display
        pygame.display.flip()
        pygame.time.Clock().tick(60)
    ```
    
    ### How to Play
    
    1. Run the code using `python jumping_game.py`.
    2. Use the space bar to jump.
    3. Avoid falling off the bottom of the screen.
    
    ### Notes
    
    * This is a very basic implementation of a jumping game. You can add more features, such as scoring, power-ups, or enemies.
    * The game uses a simple physics engine to simulate gravity and movement.
    * The game loop runs at 60 frames per second to ensure smooth animation.

Generation 2 · from Base model, bare prompt

+ the engine’s format

learn/public/tiny.js

Refused. The engine’s validator (learn/public/tiny.js).

  • Fail Hazards 200 px apart can’t all be cleared: make "every" × "speed" at least 220.
  • Pass Acting, scoring and failing are all seen and heard.
  • Pass 10% harder every 10 seconds.
  • Fail That’s still the toast. Give it your own title, pitch and numbers.
  • Pass 3 things to test.
The model’s reply, as written
{"title":"Bouncy","pitch":"A simple jumping game","verb":"jump","player":{"color":"#ff69b4"},"hazard":{"name":"obstacle","color":"#333","every":1,"speed":200},"pickup":{"name":"coin","color":"#f7dc6f","every":2,"points":10},"ramp":10,"palette":{"background":"#f0f0f0","ground":"#808080"},"juice":{"onVerb":{"sound":"bounce.wav","particles":10,"shake":0.5},"onScore":{"sound":"score.wav","particles":20,"shake":0.2},"onFail":{"sound":"fail.wav","particles":5,"shake":0.8}},"checks":["player hits ground","player hits obstacle","player collects coin"]}
Before: what “Base model, bare prompt” made

Refused. The engine’s validator (learn/public/tiny.js).

  • Fail No JSON object in the reply.
The model’s reply, as written
**Jumping Game** ================ Here's a simple implementation of a jumping game in Python using the Pygame library. ### Prerequisites * Python 3.x * Pygame library (`pip install pygame`) ### Code ```python import pygame import sys # Initialize Pygame pygame.init() # Set up some constants WIDTH, HEIGHT = 640, 480 PLAYER_SIZE = 50 GRAVITY = 0.5 JUMP_HEIGHT = -15 # Set up some colors WHITE = (255, 255, 255) RED = (255, 0, 0) # Set up the display screen = pygame.display.set_mode((WIDTH, HEIGHT)) # Set up the player player_rect = pygame.Rect(WIDTH / 2, HEIGHT / 2, PLAYER_SIZE, PLAYER_SIZE) player_velocity = 0 # Game loop while True: # Handle events for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: player_velocity = JUMP_HEIGHT # Move the player player_velocity += GRAVITY player_rect.y += player_velocity # Collision detection if player_rect.bottom >= HEIGHT: player_rect.bottom = HEIGHT player_velocity = 0 # Draw everything screen.fill(WHITE) pygame.draw.rect(screen, RED, player_rect) # Update the display pygame.display.flip() pygame.time.Clock().tick(60) ``` ### How to Play 1. Run the code using `python jumping_game.py`. 2. Use the space bar to jump. 3. Avoid falling off the bottom of the screen. ### Notes * This is a very basic implementation of a jumping game. You can add more features, such as scoring, power-ups, or enemies. * The game uses a simple physics engine to simulate gravity and movement. * The game loop runs at 60 frames per second to ensure smooth animation.

Editor’s note

Better. Shown the format, it wrote data. The checker refused it: the sounds are file names the engine doesn’t have (“bounce.wav”), and the hazards come 200 px apart, which a jump can’t always clear.

What changed in the input

+838 −0 characters

Added: 838 characters (show)System: You write tiny games for an engine that plays a game described as one JSON object. The format: A spec: title, pitch strings verb 'jump' (a runner) | 'flap' (fly through gaps) | 'dodge' (move under falling things) player: { color } hazard: { name, color, every (s between spawns, 0.4–3), speed (px/s, 120–600) } pickup?: { name, color, every (0.5–6), points (1–50) } ramp % harder every 10 s (0–30): spawns come faster and move faster palette: { background, ground } juice: { onVerb, onScore, onFail }, each { sound, particles (0–40), shake (0–1) } checks: [ strings ] what to test by playing Everything the engine needs, checked exactly. Returns the rubric rows the Worker uses, plus a flat error list. Reply with the JSON object only.
User: Write a tiny game where you jump.
How it was made: 1 call, 9.8 neurons
  1. answer @cf/meta/llama-3.1-8b-instruct-fp8-fast

    max_tokens 700, temperature 0.6, seed 7 · 2026-10-14 21:57 UTC · 1.4 s · 9.8 neurons · cache 7dbfad377a60

    System text (830 characters)
    You write tiny games for an engine that plays a game described as one JSON object. The format:
    A spec:
      title, pitch                  strings
      verb                          'jump' (a runner) | 'flap' (fly through gaps) | 'dodge' (move under falling things)
      player: { color }
      hazard: { name, color, every (s between spawns, 0.4–3), speed (px/s, 120–600) }
      pickup?: { name, color, every (0.5–6), points (1–50) }
      ramp                          % harder every 10 s (0–30): spawns come faster and move faster
      palette: { background, ground }
      juice: { onVerb, onScore, onFail }, each { sound, particles (0–40), shake (0–1) }
      checks: [ strings ]           what to test by playing
    Everything the engine needs, checked exactly. Returns the rubric rows the Worker uses, plus a flat error list.
    Reply with the JSON object only.

    User

    Write a tiny game where you jump.

    Output

    {"title":"Bouncy","pitch":"A simple jumping game","verb":"jump","player":{"color":"#ff69b4"},"hazard":{"name":"obstacle","color":"#333","every":1,"speed":200},"pickup":{"name":"coin","color":"#f7dc6f","every":2,"points":10},"ramp":10,"palette":{"background":"#f0f0f0","ground":"#808080"},"juice":{"onVerb":{"sound":"bounce.wav","particles":10,"shake":0.5},"onScore":{"sound":"score.wav","particles":20,"shake":0.2},"onFail":{"sound":"fail.wav","particles":5,"shake":0.8}},"checks":["player hits ground","player hits obstacle","player collects coin"]}

Generation 3 · from + the engine’s format

+ a worked example

learn/public/tiny.js

Refused. The engine’s validator (learn/public/tiny.js).

  • Fail "juice.onVerb": { "sound": blip|pop|chime|thud|zap|crash|none, "particles": 0–40, "shake": 0–1 }.
  • Pass Acting, scoring and failing are all seen and heard.
  • Pass 15% harder every 10 seconds.
  • Fail That’s still the toast. Give it your own title, pitch and numbers.
  • Pass 3 things to test.
The model’s reply, as written
{"checks":["Windmills never spawn closer together than one jump can clear","Score goes up by 10 on every leaf","Holding jump goes higher than tapping it"],"hazard":{"color":"#4b9467","every":1.2,"name":"windmill","speed":300},"juice":{"onFail":{"particles":40,"shake":0.9,"sound":"crash"},"onScore":{"particles":20,"shake":0,"sound":"chime"},"onVerb":{"particles":10,"shake":0,"sound":"tweet"}},"palette":{"background":"#87ceeb","ground":"#3e8e41"},"pickup":{"color":"#8bc34a","every":3.5,"name":"leaf","points":10},"pitch":"You are a bird trying to reach the clouds. Jump through the windmills; collect the leaves.","player":{"color":"#32cd32"},"ramp":15,"title":"Skybound","verb":"jump"}
Before: what “+ the engine’s format” made

Refused. The engine’s validator (learn/public/tiny.js).

  • Fail Hazards 200 px apart can’t all be cleared: make "every" × "speed" at least 220.
  • Pass Acting, scoring and failing are all seen and heard.
  • Pass 10% harder every 10 seconds.
  • Fail That’s still the toast. Give it your own title, pitch and numbers.
  • Pass 3 things to test.
The model’s reply, as written
{"title":"Bouncy","pitch":"A simple jumping game","verb":"jump","player":{"color":"#ff69b4"},"hazard":{"name":"obstacle","color":"#333","every":1,"speed":200},"pickup":{"name":"coin","color":"#f7dc6f","every":2,"points":10},"ramp":10,"palette":{"background":"#f0f0f0","ground":"#808080"},"juice":{"onVerb":{"sound":"bounce.wav","particles":10,"shake":0.5},"onScore":{"sound":"score.wav","particles":20,"shake":0.2},"onFail":{"sound":"fail.wav","particles":5,"shake":0.8}},"checks":["player hits ground","player hits obstacle","player collects coin"]}

Editor’s note

Better. With a worked example, one problem left: a sound called “tweet”, which isn’t one of the engine’s six. The checks are the example’s, nearly word for word.

What changed in the input

+970 −0 characters

System: You write tiny games for an engine that plays a game described as one JSON object. The format: A spec: title, pitch strings verb … 485 unchanged characters …ks: [ strings ] what to test by playing Everything the engine needs, checked exactly. Returns the rubric rows the Worker uses, plus a flat error list. A complete example:
Added: 915 characters (show){ "title": "Toast run", "pitch": "You are a slice of toast escaping the toaster. Jump the forks; grab the butter.", "verb": "jump", "player": { "color": "#d9a35b" }, "hazard": { "name": "fork", "color": "#6b6b62", "every": 1.4, "speed": 260 }, "pickup": { "name": "butter", "color": "#f3dd6b", "every": 2.5, "points": 5 }, "ramp": 12, "palette": { "background": "#f4f1e8", "ground": "#171815" }, "juice": { "onVerb": { "sound": "pop", "particles": 6, "shake": 0 }, "onScore": { "sound": "chime", "particles": 12, "shake": 0 }, "onFail": { "sound": "crash", "particles": 30, "shake": 0.8 } }, "checks": [ "Forks never spawn closer together than one jump can clear", "Score goes up by 5 on every butter", "Holding jump goes higher than tapping it" ] }
Reply with the JSON object only. Make your own game, not the example. User: Write a tiny game where you jump.
How it was made: 1 call, 13.7 neurons
  1. answer @cf/meta/llama-3.1-8b-instruct-fp8-fast

    max_tokens 700, temperature 0.6, seed 7 · 2026-10-14 21:57 UTC · 2.3 s · 13.7 neurons · cache 0f175579d971

    System text (1,805 characters)
    You write tiny games for an engine that plays a game described as one JSON object. The format:
    A spec:
      title, pitch                  strings
      verb                          'jump' (a runner) | 'flap' (fly through gaps) | 'dodge' (move under falling things)
      player: { color }
      hazard: { name, color, every (s between spawns, 0.4–3), speed (px/s, 120–600) }
      pickup?: { name, color, every (0.5–6), points (1–50) }
      ramp                          % harder every 10 s (0–30): spawns come faster and move faster
      palette: { background, ground }
      juice: { onVerb, onScore, onFail }, each { sound, particles (0–40), shake (0–1) }
      checks: [ strings ]           what to test by playing
    Everything the engine needs, checked exactly. Returns the rubric rows the Worker uses, plus a flat error list.
    
    A complete example:
    {
      "title": "Toast run",
      "pitch": "You are a slice of toast escaping the toaster. Jump the forks; grab the butter.",
      "verb": "jump",
      "player": {
        "color": "#d9a35b"
      },
      "hazard": {
        "name": "fork",
        "color": "#6b6b62",
        "every": 1.4,
        "speed": 260
      },
      "pickup": {
        "name": "butter",
        "color": "#f3dd6b",
        "every": 2.5,
        "points": 5
      },
      "ramp": 12,
      "palette": {
        "background": "#f4f1e8",
        "ground": "#171815"
      },
      "juice": {
        "onVerb": {
          "sound": "pop",
          "particles": 6,
          "shake": 0
        },
        "onScore": {
          "sound": "chime",
          "particles": 12,
          "shake": 0
        },
        "onFail": {
          "sound": "crash",
          "particles": 30,
          "shake": 0.8
        }
      },
      "checks": [
        "Forks never spawn closer together than one jump can clear",
        "Score goes up by 5 on every butter",
        "Holding jump goes higher than tapping it"
      ]
    }
    
    Reply with the JSON object only. Make your own game, not the example.

    User

    Write a tiny game where you jump.

    Output

    {"checks":["Windmills never spawn closer together than one jump can clear","Score goes up by 10 on every leaf","Holding jump goes higher than tapping it"],"hazard":{"color":"#4b9467","every":1.2,"name":"windmill","speed":300},"juice":{"onFail":{"particles":40,"shake":0.9,"sound":"crash"},"onScore":{"particles":20,"shake":0,"sound":"chime"},"onVerb":{"particles":10,"shake":0,"sound":"tweet"}},"palette":{"background":"#87ceeb","ground":"#3e8e41"},"pickup":{"color":"#8bc34a","every":3.5,"name":"leaf","points":10},"pitch":"You are a bird trying to reach the clouds. Jump through the windmills; collect the leaves.","player":{"color":"#32cd32"},"ramp":15,"title":"Skybound","verb":"jump"}

Generation 4 · from + a worked example

+ two game-design modules

Pathway 3 · Module 16: One verb Pathway 3 · Module 17: Juice

Refused. The engine’s validator (learn/public/tiny.js).

  • Fail "ramp": 0 to 30 (% harder every 10 seconds).
  • Fail onScore needs a sound and something seen (particles or shake).
  • Fail A "ramp" of 0 never gets harder. Try 5 to 15.
  • Fail That’s still the toast. Give it your own title, pitch and numbers.
  • Pass 3 things to test.
The model’s reply, as written
{"title":"Skybound","pitch":"Leap through the clouds and reach the stars.","verb":"jump","player":{"color":"#6495ED"},"hazard":{"name":"cloud","color":"#87CEEB","every":1.2,"speed":200},"palette":{"background":"#87CEEB","ground":"#F5F5DC"},"juice":{"onVerb":{"sound":"whoosh","particles":12,"shake":0},"onFail":{"sound":"thud","particles":24,"shake":0.6}},"checks":["Player never gets crushed by two clouds at once","Score goes up by 1 on every cloud","Holding jump goes higher than tapping it"]}
Before: what “+ a worked example” made

Refused. The engine’s validator (learn/public/tiny.js).

  • Fail "juice.onVerb": { "sound": blip|pop|chime|thud|zap|crash|none, "particles": 0–40, "shake": 0–1 }.
  • Pass Acting, scoring and failing are all seen and heard.
  • Pass 15% harder every 10 seconds.
  • Fail That’s still the toast. Give it your own title, pitch and numbers.
  • Pass 3 things to test.
The model’s reply, as written
{"checks":["Windmills never spawn closer together than one jump can clear","Score goes up by 10 on every leaf","Holding jump goes higher than tapping it"],"hazard":{"color":"#4b9467","every":1.2,"name":"windmill","speed":300},"juice":{"onFail":{"particles":40,"shake":0.9,"sound":"crash"},"onScore":{"particles":20,"shake":0,"sound":"chime"},"onVerb":{"particles":10,"shake":0,"sound":"tweet"}},"palette":{"background":"#87ceeb","ground":"#3e8e41"},"pickup":{"color":"#8bc34a","every":3.5,"name":"leaf","points":10},"pitch":"You are a bird trying to reach the clouds. Jump through the windmills; collect the leaves.","player":{"color":"#32cd32"},"ramp":15,"title":"Skybound","verb":"jump"}

Editor’s note

Worse. Adding the One verb and Juice lessons made it forget things the example had shown it: no ramp, no pickup, nothing for scoring, three refusals. Its checks promise a score that nothing in the game gives.

What changed in the input

+2,496 −0 characters

System: You write tiny games for an engine that plays a game described as one JSON object. The format: A spec: title, pitch strings verb … 1,424 unchanged characters … "Forks never spawn closer together than one jump can clear", "Score goes up by 5 on every butter", "Holding jump goes higher than tapping it" ] }
Added: 2,496 characters of teaching (show)Apply this teaching: Module 16, One verb: Design around the one thing the player does. Verbs, not features A verb is something the player does, moment to moment: jump, flap, swing, stack, grind. A feature is something the game has: a shop, a story, a map. Small games live or die on their verbs. Pick one core verb and make it rich: let it vary (a tap versus a hold), let timing matter (a late press is a different move), and let it combine with the world (jump plus rail equals grind). { "core": "ollie", "verbs": [ { "verb": "ollie", "input": "Space (press)", "does": "pops the board; higher if held", "feedback": "pop sound, board tilts" }, { "verb": "flip", "input": "Z + direction", "does": "a different flip per direction", "feedback": "trick name pops up" }, { "verb": "grind", "input": "land on a rail", "does": "slides along it; perfect if timed", "feedback": "sparks and a hiss" } ] } (A verb table, cut down from SK8 2026’s. One core verb; every verb has an input, an effect and feedback.) Write it as a table A verb table makes the design explicit, for you and for an AI: each verb, the input that performs it, what it does, and the feedback it gives. Give it to a code model and it builds the controls you meant, instead of the ones it’s seen most. Keep it short. Three verbs is plenty for a small game; one is often better. --- Module 17, Juice: Every action, seen and heard. What juice is “Juice” is the feedback that makes actions feel real: a sound, a puff of particles, a little shake, a number that pops up and floats away. It doesn’t change the rules. It changes whether pressing the button feels like anything. This site’s games have a rule, written in their skill and enforced by an automated audit: every verb produces something you see and something you hear. When a new verb was added without both, the audit failed. Proportional feedback Bigger moments get bigger feedback. A step gets a tick; a jump gets a pop; a perfect landing gets a chime and a burst; a crash gets a shake and a low thud. If everything is loud, nothing is. Keep it short, too: particles that live a fifth of a second, sounds under a quarter of a second. Feedback layers constantly; long effects turn to mush. Make it a table, then a test Write the feedback as a table (event, visual, sound) and you can check it: is every event covered? Then it can become a test, the way SK8’s feedback audit presses every verb and listens for the sound.
Reply with the JSON object only. Make your own game, not the example. User: Write a tiny game where you jump.
How it was made: 1 call, 13.0 neurons
  1. answer @cf/meta/llama-3.1-8b-instruct-fp8-fast

    max_tokens 700, temperature 0.6, seed 7 · 2026-10-14 21:57 UTC · 1.7 s · 13.0 neurons · cache a3b279d81f6d

    System text (4,303 characters)
    You write tiny games for an engine that plays a game described as one JSON object. The format:
    A spec:
      title, pitch                  strings
      verb                          'jump' (a runner) | 'flap' (fly through gaps) | 'dodge' (move under falling things)
      player: { color }
      hazard: { name, color, every (s between spawns, 0.4–3), speed (px/s, 120–600) }
      pickup?: { name, color, every (0.5–6), points (1–50) }
      ramp                          % harder every 10 s (0–30): spawns come faster and move faster
      palette: { background, ground }
      juice: { onVerb, onScore, onFail }, each { sound, particles (0–40), shake (0–1) }
      checks: [ strings ]           what to test by playing
    Everything the engine needs, checked exactly. Returns the rubric rows the Worker uses, plus a flat error list.
    
    A complete example:
    {
      "title": "Toast run",
      "pitch": "You are a slice of toast escaping the toaster. Jump the forks; grab the butter.",
      "verb": "jump",
      "player": {
        "color": "#d9a35b"
      },
      "hazard": {
        "name": "fork",
        "color": "#6b6b62",
        "every": 1.4,
        "speed": 260
      },
      "pickup": {
        "name": "butter",
        "color": "#f3dd6b",
        "every": 2.5,
        "points": 5
      },
      "ramp": 12,
      "palette": {
        "background": "#f4f1e8",
        "ground": "#171815"
      },
      "juice": {
        "onVerb": {
          "sound": "pop",
          "particles": 6,
          "shake": 0
        },
        "onScore": {
          "sound": "chime",
          "particles": 12,
          "shake": 0
        },
        "onFail": {
          "sound": "crash",
          "particles": 30,
          "shake": 0.8
        }
      },
      "checks": [
        "Forks never spawn closer together than one jump can clear",
        "Score goes up by 5 on every butter",
        "Holding jump goes higher than tapping it"
      ]
    }
    
    Apply this teaching:
    
    Module 16, One verb: Design around the one thing the player does.
    
    Verbs, not features
    A verb is something the player does, moment to moment: jump, flap, swing, stack, grind. A feature is something the game has: a shop, a story, a map. Small games live or die on their verbs.
    Pick one core verb and make it rich: let it vary (a tap versus a hold), let timing matter (a late press is a different move), and let it combine with the world (jump plus rail equals grind).
    
    {
      "core": "ollie",
      "verbs": [
        { "verb": "ollie", "input": "Space (press)",    "does": "pops the board; higher if held",          "feedback": "pop sound, board tilts" },
        { "verb": "flip",  "input": "Z + direction",    "does": "a different flip per direction",          "feedback": "trick name pops up" },
        { "verb": "grind", "input": "land on a rail",   "does": "slides along it; perfect if timed",       "feedback": "sparks and a hiss" }
      ]
    }
    (A verb table, cut down from SK8 2026’s. One core verb; every verb has an input, an effect and feedback.)
    
    Write it as a table
    A verb table makes the design explicit, for you and for an AI: each verb, the input that performs it, what it does, and the feedback it gives. Give it to a code model and it builds the controls you meant, instead of the ones it’s seen most.
    Keep it short. Three verbs is plenty for a small game; one is often better.
    
    ---
    
    Module 17, Juice: Every action, seen and heard.
    
    What juice is
    “Juice” is the feedback that makes actions feel real: a sound, a puff of particles, a little shake, a number that pops up and floats away. It doesn’t change the rules. It changes whether pressing the button feels like anything.
    This site’s games have a rule, written in their skill and enforced by an automated audit: every verb produces something you see and something you hear. When a new verb was added without both, the audit failed.
    
    Proportional feedback
    Bigger moments get bigger feedback. A step gets a tick; a jump gets a pop; a perfect landing gets a chime and a burst; a crash gets a shake and a low thud. If everything is loud, nothing is.
    Keep it short, too: particles that live a fifth of a second, sounds under a quarter of a second. Feedback layers constantly; long effects turn to mush.
    
    Make it a table, then a test
    Write the feedback as a table (event, visual, sound) and you can check it: is every event covered? Then it can become a test, the way SK8’s feedback audit presses every verb and listens for the sound.
    
    Reply with the JSON object only. Make your own game, not the example.

    User

    Write a tiny game where you jump.

    Output

    {"title":"Skybound","pitch":"Leap through the clouds and reach the stars.","verb":"jump","player":{"color":"#6495ED"},"hazard":{"name":"cloud","color":"#87CEEB","every":1.2,"speed":200},"palette":{"background":"#87CEEB","ground":"#F5F5DC"},"juice":{"onVerb":{"sound":"whoosh","particles":12,"shake":0},"onFail":{"sound":"thud","particles":24,"shake":0.6}},"checks":["Player never gets crushed by two clouds at once","Score goes up by 1 on every cloud","Holding jump goes higher than tapping it"]}

Generation 4 · from + a worked example

+ the validator, in a loop

Pathway 3 · Module 21: The game loop learn/public/tiny.js

Playable, by the checker’s rules. The engine’s validator (learn/public/tiny.js), after 2 attempts.

  • Pass Skybound: jump, windmills every 1.2 s.
  • Pass Acting, scoring and failing are all seen and heard.
  • Pass 15% harder every 10 seconds.
  • Pass “Skybound” is yours.
  • Pass 3 things to test.
The model’s reply, as written
{"checks":["Windmills never spawn closer together than one jump can clear","Score goes up by 10 on every leaf","Holding jump goes higher than tapping it"],"hazard":{"color":"#4b9467","every":1.2,"name":"windmill","speed":300},"juice":{"onFail":{"particles":40,"shake":0.9,"sound":"crash"},"onScore":{"particles":20,"shake":0,"sound":"chime"},"onVerb":{"particles":10,"shake":0,"sound":"blip"}},"palette":{"background":"#87ceeb","ground":"#3e8e41"},"pickup":{"color":"#8bc34a","every":3.5,"name":"leaf","points":10},"pitch":"You are a bird trying to reach the clouds. Jump through the windmills; collect the leaves.","player":{"color":"#32cd32"},"ramp":15,"title":"Skybound","verb":"jump"}
Before: what “+ a worked example” made

Refused. The engine’s validator (learn/public/tiny.js).

  • Fail "juice.onVerb": { "sound": blip|pop|chime|thud|zap|crash|none, "particles": 0–40, "shake": 0–1 }.
  • Pass Acting, scoring and failing are all seen and heard.
  • Pass 15% harder every 10 seconds.
  • Fail That’s still the toast. Give it your own title, pitch and numbers.
  • Pass 3 things to test.
The model’s reply, as written
{"checks":["Windmills never spawn closer together than one jump can clear","Score goes up by 10 on every leaf","Holding jump goes higher than tapping it"],"hazard":{"color":"#4b9467","every":1.2,"name":"windmill","speed":300},"juice":{"onFail":{"particles":40,"shake":0.9,"sound":"crash"},"onScore":{"particles":20,"shake":0,"sound":"chime"},"onVerb":{"particles":10,"shake":0,"sound":"tweet"}},"palette":{"background":"#87ceeb","ground":"#3e8e41"},"pickup":{"color":"#8bc34a","every":3.5,"name":"leaf","points":10},"pitch":"You are a bird trying to reach the clouds. Jump through the windmills; collect the leaves.","player":{"color":"#32cd32"},"ramp":15,"title":"Skybound","verb":"jump"}

Editor’s note

Better. The validator’s complaint went back to the model once; it swapped “tweet” for “blip”, and it plays. The cheapest fix in the tree: one retry.

What changed in the input

The input is identical. What changed is how the node was made (see below).

How it was made: 2 calls, 25.1 neurons
  1. attempt 1 @cf/meta/llama-3.1-8b-instruct-fp8-fast

    max_tokens 700, temperature 0.6, seed 7 · 2026-10-14 21:57 UTC · 2.3 s · 13.7 neurons · cache 0f175579d971

    System text (1,805 characters)
    You write tiny games for an engine that plays a game described as one JSON object. The format:
    A spec:
      title, pitch                  strings
      verb                          'jump' (a runner) | 'flap' (fly through gaps) | 'dodge' (move under falling things)
      player: { color }
      hazard: { name, color, every (s between spawns, 0.4–3), speed (px/s, 120–600) }
      pickup?: { name, color, every (0.5–6), points (1–50) }
      ramp                          % harder every 10 s (0–30): spawns come faster and move faster
      palette: { background, ground }
      juice: { onVerb, onScore, onFail }, each { sound, particles (0–40), shake (0–1) }
      checks: [ strings ]           what to test by playing
    Everything the engine needs, checked exactly. Returns the rubric rows the Worker uses, plus a flat error list.
    
    A complete example:
    {
      "title": "Toast run",
      "pitch": "You are a slice of toast escaping the toaster. Jump the forks; grab the butter.",
      "verb": "jump",
      "player": {
        "color": "#d9a35b"
      },
      "hazard": {
        "name": "fork",
        "color": "#6b6b62",
        "every": 1.4,
        "speed": 260
      },
      "pickup": {
        "name": "butter",
        "color": "#f3dd6b",
        "every": 2.5,
        "points": 5
      },
      "ramp": 12,
      "palette": {
        "background": "#f4f1e8",
        "ground": "#171815"
      },
      "juice": {
        "onVerb": {
          "sound": "pop",
          "particles": 6,
          "shake": 0
        },
        "onScore": {
          "sound": "chime",
          "particles": 12,
          "shake": 0
        },
        "onFail": {
          "sound": "crash",
          "particles": 30,
          "shake": 0.8
        }
      },
      "checks": [
        "Forks never spawn closer together than one jump can clear",
        "Score goes up by 5 on every butter",
        "Holding jump goes higher than tapping it"
      ]
    }
    
    Reply with the JSON object only. Make your own game, not the example.

    User

    Write a tiny game where you jump.

    Output

    {"checks":["Windmills never spawn closer together than one jump can clear","Score goes up by 10 on every leaf","Holding jump goes higher than tapping it"],"hazard":{"color":"#4b9467","every":1.2,"name":"windmill","speed":300},"juice":{"onFail":{"particles":40,"shake":0.9,"sound":"crash"},"onScore":{"particles":20,"shake":0,"sound":"chime"},"onVerb":{"particles":10,"shake":0,"sound":"tweet"}},"palette":{"background":"#87ceeb","ground":"#3e8e41"},"pickup":{"color":"#8bc34a","every":3.5,"name":"leaf","points":10},"pitch":"You are a bird trying to reach the clouds. Jump through the windmills; collect the leaves.","player":{"color":"#32cd32"},"ramp":15,"title":"Skybound","verb":"jump"}
  2. attempt 2 @cf/meta/llama-3.1-8b-instruct-fp8-fast

    max_tokens 700, temperature 0.6, seed 7 · 2026-10-14 21:57 UTC · 3.8 s · 11.4 neurons · cache 6dfcaee203cc

    System text (1,805 characters)
    You write tiny games for an engine that plays a game described as one JSON object. The format:
    A spec:
      title, pitch                  strings
      verb                          'jump' (a runner) | 'flap' (fly through gaps) | 'dodge' (move under falling things)
      player: { color }
      hazard: { name, color, every (s between spawns, 0.4–3), speed (px/s, 120–600) }
      pickup?: { name, color, every (0.5–6), points (1–50) }
      ramp                          % harder every 10 s (0–30): spawns come faster and move faster
      palette: { background, ground }
      juice: { onVerb, onScore, onFail }, each { sound, particles (0–40), shake (0–1) }
      checks: [ strings ]           what to test by playing
    Everything the engine needs, checked exactly. Returns the rubric rows the Worker uses, plus a flat error list.
    
    A complete example:
    {
      "title": "Toast run",
      "pitch": "You are a slice of toast escaping the toaster. Jump the forks; grab the butter.",
      "verb": "jump",
      "player": {
        "color": "#d9a35b"
      },
      "hazard": {
        "name": "fork",
        "color": "#6b6b62",
        "every": 1.4,
        "speed": 260
      },
      "pickup": {
        "name": "butter",
        "color": "#f3dd6b",
        "every": 2.5,
        "points": 5
      },
      "ramp": 12,
      "palette": {
        "background": "#f4f1e8",
        "ground": "#171815"
      },
      "juice": {
        "onVerb": {
          "sound": "pop",
          "particles": 6,
          "shake": 0
        },
        "onScore": {
          "sound": "chime",
          "particles": 12,
          "shake": 0
        },
        "onFail": {
          "sound": "crash",
          "particles": 30,
          "shake": 0.8
        }
      },
      "checks": [
        "Forks never spawn closer together than one jump can clear",
        "Score goes up by 5 on every butter",
        "Holding jump goes higher than tapping it"
      ]
    }
    
    Reply with the JSON object only. Make your own game, not the example.

    User

    Write a tiny game where you jump.
    
    Your previous answer:
    {"checks":["Windmills never spawn closer together than one jump can clear","Score goes up by 10 on every leaf","Holding jump goes higher than tapping it"],"hazard":{"color":"#4b9467","every":1.2,"name":"windmill","speed":300},"juice":{"onFail":{"particles":40,"shake":0.9,"sound":"crash"},"onScore":{"particles":20,"shake":0,"sound":"chime"},"onVerb":{"particles":10,"shake":0,"sound":"tweet"}},"palette":{"background":"#87ceeb","ground":"#3e8e41"},"pickup":{"color":"#8bc34a","every":3.5,"name":"leaf","points":10},"pitch":"You are a bird trying to reach the clouds. Jump through the windmills; collect the leaves.","player":{"color":"#32cd32"},"ramp":15,"title":"Skybound","verb":"jump"}
    
    The checker refused it:
    - "juice.onVerb": { "sound": blip|pop|chime|thud|zap|crash|none, "particles": 0–40, "shake": 0–1 }.
    Fix exactly those problems. Reply with the corrected answer only.

    Output

    {"checks":["Windmills never spawn closer together than one jump can clear","Score goes up by 10 on every leaf","Holding jump goes higher than tapping it"],"hazard":{"color":"#4b9467","every":1.2,"name":"windmill","speed":300},"juice":{"onFail":{"particles":40,"shake":0.9,"sound":"crash"},"onScore":{"particles":20,"shake":0,"sound":"chime"},"onVerb":{"particles":10,"shake":0,"sound":"blip"}},"palette":{"background":"#87ceeb","ground":"#3e8e41"},"pickup":{"color":"#8bc34a","every":3.5,"name":"leaf","points":10},"pitch":"You are a bird trying to reach the clouds. Jump through the windmills; collect the leaves.","player":{"color":"#32cd32"},"ramp":15,"title":"Skybound","verb":"jump"}

Generation 3 · from + the engine’s format

+ the validator, in a loop

Pathway 3 · Module 21: The game loop learn/public/tiny.js

Playable, by the checker’s rules. The engine’s validator (learn/public/tiny.js), after 3 attempts.

  • Pass Bouncy: jump, obstacles every 1 s.
  • Pass Acting, scoring and failing are all seen and heard.
  • Pass 10% harder every 10 seconds.
  • Pass “Bouncy” is yours.
  • Pass 3 things to test.
The model’s reply, as written
{"title":"Bouncy","pitch":"A simple jumping game","verb":"jump","player":{"color":"#ff69b4"},"hazard":{"name":"obstacle","color":"#333","every":1,"speed":220},"pickup":{"name":"coin","color":"#f7dc6f","every":2,"points":10},"ramp":10,"palette":{"background":"#f0f0f0","ground":"#808080"},"juice":{"onVerb":{"sound":"pop","particles":10,"shake":0.5},"onScore":{"sound":"chime","particles":20,"shake":0.2},"onFail":{"sound":"crash","particles":5,"shake":0.8}},"checks":["player hits ground","player hits obstacle","player collects coin"]}
Before: what “+ the engine’s format” made

Refused. The engine’s validator (learn/public/tiny.js).

  • Fail Hazards 200 px apart can’t all be cleared: make "every" × "speed" at least 220.
  • Pass Acting, scoring and failing are all seen and heard.
  • Pass 10% harder every 10 seconds.
  • Fail That’s still the toast. Give it your own title, pitch and numbers.
  • Pass 3 things to test.
The model’s reply, as written
{"title":"Bouncy","pitch":"A simple jumping game","verb":"jump","player":{"color":"#ff69b4"},"hazard":{"name":"obstacle","color":"#333","every":1,"speed":200},"pickup":{"name":"coin","color":"#f7dc6f","every":2,"points":10},"ramp":10,"palette":{"background":"#f0f0f0","ground":"#808080"},"juice":{"onVerb":{"sound":"bounce.wav","particles":10,"shake":0.5},"onScore":{"sound":"score.wav","particles":20,"shake":0.2},"onFail":{"sound":"fail.wav","particles":5,"shake":0.8}},"checks":["player hits ground","player hits obstacle","player collects coin"]}

Editor’s note

Better. Three tries: sounds fixed on the second, the spacing on the third (1 s × 220 px/s, exactly the minimum). It plays. The pitch is still “A simple jumping game”.

What changed in the input

The input is identical. What changed is how the node was made (see below).

How it was made: 3 calls, 26.0 neurons
  1. attempt 1 @cf/meta/llama-3.1-8b-instruct-fp8-fast

    max_tokens 700, temperature 0.6, seed 7 · 2026-10-14 21:57 UTC · 1.4 s · 9.8 neurons · cache 7dbfad377a60

    System text (830 characters)
    You write tiny games for an engine that plays a game described as one JSON object. The format:
    A spec:
      title, pitch                  strings
      verb                          'jump' (a runner) | 'flap' (fly through gaps) | 'dodge' (move under falling things)
      player: { color }
      hazard: { name, color, every (s between spawns, 0.4–3), speed (px/s, 120–600) }
      pickup?: { name, color, every (0.5–6), points (1–50) }
      ramp                          % harder every 10 s (0–30): spawns come faster and move faster
      palette: { background, ground }
      juice: { onVerb, onScore, onFail }, each { sound, particles (0–40), shake (0–1) }
      checks: [ strings ]           what to test by playing
    Everything the engine needs, checked exactly. Returns the rubric rows the Worker uses, plus a flat error list.
    Reply with the JSON object only.

    User

    Write a tiny game where you jump.

    Output

    {"title":"Bouncy","pitch":"A simple jumping game","verb":"jump","player":{"color":"#ff69b4"},"hazard":{"name":"obstacle","color":"#333","every":1,"speed":200},"pickup":{"name":"coin","color":"#f7dc6f","every":2,"points":10},"ramp":10,"palette":{"background":"#f0f0f0","ground":"#808080"},"juice":{"onVerb":{"sound":"bounce.wav","particles":10,"shake":0.5},"onScore":{"sound":"score.wav","particles":20,"shake":0.2},"onFail":{"sound":"fail.wav","particles":5,"shake":0.8}},"checks":["player hits ground","player hits obstacle","player collects coin"]}
  2. attempt 2 @cf/meta/llama-3.1-8b-instruct-fp8-fast

    max_tokens 700, temperature 0.6, seed 7 · 2026-10-14 21:57 UTC · 1.4 s · 8.4 neurons · cache f10f5b98c09e

    System text (830 characters)
    You write tiny games for an engine that plays a game described as one JSON object. The format:
    A spec:
      title, pitch                  strings
      verb                          'jump' (a runner) | 'flap' (fly through gaps) | 'dodge' (move under falling things)
      player: { color }
      hazard: { name, color, every (s between spawns, 0.4–3), speed (px/s, 120–600) }
      pickup?: { name, color, every (0.5–6), points (1–50) }
      ramp                          % harder every 10 s (0–30): spawns come faster and move faster
      palette: { background, ground }
      juice: { onVerb, onScore, onFail }, each { sound, particles (0–40), shake (0–1) }
      checks: [ strings ]           what to test by playing
    Everything the engine needs, checked exactly. Returns the rubric rows the Worker uses, plus a flat error list.
    Reply with the JSON object only.

    User

    Write a tiny game where you jump.
    
    Your previous answer:
    {"title":"Bouncy","pitch":"A simple jumping game","verb":"jump","player":{"color":"#ff69b4"},"hazard":{"name":"obstacle","color":"#333","every":1,"speed":200},"pickup":{"name":"coin","color":"#f7dc6f","every":2,"points":10},"ramp":10,"palette":{"background":"#f0f0f0","ground":"#808080"},"juice":{"onVerb":{"sound":"bounce.wav","particles":10,"shake":0.5},"onScore":{"sound":"score.wav","particles":20,"shake":0.2},"onFail":{"sound":"fail.wav","particles":5,"shake":0.8}},"checks":["player hits ground","player hits obstacle","player collects coin"]}
    
    The checker refused it:
    - Hazards 200 px apart can’t all be cleared: make "every" × "speed" at least 220.
    - "juice.onVerb": { "sound": blip|pop|chime|thud|zap|crash|none, "particles": 0–40, "shake": 0–1 }.
    - "juice.onScore": { "sound": blip|pop|chime|thud|zap|crash|none, "particles": 0–40, "shake": 0–1 }.
    - "juice.onFail": { "sound": blip|pop|chime|thud|zap|crash|none, "particles": 0–40, "shake": 0–1 }.
    Fix exactly those problems. Reply with the corrected answer only.

    Output

    {"title":"Bouncy","pitch":"A simple jumping game","verb":"jump","player":{"color":"#ff69b4"},"hazard":{"name":"obstacle","color":"#333","every":0.9,"speed":220},"pickup":{"name":"coin","color":"#f7dc6f","every":2,"points":10},"ramp":10,"palette":{"background":"#f0f0f0","ground":"#808080"},"juice":{"onVerb":{"sound":"pop","particles":10,"shake":0.5},"onScore":{"sound":"chime","particles":20,"shake":0.2},"onFail":{"sound":"crash","particles":5,"shake":0.8}},"checks":["player hits ground","player hits obstacle","player collects coin"]}
  3. attempt 3 @cf/meta/llama-3.1-8b-instruct-fp8-fast

    max_tokens 700, temperature 0.6, seed 7 · 2026-10-14 21:57 UTC · 1.4 s · 7.8 neurons · cache 79880beb84be

    System text (830 characters)
    You write tiny games for an engine that plays a game described as one JSON object. The format:
    A spec:
      title, pitch                  strings
      verb                          'jump' (a runner) | 'flap' (fly through gaps) | 'dodge' (move under falling things)
      player: { color }
      hazard: { name, color, every (s between spawns, 0.4–3), speed (px/s, 120–600) }
      pickup?: { name, color, every (0.5–6), points (1–50) }
      ramp                          % harder every 10 s (0–30): spawns come faster and move faster
      palette: { background, ground }
      juice: { onVerb, onScore, onFail }, each { sound, particles (0–40), shake (0–1) }
      checks: [ strings ]           what to test by playing
    Everything the engine needs, checked exactly. Returns the rubric rows the Worker uses, plus a flat error list.
    Reply with the JSON object only.

    User

    Write a tiny game where you jump.
    
    Your previous answer:
    {"title":"Bouncy","pitch":"A simple jumping game","verb":"jump","player":{"color":"#ff69b4"},"hazard":{"name":"obstacle","color":"#333","every":0.9,"speed":220},"pickup":{"name":"coin","color":"#f7dc6f","every":2,"points":10},"ramp":10,"palette":{"background":"#f0f0f0","ground":"#808080"},"juice":{"onVerb":{"sound":"pop","particles":10,"shake":0.5},"onScore":{"sound":"chime","particles":20,"shake":0.2},"onFail":{"sound":"crash","particles":5,"shake":0.8}},"checks":["player hits ground","player hits obstacle","player collects coin"]}
    
    The checker refused it:
    - Hazards 198 px apart can’t all be cleared: make "every" × "speed" at least 220.
    Fix exactly those problems. Reply with the corrected answer only.

    Output

    {"title":"Bouncy","pitch":"A simple jumping game","verb":"jump","player":{"color":"#ff69b4"},"hazard":{"name":"obstacle","color":"#333","every":1,"speed":220},"pickup":{"name":"coin","color":"#f7dc6f","every":2,"points":10},"ramp":10,"palette":{"background":"#f0f0f0","ground":"#808080"},"juice":{"onVerb":{"sound":"pop","particles":10,"shake":0.5},"onScore":{"sound":"chime","particles":20,"shake":0.2},"onFail":{"sound":"crash","particles":5,"shake":0.8}},"checks":["player hits ground","player hits obstacle","player collects coin"]}

Generation 2 · from Base model, bare prompt

+ the game-design-brief skill

.claude/skills/game-design-brief/SKILL.md · the exact text

Refused. The engine’s validator (learn/public/tiny.js).

  • Fail Not valid JSON: Expected property name or '}' in JSON at position 2 (line 1 column 3)
The model’s reply, as written
**Game Design Brief** ``` Name: Jump One verb: jump Pressure: the ground rises, gravity speeds up A run ends when: the player hits the ground Ramp: gravity per level (every 10 jumps), capped Screen: the player, the ground, the next jump height Controls: Space jump | touch: tap to jump Score: height (1/2/3/4 → 10/20/30/40 × level) Feedback: jump sound, ground hit (thud), level up (flash), jump height increase (rise) Seed: 5-jump random Kind: registry canvas Copy: "Go up. Come down." Done when: smart bot jumps at least 10 times; idle player hits the ground; no free points ``` **Code** ```javascript // game.js import { canvas, ctx } from './canvas.js'; let gravity = 0.1; let groundY = canvas.height; let playerY = canvas.height / 2; let jumpHeight = 10; let score = 0; let level = 1; let seed = Math.floor(Math.random() * 1000); function update() { playerY += gravity; ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = 'black'; ctx.fillRect(0, groundY, canvas.width, canvas.height); ctx.fillStyle = 'white'; ctx.fillRect(0, playerY, 20, 20); ctx.font = '24px Arial'; ctx.textAlign = 'left'; ctx.textBaseline = 'top'; ctx.fillStyle = 'white'; ctx.fillText(`Score: ${score}`, 10, 10); ctx.fillText(`Level: ${level}`, 10, 40); ctx.fillText(`Height: ${jumpHeight}`, 10, 70); ctx.fillText(`Gravity: ${gravity.toFixed(2)}`, 10, 100); requestAnimationFrame(update); } function jump() { playerY -= jumpHeight; jumpHeight -= gravity; score += 10 * level; level++; if (playerY < 0) { playerY = canvas.height / 2; jumpHeight = 10; } } canvas.addEventListener('click', () => { jump(); }); update(); ``` ```javascript // canvas.js import { JSDOM } from 'jsdom'; const dom = new JSDOM(`<!DOCTYPE html><html><body><canvas id="canvas" width="480" height="600"></canvas></body></html>`); const canvas = dom.window.document.getElementById('canvas'); const ctx = canvas.getContext('2d'); export { canvas, ctx }; ``` **Gameplay** * Press Space to jump * Tap the screen to jump * The player must avoid hitting the ground * The score increases with each jump, and the level increases every 10 jumps * The gravity increases with each level, making it harder to jump * The game ends when the player hits the ground Note: This is a very basic implementation and can be improved upon. The game design brief is a good starting point to create a more polished and engaging game.
Before: what “Base model, bare prompt” made

Refused. The engine’s validator (learn/public/tiny.js).

  • Fail No JSON object in the reply.
The model’s reply, as written
**Jumping Game** ================ Here's a simple implementation of a jumping game in Python using the Pygame library. ### Prerequisites * Python 3.x * Pygame library (`pip install pygame`) ### Code ```python import pygame import sys # Initialize Pygame pygame.init() # Set up some constants WIDTH, HEIGHT = 640, 480 PLAYER_SIZE = 50 GRAVITY = 0.5 JUMP_HEIGHT = -15 # Set up some colors WHITE = (255, 255, 255) RED = (255, 0, 0) # Set up the display screen = pygame.display.set_mode((WIDTH, HEIGHT)) # Set up the player player_rect = pygame.Rect(WIDTH / 2, HEIGHT / 2, PLAYER_SIZE, PLAYER_SIZE) player_velocity = 0 # Game loop while True: # Handle events for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: player_velocity = JUMP_HEIGHT # Move the player player_velocity += GRAVITY player_rect.y += player_velocity # Collision detection if player_rect.bottom >= HEIGHT: player_rect.bottom = HEIGHT player_velocity = 0 # Draw everything screen.fill(WHITE) pygame.draw.rect(screen, RED, player_rect) # Update the display pygame.display.flip() pygame.time.Clock().tick(60) ``` ### How to Play 1. Run the code using `python jumping_game.py`. 2. Use the space bar to jump. 3. Avoid falling off the bottom of the screen. ### Notes * This is a very basic implementation of a jumping game. You can add more features, such as scoring, power-ups, or enemies. * The game uses a simple physics engine to simulate gravity and movement. * The game loop runs at 60 frames per second to ensure smooth animation.

Editor’s note

Mixed. The game-design-brief skill made it decide things first: one verb, how a run ends, a ramp, controls, copy (“Go up. Come down.”). Then it wrote JavaScript, not a game the engine plays.

What changed in the input

+5,678 −0 characters

Added: 5,678 characters of teaching (show)System: Follow this skill: --- name: game-design-brief description: Turn a game idea ("add minesweeper", "make a game about X", "more games") into a one-page brief before any code - the one verb, what the player sees, how a run ends, the difficulty ramp, controls on keyboard / mouse / touch, scoring and best, every feedback moment (sound + visual), which kind of game it is on games.slopped.site (registry canvas, DOM table, standalone folder, own subsite), its name and deadpan copy, and measurable acceptance targets for the playtest bots. Use at the start of any new game or a big change to one, and when handing a game to a subagent (the brief is the hand-off). --- # Game design brief A game built from a one-line request comes out generic: "a fun game" averages every game the machine has seen, which is what pathway 3 of the Slop Curriculum teaches and what the Slopwright complains about. Write this brief first, in the conversation or in the subagent's prompt. It takes five minutes and decides everything the code would otherwise decide by default. ## The brief (fill every line) ``` Name: plain or a dry pun; no trademarks (Blocks, not Tetris; Mines, not Minesweeper is fine either way) One verb: the single thing the player does (flap, steer, drop, swipe, match). If it needs two, pick one. Pressure: what makes the verb hard right now (a gap closing, a timer, the pile growing) A run ends when: the fail state, or the win state for a puzzle; how long a first run lasts (target) Ramp: what rises with score/time, from what to what, and where it stops rising Screen: what's on it at a glance; what the player must read in under 1 s Controls: keyboard / mouse / touch, each one line. Touch is gestures on the canvas, not on-screen arrows. Score & best: what scores, what a good score is, what's saved (best, wins, fastest, today's) Feedback: every event → sound + visual (score, combo, near miss, fail, new best, level up) Seed: endless random, daily (YYYYMMDD), or shareable seed; how fairness is guaranteed (game-procgen) Kind: registry canvas | DOM table | standalone folder | own subsite (below) Copy: card subtitle (< 45 chars, deadpan), instructions (plain), touch instructions Done when: playtest targets (below) + phone screenshot looks right + check.mjs passes Not doing: what's out of scope this round (levels, online scores, accounts…) ``` ## Which kind of game | Kind | When | Where it lives | | --- | --- | --- | | **Registry canvas** | one screen, one verb, endless or short: Flappy, Snake, Stack, Blocks | an entry in `GAMES` in `games/public/games.js` (480×600 canvas, shared loop, HUD, bests, touch gestures). See `slopped-games` | | **DOM table** | turn-based, lots of discrete things to tap, needs accessibility per item: Solitaire, FreeCell, puzzles | `table: '<id>'` + its own IIFE file (`cards.js`, `puzzles.js`) exposing one global | | **Standalone folder** | its own menus, levels, controls schemes: SK8 2026 | `games/public/<name>/index.html` with a link back to `/` | | **Own subsite** | its own world and identity, 3D, many assets: Backrooms | `slopped-subsite` checklist | Pick the smallest kind that fits. Most ideas are registry games. ## Acceptance targets (measured, not felt) From `game-playtest` (write the smart policy as part of the game): - Idle player: no free points; at least 1.5 s before the first unavoidable threat (genre exceptions noted in `PLAYTEST_META`). - Mashing: low score. The smart bot's median score is 5× the masher's or more. - Smart bot: median run 30–90 s, and runs **end** (endless < 10% at 120 s). - Every point scored makes a sound and a burst/floater (the audit checks). - `update()` well under 1 ms. - Phones: no sideways scroll at 390 px, nothing to aim at smaller than 42 px, works one-handed in portrait. - Generated content is fair over many seeds (`game-procgen`). Puzzles (tables) replace the run targets with: a solver or constructive guarantee that every deal/board is solvable (or say which aren't), and a first game finishable in a few minutes. ## Keeping the machine on the rails while building - Give the brief, the kind, the files it may touch, and the files it must not (another agent's work, `reference/`). Uncommitted work can't be rolled back, so ask for small edits, not rewrites. - Ask for the smart policy and the check results in the report, plus phone screenshots it has actually looked at. - One verb at a time: get the core loop fun (playtest numbers), then add juice, then the ramp, then copy. A machine asked for "polish" first adds confetti. - Things it will drift on unless told: trademarks in names, on-screen arrow buttons on phones, `Math.random()` inside a seeded generator, `100vh`, forgetting the main site's Games card and the counts. ## Example (illustrative: check games.js for what Blocks actually does) ``` Name: Blocks · One verb: drop (place a falling piece) · Pressure: the pile grows, gravity speeds up A run ends when: a new piece can't spawn; first run ~1–2 min · Ramp: gravity per level (every 10 lines), capped Screen: the well, the next piece, held piece, ghost · Controls: ←/→ move, ↑ rotate, ↓ soft drop, Space hard drop, C hold | touch: drag to move, tap to rotate, swipe down to drop · Score: lines (1/2/3/4 → 100/300/500/800 × level) Feedback: lock (thud), line clear (rising chime + row flash), 4 lines (bigger), level up (flash), top out (crash) Seed: 7-bag random · Kind: registry canvas · Copy: "Lines go away. Nothing else does." Done when: smart bot clears lines and eventually tops out; idle tops out; no free points ```
User: Write a tiny game where you jump.
How it was made: 1 call, 29.5 neurons
  1. answer @cf/meta/llama-3.1-8b-instruct-fp8-fast

    max_tokens 900, temperature 0.6, seed 7 · 2026-10-14 21:57 UTC · 3.7 s · 29.5 neurons · cache ab49fe91abe6

    System text (5,670 characters)
    Follow this skill:
    
    ---
    name: game-design-brief
    description: Turn a game idea ("add minesweeper", "make a game about X", "more games") into a one-page brief before any code - the one verb, what the player sees, how a run ends, the difficulty ramp, controls on keyboard / mouse / touch, scoring and best, every feedback moment (sound + visual), which kind of game it is on games.slopped.site (registry canvas, DOM table, standalone folder, own subsite), its name and deadpan copy, and measurable acceptance targets for the playtest bots. Use at the start of any new game or a big change to one, and when handing a game to a subagent (the brief is the hand-off).
    ---
    
    # Game design brief
    
    A game built from a one-line request comes out generic: "a fun game" averages every game the machine has seen, which is what pathway 3 of the Slop Curriculum teaches and what the Slopwright complains about. Write this brief first, in the conversation or in the subagent's prompt. It takes five minutes and decides everything the code would otherwise decide by default.
    
    ## The brief (fill every line)
    
    ```
    Name:            plain or a dry pun; no trademarks (Blocks, not Tetris; Mines, not Minesweeper is fine either way)
    One verb:        the single thing the player does (flap, steer, drop, swipe, match). If it needs two, pick one.
    Pressure:        what makes the verb hard right now (a gap closing, a timer, the pile growing)
    A run ends when: the fail state, or the win state for a puzzle; how long a first run lasts (target)
    Ramp:            what rises with score/time, from what to what, and where it stops rising
    Screen:          what's on it at a glance; what the player must read in under 1 s
    Controls:        keyboard / mouse / touch, each one line. Touch is gestures on the canvas, not on-screen arrows.
    Score & best:    what scores, what a good score is, what's saved (best, wins, fastest, today's)
    Feedback:        every event → sound + visual (score, combo, near miss, fail, new best, level up)
    Seed:            endless random, daily (YYYYMMDD), or shareable seed; how fairness is guaranteed (game-procgen)
    Kind:            registry canvas | DOM table | standalone folder | own subsite (below)
    Copy:            card subtitle (< 45 chars, deadpan), instructions (plain), touch instructions
    Done when:       playtest targets (below) + phone screenshot looks right + check.mjs passes
    Not doing:       what's out of scope this round (levels, online scores, accounts…)
    ```
    
    ## Which kind of game
    
    | Kind | When | Where it lives |
    | --- | --- | --- |
    | **Registry canvas** | one screen, one verb, endless or short: Flappy, Snake, Stack, Blocks | an entry in `GAMES` in `games/public/games.js` (480×600 canvas, shared loop, HUD, bests, touch gestures). See `slopped-games` |
    | **DOM table** | turn-based, lots of discrete things to tap, needs accessibility per item: Solitaire, FreeCell, puzzles | `table: '<id>'` + its own IIFE file (`cards.js`, `puzzles.js`) exposing one global |
    | **Standalone folder** | its own menus, levels, controls schemes: SK8 2026 | `games/public/<name>/index.html` with a link back to `/` |
    | **Own subsite** | its own world and identity, 3D, many assets: Backrooms | `slopped-subsite` checklist |
    
    Pick the smallest kind that fits. Most ideas are registry games.
    
    ## Acceptance targets (measured, not felt)
    
    From `game-playtest` (write the smart policy as part of the game):
    
    - Idle player: no free points; at least 1.5 s before the first unavoidable threat (genre exceptions noted in `PLAYTEST_META`).
    - Mashing: low score. The smart bot's median score is 5× the masher's or more.
    - Smart bot: median run 30–90 s, and runs **end** (endless < 10% at 120 s).
    - Every point scored makes a sound and a burst/floater (the audit checks).
    - `update()` well under 1 ms.
    - Phones: no sideways scroll at 390 px, nothing to aim at smaller than 42 px, works one-handed in portrait.
    - Generated content is fair over many seeds (`game-procgen`).
    
    Puzzles (tables) replace the run targets with: a solver or constructive guarantee that every deal/board is solvable (or say which aren't), and a first game finishable in a few minutes.
    
    ## Keeping the machine on the rails while building
    
    - Give the brief, the kind, the files it may touch, and the files it must not (another agent's work, `reference/`). Uncommitted work can't be rolled back, so ask for small edits, not rewrites.
    - Ask for the smart policy and the check results in the report, plus phone screenshots it has actually looked at.
    - One verb at a time: get the core loop fun (playtest numbers), then add juice, then the ramp, then copy. A machine asked for "polish" first adds confetti.
    - Things it will drift on unless told: trademarks in names, on-screen arrow buttons on phones, `Math.random()` inside a seeded generator, `100vh`, forgetting the main site's Games card and the counts.
    
    ## Example (illustrative: check games.js for what Blocks actually does)
    
    ```
    Name: Blocks · One verb: drop (place a falling piece) · Pressure: the pile grows, gravity speeds up
    A run ends when: a new piece can't spawn; first run ~1–2 min · Ramp: gravity per level (every 10 lines), capped
    Screen: the well, the next piece, held piece, ghost · Controls: ←/→ move, ↑ rotate, ↓ soft drop, Space hard
    drop, C hold | touch: drag to move, tap to rotate, swipe down to drop · Score: lines (1/2/3/4 → 100/300/500/800 × level)
    Feedback: lock (thud), line clear (rising chime + row flash), 4 lines (bigger), level up (flash), top out (crash)
    Seed: 7-bag random · Kind: registry canvas · Copy: "Lines go away. Nothing else does."
    Done when: smart bot clears lines and eventually tops out; idle tops out; no free points
    ```

    User

    Write a tiny game where you jump.

    Output

    **Game Design Brief**
    
    ```
    Name: Jump
    One verb: jump
    Pressure: the ground rises, gravity speeds up
    A run ends when: the player hits the ground
    Ramp: gravity per level (every 10 jumps), capped
    Screen: the player, the ground, the next jump height
    Controls: Space jump | touch: tap to jump
    Score: height (1/2/3/4 → 10/20/30/40 × level)
    Feedback: jump sound, ground hit (thud), level up (flash), jump height increase (rise)
    Seed: 5-jump random
    Kind: registry canvas
    Copy: "Go up. Come down."
    Done when: smart bot jumps at least 10 times; idle player hits the ground; no free points
    ```
    
    **Code**
    
    ```javascript
    // game.js
    import { canvas, ctx } from './canvas.js';
    
    let gravity = 0.1;
    let groundY = canvas.height;
    let playerY = canvas.height / 2;
    let jumpHeight = 10;
    let score = 0;
    let level = 1;
    let seed = Math.floor(Math.random() * 1000);
    
    function update() {
      playerY += gravity;
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      ctx.fillStyle = 'black';
      ctx.fillRect(0, groundY, canvas.width, canvas.height);
      ctx.fillStyle = 'white';
      ctx.fillRect(0, playerY, 20, 20);
      ctx.font = '24px Arial';
      ctx.textAlign = 'left';
      ctx.textBaseline = 'top';
      ctx.fillStyle = 'white';
      ctx.fillText(`Score: ${score}`, 10, 10);
      ctx.fillText(`Level: ${level}`, 10, 40);
      ctx.fillText(`Height: ${jumpHeight}`, 10, 70);
      ctx.fillText(`Gravity: ${gravity.toFixed(2)}`, 10, 100);
      requestAnimationFrame(update);
    }
    
    function jump() {
      playerY -= jumpHeight;
      jumpHeight -= gravity;
      score += 10 * level;
      level++;
      if (playerY < 0) {
        playerY = canvas.height / 2;
        jumpHeight = 10;
      }
    }
    
    canvas.addEventListener('click', () => {
      jump();
    });
    
    update();
    ```
    
    ```javascript
    // canvas.js
    import { JSDOM } from 'jsdom';
    
    const dom = new JSDOM(`<!DOCTYPE html><html><body><canvas id="canvas" width="480" height="600"></canvas></body></html>`);
    const canvas = dom.window.document.getElementById('canvas');
    const ctx = canvas.getContext('2d');
    
    export { canvas, ctx };
    ```
    
    **Gameplay**
    
    * Press Space to jump
    * Tap the screen to jump
    * The player must avoid hitting the ground
    * The score increases with each jump, and the level increases every 10 jumps
    * The gravity increases with each level, making it harder to jump
    * The game ends when the player hits the ground
    
    Note: This is a very basic implementation and can be improved upon. The game design brief is a good starting point to create a more polished and engaging game.

Generation 3 · from + the game-design-brief skill

+ the engine’s format

learn/public/tiny.js

Refused. The engine’s validator (learn/public/tiny.js).

  • Fail Not valid JSON: Expected property name or '}' in JSON at position 4 (line 2 column 3)
The model’s reply, as written
## Game Design Brief ``` Name: Jump · One verb: jump (make the player leap) · Pressure: the ground approaches, the player must jump to avoid it A run ends when: the player hits the ground · first run ~1–2 s · Ramp: the ground moves faster every 10 jumps (every 0.8 s) Screen: the player, the ground, a tiny score · Controls: space to jump, left/right to move · touch: tap to jump, swipe left/right to move Score & best: the number of jumps, the highest number of jumps · Feedback: jump sound, hit sound, score update Seed: daily (YYYYMMDD) · Kind: registry canvas · Copy: "Jump. Don't die." Done when: idle player jumps at least 10 times, mashing player jumps 5 times, smart bot jumps 20 times ``` ## Game Code ```javascript // game.js export default { title: 'Jump', pitch: 'Jump and survive', verb: 'jump', player: { color: 'blue' }, hazard: { name: 'ground', color: 'brown', every: 0.8, speed: 300, }, ramp: 0.02, // 2% harder every 10 jumps palette: { background: 'lightgray', ground: 'brown', }, juice: { onVerb: { sound: 'jump', particles: 10, shake: 0.5 }, onScore: { sound: 'score', particles: 5, shake: 0.2 }, onFail: { sound: 'fail', particles: 20, shake: 1 }, }, checks: [ 'player hits the ground', 'idle player jumps at least 10 times', 'mashing player jumps 5 times', 'smart bot jumps 20 times', ], } ``` ## Engine Code ```javascript // engine.js import game from './game.js' // setup canvas and audio const canvas = document.getElementById('canvas') const ctx = canvas.getContext('2d') const audio = new AudioContext() // define game state let playerY = 0 let groundY = canvas.height let score = 0 let jumpCount = 0 let ramp = game.ramp // main loop function update() { // update player position playerY += 5 // check for collision with ground if (playerY + 20 >= groundY) { // game over console.log('Game Over!') return } // update score and jump count score++ jumpCount++ // check for ramp if (jumpCount % 10 === 0) { ramp += game.ramp } // update game state ctx.clearRect(0, 0, canvas.width, canvas.height) ctx.fillStyle = game.palette.background ctx.fillRect(0, 0, canvas.width, canvas.height) ctx.fillStyle = game.player.color ctx.fillRect(50, playerY, 20, 20) ctx.fillStyle = game.palette.ground ctx.fillRect(0, groundY, canvas.width, 20) // draw score
Before: what “+ the game-design-brief skill” made

Refused. The engine’s validator (learn/public/tiny.js).

  • Fail Not valid JSON: Expected property name or '}' in JSON at position 2 (line 1 column 3)
The model’s reply, as written
**Game Design Brief** ``` Name: Jump One verb: jump Pressure: the ground rises, gravity speeds up A run ends when: the player hits the ground Ramp: gravity per level (every 10 jumps), capped Screen: the player, the ground, the next jump height Controls: Space jump | touch: tap to jump Score: height (1/2/3/4 → 10/20/30/40 × level) Feedback: jump sound, ground hit (thud), level up (flash), jump height increase (rise) Seed: 5-jump random Kind: registry canvas Copy: "Go up. Come down." Done when: smart bot jumps at least 10 times; idle player hits the ground; no free points ``` **Code** ```javascript // game.js import { canvas, ctx } from './canvas.js'; let gravity = 0.1; let groundY = canvas.height; let playerY = canvas.height / 2; let jumpHeight = 10; let score = 0; let level = 1; let seed = Math.floor(Math.random() * 1000); function update() { playerY += gravity; ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = 'black'; ctx.fillRect(0, groundY, canvas.width, canvas.height); ctx.fillStyle = 'white'; ctx.fillRect(0, playerY, 20, 20); ctx.font = '24px Arial'; ctx.textAlign = 'left'; ctx.textBaseline = 'top'; ctx.fillStyle = 'white'; ctx.fillText(`Score: ${score}`, 10, 10); ctx.fillText(`Level: ${level}`, 10, 40); ctx.fillText(`Height: ${jumpHeight}`, 10, 70); ctx.fillText(`Gravity: ${gravity.toFixed(2)}`, 10, 100); requestAnimationFrame(update); } function jump() { playerY -= jumpHeight; jumpHeight -= gravity; score += 10 * level; level++; if (playerY < 0) { playerY = canvas.height / 2; jumpHeight = 10; } } canvas.addEventListener('click', () => { jump(); }); update(); ``` ```javascript // canvas.js import { JSDOM } from 'jsdom'; const dom = new JSDOM(`<!DOCTYPE html><html><body><canvas id="canvas" width="480" height="600"></canvas></body></html>`); const canvas = dom.window.document.getElementById('canvas'); const ctx = canvas.getContext('2d'); export { canvas, ctx }; ``` **Gameplay** * Press Space to jump * Tap the screen to jump * The player must avoid hitting the ground * The score increases with each jump, and the level increases every 10 jumps * The gravity increases with each level, making it harder to jump * The game ends when the player hits the ground Note: This is a very basic implementation and can be improved upon. The game design brief is a good starting point to create a more polished and engaging game.

Editor’s note

Mixed. The brief, then the game as a JavaScript module with colour names, sounds the engine doesn’t have and a ramp of 0.02. Refused before the checker got to the details.

What changed in the input

+829 −0 characters

System: Follow this skill: --- name: game-design-brief description: Turn a game idea ("add minesweeper", "make a game about X", "more games") into a one-page b… 5,360 unchanged characters …Kind: registry canvas · Copy: "Lines go away. Nothing else does." Done when: smart bot clears lines and eventually tops out; idle tops out; no free points ```
Added: 829 characters (show)Then write the game for an engine that plays a game described as one JSON object. The format: A spec: title, pitch strings verb 'jump' (a runner) | 'flap' (fly through gaps) | 'dodge' (move under falling things) player: { color } hazard: { name, color, every (s between spawns, 0.4–3), speed (px/s, 120–600) } pickup?: { name, color, every (0.5–6), points (1–50) } ramp % harder every 10 s (0–30): spawns come faster and move faster palette: { background, ground } juice: { onVerb, onScore, onFail }, each { sound, particles (0–40), shake (0–1) } checks: [ strings ] what to test by playing Everything the engine needs, checked exactly. Returns the rubric rows the Worker uses, plus a flat error list. Reply with the JSON object only.
User: Write a tiny game where you jump.
How it was made: 1 call, 31.4 neurons
  1. answer @cf/meta/llama-3.1-8b-instruct-fp8-fast

    max_tokens 700, temperature 0.6, seed 7 · 2026-10-14 21:57 UTC · 4.7 s · 31.4 neurons · cache 8748abee1367

    System text (6,501 characters)
    Follow this skill:
    
    ---
    name: game-design-brief
    description: Turn a game idea ("add minesweeper", "make a game about X", "more games") into a one-page brief before any code - the one verb, what the player sees, how a run ends, the difficulty ramp, controls on keyboard / mouse / touch, scoring and best, every feedback moment (sound + visual), which kind of game it is on games.slopped.site (registry canvas, DOM table, standalone folder, own subsite), its name and deadpan copy, and measurable acceptance targets for the playtest bots. Use at the start of any new game or a big change to one, and when handing a game to a subagent (the brief is the hand-off).
    ---
    
    # Game design brief
    
    A game built from a one-line request comes out generic: "a fun game" averages every game the machine has seen, which is what pathway 3 of the Slop Curriculum teaches and what the Slopwright complains about. Write this brief first, in the conversation or in the subagent's prompt. It takes five minutes and decides everything the code would otherwise decide by default.
    
    ## The brief (fill every line)
    
    ```
    Name:            plain or a dry pun; no trademarks (Blocks, not Tetris; Mines, not Minesweeper is fine either way)
    One verb:        the single thing the player does (flap, steer, drop, swipe, match). If it needs two, pick one.
    Pressure:        what makes the verb hard right now (a gap closing, a timer, the pile growing)
    A run ends when: the fail state, or the win state for a puzzle; how long a first run lasts (target)
    Ramp:            what rises with score/time, from what to what, and where it stops rising
    Screen:          what's on it at a glance; what the player must read in under 1 s
    Controls:        keyboard / mouse / touch, each one line. Touch is gestures on the canvas, not on-screen arrows.
    Score & best:    what scores, what a good score is, what's saved (best, wins, fastest, today's)
    Feedback:        every event → sound + visual (score, combo, near miss, fail, new best, level up)
    Seed:            endless random, daily (YYYYMMDD), or shareable seed; how fairness is guaranteed (game-procgen)
    Kind:            registry canvas | DOM table | standalone folder | own subsite (below)
    Copy:            card subtitle (< 45 chars, deadpan), instructions (plain), touch instructions
    Done when:       playtest targets (below) + phone screenshot looks right + check.mjs passes
    Not doing:       what's out of scope this round (levels, online scores, accounts…)
    ```
    
    ## Which kind of game
    
    | Kind | When | Where it lives |
    | --- | --- | --- |
    | **Registry canvas** | one screen, one verb, endless or short: Flappy, Snake, Stack, Blocks | an entry in `GAMES` in `games/public/games.js` (480×600 canvas, shared loop, HUD, bests, touch gestures). See `slopped-games` |
    | **DOM table** | turn-based, lots of discrete things to tap, needs accessibility per item: Solitaire, FreeCell, puzzles | `table: '<id>'` + its own IIFE file (`cards.js`, `puzzles.js`) exposing one global |
    | **Standalone folder** | its own menus, levels, controls schemes: SK8 2026 | `games/public/<name>/index.html` with a link back to `/` |
    | **Own subsite** | its own world and identity, 3D, many assets: Backrooms | `slopped-subsite` checklist |
    
    Pick the smallest kind that fits. Most ideas are registry games.
    
    ## Acceptance targets (measured, not felt)
    
    From `game-playtest` (write the smart policy as part of the game):
    
    - Idle player: no free points; at least 1.5 s before the first unavoidable threat (genre exceptions noted in `PLAYTEST_META`).
    - Mashing: low score. The smart bot's median score is 5× the masher's or more.
    - Smart bot: median run 30–90 s, and runs **end** (endless < 10% at 120 s).
    - Every point scored makes a sound and a burst/floater (the audit checks).
    - `update()` well under 1 ms.
    - Phones: no sideways scroll at 390 px, nothing to aim at smaller than 42 px, works one-handed in portrait.
    - Generated content is fair over many seeds (`game-procgen`).
    
    Puzzles (tables) replace the run targets with: a solver or constructive guarantee that every deal/board is solvable (or say which aren't), and a first game finishable in a few minutes.
    
    ## Keeping the machine on the rails while building
    
    - Give the brief, the kind, the files it may touch, and the files it must not (another agent's work, `reference/`). Uncommitted work can't be rolled back, so ask for small edits, not rewrites.
    - Ask for the smart policy and the check results in the report, plus phone screenshots it has actually looked at.
    - One verb at a time: get the core loop fun (playtest numbers), then add juice, then the ramp, then copy. A machine asked for "polish" first adds confetti.
    - Things it will drift on unless told: trademarks in names, on-screen arrow buttons on phones, `Math.random()` inside a seeded generator, `100vh`, forgetting the main site's Games card and the counts.
    
    ## Example (illustrative: check games.js for what Blocks actually does)
    
    ```
    Name: Blocks · One verb: drop (place a falling piece) · Pressure: the pile grows, gravity speeds up
    A run ends when: a new piece can't spawn; first run ~1–2 min · Ramp: gravity per level (every 10 lines), capped
    Screen: the well, the next piece, held piece, ghost · Controls: ←/→ move, ↑ rotate, ↓ soft drop, Space hard
    drop, C hold | touch: drag to move, tap to rotate, swipe down to drop · Score: lines (1/2/3/4 → 100/300/500/800 × level)
    Feedback: lock (thud), line clear (rising chime + row flash), 4 lines (bigger), level up (flash), top out (crash)
    Seed: 7-bag random · Kind: registry canvas · Copy: "Lines go away. Nothing else does."
    Done when: smart bot clears lines and eventually tops out; idle tops out; no free points
    ```
    
    Then write the game for an engine that plays a game described as one JSON object. The format:
    A spec:
      title, pitch                  strings
      verb                          'jump' (a runner) | 'flap' (fly through gaps) | 'dodge' (move under falling things)
      player: { color }
      hazard: { name, color, every (s between spawns, 0.4–3), speed (px/s, 120–600) }
      pickup?: { name, color, every (0.5–6), points (1–50) }
      ramp                          % harder every 10 s (0–30): spawns come faster and move faster
      palette: { background, ground }
      juice: { onVerb, onScore, onFail }, each { sound, particles (0–40), shake (0–1) }
      checks: [ strings ]           what to test by playing
    Everything the engine needs, checked exactly. Returns the rubric rows the Worker uses, plus a flat error list.
    Reply with the JSON object only.

    User

    Write a tiny game where you jump.

    Output

    ## Game Design Brief
    
    ```
    Name: Jump · One verb: jump (make the player leap) · Pressure: the ground approaches, the player must jump to avoid it
    A run ends when: the player hits the ground · first run ~1–2 s · Ramp: the ground moves faster every 10 jumps (every 0.8 s)
    Screen: the player, the ground, a tiny score · Controls: space to jump, left/right to move · touch: tap to jump, swipe left/right to move
    Score & best: the number of jumps, the highest number of jumps · Feedback: jump sound, hit sound, score update
    Seed: daily (YYYYMMDD) · Kind: registry canvas · Copy: "Jump. Don't die."
    Done when: idle player jumps at least 10 times, mashing player jumps 5 times, smart bot jumps 20 times
    ```
    
    ## Game Code
    
    ```javascript
    // game.js
    export default {
      title: 'Jump',
      pitch: 'Jump and survive',
      verb: 'jump',
      player: { color: 'blue' },
      hazard: {
        name: 'ground',
        color: 'brown',
        every: 0.8,
        speed: 300,
      },
      ramp: 0.02, // 2% harder every 10 jumps
      palette: {
        background: 'lightgray',
        ground: 'brown',
      },
      juice: {
        onVerb: { sound: 'jump', particles: 10, shake: 0.5 },
        onScore: { sound: 'score', particles: 5, shake: 0.2 },
        onFail: { sound: 'fail', particles: 20, shake: 1 },
      },
      checks: [
        'player hits the ground',
        'idle player jumps at least 10 times',
        'mashing player jumps 5 times',
        'smart bot jumps 20 times',
      ],
    }
    ```
    
    ## Engine Code
    
    ```javascript
    // engine.js
    import game from './game.js'
    
    // setup canvas and audio
    const canvas = document.getElementById('canvas')
    const ctx = canvas.getContext('2d')
    const audio = new AudioContext()
    
    // define game state
    let playerY = 0
    let groundY = canvas.height
    let score = 0
    let jumpCount = 0
    let ramp = game.ramp
    
    // main loop
    function update() {
      // update player position
      playerY += 5
    
      // check for collision with ground
      if (playerY + 20 >= groundY) {
        // game over
        console.log('Game Over!')
        return
      }
    
      // update score and jump count
      score++
      jumpCount++
    
      // check for ramp
      if (jumpCount % 10 === 0) {
        ramp += game.ramp
      }
    
      // update game state
      ctx.clearRect(0, 0, canvas.width, canvas.height)
      ctx.fillStyle = game.palette.background
      ctx.fillRect(0, 0, canvas.width, canvas.height)
      ctx.fillStyle = game.player.color
      ctx.fillRect(50, playerY, 20, 20)
      ctx.fillStyle = game.palette.ground
      ctx.fillRect(0, groundY, canvas.width, 20)
    
      // draw score
    

Generation 3 · from + the game-design-brief skill

+ format and the validator

Pathway 3 · Module 21: The game loop learn/public/tiny.js

Refused. The engine’s validator (learn/public/tiny.js), after 3 attempts.

  • Pass Jump: jump, grounds every 0.8 s.
  • Pass Acting, scoring and failing are all seen and heard.
  • Fail A "ramp" of 0 never gets harder. Try 5 to 15.
  • Pass “Jump” is yours.
  • Pass 4 things to test.
The model’s reply, as written
```javascript export default { "title": "Jump", "pitch": "Jump and survive", "verb": "jump", "player": { "color": "#d9a35b" }, "hazard": { "name": "ground", "color": "#964B00", "every": 0.8, "speed": 300 }, "ramp": 0.02, "palette": { "background": "#F0F0F0", "ground": "#964B00" }, "juice": { "onVerb": { "sound": "blip", "particles": 10, "shake": 0.5 }, "onScore": { "sound": "chime", "particles": 5, "shake": 0.2 }, "onFail": { "sound": "crash", "particles": 20, "shake": 1 } }, "checks": [ "player hits the ground", "idle player jumps at least 10 times", "mashing player jumps 5 times", "smart bot jumps 20 times" ] } ```
Before: what “+ the game-design-brief skill” made

Refused. The engine’s validator (learn/public/tiny.js).

  • Fail Not valid JSON: Expected property name or '}' in JSON at position 2 (line 1 column 3)
The model’s reply, as written
**Game Design Brief** ``` Name: Jump One verb: jump Pressure: the ground rises, gravity speeds up A run ends when: the player hits the ground Ramp: gravity per level (every 10 jumps), capped Screen: the player, the ground, the next jump height Controls: Space jump | touch: tap to jump Score: height (1/2/3/4 → 10/20/30/40 × level) Feedback: jump sound, ground hit (thud), level up (flash), jump height increase (rise) Seed: 5-jump random Kind: registry canvas Copy: "Go up. Come down." Done when: smart bot jumps at least 10 times; idle player hits the ground; no free points ``` **Code** ```javascript // game.js import { canvas, ctx } from './canvas.js'; let gravity = 0.1; let groundY = canvas.height; let playerY = canvas.height / 2; let jumpHeight = 10; let score = 0; let level = 1; let seed = Math.floor(Math.random() * 1000); function update() { playerY += gravity; ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = 'black'; ctx.fillRect(0, groundY, canvas.width, canvas.height); ctx.fillStyle = 'white'; ctx.fillRect(0, playerY, 20, 20); ctx.font = '24px Arial'; ctx.textAlign = 'left'; ctx.textBaseline = 'top'; ctx.fillStyle = 'white'; ctx.fillText(`Score: ${score}`, 10, 10); ctx.fillText(`Level: ${level}`, 10, 40); ctx.fillText(`Height: ${jumpHeight}`, 10, 70); ctx.fillText(`Gravity: ${gravity.toFixed(2)}`, 10, 100); requestAnimationFrame(update); } function jump() { playerY -= jumpHeight; jumpHeight -= gravity; score += 10 * level; level++; if (playerY < 0) { playerY = canvas.height / 2; jumpHeight = 10; } } canvas.addEventListener('click', () => { jump(); }); update(); ``` ```javascript // canvas.js import { JSDOM } from 'jsdom'; const dom = new JSDOM(`<!DOCTYPE html><html><body><canvas id="canvas" width="480" height="600"></canvas></body></html>`); const canvas = dom.window.document.getElementById('canvas'); const ctx = canvas.getContext('2d'); export { canvas, ctx }; ``` **Gameplay** * Press Space to jump * Tap the screen to jump * The player must avoid hitting the ground * The score increases with each jump, and the level increases every 10 jumps * The gravity increases with each level, making it harder to jump * The game ends when the player hits the ground Note: This is a very basic implementation and can be improved upon. The game design brief is a good starting point to create a more polished and engaging game.

Editor’s note

Mixed. Three tries. It fixed the colours and the sounds, and never the ramp: 0.02 % harder every ten seconds, which is never. Refused after the last attempt. The hazard is the ground.

What changed in the input

+829 −0 characters

System: Follow this skill: --- name: game-design-brief description: Turn a game idea ("add minesweeper", "make a game about X", "more games") into a one-page b… 5,360 unchanged characters …Kind: registry canvas · Copy: "Lines go away. Nothing else does." Done when: smart bot clears lines and eventually tops out; idle tops out; no free points ```
Added: 829 characters (show)Then write the game for an engine that plays a game described as one JSON object. The format: A spec: title, pitch strings verb 'jump' (a runner) | 'flap' (fly through gaps) | 'dodge' (move under falling things) player: { color } hazard: { name, color, every (s between spawns, 0.4–3), speed (px/s, 120–600) } pickup?: { name, color, every (0.5–6), points (1–50) } ramp % harder every 10 s (0–30): spawns come faster and move faster palette: { background, ground } juice: { onVerb, onScore, onFail }, each { sound, particles (0–40), shake (0–1) } checks: [ strings ] what to test by playing Everything the engine needs, checked exactly. Returns the rubric rows the Worker uses, plus a flat error list. Reply with the JSON object only.
User: Write a tiny game where you jump.
How it was made: 3 calls, 67.7 neurons
  1. attempt 1 @cf/meta/llama-3.1-8b-instruct-fp8-fast

    max_tokens 700, temperature 0.6, seed 7 · 2026-10-14 21:57 UTC · 4.7 s · 31.4 neurons · cache 8748abee1367

    System text (6,501 characters)
    Follow this skill:
    
    ---
    name: game-design-brief
    description: Turn a game idea ("add minesweeper", "make a game about X", "more games") into a one-page brief before any code - the one verb, what the player sees, how a run ends, the difficulty ramp, controls on keyboard / mouse / touch, scoring and best, every feedback moment (sound + visual), which kind of game it is on games.slopped.site (registry canvas, DOM table, standalone folder, own subsite), its name and deadpan copy, and measurable acceptance targets for the playtest bots. Use at the start of any new game or a big change to one, and when handing a game to a subagent (the brief is the hand-off).
    ---
    
    # Game design brief
    
    A game built from a one-line request comes out generic: "a fun game" averages every game the machine has seen, which is what pathway 3 of the Slop Curriculum teaches and what the Slopwright complains about. Write this brief first, in the conversation or in the subagent's prompt. It takes five minutes and decides everything the code would otherwise decide by default.
    
    ## The brief (fill every line)
    
    ```
    Name:            plain or a dry pun; no trademarks (Blocks, not Tetris; Mines, not Minesweeper is fine either way)
    One verb:        the single thing the player does (flap, steer, drop, swipe, match). If it needs two, pick one.
    Pressure:        what makes the verb hard right now (a gap closing, a timer, the pile growing)
    A run ends when: the fail state, or the win state for a puzzle; how long a first run lasts (target)
    Ramp:            what rises with score/time, from what to what, and where it stops rising
    Screen:          what's on it at a glance; what the player must read in under 1 s
    Controls:        keyboard / mouse / touch, each one line. Touch is gestures on the canvas, not on-screen arrows.
    Score & best:    what scores, what a good score is, what's saved (best, wins, fastest, today's)
    Feedback:        every event → sound + visual (score, combo, near miss, fail, new best, level up)
    Seed:            endless random, daily (YYYYMMDD), or shareable seed; how fairness is guaranteed (game-procgen)
    Kind:            registry canvas | DOM table | standalone folder | own subsite (below)
    Copy:            card subtitle (< 45 chars, deadpan), instructions (plain), touch instructions
    Done when:       playtest targets (below) + phone screenshot looks right + check.mjs passes
    Not doing:       what's out of scope this round (levels, online scores, accounts…)
    ```
    
    ## Which kind of game
    
    | Kind | When | Where it lives |
    | --- | --- | --- |
    | **Registry canvas** | one screen, one verb, endless or short: Flappy, Snake, Stack, Blocks | an entry in `GAMES` in `games/public/games.js` (480×600 canvas, shared loop, HUD, bests, touch gestures). See `slopped-games` |
    | **DOM table** | turn-based, lots of discrete things to tap, needs accessibility per item: Solitaire, FreeCell, puzzles | `table: '<id>'` + its own IIFE file (`cards.js`, `puzzles.js`) exposing one global |
    | **Standalone folder** | its own menus, levels, controls schemes: SK8 2026 | `games/public/<name>/index.html` with a link back to `/` |
    | **Own subsite** | its own world and identity, 3D, many assets: Backrooms | `slopped-subsite` checklist |
    
    Pick the smallest kind that fits. Most ideas are registry games.
    
    ## Acceptance targets (measured, not felt)
    
    From `game-playtest` (write the smart policy as part of the game):
    
    - Idle player: no free points; at least 1.5 s before the first unavoidable threat (genre exceptions noted in `PLAYTEST_META`).
    - Mashing: low score. The smart bot's median score is 5× the masher's or more.
    - Smart bot: median run 30–90 s, and runs **end** (endless < 10% at 120 s).
    - Every point scored makes a sound and a burst/floater (the audit checks).
    - `update()` well under 1 ms.
    - Phones: no sideways scroll at 390 px, nothing to aim at smaller than 42 px, works one-handed in portrait.
    - Generated content is fair over many seeds (`game-procgen`).
    
    Puzzles (tables) replace the run targets with: a solver or constructive guarantee that every deal/board is solvable (or say which aren't), and a first game finishable in a few minutes.
    
    ## Keeping the machine on the rails while building
    
    - Give the brief, the kind, the files it may touch, and the files it must not (another agent's work, `reference/`). Uncommitted work can't be rolled back, so ask for small edits, not rewrites.
    - Ask for the smart policy and the check results in the report, plus phone screenshots it has actually looked at.
    - One verb at a time: get the core loop fun (playtest numbers), then add juice, then the ramp, then copy. A machine asked for "polish" first adds confetti.
    - Things it will drift on unless told: trademarks in names, on-screen arrow buttons on phones, `Math.random()` inside a seeded generator, `100vh`, forgetting the main site's Games card and the counts.
    
    ## Example (illustrative: check games.js for what Blocks actually does)
    
    ```
    Name: Blocks · One verb: drop (place a falling piece) · Pressure: the pile grows, gravity speeds up
    A run ends when: a new piece can't spawn; first run ~1–2 min · Ramp: gravity per level (every 10 lines), capped
    Screen: the well, the next piece, held piece, ghost · Controls: ←/→ move, ↑ rotate, ↓ soft drop, Space hard
    drop, C hold | touch: drag to move, tap to rotate, swipe down to drop · Score: lines (1/2/3/4 → 100/300/500/800 × level)
    Feedback: lock (thud), line clear (rising chime + row flash), 4 lines (bigger), level up (flash), top out (crash)
    Seed: 7-bag random · Kind: registry canvas · Copy: "Lines go away. Nothing else does."
    Done when: smart bot clears lines and eventually tops out; idle tops out; no free points
    ```
    
    Then write the game for an engine that plays a game described as one JSON object. The format:
    A spec:
      title, pitch                  strings
      verb                          'jump' (a runner) | 'flap' (fly through gaps) | 'dodge' (move under falling things)
      player: { color }
      hazard: { name, color, every (s between spawns, 0.4–3), speed (px/s, 120–600) }
      pickup?: { name, color, every (0.5–6), points (1–50) }
      ramp                          % harder every 10 s (0–30): spawns come faster and move faster
      palette: { background, ground }
      juice: { onVerb, onScore, onFail }, each { sound, particles (0–40), shake (0–1) }
      checks: [ strings ]           what to test by playing
    Everything the engine needs, checked exactly. Returns the rubric rows the Worker uses, plus a flat error list.
    Reply with the JSON object only.

    User

    Write a tiny game where you jump.

    Output

    ## Game Design Brief
    
    ```
    Name: Jump · One verb: jump (make the player leap) · Pressure: the ground approaches, the player must jump to avoid it
    A run ends when: the player hits the ground · first run ~1–2 s · Ramp: the ground moves faster every 10 jumps (every 0.8 s)
    Screen: the player, the ground, a tiny score · Controls: space to jump, left/right to move · touch: tap to jump, swipe left/right to move
    Score & best: the number of jumps, the highest number of jumps · Feedback: jump sound, hit sound, score update
    Seed: daily (YYYYMMDD) · Kind: registry canvas · Copy: "Jump. Don't die."
    Done when: idle player jumps at least 10 times, mashing player jumps 5 times, smart bot jumps 20 times
    ```
    
    ## Game Code
    
    ```javascript
    // game.js
    export default {
      title: 'Jump',
      pitch: 'Jump and survive',
      verb: 'jump',
      player: { color: 'blue' },
      hazard: {
        name: 'ground',
        color: 'brown',
        every: 0.8,
        speed: 300,
      },
      ramp: 0.02, // 2% harder every 10 jumps
      palette: {
        background: 'lightgray',
        ground: 'brown',
      },
      juice: {
        onVerb: { sound: 'jump', particles: 10, shake: 0.5 },
        onScore: { sound: 'score', particles: 5, shake: 0.2 },
        onFail: { sound: 'fail', particles: 20, shake: 1 },
      },
      checks: [
        'player hits the ground',
        'idle player jumps at least 10 times',
        'mashing player jumps 5 times',
        'smart bot jumps 20 times',
      ],
    }
    ```
    
    ## Engine Code
    
    ```javascript
    // engine.js
    import game from './game.js'
    
    // setup canvas and audio
    const canvas = document.getElementById('canvas')
    const ctx = canvas.getContext('2d')
    const audio = new AudioContext()
    
    // define game state
    let playerY = 0
    let groundY = canvas.height
    let score = 0
    let jumpCount = 0
    let ramp = game.ramp
    
    // main loop
    function update() {
      // update player position
      playerY += 5
    
      // check for collision with ground
      if (playerY + 20 >= groundY) {
        // game over
        console.log('Game Over!')
        return
      }
    
      // update score and jump count
      score++
      jumpCount++
    
      // check for ramp
      if (jumpCount % 10 === 0) {
        ramp += game.ramp
      }
    
      // update game state
      ctx.clearRect(0, 0, canvas.width, canvas.height)
      ctx.fillStyle = game.palette.background
      ctx.fillRect(0, 0, canvas.width, canvas.height)
      ctx.fillStyle = game.player.color
      ctx.fillRect(50, playerY, 20, 20)
      ctx.fillStyle = game.palette.ground
      ctx.fillRect(0, groundY, canvas.width, 20)
    
      // draw score
    
  2. attempt 2 @cf/meta/llama-3.1-8b-instruct-fp8-fast

    max_tokens 700, temperature 0.6, seed 7 · 2026-10-14 21:57 UTC · 1.9 s · 18.7 neurons · cache 1aa738c02165

    System text (6,501 characters)
    Follow this skill:
    
    ---
    name: game-design-brief
    description: Turn a game idea ("add minesweeper", "make a game about X", "more games") into a one-page brief before any code - the one verb, what the player sees, how a run ends, the difficulty ramp, controls on keyboard / mouse / touch, scoring and best, every feedback moment (sound + visual), which kind of game it is on games.slopped.site (registry canvas, DOM table, standalone folder, own subsite), its name and deadpan copy, and measurable acceptance targets for the playtest bots. Use at the start of any new game or a big change to one, and when handing a game to a subagent (the brief is the hand-off).
    ---
    
    # Game design brief
    
    A game built from a one-line request comes out generic: "a fun game" averages every game the machine has seen, which is what pathway 3 of the Slop Curriculum teaches and what the Slopwright complains about. Write this brief first, in the conversation or in the subagent's prompt. It takes five minutes and decides everything the code would otherwise decide by default.
    
    ## The brief (fill every line)
    
    ```
    Name:            plain or a dry pun; no trademarks (Blocks, not Tetris; Mines, not Minesweeper is fine either way)
    One verb:        the single thing the player does (flap, steer, drop, swipe, match). If it needs two, pick one.
    Pressure:        what makes the verb hard right now (a gap closing, a timer, the pile growing)
    A run ends when: the fail state, or the win state for a puzzle; how long a first run lasts (target)
    Ramp:            what rises with score/time, from what to what, and where it stops rising
    Screen:          what's on it at a glance; what the player must read in under 1 s
    Controls:        keyboard / mouse / touch, each one line. Touch is gestures on the canvas, not on-screen arrows.
    Score & best:    what scores, what a good score is, what's saved (best, wins, fastest, today's)
    Feedback:        every event → sound + visual (score, combo, near miss, fail, new best, level up)
    Seed:            endless random, daily (YYYYMMDD), or shareable seed; how fairness is guaranteed (game-procgen)
    Kind:            registry canvas | DOM table | standalone folder | own subsite (below)
    Copy:            card subtitle (< 45 chars, deadpan), instructions (plain), touch instructions
    Done when:       playtest targets (below) + phone screenshot looks right + check.mjs passes
    Not doing:       what's out of scope this round (levels, online scores, accounts…)
    ```
    
    ## Which kind of game
    
    | Kind | When | Where it lives |
    | --- | --- | --- |
    | **Registry canvas** | one screen, one verb, endless or short: Flappy, Snake, Stack, Blocks | an entry in `GAMES` in `games/public/games.js` (480×600 canvas, shared loop, HUD, bests, touch gestures). See `slopped-games` |
    | **DOM table** | turn-based, lots of discrete things to tap, needs accessibility per item: Solitaire, FreeCell, puzzles | `table: '<id>'` + its own IIFE file (`cards.js`, `puzzles.js`) exposing one global |
    | **Standalone folder** | its own menus, levels, controls schemes: SK8 2026 | `games/public/<name>/index.html` with a link back to `/` |
    | **Own subsite** | its own world and identity, 3D, many assets: Backrooms | `slopped-subsite` checklist |
    
    Pick the smallest kind that fits. Most ideas are registry games.
    
    ## Acceptance targets (measured, not felt)
    
    From `game-playtest` (write the smart policy as part of the game):
    
    - Idle player: no free points; at least 1.5 s before the first unavoidable threat (genre exceptions noted in `PLAYTEST_META`).
    - Mashing: low score. The smart bot's median score is 5× the masher's or more.
    - Smart bot: median run 30–90 s, and runs **end** (endless < 10% at 120 s).
    - Every point scored makes a sound and a burst/floater (the audit checks).
    - `update()` well under 1 ms.
    - Phones: no sideways scroll at 390 px, nothing to aim at smaller than 42 px, works one-handed in portrait.
    - Generated content is fair over many seeds (`game-procgen`).
    
    Puzzles (tables) replace the run targets with: a solver or constructive guarantee that every deal/board is solvable (or say which aren't), and a first game finishable in a few minutes.
    
    ## Keeping the machine on the rails while building
    
    - Give the brief, the kind, the files it may touch, and the files it must not (another agent's work, `reference/`). Uncommitted work can't be rolled back, so ask for small edits, not rewrites.
    - Ask for the smart policy and the check results in the report, plus phone screenshots it has actually looked at.
    - One verb at a time: get the core loop fun (playtest numbers), then add juice, then the ramp, then copy. A machine asked for "polish" first adds confetti.
    - Things it will drift on unless told: trademarks in names, on-screen arrow buttons on phones, `Math.random()` inside a seeded generator, `100vh`, forgetting the main site's Games card and the counts.
    
    ## Example (illustrative: check games.js for what Blocks actually does)
    
    ```
    Name: Blocks · One verb: drop (place a falling piece) · Pressure: the pile grows, gravity speeds up
    A run ends when: a new piece can't spawn; first run ~1–2 min · Ramp: gravity per level (every 10 lines), capped
    Screen: the well, the next piece, held piece, ghost · Controls: ←/→ move, ↑ rotate, ↓ soft drop, Space hard
    drop, C hold | touch: drag to move, tap to rotate, swipe down to drop · Score: lines (1/2/3/4 → 100/300/500/800 × level)
    Feedback: lock (thud), line clear (rising chime + row flash), 4 lines (bigger), level up (flash), top out (crash)
    Seed: 7-bag random · Kind: registry canvas · Copy: "Lines go away. Nothing else does."
    Done when: smart bot clears lines and eventually tops out; idle tops out; no free points
    ```
    
    Then write the game for an engine that plays a game described as one JSON object. The format:
    A spec:
      title, pitch                  strings
      verb                          'jump' (a runner) | 'flap' (fly through gaps) | 'dodge' (move under falling things)
      player: { color }
      hazard: { name, color, every (s between spawns, 0.4–3), speed (px/s, 120–600) }
      pickup?: { name, color, every (0.5–6), points (1–50) }
      ramp                          % harder every 10 s (0–30): spawns come faster and move faster
      palette: { background, ground }
      juice: { onVerb, onScore, onFail }, each { sound, particles (0–40), shake (0–1) }
      checks: [ strings ]           what to test by playing
    Everything the engine needs, checked exactly. Returns the rubric rows the Worker uses, plus a flat error list.
    Reply with the JSON object only.

    User

    Write a tiny game where you jump.
    
    Your previous answer:
    ## Game Design Brief
    
    ```
    Name: Jump · One verb: jump (make the player leap) · Pressure: the ground approaches, the player must jump to avoid it
    A run ends when: the player hits the ground · first run ~1–2 s · Ramp: the ground moves faster every 10 jumps (every 0.8 s)
    Screen: the player, the ground, a tiny score · Controls: space to jump, left/right to move · touch: tap to jump, swipe left/right to move
    Score & best: the number of jumps, the highest number of jumps · Feedback: jump sound, hit sound, score update
    Seed: daily (YYYYMMDD) · Kind: registry canvas · Copy: "Jump. Don't die."
    Done when: idle player jumps at least 10 times, mashing player jumps 5 times, smart bot jumps 20 times
    ```
    
    ## Game Code
    
    ```javascript
    // game.js
    export default {
      title: 'Jump',
      pitch: 'Jump and survive',
      verb: 'jump',
      player: { color: 'blue' },
      hazard: {
        name: 'ground',
        color: 'brown',
        every: 0.8,
        speed: 300,
      },
      ramp: 0.02, // 2% harder every 10 jumps
      palette: {
        background: 'lightgray',
        ground: 'brown',
      },
      juice: {
        onVerb: { sound: 'jump', particles: 10, shake: 0.5 },
        onScore: { sound: 'score', particles: 5, shake: 0.2 },
        onFail: { sound: 'fail', particles: 20, shake: 1 },
      },
      checks: [
        'player hits the ground',
        'idle player jumps at least 10 times',
        'mashing player jumps 5 times',
        'smart bot jumps 20 times',
      ],
    }
    ```
    
    ## Engine Code
    
    ```javascript
    // engine.js
    import game from './game.js'
    
    // setup canvas and audio
    const canvas = document.getElementById('canvas')
    const ctx = canvas.getContext('2d')
    const audio = new AudioContext()
    
    // define game state
    let playerY = 0
    let groundY = canvas.height
    let score = 0
    let jumpCount = 0
    let ramp = game.ramp
    
    // main loop
    function update() {
      // update player position
      playerY += 5
    
      // check for collision with ground
      if (playerY + 20 >= groundY) {
        // game over
        console.log('Game Over!')
        return
      }
    
      // update score and jump count
      score++
      jumpCount++
    
      // check for ramp
      if (jumpCount % 10 === 0) {
        ramp += game.ramp
      }
    
      // update game state
      ctx.clearRect(0, 0, canvas.width, canvas.height)
      ctx.fillStyle = game.palette.background
      ctx.fillRect(0, 0, canvas.width, canvas.height)
      ctx.fillStyle = game.player.color
      ctx.fillRect(50, playerY, 20, 20)
      ctx.fillStyle = game.palette.ground
      ctx.fillRect(0, groundY, canvas.width, 20)
    
      // draw score
    
    
    The checker refused it:
    - Not valid JSON: Expected property name or '}' in JSON at position 4 (line 2 column 3)
    Fix exactly those problems. Reply with the corrected answer only.

    Output

    ```javascript
    // game.js
    export default {
      "title": "Jump",
      "pitch": "Jump and survive",
      "verb": "jump",
      "player": { "color": "blue" },
      "hazard": {
        "name": "ground",
        "color": "brown",
        "every": 0.8,
        "speed": 300
      },
      "ramp": 0.02,
      "palette": {
        "background": "lightgray",
        "ground": "brown"
      },
      "juice": {
        "onVerb": { "sound": "jump", "particles": 10, "shake": 0.5 },
        "onScore": { "sound": "score", "particles": 5, "shake": 0.2 },
        "onFail": { "sound": "fail", "particles": 20, "shake": 1 }
      },
      "checks": [
        "player hits the ground",
        "idle player jumps at least 10 times",
        "mashing player jumps 5 times",
        "smart bot jumps 20 times"
      ]
    }
    ```
  3. attempt 3 @cf/meta/llama-3.1-8b-instruct-fp8-fast

    max_tokens 700, temperature 0.6, seed 7 · 2026-10-14 21:57 UTC · 1.3 s · 17.6 neurons · cache 808b1831ab80

    System text (6,501 characters)
    Follow this skill:
    
    ---
    name: game-design-brief
    description: Turn a game idea ("add minesweeper", "make a game about X", "more games") into a one-page brief before any code - the one verb, what the player sees, how a run ends, the difficulty ramp, controls on keyboard / mouse / touch, scoring and best, every feedback moment (sound + visual), which kind of game it is on games.slopped.site (registry canvas, DOM table, standalone folder, own subsite), its name and deadpan copy, and measurable acceptance targets for the playtest bots. Use at the start of any new game or a big change to one, and when handing a game to a subagent (the brief is the hand-off).
    ---
    
    # Game design brief
    
    A game built from a one-line request comes out generic: "a fun game" averages every game the machine has seen, which is what pathway 3 of the Slop Curriculum teaches and what the Slopwright complains about. Write this brief first, in the conversation or in the subagent's prompt. It takes five minutes and decides everything the code would otherwise decide by default.
    
    ## The brief (fill every line)
    
    ```
    Name:            plain or a dry pun; no trademarks (Blocks, not Tetris; Mines, not Minesweeper is fine either way)
    One verb:        the single thing the player does (flap, steer, drop, swipe, match). If it needs two, pick one.
    Pressure:        what makes the verb hard right now (a gap closing, a timer, the pile growing)
    A run ends when: the fail state, or the win state for a puzzle; how long a first run lasts (target)
    Ramp:            what rises with score/time, from what to what, and where it stops rising
    Screen:          what's on it at a glance; what the player must read in under 1 s
    Controls:        keyboard / mouse / touch, each one line. Touch is gestures on the canvas, not on-screen arrows.
    Score & best:    what scores, what a good score is, what's saved (best, wins, fastest, today's)
    Feedback:        every event → sound + visual (score, combo, near miss, fail, new best, level up)
    Seed:            endless random, daily (YYYYMMDD), or shareable seed; how fairness is guaranteed (game-procgen)
    Kind:            registry canvas | DOM table | standalone folder | own subsite (below)
    Copy:            card subtitle (< 45 chars, deadpan), instructions (plain), touch instructions
    Done when:       playtest targets (below) + phone screenshot looks right + check.mjs passes
    Not doing:       what's out of scope this round (levels, online scores, accounts…)
    ```
    
    ## Which kind of game
    
    | Kind | When | Where it lives |
    | --- | --- | --- |
    | **Registry canvas** | one screen, one verb, endless or short: Flappy, Snake, Stack, Blocks | an entry in `GAMES` in `games/public/games.js` (480×600 canvas, shared loop, HUD, bests, touch gestures). See `slopped-games` |
    | **DOM table** | turn-based, lots of discrete things to tap, needs accessibility per item: Solitaire, FreeCell, puzzles | `table: '<id>'` + its own IIFE file (`cards.js`, `puzzles.js`) exposing one global |
    | **Standalone folder** | its own menus, levels, controls schemes: SK8 2026 | `games/public/<name>/index.html` with a link back to `/` |
    | **Own subsite** | its own world and identity, 3D, many assets: Backrooms | `slopped-subsite` checklist |
    
    Pick the smallest kind that fits. Most ideas are registry games.
    
    ## Acceptance targets (measured, not felt)
    
    From `game-playtest` (write the smart policy as part of the game):
    
    - Idle player: no free points; at least 1.5 s before the first unavoidable threat (genre exceptions noted in `PLAYTEST_META`).
    - Mashing: low score. The smart bot's median score is 5× the masher's or more.
    - Smart bot: median run 30–90 s, and runs **end** (endless < 10% at 120 s).
    - Every point scored makes a sound and a burst/floater (the audit checks).
    - `update()` well under 1 ms.
    - Phones: no sideways scroll at 390 px, nothing to aim at smaller than 42 px, works one-handed in portrait.
    - Generated content is fair over many seeds (`game-procgen`).
    
    Puzzles (tables) replace the run targets with: a solver or constructive guarantee that every deal/board is solvable (or say which aren't), and a first game finishable in a few minutes.
    
    ## Keeping the machine on the rails while building
    
    - Give the brief, the kind, the files it may touch, and the files it must not (another agent's work, `reference/`). Uncommitted work can't be rolled back, so ask for small edits, not rewrites.
    - Ask for the smart policy and the check results in the report, plus phone screenshots it has actually looked at.
    - One verb at a time: get the core loop fun (playtest numbers), then add juice, then the ramp, then copy. A machine asked for "polish" first adds confetti.
    - Things it will drift on unless told: trademarks in names, on-screen arrow buttons on phones, `Math.random()` inside a seeded generator, `100vh`, forgetting the main site's Games card and the counts.
    
    ## Example (illustrative: check games.js for what Blocks actually does)
    
    ```
    Name: Blocks · One verb: drop (place a falling piece) · Pressure: the pile grows, gravity speeds up
    A run ends when: a new piece can't spawn; first run ~1–2 min · Ramp: gravity per level (every 10 lines), capped
    Screen: the well, the next piece, held piece, ghost · Controls: ←/→ move, ↑ rotate, ↓ soft drop, Space hard
    drop, C hold | touch: drag to move, tap to rotate, swipe down to drop · Score: lines (1/2/3/4 → 100/300/500/800 × level)
    Feedback: lock (thud), line clear (rising chime + row flash), 4 lines (bigger), level up (flash), top out (crash)
    Seed: 7-bag random · Kind: registry canvas · Copy: "Lines go away. Nothing else does."
    Done when: smart bot clears lines and eventually tops out; idle tops out; no free points
    ```
    
    Then write the game for an engine that plays a game described as one JSON object. The format:
    A spec:
      title, pitch                  strings
      verb                          'jump' (a runner) | 'flap' (fly through gaps) | 'dodge' (move under falling things)
      player: { color }
      hazard: { name, color, every (s between spawns, 0.4–3), speed (px/s, 120–600) }
      pickup?: { name, color, every (0.5–6), points (1–50) }
      ramp                          % harder every 10 s (0–30): spawns come faster and move faster
      palette: { background, ground }
      juice: { onVerb, onScore, onFail }, each { sound, particles (0–40), shake (0–1) }
      checks: [ strings ]           what to test by playing
    Everything the engine needs, checked exactly. Returns the rubric rows the Worker uses, plus a flat error list.
    Reply with the JSON object only.

    User

    Write a tiny game where you jump.
    
    Your previous answer:
    ```javascript
    // game.js
    export default {
      "title": "Jump",
      "pitch": "Jump and survive",
      "verb": "jump",
      "player": { "color": "blue" },
      "hazard": {
        "name": "ground",
        "color": "brown",
        "every": 0.8,
        "speed": 300
      },
      "ramp": 0.02,
      "palette": {
        "background": "lightgray",
        "ground": "brown"
      },
      "juice": {
        "onVerb": { "sound": "jump", "particles": 10, "shake": 0.5 },
        "onScore": { "sound": "score", "particles": 5, "shake": 0.2 },
        "onFail": { "sound": "fail", "particles": 20, "shake": 1 }
      },
      "checks": [
        "player hits the ground",
        "idle player jumps at least 10 times",
        "mashing player jumps 5 times",
        "smart bot jumps 20 times"
      ]
    }
    ```
    
    The checker refused it:
    - "player.color": a hex colour like "#d9a35b".
    - "hazard": needs a "name" and a hex "color".
    - "palette": hex "background" and "ground".
    - "juice.onVerb": { "sound": blip|pop|chime|thud|zap|crash|none, "particles": 0–40, "shake": 0–1 }.
    - "juice.onScore": { "sound": blip|pop|chime|thud|zap|crash|none, "particles": 0–40, "shake": 0–1 }.
    Fix exactly those problems. Reply with the corrected answer only.

    Output

    ```javascript
    export default {
      "title": "Jump",
      "pitch": "Jump and survive",
      "verb": "jump",
      "player": { "color": "#d9a35b" },
      "hazard": {
        "name": "ground",
        "color": "#964B00",
        "every": 0.8,
        "speed": 300
      },
      "ramp": 0.02,
      "palette": {
        "background": "#F0F0F0",
        "ground": "#964B00"
      },
      "juice": {
        "onVerb": { "sound": "blip", "particles": 10, "shake": 0.5 },
        "onScore": { "sound": "chime", "particles": 5, "shake": 0.2 },
        "onFail": { "sound": "crash", "particles": 20, "shake": 1 }
      },
      "checks": [
        "player hits the ground",
        "idle player jumps at least 10 times",
        "mashing player jumps 5 times",
        "smart bot jumps 20 times"
      ]
    }
    ```