ワンクリックで
schedule-drip
Deterministic greedy scheduler over the graded clips — the only skill that attacks the
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Deterministic greedy scheduler over the graded clips — the only skill that attacks the
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Animate the title as a COLD OPEN in the TOP banner over the live opening footage — no blocking center card — held until TITLE_SWAP (default 2.0s) so brand-overlays can hand off to the source citation in the same slot. Frame 1 stays content (a face mid-sentence) to protect the swipe-rate / "Stayed to Watch" signal. ONE animation for every short — the glitch style (RGB-split banner + scanline tear, style-matched zap/crackle SFX) — a PIL frame sequence anchored at TITLE_ANCHOR_FRAC (default 0.135).
Generate a per-clip third-person engagement-driven title card text. Claude reads the clip's transcript, the source ingest.json metadata, and (optionally) pick-segments' per-span judgment (topic, rationale, suggested title) so it reads the speaker's register — sincere vs ironic vs joking — before titling. Emits a hook-driven ALL-CAPS title (<=7 words).
Per-clip upload-readiness grade (0-99) read off a FINISHED .mp4 plus its persisted sidecar plans — the first skill that inspects a delivered pixel-level artifact, the on-disk proxy for YouTube's VVSA swipe gate. Deterministic retention-proxy floor (frame1_is_face, letterbox_bars, credit_lit_at_open, first_visual_change, first_payoff_offset, longest_static_gap, opening_caption_words, max_residual_silence, terminal_loop_score) with hard caps (letterbox / face_withheld / credit_at_open / blocking_card / dead_tail) that cap grade≤40, plus ONE batched Claude rubric call (hook↔payoff / open-loop / cold-context) skipped when GRADE_SKIP_CLAUDE=1. Runs at the END of the per-span chain (after save-local) AND standalone over the whole output/ backlog (--backlog → output/_triage.json). Emits clip_NN.grade.json per the locked SELECTION-SUITE-CONTRACT schema. Idempotent (.gcmeta), non-fatal (any error → DROSS/empty, exit 0).
Claude picks CONTEXTUAL/scene-level anchors from a clip transcript (literal objects, establishing shots, evocative concept footage matched to the story's tone — not just keyword nouns) and sources full-bleed B-roll cutaways via keyless yt-dlp YouTube search + mcptube frame-sampling + Claude vision verify. The verify step gets the spoken context and rejects literal-but-wrong matches (e.g. a cat laser toy for a tense "red dot" beat). Aims dense (8-12 windows, targeting cutaway footage on ~60%+ of the runtime; emits cutaway_coverage in the plan and WARNs below BROLL_MIN_COVER, default 0.6). Emits broll_plan.json with per-cutaway placement [t0,t1] and source metadata; clip files are namespaced per-clip. Windows snap to whole chunk-captions boundaries; vision calls capped by BROLL_VISION_CAP (default 16).
Pick N clip-worthy spans from a transcript. Claude reads the full transcript plus a per-second RMS energy summary and returns the most engaging time ranges for shorts. The atomic unit of a short is ONE IDEA, not one topic — each span carries `cuts` (1-3 non-contiguous source ranges assembled into one flowing story) plus `idea` (the one-sentence throughline all cuts share). A multi-cut span may pull cuts from DIFFERENT topics when they develop the same single idea; a single-cut span must stay within one topic and is just `cuts:[[t0,t1]]`. A 1-second SPOKEN hook is mandatory (no title card rescues a slow open — picks under PICK_HOOK_FLOOR are dropped). Replaces the old keyword/hook-word heuristic ranker.
Deterministic source-video discovery — the clip-channel "outlier" method, keyless. Searches seed niche queries via yt-dlp ytsearch, prefilters to long-form candidates, fetches full metadata, and ranks by outlier score (views/day velocity, views-per-subscriber ratio, comment engagement, replay-heatmap peakiness). Emits a ranked candidates.json to pick the next pipeline source from. No Claude call, no API key.
| name | schedule-drip |
| description | Deterministic greedy scheduler over the graded clips — the only skill that attacks the |
| allowed-tools | Bash |
| user-invocable | true |
The selection suite's drip stage. The pipeline today is produce-only: it renders clips and stops. The human picks ~19 by hand, dies 37% of the time on topic, and the channel takes 7-day dark gaps while ~80 quality clips rot on disk. With no evergreen tail (86-100% of a short's views land in days 1-3), a dark day is permanent lost reach — the #1 unconfounded leak in the 28-day analytics.
schedule-drip is the deterministic greedy scheduler that fixes it. It consumes
grade-clip's grade.json verdicts plus a checked-in topic scorelist and stages
a daily drip into output/_toupload/<date>/. Staging-handoff only — it never
uploads (there is no API key in the stack); a human posts from the dated
folders.
schedule-drip.sh [output_dir=output]
output/**/*.grade.json (skips _preview / source / _toupload /
_triage). The locked schema lives in SELECTION-SUITE-CONTRACT.md.topics.scorelist (checked in here) — one rule per line, <GO|HOLD> <regex>,
matched case-insensitively against source-slug + title. HOLD is a denylist
and WINS over an incidental GO substring (e.g. "focus" inside a
productivity-death source's "stay-focused"). Default when nothing matches:
HOLD (conservative).output/upload-log.json — a list, or {uploaded|posted: [...]}, of
already-posted clip paths / basenames / titles. Absence means "nothing posted
yet" — never a crash.date.tier==GOLD with no hard_caps, OR
grade>=GRADE_MIN_UPLOAD with no hard_caps. A clip with any unfixed hard cap
stays out of the drip until fix-cold-open repairs it.upload-log.json.clip / clip-1.25x speed-up twins).topics.scorelist.POSTS_PER_DAY per day,
MAX_PER_SOURCE_PER_DAY round-robin across sources (the 53-from-one-source
feed-fatigue fix — no day ever gets two clips from the same source).gap_warnings — any day still empty after backfill (the dark-gap alarm).output/_toupload/<YYYY-MM-DD>/ per filled day: the staged clip (copy) +
metadata.txt (lowercased title + #-hashtags from the matched GO rule and the
source slug, plus #shorts #fyp).output/_toupload/schedule.json — {generated, horizon_days, posts_per_day, max_per_source_per_day, days:{date→[clips]}, gap_warnings, backfilled, drops}.
drops records every not_schedulable / already_posted /
dedupe_near_identical / horizon_full decision.Idempotent: _toupload is rmtree'd and rebuilt every run — a re-run yields a
byte-identical plan and never duplicates staging. Non-fatal: any error exits 0
without staging.
| Env | Default | Meaning |
|---|---|---|
POSTS_PER_DAY | 1 | clips staged per day |
MAX_PER_SOURCE_PER_DAY | 1 | per-source round-robin cap (feed-fatigue fix) |
DRIP_HORIZON_DAYS | 14 | days to plan ahead |
GRADE_MIN_UPLOAD | 60 | shared with grade-clip; the schedulable grade floor |
There is no selection / scheduling step at all. This is the only skill that directly attacks the dark gap and the backlog rot — it turns "101 produced / 19 uploaded" into a multi-week daily drip with zero new source ingestion.