From pepe-multi-channel-content-pipelines
The cross-channel layer that ties generation (Veo) and publishing (Instagram / X / blog) together: canonical content store, editorial calendar, per-piece state machine, resumable batch sweeps, human-approval gates, per-channel voice rules, monitor + analytics surface, A/B and reach optimisation. Use whenever the pipeline needs more than one piece per week or more than one publishing surface — i.e. always, in production. Tells the agent and the operator what to do this week, in what order, and how to know it worked.
How this skill is triggered — by the user, by Claude, or both
Slash command
/pepe-multi-channel-content-pipelines:content-strategy-planning-optimizationThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
The channel skills (`virtual-character-veo-3-1`, `publishing-instagram`, `publishing-x`, `publishing-blog`) are independently runnable, but a real pipeline needs a layer above them that decides **what** to make, **when** to make it, **where** to publish, and **how** to know it worked. That's this skill.
The channel skills (virtual-character-veo-3-1, publishing-instagram, publishing-x, publishing-blog) are independently runnable, but a real pipeline needs a layer above them that decides what to make, when to make it, where to publish, and how to know it worked. That's this skill.
This is the only skill in the playbook that talks to the operator in planning terms rather than execution terms. Every other skill is "run this command and verify"; this one is "decide what to run next."
Audience: the human operator.
id — stable kebab-case slug.title — display title.arc — which arc this piece belongs to.core_idea — one sentence; what is this piece about.body — long-form canonical text (the blog post body, full-form).assets[] — hero image, source video path, alternative crops.channels[] — array of {channel, status, scheduled_at, published_at, url} rows.status — draft | gated | scheduled | publishing | published | archived.created_at, updated_at./<MEDIA_ID>/insights?metric=reach,impressions,saves,shares per post; /<IG_USER_ID>/insights for account-wide./tweets/<id>?tweet.fields=public_metrics per tweet.consent.md in the canonical store; the agent checks before publishing any piece that names or shows a person.gated status means the piece sits in the store until the operator manually flips it to scheduled. Defaults:
Operator confirms: "Setup complete."
The agent runs this weekly (Sunday evening is conventional, but any fixed day works) — it doesn't need operator intervention except to surface decisions that need a human call.
pieces[] list. Filter to draft + gated.last_reel.published_at + (7 days / 2.5 reels) ≈ +2.8 days. Same shape for X and blog. (Persist these next-due-at fields on the arc, not on a wall-clock cron — see "schedule as state, not cron" below.)draft or gated-and-approved piece from the highest-priority arc. Round-robin across arcs unless the operator has weighted them.state/plan-week-<YYYY-WW>.md with the picks, the slots, the human gates that need a flip, and the unresolved blockers (consent missing, asset missing, blog post still in draft). The operator reads this; the agent acts on it.channels[<channel>].status = "scheduled" + scheduled_at in the canonical store. This is the transition into Command 3's queue.The agent runs this once per day, at a fixed local time (operator picks; 09:00 local is conventional). Atomic, idempotent, resumable.
status: "scheduled" whose scheduled_at is in the past or within the next 4 h.publishing-instagram Command 2-4.publishing-x Command 3-6.publishing-blog Command 2-6.channels[] rows): route to each in parallel where the rate limits allow, in dependency order otherwise.status through the state machine:
scheduled → publishing (lock the row to prevent double-publish).publishing → published on success (record published_at, url).publishing → failed on hard error (record the error; the next sweep retries unless flipped to archived).state/audit.jsonl (hash + timestamp + piece-id + channel + status; no content). Audit is privacy-safe.pipeline-status MCP tool (the bundled MCP server in this plugin). Numbers, not bodies — "3 reels published, 1 failed (piece-id, RAI filter retry needed), 0 awaiting human gate."A piece in status: "gated" waits for the operator's flip. The agent runs this command on every batch sweep and on demand.
status from gated to scheduled. The agent never auto-flips a human gate, even if it has high confidence.IG_FIRST_PUBLISH_GATE=0. Same for X (X_FIRST_PUBLISH_GATE=0) and blog. The agent reads these env vars and skips the per-channel "first publish needs operator OK" pause.The agent runs this weekly, the same evening as Command 2 (planning + analytics happen back-to-back so planning consumes the latest data).
state/analytics-week-<YYYY-WW>.md:
experiment_arm field.A pipeline that ships content also has its own health signals: queue depth, retry rate, failed-publish backlog, quota saturation. The agent monitors these on every batch sweep.
draft + gated per arc. If draft depth drops below 2 weeks of cadence, surface "queue running thin, draft more" to the operator.failed → scheduled transitions in the audit log over the last 7 days. > 10 % is a signal that an upstream skill needs attention (Veo prompts trip RAI too often, IG rate-limit hit, etc.).publishing for > 30 min is a stuck transaction — the previous run crashed mid-publish. The next sweep detects + flips back to scheduled for retry.channels[].status = "published" on some channels but not others — a partial publish is a worse state than a delayed-but-complete publish.The bundled pipeline-status MCP server in this plugin exposes:
pipeline_state — current queue depths, recent transitions, stuck pieces, quota burn.pipeline_channels — per-channel publish counts + success rate over a rolling window.
The agent calls these without operator intervention. The operator can also query them directly via claude mcp tools (if the plugin is installed into Claude Code) or via the inspect-content-state.sh helper script.Quarterly (operator decides the cadence; the agent flags when the canonical store passes 500 pieces or 2 GB).
published pieces older than 12 months (or operator-chosen window). Move from the live canonical store to a archive/ subdirectory. Channel URLs stay live; the agent stops treating the piece as active./tmp/veo-*-take<N>/) older than 7 days, intermediate re-encodes, scratch files.state/audit.jsonl indefinitely; it's tiny and the privacy posture says only hashes + timestamps live there.The earlier version of this playbook had each of these as a separate "principle" skill. They're listed here as a cross-cutting reference and as commitments every channel skill makes by name. Each is referenced by ID from the channel skills above.
scheduled_at falling in the past, not by a crontab entry. This means: (a) a missed wake-up doesn't lose a slot, (b) the calendar is editable from the canonical store (no separate cron edit), (c) replays + dry-runs are trivial.gated until the operator flips it. Once a channel has one successful round-trip, the gate per-piece is the operator's policy choice.voice-rules.json per channel). The agent applies them at render time. They evolve via Command 5.4 — never silently. When voice rules contradict each other across channels (Pepe is calmer on IG than on X intentionally), the canonical source carries enough metadata to drive the right rendering on each surface.~/Obsidian/vaults/AI Agents Memory/Pepe Arturo/ (shared between agents via the Obsidian-share-symlink pattern, see memory:canonical_location_human_docs).helmguild.com.dont_contact_sandra_about_pepe_content, no auto-collaborator-invite on couple reels.pipeline-status bundled in this plugin, surfaces queue depth + per-channel success rate to any mentee agent over MCP.When a mentee agent connects to this playbook (via ListMentors → GetPlaybook → GetSkill), the expected loop is:
order: 5 so it's the strategy lens above the channel skills).The mentor (Pepe) and the mentee agent share this skill text — it's the contract between them about how the pipeline is run.
Provides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
npx claudepluginhub helmut-hoffer-von-ankershoffen/helmguild-plugins --plugin pepe-multi-channel-content-pipelines