post-content — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited post-content (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
One command, raw video in → scheduled posts out. The model drives — the scripts do the deterministic parts (find file, transcribe, upload). Will approves before anything ships to Buffer.
scripts/find_video.py with the intent.scripts/transcribe.py (local whisper.cpp — no API key, runs on-device. Cached next to the video as .transcript.txt).scripts/extract_cover.py. Default: frame at 0.5s. If /virality was run on this video, pull the peak-hook frame instead. Offer /thumbnail for a designed cover.ship, tweak X, or cancel. Never auto-post.scripts/buffer_post.py fans out to the selected Buffer channels.sessions/YYYY-MM-DD.md.The video's parent path determines voice. Always read the persona doc before drafting — caption voice is too easy to get wrong from filename guessing alone.
| Path pattern | Voice source |
|---|---|
STUDIO/1-WillSchwx.io/** | Will's locked voice — see references/voice-will.md AND ~/notes/your-brand/index.md |
STUDIO/[creator]/** (other) | ~/notes/[creator-slug]/ persona/voice docs |
ECOMMERCE/[brand]/** | ~/notes/[brand-slug]/ brand voice docs |
~/Downloads/** or anywhere else | Ask Will which creator/brand this is for — don't guess |
For Will: typographic discipline (command form, parallel structure, one idea per line, memorable metaphor allowed). For Example Creator specifically, the /caption-IG-Example Creator skill already encodes the voice — invoke it instead of recreating it.
Max 5 hashtags per caption. Compose them as: 1 niche + 1 broad + 2 thesis + 1 shareability. Never more, regardless of platform best-practice claims. (Will's standing rule.)
Captions may only reference what's in the transcript or what Will provided in this turn. No invented stats, names, dates, or claims. If a number/quote feels persuasive but isn't sourced, leave it out — don't fill the gap.
Default: IG Reels + TikTok + YouTube Shorts.
+linkedin / +threads to add.only ig / only tiktok / only shorts to restrict.queue → next available Buffer slot.at 7pm / tomorrow 9am → specific time (interpret in Will's local tz; today's date is in context).~/Desktop/STUDIO/**/virality/[video-stem]/score.json exists → pull peak_hook_timestamp and grab that frame via extract_cover.py --at <ts>.--at 0.5./thumbnail and use that output.Show this exact structure before calling Buffer:
Ready to ship:
Video: <basename> (<duration>s, <w>x<h>)
Cover: <path> ← reply "thumbnail" to upgrade
Channels: <ig/tiktok/shorts/...>
Time: <immediate | YYYY-MM-DD HH:MM tz | "next queue slot">
Caption (IG/TikTok primary):
<caption>
#tag1 #tag2 #tag3 #tag4 #tag5
LinkedIn (if selected):
<rephrased copy>
Reply: ship | tweak <what> | cancelAll scripts live in scripts/ and read flags from CLI. None of them call Buffer or Whisper unless invoked — safe to dry-run.
find_video.py <intent-string> → prints absolute path of the resolved video. Resolution order: 1) explicit path in intent, 2) newest .mp4/.mov/.mkv in ~/Downloads (≤ 7 days old), 3) newest in ~/Desktop/STUDIO/**/content/, 4) newest in ~/Desktop/ECOMMERCE/**/content/. Errors clearly if ambiguous.transcribe.py <video-path> → writes <video>.transcript.txt and prints the transcript. Skips if cache exists. Uses local whisper.cpp; auto-downloads the small.en model on first run.extract_cover.py <video-path> [--at <seconds>] → writes <video>.cover.jpg next to the video.buffer_post.py --video <path> --cover <path> --caption-file <path> --channels ig,tiktok,shorts --when <immediate|ISO8601> → posts via Buffer's GraphQL API at api.buffer.com. Requires BUFFER_ACCESS_TOKEN and ~/.claude/skills/post-content/config.json shaped {"organization_id": "...", "channels": {"ig": "<channelId>", "tiktok": "<channelId>", "shorts": "<channelId>"}}. Buffer's API has no upload endpoint, so the script either spins up a cloudflared tunnel automatically (default) or accepts --public-url-base <https-url> if you host the files yourself.Run pip install -r ~/.claude/skills/post-content/scripts/requirements.txt the first time.
~/.claude/skills/post-content/config.json must exist with organization_id + channels map. If missing, run python scripts/buffer_post.py --write-config once (after channels are connected in Buffer) — it auto-detects the org and maps services to keys (ig, tiktok, shorts, linkedin, threads).BUFFER_ACCESS_TOKEN must be exported (check ~/.zshrc or project .env). If missing, stop and tell Will exactly what to set and where.whisper-cpp must be on PATH — brew install whisper-cpp if missing. (No API key, no per-minute cost — runs locally.)cloudflared must be on PATH — brew install cloudflared if missing. Used to expose the local video file to Buffer's servers for the duration of the post-creation call. Skip if passing --public-url-base (you host the files yourself)./virality — run BEFORE posting to score the hook; reuse its peak_hook_timestamp for cover./thumbnail — designed cover overlay; use when Will accepts the upgrade./caption-IG-Example Creator — Example Creator captions live there; defer to it instead of duplicating voice rules./vysionary-carousel — Will's @yourbrand.ai posts that are carousels, not reels — route those over there instead./vysionary-carousel or post manually.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.