Content Brain
For agents: Twelve Brady-voice skills, archive-powered, deployable across machines. Repo:
bradyshearer/content-engine(private). Each skill drafts in Brady’s voice using a platform-specific voice subprofile + curated example pool + optional RAG.
What exists
12 production skills. Each loads its target voice subprofile, runs a hybrid-ranked example pool, and optionally retrieves from the full archive. Drafts come back with provenance per call.
| Skill | Voice subprofile | Use for |
|---|---|---|
newsletter-intro | newsletter | The 167 opening paragraphs |
newsletter-outro | newsletter | The 167 closing paragraphs |
youtube-title | youtube_longform | Pro Church Tools video titles |
youtube-script | youtube_longform | full 8–12 min video scripts |
podcast-show-notes | podcast | Pro Church Podcast show notes |
ig-caption | IG post captions | |
ig-carousel | full carousels (slide-by-slide + caption) | |
ig-carousel-opener | just the slide-1 hook frame | |
ig-reel-script | 30–60 sec reel scripts | |
blog-intro | blog | first paragraph of a blog article |
x-single | standalone tweets | |
facebook-post | FB page posts |
Voice subprofiles: 8 platform-specific (podcast, youtube_longform, certified, newsletter, blog, instagram, twitter, facebook) plus a merged-corpus profile. The certified subprofile is excluded from the merged corpus by default — course conventions polluted public voice. Course-targeted skills opt in via target_platform="certified".
How to invoke a skill
In any Claude Code conversation with access to the bradyshearer/content-engine repo, ask in plain English:
“Brady newsletter intro about visitor follow-up”
Claude finds the SKILL.md, runs the underlying Python skill, and returns the draft.
How to give feedback
Conversational. No special syntax.
| You say | What happens |
|---|---|
| ”Save this” / “Perfect” | Accepted draft logged to Firestore (visible from any machine) |
| “Shorter, punchier” | Re-runs with the constraint applied to this draft |
| ”Always avoid em dashes” | Edits the prompt permanently, commits, pushes |
| ”Reject — too generic” | Logged with reason; informs future prompt tweaks |
| ”Absorb my recent feedback” | Triggers rebuild_skills.py — accepted drafts become curated few-shot examples; pushes to GCS; both machines benefit on next call |
After ~10 accepts per skill, the auto-rebuild bakes them into the curated pool. Skills sharpen with use.
How updates happen
Two paths:
Direct prompt edits. Conversational. “Always avoid em dashes” or “Tighten the opening line” — Claude edits skills/<skill_id>/prompt.py, commits, pushes. Effect is immediate on next invocation.
Curated pool rebuild. Triggered manually with “absorb my recent feedback” or by running scripts/rebuild_skills.py. Reads accumulated accepted drafts from Firestore, generates new few-shot example pools (with fresh Voyage embeddings), pushes to GCS. Both machines pull on next call. No scheduled cron yet — runs on demand.
Cross-machine sync
- Code: GitHub
bradyshearer/content-engine. SKILL.md wrappers symlinked to~/.claude/skills/brady-*.git pullbefore each invocation. - Voice profile + feedback events: Firestore (live read).
- Skill pools (~324 MB): GCS
gs://ezra-processed/skill_pools/(auto-pull on stale).
New-machine setup: SETUP.md in the repo.
Operational reference
- Repo:
github.com/bradyshearer/content-engine(private) - GCP project:
ezra-488314(us-central1 / nam5) - Firestore collections:
/sources,/chunks,/voice_profile,/skill_feedback,/ingestion_runs - GCS buckets:
ezra-raw-audio,ezra-transcripts,ezra-processed - Service account:
content-engine@ezra-488314.iam.gserviceaccount.com - API keys (in
.env, never committed):DEEPGRAM_API_KEY,VOYAGE_API_KEY,ANTHROPIC_API_KEY
Architectural notes (worth knowing)
- Per-platform voice subprofiles. 8 of them. Skills load the right one; merged-corpus is rarely the right choice for a specific skill.
- Recency-weighted voice extraction. 5-year half-life on chunk publish dates — 2026 voice ~7× more weight than 2014, but old work isn’t dropped.
- Hybrid retrieval scoring.
0.55 × semantic + 0.25 × engagement + 0.15 × recency + 0.05 × diversity. Same formula across query CLI and skill few-shot retrieval. - Idempotent pipeline. Re-running any stage is safe and costs nothing extra — every stage checks Firestore for existing state.
- Paid-content compliance. Pro Church Certified content is flagged
isPaidContent: true. Excluded by default from public surfaces; opt-in via--include-paidon internal tools. Thecertifiedsubprofile is excluded from the merged voice profile by default — course conventions (“FOR THE EDITOR”, “meet me in the next lesson”) were contaminating public-voice output. - Voice profile cleanup is three-layer. (1) Extraction — stopword n-grams filtered, frameworks must be named + branded, low-quality rhetorical examples dropped, semantic dedup on rules. (2) Render —
processors/voice/clean.pyrunslooks_scripted(drops cold opens, footers, co-host names) andmerge_overlapping_phrases(collapses N-gram fragments). (3) Runtime — Firestore keeps the raw extraction; skills read the cleaned render. Re-render withscripts/rerender_voice_md.py. Opening/closing pattern sections are dropped — 100% noise.
Related
- skills-architecture — File-layout + ops reference for the 12 brady-voice skills (where they live across the three layers, how Claude Code discovers them, setup, naming conventions, adding a new skill)
- 7-building-blocks — methodology the skills draft against
- disney-dupe — strategic frame (Brand + IP + Platform; the skills extend the IP layer)
- Attribution — sister operational system in the same Firebase app