yt-dlp resolves media URLs (StreamUtils) but is a static bundled binary that
only refreshes on a panel update — the shipped 2025.07.21 is ~13 months stale,
which breaks extraction. Add self-updating, reusing the existing binaries
self-heal mechanism (no new cron/crontab row):
- New `console.php ytdlp` (YtDlpCommand), modelled on FanoutBinaryCommand:
resolves the latest upstream `yt-dlp/yt-dlp` release, and on a version mismatch
downloads the `yt-dlp` asset, verifies it against upstream `SHA2-256SUMS`,
run-tests `--version`, then atomically swaps + chowns xc_vm. A broken download
never replaces a working binary.
- RootSignalsCronJob: poll `console.php ytdlp` daily (stamp `ytdlp_check`, 86400s),
next to the fanout_binary / xcvm_core self-heal — runs on main + LB, first pass
immediately.
- Settings → Info: show the live yt-dlp `--version`; drop the (now auto-updated,
always-stale) yt-dlp version row from the README tech stack.
Validated against upstream: asset `yt-dlp`, `SHA2-256SUMS`, checksum match,
`--version` run-test (latest 2026.08.19).
The Docsify hash routes (`/XC_VM/#/en-us/…`, `#/ru-ru/…`) no longer exist after
the MkDocs Material migration. Point the README at the new URLs: English at the
site root, Russian under /ru/, and pages as directory URLs.