بنقرة واحدة
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.