Content Engine
Classify the drop, mine stories and people, inject proof, write in the voice stack, QA gate, park at Review. One human flip publishes.
Ruled 7/10Any drop in: a rough note, a voice or meeting transcript, a brain dump, a photo set, a link Andrew liked, a testimonial screenshot, or a messy pile of all of it. Nothing is ever rejected at intake, capture is free. The engine turns the drop into a QA’d, on-brand piece and parks it at Status = Review in the DH Content Feed. Andrew reads, edits if needed, flips Status = Published. The AI never publishes on its own.
About 70% of this already exists: the Content Feed schema, the Publishing SOP, the AEO doctrine, the voice stack, meeting-intel, toolbox-extract, and dh-site-engine. The middle piece, the classifier, the writer harness, and the QA gate, is what the dh-content-engine skill builds.
The pipeline
Intake
Everything lands as a row in the Content Feed at Status = Draft, with Source Type set (Andrew / Client / Guest / Tool / Research).
Classify
The engine reads the drop and assigns exactly one content type from the 8-type taxonomy below, plus Category and Tags. A long transcript gets mined first and can spawn several typed drops from one source.
Extract & enrich
Stories, wins, testimonials, and quotable moments get mined into the Proof Library. New people go to DH People. Tool mentions run through toolbox-extract into DH Toolbox. Then the engine scans the other direction: is there an existing proof point, testimonial, or person that belongs IN this piece? Every article should carry at least one face and one proof point where honest. Teaching Packages and Listicles also get one bounded research pass for 2 to 3 high-authority adjacent citations. Drops skip research entirely.
Write, in the voice stack
Brain Candy teaching voice first (make smart people feel smarter, easy on-ramp then deep, copy-paste-usable takeaways). STORIES as the invisible structure whenever the piece connects or sells. Then the hard voice rules as the non-negotiable floor: no em dashes, no contrast-correction patterns, category-brand pairing in openings, banned-word list. Full detail in Voice Rules.
QA gate
An automated checklist the writer cannot skip, detailed below. Fail any gate and the engine fixes and re-runs, max twice, then flags the failure in the row’s Notes instead of shipping it to Review.
Approval
The drop sits at Review with a 3-line header the engine writes into the page: what this is, where it came from, what it links to. Andrew reads, optionally edits in Notion directly (that IS the feedback mechanism, no separate tool needed), flips Status = Published. Three gates never get bypassed: sensitivity, permission, editorial.
Publish
The Status flip fires the rebuild through dh-site-engine to Cloudflare Pages. The page lands at /updates/[slug], wired to People, Tools, Concepts, one CTA Offer, and its Proof relations. llms.txt regenerates on every build.
The QA gate, in detail
- Voice regex sweep — em dashes, contrast patterns (“not X, it’s Y”), banned words
- AEO structure check — answer-first opening in the first 150 words, FAQ block for long-form, category-brand pairing present
- Anti-slop rule — at least one unique human observation per major section, pure AI filler fails
- Sensitivity gate — anything client-specific, financial, or personal without clearance gets flagged, never silently included
- Internal link check — 2+ links to existing pages, people, or tools, with descriptive anchors
- Rights check — every injected proof point or photo has Permission Status resolved
The 8 content types
One transcript can spawn several of these. The classifier decides which; Content Type is a select property on the Content Feed.
| Type | Trigger | Length | Special rules |
|---|---|---|---|
| Drop | quick insight, decision, observation | 100-400 words | timestamp prominent, feed-native, can upgrade to a pillar later |
| Teaching Package (pillar) | a framework or method | 1,500-2,500 | what it is → who it’s for → steps → example → when NOT to use, never paywalled |
| Listicle (“Best X”) | comparison / tool intent | 1,500-2,500 | comparison title allowed, DH placed honestly, the headline AI-citation format |
| Proof Story | testimonial, client win | 400-900 | reverse-engineered from real proof, rights cleared, face required |
| Project Showcase | photo set + project | 600-1,200 | photos in, hyper-local long-tail article out |
| People Page | person worth featuring | entity page | approval required for customers, entity anchor for E-E-A-T |
| Tool Page | tool in the Toolbox | entity page | provenance from toolbox-extract only, how-DH-uses-it angle |
| Refresh | quarterly decay pass output | varies | updates timestamp, strengthens internal links both directions |
Measure and improve
Fathom Analytics tracks traffic and conversion per piece. AI-referral traffic gets filtered by referrer (chatgpt.com, perplexity.ai, claude.ai, gemini, copilot); a rise in Direct traffic is treated as a citation proxy since Google AI Mode and mobile AI apps are untrackable. A monthly manual citation check asks each engine the target questions and logs yes/no per framework. A quarterly decay pass pulls the refresh shortlist: pieces ranking 4 to 20 with falling CTR, or anything sub-100-visit and over 6 months stale gets consolidated or pruned. Refreshes re-enter the pipeline at Stage 4 as a Refresh-type drop.
Repeatability (BBE packaging)
Everything above is engine, not brand. Brand-specific material lives in four swappable slots:
Voice pack
Brain Candy + STORIES for DH. A different voice doc for another brand.
Taxonomy weights
JSCG runs 90% Project Showcase. A coach runs mostly Teaching Packages.
Database bindings
Each brand’s Content Feed / People / Proof / Toolbox equivalents. The schema itself becomes the template.
Target-phrase registry
Per brand, per market, hyper-local for service businesses.
New brand, fill four slots, zero engine changes.