tasks(using-yt-tools): close 3 finding fixes 🟢🟢🟢

- using-yt-tools-transcript-paragraphs-fix → a0e4cc8 (yt-tools 0.1.1, hybrid #4)
- using-yt-tools-frames-stderr-fix → 6961796 (yt-tools 0.1.2, ffmpeg pre-check + _format_subprocess_failure)
- using-yt-tools-windows-path-doc-fix → 2471228 (yt-tools 0.1.3, README winget+PATH note)

yt-tools 0.1.0 → 0.1.3. 67 → 74 tests (3 markdown + 4 frames). 74/74 green.
Remaining:  using-yt-tools-trigger-smoke-clean-session (needs fresh CC session),
🔵 using-yt-tools-review (still blocked on SKILL.md body fill).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-20 12:27:53 +03:00
parent e3cfe623d8
commit e83038965b

View File

@@ -1,5 +1,5 @@
# Task Board # Task Board
_Updated: 2026-05-20 (using-yt-tools impl: 3 baseline 🟢; test-trigger partial — CLI e2e + iterative-flow done, 4 findings filed as new ⚪ tasks; review still 🔵 — now blocked on SKILL.md body fill)_ _Updated: 2026-05-20 (using-yt-tools: 3 baseline 🟢; 3 finding fixes 🟢 [paragraphs/frames-stderr/windows-path-doc] → yt-tools 0.1.0→0.1.3, 74/74 tests; trigger-smoke-clean-session still ⚪ (needs fresh CC session); review 🔵 on SKILL.md body fill)_
<!-- <!--
Canonical layout. One block per task. Per-task deep context lives in Canonical layout. One block per task. Per-task deep context lives in
@@ -83,52 +83,33 @@ Mode: **`pending`** — скил вызывает внешние CLI (yt-dlp/ffm
--- ---
## [using-yt-tools-transcript-paragraphs-fix] — Fix paragraph segmentation in yt-transcript — 4s-gap heuristic collapses densely-captioned videos into one block. ## 🟢 [using-yt-tools-transcript-paragraphs-fix] — Fix paragraph segmentation in yt-transcript — 4s-gap heuristic collapses densely-captioned videos into one block.
**Symptom:** 9:51-минутное видео (3blue1brown chapter 1 с community-submitted EN-субтитрами) превращается в один параграф с единственным `[0:00]`-якорем. Voids iterative-флоу primary use-case — агент не может выбирать таймкоды по содержанию. **Status:** done
**Where I stopped:** Closed by `a0e4cc8` (yt-tools 0.1.1). Гибрид #4 в `_group_paragraphs`: gap > 4s OR elapsed > 45s OR sentence-end (`.?!…`) после ≥15s от начала параграфа. E2E на `fNk_zzaMoSs` (9:51): **31 anchor** at ~15-25s intervals (был 1). 70→74 unit-тестов 🟢 (3 новых в `test_markdown.py`: dense-snippets, sentence-end-after-min, sentence-end-no-split-before-min). Параметры `max_paragraph_seconds` / `sentence_split_seconds` пробрасываются через `snippets_to_markdown` для тюнинга.
**Корень:** `yt_tools/markdown.py:_group_paragraphs` группирует snippet'ы только при gap > `DEFAULT_PARAGRAPH_GAP_SECONDS=4.0`. У профессиональных каналов и YouTube auto-subs snippet'ы стыкуются без 4-секундных пауз. **Next action:** (none — kept until merged)
**Branch:** master
**Варианты фикса** (брейнсторм для имплементера): <!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-20 / acceptance: ≥5 anchors ✅ (31 на test URL); unit-тест paragraphs>1 ✅; existing tests green ✅ -->
1. Снизить дефолт до 1.0-2.0s — простой, но всё ещё может схлопывать монотонные блоки.
2. Жёсткий cap по `max_paragraph_seconds` (например 45s) — гарантирует якоря каждые ~45 сек независимо от gap.
3. Сегментация по пунктуации (`.`, `?`, `!` в конце snippet'а) + минимальный интервал между якорями.
4. Гибрид: gap OR max-duration OR sentence-boundary (whichever fires first).
**Acceptance:** на том же test-URL (`fNk_zzaMoSs`) транскрипт содержит ≥5 anchors at sane intervals (~1-2 min). Unit-тест в `tests/test_markdown.py` с фикстурой плотных snippet'ов (gap < 1s) проверяет, что paragraphs > 1. Существующие 67 тестов остаются зелёными.
**Status:** ready
**Where I stopped:** (not started — finding from using-yt-tools-test-trigger 2026-05-20)
**Next action:** Решить approach (рекомендую гибрид #4). Реализовать в `_group_paragraphs`. Добавить unit-тест. Прогнать pytest. Прогнать e2e на `fNk_zzaMoSs`. Обновить yt-tools `version: 0.1.0``0.1.1` в `pyproject.toml`.
**Branch:** n/a
--- ---
## [using-yt-tools-frames-stderr-fix] — yt-frames swallows yt-dlp/ffmpeg stderr, hiding real failure cause. ## 🟢 [using-yt-tools-frames-stderr-fix] — yt-frames swallows yt-dlp/ffmpeg stderr, hiding real failure cause.
**Symptom:** При запуске `yt-frames URL --timestamps ...` без ffmpeg на PATH — вывод `error: yt-dlp source download failed:` без описания (после двоеточия пусто). Реальная причина (yt-dlp требует ffmpeg для muxing) скрыта. **Status:** done
**Where I stopped:** Closed by `6961796` (yt-tools 0.1.2). Pre-check `ffmpeg` в `_ensure_source_mp4` (yt-dlp требует его для mux) → missing-ffmpeg теперь выдаёт `"ffmpeg not found on PATH"` до запуска yt-dlp. Helper `_format_subprocess_failure(proc, label)` собирает `exit N | stderr/stdout tail | no output hint`, применён в обоих сайтах failure (`_ensure_source_mp4`, `_ffmpeg_extract_from_file`, `_ffmpeg_extract_streaming`). `--no-warnings` дропнут на yt-dlp invocations чтобы warnings попадали в captured output. 4 новых теста в `tests/test_frames.py` (missing ffmpeg / stderr surfaced / stdout-only surfaced / empty-empty hint). 74/74 🟢.
**Корень:** в `yt_tools/frames.py` (или вызывающем слое) подавляется `stderr` от yt-dlp/ffmpeg subprocess, печатается голое сообщение без cause. **Next action:** (none — kept until merged)
**Branch:** master
**Acceptance:** при отсутствии ffmpeg вывод содержит указание на ffmpeg как причину (либо явно «ffmpeg required on PATH», либо передача yt-dlp stderr в верх). Аналогично для других fail-mode (network, private video, age-gated). <!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-20 / acceptance: ffmpeg-named ✅; other fail-modes via formatter ✅; unit-тест на mock fail ✅; pytest 🟢 -->
**Status:** ready
**Where I stopped:** (not started — finding from using-yt-tools-test-trigger 2026-05-20)
**Next action:** Найти точку подавления в `frames.py`. Пробросить stderr (capture + re-print) или хотя бы exit-code → message map. Unit-test на mock yt-dlp с симулированным fail. Pytest зелёный. Bump `pyproject.toml` version.
**Branch:** n/a
--- ---
## [using-yt-tools-windows-path-doc-fix] — README install section should warn about restart-shell-after-winget on Windows. ## 🟢 [using-yt-tools-windows-path-doc-fix] — README install section should warn about restart-shell-after-winget on Windows.
**Symptom:** `winget install Gyan.FFmpeg` записывает ffmpeg в user-PATH, но текущая bash/PowerShell сессия (а также Claude Code git-bash subshell) PATH не подхватывает до рестарта. Агент в CC-сессии видит «ffmpeg not found» даже после успешного winget. **Status:** done
**Where I stopped:** Closed by `2471228` (yt-tools 0.1.3). README Install section получил `> **Windows note.**` блок: winget пишет в per-user PATH, текущий shell (вкл. git-bash subshell внутри CC) его не перечитывает; canonical fix = restart terminal + Claude Code session; verify via `where.exe ffmpeg`. In-session workaround упомянут (lookup путь через `winget show <package>``$env:Path +=`). Заодно sync test count 67 → 74 (drift от 0.1.1 + 0.1.2 additions).
**Acceptance:** `~/projects/.common/lib/yt-tools/README.md` (раздел Install / Windows) содержит note: «после `winget install Gyan.FFmpeg` перезапустить терминал (и Claude Code session) — winget пишет в user-PATH, который текущая сессия не перечитывает». Опционально — workaround-команда для exposure без рестарта. **Next action:** (none — kept until merged)
**Branch:** master
**Status:** ready <!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-20 / acceptance: README warn block с restart + workaround ✅ -->
**Where I stopped:** (not started — finding from using-yt-tools-test-trigger 2026-05-20)
**Next action:** Дописать раздел в README пакета. Bump `pyproject.toml` patch version. Это правка в `.common/lib/yt-tools/`, не в `claude-skills/` — таска живёт здесь как coordination-point.
**Branch:** n/a
--- ---