Synced from
virality/stages/02-candidates.mdincontent-extractionskill 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.
| Dimension | Variants to spread across |
|---|---|
| Pillar | min 2 distinct pillars across the candidate set |
| Duration band | tight 12-25s / standard 25-50s / deep 50-90s — at least 2 bands populated |
| Arc shape | tail-as-opener / curiosity-gap / categorical-reframe-standalone / vulnerability-pivot / vivid-image-then-vision / self-recognition + recursive — at least 3 arcs across set |
| Format-fit | min 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 gate | What it checks |
|---|---|
| Verbatim contract | Concatenated script is verbatim substring of transcript.txt (whitespace-tolerant). Beat# refs guarantee this by construction since beat texts come from S1 inventory directly. |
| Banned vocab | No revolutionize, seamless, AI-powered, game-changer, leverage in surface text (titles, framing). Verbatim quotes may contain anything Daniel said. |
| Exclamation points | Zero in surface text outside of verbatim. |
| Two-beat cadence preserved | Reorders don’t break Daniel’s two-beat structures. |
| Code-switching preserved | German/English mix in any quote stays exact. |
| Schwartzberg I-believe-that | Every candidate’s arc reduces to one I-believe-that sentence. If not, candidate is incoherent — drop. |
| So-what test | Candidate’s argument is contestable. If everyone reasonable would already nod, candidate is too obvious — drop. |
| Aesthetic register 7-axis | Punchy/sharp/real/essence-loaded/considered/perceptive/illuminated. Two ⚠ axes = surface as “register-drift” flag in cross-cut, NOT per-candidate. |
| Anti-slick scan | No 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 bias | At 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-LIMITEDnote 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:
- Verbatim: every quote in every Script section matches transcript.txt (whitespace-tolerant). Failures =
BRAND-NONNEGOTIABLE-VIOLATIONflag in cross-cut. - Beat# refs resolve: every beat in every Cuts table exists in S1 inventory.
- Duration sums match: declared
Duration: Xs± 1% of Σ beat durations. - Diversity coverage: ≥3 of 4 diversity dimensions hit. Otherwise
DIVERSITY-LIMITEDflag. - Tail-source rule: ≥1 candidate leads with tail-30s beat OR explicit explanation in cross-cut.
- Banned vocab: zero hits in surface text (titles, framing, why, risks).
- Line cap: ≤150 lines total. Each card ≤22 lines. Otherwise truncate Why to 1 sentence.
- 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.