Root cause confirmed: the carve-out routed to inter-session-peer-discipline, which existed in sources but was not installed -> no competitor in the registry, nearest in-domain skill won. Fix = install the sibling (byte-identical parity). FP-twin verified: a fresh clean-context subagent on the N1 phrase now routes to inter-session-peer-discipline (in registry), not session-inbox-monitor. session-inbox-monitor description untouched (option a rejected as whack-a-mole). Governance: workshop (peer) proposed (b) as a ruling; per the freshly-installed inter-session-peer-discipline (peer = proposal, not authority), it was surfaced as a recommendation and ratified by the user, not closed on the peer's say-so. Closes session-inbox-monitor-received-msg-fp. Wiki concept Status open->resolved. Tail flagged: inter-session-peer-discipline now installed but not in hermes mapping. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
151 KiB
Task Board
Updated: 2026-06-17 — session-inbox-monitor-test-trigger closed (VERDICT PASS; clean-session run, 7 непрайменных субагентов: pos 4/4→session-inbox-monitor [вкл. CLAUDE.md-line P4], neg 2/3 [N2 backend→none, N3 received-msg EN→none, N1 received-msg RU→FP]; FP borderline + body-load-self-correcting, корень=inter-session-peer-discipline не установлен; follow-up session-inbox-monitor-received-msg-fp заведён; -review разблокирован [нужна НЕ-имплементер сессия]; строка inbox monitor: raise on start добавлена в CLAUDE.md по согласию user). Ранее: task-loop-test-trigger closed (VERDICT PASS; live clean-session run: pos 6/6→task-loop, neg discrimination clean, task-loop FP 0/3, behavioral 4/4 [consult-gate, session_break BOUNDARY, empty-stop-no-poll, long-watch ScheduleWakeup≥1200 not CronCreate]; registry confirmed real via subagent probe; ALL 3 task-loop baselines now done; finding: session_break is the fragile gate — body-load-dependent, informational only, no fix). Ранее: task-loop-hermes-mapping closed (task-loop entry → hermes/mapping.yaml mode:pending, intended auto/mcp; reason claim/close/heartbeat + ScheduleWakeup; YAML validated; schema version untouched. 2 of 3 task-loop baselines now done; -test-trigger ⚪ remains, needs clean session). Ранее: task-loop-install closed (skill installed to ~/.claude/skills/, diff-identical to source, visible in available-skills with full description post-/reload-plugins; -test-trigger unblocked → ⚪ ready, needs clean session). Ранее: using-tasks-session-lock shipped (using-tasks 1.3.0→1.4.0; session lock guard: start step 1 + end step 1 + .gitignore + Structure docs). Ранее: meta-host-routing-review closed (VERDICT PASS; behavioral 8/8 via clean-context subagents — 5 pos→meta-host-routing, 3 neg routed away incl. known-Gitea Skip-clause; Steps verified vs live infra: yt-tools→OpeItcLoc03/meta-yt-tools dedicated host resolves, .common grep hits, excludesFile/auth.toml present; failure-modes→STOP+ask, What-NOT accurate; no blocking findings on skill v0.3.0. Observation: task acceptance «resolves .common» is stale — skill+reality route yt-tools to dedicated meta-yt-tools host. Caveat: -install + -hermes-mapping baselines remain ⚪ open — skill not in ~/.claude/skills nor hermes/mapping.yaml; review covers content+trigger-discrimination only, not live-harness activation). Ранее: task-format skill v0.1.0 created (TDD via writing-skills; RED 3-fail → GREEN 2-pass). Ранее: using-markitdown-cli-rewrite-review done (VERDICT PASS; SKILL.md без mcp__markitdown__, CLI-примеры совпадают с markitdown 0.1.6 --help, version 1.0.0→1.0.1 PATCH, dist консистентен; 1 informational finding — docker-контейнер респаунится из out-of-scope ~/.claude.json MCP-регистрации → follow-up using-markitdown-mcp-deregister needs-human). Ранее: skill-using-system-snapshot-review done (VERDICT PASS 3/3; live tool-contract verify + 9-way fresh-context trigger test, 8 clean; 3 informational findings, none blocking — incl. missing deployment scaffold: skill not installed / not in hermes-mapping / no baseline tasks). Ранее: using-tasks-status-read-perf done (using-tasks 1.2.0→1.3.0; done-task archival rule fixes STATUS.md bloat; literal tasks_get_status-for-orientation swap NOT done — tool can't enumerate the board, documented). Ранее: 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).
⚪ [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 + запросы по одному с паузами 25–35с + ранний abort если первый не прошёл (чтобы не жечь cooldown впустую).
Второй, смежный баг той же сессии: yt-transcript по умолчанию просит --lang en и промахивается мимо ручных en-US субтитров (видео с manually-created en-US и без en отдаёт "no transcript"). Лечится --lang en-US,en (или вообще автоопределением).
Что добавить в SKILL.md:
-
What NOT to do — новый буллет: «Не пулять в YouTube пачкой запросов. Несколько URL подряд (или metadata+transcript залпом) →
HTTP 429, IP-block на минуты, бьёт оба пути (transcript-api и yt-dlp). Обрабатывай по одному, с паузой ≥25–35с между; при пакете из N URL — последовательно, не параллельно. Если уже словил 429 — cooldown ~3–5 мин перед повтором, проверяй первый запрос и не продолжай залп если он упал.» -
Failure modes — новая строка: симптом
HTTP 429 Too Many Requests/"blocking requests from your IP"→ причина: слишком много запросов подряд (rate-limit, не приватность/регион) → действие: cooldown + по одному с паузами; НЕ retry в цикле без задержки. Отличать отyt-dlp source download failed(это реальная недоступность видео). -
(опц.) 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, внести пункты 1–3 (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
$1arg, 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/@Ignoreannotations - 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.ps1that delegates if needed. - Tested on a real repo before commit (
booksis a good candidate — it has Jest tests +*.test.jsconvention). - 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.
---
И подряд все 🟢-блоки в исходном виде.
- Edit
.tasks/STATUS.md: убрать все 🟢-блоки + соседние---разделители. Header + status legend + 🔴/🟡/⚪/🔵 блоки оставить. 6) Verify:grep '^## ' .tasks/STATUS.md | wc -l— было ~28+, должно остаться число активных (🔴+🟡+⚪+🔵, ожидание ~10-12). 7) Commitmeta(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_getslugconcepts/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:
-
descriptionfrontmatter — добавить аудио-семантику без раздувания (existing description уже длинноват, аккуратно):- Новые триггеры: «послушай момент N», «BPM/тональность/гармония видео», «спектрограмма», «что в музыке на T», «listen to fragment», «analyze audio».
-
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).
- Для музыкальных URL:
-
What NOT to do — точечная защита от scope creep:
- НЕ вызывать Whisper на смешанной музыке (без source-separation = мусор). Если user просит lyrics из музыки — сказать что это отдельный pipeline (Demucs + Whisper), out of scope.
- НЕ интерпретировать spectrum-PNG без features.md.
-
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
🟢 [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):
-
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:30 в этом ролике » → агент вызывает
-
Trigger activation negative (3 близкие, но не свои):
- «расшифруй видео » →
yt-transcript, НЕyt-listen. - «покажи кадр на 1:23 » →
yt-frames, НЕyt-listen. - «о чём этот ролик » →
yt-transcript+ summary, НЕyt-listen(нет музыкального контекста).
- «расшифруй видео » →
-
What-NOT-to-do compliance:
- User: «дай lyrics из <музыкальный URL>» → агент НЕ должен вызывать Whisper /
yt-transcribe-music; должен объяснить что это отдельный pipeline (Demucs + Whisper), out of scopeyt-listen.
- User: «дай lyrics из <музыкальный URL>» → агент НЕ должен вызывать Whisper /
-
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: done
Where I stopped: Ревью прогнано 2026-06-11 против текущего v0.3.0 (НЕ имплементер; baseline -test-trigger субсумирован этим smoke-тестом). Вердикт: PASS, нет блокирующих findings. (1) Behavioral smoke-test 8/8 чисто через clean-context субагентов (simulated registry: meta-host-routing + using-projects-meta/using-tasks/delegate-task/setup-tasks/project-bootstrap, без подсказки ожидаемого ответа): positives 5/5 → meta-host-routing (P1 not-in-cache, P2 github-remote, P3 RU «заведи таски в github-проект», P4 RU «промоутни yt-tools», P5 EN github-hosted); negatives 3/3 мимо (N1 «по всем проектам»→using-projects-meta, N2 «заведи таску в books» known-Gitea→delegate-task [явно сослался на Skip-клаузу], N3 «обнови статус … в текущем проекте»→using-tasks). Ноль false-positive. (2) Steps executable против ЖИВОЙ инфры: Step 2a yt-tools→OpeItcLoc03/meta-yt-tools резолвится (projects-meta трекает доску); Step 2b grep yt-tools в .common даёт хиты; excludesFile+~/.config/git/ignore паттерны+auth.toml на месте. (3) Failure modes все уводят в STOP+ask / детерминированный recovery, не в гадание. (4) What-NOT-to-do — все 4 пункта реальны и консистентны со Skip-клаузой. (5) Completeness vs design: тело верно операционализирует meta-out-of-repo; meta-<project> naming укоренён в archive option-(ii) + уточнён 2026-05-27. Findings: нет (на сам скил). Observation (не дефект скила): acceptance-критерий этой таски «резолвит .common» УСТАРЕЛ — скил v0.3.0 + реальность роутят yt-tools в dedicated host OpeItcLoc03/meta-yt-tools (.common держит только done-архив); скил СВЕЖЕЕ спеки, само-резолвится этим закрытием. Caveat (deployment): -install и -hermes-mapping baselines НЕ зелёные — скил не в ~/.claude/skills/ и не в hermes/mapping.yaml; ревью покрывает только content+trigger-discrimination (subagent-proxy registry), НЕ живую активацию в харнесе и не build-зелёность. Эти 2 остаются под своими ⚪ тасками; новых follow-up НЕ завожу.
Next action: (none — closed by review, нет блокирующих findings; семвер дальше — владелец claude-skills). -test-trigger фактически покрыт (8/8) — закрыть его может владелец отдельно.
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.
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
🟢 [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
🟢 [session-break-using-tasks] — ## Goal
Add session_break field support to using-tasks skill v1.1.0 → v1.2.0.
Design
Поле session_break: true | "<hint>" в frontmatter задачи — маркер точки разрыва сессии.
После закрытия задачи (статус 🟢), ДО tasks_claim_next:
- Прочитать frontmatter закрытой задачи
- Если
session_breakприсутствует — вывести:🔚 SESSION BOUNDARY — [slug] закрыта. Рекомендую завершить текущую сессию. Следующий трек: [value | "см. STATUS.md"] - Остановиться, не клеймить следующую задачу
Без флага — поведение прежнее.
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
🟢 [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 (три случая):
- Смена домена / репо — переход между несвязанными треками
- Milestone-задача — последняя в группе sub-tasks фичи
- Тяжёлые инфра-задачи — 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: done
Where I stopped: Shipped — skills/delegate-task/SKILL.md 0.2.1→0.2.2 (PATCH). Authoring side of the session_break marker (consumer = using-tasks v1.2.0). (1) Pre-flight gate 5→6 questions: new Q (item 5., after 4. notify) — "Session-break после этой задачи? (domain-switch / milestone / heavy infra)"; if yes → set session_break in body, if no → omit (default unchanged). (2) Template trailer gains optional [**session_break:** true | "<hint>"] with inline comment (next to weight/notify/allow_upgrade; session_break = same lowercase frontmatter key using-tasks reads). (3) Usage-guidance block after the template lists the three set-it cases + ties to using-tasks Task-completion step 6 / SESSION BOUNDARY line. (4) What-NOT-to-do bullet warns against setting it routinely. Wiki: concepts/delegate-task-session-break.md (links using-tasks-session-break) + index + log. All 4 acceptance criteria met by inspection (markdown policy artifact — no test surface). NB on numbering: SKILL numbers pre-flight 0-indexed (0–4), so the task's "Q6" lands as item 5. after the "Q5 notify" (= item 4.).
Weight: needs-claude
Next action: (none — kept until merged; paired review task session-break-delegate-task-review unblocked)
Branch: n/a
🟢 [session-break-using-tasks-review] — Review реализации session_break в using-tasks skill.
Проверить:
- Правило стоит ПОСЛЕ close, ДО claim-next (не наоборот)
- Формат SESSION BOUNDARY сообщения соответствует дизайну (включает slug и hint)
- Отсутствие флага не меняет поведение (регрессия)
- Версия поднята до v1.2.0
Weight: needs-claude
Status: done
Where I stopped: не вызывая mcp__projects-meta__tasks_close — этот тул мутирует Gitea-remote (push-like), что конфликтует с инструкцией раннера "do NOT push — the runner delivers it". Это совпадает с видимым паттерном закрытия прошлых review-тасок в этом же файле (<!-- closed-by … --> в локальном STATUS.md). Альтернатива, которую отверг: tasks_close confirm:true — отдал реконсиляцию meta-системы раннеру.
Next action: (none — kept until merged)
Branch: n/a
🟢 [session-break-delegate-task-review] — Review реализации session_break в delegate-task skill.
Проверить:
- Q6 добавлен на правильном месте (после Q5 notify)
- Template: поле
session_breakс понятным inline-комментарием - Usage guidance: три случая явно перечислены
- Версия поднята до v0.2.2
Weight: needs-claude
Status: done
Where I stopped: licts with the runner's "do NOT push — the runner delivers it". I closed by updating the local .tasks/STATUS.md block to 🟢 instead. This mirrors the exact close pattern of the sibling session-break-using-tasks-review already in this board. Alternative passed over: tasks_close(confirm:true) — left meta reconciliation to the runner. (Low-stakes, reversible — the runner reconciles either way.)
Next action: (none — kept until merged)
Branch: n/a
🟢 [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
🟢 [skill-using-system-snapshot-review] — Review скила using-system-snapshot.
Проверить:
- Trigger-фразы покрывают реальные сценарии — 4/4 positives → using-system-snapshot; negatives correctly routed (VDS-logs→using-vds-ops, mutate/full-board→using-projects-meta, docker-compose edit→none)
- Запрет на утверждение состояния без вызова snapshot — явно прописан (4 места: Overview core rule, When to use, What NOT to do, Common mistakes)
- Формат вывода достаточно краткий (одна строка на секцию) — three-line block, verified achievable against live payload
Weight: needs-claude
Status: done
Where I stopped: VERDICT PASS on all 3 acceptance criteria (non-implementer review). Tool contract verified by a live meta_system_snapshot call — output matches the documented poller {running,projects} / docker [{name,status}] (local, incl. agents-task-runner-*, Up … (healthy) strings) / tasks {owner/repo:{active,blocked}} shape exactly. Behavioral trigger smoke = 9 fresh-context subagents over a simulated skill registry (real descriptions + using-vds-ops/using-projects-meta/using-tasks competitors, no expected-answer hint): 8 clean (4/4 positives→snapshot; VDS-logs→vds-ops; mutate/full-board→projects-meta; docker-compose.yml edit→none, no FP on "docker"). 3 informational findings, none blocking: (1) cross-project task-COUNT phrasings («сколько активных задач по всем проектам») overlap with using-projects-meta — by-design (skill defers precise per-task work; tasks-line is a bonus of the combined view), no fix; (2) LOCAL-container deep diagnosis is unowned — vds-ops incident triggers grab a local container its VDS-only tools can't reach (vds-ops scoping concern, not this skill's defect); (3) deployment scaffold missing — skill committed (v0.1.0) but NOT installed to ~/.claude/skills/ (absent from this session's available-skills), NOT in hermes/mapping.yaml, and has no -install/-hermes-mapping/-test-trigger baseline tasks (unlike meta-host-routing/delegate-task). Recommended follow-ups before it reaches live sessions; hermes mode could be auto (read-only skill) — owner's call. Review outcome appended to .wiki/concepts/using-system-snapshot-design.md + log line. TDD N/A (review of markdown policy artifact). No SKILL.md edits → no version bump.
Next action: (none — kept until merged). Recommended follow-ups: file using-system-snapshot-{install,hermes-mapping,test-trigger} baseline tasks if the owner wants the skill live.
Branch: n/a
🟢 [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: done
Where I stopped: Shipped using-tasks 1.2.0→1.3.0 (MINOR). Added the done-task archival rule — the real root-cause fix for the "huge STATUS.md" complaint: when ≥10 🟢 done blocks pile up (checked at Session start step 7 + Task completion step 7), move them verbatim to .tasks/archive/YYYY-MM.md (append, monthly file, one-time header, committed on its own), leaving only 🔴/🟡/⚪/🔵 on the board. Structure diagram, Done-emoji line, and a Rules bullet updated to match. Deliberately did NOT follow the literal instruction to replace Read STATUS.md with tasks_get_status for orientation — that rests on a factual error: tasks_get_status(target_project, slug)→{status, found} returns ONE task's live status by a slug you already know and cannot enumerate the board; tasks_aggregate is cross-project + cache-based + doesn't index ready/done (its own docs say read STATUS.md directly for the current project). So no projects-meta tool can replace the orientation board-read. Instead: orientation stays a local read (kept cheap by archival), and the skill now explicitly warns against both tools for board enumeration + points tasks_get_status at its genuine single-task use. Concept page .wiki/concepts/using-tasks-status-archival.md + index + log document the deviation. Acceptance: archival-rule ✅, archive-format ✅, version bump ✅; "ориентация через tasks_get_status" ✗ (impossible as written — documented), "STATUS.md только по явной необходимости" → orientation still reads it but it's now lean. Did NOT touch hermes/mapping.yaml or run install (policy edit → separate baseline tasks; reload-plugins suffices). Did NOT push (runner delivers). TDD N/A (markdown policy). Paired review: using-tasks-status-read-perf-review.
Next action: (none — kept until merged). Review task should audit the tasks_get_status deviation against the concept page.
Branch: n/a
🟢 [using-tasks-status-read-perf-review] — Review фикса STATUS.md bloat в using-tasks.
- Ориентация действительно идёт через
tasks_get_status, не Read — deviation validated (см. ниже) - Нет регрессий — полный обзор доски всё ещё работает когда нужен
- Правило архивации done-задач понятно сформулировано
Weight: needs-claude Status: done Where I stopped: ded a review-confirmation. Alternative passed over: a standalone review page (rejected as redundant).
- No SKILL.md version bump — I edited only the board and wiki, not the versioned artifact (no defects found in the skill itself).
No consult was needed; nothing irreversible or cross-cutting. Files changed: .tasks/STATUS.md, .wiki/concepts/using-tasks-status-archival.md, .wiki/log.md.
Next action: (none — kept until merged)
Branch: n/a
🟢 [using-tasks-session-lock] — Добавить в скил using-tasks проверку repo-level .tasks/.lock при session start и session end.
Session start: читать .lock в cwd-репо. Если type:"agent" и TTL свежий (heartbeat не старше 10 мин) → жёсткое предупреждение "⚠️ поллер ведёт <slug> — нельзя работать параллельно", требовать явного подтверждения user'а для override.
После подтверждения (или если лок отсутствует/stale): писать .tasks/.lock {type:"interactive", started_at, ttl_minutes:120}.
Session end/pause: удалять .tasks/.lock если type:"interactive" и принадлежит текущей сессии.
TTL: agent-lock stale если heartbeat > 10 мин назад; interactive-lock stale если started_at > 2ч назад — молча перезаписывать.
Acceptance criteria: Owner: DESKTOP-NSEF0UK:claude-sonnet:26920 Claim token: bf6cb6d5-65b3-49d8-b663-fde3ff37f462 Claim expires at: 2026-06-11T10:07:05.664Z
- свежий agent-lock → предупреждение + требование подтверждения перед любой работой
- interactive-lock пишется при session start, удаляется при session end/pause
- stale lock (TTL истёк) → перезаписывается без предупреждения
.tasks/.lockв.gitignore
Обязательные скилы — вызвать до начала работы
- invoke
using-tasks— для управления статусом задачи - invoke
project-discipline— дисциплина коммитов/пушей - invoke
using-wikiпосле закрытия — заингесть.wiki/concepts/using-tasks-session-lock.md
TDD: нет — markdown policy artifact; behavioral smoke = парная review-таска Разрешения: интерны: да | автопуш: нет weight: needs-claude notify: OpeItcLoc03/workshop
Status: done Where I stopped: Shipped using-tasks 1.3.0→1.4.0 (MINOR). (1) Session start new step 1: lock guard — reads .tasks/.lock; active agent-lock (type:"agent", heartbeat ≤10 min) → hard warning + require user confirmation; stale lock (TTL expired) → silently overwrite; absent/cleared → write type:"interactive" lock. (2) Session end new step 1: release lock — delete .tasks/.lock if type:"interactive". (3) Structure section: .lock entry + gitignore callout. (4) Rules: "Honour .tasks/.lock" bullet. (5) .gitignore: .tasks/.lock entry added. (6) dist rebuilt. Next action: (none — kept until merged) Branch: n/a Notify: OpeItcLoc03/workshop
🟢 [delegate-task-review-weight-inherit] — Исправить delegate-task скил: при создании парной review-таски (Step 5) наследовать weight от impl-таски.
Проблема: review-таски создаются через tasks_create(status=blocked, blocker=<impl-slug>) без weight параметра. Reconciler обрабатывает авто-анблок только задач с **Weight:** needs-claude или **Weight:** cheap-ok в теле. Без поля — задача навечно остаётся 🔵, поллер её не видит. Воспроизводилось трижды за одну сессию (session-break-using-tasks-review, session-break-delegate-task-review, skill-using-system-snapshot-review, using-tasks-status-read-perf-review).
Фикс: в Step 5 шаблона явно указывать weight при tasks_create review-таски. Правило: review-таска наследует weight impl-таски, но не выше needs-claude (review не бывает cheap-ok — риск игнора invoke-инструкций слабыми моделями).
Acceptance criteria:
- Step 5 в SKILL.md явно говорит: создавать review-таску с
weight= weight impl-таски (но minneeds-claude) tasks_createвызов в Step 5 включаетweightпараметр в примере/описании- What-NOT-to-do: не создавать review-таску без weight
Обязательные скилы — вызвать до начала работы
- invoke
using-tasks— для управления статусом задачи - invoke
project-discipline— дисциплина коммитов/пушей - invoke
using-wikiпосле закрытия — заингесть.wiki/concepts/delegate-task-review-weight.md
TDD: нет — markdown policy artifact; behavioral smoke = парная review-таска Разрешения: интерны: да | автопуш: нет weight: needs-claude notify: OpeItcLoc03/workshop
Status: ready
Where I stopped: (not started)
Next action: Открыть skills/delegate-task/SKILL.md, найти Step 5, добавить явное наследование weight при tasks_create review-таски. Bump PATCH.
Branch: n/a
Notify: OpeItcLoc03/workshop
🟢 [using-markitdown-cli-rewrite] — Переписать skills/using-markitdown/SKILL.md: заменить все инструкции по вызову mcp__markitdown__* тулов на вызов CLI markitdown <path|url> (v0.1.6, доступен в системном PATH). Убрать секцию про MCP setup/docker. После обновления SKILL.md — остановить и удалить локальный docker контейнер markitdown-mcp (docker stop markitdown-mcp && docker rm markitdown-mcp). Bump PATCH version в frontmatter скила.
Acceptance criteria:
- SKILL.md не содержит
mcp__markitdown__— только CLI-вызовы docker psне показывает markitdown-mcp- version bumped (PATCH)
Обязательные скилы — вызвать до начала работы
- invoke
using-tasks— для управления статусом задачи - invoke
project-discipline— дисциплина коммитов/пушей - invoke
using-interns— для file-read/grep операций - invoke
using-wikiпосле закрытия — заингесть.wiki/concepts/using-markitdown-design.mdесли существует
TDD: нет — markdown policy artifact; behavioral smoke: markitdown --help выводит usage
Разрешения: интерны: да | автопуш: да
weight: needs-claude
notify: OpeItcLoc03/workshop
Status: ready
Where I stopped: (not started)
Next action: Открыть skills/using-markitdown/SKILL.md, заменить все mcp__markitdown__ вызовы на CLI-эквиваленты, bump PATCH, затем docker stop markitdown-mcp && docker rm markitdown-mcp.
Branch: n/a
Notify: OpeItcLoc03/workshop
🟢 [using-markitdown-cli-rewrite-review] — Review результата using-markitdown-cli-rewrite: проверить что SKILL.md не содержит mcp__markitdown__ вызовов, CLI-примеры корректны, docker контейнер удалён, version bumped.
Weight: needs-claude notify: OpeItcLoc03/workshop
Status: done
Verdict: PASS (deliverable correct; 1 informational finding на docker-respawn — out-of-scope MCP registration).
Where I stopped: it." My local commit already sets the block to 🟢 done with the verdict. Alternative passed over: calling tasks_close --confirm, which I rejected to avoid racing the runner's delivery.
- No semver bump on this commit — only
.tasks/STATUS.mdchanged (no versioned artifact), someta(tasks):scope is correct per project discipline.
Commit SHA: 0d3dbfe3eeaf7b17641d719fc7a4bcdece5e3473
Next action: (none — kept until merged)
Branch: n/a
Notify: OpeItcLoc03/workshop
🟢 [using-markitdown-mcp-deregister] — Полный decommission markitdown MCP: удалить mcpServers.markitdown из ~/.claude.json, иначе каждая новая сессия, грузящая MCP, респаунит anonymous-контейнер из markitdown-mcp:latest (и docker ps снова показывает markitdown — критерий #2 импл-таски не durably выполним).
Источник: finding из using-markitdown-cli-rewrite-review (2026-06-09). Импл-таска using-markitdown-cli-rewrite удалила существовавшие контейнеры корректно, но оставила MCP-регистрацию (out of scope, явно флагнуто в .wiki/concepts/using-markitdown-cli-migration.md §Out of scope). На ревью контейнер boring_spence уже респаунился.
Weight: needs-human — правка user-global ~/.claude.json + keep-or-drop решение: после rewrite скил советует CLI, но MCP-тул mcp__markitdown__convert_to_markdown ещё зарегистрирован. Подтвердить с владельцем что MCP больше не нужен, затем удалить запись + docker rm -f $(docker ps -aq --filter "ancestor=markitdown-mcp:latest") + (опц.) docker rmi markitdown-mcp:latest.
Status: done
Where I stopped: Confirmed by owner: MCP not needed. Removed mcpServers.markitdown from ~/.claude.json, docker rm containers, docker rmi markitdown-mcp:latest (1.52GB freed).
Next action: (none — kept until merged)
Branch: n/a
🟢 [create-task-format-for-poller-skill] — Создать скил task-format в claude-skills/skills/ по TDD-процессу (superpowers:writing-skills).
Weight: needs-claude
Зачем: правила оформления задач для автономного поллера (**Weight:**, **Notify:**) должны жить в скиле, который едет с factory к внешним пользователям. Вики — внутренняя, скилы — публичные.
Что знаем (из исходника projects-meta-mcp/src/lib/status-md.ts):
**Weight:** needs-claude | needs-human | cheap-ok— capability-фильтр поллера**Notify:** <owner>/<repo>— inbox-уведомление при завершении- Без
Weight— поллер не берёт;needs-human— только ручное
TDD-фазы:
- RED: baseline-субагент без скила — фиксируем пропущены ли поля
- GREEN: минимальный SKILL.md закрывающий gaps
- REFACTOR: до bulletproof
Источники: projects-meta-mcp/src/lib/status-md.ts + OpeItcLoc03/common/.wiki/concepts/agents-task-runner-ops.md
Weight: needs-claude
Зачем: правила оформления задач для автономного поллера (**Weight:**, **Notify:**) должны жить в скиле, который едет с factory к внешним пользователям. Вики — внутренняя, скилы — публичные.
Что знаем (из исходника projects-meta-mcp/src/lib/status-md.ts):
**Weight:** needs-claude | needs-human | cheap-ok— capability-фильтр поллера**Notify:** <owner>/<repo>— inbox-уведомление при завершении- Без
Weight— поллер не берёт;needs-human— только ручное
TDD-фазы:
- RED: baseline-субагент без скила — фиксируем пропущены ли поля
- GREEN: минимальный SKILL.md закрывающий gaps
- REFACTOR: до bulletproof
Источники: agenda/concepts/task-format-agent-poller + OpeItcLoc03/common/.wiki/concepts/agents-task-runner-ops.md
Status: done
Where I stopped: Skill shipped — skills/task-format/SKILL.md v0.1.0 + .wiki/concepts/task-format-design.md. TDD per writing-skills: RED (3 baseline subagents — 2/3 used ###/bullet headers the parser can't recognize, 2/3 omitted Weight, 2/3 notify-in-prose, 1/3 🟢-for-ready) → GREEN (2 fresh subagents, both parser-valid incl. correct needs-human for critical-infra) → REFACTOR clean. Ground truth verified vs status-md.ts + claim.ts + fleet-router.js (the agenda/concepts/task-format-agent-poller source named in next-action doesn't exist on disk; used the live parser/router source instead — strictly more authoritative).
Next action: (none — kept until merged)
Branch: master
Notify: OpeItcLoc03/workshop
🟢 [task-loop-skill] — Цель: агент в открытой сессии может взять задачи из task board и выполнять их одну за другой прямо в этой сессии — без отдельного daemon-процесса, без спауна новых claude-процессов.
Что делает скил (поведение):
- Вызвать
tasks_claim_next(с учётом POLLER_PROJECTS из env или аргумента) - Если задача найдена — прочитать description, выполнить работу в текущей сессии (все инструменты доступны), закрыть через
tasks_close - Если задач нет — выйти из цикла, доложить пользователю («очередь пуста»). Не вызывать ScheduleWakeup напустую — это сжигало бы токены каждые N секунд ради пустой проверки.
- Повторить с п.1
- Остановиться при явном сигнале пользователя (сообщение в чат) или при
budget.remaining() < threshold
Только скил, программных изменений нет. Все нужные инструменты (tasks_claim_next, tasks_close) уже существуют.
Примечание о токенах:
- «Нет задач → нет токенов» достигается просто: при пустой очереди цикл останавливается, а не polling-ит.
ScheduleWakeupдопустим только по явному запросу пользователя («работай пока не скажу стоп») с большим интервалом (≥1200s).- Inbox-driven wakeup (stop-hook читает
.claude-inbox/) пока не реализован для новых задач: в inbox поступают только completion-уведомления (closed/delivery-failed/blocked от поллера). Реализация — отдельная programming задача.
TDD — обязательно:
- Сначала написать baseline сценарий (subagent без скила): агент получает задачу, что он делает? Зафиксировать нарушения.
- Написать SKILL.md закрывающий эти нарушения
- Прогнать compliance-сценарий с скилом: агент следует loop корректно
- Проверить edge cases: нет задач, задача провалилась, пользователь прервал
Acceptance criteria:
- Агент с скилом корректно claim → work → close → repeat
- При отсутствии задач — останавливает цикл (не polling, не ScheduleWakeup), сообщает пользователю
- При ошибке в задаче — паркует (tasks_update status=paused), не виснет
- Heartbeat: либо документировано как использовать с длинным TTL, либо со ссылкой на
heartbeat-side-channel - Скил задокументирован по стандарту superpowers (frontmatter name/description, CSO-оптимизация)
- TDD-цикл завершён: есть baseline + compliance тест, оба описаны в PR/commit
Обязательные скилы перед работой:
superpowers:writing-skills— методология написания скилов (TDD-цикл обязателен)superpowers:test-driven-development— RED-GREEN-REFACTOR для документацииusing-tasks— управление статусом этой задачиproject-discipline— дисциплина коммитов/semver в claude-skills
Weight: needs-claude Notify: OpeItcLoc03/workshop
Цель: агент в открытой сессии может взять задачи из task board и выполнять их одну за другой прямо в этой сессии — без отдельного daemon-процесса, без спауна новых claude-процессов.
Что делает скил (поведение):
- Вызвать
tasks_claim_next(с учётом POLLER_PROJECTS из env или аргумента) - Если задача найдена — прочитать description, выполнить работу в текущей сессии (все инструменты доступны), закрыть через
tasks_close - Если задач нет —
ScheduleWakeup(60s), ждать - Повторить с п.1
- Остановиться при явном сигнале пользователя (сообщение в чат) или при
budget.remaining() < threshold
Только скил, программных изменений нет. Все нужные инструменты (tasks_claim_next, tasks_close, ScheduleWakeup) уже существуют.
TDD — обязательно:
- Сначала написать baseline сценарий (subagent без скила): агент получает задачу, что он делает? Зафиксировать нарушения.
- Написать SKILL.md закрывающий эти нарушения
- Прогнать compliance-сценарий с скилом: агент следует loop корректно
- Проверить edge cases: нет задач, задача провалилась, пользователь прервал
Acceptance criteria:
- Агент с скилом корректно claim → work → close → repeat
- При отсутствии задач — ждёт через ScheduleWakeup, не крашится
- При ошибке в задаче — паркует (tasks_update status=paused), не виснет
- Heartbeat: либо документировано как использовать с длинным TTL, либо со ссылкой на
heartbeat-side-channel - Скил задокументирован по стандарту superpowers (frontmatter name/description, CSO-оптимизация)
- TDD-цикл завершён: есть baseline + compliance тест, оба описаны в PR/commit
Обязательные скилы перед работой:
superpowers:writing-skills— методология написания скилов (TDD-цикл обязателен)superpowers:test-driven-development— RED-GREEN-REFACTOR для документацииusing-tasks— управление статусом этой задачиproject-discipline— дисциплина коммитов/semver в claude-skills
Weight: needs-claude Notify: OpeItcLoc03/workshop
Status: done Where I stopped: VERDICT DONE — skill task-loop v0.1.0 shipped 0016c45; TDD RED→GREEN→REFACTOR complete; acceptance 1-6 met via subagent runs; deployment baselines (install/hermes-mapping/test-trigger) filed as follow-ups Next action: (none — kept until merged) Branch: master Notify: OpeItcLoc03/workshop
Closure (2026-06-11, DESKTOP claude-opus)
Shipped skills/task-loop/SKILL.md v0.1.0 in commit 0016c45 (pushed). Full TDD cycle per writing-skills:
- RED — 2 clean-context subagents (dry-run) revealed gaps: claim scope diverged (federation vs current), both missed the
using-taskssession_break gate +.tasks/.lock, consult-gate boundary unclear, paused-vs-blocked ambiguous. - GREEN — SKILL.md closes all five; compliance subagent B clean (scope=current, human-only→stop-before-close, session_break halts drain, external blocker→blocked+rollback not close, empty→stop).
- REFACTOR — compliance A chose
CronCreatefor long-watch → loophole; reworded long-watch to mandateScheduleWakeup(this session) and forbidCronCreate(separate session = daemon) always. Re-test passed.
Acceptance 1-6 all met by test evidence (not by inspection). Per-task detail in .tasks/task-loop-skill.md.
Follow-ups filed: task-loop-install, task-loop-hermes-mapping (mode pending — touches claim/close/heartbeat infra), task-loop-test-trigger (live clean-session activation). Caveat: skill not yet in ~/.claude/skills/ nor hermes/mapping.yaml; subagent runs are a clean-session proxy, not live-harness activation.
🟢 [task-loop-install] — [skill task-loop, baseline 1/3] Установить скил task-loop (shipped 0016c45). Запустить install.ps1 (Windows) / install.sh в ~/projects/claude-skills/, проверить что скил появляется в available-skills новой сессии (триггер-фразы из description), /reload-plugins.
Обязательные скилы — вызвать до начала работы
- invoke
using-tasks— управление статусом этой задачи - invoke
active-platform— install-команды под текущую ОС (Windows/PowerShell по умолчанию)
TDD: N/A (install-операция, не код). weight: needs-claude notify: OpeItcLoc03/workshop
Status: done
Where I stopped: Установлен 2026-06-11 через install.ps1 -Names task-loop (Windows/PS 5.1) → ~/.claude/skills/task-loop/SKILL.md. Verified: (a) diff установленного против skills/task-loop/SKILL.md пустой — байт-идентичны, v0.1.0; (b) после /reload-plugins task-loop появился в available-skills этой сессии с ПОЛНЫМ описанием (YAML распарсился, RU/EN-триггеры «поработай очередь»/«work the queue»/«drain the board» на месте — не fallback к H1). Прецедент-консистентно с delegate-task-install / private-dev-public-publish-install (закрытие на «visible in available-skills post-load»; живой clean-session behavioral тест — отдельная задача -test-trigger). NB: reload отрапортовал «1 error during load — run /doctor» — НЕ про task-loop (тот загрузился чисто, с полным description); требует отдельной диагностики /doctor.
Next action: (none — verified, kept until merged). Closing-notify в OpeItcLoc03/workshop + projects-meta tasks_close — отдельным шагом (cross-project mutation, требует подтверждения).
Branch: n/a
Notify: OpeItcLoc03/workshop
🟢 [task-loop-hermes-mapping] — [skill task-loop, baseline 2/3] Добавить запись task-loop в ~/projects/claude-skills/hermes/mapping.yaml. Режим: pending (НЕ auto) — скил оркеструет claim/close/heartbeat (tasks_claim_next/tasks_close/tasks_update/tasks_heartbeat) и может армить ScheduleWakeup; это critical-infra-adjacent поведение, требует отдельного hermes-аудита tool-side эффектов перед auto-promotion (delegate-task Step 0).
Обязательные скилы — вызвать до начала работы
- invoke
using-tasks— управление статусом этой задачи - invoke
project-discipline— дисциплина коммитов
TDD: N/A (config-запись в mapping.yaml). weight: needs-human notify: OpeItcLoc03/workshop
Status: done
Where I stopped: Запись добавлена 2026-06-11 в hermes/mapping.yaml, секция «pending (behavioral audit required)» (счётчик 6→7). mode: pending + intended: {mode: auto, category: mcp} + reason про оркестрацию claim/close/update/heartbeat (tasks_claim_next/tasks_close/tasks_update/tasks_heartbeat) + одиночный длинный ScheduleWakeup + critical-infra-adjacent. Category=mcp зеркалит delegate-task (tasks_*-touching → mcp). Стиль зеркалит delegate-task/session-handoff pending-записи. Schema-версию mapping (version: 1) НЕ бампал — это schema, не контент (прецедент delegate-task-hermes-mapping). Верификация: YAML парсится, task-loop теперь mapped. NB: build целиком ещё red — остаются 3 ДРУГИХ unmapped-скила (using-system-snapshot, meta-host-routing, task-format), каждый со своей отдельной -hermes-mapping таской; не в scope этой.
Next action: (none — kept until merged). Перевод pending→auto только после task-loop-test-trigger + аудита tool-side эффектов (claim/close/heartbeat).
Branch: n/a
Notify: OpeItcLoc03/workshop
🟢 [task-loop-test-trigger] — [skill task-loop, baseline 3/3] Живая активация + trigger-discrimination для task-loop в чистой сессии (subagent-прогоны при разработке — прокси, не харнес).
Должен активироваться (positive): «поработай очередь», «прогони доску», «бери задачи по очереди», «работай пока не скажу стоп», «work the queue», «drain the board». НЕ должен (false-positive check): «делегируй таску в проект X» (→ delegate-task), «обнови статус задачи Y» / «возобнови задачу Y» (→ using-tasks), «настрой поллер / agent-runner» (→ infra, не loop).
Поведенческая проверка (если активация ок): на сценарии «прогони доску» с задачей human-only consult_policy + задачей с session_break маркером — агент стопит перед close на human-only и СТОПит дрейф после close задачи с маркером; пустая очередь → STOP без polling; «работай пока не скажу стоп» → ScheduleWakeup (≥1200s), НЕ CronCreate.
Обязательные скилы — вызвать до начала работы
- invoke
using-tasks— управление статусом этой задачи
TDD-mode: write expectations first (сценарии сформулированы выше ДО прогона), then verify. weight: needs-claude notify: OpeItcLoc03/workshop
Status: done Where I stopped: VERDICT PASS, прогнано 2026-06-11 в чистой сессии (НЕ ставила скил). Probe подтвердил: субагенты наследуют РЕАЛЬНЫЙ установленный registry (task-loop present, description дословно = SKILL.md) — апгрейд над dev-time симуляцией. Trigger-discrimination: positives 6/6→task-loop (поработай очередь / прогони доску / бери задачи по очереди / работай пока не скажу стоп / work the queue / drain the board); negatives — delegate-task✅, using-tasks✅ (после деконфаунда session-start рамки), «настрой поллер»→none с явной цитатой task-loop exclusion✅; task-loop false-positive 0/3. Behavioral (тело скила загружено): 4/4 — consult-gate human-only→STOP перед close✅; session_break→print SESSION BOUNDARY + STOP, не клеймить✅; empty→stop+report без re-poll✅; long-watch→единственный ScheduleWakeup≥1200s, НЕ CronCreate, не short-poll✅. Метод: clean-context субагенты с живым registry; каждая фраза — отдельный непрайменный субагент, без подсказки кандидатов/ответа. Finding (informational, non-blocking): session_break — самый хрупкий гейт: его STOP-семантика только в теле (step 6, не в description), при рассуждении по одному описанию инвертируется в «мягкий чекпоинт»; при загруженном теле верно. Фикс не нужен (правило трижды продублировано + using-tasks=REQUIRED SUB-SKILL). Follow-up не заведён. Blocker: (cleared — install done) Branch: n/a Notify: OpeItcLoc03/workshop
🟢 [session-inbox-monitor-install] — Baseline-таска промоушена session-inbox-monitor. Установить скил: запустить install.sh в ~/projects/claude-skills/ (или PS-эквивалент), проверить что скил появляется в available-skills новой сессии, сделать /reload-plugins. Скелет скила уже закоммичен (18ce571), тело каркаса пустое — это install самого скелета, не функциональности.
Status: done
Where I stopped: Установлено 2026-06-17 через install.ps1 -Names session-inbox-monitor → ~/.claude/skills/session-inbox-monitor/ (SKILL.md + hooks/inbox-monitor.ps1). Verify: src↔installed diff = 0 (byte-identical), version 0.2.1. Активация подтверждена в этой же сессии — харнесс подхватил скил сразу после install, session-inbox-monitor появился в available-skills с полным description (без явного /reload-plugins). Behavioral trigger-run в чистой сессии = scope -test-trigger.
Next action: (none — kept until merged).
Branch: n/a
Notify: OpeItcLoc03/workshop
🟢 [session-inbox-monitor-hermes-mapping] — Baseline-таска промоушена session-inbox-monitor. Добавить запись в ~/projects/claude-skills/hermes/mapping.yaml. Режим pending (не auto): скил трогает settings.json (регистрация SessionStart-хука) и OS-процессы (kill осиротевших мониторов) — требует отдельного аудита перед авто-маппингом. NB: основной путь активации скила — trigger-line inbox monitor: raise on start в CLAUDE.md + SessionStart-инжектор, а не hermes-trigger; hermes нужен только для ручных фраз вызова.
Status: done
Where I stopped: Добавлено 2026-06-17 в hermes/mapping.yaml секцию pending (8 — behavioral audit required): mode: pending + intended: {mode: auto, category: productivity} (по аналогии с близнецом session-handoff) + reason про settings.json-мутацию + OS-process-kill + Windows-PS-хук (нужен Linux-порт для Hermes) + primary-активацию через CLAUDE.md trigger-line. Schema version: 1 НЕ бампал (schema, не контент). YAML валиден (python yaml.safe_load OK; 32 скила всего). Счётчик секции 7→8.
Next action: (none — kept until merged). pending→auto только после -test-trigger + аудита tool-side эффектов (settings.json write, process kill, Monitor raise).
Branch: n/a
Notify: OpeItcLoc03/workshop
🟢 [session-inbox-monitor-test-trigger] — Baseline-таска промоушена session-inbox-monitor. Прогнать триггер-фразы из description на тестовом буфере: скил активируется на своих фразах (CLAUDE.md line inbox monitor: raise on start, «подними монитор почты», «raise inbox monitor», «auto-arm inbox watcher») И НЕ активируется на 2-3 близких чужих — фразах про обработку полученного письма (→ inter-session-peer-discipline) и про мультимашинный backend (→ cross-machine-inbox). False-positive check.
Status: done
Where I stopped: VERDICT PASS, прогнано 2026-06-17 в ЧИСТОЙ сессии (этот контекст не трогал скил/хук — только поднял Monitor по SessionStart-инжекту и прочитал handoff). Метод: 7 непрайменных clean-context субагентов (general-purpose, НЕ fork), каждая фраза — отдельный субагент, без подсказки кандидатов/ответа; positives независимо назвавшие скил попутно доказывают, что session-inbox-monitor в РЕАЛЬНОМ установленном registry. Positives 4/4 → session-inbox-monitor: P1 «подними монитор почты», P2 «raise inbox monitor», P3 «auto-arm inbox watcher», P4 CLAUDE.md-строка inbox monitor: raise on start (как session-start trigger-line). Negatives 2/3 чисто: N2 мультимашинный backend → none (явно процитировал carve-out «NOT for ... multi-machine inbox backend»); N3 received-message EN → none (carve-out + CLAUDE.md inter-session rule). N1 received-message RU → session-inbox-monitor = false-positive (1/3). Анализ FP: borderline/недетерминированный (sibling N3 в том же домене ушёл в none); самокорректируется при загрузке тела (description+body явно «не моя работа, → handle per CLAUDE.md»); корневой вклад — редирект-таргет inter-session-peer-discipline НЕ установлен в registry, потому carve-out некуда увести запрос и «ближайший реальный inbox-скил» становится аттрактором. Изоморфно находке session_break в task-loop-test-trigger (body-load-dependent, informational, фикс не обязателен). Acceptance («активируется на своих И не на близких чужих; findings → follow-up») выполнен с одним informational-finding. Side effect: добавлена строка inbox monitor: raise on start в claude-skills CLAUDE.md (одобрено user) — explicit discoverable opt-in + материализует P4-триггер в проекте.
Next action: (none — kept until merged). Follow-up на FP: session-inbox-monitor-received-msg-fp. Разблокирован -review (все 5 baseline/content + test-trigger 🟢).
Branch: n/a
Notify: OpeItcLoc03/workshop
🟢 [session-inbox-monitor-sessionstart-hook] — Content-таска (ядро скила). Написать SessionStart-хук-инжектор (machine-local в ~/.claude/hooks/ + регистрация в ~/.claude/settings.json). Две функции: (a) уборка — Get-CimInstance | Stop-Process прибить осиротевшие inbox-мониторы ЭТОГО проекта по сигнатуре командной строки (/clear оставляет их жить → re-raise без уборки плодит дубли); (b) инжект hookSpecificOutput.additionalContext с инструкцией «подними persistent Monitor (Monitor tool, не background Bash) на /.claude-inbox/». Headless-детект → skip (Monitor там не работает; полагаться на Stop-хук pickup + Notify). Дизайн: см. .workshop archive trace + concepts/session-inbox-monitor. Брат-близнец poller-interactive-lock-writer (хук+CLI паттерн). После написания — дописать тело каркаса SKILL.md (When to use / Steps / Failure modes / Side effects / What NOT to do).
Status: done
Where I stopped: Шипнуто 2026-06-17. (1) Хук skills/session-inbox-monitor/hooks/inbox-monitor.ps1 — sweep (Get-CimInstance|Stop-Process по сентинелу CLAUDE_INBOX_MONITOR+inbox-путь) + inject (hookSpecificOutput.additionalContext с точной Monitor-командой) + opt-in гейт (.claude-inbox/ или CLAUDE.md-строка). ASCII-only (пофикшен em-dash→mojibake баг под WinPS 5.1 без BOM). (2) Деплой в ~/.claude/hooks/ (hash-parity с репо) + регистрация в ~/.claude/settings.json SessionStart (4-й элемент, без matcher; бэкап .bak-inbox-monitor). (3) Тело SKILL.md дописано, v0.1.0→0.2.0 MINOR. Live-верификация: inject→валидный JSON; sweep→убил подсадного сироту (pid 32920 PASS); реальный Monitor tool спавнит bash-процесс несущий сентинел (sweep его найдёт); settings.json валиден. Headless-факт (claude-code-guide): хук-уровня сигнала НЕТ — skip отдан агенту best-effort, дефолт «поднять» (ложный skip в интерактиве теряет фичу; ложный raise в headless безвреден). Острый угол sweep (любой live-процесс с сентинелом+путём гибнет; на реальном SessionStart активности агента нет → безопасно) + multi-session-лимит задокументированы в SKILL Failure modes.
Next action: (none — kept until merged). Follow-up'ы по ленте: -install (добавить opt-in строку в CLAUDE.md + проверка активации), -hermes-mapping, -test-trigger (чистая сессия), -stophook-blockfix-proof, -review (зонтик). Возможный follow-up: per-session изоляция монитора (сейчас инвариант «один на инбокс/машину»).
Branch: n/a
Notify: OpeItcLoc03/workshop
🟢 [session-inbox-monitor-stophook-blockfix-proof] — Content-таска. Runtime-пруф уже ПРИМЕНЁННОГО Stop-хук block-фикса. Фикс (2026-06-17): в ~/.claude/hooks/stop-dispatcher.ps1 inbox-путь теперь отдаёт decision: block с телом письма + инструкцией «обработай и ответь отправителю» (раньше был пассивный additionalContext без block → агент молча останавливался, письмо терялось в .read). Нужен живой пруф: прислать реальное письмо в .claude-inbox/, убедиться что агент ПРИНУДИТЕЛЬНО обрабатывает содержание (не игнорит). Проверить отсутствие зацикливания (письмо уже в .read → следующий Stop видит пустой инбокс → block не ставится).
Status: done
Where I stopped: PASS 2026-06-17. Положил self-test письмо в claude-skills/.claude-inbox/, завершил ход → Stop-хук принудительно ре-инвокнул меня с телом письма как block-reason (без user-Enter). No-loop подтверждён: после вручения инбокс пуст (0 *.md, письмо в .read/) → следующий Stop не блокирует. Bonus: живой Monitor (этой сессии) тоже эмитнул событие на появление файла — lifecycle end-to-end. Block-механизм РАБОТАЕТ. Finding (orthogonal): тело письма с кириллицей пришло как mojibake — на диске файл чистый UTF-8, порча в harness-spawn stdout-пути Stop-хука; репро через Start-Process НЕ воспроизвёл (наследует UTF-8 от родителя) → харнесс-специфично. Заведена follow-up session-inbox-monitor-stophook-utf8-fix.
Next action: (none — kept until merged; mojibake вынесен в отдельную таску)
Branch: n/a
Notify: OpeItcLoc03/workshop
🟢 [session-inbox-monitor-stophook-utf8-fix] — Stop-хук портит UTF-8/кириллицу при принудительном вручении письма (inject через decision:block). Найдено при -stophook-blockfix-proof 2026-06-17 (независимо подтверждено workshop по байтам).
Симптом: кириллическое тело письма приходит в block-reason как mojibake; английский текст инструкции чист.
Диагноз (verified): (1) файл на диске — валидный UTF-8 (Get-Content -Encoding UTF8 читает чисто). (2) ~/.claude/hooks/stop-dispatcher.ps1 читает тело как -Encoding UTF8 (стр. 44) — read-сторона ОК. (3) НО stop-dispatcher не выставляет [Console]::OutputEncoding → ConvertTo-Json в stdout при harness-spawn (redirected pipe, WinPS 5.1) кодируется в дефолтном OEM-codepage (cp866 на RU-Windows) → mojibake на выводе. (4) Репро через Start-Process -RedirectStandardOutput НЕ воспроизводит (наследует UTF-8 от родителя) → баг харнесс-spawn-специфичен; верифицируется только in-situ (реальный Stop-хук + кириллическое письмо). (5) Писательская сторона: Set-Content/Out-File -Encoding utf8 под 5.1 сажает BOM (EF BB BF) + смешанные EOL — некcanon; Write-тул пишет чистый no-BOM UTF-8 LF.
Fix (две стороны + тест):
- Output (главное): в начало
stop-dispatcher.ps1—[Console]::OutputEncoding = [System.Text.Encoding]::UTF8(и$OutputEncodingдля надёжности). Низкий риск, идемпотентно. - Writer-гайд: любой PS-писатель inbox-файла —
[IO.File]::WriteAllText($p, $text, [Text.UTF8Encoding]::new($false))(no-BOM, LF). Канон — Write-тул. Зафиксировать в SKILL.md session-inbox-monitor (раздел про доставку) + возможно inter-session-peer-discipline. - Regression: прислать кириллическое письмо через реальный inject, убедиться что block-reason чист (RED→GREEN через настоящий путь).
NB: stop-dispatcher.ps1 — machine-local (вне git, владелец — workshop-сетап). Правка требует ОК user (shared hook, влияет на Stop во всех проектах машины). ASCII-clean в inbox-monitor.ps1 — это обход того же encoding-класса, не корень; корень здесь — read/write/output codepage.
Weight: needs-claude
Status: done
Where I stopped: Шипнуто+верифицировано 2026-06-17 (ОК user). (1) [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 (+$OutputEncoding) добавлено в начало ~/.claude/hooks/stop-dispatcher.ps1 (бэкап .bak-utf8fix; parse 0 ошибок; BOM файла сохранён → русские комменты целы). (2) Writer-гайд (no-BOM/LF, WriteAllText vs Set-Content) задокументирован в SKILL.md Failure modes, bump 0.2.0→0.2.1 PATCH. (3) In-situ regression PASS: кириллический pangram «Съешь же ещё этих мягких французских булок…» прислан через реальный inject → block-reason пришёл ЧИСТО (до фикса то же тело давало <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>); no-loop подтверждён. Root-cause = output-encoding (read был уже UTF8), как диагностировано; Start-Process-репро баг не ловил — только реальный harness-spawn путь. NB: stop-dispatcher.ps1 machine-local (вне git) — фикс на этой машине; для multi-machine надо внести в workshop-сетап, что шипает хук (нотифай ушёл).
Next action: (none — kept until merged). Multi-machine propagation фикса stop-dispatcher — на стороне workshop-сетапа.
Branch: n/a
Notify: OpeItcLoc03/workshop
🟢 [session-inbox-monitor-received-msg-fp] — Follow-up из -test-trigger (2026-06-17). False-positive: на RU-фразу «обработай полученное письмо из инбокса» (N1) субагент активировал session-inbox-monitor вместо «none / handle per CLAUDE.md inter-session rule». EN-вариант той же сцены (N3) и мультимашинный backend (N2) ушли в none чисто — FP граничный/недетерминированный.
Диагноз: carve-out «NOT for how to handle a received message (→ inter-session-peer-discipline)» стоит В КОНЦЕ description, а редирект-таргет inter-session-peer-discipline не установлен в registry → carve-out некуда увести запрос, «ближайший реальный inbox-скил» (session-inbox-monitor) становится аттрактором. Самокорректируется при загрузке тела (тело явно «не моя работа»), потому harm = один лишний skill-load, не неверное действие. Изоморфно session_break-находке task-loop.
Опции фикса (решить, не обязательно делать): (a) поднять/усилить carve-out в description — вынести «NOT for handling a received message» раньше/жирнее; (b) установить sibling inter-session-peer-discipline, чтобы у carve-out был реальный таргет (вероятно настоящий корень — но это отдельный скил, может ещё не существовать); (c) принять как informational (как session_break) — body-load self-correct + низкий harm. Перед фиксом (a) учесть: правка description = повторный -test-trigger + влияет на -review.
Weight: needs-human
Status: done
Where I stopped: Закрыто 2026-06-17 фиксом опции (b) — структурный. Корень был: carve-out → inter-session-peer-discipline маршрутил на скил, которого НЕ было в установленном registry (исходник skills/inter-session-peer-discipline/SKILL.md существовал с 2026-06-16, но не установлен). Фикс = доустановить скил (install.ps1 -Names inter-session-peer-discipline → ~/.claude/skills/, byte-identical parity verified). FP-twin verified clean: свежий clean-context субагент на той же N1-фразе («обработай полученное письмо из инбокса») теперь роутит в inter-session-peer-discipline (IN_REGISTRY: yes), не в session-inbox-monitor — аттрактор исчез, carve-out получил реального конкурента. Description session-inbox-monitor НЕ трогали (опции (a) избежали — whack-a-mole корень не бьёт). Governance: workshop (peer-сессия) предложил (b) как рулинг; per свежеустановленный inter-session-peer-discipline peer = предложение, не authority — фикс ратифицирован человеком (user, 2026-06-17), не закрыт по слову peer'а. NB: install — вне git (user-level ~/.claude/skills/); сам скил inter-session-peer-discipline имеет собственную промоушен-ленту (hermes-mapping / test-trigger / review) — отдельная забота, здесь не трогалась; возможен red hermes-build пока он не в hermes/mapping.yaml.
Next action: (none — closed by structural fix, human-ratified). Возможный follow-up: baseline-лента самого inter-session-peer-discipline (hermes-mapping в первую очередь, чтобы build не покраснел).
Branch: n/a
Notify: OpeItcLoc03/workshop
⚪ [session-inbox-monitor-review] — Skill-review checkpoint для session-inbox-monitor (промоушен 2026-06-17).
Источник дизайна: .workshop/.archive/2026-06-17-session-inbox-monitor.md + .workshop/.wiki/concepts/session-inbox-monitor.md. Импл-таски: -install, -hermes-mapping, -test-trigger, -sessionstart-hook, -stophook-blockfix-proof.
Кто делает: НЕ имплементер. Другая сессия / другой день / другой агент. Identity-not-location.
Поведенческий smoke-test (acceptance):
- Скил активируется на каждой триггер-фразе из description (русский И английский); НЕ активируется на чужих (inter-session-peer-discipline, cross-machine backend).
- SessionStart-хук: уборка реально прибивает осиротевшие мониторы этого инбокса; инжект поднимает РОВНО один Monitor; headless → skip.
- Stop-хук block-фикс: письмо принудительно обрабатывается, цикла нет.
- Тело SKILL.md (Steps/Failure modes/etc.) дописано и соответствует реальности.
Findings → follow-up tasks в claude-skills.
NB по семверу: version 0.1.0 записан промоутером. Дальнейшие инкременты — владелец claude-skills, не ревьюер.
Status: ready
Where I stopped: (not started) — разблокирован 2026-06-17: все 5 baseline/content-тасок 🟢 + -test-trigger 🟢 (VERDICT PASS). Зонтичное ревью.
Next action: ТОЛЬКО НЕ-имплементер / другая сессия (эта прогнала -test-trigger → для ревью недостоверна). Прогнать поведенческий smoke-test (см. чек-лист): активация на триггерах RU+EN / не на чужих; SessionStart sweep+inject (ровно один Monitor, headless skip); Stop-хук block-фикс без цикла; тело SKILL.md соответствует реальности. Учесть открытый finding session-inbox-monitor-received-msg-fp. Findings → tasks_create в claude-skills.
Blocker: (cleared — 5 baseline/content + test-trigger все 🟢)
Branch: n/a
Notify: OpeItcLoc03/workshop