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.

SkillVoice subprofileUse for
newsletter-intronewsletterThe 167 opening paragraphs
newsletter-outronewsletterThe 167 closing paragraphs
youtube-titleyoutube_longformPro Church Tools video titles
youtube-scriptyoutube_longformfull 8–12 min video scripts
podcast-show-notespodcastPro Church Podcast show notes
ig-captioninstagramIG post captions
ig-carouselinstagramfull carousels (slide-by-slide + caption)
ig-carousel-openerinstagramjust the slide-1 hook frame
ig-reel-scriptinstagram30–60 sec reel scripts
blog-introblogfirst paragraph of a blog article
x-singletwitterstandalone tweets
facebook-postfacebookFB 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 sayWhat 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 pull before 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-paid on internal tools. The certified subprofile 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.py runs looks_scripted (drops cold opens, footers, co-host names) and merge_overlapping_phrases (collapses N-gram fragments). (3) Runtime — Firestore keeps the raw extraction; skills read the cleaned render. Re-render with scripts/rerender_voice_md.py. Opening/closing pattern sections are dropped — 100% noise.

  • 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