Synced from virality/stages/02-candidates.md in content-extraction skill on 2026-05-18. Edit upstream in the skill; this file is overwritten on next sync.

Stage 2 — Candidates

5-7 decision-ready candidate clips. Equal-tier (no ranking). Script-forward — every candidate shows the verbatim concatenated text Daniel will hear, prominently. No analytical noise (Schwartzberg / 7-axis register / attention-preservation scorecards) in the visible output — those checks run as INTERNAL gates and only surface flags when failed.

Output file: <session>/candidates.md Hard cap: ~150 lines (5-7 candidates × ~20 lines each + cross-cut notes + pick table).

Why script-forward

Pre-2026-05-04 candidates.md format buried scripts under per-candidate Schwartzberg/register/attention sections. Daniel’s verbatim feedback: “ich sehe nicht wo irgendwie das gewicht der Extraktion liegt… wo sind die Skripts?” The fix: SCRIPT is the headline of every candidate card. Everything else is supporting metadata. The internal canon checks (Schwartzberg / register / attention-preservation) still RUN — they just don’t surface unless they fail a hard gate.

Required inputs

S2 refuses to run without:

  • <session>/source-analysis.md — S1 inventory (beat# table + tail-30s flags)
  • transcript.txt — verbatim contract source
  • Brand pack (_brand/pillars.md, _brand/voice-preservation.md, _brand/campaign-state.md)
  • Virality canon (references/shortform-virality.md, references/attention-preservation.md, references/essence-extraction-framework.md, references/aesthetic-register-anti-slick.md)

Output structure (fixed schema)

# Candidates — <session-id>
 
5 candidate clips. Equal-tier. Pick one or more: `/afriend-content-extraction --pick C-XX[,C-YY]`.
 
## Cross-cut
- **Pillar coverage:** <list of pillars + counts> — N distinct ✓/⚠
- **Duration spread:** tight Xs · standard Ys · deep Zs — N bands ✓/⚠
- **Tail-source openers:** N (or 0 with explicit reason: "tail-30s = outro-cta only; strongest reframes mid-source")
- **Heaviest beat reuse:** beats NN, NN, NN across <list of candidate IDs>. Stagger posting ≥3 days OR pick one primary per week.
- **[INTERNAL-GATE-FLAGS]:** only surface here if any check fails (e.g. "BRAND-NONNEGOTIABLE-VIOLATION on C-03 caption seed"). Otherwise omit.
 
---
 
## C-01 — <slug>
 
**Pillar:** <P-tag(s) + arc-shape descriptor> | **Format-fit:** <list> | **Duration: Xs** | **Arc:** <arc shape>
 
### Script
 
> <full verbatim concatenated text, blockquoted — what Daniel will HEAR in the cut, in order>
 
### Cuts
  - beat NN: source X.XX→Y.YYs · Zs
  - beat NN: source X.XX→Y.YYs · Zs
  - ...
 
### Why
<1-2 sentences max. Name the technique. e.g. "Tier-1 self-supplying contrarian categorical reframe; second-hook lands at clip-second 14 via tonal pivot.">
 
### Risks
<1 line: e.g. "Beat 09 reused in C-01, C-05 — stagger or pick one primary." OR "none">
 
### Pick: `/afriend-content-extraction --pick C-01`
 
---
 
[repeat per candidate]
 
---
 
## Pick table
 
| ID | Pillar | Duration | Arc | Format-fit |
|---|---|---|---|---|
| C-01 | <pillar(s)> | Xs | <arc> | <format-fit> |
| ... | ... | ... | ... | ... |

That’s the entire schema. Per-candidate card is ~20 lines max. The doc scans in <30s.

Diversity dimensions (sub-agent must spread across ≥3)

S2 enforces diversity. If candidates would all share a dimension, sub-agent re-arcs to spread.

DimensionVariants to spread across
Pillarmin 2 distinct pillars across the candidate set
Duration bandtight 12-25s / standard 25-50s / deep 50-90s — at least 2 bands populated
Arc shapetail-as-opener / curiosity-gap / categorical-reframe-standalone / vulnerability-pivot / vivid-image-then-vision / self-recognition + recursive — at least 3 arcs across set
Format-fitmin 1 non-default flagged (ugc-tease-candidate / karussell-quote-candidate / greenscreen-reaction-tease)

If source genuinely homogeneous, sub-agent emits 3-5 candidates with DIVERSITY-LIMITED note in cross-cut explaining why. Don’t pad.

Internal gates (sub-agent runs, doesn’t surface unless failed)

These checks run on every candidate. They DO NOT appear in candidates.md unless they fail:

Internal gateWhat it checks
Verbatim contractConcatenated script is verbatim substring of transcript.txt (whitespace-tolerant). Beat# refs guarantee this by construction since beat texts come from S1 inventory directly.
Banned vocabNo revolutionize, seamless, AI-powered, game-changer, leverage in surface text (titles, framing). Verbatim quotes may contain anything Daniel said.
Exclamation pointsZero in surface text outside of verbatim.
Two-beat cadence preservedReorders don’t break Daniel’s two-beat structures.
Code-switching preservedGerman/English mix in any quote stays exact.
Schwartzberg I-believe-thatEvery candidate’s arc reduces to one I-believe-that sentence. If not, candidate is incoherent — drop.
So-what testCandidate’s argument is contestable. If everyone reasonable would already nod, candidate is too obvious — drop.
Aesthetic register 7-axisPunchy/sharp/real/essence-loaded/considered/perceptive/illuminated. Two ⚠ axes = surface as “register-drift” flag in cross-cut, NOT per-candidate.
Anti-slick scanNo motivational-speaker / hustle-bro / TED build-up / brain-rot patterns. Hit = BRAND-NONNEGOTIABLE-VIOLATION flag in cross-cut.
Orphan-referent (Limit 6 Rule A, added 2026-05-04)Candidate’s opener OR close contains this/that/it/he/she/they without antecedent established within first 3s of clip body. Hit = ABSTRACT-FRAGMENT flag → DROP candidate OR auto-extend opener to include preceding beat that establishes the referent.
Duration-floor scaling (Limit 6 Rule B, added 2026-05-04)Candidate duration must be ≥ floor scaled by source length. Source <60s → ≥30%. Source 60-180s → ≥15%. Source >180s → ≥10%. Below floor = DURATION-FLOOR-FAIL → drop OR wrap with surrounding context. Prevents 8-second abstract fragments emitted from 172s context-rich source (the C-02 failure case 2026-05-04).
Tail-source biasAt least 1 candidate leads with tail-30s beat. If 0, surface “tail-source openers: 0 (reason)” in cross-cut.

If any internal gate fails on a candidate, the candidate is DROPPED (not surfaced) OR a single-line flag appears in cross-cut. Daniel doesn’t see the gate analysis.

Hard rules for S2

Equal-tier ranking

S2 does NOT recommend a “best” candidate. Each card stands alone. Diversity surfaces options; Daniel picks.

Verbatim quotes

Every quote in script (concatenated) is verbatim substring of transcript.txt by construction (beat# refs from S1 inventory). Sub-agent CANNOT synthesize. Light “and”/“but” word-bridges between beats are NOT allowed — beats concatenate raw.

Body-beat ordering

Body beats may be reordered relative to source, BUT:

  • Adjacent beats must flow audibly (Rule G — transition coherence). Mentally play the concatenated audio.
  • If a reorder would jam-cut, drop one of the offending beats OR insert a documented breath-beat note in the Risks line.

Tail-source bias enforcement (Rule A)

At least 1 candidate per candidates.md MUST lead with a tail-30s beat from S1’s auto-flag list — OR cross-cut explicitly states why none qualifies (e.g. “all tail-30s beats are outro-cta / transition; tail-as-opener arc skipped for this source”). Daniel’s strongest reframes statistically land in last 30s.

Pillar fit

Each candidate has exactly ONE primary pillar (or a primary + 1-2 anchors for multi-pillar arcs like P5+7+4). Surface in header as Pillar: P5+7+4 (vulnerability → overwhelm → reframe).

Duration computation

Duration: Xs is computed from beat durations:

duration = Σ (beat[i].end - beat[i].start)  for i in candidate.beats

NO pre/post-roll padding added at S2 stage. Phase 1 silence-tighten + cut_with_ffmpeg adds breath. Daniel sees raw beat-span sum so he can predict actual MP4 duration accurately.

Risks line (≤1 line, hard cap)

Acceptable contents:

  • “Beat NN reused in C-XX, C-YY — stagger posting ≥3 days OR drop one”
  • “Opener starts with filler — Phase 1 silence-tighten handles”
  • “Long-form (Xs) — Reels/TikTok only, NOT YouTube Shorts 60s cap”
  • “none”

If sub-agent would write a risk longer than one line, the candidate isn’t ready. Drop it.

What S2 deliberately does NOT show

  • ✗ Schwartzberg three-test verdicts per candidate (run internally; surface only on fail)
  • ✗ Attention-preservation scorecard per candidate (run internally; surface only on fail)
  • ✗ Aesthetic register 7-axis check per candidate (run internally; surface as cross-cut flag if drift)
  • ✗ Brand non-negotiables checklist per candidate (run internally; gate failure = block emission OR surface single-line flag)
  • ✗ Schärfung / Trim / Essenz operational analysis (canon valid; not visible noise)
  • ✗ Rationale prose paragraphs explaining why each beat was chosen (Why section is 1-2 sentences max, named-technique only)

The script is the headline. Everything else supports it on ≤20 lines per card.

Hard gates for S2 output

  • Hard cap ~150 lines total. Cards capped ~20 lines each.
  • 5-7 candidates (or 3-5 with DIVERSITY-LIMITED note in cross-cut).
  • Every candidate has: header / Script (verbatim block) / Cuts (beat# table) / Why (≤2 sentences) / Risks (≤1 line) / Pick command.
  • Cross-cut notes section present at top, ≤8 lines.
  • Pick table at bottom (1 row per candidate).
  • Internal gate failures surface as ≤1 line each in cross-cut, NOT in per-candidate cards.

Verification (S2 output sanity)

After S2 emits, verify:

  1. Verbatim: every quote in every Script section matches transcript.txt (whitespace-tolerant). Failures = BRAND-NONNEGOTIABLE-VIOLATION flag in cross-cut.
  2. Beat# refs resolve: every beat in every Cuts table exists in S1 inventory.
  3. Duration sums match: declared Duration: Xs ± 1% of Σ beat durations.
  4. Diversity coverage: ≥3 of 4 diversity dimensions hit. Otherwise DIVERSITY-LIMITED flag.
  5. Tail-source rule: ≥1 candidate leads with tail-30s beat OR explicit explanation in cross-cut.
  6. Banned vocab: zero hits in surface text (titles, framing, why, risks).
  7. Line cap: ≤150 lines total. Each card ≤22 lines. Otherwise truncate Why to 1 sentence.
  8. No analytical noise: zero “Schwartzberg verdict” / “Attention-preservation scorecard” / “7-axis” / “Brand non-negotiables” sections per-candidate.

If any check fails: surface as S2-INTEGRITY-WARNING at top of candidates.md (above cross-cut). Block emission only if verbatim or banned-vocab gate fails — those are hard.