# Generate Title

> Generate a per-clip third-person engagement-driven title card text. Claude reads the clip's transcript, the source ingest.json metadata, and (optionally) pick-segments' per-span judgment (topic, rationale, suggested title) so it reads the speaker's register — sincere vs ironic vs joking — before titling. Emits a hook-driven ALL-CAPS title (<=7 words).

- Skill: `jperrello/generate-title` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add jperrello/generate-title`
- Raw SKILL.md: https://api.skillmd.com/api/skills/jperrello/generate-title/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: jperrello (https://skillmd.com/u/jperrello)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/jperrello/generate-title

---


# generate-title

One title per clip. Third-person, names the subject, promises a specific
moment, ALL CAPS, ≤7 words. Designed for the title-transition skill.

## Invoke

```
.claude/skills/generate-title/generate-title.sh <clip_transcript.json> <ingest.json> <out.txt> [title-context.json]
```

- `clip_transcript`: clip-local transcript with `words[]` and/or `segments[]`
- `ingest`: the source video's ingest.json (provides title, uploader, url —
  helps name the subject when the transcript doesn't say it explicitly)
- `out`: text file with the title (single line, ALL CAPS, ≤7 words)
- `title-context` (optional): pick-segments' per-span judgment —
  `{topic, rationale, title_suggestion}` — sliced out of `segments.json` by
  the orchestrator. The clip-local transcript alone can't carry the
  speaker's register, so a line read literally can invert the meaning (an
  ironic "what he refuses to think about" titled as a sincere confession).
  When present, the model reads tone from this context FIRST (Step 0:
  sincere / ironic / joking / provocative) and titles the actual point, not
  the surface words. Never shown to the viewer; omitting it falls back to
  the old clip-only behavior.

## Output

A single-line text file. Example contents:

```
WATCH SPEED RAGE AT STREAM SNIPERS
```

## Prompt principles (enforced)

- Third person — never "I", "me", "my", "we".
- Name the subject (inferred from clip transcript + ingest.json).
- Promise ONE specific moment, behavior, or reaction — not a vague topic.
- ≤7 words, ALL CAPS, no emoji, no clickbait punctuation (no "?" / "!" / "..." / quotes).
- No "Watch X..." filler when it doesn't add a hook; only use opener verbs
  when they sharpen the promise.

## Fallback

If `claude -p` fails or the model returns something unusable (empty, >7 words,
contains banned punctuation), `parse_reply.py` falls back to the first 5
non-filler words from the clip transcript, uppercased.

