From e3cfe623d8dcd4b4840944262475255b0e52f881 Mon Sep 17 00:00:00 2001 From: vitya Date: Wed, 20 May 2026 10:58:48 +0300 Subject: [PATCH] =?UTF-8?q?tasks(using-yt-tools):=20close=20test-trigger?= =?UTF-8?q?=20partial=20+=20file=204=20findings=20=F0=9F=9F=A2=E2=9A=AA?= =?UTF-8?q?=E2=9A=AA=E2=9A=AA=E2=9A=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closed using-yt-tools-test-trigger as **partial** — CLI e2e + iterative-flow on 3blue1brown «Vectors, Ch.1» (fNk_zzaMoSs, 9:51 EN) exercised the primary path: yt-transcript ✓, yt-frames ✓, Read on 3 jpgs ✓, vision-anchored answer ✓. Trigger smoke (parts 1+2) split out — it needs a clean CC session, which this one is not. Filed 4 new ⚪ tasks: - transcript-paragraphs-fix — _group_paragraphs collapses dense captions into 1 block (broken on community/auto subs without >4s gaps); single [0:00] anchor on a 9:51 video kills the iterative-flow primary use-case. - frames-stderr-fix — `error: yt-dlp source download failed:` with empty tail when ffmpeg missing; real cause swallowed. - windows-path-doc-fix — README should note restart-shell after `winget install Gyan.FFmpeg` (user-PATH not picked up by the currently-running git-bash subshell). - trigger-smoke-clean-session — 10 positive + 3 false-positive trigger probes, requires a fresh CC session. Review (🔵) updated: 3 baseline impl tasks all 🟢, but the acceptance criteria for Steps / Failure modes / What NOT to do target SKILL.md body which is still empty stub. New blocker: second-pass body fill (separate task — not filed here). Co-Authored-By: Claude Opus 4.7 (1M context) --- .tasks/STATUS.md | 92 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 84 insertions(+), 8 deletions(-) diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index b125faf..d0b88ad 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1,5 +1,5 @@ # Task Board -_Updated: 2026-05-20 (using-yt-tools impl: install + hermes-mapping 🟢; test-trigger 🔴 active, CLI e2e in progress)_ +_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)_ + + +--- + +## ⚪ [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 — агент не может выбирать таймкоды по содержанию. + +**Корень:** `yt_tools/markdown.py:_group_paragraphs` группирует snippet'ы только при gap > `DEFAULT_PARAGRAPH_GAP_SECONDS=4.0`. У профессиональных каналов и YouTube auto-subs snippet'ы стыкуются без 4-секундных пауз. + +**Варианты фикса** (брейнсторм для имплементера): +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. + +**Symptom:** При запуске `yt-frames URL --timestamps ...` без ffmpeg на PATH — вывод `error: yt-dlp source download failed:` без описания (после двоеточия пусто). Реальная причина (yt-dlp требует ffmpeg для muxing) скрыта. + +**Корень:** в `yt_tools/frames.py` (или вызывающем слое) подавляется `stderr` от yt-dlp/ffmpeg subprocess, печатается голое сообщение без cause. + +**Acceptance:** при отсутствии ffmpeg вывод содержит указание на ffmpeg как причину (либо явно «ffmpeg required on PATH», либо передача yt-dlp stderr в верх). Аналогично для других fail-mode (network, private video, age-gated). + +**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. + +**Symptom:** `winget install Gyan.FFmpeg` записывает ffmpeg в user-PATH, но текущая bash/PowerShell сессия (а также Claude Code git-bash subshell) PATH не подхватывает до рестарта. Агент в CC-сессии видит «ffmpeg not found» даже после успешного winget. + +**Acceptance:** `~/projects/.common/lib/yt-tools/README.md` (раздел Install / Windows) содержит note: «после `winget install Gyan.FFmpeg` перезапустить терминал (и Claude Code session) — winget пишет в user-PATH, который текущая сессия не перечитывает». Опционально — workaround-команда для exposure без рестарта. + +**Status:** ready +**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 + +--- + +## ⚪ [using-yt-tools-trigger-smoke-clean-session] — Behavioral trigger smoke for using-yt-tools — requires a fresh CC session. + +**Scope (вынесено из using-yt-tools-test-trigger):** + +1. На **чистой** CC-сессии (без yt-tools context'а в prompt history) прогнать 10 триггер-фраз из `SKILL.md` description — каждая должна активировать `using-yt-tools`: + - ru: «транскрипт видео», «расшифровка YouTube», «что в этом ролике», «о чём ролик», «покажи кадр на N», «посмотри момент N», «что показано в видео на N» + - en: «watch this video», «video summary», «youtube transcript» +2. Прогнать 3 false-positive: «скачай это видео», «расшифруй подкаст», «что в этой лекции на Vimeo» — НЕ активируют скил. + +**Почему вынесено:** trigger-resolution в Claude Code зависит от чистоты session-history. Текущая сессия после имплементации install+hermes+e2e полностью загружена контекстом yt-tools — false-positive проверка теряет смысл. + +**Acceptance:** 10/10 positive, 0/3 false-positive. Findings (если есть) — обновить SKILL.md description. + +**Status:** ready +**Where I stopped:** (not started — split-out from using-yt-tools-test-trigger 2026-05-20) +**Next action:** В новой CC-сессии (в любой папке с установленным using-yt-tools) ввести каждую из 13 фраз и зафиксировать, активировался ли скил. Документ-чеклист подойдёт. +**Branch:** n/a --- @@ -100,11 +175,12 @@ Findings → follow-up tasks (`using-yt-tools--fix`) через `tasks_crea **NB по семверу:** `version: 0.1.0` записан промоутером. Дальнейшие инкременты — ответственность владельца `claude-skills/`, **не** этого скила и не ревьюера. -**Status:** blocked -**Where I stopped:** (not started — все 3 baseline + ручная `.common`-таска должны быть 🟢) -**Next action:** Дождаться 🟢 у всех 3 baseline-тасок выше + у ручной `.common` task'и на python-пакет. Затем — поведенческий smoke + iterative-флоу e2e (см. test-trigger). Findings → follow-up через `tasks_create`. +**Status:** blocked (на body fill, см. ниже) +**Where I stopped:** 3 baseline impl-таски 🟢 (install, hermes-mapping, test-trigger partial). `.common/lib/yt-tools/` python-пакет 🟢 (готов, 67/67 тестов). НО: `SKILL.md` body — пустой stub (`<пусто>` в каждой секции When/Inputs/Steps/Failure/Side-effects/NOT). Без body нечего рецензировать в acceptance-критериях по Steps/Failure modes/What NOT to do. Также: 4 findings зафайлены как отдельные ⚪ таски (transcript-paragraphs / frames-stderr / windows-path-doc / trigger-smoke-clean-session). +**Next action:** Запустить отдельную таску на «second-pass body fill для using-yt-tools/SKILL.md» (не имплементер промоушена — body пишется после impl). После этого review снимается с блокировки. Альтернативно: ревьюер может сейчас закрыть скоп «trigger + iterative-flow» (части 1+2 acceptance) и оставить «body acceptance» отдельным review-passом. **Branch:** n/a + ---