| name | kai-hook-bench |
| description | Generate, rank, and gate a reusable hook bank — sourced pains × named hook formula families, scored on clarity/specificity/curiosity/proof-backing, gated at the 10/16 ad threshold, delivered in 3 lengths with per-hook provenance and downstream routing. Use when "hook bank", "generate hooks", "hook generator", "write hooks for", "ad hooks", "scroll stoppers", "opening lines", "hook ideas", "first 3 seconds", "hook matrix", "I need 50 hooks", or any request to batch-produce attention-openers for ads, social, or video. |
Objective
A ranked, provenance-tagged hook bank that downstream skills can pull from without re-checking the claims: sourced pains crossed with named formula families, hooks matching a known loser pattern killed before they reach ranking, survivors scored and gated, and the top set delivered in three lengths with a source behind every claim. This skill produces the hook bank only. /kai-social batches full social posts, /kai-ad-campaign builds full ad campaigns, /kai-write writes single finished pieces, /kai-repurpose fans a pillar into derivatives — they consume this bank. Concept-level portfolio strategy (Persona × Desire × Angle bench, budgets, kill rules) belongs to knowledge/playbooks/combinatorial-creative-bench.md via /kai-ad-campaign; this skill fills the hook field of those bench rows.
Done when
Work type internal-research — floor E2/C2/O0 (harness/eco-floors.yaml). The bank is an internal asset; nothing here posts, uploads, or mutates a live channel, so SHIPPED is terminal and the outcome debt belongs to the consuming skill.
- E2 —
hook-bank.md exists and satisfies the declared structure: ranked, three lengths per hook, provenance line, routing line, plus the ledgers (_sources.md, _data-gaps.md, _proof-inventory.md, rejection-rules.md, rejects.md).
- C2 — the declared gates pass at their thresholds, stricter than this work type's default:
four_us_score at 10/16 and banned_word_check on the bank, plus every candidate run against the rejection rules and voice regexes.
- O0 — no outcome obligation. Hook performance is graded when a downstream piece hits its 30-day check.
Constraints
-
MARKETING.md first. Read it from the project root before asking discovery questions. If it does not exist, build it from the codebase (CLAUDE.md, README.md, PROJECT.md, package.json, landing pages, email/ad/analytics config) using the template carried in /kai-email-system, and confirm the draft. Do not ask the user what the product is.
-
Five inputs load before anything is generated:
Context
| Need | Load |
|---|
| Hook–Retain–Reward, 3-second paid rule, lead-magnet naming formula, Value Equation, content pillars, CLOSER "sell the vacation" | knowledge/people/alex-hormozi-knowledge.md ("$100M Leads" and adjacent sections) |
3-Second Rule, hook_type taxonomy (problem, proof, mechanism, contrast, offer, story, pattern interrupt), PAS/AIDA/BAB | knowledge/playbooks/ad-creative-best-practices.md |
| Angle types and the rule that a hook is an execution variable inside a P.D.A. concept | knowledge/playbooks/combinatorial-creative-bench.md |
| Persona hook lines and evidence status | knowledge/personas/_persona-index.md |
| Provenance modes and gap handling | harness/references/audit-data-provenance.md |
| Ad policy before any hook becomes an ad | .claude/rules/architecture-and-memory.md + harness/references/ad-write-guardrails.md (owned by /kai-ad-campaign) |
Seven formula families — cite the exact source section per family in formula-library.md, with 2-3 fill-in patterns and the family's known failure mode:
| Family | Mechanism | Grounding |
|---|
pain-callout | Name the specific sourced pain in the reader's language | Hormozi "direct problem identification"; PAS Pain step; persona-index hook lines |
identity-callout | Name who this is for so the persona is obvious in 3 seconds | Hormozi paid-ads hook rule ("appeal to identity or location"); bench persona-clarity score |
dream-outcome | Lead with the vivid destination, status-aware, not the feature | Value Equation numerator; CLOSER "sell the vacation"; BAB After step |
proof-led | Open with a real result, demo, or named example | "Certainty of outcomes"; hook_type: proof; TikTok proof-first hook (knowledge/channels/tiktok-algorithm.md) |
curiosity-gap | Bold or counterintuitive claim that opens an unresolved question | Hormozi content pillar "counterintuitive takes" + Retain mechanics; AIDA Attention |
common-mistake | Contrast what the ICP does wrong with what works | Hormozi content pillar "common mistakes"; hook_type: contrast; bench contrast angle |
speed-effort | Collapse the Value Equation denominator: outcome + timeframe + low effort | Lead magnet naming formula; MAGIC Interval; Time Delay / Effort & Sacrifice variables |
Known degenerations to name per family: common-mistake collapses into the banned binary-contrast cliché; curiosity-gap into clickbait the body cannot reward; speed-effort into unsubstantiated timeframe claims that fail the compliance pass.
Generation matrix. N hooks per pain × family cell (default N=2; top 5 pains by frequency signal gives up to 70 candidates). Each candidate records hook_id (HB-{pain#}-{family}-{nn}), pain row ref, persona, family, draft text, proof ref (or none), and target platforms. Ranking rubric: 0-2 per dimension (0 = fails, 1 = weak, 2 = strong), ranked by total /8, ties broken by winner-adjacency, each score justified in a phrase citing the pain row or proof ref:
| Dimension | 2 means |
|---|
| Clarity | Understood in one read, works out of context, no setup needed |
| Specificity | Named persona/situation/number — could not be about any product |
| Curiosity | Opens a question the reader needs the next line to close |
| Proof-backing | Claim is backed by an _proof-inventory.md row or sourced pain quote |
Bank entry format — the top ~25-30 hooks, ranked, each written as ### #3 · HB-2-proof-led-01 (score 7/8) followed by five lines: short (overlay / one-liner, ≤ 60 chars — fits every ceiling above), mid (caption / primary text, ≤ 125 chars — Meta primary-text ceiling), long (opener, 1-3 sentences, ≤ 210 chars before the fold — LinkedIn/long-caption first lines), provenance (pain # with source URL/path and date · family · proof-inventory row · persona with evidence status), and routing (the consuming skill and placement, e.g. /kai-ad-campaign Meta TOF · /kai-social TikTok overlay). The three lengths carry the same promise — same pain, same claim, no escalation of the claim as length grows.
Consumer routing — append this table to the bank:
| Consumer | Use | They own |
|---|
/kai-social | short + mid as post/overlay openers | full post body, hashtags, schedule; contract harness/skill-contracts/social-post.yaml |
/kai-ad-campaign | short as ad headline seed, mid as primary text seed, hook_id fills the bench row's hook field | platform policy check (per-platform table in .claude/rules/architecture-and-memory.md + harness/references/ad-write-guardrails.md), funnel mapping, upload |
/kai-write | long as first-line/opener for single pieces (script, email, article) | framework, contract, full draft |
Output — workspace/hook-bench/: _sources.md, _data-gaps.md, _proof-inventory.md, data/ (collector output, if mined here), pain-inputs.md (only when workspace/offer-builder/pain-table.md is absent), rejection-rules.md, rejects.md, formula-library.md, generation-matrix.md, _gate-report.md, hook-bank.md. Hand-offs — do not re-specify these jobs: pains not yet mined → /kai-offer-builder (its pain table is this skill's preferred input); proof library missing or stale → /kai-proof-builder, customer-story proof → /kai-case-study; ongoing pain listening → /kai-reddit-listen; hooks into posts → /kai-social, into ads → /kai-ad-campaign, into single pieces → /kai-write (brief first via /kai-brief); independent re-gate of the bank → /kai-gate; diagnosing underperforming hooks after 30-day grades → /kai-retro.
Feedback loop. When downstream 30-day checks grade a hook-led piece, winners feed knowledge/playbooks/what-works.md automatically; graded underperformers get their hook family or pattern diagnosed into memory/what-doesnt-work.md via /kai-retro, which tightens rejection-rules.md on the next run.
Escalate when
- No pain can be sourced — the bank would be invention rather than generation.
- The proof inventory is empty but the request is specifically for proof-led hooks, or a hook the user wants makes a claim no source supports or a timeframe/results claim that would fail platform policy or advertising law.
- Two gate retries failed on the same dimension, or every candidate in a family dies to the rejection rules (the angle itself is a known loser).