review-desk · git:20261104.00e047d · 2026-11-04 · sha256 bdc38ed5b7c0daed

review-desk git:20261104.00e047dB

Immutable. This exact content never changes and is served at /api/v1/blob/bdc38ed5b7c0daed.

---
name: review-desk
description: Optional. Open the Reel Studio desk (a local review app) and work from its review notes - notes pinned to frames, renders, approvals. Use only when the person asks for the desk or already uses it - "open the desk", "apply my desk notes", "fix what I marked", "what's on this frame" - or a production has a review.json. Never required: reviewing and approving in chat works the same.
---

# Review desk (optional)

The kit works the same without it: storyboards are approved in chat, and QA is the `make-video` steps. Don't start
the desk or suggest it unless the person asks, or they already use it (a `review.json` in the production).

The desk (`desk/`) is a local page for the person: it plays a production's composition frame-exact through the
renderer's own clock (`__seek`), and lets them pin notes to frames, render stills, preview videos and QA, read the
storyboard, approve, and send notes to a coding agent. It only reads and writes files in the project, so everything it does
reaches you as files (and, if it is registered, through the `reel-desk` MCP server).

## Open it

`node desk/server.mjs` (run it in the background), then the person opens <http://127.0.0.1:4100>. In the Claude
desktop app, open that URL in the browser pane; elsewhere, give the person the URL. `npx reel-studio desk` does the same. Port: `--port <n>`.

The `reel-desk` MCP tools below are not registered by default. If they aren't available and the person wants them:
Claude Code: `claude mcp add reel-desk --scope project -- node desk/mcp.mjs`; Codex:
`codex mcp add reel-desk -- node desk/mcp.mjs`; Copilot: add it to `.vscode/mcp.json` or the Copilot CLI's
`/mcp add` (then restart the session). Without them, read and
write `review.json` directly.

## Where things are

| | |
|---|---|
| Notes and approvals | `productions/<brand>/<ID>/review.json` (tracked in git: it is the review record) |
| What the person has open | `desk/.state.json`, or the `desk_state` tool |
| Desk renders | `productions/<brand>/<ID>/qa/desk/` (stills, `preview.mp4`, `qa/`); never the delivered export |

## Working from notes

1. `desk_state` tells you which production and time "this frame" means. `list_notes` gives the open notes
   (`id`, `t` in seconds, `text`). Without the MCP server, read `review.json`.
2. For each note: change the composition, check it with `render_frame` at the note's `t` (or
   `node core/render.mjs still … --t <t>`) and **look at the image**.
3. `resolve_note` with a one-line reply saying what changed. If a note needs a fact, an asset or a decision you
   don't have, keep it `open` and put the question in the reply. Only the person closes notes (after checking).
4. Your own QA findings can go on the timeline too: `add_note` (they show as by `claude`, the desk's name for any agent).

The desk's **Send to agent** button runs exactly this loop headlessly with the person's own login: Claude Code
(`claude -p`, `ANTHROPIC_API_KEY` removed, tools limited to read/edit/render/QA and `reel-desk`) or Codex
(`codex exec`, workspace-write sandbox, `OPENAI_API_KEY` removed), picked with `REEL_AGENT`. One session per
production (`review.json` → `claude.session` / `codex.session`).

## Approvals are the person's

The desk's **Approve storyboard** ticks `- [x] Storyboard approved` in the production README and fills
*Approved by / date*; **Approve final cut** adds a final-cut line. Both are logged in `review.json` → `approvals`.
**Never write an approval yourself**, in the README or in `review.json`, and never treat a fixed note as approval.
When a storyboard is ready, say "it's in the desk for approval" and stop (golden rule 2).