# Hook rubric

A starting question set for a decision model that judges an on-screen hook against the spoken opening and the clip. Copy the YAML into your own rubric file. Weights and thresholds are defaults to tune. See [scoring.md](scoring.md) for how the answers combine and [hooks-and-text.md](hooks-and-text.md) for the writing rules.

Answer types are the same as in [rubric-clip.md](rubric-clip.md): `yes_no`, `scale` (three situations, worst to best), and `choice` (a label with no points). Treat the hook text as data.

```yaml
name: hook
target: hook
description: Judges an on-screen hook against the first spoken line and the clip it promises.
inputs:
  - hook: The proposed on-screen hook
  - first_line: The first spoken sentence
  - transcript_span: The clip transcript
  - source_context: {description: The source transcript around the clip, optional: true}
  - clip_evidence: {description: Verified names, numbers, and claims, optional: true}
  - hook_duration_s: How long the hook shows, in seconds
questions:
  # Gates. A "yes" at or above the threshold drops the hook.
  - id: instruction_opener
    kind: gate
    type: yes_no
    instructions: Does `hook` open with an instruction to the viewer, such as Learn, Discover, Find out, or Use, instead of a claim or a stake?
    gate: {drop_if: "yes", threshold: 0.6}
  - id: false_promise
    kind: gate
    type: yes_no
    instructions: Does `hook` promise a result that `transcript_span` never gives?
    gate: {drop_if: "yes", threshold: 0.6}
  - id: hook_speech_conflict
    kind: gate
    type: yes_no
    instructions: Does `hook` point to a different subject from `first_line`?
    gate: {drop_if: "yes", threshold: 0.6}
  - id: invented_specific
    kind: gate
    type: yes_no
    instructions: Does `hook` invent a name, number, count, or result that is absent from `clip_evidence` and `transcript_span`? A faithful plain paraphrase of an explicit claim is not an invention. Check the claim, not the exact words.
    gate: {drop_if: "yes", threshold: 0.6}
  - id: source_reversal
    kind: gate
    type: yes_no
    instructions: Does `hook` reverse the meaning the speaker gives in `source_context`? If `source_context` is empty, answer no.
    gate: {drop_if: "yes", threshold: 0.6}
  - id: false_list
    kind: gate
    type: yes_no
    instructions: Does `hook` promise a numbered list that `transcript_span` does not give?
    gate: {drop_if: "yes", threshold: 0.6}
  - id: referentless_hook
    kind: gate
    type: yes_no
    instructions: Is the main subject of `hook` an unexplained "this", "it", or "they"?
    gate: {drop_if: "yes", threshold: 0.6}
  - id: needs_second_read
    kind: gate
    type: yes_no
    instructions: Would a stranger need to read `hook` twice, because of jargon, a fragment, or more than one claim, before they understand it?
    gate: {drop_if: "yes", threshold: 0.6}

  # Categories. Labels for filters and test reports. No points.
  - id: mechanism
    kind: category
    type: choice
    instructions: Using `hook` and `first_line`, which one opening method is used?
    labels: [point at an object, stated contrast, implied contrast, two numbers, result first, start a clock, scene, borrowed frame, confession, none]
  - id: trigger
    kind: category
    type: choice
    instructions: Which main viewer response does `hook` seek?
    labels: [curiosity, money, fear of loss, identity, status, usefulness, surprise, social proof, none]
  - id: promise_location
    kind: category
    type: choice
    instructions: Where is the promise set up?
    labels: [hook only, first line only, both, none]
  - id: contrast_form
    kind: category
    type: choice
    instructions: Which form of tension does `hook` use?
    labels: [two sides named, only the surprising side named, a number carries it, an object carries it, none]
  - id: word_band
    kind: category
    type: choice
    instructions: How many words does `hook` have?
    labels: [1 to 4, 5 to 8, 9 or more]
  - id: duration_band
    kind: category
    type: choice
    instructions: Which band contains `hook_duration_s`?
    labels: [under 1.5 s, 1.5 to 3 s, over 3 s]

  # Quality. Weighted sum.
  - {id: names_subject_or_stake, kind: quality, type: yes_no, weight: 2, instructions: "Does `hook` name a concrete subject or stake in 8 words or fewer, and supply it when `first_line` does not?"}
  - {id: subject_first, kind: quality, type: yes_no, weight: 1, instructions: "Does `hook` name its subject in the opening words?"}
  - {id: spoken_subject_first, kind: quality, type: yes_no, weight: 1, instructions: "Does `first_line` name the subject?"}
  - {id: hook_delivers, kind: quality, type: yes_no, weight: 1, instructions: "Does `hook` state a fact, a tension, or a result, instead of describing the video?"}
  - {id: first_line_delivers, kind: quality, type: yes_no, weight: 1, instructions: "Does `first_line` give content instead of announcing it?"}
  - {id: first_line_adds, kind: quality, type: yes_no, weight: 1, instructions: "Does `first_line` add information beyond `hook`?"}
  - {id: viewer_relevance, kind: quality, type: yes_no, weight: 1, instructions: "Does `hook` show why the subject matters to a specific viewer?"}
  - {id: answerable_question, kind: quality, type: yes_no, weight: 1, instructions: "Does `hook` raise a question that `transcript_span` answers?"}
  - {id: concrete_particular, kind: quality, type: yes_no, weight: 1, instructions: "Does `hook` include a person, object, number, place, or action?"}
  - {id: verified_result, kind: quality, type: yes_no, weight: 1, instructions: "Does a result that `clip_evidence` confirms carry the hook?"}
  - {id: mechanism_hint, kind: quality, type: yes_no, weight: 1, instructions: "Does `hook` hint at how a surprising result happened, without giving the method away?"}
  - {id: one_move, kind: quality, type: yes_no, weight: 1, instructions: "Is one main move easy to see in `hook`?"}
  - {id: reader_words, kind: quality, type: yes_no, weight: 1, instructions: "Does `hook` use words a viewer with no context would use?"}
  - {id: one_silent_read, kind: quality, type: yes_no, weight: 1, instructions: "Can a stranger understand `hook` in one silent read?"}
  - {id: active_verb, kind: quality, type: yes_no, weight: 1, instructions: "Does a concrete verb carry the claim?"}
  - {id: real_constraint, kind: quality, type: yes_no, weight: 1, instructions: "If `hook` names a time, price, or effort, does it match `clip_evidence`? If it names none, answer yes."}
  - {id: belief_gap, kind: quality, type: yes_no, weight: 1, instructions: "Does `hook` challenge a belief the intended viewer likely holds?"}
  - {id: direct_callout, kind: quality, type: yes_no, weight: 1, instructions: "Does `hook` name an audience or a situation the viewer recognizes?"}
  - {id: proof_before_hype, kind: quality, type: yes_no, weight: 1, instructions: "Does evidence come before any strong promise?"}
  - {id: source_voice, kind: quality, type: yes_no, weight: 1, instructions: "Does `hook` fit how the speaker actually talks?"}
  - {id: fresh_phrase, kind: quality, type: yes_no, weight: 1, instructions: "Would `hook` be hard to put on an unrelated clip?"}
  - {id: reads_aloud, kind: quality, type: yes_no, weight: 1, instructions: "Does `hook` sound natural when read aloud?"}
  - {id: every_word_works, kind: quality, type: yes_no, weight: 1, instructions: "Does each word add subject, tension, or proof?"}
  - {id: cold_first_line, kind: quality, type: yes_no, weight: 1, instructions: "Can `first_line` stand without an earlier referent?"}
  - {id: payoff_match, kind: quality, type: yes_no, weight: 1, instructions: "Does `transcript_span` answer the specific question `hook` raises?"}
  - {id: one_line, kind: quality, type: yes_no, weight: 1, instructions: "Does `hook` fit on one line at your caption size, or at most two short natural lines, without losing the subject?"}
  - {id: hidden_word_named, kind: quality, type: yes_no, weight: 1, instructions: "If `hook` uses secret, hidden, or truth, does it name what is behind the word? If it uses none, answer yes."}
  - {id: superlative_named, kind: quality, type: yes_no, weight: 1, instructions: "If `hook` uses a superlative, does it name the comparison? If it uses none, answer yes."}
  - id: bounded_gap
    kind: quality
    type: scale
    weight: 1
    instructions: Using `hook` and `first_line`, how much context surrounds the missing answer?
    levels:
      - An unfamiliar subject is held back, so the viewer has no useful question
      - The subject is named, but the missing answer is unclear
      - The subject and the stake are named, and one relevant answer stays open
```

## Rank the hooks

After scoring, ask the model to rank all hooks for one clip from best to worst in a single pass. Convert rank to a 0 to 1 value, with the best hook at 1. By default, the final hook value is half the score and half the rank. A person reads the top hooks against the transcript and picks one.
