# Critique and fix

> A fresh session looks at the draft and reports findings with a second, a frame and a fix. The author fixes them.

Canonical: https://vawe.dev/docs/critique

At the end of this page a session that did not write the page has looked at the draft and ended with `PASS`. The author has fixed every finding on the way. These are stages 8 and 9 of the <Term id="loop">loop</Term>.

The author never grades their own film. Use a <Term id="fresh-session">fresh session</Term> for the <Term id="critique">critique</Term>. For a subagent, set `VAWE_AGENT=<name>`. A `VAWE_AGENT` label alone does not make a new session: run the critique in a separate terminal or agent. The default verdict is `REJECT`: the film passes only when the critic finds no reason to reject it.

## Steps for the critic

<Steps>
  <Step>
    ### Run the views

    ```bash
    VAWE_AGENT=critic bin/vawe critique films/hello/page.html
    ```

    The verb checks the page for animation traps. It then writes the phone sheet, the strip and the loop seam, and prints the measured deltas. It renders a draft first when the last one is old or has no sound. This takes 1 to 3 minutes.
  </Step>

  <Step>
    ### Look, in this order

    Write one line for each finding under each view.

    1. **Sheet.** Is the focal point clear in under a second? Is anything cramped or unreadable?
    2. **Strip.** Does each cut land on its beat? Does the eye know where to go after it? Does an exit run slower than its entrance?
    3. **Phone.** Can you read every string? Is the accent still one colour?
    4. **Loop or end.** Compare t=0 with t=duration. A loop is pixel-identical. An end holds long enough to read.
    5. **Checks.** Read the page-check findings and `bin/vawe check anim-traps <page>`.
    6. **Ideas.** Read the “Ideas” table of the brief. Does the frame show the chosen idea, or only the plan text? An idea that is in the ledger and not in the frames is a finding. So is a row whose four ideas are one idea in other words.
  </Step>

  <Step>
    ### Score the film

    ```bash
    bin/vawe judge films/hello/page.html --struct --runs A,B
    ```

    This prepares key frames and the rubric for a fresh session to score. `--struct --runs A,B` writes one rubric for each run. Two judges score the 12 criteria in `harness/lib/judge-codes.mjs`, and two runs close a beat. `--fresh` scores now with a separate headless `claude` session (about 30 s). It scores each axis of `guides/judge.md` from 1 to 10, and a score under 8 needs a fix. It advises and never blocks.
  </Step>

  <Step>
    ### Write the report

    Every finding names the second, the frame and the fix:

    ```text
    REJECT: 7 findings, top five first.
    1. [3.2s, frame 96] the stat lands on the same frame as the label; stagger the label 60 ms later.
       fix: films/x/page.html:88, delay 3200 -> 3260
    ```

    End with one line: `REJECT: <n> findings, the top five first.` or `PASS: I looked for a reason to reject it and found none. <one sentence on what is best>`.

    A finding with no file and line is a complaint, not a critique.
  </Step>
</Steps>

## Steps for the author

<Steps>
  <Step>
    ### Fix the top five

    Re-render only the seconds that the findings name.

    ```bash
    bin/vawe dev films/hello/page.html --from 3 --to 4
    ```
  </Step>

  <Step>
    ### Ask for a fresh critique

    Give the next critic the previous report. They check that each finding is fixed, not moved. Stop when the critique passes, or when two rounds in a row fix nothing that scores higher.
  </Step>
</Steps>

<Figure src="loop/critique-phone.webp" alt="Five small frames of the film at phone size." caption="The phone sheet: the film at 360 px wide, one frame a second." width="1456" height="414" />

<Figure src="loop/critique-strip.webp" alt="Twelve frames around the spectacle second." caption="The strip around the spectacle second." width="1600" height="680" />

<Figure src="loop/critique-loop.webp" alt="The last frame and the first frame side by side." caption="The loop seam: the last frame next to the first, with the pixel difference." width="1400" height="955" />

## What the critic looks for

1. Text that the viewer cannot read: low contrast, clipping, or a line that leaves too fast.
2. A beat with no focal point. If your eye does not know where to land, the viewer’s eye does not either.
3. A beat that is only type. Ask what it could show instead.
4. A frame that is static at the tail. Turn the world every one or two beats.
5. Two things that fight for attention.

If your eye catches a flaw, fix it. A green check run does not make the flaw fine, because the checks cannot see it. When a check asks you to make the film worse, suspect the check.

## What good looks like

* A critic names a default when they see one. The defaults are a particle burst, a bouncy spring, a glow, a logo slam and a centred title on a gradient. Others are everything fading in, corner labels, fake UI, and dead time with no waiver. Each is a rejection with a rule id such as `no-tells`, `overshoot` or `live-hold`. The ids are in `taste/README.md`.
* A <Term id="judge">judge</Term> verdict comes from a session that did not write the fix. A PASS is never self-recorded.

## Common mistakes

| What you see                          | Why                                    | What to do                   |
| ------------------------------------- | -------------------------------------- | ---------------------------- |
| The critic grades what the film meant | They read the brief and not the frames | Grade what is on screen      |
| The author runs the critique          | Same session as the authoring          | Start a fresh session        |
| The same finding returns              | It was moved, not fixed                | Compare with the last report |

## What to read next

  <Card title="Ship" href="/docs/ship">
    Stage 10: the final render.
  </Card>

  <Card title="Checks" href="/docs/quality-gates">
    The checks that run by name.
  </Card>

{/* sources (vawe d8481cc61):
  critique build steps and 1 to 3 min: harness/cli/verbs.mjs (critique)
  separate session, VAWE_AGENT=critic: harness/lib/critique-gate.mjs
  judge criteria: harness/lib/judge-codes.mjs JUDGE_CODES (12), guides/judge.md "Commands" and "The fresh judge" (1 to 10, under 8 needs a fix); Ideas view: skills/vawe-critique/SKILL.md "The judge"
  views, report shape, judge, defaults, stop rule: skills/vawe-critique/SKILL.md
  judge flags (--struct, --runs, --fresh): bin/vawe judge --help
  fresh session, VAWE_AGENT: AGENTS.md "Every step logs", skills/vawe-critique/SKILL.md
  */}
