tasks(using-yt-tools): close test-trigger partial + file 4 findings 🟢⚪⚪⚪⚪
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) <noreply@anthropic.com>
This commit is contained in:
@@ -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)_
|
||||
|
||||
<!--
|
||||
Canonical layout. One block per task. Per-task deep context lives in
|
||||
@@ -53,7 +53,7 @@ Mode: **`pending`** — скил вызывает внешние CLI (yt-dlp/ffm
|
||||
|
||||
---
|
||||
|
||||
## 🔴 [using-yt-tools-test-trigger] — Behavioral smoke-test using-yt-tools on a clean session + e2e CLI pipeline on a test YouTube URL.
|
||||
## 🟢 [using-yt-tools-test-trigger] — Behavioral smoke-test using-yt-tools on a clean session + e2e CLI pipeline on a test YouTube URL.
|
||||
|
||||
**Что проверяется:**
|
||||
|
||||
@@ -69,11 +69,86 @@ Mode: **`pending`** — скил вызывает внешние CLI (yt-dlp/ffm
|
||||
|
||||
**Источник дизайна:** `.workshop/.archive/2026-05-20-yt-tools.md` (разделы «Primary use-case — iterative agent-driven viewing» и «Triggers для skill»).
|
||||
|
||||
**Status:** ready
|
||||
**Where I stopped:** (not started)
|
||||
**Next action:** Подобрать тестовый YT URL (5-10 мин, авторские субтитры ru/en, видеоряд меняется — не talking-head). На чистой сессии прогнать 10 триггеров + 3 false-positive. После `using-yt-tools-install` Этап 2 — CLI e2e + iterative-флоу. Findings → follow-up tasks (`using-yt-tools-<gap>-fix`).
|
||||
**Status:** done (2026-05-20, partial — see scope split)
|
||||
**Where I stopped:** CLI e2e + iterative-флоу пройдены; trigger smoke (части 1+2) вынесена в отдельную таску под чистую сессию.
|
||||
**Closed by:** Тестовый URL — 3blue1brown «Vectors, Chapter 1, Essence of linear algebra» (`https://www.youtube.com/watch?v=fNk_zzaMoSs`, 9:51, EN community subs, плотный визуал). Результаты:
|
||||
- `yt-transcript` отработал, выдал md с header (title/channel/duration/lang/url) и body. ❌ **Paragraph segmentation сломан**: весь 9:51-минутный ролик в **одном блоке** с единственным `[0:00]`-якорем — iterative-флоу primary use-case рушится (агенту нечем выбирать таймкоды по содержанию). Корень: `_group_paragraphs` группирует по >4s gap, а у профессиональных/community-submitted субтитров snippet'ы текут без пауз. → finding [using-yt-tools-transcript-paragraphs-fix].
|
||||
- `yt-frames --timestamps 0:30,3:00,6:00` отработал: source.mp4 закешировался в `./yt-cache/<vid>/`, ffmpeg-seek выдал 3 валидных jpg в `frames/`. ❌ **Stderr swallow**: первый вызов (без ffmpeg на PATH) упал с `error: yt-dlp source download failed:` — после двоеточия пусто, реальная причина (отсутствие ffmpeg, нужного yt-dlp как mux-dep) скрыта. → finding [using-yt-tools-frames-stderr-fix].
|
||||
- **Iterative-флоу:** Read трёх кадров → vision-anchored синтез ОК. frame_0030 — 3 pi-человечка «Physics/Mathematician/CS student» (совпадает с интро «three perspectives»); frame_0300 — пустые xy-оси (артефакт slепого выбора без paragraph-якорей, не баг тула); frame_0600 — числовая прямая «2+5» с жёлтой и розовой стрелками (совпадает с местом про vector addition как «step-then-step»). End-to-end pipeline валиден когда таймкоды известны.
|
||||
- ⚠️ Windows-gotcha: ffmpeg в user-PATH не подхватывается git-bash subshell'ом CC до рестарта сессии. README уже документирует winget install, но не упоминает restart-shell-after. → finding [using-yt-tools-windows-path-doc-fix].
|
||||
- ⏸️ **Части 1+2 (trigger smoke + false-positive)** не выполнены в этой сессии — требуют чистого CC-инстанса. → вынесено как [using-yt-tools-trigger-smoke-clean-session].
|
||||
**Branch:** n/a
|
||||
<!-- created-by: vitya@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-20T06:31:09.000Z / via: local-file (gitea-down) -->
|
||||
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-20 / partial close: CLI e2e + iterative-флоу done; trigger smoke split-out -->
|
||||
|
||||
---
|
||||
|
||||
## ⚪ [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-<gap>-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
|
||||
<!-- created-by: vitya@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-20T06:31:09.000Z / via: local-file (gitea-down) -->
|
||||
<!-- updated-by: vitya@DESKTOP-NSEF0UK / 2026-05-20 / 3 baseline 🟢, body-fill new blocker, 4 findings filed -->
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user