Files
claude-skills/.tasks/STATUS.md

806 lines
76 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Task Board
_Updated: 2026-06-09 — session-break-using-tasks done (using-tasks 1.1.0→1.2.0; `session_break` marker — stop after close before claim-next). Ранее: delegate-task-review done (VERDICT PASS; smoke-test 6/6 fresh subagents, no blocking findings, 3 informational notes). Ранее: delegate-task-test-trigger done (pos 5/5, neg 2/3; FP на «создать задачу себе» → follow-up delegate-task-description-fp-fix, shipped v0.2.1). Ранее (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)._
<!--
Canonical layout. One block per task. Per-task deep context lives in
.tasks/<task-slug>.md (created by using-tasks when a task becomes active
or paused). Historical Done entries dropped — git log is the history.
Status legend:
🔴 Active — only one at a time
🟡 Paused — in progress, resumable
⚪ Ready — defined, not started
🟢 Done — kept until merged
🔵 Blocked — waiting on external input
-->
## ⚪ [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
<!-- created-by: vitya@DESKTOP / from: modulair-wiki ingest session / 2026-05-31 -->
<!-- re-scoped: vitya@.admin-exec / 2026-06-08 / target moved claude-skills stub → OpeItcLoc03/yt-tools plugin (agent finding during always-on dry-run) -->
---
## 🟡 [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
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-25 / 3/3 acceptance met; build-script analogue for dist/.skill prune remains separate concern -->
---
## 🟢 [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
<!-- created-by: vitya@DESKTOP-NSEF0UK / 2026-05-25 / origin: [install-ps1] close — natural extension to build scripts -->
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-25 / acceptance: bash + PS prune ✅; smoke-test ✅; wiki extended ✅ -->
---
## ⚪ [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-06T20:21:57.210Z -->
---
## ⚪ [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):**
```bash
# 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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-07T05:10:28.610Z -->
---
## ⚪ [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` с шапкой:
```markdown
# Archived — Done batch 2026-05
Перемещено из `.tasks/STATUS.md` 2026-05-07 в рамках board-cleanup. Полный список 🟢 done-тасок, шипанутых в апреле-мае 2026.
Полный source — git history `.tasks/STATUS.md` до commit X.
---
```
И подряд все 🟢-блоки в исходном виде.
5) 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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: meeting-room / 2026-05-07T09:43:23.919Z -->
---
## 🟢 [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-12T16:22:03.380Z -->
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-25 / wontfix: NAS decommissioned -->
---
## 🟢 [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
<!-- created-by: vitya@DESKTOP-NSEF0UK / 2026-05-21 / origin: [using-vds-ops-review] fresh-eyes subagent informational note #1 -->
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-25 / wontfix: empirically 1473 chars works, memory note was paranoid; entry deleted -->
---
## 🟢 [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
<!-- created-by: vitya@DESKTOP-NSEF0UK / 2026-05-21 / origin: [using-vds-ops-review] fresh-eyes subagent informational note #2 -->
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-25 / wontfix: NAS decommissioned; sibling skill using-synology-ops itself is now a retirement candidate — see follow-up question -->
## 🟢 [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.yaml**`install` и `hermes-mapping` идут отдельными скил-baseline-тасками (создадутся если/когда понадобятся; для PATCH update обычно достаточно reload-plugins).
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-25T09:51:08.193Z -->
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-05-25T10:38:20.156Z / note: 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 разблокирован, но требует чистой сессии). -->
---
## 🟢 [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 в этом ролике <URL>» → агент вызывает `yt-listen URL --timestamps 2:30`.
- «какой BPM в <URL>» → `yt-listen URL` (без timestamp = bulk-mode hint или quick-default).
- «listen to fragment at 1:15 <URL>» → `yt-listen URL --timestamps 1:15`.
- «спектрограмма видео <URL>» → `yt-listen --timestamps` с хотя бы одним таймкодом (агент должен выбрать sensible default или спросить).
2. **Trigger activation negative (3 близкие, но не свои):**
- «расшифруй видео <URL>» → `yt-transcript`, НЕ `yt-listen`.
- «покажи кадр на 1:23 <URL>» → `yt-frames`, НЕ `yt-listen`.
- «о чём этот ролик <URL>» → `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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-25T09:51:38.340Z -->
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-05-25T12:36:06.299Z / note: 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 -->
---
## 🟢 [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/claude-skills / 2026-05-25T12:35:52.467Z -->
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-25 / wontfix: SRE не воспроизводится; три yt-dlp на машине (Python313 system / uv / pipx-bundled), все работают; shim'ы byte-identical; SKILL.md уже корректна -->
---
## ⚪ [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-27T06:51:20.306Z -->
---
## ⚪ [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-27T06:51:27.010Z -->
---
## ⚪ [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-27T06:51:35.089Z -->
---
## 🔵 [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-27T06:51:48.622Z -->
---
## 🟢 [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-29T09:45:22.748Z -->
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-29 / installed via install.ps1; visible in available-skills this session -->
<!-- amg-handoff: 2026-05-29 / Claude — install verified by skill appearing in available-skills mid-session -->
---
## 🟢 [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-29T09:45:29.551Z -->
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-29 / mapping entry added, mode:pending, intended auto/software-development -->
---
## 🟢 [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-29T09:45:38.735Z -->
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-29 / 4/4 pos + 3/3 neg clean, no false-positive, no findings (subagent clean-context proxy) -->
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-29T09:45:38.735Z -->
---
## 🟢 [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-<gap>-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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-29T09:45:58.420Z -->
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-29 / non-implementer subagent review; 3 findings (meta-leak in copy, undefined pub origin, unmechanized base) all fixed in v0.2.0 -->
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-29T09:45:58.420Z -->
---
## 🟢 [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T08:42:01.631Z -->
<!-- closed-by: DESKTOP-NSEF0UK:claude-opus:11140 / 2026-06-09 / installed via install.ps1; visible in available-skills this session -->
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-06-09T09:20:28.812Z / note: 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. -->
---
## 🟢 [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T08:42:04.880Z -->
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-06-09T09:23:28.902Z / note: 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. -->
---
## 🟢 [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T08:42:09.557Z -->
<!-- closed-by: DESKTOP-NSEF0UK:claude-opus:11140 / 2026-06-09 / pos 5/5, neg 2/3; reliable FP on «создать задачу себе» (5/5 trials) → follow-up delegate-task-description-fp-fix -->
---
## 🟢 [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.
**TDD:** N/A (markdown/description). Верификация = повторный clean-context trigger-прогон.
**Weight:** needs-claude
**Status:** done
**Where I stopped:** Shipped 2026-06-09. `skills/delegate-task/SKILL.md` 0.2.0→0.2.1 (PATCH). Description negative-clause сделана literal+routed: «создать задачу себе» / «task for myself» / «поставить себе задачу» → using-tasks; body "Не применяется" получил self-assigned буллет + дизамбигуатор («на агента»/«агенту»/«в проект X» = делегирование; «себе»/«myself» = своя доска). Верификация — fresh-context субагенты, симулированный available-skills registry (новое описание + конкуренты using-tasks/using-projects-meta/setup-tasks/session-handoff), без подсказки об ожидаемом ответе: **positives 5/5** (все 5 делегирующих фраз → delegate-task, регресса нет), **negative «создать задачу себе на завтра» 4/5 → using-tasks** (было 0/5 до фикса). Единственный остаточный miss reasoned правильно («себе»→using-tasks), но споткнулся об eval-артефакт (промпт форсил имя скила в первой строке ДО reasoning), не об неоднозначность описания. Concept page `.wiki/concepts/delegate-task-negative-trigger-fp.md` + index/log обновлены. NB: re-install (`~/.claude/skills/`) и hermes/mapping не трогал — install это отдельная baseline-таска (для PATCH достаточно reload-plugins), а правка только negative-clause не меняет tool-touching семантику (mapping mode остаётся pending).
**Next action:** (none — kept until merged). Optional follow-up: разблокировать `delegate-task-review` (его smoke-test включает этот negative-кейс).
**Branch:** n/a
<!-- created-by: DESKTOP-NSEF0UK:claude-opus:11140 / from: delegate-task-test-trigger finding / 2026-06-09 -->
<!-- closed-by: DESKTOP-NSEF0UK:claude-opus:11140 / 2026-06-09 / 0.2.0→0.2.1 PATCH; literal negative-clause; verified pos 5/5 + neg 4/5 (was 0/5); 1 residual miss = eval-harness artifact -->
---
## 🟢 [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:** done
**Where I stopped:** Review прогнан 2026-06-09 свежей non-implementer сессией против SKILL.md v0.2.1 (включает negative-trigger fp-fix). Все 3 blocker-таски 🟢 (install/hermes-mapping/test-trigger). **VERDICT: PASS — нет блокирующих findings.** Smoke-test 6 bullets: (1) trigger activation — 6/6 fresh clean-context субагентов: pos 3/3 [«делегировать таску»/«delegate task to the books project»/«поставить задачу агенту» → delegate-task], neg 3/3 [«создать задачу себе на завтра»/«обновить таску»/«закрыть таску» → using-tasks]; ранее FP-кейс «себе» теперь маршрутится верно (v0.2.1 literal-negative держится под fresh eyes); (2) negatives — ✅; (3) pre-flight gate ПРИСУТСТВУЕТ перед tasks_create (Step 1 до Step 3); (4) «## Обязательные скилы» с императивными invoke — ✅ (Step 2 template); (5) weight/notify/allow_upgrade — ✅ в template; (6) failure modes → abort/re-ask, не частичный успех — ✅. CHECK completeness vs design archive: все элементы Round 7/8 присутствуют (default skill-set, steering-loop поля, paired review-task, TDD да/нет, разрешения). CHECK executability: все Steps исполнимы реальным tasks_create (notify=native param; weight/allow_upgrade пишутся в body как board-convention — поллер читает оттуда; dry-run confirm=false; paired review-task через status=blocked+blocker — native). **3 информационные заметки (не дефекты, follow-up не заводил):** (a) pre-flight gate теперь 5 вопросов (добавлен Q0 critical-infra→needs-human), а design-архив/acceptance говорят «4» — это улучшение, согласованное с What-NOT-to-do правилами про needs-human для инфры; skill менять не надо, текст acceptance устарел; (b) body-template хардкодит `.wiki/concepts/<slug>.md`, design Round 6 хотел выбор папки (concepts/entities/raw) — concepts/ разумный дефолт per wiki-schema; (c) Inputs перечисляет weight/allow_upgrade рядом с notify, но native tasks_create-параметр только notify — weight/allow_upgrade это body-поля; косметика, не дефект.
**Next action:** (none — done; PASS, нет блокирующих findings, follow-up tasks не требуются)
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T08:42:20.151Z -->
<!-- closed-by: DESKTOP-NSEF0UK:claude-opus:26012 / 2026-06-09 / VERDICT PASS; smoke-test 6/6 (trigger pos 3/3 + neg 3/3 fresh subagents); completeness+executability checks pass; 3 informational notes, no blocking findings, no follow-up tasks -->
---
## 🟢 [session-break-using-tasks] — ## Goal
Add `session_break` field support to `using-tasks` skill v1.1.0 → v1.2.0.
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-06-09T13:34:20.319Z / note: hermes/mapping.yaml` и не запускал install.** Версия в mapping — это schema-версия, не контент (подтверждено прошлыми тасками); для policy-правки install/mapping идут отдельными baseline-тасками. Если нужен re-install в `~/.claude/skills/` — это вне скоупа этой задачи.
3. **Не пушил**, хотя в задаче `auto-push: yes` — прямая инструкция раннера («do NOT push — the runner delivers it») перевешивает. -->
## Design
Поле `session_break: true | "<hint>"` в frontmatter задачи — маркер точки разрыва сессии.
После закрытия задачи (статус 🟢), ДО `tasks_claim_next`:
1. Прочитать frontmatter закрытой задачи
2. Если `session_break` присутствует — вывести:
`🔚 SESSION BOUNDARY — [slug] закрыта. Рекомендую завершить текущую сессию. Следующий трек: [value | "см. STATUS.md"]`
3. Остановиться, не клеймить следующую задачу
Без флага — поведение прежнее.
## Acceptance criteria
- [ ] SKILL.md → v1.2.0
- [ ] Поле `session_break` задокументировано в frontmatter-конвенциях (тип: bool | string, примеры)
- [ ] Правило проверки: ПОСЛЕ close, ДО claim-next — явно вписано в раздел Task completion
- [ ] Формат SESSION BOUNDARY сообщения зафиксирован дословно
## Skills
- invoke `using-tasks` (прочитать текущий SKILL.md перед правкой)
## Permissions
- interns: no
- auto-push: yes
## Weight
needs-claude
**Weight:** needs-claude
**Status:** done
**Where I stopped:** Shipped — `skills/using-tasks/SKILL.md` 1.1.0→1.2.0 (MINOR). Added `session_break` marker: (1) optional `**Session break:**` field in the STATUS.md format block + new "### `session_break` marker" subsection documenting type (bool | string) with examples (`true` → "см. STATUS.md", `"<hint>"` → named next track) and where it lives (task frontmatter / board mirror); (2) Task completion **step 6** — after close 🟢 + commit, before `tasks_claim_next`, read the closed task's `session_break`; if present, print the verbatim SESSION BOUNDARY line and STOP, else behaviour unchanged; (3) Rules bullet "Honour `session_break`". Verbatim message fixed dead-on per design. Wiki: `concepts/using-tasks-session-break.md` + index + log. All 4 acceptance criteria met (docs/policy artifact — no test surface; coverage by diff inspection).
**Next action:** (none — kept until merged; paired review task `session-break-using-tasks-review` unblocked)
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T10:15:26.019Z -->
<!-- closed-by: DESKTOP-NSEF0UK:claude-opus:18704 / 2026-06-09 / 1.1.0→1.2.0 MINOR; session_break marker (format docs + Task-completion step 6 + Rules bullet + verbatim SESSION BOUNDARY line); wiki concept page; 4/4 acceptance met by inspection (markdown policy, no test surface) -->
---
## ⚪ [session-break-delegate-task] — ## Goal
Add `session_break` as optional field to `delegate-task` task body template v0.2.1 → v0.2.2.
## Design
Добавить в template тела задачи:
```
session_break: "<hint>" # optional — using-tasks остановится после close и предложит закрыть сессию
```
Добавить Q6 в pre-flight gate:
> "Нужен ли разрыв сессии после этой задачи? (domain-switch, milestone, heavy infra)"
Если да — ставить `session_break: "<название следующего трека или hint>"` в создаваемую задачу.
Usage guidance (три случая):
1. Смена домена / репо — переход между несвязанными треками
2. Milestone-задача — последняя в группе sub-tasks фичи
3. Тяжёлые инфра-задачи — shared checkout, migrations
## Acceptance criteria
- [ ] SKILL.md → v0.2.2
- [ ] Template: поле `session_break` с inline-комментарием и примером
- [ ] Pre-flight Q6 добавлен после Q5 (notify)
- [ ] Usage guidance: три случая когда ставить
## Skills
- invoke `delegate-task` (прочитать текущий SKILL.md перед правкой)
## Permissions
- interns: no
- auto-push: yes
## Weight
needs-claude
**Status:** ready
**Where I stopped:** (not started)
**Weight:** needs-claude
**Next action:** Прочитать skills/delegate-task/SKILL.md, добавить Q6 в pre-flight и поле session_break в template, поднять версию до v0.2.2
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T10:15:32.125Z -->
---
## 🔵 [session-break-using-tasks-review] — Review реализации `session_break` в `using-tasks` skill.
Проверить:
- [ ] Правило стоит ПОСЛЕ close, ДО claim-next (не наоборот)
- [ ] Формат SESSION BOUNDARY сообщения соответствует дизайну (включает slug и hint)
- [ ] Отсутствие флага не меняет поведение (регрессия)
- [ ] Версия поднята до v1.2.0
**Status:** blocked
**Where I stopped:** (not started)
**Next action:** Прочитать итоговый SKILL.md после impl, сверить с acceptance criteria задачи session-break-using-tasks
**Blocker:** session-break-using-tasks
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T10:15:45.969Z -->
---
## 🔵 [session-break-delegate-task-review] — Review реализации `session_break` в `delegate-task` skill.
Проверить:
- [ ] Q6 добавлен на правильном месте (после Q5 notify)
- [ ] Template: поле `session_break` с понятным inline-комментарием
- [ ] Usage guidance: три случая явно перечислены
- [ ] Версия поднята до v0.2.2
**Status:** blocked
**Where I stopped:** (not started)
**Next action:** Прочитать итоговый SKILL.md после impl, сверить с acceptance criteria задачи session-break-delegate-task
**Blocker:** session-break-delegate-task
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T10:15:48.687Z -->
---
## ⚪ [skill-using-system-snapshot] — ## Goal
Создать скил `using-system-snapshot` в `claude-skills`.
## Назначение
Заменить разрозненные ops-проверки (tasklist, docker ps, meta_status вручную) одним вызовом `mcp__projects-meta__meta_system_snapshot` в начале сессии.
## Содержание скила
- **Когда вызывать**: старт сессии при ops-контексте; перед любым утверждением о состоянии процессов/поллера
- **Что делать**: вызвать `mcp__projects-meta__meta_system_snapshot`, интерпретировать ответ
- **Формат вывода**: одна строка на секцию — поллер (стоп/работает + проекты), docker (ОК / список проблем), задачи (сводка по проектам)
- **Запрет**: не утверждать состояние процессов без предварительного вызова snapshot
## Acceptance criteria
- [ ] `skills/using-system-snapshot/SKILL.md` создан
- [ ] Trigger-фразы описаны: «что запущено», «состояние системы», «поллер работает?»
- [ ] Dependency: инструмент `meta_system_snapshot` должен быть готов (`meta-system-snapshot` в .common)
## Permissions
- interns: no
- auto-push: yes
## Weight
needs-claude
**Weight:** needs-claude
**Status:** ready
**Where I stopped:** Разблокировано 2026-06-09 — meta-system-snapshot в OpeItcLoc03/common закрыт (review прошёл, live call верифицирован).
**Next action:** Написать skills/using-system-snapshot/SKILL.md
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T11:01:41.414Z -->
---
## 🔵 [skill-using-system-snapshot-review] — Review скила `using-system-snapshot`.
Проверить:
- [ ] Trigger-фразы покрывают реальные сценарии
- [ ] Запрет на утверждение состояния без вызова snapshot — явно прописан
- [ ] Формат вывода достаточно краткий (одна строка на секцию)
**Status:** blocked
**Where I stopped:** (not started)
**Next action:** Прочитать SKILL.md, протестировать триггер в реальной сессии
**Blocker:** skill-using-system-snapshot
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T11:01:59.476Z -->
---
## ⚪ [using-tasks-status-read-perf] — ## Goal
Убрать жалобы агента на «огромный STATUS.md» в `using-tasks` skill.
## Проблема
STATUS.md раздувается от накопившихся 🟢 done-задач. Агент читает файл целиком при ориентации — растёт контекст, жалобы на размер. `tasks_aggregate` не замена: не индексирует ready/done, кэш stale.
## Фикс
Добавить в скил правило архивации done-задач:
- После закрытия задачи (или при заходе в сессию) — если done-блоков накопилось ≥ N (например 10) — переместить их в `.tasks/archive/YYYY-MM.md`
- STATUS.md содержит только активные/паузированные/blocked/ready задачи
## Acceptance criteria
- [ ] SKILL.md обновлён: правило архивации done-задач описано (порог + целевой файл)
- [ ] Формат архивного файла зафиксирован (append в `.tasks/archive/YYYY-MM.md`)
- [ ] Версия поднята (v1.x)
## Permissions
- interns: no
- auto-push: yes
## Weight
needs-claude
Убрать жалобы агента на «огромный STATUS.md» в `using-tasks` skill.
## Проблема
Скил предписывает читать STATUS.md целиком для ориентации (активные/паузированные блоки). Файл растёт по мере накопления задач — агент тратит контекст и жалуется на размер.
## Фикс
Заменить `Read STATUS.md` на `mcp__projects-meta__tasks_get_status` при ориентации (найти активные/паузированные задачи). STATUS.md читать только при явном запросе полного обзора доски.
Дополнительно: добавить правило периодической архивации 🟢 done-задач из STATUS.md (накапливаются, не нужны в активном файле).
## Acceptance criteria
- [ ] SKILL.md обновлён: ориентация через `tasks_get_status`, не Read
- [ ] STATUS.md читается только по явной необходимости (полный обзор)
- [ ] Правило архивации done-задач добавлено
- [ ] Версия поднята (v1.x)
## Permissions
- interns: no
- auto-push: yes
## Weight
needs-claude
**Weight:** needs-claude
**Status:** ready
**Where I stopped:** (not started)
**Next action:** Прочитать текущий SKILL.md, найти все места где предписан Read STATUS.md, заменить на tasks_get_status где уместно
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T11:05:08.162Z -->
---
## 🔵 [using-tasks-status-read-perf-review] — Review фикса STATUS.md bloat в `using-tasks`.
- [ ] Ориентация действительно идёт через `tasks_get_status`, не Read
- [ ] Нет регрессий — полный обзор доски всё ещё работает когда нужен
- [ ] Правило архивации done-задач понятно сформулировано
**Status:** blocked
**Where I stopped:** (not started)
**Next action:** Прочитать обновлённый SKILL.md, проверить что Read STATUS.md убран из ориентационного flow
**Blocker:** using-tasks-status-read-perf
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T11:05:18.063Z -->
---