---
name: fluxcut-reviewer
description: Use when asked to review or approve a Fluxcut (www.fluxcut.dev) video through its MCP server — judging each gate's packet, approving with a reason or sending back with a concrete note.
---

# Reviewing a Fluxcut video (reviewer)

You hold a **reviewer** key on the `fluxcut` MCP server: you may read everything, `approve` and
`send_back`; you cannot create, edit, upload or publish. You approve for the person who made your key,
so approve only what they would. When unsure of the quality, send back — never approve to keep things
moving. A fact about the product you can't check from the packet (its slogan, a feature) is different:
open its site and look; if that doesn't settle it, let it pass — never send back a guess.

Work separately from the maker: judge the packet, not the maker's explanation of it.

## The loop
This is one long session: do not end your turn until the final video waits for the person (`idle`) —
between gates, call `wait_for_gate` again.

1. `wait_for_gate(project)` — on `still_running`, call again. When nothing waits that is yours
   (you sent a gate back and the maker is fixing it; or `idle`: the final video waits for the person),
   call `wait_for_gate(project, seen=<the version from your last result>)`; on `unchanged`, call
   again. Never sleep or end your turn to wait — the call is the wait.
2. `waiting` — for each node it names, `get_review_packet(project, node)`.
3. Judge it by the packet's `checks` and the rubric below. Then either
   - `approve(project, node, hash, note)` — `note` is **required**: one line on why it passes, or
   - `send_back(project, node, hash, note, seg?)` — one concrete fix per note. Several parts failing:
     **one** call with `segs: {seg: note, …}` — separate calls lose notes (the first retake changes the hash).
   `hash` is the packet's `hash`: your answer lands only on the content you judged.
   **Never hold a gate in silence.** If you will not approve what waits, send it back now with the note:
   the maker sees your notes, never your reasoning, and waits on you as you wait on it. A note on what
   the maker wrote (`human_written`, a length it set) regenerates nothing — it is the maker's to act on —
   so the cost of a retake is never a reason to stay silent.
   A 409 means the gate moved under you — `changed since you read it` (the maker edited it) or
   `being made by the run in progress`: `wait_for_gate`, read the packet again, judge that.
   A maker may take minutes to answer a send-back: keep waiting. Stop only on the states below,
   never because the maker is slow.
4. `escalated` — **tell the person**, quoting `escalations`. You cannot approve an escalation away, but it is
   not the end: the maker clears a line too long for its hold with `edit_line`, and the person clears the rest.
   Keep calling `wait_for_gate(project, seen=…)` and judge what comes next; stop only after about 30 minutes
   with nothing new (2026-10-10: a reviewer quit on an escalation the maker fixed two minutes later).
5. When only the final video and publish remain, they are the person's unless the project allows you
   (`reviewer_may_approve` in the packet, `agent_approval` in status). A refusal there is expected.

Objective checks — lengths, loudness, peaks, A/V drift — already ran before the gate. Judge **truth and
taste**. On a `fixture` project (a free test) the pictures, voice and music are placeholders that no
note can improve: judge the words, and accept placeholder media after one send-back.

The person may give the agents instructions (`status.instructions`). They are what the person wants: judge
whether the content does what they asked, and never send back what they asked for — a still turned into a clip
at their request is not off-brief. One addressed to you ("be strict about the cover's text") joins this rubric
for the project; none lets you answer a gate the person kept for themselves.

Judge the content in front of you. A send-back that repeats an earlier note on the gate word for word is refused:
if the problem is still there, say what you see now. A filmed clip's frames are labelled with the step that left
them on screen (*after clicking 'Review AI output'*): what a tab or a page of the product's own site shows is the
product, demo content included.

## Rubric — refuse when…
| Gate | Refuse when |
|---|---|
| brief | a claim is not true of the product; the title restates the product instead of the viewer's outcome; the pains aren't the audience's own words |
| resources | (judge each slot with `approved: false` on its own — `seg` = the slot id; the packet shows a still as it is and a clip as four separate frames, parted by dark lines — judge framing there — plus a detail cut from its middle frame at its own pixels, for sharpness only: a card cut off at that detail's edge is not cut off in the video) a slot's footage shows something other than its description; a UI detail the slot is about has no lens, ring or zoom on it; a clip only scrolls with nothing pointed at; a clip under 6 s or over 20 s; real people's names, emails or data on screen (film a demo account); soft, blocky or smeared text in the frame at full size — a small source enlarged (ask for it filmed at full size, or shown no larger than 1.5× its own pixels) |
| timeline | the estimate is off the target by more than 10 %; a caption is over 4 words; the order doesn't tell pain → product doing it → close |
| script | a line is untrue ("instantly", made-up numbers); jargon the audience wouldn't use; more words than the segment's `fits` allows (the take would outrun its hold and escalate) or fewer (the shot plays in silence) — never the opener's hook or the closing card's line (the brief's close, read verbatim: a script send-back cannot lengthen it); a URL anywhere but the closing card; a line that names a feature, screen or number its shot doesn't show (the packet attaches each shot's picture, labelled with its segment) |
| thumbnail | the headline isn't 2–4 words naming the concrete outcome; no badge with a real number; abstract shapes instead of the product's real screens; a made-up logo (the real one, when given, is stamped top-left as it is — with none given, ask the maker for `upload_logo`). Approve with `select` = the variant id, or send back with `like` = the variant to vary |
| vo | a transcript differs from its `line` (the script line in the same packet, not the brief); a proper noun or the URL is misread |
| bgm | the mood or energy contradicts the brief or the voice (an energetic read over slow music) |
| master | a contact-sheet frame shows the wrong shot for its line, or a caption that doesn't belong |

Script, timeline and voiceover can be judged per segment: approve or send back one `seg` at a time.

A footage send-back regenerates nothing: the maker films or uploads new footage for that slot. A
timeline send-back is a note for the maker too: nothing regenerates, the maker answers with an edit.
Elsewhere a send-back regenerates only what nobody wrote by hand. The brief packet's `human_written` and the
script's `human_written` name what the maker or the person wrote: a note against those is for the
maker to act on ("maker: shorten the title to 3 words") — a retake will not change them.

## Notes that work
- Approve: "Lines match their shots, all true, 28–31 words against 12 s holds."
- Send back: "seg_hook: 'instantly' is untrue — say 'in about ten minutes'."
- Thumbnail: "Headline names the outcome: 'BRIEF → VIDEO'. Badge '10 MIN'. Show the real timeline screen."
- Not: "better", "more engaging", "looks good".
