# Task Board _Updated: 2026-05-25 (board-cleanup: done-блоки → .archive/done-2026-05.md, остались только активные)_ ## 🟡 [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:** ready **Where I stopped:** Verify 2026-05-07 (factory-context audit): (a) ✅ `scripts/install.ps1` существует — кросс-платформа есть; (b) ❌ `--prune` flag отсутствует в обоих скриптах; (c) ❌ doc `.wiki/concepts/install-cross-platform.md` не написан. 1/3 acceptance — не закрывать. Пересечение с `[claude-skills-update-skill]`: оба про install/build/prune trinity. Имеет смысл сделать вместе — `--prune` логику добавить в существующие `install.{ps1,sh}` параллельно с новыми `update.{ps1,sh}` (которые будут жить в том же `scripts/`). Doc `install-cross-platform.md` тогда покрывает всю четвёрку. **Next action:** (a) уже есть. Остаётся: (b) добавить `--prune` flag в `scripts/install.ps1` и `scripts/install.sh` — для каждого имени в `~/.claude/skills//`, отсутствующего в `skills//`, удалить (lesson из `[compress-dedup]`). (c) написать `.wiki/concepts/install-cross-platform.md` — документировать parity-инвариант (PS+bash сpan, identical behavior, paired flags, error semantics). Опционально: совместить с `[claude-skills-update-skill]` (см. её next_action). **Branch:** (not started) --- ## ⚪ [archive-roundtrip-test] — smoke-test for .skill archive shape **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/.skill`, unzips into a temp dir, and `diff -r` against `skills//`. 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 **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`. **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: ]` 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: ] 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: : was ; is ; reason: ] 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 && git commit (test-only) && git add && 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. **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. **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 --- ## 🟢 [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:** ready **Where I stopped:** (not started) **Next action:** 1. `git pull` в `claude-skills/`. 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.`. 7. **НЕ запускать install.sh, НЕ делать push, НЕ править hermes/mapping.yaml** — `install` и `hermes-mapping` идут отдельными скил-baseline-тасками (создадутся если/когда понадобятся; для PATCH update обычно достаточно reload-plugins). **Branch:** n/a ---