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:
2026-05-20 10:58:48 +03:00
parent 396ebc1c9c
commit e3cfe623d8

View File

@@ -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 -->
---