Creative rounds
Generated pictures and clips are cheap to make and expensive to choose between. This skill runs the choosing: every round of options goes onto one published page, the reviewer writes on the page, and the next round is built from what they wrote.
The tools are in tools/ beside this file. They build self-contained HTML pages from JSON
manifests. Run them with python3 (Pillow required; ffmpeg for video posters). This skill never
calls an image or video generator: use whichever one the user has, then put its output on the page.
The flow
project
├── Sketch 3–5 different ideas per round, drawn cheaply (pencil-sketch style, lowest price tier)
│ └── rounds comment · Lock · Drop on every card → next round
├── Hi-fi only the Locked sketches, rendered properly; two takes per open question
│ └── rounds same controls; for film work: anchor stills first, then clips in the review room
└── Production the Locked hi-fi design, cut for every surface it runs on
└── rounds one row per surface (feed, story, LinkedIn, listing...), shown inside a mock of the surface where one exists
The phase names are the default. A manifest can name its own with "phases".
Rules for every round
- One page per project, same address every round. Rebuild and republish to the same slug. Make a new address only when the user asks for one.
- Newest round on top. Earlier rounds stay on the page, folded (
"fold": "closed"on a strip;"open": falseon a review-room round). Nothing is deleted while a choice is open. - Every card has a name a person can say. Name a card by the one thing that sets it apart, in plain words: "warm table", "cool table". The reviewer refers to cards by these names, so never use codes like "option B" or "v3".
- A sketch round shows 3 to 5 different ideas unless a comment asks for fewer. Different means different ideas; five crops of one idea is one idea.
- Every card and every row carries a comment box, a Lock and a Drop. Lock and Drop exclude each other.
- Read the page before building the next round. With a notes store configured:
curl -s <notes_api>/v1/<slug>/text. Comments come back grouped by round, locks under "Locks" as LOCKED, drops under "Drops" as DROPPED. Never ask the user to paste comments you can read. Without a store, ask them to press Copy all notes and paste. - Build the next round from what you read:
- LOCKED stays exactly as it is. Never regenerate a locked item.
- DROPPED is not shown again.
- Everything else is reworked from its comment. A comment changes the prompt itself (the idea, the framing, the count); it is never pasted onto the end of the old prompt.
- New cards may be added.
- Fold locks and drops into the manifest (
"locked": true,"dropped": true) so they survive the rebuild. The manifest is the state between sessions. - A reworked card keeps its earlier version folded underneath (
"before").
- Check the phase first. The switch at the top of every page belongs to the project.
Read it with
curl -s <notes_api>/v1/<project>/text(group "Phase"). Move to the next phase only when the current one has Locked cards; render the next phase from those cards only. - Price before you generate. State the cost of a round before running it, and ask before spending more than the user's threshold. Decide on sketches; render finals once.
- One link per round in your reply, plus one line on what changed. The page carries the rest.
What the user says, and what it means:
| They say | Do |
|---|---|
| "reroll", "try again", "next round" | Read the page, rebuild the current phase from the comments (rule 7), republish. |
| "move forward", "go hi-fi", "go to production" | Check there are Locked cards, render the next phase from them, set "phase", republish. |
| "I left comments" | Read them (rule 6) and say back what you understood in a few lines before spending anything. |
| "cut it for ..." / "slice it" | Production: tools/slice-surfaces.py, then a row per surface. |
If a brief asks for something that cannot be true or cannot physically happen, say so in one sentence and build the corrected version. After one "no" on a design direction, ask what reference the user has in mind before trying again on your own taste.
Which page tool
| Tool | Use it for | Reference |
|---|---|---|
tools/storyboard-sheet.py |
Options as rows of cards (strips), and storyboards with beat tables (scenarios). The default page for Sketch, Hi-fi stills and Production. |
references/manifests.md |
tools/anchor-sheet.py |
Film work: one still per beat, takes behind a switch, a locked scene shows only its chosen take. | references/anchor-frames.md |
tools/review-room.py |
Rounds of clips (and stills): every take named, comment + Lock + Drop beside each, frame-precise player. | references/manifests.md |
tools/slice-surfaces.py |
Production: cut one locked picture into content surfaces and get a ready row of cards. | references/production-surfaces.md |
python3 tools/storyboard-sheet.py project/concepts.json --out build/concepts.html # build
python3 tools/storyboard-sheet.py project/concepts.json --out build/concepts.html --publish # build and put live
A complete worked example, with placeholder art drawn in code: examples/demo/
(python3 examples/make-demo-assets.py first).
Video: notes that point at a frame
In the review room the reviewer scrubs with the pointer (Shift gives a fine ±0.5 s window), steps
single frames with the arrow keys, marks in and out, and loops the marked part. Note the frame
writes [Take name · frame 51 · 0:02.125] into that take's comment; note the marked part
writes the range. Treat these as exact: when a note says a clip is right up to a frame, keep
everything before that frame and change only what follows. Once the user approves a passage of a
film, later rounds never touch it (the film locks forward).
For each note on a clip or still, make two takes that differ in one named thing, so the comparison answers one question.
Read when needed
references/flow.md— the whole process in detail, phase by phase, with the project folder layout.references/manifests.md— every manifest key for the three page tools.references/production-surfaces.md— the surfaces, their sizes, crop or re-render, surface mocks.references/sketch-prompts.md— a prompt block that makes any image model draw a flat pencil sketch.references/anchor-frames.md— locking stills before paying for motion.references/setup.md— one-time setup: the notes store (a small Cloudflare worker) and publishing.
Setup check
Before the first round, look for creative-rounds.json (in the project folder or above it) or
~/.config/creative-rounds/config.json. If neither exists, the pages still build and work:
comments stay in the reviewer's browser and travel by Copy all notes. Offer the setup in
references/setup.md once; do not block on it.