tasks(using-yt-tools): close review 🟢 + file 3 nice-to-have findings

[using-yt-tools-review] 🟢. Fresh-eyes subagent reviewer (no impl
priming) prošёл все 4 acceptance dimensions:

- Flow A PASS — URL OmJ-4B-mS-Y (Domain of Science, 11:06 en),
  transcript header + paragraph segmentation OK, 3 frames at
  4:23/4:41/8:16 visually consistent with chosen paragraphs.
- Flow B PASS — URL gCfzeONu3Mo (TED-Ed), 1 frame at 2:00, no
  transcript dependency.
- Failure modes PASS — broken URL exit 1; --lang zz proxy для
  no-captions exit 1 с available-langs hint; non-YouTube URL
  «cannot extract video id».
- What NOT to do PASS — rules agent-side policy, CLI не
  contradicts; --mode interval/scene flags существуют, но spec
  явно их называет в prohibition (intentional).

3 nice-to-have findings зафайлены как  siblings:
- [using-yt-tools-empty-cache-dir-on-failure] — yt-transcript
  mkdir до фетча captions, на abort оставляет пустую папку.
- [using-yt-tools-frames-multiline-stdout] — SKILL.md обещает
  single-line EOF path, но yt-frames с N timestamps выдаёт N
  строк «Wrote: <path>». Spec/CLI mismatch.
- [using-yt-tools-warning-mojibake] — yt-dlp warnings на Windows
  console показывают «�» вместо unicode quotes (cp1251 vs UTF-8).

No blockers, no functional break. Закрытие по «findings зафайлены»
ветке review-acceptance.

Tasks_create через MCP сорвался на write-side (Gitea POST 404,
known bug cluster — preview OK, confirm fails); все 4 правки
сделаны через local-file edit.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-20 13:23:32 +03:00
parent 9fdd48b605
commit f11a6b8b6b

View File

@@ -1,5 +1,5 @@
# Task Board
_Updated: 2026-05-20 (using-yt-tools: 3 baseline 🟢; 3 finding fixes 🟢; skill-body-fill 🟢 [SKILL.md 0.2.0]; trigger-smoke-clean-session 🟢 [13/13 ✅ — 10 positive activate, 3 false-positive not-activate]; review now ⚪ ready — все blockers сняты, awaiting fresh-eyes reviewer для full Steps/Failure/NOT behavioral pass)_
_Updated: 2026-05-20 (using-yt-tools: 3 baseline 🟢; 3 finding fixes 🟢; skill-body-fill 🟢 [SKILL.md 0.2.0]; trigger-smoke-clean-session 🟢 [13/13]; review 🟢 by fresh-eyes subagent — Flow A/B/Failure-modes/NOT all PASS; 3 nice-to-have findings filed as ⚪ [empty-cache-dir-on-failure, frames-multiline-stdout, warning-mojibake])_
<!--
Canonical layout. One block per task. Per-task deep context lives in
@@ -154,7 +154,7 @@ Mode: **`pending`** — скил вызывает внешние CLI (yt-dlp/ffm
---
## [using-yt-tools-review] — Skill-review checkpoint для using-yt-tools (промоушен 2026-05-20).
## 🟢 [using-yt-tools-review] — Skill-review checkpoint для using-yt-tools (промоушен 2026-05-20).
**Источник дизайна:** `.workshop/.archive/2026-05-20-yt-tools.md` (process trace: GitHub research + iterative-сценарий + 4 user-utверждённых default'а).
**Импл-таски:** using-yt-tools-install, using-yt-tools-hermes-mapping, using-yt-tools-test-trigger.
@@ -177,14 +177,78 @@ Findings → follow-up tasks (`using-yt-tools-<gap>-fix`) через `tasks_crea
**NB по семверу:** `version: 0.1.0` записан промоутером. Дальнейшие инкременты — ответственность владельца `claude-skills/`, **не** этого скила и не ревьюера.
**Status:** ready (все blockers сняты 2026-05-20)
**Where I stopped:** 3 baseline impl 🟢; 3 finding-fix 🟢; body-fill 🟢 (SKILL.md 0.2.0); trigger-smoke-clean-session 🟢 (13/13). Trigger-activation часть acceptance полностью pass. Остаётся: full behavioral pass для Steps / Failure modes / What NOT to do на тестовом URL — это требует fresh-eyes reviewer (не имплементер) per identity-not-location rule. Iterative-флоу end-to-end уже валидирован в [using-yt-tools-test-trigger] close-note (3blue1brown URL).
**Next action:** Fresh-eyes reviewer в любой сессии (включая отдельный CC-инстанс если хочется полную priming-чистоту). Прогнать каждый шаг Steps секции SKILL.md (Flow A: yt-transcript → выбрать таймкоды по содержанию → yt-frames → Read) и (Flow B: yt-frames на конкретный таймкод → Read) на новом YouTube URL. Проверить Failure modes (missing ffmpeg, broken URL, no captions) уводят в abort, не в partial-success. Проверить What NOT to do соответствует реальному поведению. Findings → новые ⚪ fix-tasks. Закрыть 🟢 close-note'ом «0 findings» если пусто.
**Status:** done
**Where I stopped:** Closed by fresh-eyes review 2026-05-20 (subagent reviewer, no impl-priming, identity-not-location satisfied). Acceptance: **Flow A PASS** — URL `OmJ-4B-mS-Y` (Domain of Science — Map of Mathematics, 11:06, en captions); transcript header + paragraph segmentation OK; 3 frames at 4:23/4:41/8:16 visually consistent with chosen paragraphs. **Flow B PASS** — URL `gCfzeONu3Mo` (TED-Ed — How miscommunication happens), 1 frame at 2:00, no transcript dependency. **Failure modes PASS** — broken URL exit 1 clean; `--lang zz` proxy for no-captions exit 1 with helpful available-langs hint; non-YouTube URL `cannot extract video id`. **What NOT to do PASS** — rules are agent-side policy; CLI doesn't contradict; `--mode interval/scene` flags exist but spec explicitly names them in the prohibition (intentional). 3 nice-to-have findings filed as ⚪ siblings (`empty-cache-dir-on-failure`, `frames-multiline-stdout`, `warning-mojibake`). No blockers, no functional break.
**Next action:** n/a (closed).
**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 -->
<!-- updated-by: vitya@DESKTOP-NSEF0UK / 2026-05-20 / body-fill 🟢 (override: done by implementer per explicit user approval; review-task originally specified non-implementer); 3/4 finding-fixes 🟢; remaining blocker: trigger-smoke-clean-session -->
<!-- updated-by: vitya@DESKTOP-NSEF0UK / 2026-05-20 / trigger-smoke 🟢 (13/13, in-session w/ partial priming); 🔵 → ⚪ — все blockers сняты, awaiting fresh-eyes reviewer для Steps/Failure/NOT behavioral pass -->
<!-- updated-by: vitya@DESKTOP-NSEF0UK / 2026-05-20 / ⚪ → 🟢 — fresh-eyes subagent review PASS на всех 4 acceptance dimensions, 3 nice-to-have findings зафайлены отдельными ⚪ tasks. via: local-file (gitea write-side 404 на tasks_create POST — known bug cluster) -->
---
## ⚪ [using-yt-tools-empty-cache-dir-on-failure] — `yt-transcript` создаёт `yt-cache/<vid>/` ДО фетча captions; при abort оставляет пустую папку, что противоречит Failure-modes интенту SKILL.md «никогда не оставляй полусостояние».
**Reviewer observed** на broken-URL тесте (URL=`https://www.youtube.com/watch?v=AAAAAAAAAAAA`): exit 1 + stderr clean, но пустая `yt-cache/AAAAAAAAAAAA/` остаётся на FS.
**Fix-направления:**
- (a) defer mkdir до первого успешного write — проще логически, но требует review всех путей записи в `yt_tools/cache.py` + `transcript.py`;
- (b) cleanup-on-abort через atexit / try-finally в CLI entry — точечный диф, дешевле.
Затем — тест на «no empty dir после abort» в `tests/test_cache.py` (или новом `test_failure_modes.py`).
**Severity:** nice-to-have (cosmetic, не ломает workflow).
**Status:** ready
**Where I stopped:** (not started)
**Next action:** Решить fix-стратегию (a) vs (b). Имплементировать. Добавить regression-тест.
**Branch:** n/a
<!-- created-by: vitya@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-20 / via: local-file (gitea write-side 404 на tasks_create POST) / origin: [using-yt-tools-review] fresh-eyes subagent finding -->
---
## ⚪ [using-yt-tools-frames-multiline-stdout] — Spec/реальность mismatch в SKILL.md: «Last line каждого CLI's stdout — absolute path артефакта (CLI designed для single-line EOF output)» обещает чистый bare-path, а `yt-frames --timestamps T1,T2,T3` фактически выдаёт N строк формата `Wrote: <abspath>` (с префиксом).
**Проблема:** наивный «take last line as path» парс ломается на префиксе. Single-line EOF контракт работает для `yt-transcript` и `yt-frames` с одним таймкодом, но не для multi-timestamp.
**Решений два:**
- (a) **fix CLI** — emit bare paths matching contract (для multi-timestamp выводить N строк без `Wrote: ` префикса);
- (b) **fix spec** — описать multi-line case + `Wrote: ` префикс явно в SKILL.md.
Рекомендация ревьюера implicit: (a) чище — единый контракт «last line = path» через все три CLI, парсинг агента остаётся тривиальным. (b) дешевле — только edit SKILL.md, но размывает контракт.
Решение влияет на yt-tools 0.x semver (CLI change = MINOR bump; spec change = PATCH в claude-skills).
**Severity:** nice-to-have (работает на практике потому что агент знает имена кадров из таймкодов и Read'ит их напрямую, но spec wording misleading; будущий tooling «парсь stdout, бери EOF» сломается).
**Status:** ready
**Where I stopped:** (not started)
**Next action:** Выбрать (a) vs (b). Если (a) — fix `yt_tools/frames.py` printf, bump yt-tools версию, регрессионный тест. Если (b) — edit `skills/using-yt-tools/SKILL.md` Inputs/Outputs или Steps секцию, bump skill PATCH.
**Branch:** n/a
<!-- created-by: vitya@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-20 / via: local-file (gitea write-side 404 на tasks_create POST) / origin: [using-yt-tools-review] fresh-eyes subagent finding -->
---
## ⚪ [using-yt-tools-warning-mojibake] — yt-dlp warnings на Windows console рендерятся с mojibake: `Video unavailable “ using minimal metadata` → `Video unavailable <20> using minimal metadata`.
**Корень:** stderr encoding mismatch (cp1251 default Windows console vs UTF-8 source).
**Fix-направления:**
- `sys.stderr.reconfigure(encoding='utf-8', errors='replace')` в trio CLI-entry (`yt-transcript`, `yt-frames`, `yt-watch`) — программная починка;
- PYTHONIOENCODING=utf-8 hint в README Windows-блоке — пользовательская;
- filter warning sym↔ascii — workaround в `_warning_filter`.
Рекомендация: первый вариант (программная) — единый fix, не требует от user'а лишних шагов.
**Severity:** nice-to-have (cosmetic, сообщение остаётся читаемым).
**Status:** ready
**Where I stopped:** (not started)
**Next action:** Проверить, помогает ли `sys.stderr.reconfigure(encoding='utf-8', errors='replace')` в trio CLI-entry на проблемном кейсе. Если нет — добавить PYTHONIOENCODING=utf-8 в README Windows-note.
**Branch:** n/a
<!-- created-by: vitya@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-20 / via: local-file (gitea write-side 404 на tasks_create POST) / origin: [using-yt-tools-review] fresh-eyes subagent finding -->
---