executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
video-ingestIngests a video's content (YouTube and similar) for agent context, routing by capability, task need, and video length — a natively multimodal engine (Gemini via agy or the Gemini API) for direct-URL and long video, Claude vision over ffmpeg-extracted frames when no such engine is present, yt-dlp captions when the transcript alone suffices, and the logged-in…
Independent GitHub snapshot · Automated classification · Original documentation governs
A video carries two separable signals: the spoken transcript (text) and the visual content (on-screen demos, slides, UI). Captions give only the first. So the route is chosen by what the task needs × what engine is available × video length — not a single fixed path. This reuses frontier-digest's capability-over-engine logic and adds on-demand, need-based routing, a Claude-native frame path, output normalization, and a governance cross-check.
FH's increment over a raw video executor (sister asset claude-video, github bradautomates/claude-video;
cross-audit note in a private companion store): the executors watch; FH governs — the
governor never trusts a multimodal "comprehensive read" at face value, it cross-checks claims against the
transcript / a second pass. Same compose pattern as the other FH↔executor pairs.
Resolve the engine by capability, not name, via frontier-digest's Sidecar Engine Resolution
Protocol (plugins/fh-meta/skills/frontier-digest/SKILL_detail.md §Video-Harvest — single source of
the probe commands). Length is the 2nd axis (claude-video is sparse past ~10min). The ladder:
gemini CLI is
EOL (2026-06-18), so probe agy / the Gemini API. Caveat (measured): a YouTube URL works, but an
arbitrary (non-YouTube) stream is not reachable headless (needs file upload) — degrade for those.ffmpeg extracts frames (auto-scaled,
cap ~2fps/100 frames) → Claude's own vision via Read reads them as images (the claude-video
pattern). No separate runtime, no Gemini-EOL exposure. Caution: claude-video itself is a 3rd-party
executable (brew installs + optional Whisper egress) — if invoking it directly, review first; the
ffmpeg+Read mechanism can also be run inline without it.yt-dlp --no-update --skip-download --write-auto-subs --sub-langs en \
--sub-format json3 -o "/tmp/yt_%(id)s.%(ext)s" "<URL>"
python3 -c "import json,sys,re;d=json.load(open(sys.argv[1]));print(re.sub(r'\s+',' ',' '.join(s.get('utf8','') for e in d['events'] for s in e.get('segs',[]) if s.get('utf8','').strip())).strip())" /tmp/yt_<id>.en.json3
--write-subs (human captions) preferred when present. Keep yt-dlp current (pip install -U yt-dlp;
version/impersonation warnings are non-blocking). yt-dlp also supplies the transcript the governor
cross-checks a Tier-1 visual read against.mcp__claude-in-chrome__* tools are outside this skill's allowed-tools). Caveat: needs the Anthropic
"direct" plan — unavailable on a corp Bedrock laptop; surface the limit, do not loop.A Tier-1 engine's "comprehensive read" is a self-report, untrusted like any sidecar output. The governor cross-checks its key claims against the transcript (Tier 3) or a second targeted frame pass before accepting; a visual claim that contradicts the transcript or cannot be re-grounded is flagged, not relayed as fact. (This is the governance claude-video has no equivalent for.)
Write clean text (+ visual notes if Tier 1) and metadata (video id, title, duration, source: multimodal
vs transcript, caption type human/auto) to a predictable path (/tmp/yt_<id>_ingest.txt or a
caller-specified path). Downstream grounding ingest is corpus-grounding-expander's job — video-ingest
produces the artifact, it does not ingest into a store.
gemini/agy/yt-dlp/ffmpeg is present.