ingest-youtube — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited ingest-youtube (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.
Full lifecycle for a single YouTube task: launch transcription → poll → summarise → write report → append suggestion → mark done.
Prerequisites:yt2docmust be installed locally. For Google Tasks API calls, refer to../gws-tasks/SKILL.md.
| Video Duration | Whisper Model | Est. Time | Min Local RAM |
|---|---|---|---|
| < 30 min | medium | 5–10 min | 4 GB |
| 30–60 min | small | 10–20 min | 6 GB |
| 1–2 hours | small | 35–55 min | 8 GB |
| > 2 hours | base | 50–80 min | 10 GB |
If duration is unknown, look it up via web search or yt-dlp --print duration_string. Default to the conservative path when uncertain.
mkdir -p reports/YouTube_YYYY_MM_DD
yt2doc \
--video "<YouTube URL>" \
--output ./reports/YouTube_YYYY_MM_DD/<video_id>.md \
--whisper-model <model> \
--add-table-of-contentsUse run_command with WaitMsBeforeAsync=5000, then poll with command_status.
Tell the user: "Launching yt2doc for <url> using the <model> model (~X–Y minutes)."
yt2doc not found? Tell the user to install it via uv tool install yt2doc.
command_status(command_id, WaitDurationSeconds=60) # repeat until DONEPeriodically report elapsed time: "Still transcribing <title>… (N minutes elapsed)."
On completion, check exit code:
"⚠️ FAILED: Process was killed, likely ran out of memory. Ensure you have enough free memory (8 GB minimum, 12 GB recommended)." Do not mark task done.Once the output file is confirmed non-empty:
📄 Read ../content-summary/references/summarise.mdExtract: video title (first # heading), chapter count, approximate character count. Generate summary in the configured output language.
📄 Read ../content-summary/references/filename_rules.md📄 Read ../content-summary/references/output_template.mdConfirm the file is written before proceeding.
📄 Read ../content-summary/references/ai_analysis.md📄 Follow ../content-summary/references/suggestion_log.md{SourceType} = YouTube
# Mark as completed
gws tasks tasks patch \
--params '{"tasklist": "<DELEGATE_LIST_ID>", "task": "<TASK_ID>"}' \
--json '{"status": "completed"}'
# Remove intermediate raw transcription file
rm "reports/YouTube_YYYY_MM_DD/<video_id>.md"Log: "✅ Task '<title>' marked as completed. Report saved to reports/YouTube_YYYY_MM_DD/<filename>.md. Intermediate file removed."
Exit code 137 / 9 (Killed/OOM): Ensure you have enough free memory. Retry with --whisper-model base if RAM is constrained.
`LLMModelNotSpecified` error: Do NOT use --segment-unchaptered without a local Ollama running. Remove that flag.
`ChunkedEncodingError`: Network interruption during model download — retry; it resumes from cache.
URL contains `&` in shell: Always wrap URLs in quotes.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.