Files
claude-skills/.tasks/STATUS.md
vitya c636045a6e meta(tasks): close [delegate-task-test-trigger] — pos 5/5, neg 2/3 (FP on self-task)
Clean-context subagent trigger run for delegate-task skill.
Positives 5/5 → delegate-task. Negatives: «обновить таску»/«закрыть
таску» → using-tasks ; «создать задачу себе» → delegate-task 
(reliable false-positive, 5/5 trials). Filed follow-up
[delegate-task-description-fp-fix]; finding feeds [delegate-task-review].

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 12:33:46 +03:00

58 KiB
Raw Blame History

Task Board

Updated: 2026-06-09 — delegate-task-test-trigger done (pos 5/5, neg 2/3; FP на «создать задачу себе» → follow-up delegate-task-description-fp-fix). Ранее (2026-06-08): откат churn'а от агент-раннера (always-on dry-run): 5 тасок (using-yt-tools-rate-limit-guard, archive-roundtrip-test, skills-grouping-revisit, hermes-converter-ci, tdd-criteria-precommit-hook) спуриозно claimed/blocked из-за workspace-divergence бага раннера → возвращены в ready. yt-tools re-scoped на plugin-репо OpeItcLoc03/yt-tools (исходный stub deprecated).

[using-yt-tools-rate-limit-guard] — Add explicit "don't batch requests at YouTube" rule to skills/using-yt-tools/SKILL.md (avoid HTTP 429 IP-block).

Эмпирика (2026-05-31, modulair-wiki ingest, DESKTOP). Владелец кинул подборку из 10 YouTube URL. Агент выстрелил залпом ~21 запрос подряд: yt-dlp --dump-json ×10 (метаданные — прошли) + yt-transcript ×10 (transcript-api). Первый transcript-вызов достучался (вернул список языков), со второго пошёл HTTP 429 / "YouTube is blocking requests from your IP". Блок IP-wide и держится минутами — упёрлись оба пути: youtube-transcript-api (yt-transcript) И yt-dlp timedtext-subtitle endpoint (метаданные при этом ещё проходили, а субтитры — нет). Что разблокировало: ~4-мин cooldown + запросы по одному с паузами 2535с + ранний abort если первый не прошёл (чтобы не жечь cooldown впустую).

Второй, смежный баг той же сессии: yt-transcript по умолчанию просит --lang en и промахивается мимо ручных en-US субтитров (видео с manually-created en-US и без en отдаёт "no transcript"). Лечится --lang en-US,en (или вообще автоопределением).

Что добавить в SKILL.md:

  1. What NOT to do — новый буллет: «Не пулять в YouTube пачкой запросов. Несколько URL подряд (или metadata+transcript залпом) → HTTP 429, IP-block на минуты, бьёт оба пути (transcript-api и yt-dlp). Обрабатывай по одному, с паузой ≥2535с между; при пакете из N URL — последовательно, не параллельно. Если уже словил 429 — cooldown ~35 мин перед повтором, проверяй первый запрос и не продолжай залп если он упал.»

  2. Failure modes — новая строка: симптом HTTP 429 Too Many Requests / "blocking requests from your IP" → причина: слишком много запросов подряд (rate-limit, не приватность/регион) → действие: cooldown + по одному с паузами; НЕ retry в цикле без задержки. Отличать от yt-dlp source download failed (это реальная недоступность видео).

  3. (опц.) Inputs / Flow A — упомянуть --lang en-US,en как дефолт-страховку для ручных не-en субтитров (видео NE/прочие с en-US-only).

Bump: PATCH (поверхностное расширение guidance, не breaking). TDD: не применим (markdown-документ). Behavioral-смок опционален: «дай 5 URL» → агент обрабатывает последовательно с паузами, не залпом. Дисциплина: после правки — bump version в frontmatter, commit feat(using-yt-tools): rate-limit guard (no-batch) vX.Y.Z; install/hermes-mapping/push — отдельно, как в прошлых yt-tools-тасках (для PATCH достаточно reload-plugins).

Weight: needs-human Status: ready — RE-SCOPED 2026-06-08: исходный таргет skills/using-yt-tools/SKILL.md устарел — это deprecated inert stub (v0.4.1), канонический контент мигрировал в plugin-репо OpeItcLoc03/yt-tools (v0.6.0), там же живут секции, на которые ссылается задача (вкл. буллет «Не retry на yt-dlp failures» для расширения). Правило по-прежнему нужно — но вносить его в plugin-репо, не в stub. (Находка автономного агента 2026-06-08; consult по «какой репо править» → halt при consult_policy=human-only; decision-trail в per-task файле.) Where I stopped: (not started в правильном репо) — баг и фикс зафиксированы по живой сессии 2026-05-31; правка отложена в задачу (владелец просил не лезть в глобальный скил из проекта modulair-wiki). Next action: В репо OpeItcLoc03/yt-tools (plugin) открыть его SKILL.md, внести пункты 13 (rate-limit guard), bump PATCH, commit. Свериться с существующим «Не retry на yt-dlp failures» — расширить его, а не плодить дубль. (НЕ править claude-skills stub.) Branch: master


🟡 [skill-readmes] — write English README.md for every skill + translate root README

Status: paused Where I stopped: infra-skill cluster done — READMEs for project-bootstrap, setup-wiki, setup-tasks, using-wiki, using-tasks; root README translated; cross-links between all five skills wired up Next action: continue with the next batch — suggest the caveman cluster (caveman, caveman-commit, caveman-review, caveman-help, caveman-compress, compress) since they form a coherent group; or jump to active-platform, find-skills, setup-context7, using-context7, using-markitdown if the caveman cluster needs deduplication first (see compress-dedup task) Branch: master


🟢 [install-ps1] — paired install.sh + install.ps1 (cross-platform parity, with --prune)

Status: done Where I stopped: All 3 acceptance items shipped 2026-05-25. (a) scripts/install.ps1 existed pre-task. (b) --prune / -Prune flag added in commit 6cf0e98 (paired sh + ps1; combined-flag pattern; global-scan; default off; smoke-tested on disposable target dirs against fake stale skills). (c) Concept page .wiki/concepts/install-cross-platform.md written this commit: parity contract, --prune design choices, rejected alternatives, scope vs build/.skill prune. Next action: (none — kept until merged) Branch: master


🟢 [install-ps1-build-prune-followup] — Add matching --prune flag to scripts/build.{sh,ps1} for dist/<name>.skill artefacts (analogue of install-script prune).

Status: done Where I stopped: Shipped 2026-05-25. --prune / -Prune added to both build.sh and build.ps1. Bash arg-parses out --prune from positionals, runs prune at the end of the script against dist/*.skill (works regardless of which build branch executed — zip-path or powershell.exe delegation). PS -Prune switch runs after the build loop. Same default-off / global-scan / print-and-delete pattern as install-side. Smoke-tested with fake dist/fake-stale-{sh,ps}.skill files against real dist/ — both paths pruned correctly without touching real archives. [skip-tdd: wrapper] carve-out applies. Wiki page .wiki/concepts/install-cross-platform.md extended with new "Build-side --prune" section + scope note that dist-hermes/ is separate. Index + log updated. Next action: (none — kept until merged) Branch: master


[archive-roundtrip-test] — smoke-test for .skill archive shape

Weight: needs-human Status: ready Where I stopped: (not started) — caught the PowerShell-Compress-Archive backslash bug manually; a smoke-test would catch the next regression automatically Next action: add a script that builds dist/<name>.skill, unzips into a temp dir, and diff -r against skills/<name>/. Fail on any difference. Run from CI or pre-commit if we add one Branch: (not started)


🟡 [active-platform-eval] — eval-driven tuning of active-platform (description + body), absorbs [active-platform-tuning]

Status: paused Where I stopped: design doc complete (.wiki/concepts/active-platform-eval-design.md, ~150 lines); per-task file complete (.tasks/active-platform-eval.md); STATUS.md collapsed the two original tasks into this one block. Pre-flight verified: claude CLI on PATH at C:\nvm4w\nodejs\claude.ps1 (Claude Code 2.1.128); run_loop.py present at ~/.claude/plugins/cache/claude-plugins-official/skill-creator/unknown/skills/skill-creator/scripts/run_loop.py. Stopped right before eval-set authoring at user request — paused for asynchronous follow-up. No code touched, no tooling launched, no .tasks/active-platform-eval/ workspace dir created yet. Next action: resume by answering Q2 from the chat ("eval set — write 20 queries solo from current SKILL.md + concept-page open questions, or run skill-creator's HTML review template first for user-driven edits before kickoff?"), then (a) build .tasks/active-platform-eval/eval-set.json, (b) snapshot skill to .tasks/active-platform-eval/skill-snapshot/, (c) launch run_loop.py in background, (d) parallel manual body sweep, (e) apply changes + bump to 1.1.0 + rebuild + reinstall + final report + commit. Branch: master


[skills-grouping-revisit] — revisit flat vs grouped skills/ layout if count grows past ~30

Weight: needs-human Status: ready Where I stopped: (not started) — current 14 skills fit fine in flat skills/; threshold for revisiting is ~30 Next action: when triggered (skill count crosses threshold), evaluate variant B (grouped by family) vs variant C (flat + manifest) from the original brainstorm in .wiki/concepts/repo-layout.md Branch: (not started)


[hermes-converter-ci] — [deferred — после ручной валидации MVP] CI hook (Gitea-pipeline или GitHub-Action если зеркалим): на push to master запустить scripts/build-hermes.py, сравнить diff dist-hermes/, авто-коммит если изменения (или PR-шаблон). Цель — чтобы dist-hermes/ всегда матчил skills/+hermes/mapping.yaml+hermes/skills/ без ручного запуска build. Не блокирует MVP — первая итерация делается ручным запуском конвертера. Дизайн: .wiki/concepts/hermes-skills-rollout-design.md.

Weight: needs-human Status: ready Where I stopped: unblocked 2026-05-07 — hermes-mvp-coverage shipped в a003b80; MVP живой на фабрике. Next action: Выбрать платформу CI (Gitea Actions vs внешняя), написать workflow, прогнать тестовый push. Branch: master


[tdd-criteria-precommit-hook] — Optional pre-commit hook script that automates the bright-line checks from tdd-criteria Anti-loophole rules 1 and 4. Project owner opts in per-repo by symlinking / copying to .git/hooks/pre-commit (or via husky / lefthook integration if the project uses them).

Two checks (both bright-line, both fail-closed):

Check 1 — [skip-tdd: <category>] validation. If git diff --cached --name-only includes a *.ts / *.js / *.py / similar code file (excluding tests and Permissive-zoned paths like *.css / *.env* / *.md / *.yaml), require either:

  • A *.test.* / *.spec.* / test_*.py / similar file present in the same diff, OR
  • The commit subject (read from $1 arg, line 1 of $1 = msg path) matches \[skip-tdd: (visual|spike|oneshot|wrapper)\].

If neither holds → block with message:

TDD policy violation: code change without test or skip marker.
Add a test, or include [skip-tdd: <visual|spike|oneshot|wrapper>] in commit subject.
See claude-skills/.wiki/concepts/tdd-criteria-design.md for which category applies.

Check 2 — Test-modification audit ([test-modify] rule 4). Detect test-modifying changes in git diff --cached:

  • Removed line matching ^-\s*(expect|assert|assertThat|chai\.)\( (assertion deletion)
  • Added/removed lines that change argument values inside expect(...) / assert(...) calls
  • Added .skip / \.xit\b / @pytest\.mark\.skip / @Disabled / @Ignore annotations
  • Deleted it(...) / test(...) / def test_* definitions (matches ^-\s*(it|test|describe)\( or ^-def test_)

If any matched → require commit subject matches \[test-modify: [^:]+: was .+; is .+; reason: .+\]. Block otherwise with message:

Test-modification without [test-modify: ...] marker.
Required format: [test-modify: <name>: was <literal>; is <literal>; reason: <Z>]
The was/is must be the LITERAL assertion expressions, not paraphrased.
See tdd-criteria Anti-loophole rule 4.

ALSO: if git diff --cached --name-only includes both a test-pattern file AND an impl-pattern file → block:

Test changes must be in a separate commit from impl changes (tdd-criteria rule 4b).
Run: git reset HEAD <impl-files> && git commit (test-only) && git add <impl-files> && git commit (impl-only).

Implementation:

  • Bash script (single file). Cross-platform: works on Linux/macOS and on Windows under git-bash (which Claude/Hermes both already run on).
  • Path: ~/projects/claude-skills/scripts/tdd-criteria-precommit-hook.sh. Plus a Windows wrapper .ps1 that delegates if needed.
  • Tested on a real repo before commit (books is a good candidate — it has Jest tests + *.test.js convention).
  • Documented in claude-skills/.wiki/concepts/tdd-criteria-design.md «See also» section (already linked).

Activation pattern (per-repo):

# Symlink or copy the hook
ln -sf ~/projects/claude-skills/scripts/tdd-criteria-precommit-hook.sh \
       .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit

Or via lefthook.yml / .husky/pre-commit if the project already uses one of those.

Out of scope:

  • Mutation testing (Stryker, mutmut) — separate heavyweight infra, not this hook.
  • Coverage gates — different mechanism, different cost/benefit.
  • Visual regression infra (Percy, Chromatic) — Permissive-5 acknowledges this is heavyweight; not bundled.
  • Auto-fixing the violation — hook only blocks; fix is human's job.

Why this is optional, not required by the SKILL.md:

The skill is policy that lives in claude-skills and gets pulled into agent context per project. The hook is enforcement that needs per-project setup. Some projects opt out of pre-commit hooks entirely (e.g. karu if it's pure CSS — no code surface to enforce). Forcing the hook into the skill would couple policy to tooling.

Bypass:

Pre-commit hooks have --no-verify. Per project-discipline Rule 4 («never skip hooks unless user explicitly asks») agents must not use --no-verify — but humans can in emergencies. Each --no-verify use should be self-flagged in the commit body («bypassed pre-commit because: ...»). Not enforceable by the hook itself; this is a higher-level audit.

Weight: needs-human Status: ready Where I stopped: (not started) Next action: Решить, нужен ли hook (он опционален) — если да, написать ~/projects/claude-skills/scripts/tdd-criteria-precommit-hook.sh по спеке в description, протестировать на books (Jest-конвенция *.test.js), задокументировать activation pattern. Если нет — закрыть как wontfix с пометкой что fence чисто социальная (commit subject visible в git log). Branch: master


[tasks-board-cleanup-2026-05] — Архивная чистка .tasks/STATUS.md: переместить все 🟢 done-блоки в .tasks/.archive/done-2026-05.md, оставить в STATUS.md только header + status legend + 🔴/🟡//🔵 блоки. Цель — разгрузить файл от исторического шума без потери data (git history + явный архивный файл для текстового поиска).

Предпосылка: на 2026-05-07 в claude-skills/.tasks/STATUS.md накопилось ~18+ 🟢 done-блоков (rolled out за 2026-04-25 — 2026-05-07: tdd-criteria-rollout, hermes-rollout, bootstrap-related, project-creation-lifecycle, recommend-dont-menu и т.д.). Convention в шапке файла говорит «🟢 Done — kept until merged», но проект работает на master-only (нет ветвления для merge), поэтому convention превратилась в «kept forever». Файл рос до ~600 строк / 26K токенов — Read-инструменты упираются в лимит.

После чистки STATUS.md остаётся только активный board (🔴/🟡//🔵 + closed [bootstrap-upgrade-canonical-triggers] если уже отработал). Архивный файл .tasks/.archive/done-2026-05.md сохраняет полный текст всех перемещённых блоков для grep-поиска и historical context.

Weight: needs-human Status: ready Where I stopped: Создана 2026-05-07. После rollout v1.10.0/1.10.1 на STATUS.md накопилось много свежих 🟢 (bootstrap-add-tdd-trigger, refresh-project-bootstrap closed-as-superseded, bootstrap-fix-tdd-recommend-template, bootstrap-upgrade-canonical-triggers если уже отработал). Хороший момент для batch-archive. Next action: 1) Прочитать .tasks/STATUS.md целиком (Read in chunks if needed). 2) Идентифицировать все блоки ## 🟢 [...] — разделители ---. 3) Создать .tasks/.archive/ директорию (если нет). 4) Записать .tasks/.archive/done-2026-05.md с шапкой:

# Archived — Done batch 2026-05

Перемещено из `.tasks/STATUS.md` 2026-05-07 в рамках board-cleanup. Полный список 🟢 done-тасок, шипанутых в апреле-мае 2026.

Полный source — git history `.tasks/STATUS.md` до commit X.

---

И подряд все 🟢-блоки в исходном виде.

  1. Edit .tasks/STATUS.md: убрать все 🟢-блоки + соседние --- разделители. Header + status legend + 🔴/🟡//🔵 блоки оставить. 6) Verify: grep '^## ' .tasks/STATUS.md | wc -l — было ~28+, должно остаться число активных (🔴+🟡++🔵, ожидание ~10-12). 7) Commit meta(tasks): archive done batch 2026-05 → .tasks/.archive/done-2026-05.md с body, описывающим какие группы перемещены (tdd-criteria, hermes, bootstrap, etc.) и итоговый count. 8) tasks_close.

NB: эта таска сама уйдёт в следующий cleanup batch (2026-06 или подобный), так что не пытаться её закрыть+архивировать в одном коммите. Branch: n/a


🟢 [using-synology-ops-review] — Skill-review checkpoint для using-synology-ops (промоушен 2026-05-12).

Status: done (wontfix) Where I stopped: Closed 2026-05-25 — Synology NAS decommissioned permanently. Skill using-synology-ops is now dead-code candidate (full retire tracked separately). Review acceptance criteria (behavioral smoke-test, Steps behavior, Failure modes, What NOT to do) have no target — both the underlying MCP server (opsmcp.kzntsv.site) and the host fleet (modulair-* containers) are gone. Next action: (none — closed as wontfix; full skill retire is a separate task) Branch: n/a


🟢 [using-vds-ops-description-length-investigate] — Investigate description length vs MEMORY ≤900 char limit. Drift between memory feedback и реальным harness behavior?

Status: done (wontfix — empirical close) Where I stopped: Closed 2026-05-25. Empirical evidence sufficient: using-vds-ops description = 1473 chars activates correctly (7/7 behavioral smoke-test PASSED, harness listing shows full description, hermes/mapping.yaml processes it fine). MEMORY note feedback_skill_description_length_limit.md was paranoid — actual limit either raised or never as tight as feared. Hypothesis (c) confirmed. No need for systematic measurement — investigation cost > information value. Side effect: Memory entry feedback_skill_description_length_limit.md deleted same commit (no longer load-bearing). YAML colon-space gotcha memory (feedback_skill_description_yaml_colon_gotcha.md) kept — different concern, still valid. Next action: (none — closed) Branch: n/a


🟢 [using-synology-ops-disambiguation-uplift] — Add explicit disambiguation clause to using-synology-ops description (sibling parity with using-vds-ops).

Status: done (wontfix) Where I stopped: Closed 2026-05-25 — Synology NAS decommissioned, no longer in fleet. Disambiguation between NAS / VDS for shared container names (traefik etc.) is moot when only VDS exists. Acceptance criteria no longer have a target. Next action: (none — closed as wontfix) Branch: n/a

🟢 [using-yt-tools-listen-skill-update] — Расширить skills/using-yt-tools/SKILL.md поддержкой нового CLI yt-listen (audio/FFT analysis).

Дизайн-контекст:

  • Спецификация: mcp__projects-meta__knowledge_get slug concepts/yt-tools-audio в OpeItcLoc03/common.
  • Process trace: ~/projects/.workshop/.archive/2026-05-25-yt-tools-audio.md.
  • Текущий SKILL.md (v0.3.x): уже триггерится на YouTube URL + transcript/frames; расширить аудио-триггерами и iterative-флоу.

Изменения в SKILL.md:

  1. description frontmatter — добавить аудио-семантику без раздувания (existing description уже длинноват, аккуратно):

    • Новые триггеры: «послушай момент N», «BPM/тональность/гармония видео», «спектрограмма», «что в музыке на T», «listen to fragment», «analyze audio».
  2. Steps section — расширить iterative-флоу:

    • Для музыкальных URL: yt-transcript опциональный (если captions есть), yt-listen --timestamps T1,T2,... primary.
    • Output: per timestamp — clip_TTTT.wav + spectrum_TTTT.png + features_TTTT.md.
    • Агент Read'ом получает spectrum.png (vision) + features.md (числа).
    • Помнить: spectrum image-only недостаточен; всегда читать features.md в паре (Dixit et al., arXiv 2411.12058).
  3. What NOT to do — точечная защита от scope creep:

    • НЕ вызывать Whisper на смешанной музыке (без source-separation = мусор). Если user просит lyrics из музыки — сказать что это отдельный pipeline (Demucs + Whisper), out of scope.
    • НЕ интерпретировать spectrum-PNG без features.md.
  4. Step 0 probe — добавить проверку yt-listen в существующую цепочку (PATH → pipx-shim → legacy venv).

Bump: PATCH (0.3.x → 0.3.(x+1)) — поверхностное расширение, не breaking.

TDD-mode: claude-skills имеет follow tdd-criteria в CLAUDE.md, но это markdown-документ (SKILL.md), не код — TDD не применим. Behavioral smoke-test покрывается отдельной таской using-yt-tools-listen-test-trigger.

Status: done Where I stopped: shipped (fd8a382, NOT pushed per task instruction). SKILL.md v0.3.1 → v0.3.2 PATCH. Изменения: (1) description frontmatter — добавлены audio-триггеры (BPM/тональность/гармония/спектрограмма/listen to fragment/analyze audio); (2) "Three flows" + новый Flow C — audio-analysis под "When to use"; (3) Step 0 probe расширен — yt-listen в install-set (5 binaries вместо 4) + диагностика "только yt-frames без yt-listen = старый 0.1.x"; (4) Inputs-table добавлена Flow C row (--duration, --mode interval, --no-wav, --no-spectrogram, --linear, --chroma, --sample-rate); (5) Steps добавлена "### Flow C — audio-analysis" секция с pipeline-шагами и stdout-контрактом; (6) What NOT to do: точечная защита от Whisper-on-mixed-music (Demucs+Whisper отдельный pipeline, out of scope) + правило "spectrum-PNG только в паре с features.md" (VLM ~50-60% Dixit et al. arXiv 2411.12058). Install.sh не запускался, hermes/mapping.yaml не правился, push отложен (test-trigger разблокирован, но требует чистой сессии). Next action: (none — kept until merged) 2. Прочитать concepts/yt-tools-audio из global wiki + workshop archive. 3. Открыть skills/using-yt-tools/SKILL.md. 4. Внести изменения по 4 пунктам выше. 5. Bump version в frontmatter (PATCH). 6. Commit: feat(using-yt-tools): add yt-listen support (audio/FFT) v0.3.<x+1>. 7. НЕ запускать install.sh, НЕ делать push, НЕ править hermes/mapping.yamlinstall и hermes-mapping идут отдельными скил-baseline-тасками (создадутся если/когда понадобятся; для PATCH update обычно достаточно reload-plugins). Branch: n/a


🟢 [using-yt-tools-listen-test-trigger] — Behavioral smoke-test для расширения using-yt-tools под yt-listen. Без TDD per-se (это смок поверх готового), но включает explicit before-after evidence — что без скила агент не вызывает yt-listen на новых триггерах, а с обновлённым скилом — вызывает корректно.

Дизайн-контекст: см. concepts/yt-tools-audio (target=OpeItcLoc03/common) — какие триггеры обязательны, какой output ожидаем.

TDD-mode (per claude-skills follow tdd-criteria): для behavioral skill-теста applicable интерпретация — write expectations first, then verify. Тест-сценарии сформулировать ДО запуска агента, не подгонять под наблюдаемое поведение.

Acceptance (test scenarios):

  1. Trigger activation positive (минимум 4 фразы):

    • «послушай момент 2:30 в этом ролике » → агент вызывает yt-listen URL --timestamps 2:30.
    • «какой BPM в » → yt-listen URL (без timestamp = bulk-mode hint или quick-default).
    • «listen to fragment at 1:15 » → yt-listen URL --timestamps 1:15.
    • «спектрограмма видео » → yt-listen --timestamps с хотя бы одним таймкодом (агент должен выбрать sensible default или спросить).
  2. Trigger activation negative (3 близкие, но не свои):

    • «расшифруй видео » → yt-transcript, НЕ yt-listen.
    • «покажи кадр на 1:23 » → yt-frames, НЕ yt-listen.
    • «о чём этот ролик » → yt-transcript + summary, НЕ yt-listen (нет музыкального контекста).
  3. What-NOT-to-do compliance:

    • User: «дай lyrics из <музыкальный URL>» → агент НЕ должен вызывать Whisper / yt-transcribe-music; должен объяснить что это отдельный pipeline (Demucs + Whisper), out of scope yt-listen.
  4. E2E против реального URL (короткий музыкальный клип, e.g. 1-минутный royalty-free track):

    • yt-listen URL --timestamps 0:30 --duration 10s создаёт 3 артефакта в ./yt-cache/<vid>/audio/.
    • features_0030.md содержит BPM, key, хотя бы одну строку chord progression, RMS, spectral centroid.
    • spectrum_0030.png валиден (открывается, ~1024×384, mel-scale читаема).

Закрытие: все 4 группы зелёные, findings — отдельные follow-up tasks через tasks_create если есть.

Status: done Where I stopped: behavioral 8/8 (4 pos→yt-listen, 3 neg-route→transcript/frames, 1 W-NOT-do→Demucs+Whisper pointer); E2E content 5/5 (BPM 113.5, Key G# Minor, chord G#→D#, RMS 0.14/0.22, centroid 2882 Hz; PNG 1024×384 mel+log+viridis vision-checked); naming divergence + PATH-shim gap → follow-ups: OpeItcLoc03/common slug=yt-listen-naming-align, claude-skills slug=using-yt-tools-listen-path-shim-investigate Next action: (none — kept until merged) Branch: n/a


🟢 [using-yt-tools-listen-path-shim-investigate] — SKILL.md Prerequisites/Invoke pattern рекомендует $HOME\.local\bin\yt-dlp.exe — на DESKTOP-NSEF0UK даёт SRE module mismatch (uv-managed cpython-3.12 corrupt). Working path = $HOME\pipx\venvs\yt-tools\Scripts. Источник: E2E E1 в using-yt-tools-listen-test-trigger STEP 5 — default invoke упал, ручной prepend venv Scripts dir починил. Решить: shim-corruption local или systemic gap в SKILL.

Status: done (wontfix — machine-local transient) Where I stopped: Closed 2026-05-25. SRE не воспроизводится. На машине обнаружены три yt-dlp: (a) Python313\Scripts\yt-dlp.exe (system pip, первый на PATH), (b) ~\.local\bin\yt-dlp.exe (uv tool install → uv-managed Python 3.14.3), (c) ~\pipx\venvs\yt-tools\Scripts\yt-dlp.exe (pipx-bundled с yt-tools, Python 3.12.13). Все три отвечают --version exit 0. Все три интерпретатора (3.12.13/3.13.13/3.14.3) импортят re без SRE error. Shim'ы yt-listen.exe в .local/bin и pipx venv — байт-идентичны (SHA256 match). Диагноз task'и «uv-managed cpython-3.12 corrupt» вероятно misdiagnosis — реальный виновник на момент smoke-test был Python313\Scripts\yt-dlp.exe (первый на PATH). uv с тех пор апгрейднулся 3.12 → 3.14.3, что независимо могло залечить состояние. SKILL.md "Locating binaries" уже имеет корректную fallback chain (PATH → ~/.local/bin → legacy venv); прописывать $HOME\pipx\venvs\yt-tools\Scripts приоритетным не нужно. Next action: (none — closed as wontfix; если рекуррент на другой машине — root-cause вероятно corrupt system-Python _sre.pyd, не SKILL gap) Branch: n/a


[meta-host-routing-install] — Установить новый скил meta-host-routing v0.1.0 (закоммичен локально a7526d1, ещё не установлен — потому не триггерит).

Запустить install.sh в ~/projects/claude-skills/, проверить что скил активируется в новой сессии, /reload-plugins.

Weight: needs-human Status: ready Where I stopped: (not started) Next action: Запустить install.sh, открыть новую CC-сессию, убедиться что meta-host-routing в available-skills, /reload-plugins. Branch: n/a


[meta-host-routing-hermes-mapping] — Добавить запись meta-host-routing в ~/projects/claude-skills/hermes/mapping.yaml.

Режим: pending (не auto) — скил трогает инструменты/окружение (projects-meta MCP: tasks_create/knowledge_ingest/meta_status), требует отдельного hermes-аудита перед auto-promotion.

Weight: needs-human Status: ready Where I stopped: (not started) Next action: Добавить entry meta-host-routing в hermes/mapping.yaml с mode: pending; зафиксировать что причина — tool-touching скил. Branch: n/a


[meta-host-routing-test-trigger] — Прогнать триггер-фразы meta-host-routing из description на тестовом сценарии.

Должен активироваться: «project not in cache» от projects-meta; промоушен/таски для проекта с github-remote; «заведи таски в <github-проект>», «промоутни <github-проект>». НЕ должен (false-positive check): обычный Gitea-проект уже в projects-meta (прямой маршрут); 2-3 близкие фразы из соседних доменов (using-projects-meta query, обычный tasks_create в known-проект).

Weight: needs-human Status: ready Where I stopped: (not started) Next action: В чистой сессии прогнать активацию на своих фразах И убедиться что не фаерит на 2-3 чужих близких; зафиксировать результат. Branch: n/a


🔵 [meta-host-routing-review] — Skill-review checkpoint для meta-host-routing (промоушен 2026-05-27).

Источник дизайна: ~/projects/.workshop/.archive/2026-05-10-meta-out-of-repo.md (правило) + причина создания в .workshop/.wiki/log.md (2026-05-27). Импл-таски: meta-host-routing-install, -hermes-mapping, -test-trigger.

Кто делает: НЕ имплементер. Другая сессия / агент.

Поведенческий smoke-test (acceptance):

  • Активируется на каждой триггер-фразе из description (RU/EN).
  • НЕ активируется на близких чужих фразах (known-Gitea-проект → прямой маршрут).
  • Steps отрабатывают: detect (github remote / not-in-cache) → resolve meta-host (grep .common) → route. На реальном кейсе yt-tools резолвит .common.
  • Failure modes уводят в STOP+ask (no host found / multiple hosts), не в гадание.
  • What NOT to do соответствует реальности.

NB: написан целиком в обход workshop-promote skeleton-флоу (по решению user'а), потому тело уже заполнено — ревью проверяет содержание, не пустой каркас.

Findings → follow-up tasks в claude-skills.

Закрытие: когда findings зафайлены ИЛИ «нет findings» в close-note. Семвер дальше — владелец claude-skills.

Status: blocked Where I stopped: (not started) Next action: Дождаться 🟢 у 3 baseline-тасок. Прогнать поведенческий smoke-test. Findings → follow-up tasks. Blocker: impl-tasks: meta-host-routing-install, meta-host-routing-hermes-mapping, meta-host-routing-test-trigger Branch: n/a


🟢 [private-dev-public-publish-install] — [skill private-dev-public-publish, baseline 1/3] Установить скил. Запустить install.sh в ~/projects/claude-skills/, проверить что скил активируется в новой сессии (триггер-фразы из description), сделать /reload-plugins. Skeleton-коммит: 63eab18. NB: тело скила пока пустой каркас (Steps/Failure modes/… не заполнены) — это нормально для install (description достаточно для активации); тело дописывается вторым проходом «доведём private-dev-public-publish».

Status: done Where I stopped: Установлен 2026-05-29 через install.ps1 -Names private-dev-public-publish (Windows) → ~/.claude/skills/private-dev-public-publish/SKILL.md. Подтверждено: скил появился в available-skills прямо в этой сессии (харнес подхватил без явного /reload-plugins). Next action: (none — done; настоящий behavioral-тест активации = задача -test-trigger в чистой сессии) Branch: n/a


🟢 [private-dev-public-publish-hermes-mapping] — [skill private-dev-public-publish, baseline 2/3] Добавить запись в ~/projects/claude-skills/hermes/mapping.yaml. Режим: pending (НЕ auto) — скил не чисто стилевой: его Steps трогают git/gh/Gitea-API, токены, force-push, удаление/приватность репо. Требует отдельного аудита перед auto-режимом.

Status: done Where I stopped: Запись добавлена в hermes/mapping.yaml (секция pending — behavioral audit required), mode: pending + intended: {mode: auto, category: software-development} + reason про git/gh/Gitea-API/токены/force-push/приватность. Стиль зеркалит using-vds-ops/session-handoff. version маппинга не бампал — schema-версия, не контент. Next action: (none — done; перевод pending→auto только после аудита tool-side эффектов, гейт = -test-trigger + review) Branch: n/a


🟢 [private-dev-public-publish-test-trigger] — [skill private-dev-public-publish, baseline 3/3] Прогнать триггер-фразы из description на тестовом буфере: убедиться что активируется на СВОИХ фразах («опубликовать форк на гитхаб», «приватный гитеа публичный гитхаб», «publish a fork without exposing dev history», «curated publish to github») И НЕ активируется на 2-3 близких чужих (false-positive check): напр. «инициализируй проект» (→ project-bootstrap), «запушь на гитхаб» (обычный push, не публикация форка), «настрой приватный репо» (без upstream/публикации).

Status: done Where I stopped: Прогнано 2026-05-29 через 7 параллельных clean-context субагентов (каждый — свежий контекст, прокси чистой сессии; имплементер прайменный). Результат: 4/4 positive → private-dev-public-publish ; 3/3 negative мимо (инициализируй→project-bootstrap, запушь→project-discipline push-gate, настрой приватный репо→project-bootstrap) . Ноль false-positive. Findings нет — description хорошо отскоплен. Next action: (none — done; clean pass, follow-up не требуется) Blocker: (cleared) Branch: n/a

Branch: n/a


🟢 [private-dev-public-publish-review] — Skill-review checkpoint для private-dev-public-publish (промоушен 2026-05-29).

Источник дизайна: .workshop/.archive/2026-05-29-skill-private-dev-public-publish.md. Импл-таски: private-dev-public-publish-{install, hermes-mapping, test-trigger}. Предусловие: второй проход дописал тело каркаса (Steps/Failure modes/Side effects/What NOT to do) из архива — иначе поведенческий smoke-test нечего проверять.

Кто делает: НЕ имплементер. Другая сессия / другой агент. Identity-not-location.

Поведенческий smoke-test (acceptance):

  • Активируется в чистой сессии на каждой триггер-фразе description (RU И EN).
  • НЕ активируется на 2-3 близких чужих (project-bootstrap, обычный git push, приватный репо без публикации).
  • Каждый шаг Steps отрабатывает на тестовом сценарии (fork + private Gitea + curated copy) без ошибок.
  • Failure modes уводят в abort, не в частичный успех (особ.: безродный снапшот вместо форка; meta молча проигнорена глобальным gitignore; релиз без полного исходника).
  • What NOT to do соответствует реальности.

Findings → follow-up tasks (private-dev-public-publish--fix) в claude-skills. Закрытие: все findings зафайлены ИЛИ ревьюер подтвердил «нет findings». NB семвер: version 0.1.0 записан промоутером; дальнейшие бампы — владелец claude-skills, не ревьюер.

Status: done Where I stopped: Review прогнан 2026-05-29 свежим non-implementer субагентом против заполненного тела v0.2.0. Вердикт: CHECK 1 (полнота vs архив) PASS, CHECK 2 (executability Steps) FAIL, CHECK 3 (failure modes→abort) PASS, CHECK 4 (What-NOT) PASS, CHECK 5 (description↔body) PASS. 3 findings, все устранены в том же v0.2.0 (некоммиченный инкремент, без двойного бампа): (1) Step 5 копировал dev→pub без exclusion → утечка .wiki//.tasks//CLAUDE.md в публичный форк — добавлен явный meta-exclude + .gitignore-backstop + git status-чек + новый 4-й failure mode; (2) origin pub-папки не заводился до push — Step 4 теперь клонирует форк в pub (origin=fork, upstream=canonical); (3) minor — Step 3 «на той же базе» механизирован (clone fork→add gitea remote→push base). Re-install выполнен. Next action: (none — done; все findings зафайлены и зафиксированы fix'ами; follow-up tasks не требуются) Blocker: (cleared) Branch: n/a

Branch: n/a


🟢 [delegate-task-install] — Запустить install.sh в ~/projects/claude-skills/, проверить что скил delegate-task активируется в новой сессии, сделать /reload-plugins.

Weight: needs-claude Notify: OpeItcLoc03/workshop Status: done Where I stopped: hot-loaded the skill mid-session (same evidence the prior install task closed on). A clean-session behavioral trigger run is intentionally scoped to the separate delegate-task-test-trigger task, not this install task.

No code/TDD surface (markdown skill + board update). The install writes outside the repo to ~/.claude/skills/, so the only committable artifact was the .tasks/STATUS.md close. Next action: (none — kept until merged) Branch: n/a


🟢 [delegate-task-hermes-mapping] — Добавить запись delegate-task в ~/projects/claude-skills/hermes/mapping.yaml. Режим: pending (скил трогает MCP-инструменты — требует аудит перед auto).

Weight: needs-claude Notify: OpeItcLoc03/workshop Status: done Where I stopped: ed entry — which confirms delegate-task is now correctly mapped. Mapping meta-host-routing requires its own per-skill audit (mode + category) and belongs to a separate task; I did not guess it. Recommend a follow-up task to map meta-host-routing so the build goes green again.

Note: I skipped the session-handoff hook suggestion — this is a one-shot delegated task, not an interactive session. Next action: (none — kept until merged) Branch: n/a


🟢 [delegate-task-test-trigger] — Прогнать триггер-фразы из description на тестовом буфере: убедиться что скил активируется на своих фразах И не активируется на 2-3 близких чужих (false-positive check).

Тест-фразы (должны активировать): «делегировать таску», «delegate task», «создать задачу на агента», «поставить задачу агенту», «tasks_create для».

False-positive check (не должны активировать): «создать задачу себе», «обновить таску», «закрыть таску».

Weight: needs-claude Notify: OpeItcLoc03/workshop Status: done Where I stopped: Прогнано 2026-06-09 через clean-context субагентов (свежий контекст = прокси чистой сессии, имплементер прайменный). Каждому давалась только тест-фраза как первое сообщение + реалистичный neighborhood available-skills (delegate-task + конкуренты using-tasks/using-projects-meta/setup-tasks/session-handoff и др.), без подсказки «какой скил ожидается». Positives 5/5 : «делегировать таску»→delegate-task; «delegate task to the books project»→delegate-task; «создать задачу на агента»→delegate-task; «поставить задачу агенту»→delegate-task; «tasks_create для проекта X»→delegate-task. Negatives 2/3: «обновить таску»→using-tasks , «закрыть таску»→using-tasks , «создать задачу себе [на завтра]»→delegate-task FALSE POSITIVE (5/5 trials, консистентно). Корень: триггер «создать задачу на агента» матчится по стему «создать задачу», а негатив-клауза "Does NOT apply when doing the work yourself" слишком абстрактна чтобы перебить literal-match под 1%-rule — субагенты распознавали «себе»-исключение в reasoning, но всё равно ставили delegate-task FIRST. Finding → follow-up delegate-task-description-fp-fix (ниже) + кормит delegate-task-review. Next action: (none — done; follow-up зафайлен) Branch: n/a


[delegate-task-description-fp-fix] — Устранить false-positive активацию delegate-task на «создать задачу себе» (self-assigned task).

Находка (delegate-task-test-trigger, 2026-06-09, 5/5 trials): фраза «создать задачу себе [на завтра]» консистентно фаерит delegate-task вместо using-tasks. Триггер «создать задачу на агента» матчится по стему «создать задачу»; негатив-клауза "Does NOT apply when doing the work yourself" слишком абстрактна — субагенты распознавали «себе» в reasoning, но всё равно ставили delegate-task FIRST под 1%-rule.

Варианты фикса (один, не меню — рекомендация): добавить «создать задачу себе» / «task for myself» в явный negative-список description (Does NOT apply ... or for self-assigned tasks on the current board (→ using-tasks)). Делает дизамбигуатор literal, не абстрактным. Bump PATCH. NB: правка description → нужен re-install + (если меняется триггер-семантика) проверка hermes/mapping.

TDD: N/A (markdown/description). Верификация = повторный clean-context trigger-прогон на «создать задачу себе» (ожидание: →using-tasks) + регресс на 5 positive (должны остаться →delegate-task).

Weight: needs-claude Status: ready Where I stopped: (not started) — finding зафиксирован, фикс не начат. Next action: Отредактировать skills/delegate-task/SKILL.md description: добавить self-assigned-task в negative-clause; bump PATCH (0.2.0→0.2.1); re-run trigger-прогон для верификации (negative «создать задачу себе»→using-tasks, 5 positive без регресса). Branch: n/a


🔵 [delegate-task-review] — Skill-review checkpoint для delegate-task (промоушен 2026-06-09).

Источник дизайна: .workshop/.archive/2026-06-09-agent-task-delegation-format.md. Импл-таски: delegate-task-install, delegate-task-hermes-mapping, delegate-task-test-trigger.

Кто делает: не имплементер. Другая сессия / другой день.

Поведенческий smoke-test:

  • Активируется на каждой trigger-фразе из description (RU + EN)
  • Не активируется на «создать задачу себе», «обновить таску», «закрыть таску»
  • Pre-flight gate (4 вопроса) задаётся перед tasks_create
  • Тело задачи содержит секцию «## Обязательные скилы» с императивными invoke
  • Поля weight/notify/allow_upgrade присутствуют в созданной задаче
  • Failure modes уводят в abort, не в частичный успех

Findings → follow-up tasks через tasks_create в claude-skills.

Status: blocked Where I stopped: (not started) Next action: Дождаться 🟢 у всех blocker-тасок. Прогнать поведенческий smoke-test выше. Blocker: impl-tasks: delegate-task-install, delegate-task-hermes-mapping, delegate-task-test-trigger Branch: n/a