Repository navigation
Description
The problem
When YouTube asks yt-dlp to sign in ("confirm you're not a bot"), ncly transcript run youtube answers TEMPORARY with exit 75 and the hint "Run the same call again later". Exit 75 lets an agent repeat the call on its own, and the same IP keeps getting the same refusal. The answer never says that cookies, the browser = "arc" setting of transcript, would get past it.
What we saw
During the macOS Verify of #289 (#266) on the mbp, at 2bc3674, Fake key of transcript-run.md failed twice, at 21:50 and at 22:08 America/Montreal, with exit 75 TEMPORARY. om1, on the same network, passed the same step at 21:50. A run with --verbose showed yt-dlp's diagnostic:
transcript: Starting the audio download...
yt-dlp failed: WARNING: [youtube] EIEc43CxIvY: Unable to download webpage: HTTP Error 429: Too Many Requests (caused by <HTTPError 429: Too Many Requests>) WARNING: [youtube] Unable to fetch GVS PO Token for web client: Missing required Visitor Data. You may need to pass Visitor Data with --extractor-args "youtube:visitor_data=XXX" ERROR: [youtube] EIEc43CxIvY: Sign in to confirm you’re not a bot. Use --cookies-from-browser or --cookies for the authentication. See https://github.com/yt-dlp/yt-dlp/wiki/FAQ#how-do-i-pass-cookies-to-yt-dlp for how to manually pass cookies. Also see https://github.com/yt-dlp/yt-dlp/wiki/Extractors#exporting-youtube-cookies for tips on effectively exporting YouTube cookies
{"ok":false,"contract_version":1,"run_id":"verify-fake-diag","results":[{"ok":false,"output_dir":null,"transcript":null,"url":"https://www.youtube.com/watch?v=EIEc43CxIvY","errors":[{"code":"TEMPORARY","message":"YouTube did not answer for https://www.youtube.com/watch?v=EIEc43CxIvY, so no audio was downloaded.","hint":"Run the same call again later."}]}],"errors":[{"code":"TEMPORARY","message":"Some work failed for a reason that may pass.","hint":"Run the same command again."}]}
The final ERROR is the sign-in request. The 429 is a WARNING before it.
What exists today
At 4d61b56, extensions/transcript/python/youtube.py lines 38 to 43 define YTDLP_TEMPORARY, which matches HTTP Error (?:429|5\d\d) anywhere in the diagnostic. Lines 145 to 149 raise YtDlpError with temporary from a search over the whole diagnostic (line 147), so the warning wins over the final error. transcript.py lines 115 to 119 then map it to download_temporary, which spec/protocol.md line 58 maps to TEMPORARY.
Decision
A sign-in request answers TRANSCRIPT_DOWNLOAD_FAILED (exit 1), and its hint names the browser setting of transcript. Do not add an error code. No refusal that waiting does not fix gets exit 75.
Pascal decided this on 2026-11-03, after the reality check.
Acceptance rules
- The final
ERRORrecord of the yt-dlp diagnostic decides the code. AWARNINGbefore it does not. - The classification reads the raw diagnostic, before
_clean_subprocess_diagnosticcollapses it and cuts it to 2,000 characters (youtube.pylines 152-161). - A final
ERRORthat names a network failure ofYTDLP_TEMPORARY(youtube.pylines 37-42), such as HTTP 429, HTTP 5xx, orConnection refused, staysTEMPORARY(exit 75). - A final
ERRORthat asks for a sign-in answersTRANSCRIPT_DOWNLOAD_FAILED. - Another final
ERRORanswersTRANSCRIPT_DOWNLOAD_FAILED, so that an agent does not retry it on its own. - A diagnostic with no
ERRORrecord keeps the classification of today.
Check
NCLY_TEST_DOWNLOAD skips the classification (python/testing/launcher.py lines 82-102), so the tests use a stub yt-dlp. Tests prove these cases:
- The diagnostic above:
TRANSCRIPT_DOWNLOAD_FAILEDwith thebrowserhint - A sign-in
ERRORafter more than 2,000 characters of warnings:TRANSCRIPT_DOWNLOAD_FAILED - A final 429
ERROR, a final 503ERROR, and a finalConnection refusedERROR:TEMPORARY - An unknown final
ERROR:TRANSCRIPT_DOWNLOAD_FAILED Connection refusedwith noERRORrecord:TEMPORARY, as today
just check passes.
Found outside the plan, by Cook 2.1 of brigade e3dd, during the Verify of #266. Out of Epic 13's scope.
by Opus-5.5 via Claude Code
Activity