TRIUMPHANT FINANCIAL GROUP + LONGTABLE · INTERNAL · NOT FOR PUBLICATION

Social AI Manager: Swipe Intake first, then the Autopilot Studio

Built from the research report "Autonomous social media manager" plus Chris's Nov 4 requirement: "Regarding Instagram I will grab other people's videos and send them to you for ideas, theme, and framework, so we can generate our own transcripts off of what we know is working." Manual drop-in is now the primary research intake. Scraping and vendor tools are a secondary, optional lane. Framework items are design recommendations, not sourced facts.

1. Problems & risks first

Blunt list. Red items block autonomy; amber items are unverified assumptions the design depends on.

2. What already exists

The file sweep found no roadmap or build for a social media manager. One working piece, and a lot of stalled inputs.

AssetStateUse in this build
#222 Project Folder/linkedin-daily/Working (delivered Nov 3). 7:30 AM launchd job, claude-haiku-5-5, one LinkedIn post plus branded card to Discord #social-media-posts; Chris posts by hand. Enforces no $ or %, banned phrases, max 3 hashtags, hook dedupe.Seed of the Compliance Gate; launchd pattern reused for the iCloud watcher; Discord channel pattern reused for swipe notifications. Stays as is.
config/facts.md"(none yet)"Becomes the Supabase facts table. Blocker.
222-Agent-Marketing-Bible v0.5Stalled Sept 27. Consumer social "none produced yet." Retirement, solar, advanced copy on compliance hold. 36-question sheet unanswered.Voice and pillar source once answered.
Debt-to-Capital bible v1.8Locked; has a social section.Hook library seed.
Producer-playbook pipeline~2,925 tagged library items, a teleprompter_script.md prompt, 30 Ignite teleprompter scripts flagged "none film-ready."Hook library seed; script prompt reference.
Longtable / tfgap biblesInclude a Quantum 125 (Section 125) version.Flex-script source, yellow lane only.
Longtable Outreach Command CenterEmail and LinkedIn DM outreach, not social. Blocked on Cloudflare OAuth and a HeyReach key.Out of scope.
agent-swarm-factory inventory"Social media agent fed by a marketing bible": mentioned, never started. "Blog autopilot" via GHL Social Planner: not started.This page is that build.
House rulestriumphantfg.com only; bans "guarantee," "six figures," "passive income," "Equis," "GBU," "game-changer," "unlock," #AI, #automation; voice "Clarity. Comfort. Compassion."; max 1 emoji, 0 to 3 hashtags; hook, value, soft CTA; recruiting carries earnings disclaimer, "not an MLM," "team lead, never upline"; keep apostrophes, no em dashes or semicolons, no tax-free framing.Compliance Gate rule set v1.

Swipe Intake (primary research lane)

Chris sends Reels he likes. The cloud does the rest. His Mac uploads at most, and only on route (b).

  1. Capture. Save or screen-record the Reel on iPhone (Control Center → Screen Recording) or Mac (Cmd+Shift+5). Optional: note the source handle and view count shown on screen.
  2. Send, by one of three routes:
    • (a) iOS share-sheet Shortcut "Send to TFG Swipe" (recommended). Share → Send to TFG Swipe → optional note ("@handle, liked the cold open, 1.2M views"). The Shortcut POSTs file + note to https://swipe.<worker>/swipe with header Authorization: Bearer <SWIPE_TOKEN>. The Worker writes to R2 tfg-swipe and enqueues a job. The Mac is not involved. Over ~100 MB: the Shortcut first asks the Worker for a presigned R2 URL, then PUTs the file there.
    • (b) iCloud Drive folder "TFG Swipe Inbox". A tiny launchd agent (same pattern as linkedin-daily) uses WatchPaths on ~/Library/Mobile Documents/com~apple~CloudDocs/TFG Swipe Inbox. It wakes only when a file lands, runs brctl download if the file is a placeholder, curl-uploads it to the Worker, and moves it to Sent/. Upload only, near-zero CPU, no transcription on the Mac.
    • (c) Claude via Dispatch or chat. Attach the video (and a note). Claude posts it to the same Worker endpoint, so the pipeline is identical.
  3. Transcribe. Default: cloud Whisper. Groq whisper-large-v3-turbo or OpenAI gpt-4o-mini-transcribe, about $0.003/min or less, so roughly 60 one-minute refs a month cost under $0.25. Word timestamps are kept for pacing math.
  4. Breakdown. Gemini watches the actual video (not just the transcript), so it sees on-screen text, the visual hook and the cuts. It is told to ignore Instagram UI overlay. Output JSON:
    • Hook in the first 3 seconds: verbal, visual and on-screen text hooks, plus hook type (question, contrarian, sourced stat, mistake/warning, story open, POV/skit, list, authority, visual interrupt, direct callout)
    • Structure/beats with timestamps
    • Pacing: words per minute (from ASR timestamps), cuts per 10 seconds
    • Caption and on-screen text style
    • CTA
    • Format: talking head, green screen, skit, list or story
    • Length
    • "Why it works"
    • Transferability to TFG, scored 1 to 5
  5. Log. Write to Supabase swipe_refs (file, route, note, source, private transcript) and swipe_breakdowns (the analysis), tagged by theme, hook_type, format and niche. If Chris supplies view counts (and optionally the account's typical views), store an outlier note: views ÷ typical, flagged at 3× or more.
  6. Generate. Claude writes 3 original TFG scripts per reference in Chris's voice:
    • one consumer life-insurance script
    • one recruiting script (yellow lane)
    • one flex script (Section 125/Longtable, or a TFG value angle)
    Rules: the writer receives the breakdown, not the raw transcript. It borrows structure and hook type only, never wording. An n-gram check then compares each draft to the reference transcript (lowercase, punctuation stripped) and rejects any draft with 6 or more consecutive matching words, regenerating up to twice. The report's pgvector similarity block (0.85 cosine) runs as a second check. Every surviving script then goes through the Compliance Gate.
  7. Deliver. Scripts that pass land in the teleprompter folder/queue (S042-H1.txt, S042-H2.txt, S042-BODY.txt in the shared Drive folder) with lane flags. Chris gets a Discord notification in the same channel pattern as linkedin-daily, with the breakdown summary, transferability score and Approve buttons for yellow-lane scripts.
Honest flag on "transcribe locally with Whisper." Local Whisper on the Mac is exactly the fan and CPU load Chris wants to avoid, and the Cowork sandbox also runs on his Mac, so "let Claude do it locally" is not free either. Cloud Whisper costs pennies a month. Default: cloud. Opt-in toggle: TRANSCRIBE_ENGINE=local queues files for whisper.cpp with the base.en model, run by a launchd job at 2 AM while plugged in. It is slower and less accurate than large-v3-turbo, and it still spins the fans, just while he sleeps. Gemini still has to see the video in the cloud for the breakdown, so going local saves no privacy and almost no money.
Copyright line. A private transcript kept for analysis is low risk. Republishing it, or a close paraphrase, is not. Hooks, formats and structures are generally not protectable; specific wording is. Raw transcripts live in a service-role-only column, and the writer never sees them.

Illustration: one reference, three original scripts (structure borrowed, wording not)

Reference pattern (abstracted): mistake/warning hook, green screen over a headline, 3-point list, comment-keyword CTA, 32 s.

Consumer: "Three mistakes families make with life insurance at work. One, they assume the work policy follows them if they change jobs. Two, they never check who the beneficiary is. Three, they guess at how much coverage they need. If you want the simple checklist I use with families, comment PLAN."
Recruiting: "If you're a new agent, here are three things nobody tells you about your first 90 days. You need a daily routine before you need a script. Your team lead matters more than your title. And follow-up is the whole job. Comment TEAM if you want to see how we train. Commission-based independent contractor role. Income is not guaranteed. Results vary."
Flex (TFG value): "Three reasons clients say they stay with our agents. They call back. They explain things in plain English. And they check in before you have to ask. Our automated CRM helps our agents keep that promise. Comment REVIEW for a free policy review."

Samples follow house rules: no numbers needing a fact source, no guarantees or income claims, no em dashes, soft CTA. Recruiting sample still routes to the yellow lane.

3. Framework diagram

Swipe Intake is stage 0 and primary. The scrape lane is dotted because it is optional and later. One human job: recording.

flowchart TD
  subgraph S0["0. SWIPE INTAKE (primary)"]
    A1["Chris saves or screen-records a Reel"] --> A2{"Send route"}
    A2 -->|"a. Share Sheet Shortcut (recommended)"| W["Cloudflare Worker /swipe + secret token"]
    A2 -->|"b. iCloud folder + launchd watcher"| W
    A2 -->|"c. Claude via Dispatch or chat"| W
    W --> R2[("R2 tfg-swipe")]
    R2 --> TR["Transcribe: cloud Whisper default, local whisper.cpp opt-in"]
    TR --> GB["Gemini breakdown: hook, beats, pacing, CTA, format, why it works, transfer 1-5"]
    GB --> LG[("Supabase swipe_refs + swipe_breakdowns")]
  end
  subgraph S0B["Optional scrape lane (later)"]
    SC["Sandcastles, Apify, IG Business Discovery, YouTube Data API"]
  end
  LG --> RS["1. Research: patterns + weekly outlier brief"]
  SC -.-> RS
  RS --> IS["2. Idea and Script: 3 scripts per ref, n-gram 6-word check"]
  IS --> CG1{"3. Compliance Gate (pre)"}
  CG1 -->|"green"| RK["4. Recording Kit: teleprompter queue + Discord ping"]
  CG1 -->|"yellow"| AP["Chris one-tap approve in Discord"]
  AP --> RK
  CG1 -->|"red"| BL["Blocked or rewritten"]
  RK --> HU(["Chris records (the human job)"])
  HU --> QG["5. Quality Gate: Gemini + ffmpeg on Modal"]
  QG -->|"REDO with timestamped fixes"| RK
  QG --> CG2{"6. Compliance Gate (post) on actual transcript"}
  CG2 -->|"spoken hard-block: REDO"| RK
  CG2 --> ED["7. Editing: Submagic API or Modal ffmpeg"]
  ED --> PB["8. Publishing: IG + YouTube direct, GHL for TikTok, FB, LinkedIn Page"]
  PB --> AN["9. Analytics and Learning"]
  AN -.->|"hook weights, what to swipe next"| RS
  AN -.->|"rubric recalibration"| QG

Agent cards

0. Swipe Intake

Job
Receive Chris's reference videos, transcribe, break down, log, trigger scripts.
Tools
iOS Shortcut, launchd watcher, Claude Dispatch; Cloudflare Worker + R2 + Queues; Groq/OpenAI Whisper; Gemini 3 Flash; Supabase
In / Out
Video + note → swipe_refs, swipe_breakdowns, job for Idea and Script

1. Research

Job
Turn breakdowns into abstracted patterns; weekly "10 outliers and why" brief. Optionally ingests scrape-lane data.
Tools
Worker cron (Sun 6 AM), Gemini, optional Sandcastles/Apify/Business Discovery
In / Out
Swipe breakdowns, watchlist (optional) → patterns, Discord brief

2. Idea & Script

Job
3 scripts per swipe ref (consumer, recruiting, flex) plus weekly 7 to 8 scripts × 3 hooks.
Tools
Claude API; hook library with Thompson weights; n-gram + pgvector originality checks
In / Out
Patterns, breakdowns, approved facts, bibles → scripts, script_hooks, captions per platform

3 + 6. Compliance Gate (pre and post)

Job
Lane every script, caption and final transcript green/yellow/red; rewrite; append disclosures.
Tools
Regex rule table + Claude review using the insurance-tax-strategy-compliance framing
In / Out
Script or transcript, rules, facts → compliance_reviews, rewrites, disclosure footer

4. Recording Kit

Job
Teleprompter files, shoot sheet, slate codes; Discord ping.
Tools
Google Drive API; Teleprompter Pro or PromptSmart on iPhone
In / Out
Approved scripts → S042-H1.txt etc., shoot sheet

5. Quality Gate

Job
Score every take; publish/schedule/draft/redo verdict with ranked fixes.
Tools
Modal: ffmpeg ebur128, silencedetect, signalstats, 0 to 3 s subclip, ASR word timestamps; Gemini full clip + subclip
In / Out
Raw take + script → qc_reports, Discord verdict

7. Editing

Job
9:16 renders, captions, jump cuts, loudness to −14 LUFS, thumbnails.
Tools
Submagic Business + API; Modal ffmpeg fallback (ASS captions, two-pass loudnorm)
In / Out
Take, word timestamps, brand kit → renders

8. Publishing

Job
Schedule and post; build IG containers 10 to 30 min ahead; respect rate limits; archive.
Tools
Worker cron every 5 min; IG API with Instagram Login; YouTube videos.insert + publishAt; GHL Social Planner v3
In / Out
posts queue → live posts, archive_records

9. Analytics & Learning

Job
Pull metrics at 1h/24h/72h/7d; evaluate hook tests; reweight hooks; tell Chris what to swipe more of.
Tools
IG insights (skip rate, watch time, shares), YouTube Analytics retention, GHL Statistics and contact sources
In / Out
Platform data → post_metrics, experiments, learnings, Monday 5-line report

Three compliance lanes

LaneCoversAction
GREENGeneric life-insurance education with no carrier, product or numbers; behind the scenes and team culture; "our automated CRM helps our agents"; seasonal and community contentAuto-publish after both gate passes
Recruiting, any testimonial, any carrier or product, annuities/retirement, Section 125/Longtable, any stat not in factsOne Discord tap; carrier-named also needs a carrier approval ID
REDMedicare, variable products and "market returns," income figures, "tax-free," illustrated rates, "free coverage," government look-alikes, any post about AI or automation itselfBlocked

4. Quality Gate scorecard

100 points; compliance is pass/fail on top. Thresholds are recommendations to be recalibrated after 25 published posts against IG skip rate and watch ratio.

DimensionPtsMeasured byPass threshold
Hook, 0 to 3 s25ASR time-to-first-word; Gemini on 0 to 3 s subclip (verbal hook, visual interrupt, on-screen text by 1.0 s)First word ≤0.5 s; hook complete ≤3.0 s; Gemini hook sub-score ≥18/25
Retention predictors20silencedetect, WPM, cut density, script adherence (WER vs script)No silence >0.6 s after edit; 155 to 185 WPM post-cut; visual change every ≤4 s; adherence ≥85%
Delivery15Gemini (eye line, energy, warmth); ASR filler countFillers ≤2/min; eye contact ≥80% of frames
Audio10ebur128 / true peak, noise judgmentRaw integrated −20 to −10 LUFS (normalized to −14 on edit); true peak ≤−1 dBTP; no clipping
Lighting/framing10signalstats YAVG; Gemini framingFace luma mean 90 to 170; blown highlights ≤2% of frame; eyes in upper third; 9:16 at 1080×1920
Captions/on-screen text5Render check of safe zonesNothing in bottom 20% or right 15% UI zones
CTA5Transcript, last 5 sExactly one soft, compliant CTA
Length5DurationEducation 20 to 45 s; story 45 to 75 s; nothing >90 s at launch
ComplianceGateRegex rules + Claude review of transcript, caption, on-screen textAny hard-block rule = automatic fail

Decision rules

ConditionVerdictAction
Compliance hard-block spoken in the takeREDODiscord message quoting the exact second and phrase, plus a compliant rewrite line
Compliance issue only in caption/on-screen textAuto-fixRewrite caption, re-run gate, continue
Yellow-lane topic (recruiting, testimonial, carrier/product, Section 125, annuity)DRAFT → approvalOne-tap Approve/Reject in Discord; carrier-named waits for a logged carrier approval ID
Score ≥80, green laneSCHEDULENext open slot; timely/news content gets PUBLISH NOW
Score 70 to 79, green laneSCHEDULE as Trial Reel onlyNon-followers first; graduates on performance
Score 60 to 69DRAFTHeld for a re-edit with listed fixes, or downgraded to a Story
Score <60, hook <15/25, unusable audio, or adherence <70%REDOThree ranked fixes with timestamps (e.g. "0:00 to 0:02 you look down at the prompter; raise the phone 4 inches")

5. Tool comparison

Sort by any column; search filters all columns. Prices are from the report and research notes; most third-party prices are unverified.

6. Data model

Supabase (Postgres + pgvector). Swipe tables are new; the rest is from the report.

TableKey columns
swipe_refs (new)id, received_at, route (shortcut/icloud/dispatch), r2_key, source_platform, source_handle, source_url, chris_note, views, account_typical_views, outlier_note, duration_s, transcribe_engine (cloud/local), transcript + words jsonb (service-role only), status
swipe_breakdowns (new)id, swipe_ref_id, hook_verbal, hook_visual, hook_text, hook_type, beats jsonb [{t, beat}], wpm, cuts_per_10s, caption_style, onscreen_text_style, cta, format (talking_head/green_screen/skit/list/story), length_s, why_it_works, transferability (1 to 5), tags: theme, niche; model_version
brandsid, name (TFG / Longtable), domain, disclosure_footer, voice_rules jsonb
platform_accountsid, brand_id, platform, handle, account_type, auth_ref, ghl_account_id, publish_path (direct/ghl)
watch_accounts / source_posts / source_transcriptsOptional scrape lane only: handle, niche, outlier_score, private transcript + embedding
patternsid, swipe_breakdown_id or source_post_id, hook_type, format, structure_note, cta_type, audio_note
factsid, claim, source_name, source_url, source_year, approved_by, approved_at, expires_at
hooksid, text, hook_type, pillar, lane, origin, uses, wins, alpha, beta, embedding
ideas / scriptsscripts: id, idea_id, swipe_ref_id, angle (consumer/recruiting/flex), version, body, word_count, target_secs, cta, caption_by_platform jsonb, ngram_max_overlap, max_cosine, lane, status
script_hooksid, script_id, hook_id, variant (H1/H2/H3), text
compliance_reviewsid, object_type, object_id, stage (script/render/caption), rules_triggered, lane, rewrites, decision, approver, carrier_approval_id, decided_at
recordings / qc_reportstake r2_key, duration; metrics jsonb (lufs, peak, silences, wpm, fillers, yavg, ttfw, adherence), scores, total, verdict, fixes
renders / postsplatform renders; posts: kind (reel/trial/story/short), caption, disclosures, scheduled_at, status, platform_post_id, experiment_id
post_metrics / experiments / learningshorizon (1h/24h/72h/7d), views, reach, skip_rate, watch_ratio, shares, saves, retention_curve; arms, posterior, winner; weekly finding + rule_change
archive_recordspost_id, final media, transcript, caption, approvals, live_from, live_to, retain_until (≥ live_to + 5 years, Model 570 Sec. 9A)

Cloudflare layout

PieceDetail
Worker appRoutes: POST /swipe (Bearer SWIPE_TOKEN, multipart file + note), POST /swipe/presign (large files), Discord interaction endpoint (Approve/Reject/Redo), webhooks (Modal, GHL, Meta). Cron: publish every 5 min, analytics hourly, research Sun 6 AM, scripts Sun 9 AM.
Queuesswipe-jobs (transcribe → breakdown → scripts), plus a queue between each studio stage
R2 bucketstfg-swipe (private reference videos, new), tfg-inbox (Chris's raw takes), tfg-renders, tfg-public (unguessable-key media subdomain so Meta can fetch video_url), tfg-archive (private, 5+ years)
Pages "Studio"Dashboard behind Cloudflare Access: swipe file, script queue, scorecards, learning log
Secretswrangler secret put: SWIPE_TOKEN, GROQ_API_KEY or OPENAI_API_KEY, GEMINI_API_KEY, ANTHROPIC_API_KEY, SUPABASE_SERVICE_KEY, DISCORD_WEBHOOK_URL, DISCORD_BOT_TOKEN, META/YT/GHL tokens
Off-Worker computeModal for ffmpeg and ASR (Workers can't run ffmpeg; Containers are beta; Supabase Edge Functions cap at 256 MB / 2 s CPU). Nothing heavy on the Mac.

7. Cadence & costs

Volume targets (weeks 1 to 4)

OutputPer week
Swipe references from ChrisTarget 5 to 15 (each yields 3 scripts); answer in Interview Q2
Instagram Reels5 (Mon to Fri), repurposed same day to TikTok, YouTube Shorts, Facebook Reels, staggered 1 to 3 hours
IG Trial Reels (hook tests)2 to 3
StoriesDaily, from cut-downs and hook stills
LinkedIn Page videos3
LinkedIn personal text postDaily (existing linkedin-daily, still posted by hand)
Longtable / Section 1252 LinkedIn posts, own brand accounts, yellow lane
Recording sessionOne, 60 to 90 min, 7 to 8 scripts × 3 hooks

Pillar mix: 40% consumer protection education, 25% agent career/recruiting (yellow), 15% retirement/annuity concepts (yellow, no numbers), 20% behind the scenes, team, CRM. Scale to 7 Reels/week only when first-take quality-gate pass rate holds ≥70% for 3 straight weeks.

Monthly cost

Lean (DIY, swipe intake only)
~$25 to 45
Supabase Free, Modal captions instead of Submagic, no research vendor
Recommended (months 1 to 2)
~$95 to 190
Typically ~$110. Down from the report's ~$150 because Swipe Intake replaces Sandcastles as primary research
Optional scrape lane add-on
+$5 to 49
Apify ~$5 to 8, or Sandcastles/Virlo $39 to 49
Line itemLeanRecommendedNotes
Swipe Intake (Worker + R2 storage + cloud Whisper + Gemini breakdown + Claude 3 scripts/ref)~$1 to 4~$2 to 6At ~60 refs/mo: Whisper <$0.25, Gemini <$1, Claude ~$1 to 4 (estimate). Worker included in the $5 plan
Cloudflare Workers Paid (cron, queues, R2, Pages, Access)$5$5 to 10R2 at tens of GB is an unverified few-dollar estimate
Supabase$0$25Pro recommended for backups (5-year archive duty); price unverified
Modal (ffmpeg + ASR for takes)$0 to 2$2 to 5~$0.047/core-hour
Gemini 3 Flash (quality gate)<$5<$10Watch billing anomalies reported on forums
Claude API (studio scripts, compliance, captions)~$10~$20 to 40Estimate only
Submagic Business + API$0 (Modal DIY)$41 to 69Drop by month 2 if Modal captions match
Research vendor (Sandcastles/Virlo/Apify)$0$0 (optional)Secondary lane; add only if swipes don't supply enough ideas
GHL Social Planner$0 incr.$0 incr.Assumes API on current plan; unverified
Teleprompter app$0 to 10$0 to 30Prices conflict
Fallback poster (only if GHL API blocked)n/a$0 to 24Zernio / Upload-Post
Local whisper.cpp toggle$0$0Costs fan noise and battery, not dollars

8. Week plan: Wed Nov 4 to Tue Nov 10, 2026

Day 1 to 2 priority: get Swipe Intake working end to end before anything else. Click paths are "look for this menu," since vendor labels move. Checkboxes save in this browser.

0 of 0 done

Slip risks: Meta token or permission surprises, missing GHL API scopes, the YouTube private-lock claim. Each has a fallback (Zernio, or GHL for YouTube). None should move Sunday's recording session.

9. Interview

The answers that most change the design. They autosave in this browser. Export builds a markdown file to send back.