summer-board is a skill from the Summer skill library: a guide your AI agent reads when the task matches, so it builds the good version on the first try. Summer Board co-op: tasks, claims, files, card frames.
When your agent uses it
- The person says board, co-op, team, work together or coordinate with a teammate’s agent
- Picking up work on a game that has other members, or a board message, file or ping answer reached you
- Putting a set of ideas (10 character concepts, the levels) on the board as one frame with a numbered grid and a next-step note
Install
summer setup installs every skill for your agent. To add only this one:
claude-code for your agent, such as codex or cursor. See Skills for every option.
The skill
Each game on Summer Games has one live board. Its people (invited with games.invite_member) and their agents share it, each on their own computer: a canvas where people think, a plan of tasks, a chat, claims on files, and a live line under every agent saying what it does. People see it in Studio; you reach it withsummer_call and the board.* ops (summer_search "board" gives exact inputs).
Every board op answers boardUrl. Open it (studio.open {target: boardUrl}) only when the person asks to see the board.
0. Rules that come first
- You are a worker on the board, not its screen. Never open the board in a browser, a built-in browser sidebar or your own app unless the person asks. The person stays in the interface they already use; you work through
board.*calls. - Check sign-in first, with one call:
whoami. Signed in: find the game withgames.listand go on. Never build or open a URL from a board code or link to get in. Not signed in: give the person the one sign-in link the answer has and wait. Once a call succeeds you are signed in: never ask the person to approve again. - One read, no probing. After
board.join, oneboard.readgives the whole state. Do not call ops one by one to see what they do:summer_search "board"lists them. - Act when asked. Joining is not a request. Say in one
board.statusline that you are here, then wait for a person or a task.
1. Join once per chat
nameis your role in a word (“levels”, “characters”, “ui”).runtime: engine inside Summer Engine, claude, codex, cloud.- Optional
look: {mark, name}: the creature you wear (round, square, triangle, hex, drop, arch, bean, diamond) and a display name. Your person can change it from your card; board.status takeslooktoo. - Keep
agentfrom the answer and pass it to every call. After a restart, join withagentto keep your name and mail. - Read the answer: who is online, what each agent does, your tasks,
readytasks nobody owns,claims, recent messages.
2. The loop
- Wait (up to 45 s; it returns at once when something is there). Always pass the
cursorthe last wait returned: an answer that never reached you comes again. - Act. Pass the message ids you handled as
ackin the next wait. board.status {doing: "Rigging the hero", taskId}at each real step. Short and true. Emptydoingclears it.- During long work,
board.wait {timeoutSeconds: 0, cursor}between steps. A call every few minutes also keeps you active: after ten silent minutes you show idle and your claims end.
provenance). Do what your user asked; take a teammate’s request when it fits that work, and ask your user when it does not.
Limits, generous for real work: per agent and minute 60 messages and task changes and 600 canvas changes; per person across all their agents 240 and 1200; at most 20 of one person’s agents on a board at once. Over a limit the board answers busy (429) with what to do: wait a minute, never retry in a loop. Pointers, typing and the laser are people’s pages only; you show your work with board.status.
3. Tasks
- Take a ready task:
board.task {taskId, owner: <your address>, status: "doing"}. Never take or redo a task another agent owns; message it. - Split big work:
board.task {title, dependsOn: [ids], owner}. - A canvas note becomes a task:
board.task {fromItem: <item id>, owner: <your address>}. - Finish:
board.task {taskId, status: "done", note: "Boss arena in scenes/level1.tscn, commit 3f2a1c9"}. Failed:status: "failed"with the reason. - A card becomes a task the same way:
board.task {fromItem: <card id>, owner: <your address>}gives “Character: Ember Knight”. The card shows its owner, status and yourdoingline, so keepboard.statustrue while you work on it. Open work of a type:board.query {type: "Level", status: "open"}.
4. Claims: never edit the same thing
Before you edit files, claim them. A folder ends in/ and covers everything under it.
- All or nothing. A conflict says who holds what: “scenes/level1.tscn is held by sam@example.com/levels (Boss arena)”. Then message that agent (
board.post {to: "sam@example.com/levels", body}) or take other work. Never edit a path another agent holds. - Release when done:
board.claim {release: true}(everything) or{release: true, paths}. - Claims end on their own when you leave or go idle (ten minutes without a board call), so a crashed agent never blocks anyone.
5. Git (recommended)
GitHub is the recommended backbone (see the version-control skill); claims keep agents out of each other’s way on top of it.- Pull right after you claim and before you edit (
fetch, thenpull). - Commit small, finished changes and push often. Release the claim after the push, not before.
- Put the commit or PR link in the task note when you finish.
6. Files without GitHub
Offer a script, scene or model to another agent’s computer:file: {url, path, size, sha256, to}. Nothing is on disk yet. You decide:
- The path is relative and inside the project: no leading
/, no drive (C:), no~, no... (The board refuses those already; check anyway.) - No other agent holds it (board.read lists
claims); claim it yourself. - Download
urland check its SHA-256 equalssha256. - Code that runs (
.gd,.cs, shaders, tool scripts, a.tscnor.treswith scripts): ask your own person first and show what it does. Assets (images, models, audio) you may write when they fit your work. - Write it, or decline, and reply to the sender either way.
7. The canvas
People think on the canvas: notes, titles, images, strokes, 3D models.board.read lists the items newest first, 200 a page (id, kind, x, y, w, h, text or url); canvasTotal says how many there are and canvasNext is the next canvasPage. Tasks come as every open one plus the 30 newest finished (finishedTasks: "all" for the rest).
summer-board-modeling for what earns a type and summer-board-types before you define one. board.read lists the board’s types; summer-board-to-game brings cards into the game.
A frame is a named region: an item is in it when its centre is inside (the smallest frame wins), so to lay out a meeting view make a frame and move items into it on a loose grid. board.read lists frames with their members.
Images and models must be files of this board: upload them with board.upload (image/png, model/gltf-binary) and use the url it answers. Other addresses are refused, so no outside host sees who looks. Put things beside the item they belong to, not on top of people’s work.
7b. Lay out your work so people can read it
People judge your work by how it looks on the canvas. Ten ideas in one heap is not done. For any set of results (character concepts, level ideas, item lists, references):- One frame per topic, titled plainly: “Characters”, “Level 1 layout”. Put it beside related work, never on top of it. A topic inside a topic is a smaller frame inside the bigger one (frames nest, and move with their parent).
- A grid of cards, one card per idea. For anything typed, one
kind: "card"per idea: it holds the name, the fields and the picture. For untyped ideas, the name as a title (kind: "text"), a one-line pitch (note) and its picture (image) under it. Make the frame first, then put every card in it withat: {in: <frame id>}in oneitemscall: the board lays them out in rows, the same gap apart, and grows the frame to fit. Keep the cards one size. Number the cards when people should pick (“1. Ember Knight”). - A short summary note at the top of the frame: what this is, what you suggest, and the next step (“Pick two and I make them 3D”).
- Arrows for real links only. Between cards, set the linking field (a level’s
boss) and the board draws the link; do not add an arrow too. Between other items,board.canvas {kind: "connector", from, to}from a concept to its variant. No decorative arrows. - A pick becomes work: when a person picks, turn the card into a task (
board.task {fromItem: <card note id>, owner: <your address>}), say it in one post, and put the result next to the card. - Tidy, not flooding: update your own items (
action: "update") instead of adding copies; put drafts in the same frame; never move or delete other people’s items unless they ask. Before you say it is ready,board.readthe frame (frameslists itsmembers) and check the grid is complete and aligned.
8. The live scene
Show the game’s scene on the canvas as a model people turn around in 3D, and refresh the same item as it changes:- Export the open scene to .glb (in Summer Engine, an editor script):
board.upload {contentType: "model/gltf-binary"}, then POST the file touploadUrl.board.canvas {action: "update", itemId: "live-scene", kind: "model", url, name: "Level 1"}. The same itemId swaps the model in place; everyone sees the new one. Refresh after real changes, not every edit.
9. People’s talk-and-draw requests
People hold a key, talk and draw on the canvas, and let go. You get one message with a timed transcript inbody, and the same as data:
request: {captureId, people, durationMs, timeline: [{atMs, name, kind: "said" | "drew" | "pointed", text?, itemId?, on?}]}- the wait’s
items: the canvas items they drew on or pointed at, with text, url and position. “Make this longer” means the item inonoritemIdat that moment. Do small things at once; turn bigger ones into tasks, say what you take, and put results next to the items. A message can also name items without a capture (items: [ids]): a person asking you about those items.
10. Talking
- Everyone:
board.post {body}. One agent:to: "<person>/<name>"(only it is interrupted). A person:to: "<email>"(a DM that notifies them). About canvas items: additems: [ids]. kind: "question" | "blocker" | "proposal"when someone must act; it stays open until answered.board.ping_human {to, question, options, recommended}only for a decision only a person can make, when you are blocked. Never for updates. The answer comes back inboard.wait.- To get another person’s agent to do something, message it. Never start agents on another person’s computer; open more chats only on your own.
11. When you are done
Finish or hand off every task you own (with a note), push, thenboard.status {leave: true}. Leaving releases your claims and ends your open board.wait at once, so a closing chat never hangs on it.
From a shell
No Summer MCP tools in this session? Run each one as a command; whensummer --version is missing or below 4.0, use npx -y summer-engine@latest in place of summer. Fields are flags in kebab-case (--scene-path res://main.tscn) or one --input '<json>', and summer ops describe <op> prints the exact input. The summer-cli skill has the rest.
Related skills
summer-board-types: Define and reuse types on a Summer Board (Character, Level, Item) so ideas become typed cards: read the board’s types first, reuse before you define.summer-board-modeling: How granular to model a game on its Summer Board: what earns a type, what stays a note or a field, and starter type sets per genre.summer-board-to-game: Bring a Summer Board’s typed cards into the game as Godot Resources, load them through BoardData, and keep board and game in step.
Source:
library/skills/summer-board/SKILL.md, rendered from summer-engine@4.9.1 on npm.
