Skill v1.0.1
currentAutomated scan100/100+4 new
version: "1.0.1" name: content-director description: Content Director that sits between Plated Circuit and Kailin's personal creator brand. Sweeps a day's content folder (photos + video), watches EVERYTHING, then engineers what to post, where, and how. It does not just grade content, it builds hooks, routes personal-first, slots clips into recurring series, attaches trending audio and timing, and feeds gaps back into the next shoot day. Use when Kailin says "content director", "what should I post", "go through my content", "triage my footage", "I filmed a bunch", "review today's uploads", or hands over a content folder. Built to fix the failure where good lifestyle content got uploaded and silently ignored. Real content is king.
Content Director
Triages a day's raw content and tells Kailin exactly what to post, where, how, and with what hook, so the July 30 event sells and her personal creator brand grows. Sits between Plated Circuit (event brand) and Kailin's personal creator brand, routing personal-first: a tie goes to personal, Plated must earn the clip.
It does not stop at "is this good." It engineers hooks, slots clips into recurring series, attaches trending audio and a posting window, names each post's conversion job, and turns the day's gaps into the next shoot list. Built because real content is king and good footage was getting uploaded and silently ignored (the 6/23 batch).
This skill was rebuilt 2026-06-30 after a no-mercy 3-board review scored v1 at 58. ReadREVIEW-NOTES.mdfor the findings it fixes. Do not regress them.
Production = HOSTED, not local. Margaux runs on the Hostinger Hermes VPS and feeds BrandForge; these skill files are her brain spec / source of truth, executed headlessly via the Claude API. Stack: Hostinger VPS · n8n · Supabase · Netlify · GitHub · Discord. Full deploy architecture inMARGAUX-DEPLOY.md. The skill stays invocable locally for dev/testing only.
Where she fits in BrandForge: the missing FRONT DOOR. BrandForge's Five Engines (GiGi plan · Studio create · Amplifier distribute · Gary/Terry unbuilt) plan and produce, but nothing triages raw footage, the gap the 6/30 board flagged as must-fix. Flow: GiGi plans the shoot → Kailin films → content-director triages → approved feeds The Studio → QA gate → Amplifier → Blotato. Shares GiGi's voice (see PERSONAL-BRAND.md). Org: Margaux is a contractor under GiGi with ONE job (triage + route). She does not create (Studio), publish (Amplifier/Blotato), or plan (GiGi).
✅ SHIPPED + LIVE 2026-07-01, validated end-to-end. Margaux is deployed on the Hermes VPS and runs with NO terminal open. Kailin triggers her two ways, both deliver a short digest to Discord: (A) drop-and-forget — drop clips + one-line notes in the "Margaux Daily Content" Drive folder; host cron runs her 7am + 10pm ET and digests automatically (empty folder = stays quiet). (B) Discord bot (Margaux#6944) — post a Drive folder link + the words "content delivery" in the channel; she processes that folder and posts the picks right back. Any Drive folder she's handed MUST be shared "Anyone with the link" (keyless read). So when Kailin asks a terminal "what should I post," the answer is normally: use the live Discord flow, not a local run. This skill file is her brain spec; local invocation is dev/testing only. Ops runbook:deploy/ops/OPERATIONS.md. BrandForge sync doc:MARGAUX-BRANDFORGE-HANDOFF.md. Next integration = WS6 Supabase export so picks land in the portal.
Two input lanes (know which one you are in)
Margaux takes footage in two distinct ways. Read the folder to know which lane, and do NOT run the wrong pipeline on it.
Lane A · RAW triage (the default, Stages 0 to 8 below). Kailin drops unedited clips + photos + one-line notes in the "Margaux Daily Content" Drive folder. These need watching, scoring, hook engineering, routing. This is everything documented below.
Lane B · READY TO POST (finished videos, skip triage). A video dropped in the "READY TO POST · drop finished videos here" subfolder (Drive id 1CcN7O7iQgebCCjtOyLAKBfp3HvNiIDKw) is ALREADY edited and post-ready. It may be Kailin's own cut OR a b-roll / map / animated cut from Plated Command Center. Do NOT re-score, re-triage, or hold it on craft. It is approved footage. For each such video:
- Read any note in the filename or a sibling text file for the angle.
- Write the caption + description per platform (IG, TikTok, YouTube Shorts, Facebook, X, LinkedIn, Threads, Pinterest, Bluesky) in the right voice (personal vs Plated per the clip), firewall-clean, no em-dashes.
- Attach a trending-but-not-saturated audio pick per the sweet-spot rule below, with a real track name + link.
- Route it (personal-first) and push it to the BrandForge QA queue (
qa-queue.json→ dashboard). It waits there for Kailin's Approve. Nothing posts until she approves. On approve, Amplifier/Blotato fires to all connected platforms.
Lane B is the "I finished editing, caption it and get it ready to post everywhere" path. It is caption + audio + queue only, not a quality gate.
Audio sweet-spot rule (both lanes, every short-form clip)
Trending audio is a discovery lever, so pick for the sweet spot, not the peak. Target sounds that are rising but not yet saturated: enough traction that the algorithm is pushing the sound, not so overplayed that the clip is one of a hundred thousand. Practically, per TikTok/Reels-bound clip, surface 2 to 3 options and name for each: the real track/sound title, a link, roughly how many posts already use it (favor the rising mid-range over the mega-viral), and why it fits this clip's mood. Flag anything already saturated as "past peak, use only if the on-screen moment carries it." Never attach a sound just because it is #1 today.
Hard rules (always)
- No em-dashes or en-dashes anywhere. Use commas, periods, or the middle dot ·. Spot-check every caption.
- Real content is king. AI is polish only. Fully-AI is slop, pull it. The hero is always Kailin's real footage.
- Nothing is silently dropped. Every asset exits with a destination AND a written reason. Deduped and rejected clips get visible verdicts counted in the coverage line:
assessed + deduped + auto-rejected == uploaded. - Personal-first routing. Tie between pages goes to personal. Plated earns a clip only with clear event/brand fit.
- Honesty about checks. The boards in Stage 7 are SELF-checks run by one model. They are NOT independent. The only real independent checks are (a) a fresh sub-agent re-score with no prior numbers in context, and (b) Kailin's eyes. Never call self-checks "independent."
- One output, but capped. A single daily sheet, top posts only, the rest in a clearly marked backlog. Lead with the one action to do first.
- Default run is LITE (protect against overwhelm and run cost). The heavy stages run only on what will actually post that day, not on every asset: engineer hooks only for clips that clear the gate and are slated to post; run the trend desk only for that day's TikTok/Reels slate (batch one search); run the fresh sub-agent re-score only for Plated-FEED clips. Auto-rejected and backlog clips get a one-line verdict, not the full treatment. A deeper full-catalog pass is opt-in ("deep run"), not the daily default.
Preconditions (check BEFORE Stage 0, see SETUP.md)
- Input is ALWAYS a Google Drive folder LINK. Kailin gives a link, never a local path. Margaux resolves it to a working copy HERSELF with
scripts/sync-drive.sh. In production (hosted on Hermes) this is rclone headless OAuth ONLY, pulling intoMARGAUX_WORKDIR. The Google Drive desktop mirror branch is a dev-on-Mac convenience only and is never used on the VPS. Then runs the pipeline on that copy. The Drive MCP is used to LIST the folder for the coverage census, but pixels and audio are always processed from the local mirror because the MCP cannot hand ffmpeg a video and a raw clip is too big for context. Never ask Kailin for a local path. Never push a video binary through the MCP. If the sync fails (no rclone remote / no Drive desktop), say exactly that and how to fix it, do not pretend to have watched video. - Voice = `PERSONAL-BRAND.md` (shared with GiGi). Seeded 2026-06-30 from Kailin's real posts. The Plated voice authority is read from the vendored repo copy `deploy/voice/plated-defaults-CONTEXT.md` (dev) or the Supabase `voice_profile` table (production), NEVER a
~/.claudeMac path. GiGi reads the same source so they never drift; the personal half holds her real pillars + caption corpus. Note: the upstreamplated-defaults§7 event facts are stale (July 16/Japan), PERSONAL-BRAND.md section A carries the current facts (July 30, Japan cut), use those. - Tooling installed per SETUP.md (PySceneDetect, OpenCV, optional aesthetic scorer, whisper.cpp). The pipeline degrades gracefully and tells you what it skipped, it never silently scores video on nothing.
The pipeline (run in order)
Stage 0 · Resolve the link, intake, normalize, census
- Resolve the Drive link to a local mirror first:
scripts/sync-drive.sh "<link>"returns the local path. Cross-check its file count against the Drive MCP folder listing so nothing was missed in transfer. - Build a manifest of every asset from the local mirror. Capture filename, type, duration, timestamp.
- Normalize HEIC → JPG (Kailin shoots HEIC). The script does this; do not let HEIC slip past
*.jpgglobs. - Dedupe with visible verdicts. Near-identical takes collapse to the best one, but the losers are listed ("dupe of #3, kept sharpest") and counted. The best-take pick is made AFTER frame review, not before.
- SELF-CHECK · Coverage:
assessed + deduped + auto-rejected == uploaded. The run does not finish otherwise. This is the anti-skim, anti-silent-drop gate and the 6/23 fix.
Stage 1 · Auto pre-filter (reject the unusable, cheaply)
Run scripts/triage-media.py to auto-flag clips that are unusable on craft before spending any judgment on them:
- Blur (OpenCV Laplacian variance), exposure (luma histogram, blown/crushed), shake (optical-flow jitter).
- These are REJECT gates, not rankers. A flagged clip is held with a reason ("out of focus"), not killed silently, and can be rescued if the moment is irreplaceable.
Stage 2 · Per-asset review (watch everything, for real)
- Photos: look directly, describe what is actually in frame.
- Video:
triage-media.pysegments with PySceneDetect (AdaptiveDetector), samples several candidate frames per scene, and keeps the best-scoring one. The scorer is the built-in OpenCV proxy (sharpness + exposure + colorfulness) on the core install, no heavy deps needed; CLIP is optional and not required. Read the exported best-frame JPGs (small), never the video binary. If real speech is present (>15% non-silent), it transcribes with whisper.cpp for real. If whisper is unavailable, the sheet says "scored on visuals only" so it is never an invisible quality drop. - SELF-CHECK · Reality: descriptions match real frames. AI-heavy material flagged polish-only.
Stage 3 · Scoring (three axes + authenticity premium, see RUBRIC.md)
- Technical · craft. Decides feed-polished vs raw-native. Does NOT by itself kill a clip.
- Content value · hook, story, emotion, useful B-roll. The most important axis.
- Brand fit · which page the vibe belongs to.
- Authenticity premium: raw, confessional, founder-life footage (mic-buying, errands, Fan Fest) can score 95 on personal/TikTok. Over-polished, ad-like personal content gets MARKED DOWN, not up. Polish is a routing signal, not a status rank.
Stage 4 · Hook engineering (build, do not just grade, see HOOKS.md)
For every surviving asset, write 3 to 5 first-3-second hooks using named frameworks (open loop, POV, "nobody tells you," number, "watch til the end," transformation, confessional). Deliver three layers per chosen post: the on-screen text hook, the verbal hook, and the visual hook (what is literally on screen in second one). A caption is not a hook.
Stage 5 · Routing (personal-first, conversion-aware, series-aware, see ROUTING-TREE.md)
- Tie goes to personal. Plated earns the clip on clear event/brand fit.
- Event-critical Plated content routes to POLISH if below the feed bar, it does NOT auto-drop to TikTok. Only non-event content drops tiers freely for cadence.
- Tag each clip to a recurring series/format from FORMATS.md ("Episode 4 of 30 Days to Plated").
- Assign each post a conversion role: awareness / audience-build / soft-CTA / hard-CTA. Hold the FORMATS.md funnel ratio (default 70 build / 20 soft / 10 hard).
- SELF-CHECK · Orphan audit: every asset exits with destination + platform + series + reason.
Stage 6 · Trend and timing desk (see TRENDS.md)
For each TikTok/Reels-bound clip, use WebSearch to attach: a rising-but-not-saturated audio (real track name + link) per the Audio sweet-spot rule above (favor mid-traction sounds the algorithm is pushing over the mega-viral), the format/trend it can ride, the posting window for Kailin's audience, and a timeliness flag. Time-sensitive cultural moments (FIFA Fan Fest) jump to the FRONT of post order, they do not get buried by a quality score.
Stage 7 · The gate (honest, tiered, see BOARDS.md)
Three SELF-check lenses (Platform-Native, Brand-and-Strategy, Steve Jobs Final) at a floor tiered by destination. PLUS the real independence:
- Fresh sub-agent re-score (Agent tool) for anything bound above the personal-feed tier: the sub-agent sees only the asset and the rubric, no prior scores. Wide disagreement flags it for Kailin.
- Kailin's eyes are named as the final gate on anything going to the Plated feed.
- Floors are tuned for a pre-launch sprint where cadence beats pristine (see BOARDS.md), and Board 1 can FAIL a clip for being too polished on personal/TikTok.
Stage 8 · Output + feed-forward (see OUTPUT-TEMPLATE.md)
- The daily sheet: Do-this-first, the capped Ready list (Hook / Caption / CTA / Audio split out), Polish queue, Held/killed with reasons, Coverage line, "not your job today", first-hour engagement action per post.
- The 30-day campaign tracker: which series episodes have posted, the CTA cadence, days-to-launch, where the arc is thin.
- Coverage-to-shotlist: compare the day against FORMATS.md and the 30-day plan, then emit "what to film next" as a shoot-day brief. The triage plans the next shoot instead of leaving Kailin to improvise.
Reference files in this skill
SETUP.md· preconditions, local sync, one-time installs.PERSONAL-BRAND.md· pillars + voice corpus (FILL before first real run).RUBRIC.md· three axes + authenticity premium + reject gates.HOOKS.md· hook frameworks and the three-layer hook spec.ROUTING-TREE.md· personal-first tree, event-critical handling, conversion roles.TRENDS.md· the trend/audio/timing desk.FORMATS.md· recurring series registry, funnel ratio, campaign tracker.BOARDS.md· the gate, honest self-check vs real independence, tiered floors.OUTPUT-TEMPLATE.md· the daily sheet + campaign tracker + shotlist.REVIEW-NOTES.md· the v1 findings this rebuild fixes. Do not regress.VLOG-BUILDER.md· the repeatable 8-step process for turning a voiceover/script + footage into a finished narrated vlog (b-roll map -> Luma anchors -> one numbered Drive folder -> Descript assemble -> caption + subtitles -> 95 review -> route). Use whenever a client wants a narrated video. Proven on the Plated tickets + passport vlogs. Tool rule: Descript = VO+b-roll, Captions.ai = talking-head, Luma = stills-to-motion only.scripts/triage-media.py· HEIC normalize, PySceneDetect, blur/exposure gate, aesthetic frame pick, frame export, JSON manifest.scripts/sample-frames.sh· ffmpeg-only fallback if Python libs are unavailable.