From b796769ab112bc285e5105f76d173e9eb5705415 Mon Sep 17 00:00:00 2001 From: vitya Date: Wed, 12 Aug 2026 20:25:17 +0300 Subject: [PATCH] meta(tasks): close command-index-review (VERDICT PASS) + archive 12 done + follow-up readme-command-index-row + handoff MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - command-index v0.1.0 reviewed: convention ok, discrimination 4/4, lint 46/0, dist/install sync - F1/F2 (README rows en+ru missing + stale install.ps1 note) → readme-command-index-row - 12 🟢 (11 wave closes + review) archived per using-tasks threshold - .tasks/NEXT_SESSION.md: headless session-close-ritual handoff (staged by the ritual) --- .tasks/.archive/done-2026-08.md | 2456 +++++++++++++++++-------------- .tasks/NEXT_SESSION.md | 56 +- .tasks/STATUS.md | 173 +-- 3 files changed, 1347 insertions(+), 1338 deletions(-) diff --git a/.tasks/.archive/done-2026-08.md b/.tasks/.archive/done-2026-08.md index 6bb682e..a7f468d 100644 --- a/.tasks/.archive/done-2026-08.md +++ b/.tasks/.archive/done-2026-08.md @@ -1,1144 +1,1144 @@ -# Archived — Done batch 2026-08 - -Moved out of `.tasks/STATUS.md` to keep the active board lean. -Snapshot of all 🟢 done blocks from `.tasks/STATUS.md` as of sovereign-catalog-wave2-review close 2026-08-12 (51 blocks + review task). -Moved out of `.tasks/STATUS.md` to keep the active board lean. -Full source is git history; this file is for grep-able historical context. - ---- - -## 🟢 [session-inbox-monitor-pi-extension] — Pi (pi-coding-agent) support: global inbox delivery for all pi sessions, any directory. - -**Status:** 🟢 done (shipped 2026-08-10). -**Where I stopped:** pi-native порт скила собран, протестирован и задеплоен. **Session-scoped**: смотрит только `/.claude-inbox/` (свой проект). Первая версия (глобальный скан всех инбоксов, `PI_INBOX_ROOTS`) отменена в тот же день — правило vitya: «ты другие инбоксы читать не имеешь права. Только в своей директории». Расширение `inbox-monitor.ts`: PUSH-поллер 15s по своему инбоксу (интерактив) + PULL `agent_settled` sweep; доставка `pi.sendUserMessage` с заголовком `[inbox] <имя-файла>` + тело, move в `.read/`; dedup per-process, `.read/` move — кросс-процессный first-wins против CC-хуков; headless (`ctx.hasUI===false`) — без доставки (сообщения ждут интерактив, зеркалит CC-headless); opt-in как у CC (инбокс-дир или строка `inbox monitor: raise on start`). Source of truth: `.common/lib/pi-extensions/inbox-monitor.ts` + `inbox-monitor.test.mjs` (3 блока, ALL PASS, `node --experimental-strip-types`, decoy-проверка: чужой инбокс не тронут). Деплой: `~/.pi/agent/extensions/` byte-identical (diff=0). SKILL.md v0.3.0 — секция «Pi (pi-coding-agent) support — session-scoped global extension». -**Next action:** (none — kept until merged). Живой лоад в реальном pi TUI (авто-дискавери `/reload`) — проверить при следующей интерактивной сессии. - - - - -## 🟢 [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/.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 - - - ---- - - -## 🟢 [using-synology-ops-review] — Skill-review checkpoint для using-synology-ops (промоушен 2026-05-12). - -**Status:** done (wontfix) -**Where I stopped:** Closed 2026-05-25 — Synology NAS decommissioned permanently. Skill `using-synology-ops` is now dead-code candidate (full retire tracked separately). Review acceptance criteria (behavioral smoke-test, Steps behavior, Failure modes, What NOT to do) have no target — both the underlying MCP server (`opsmcp.kzntsv.site`) and the host fleet (modulair-* containers) are gone. -**Next action:** (none — closed as wontfix; full skill retire is a separate task) -**Branch:** n/a - - - ---- - - -## 🟢 [using-vds-ops-description-length-investigate] — Investigate description length vs MEMORY ≤900 char limit. Drift between memory feedback и реальным harness behavior? - -**Status:** done (wontfix — empirical close) -**Where I stopped:** Closed 2026-05-25. Empirical evidence sufficient: `using-vds-ops` description = 1473 chars activates correctly (7/7 behavioral smoke-test PASSED, harness listing shows full description, hermes/mapping.yaml processes it fine). MEMORY note `feedback_skill_description_length_limit.md` was paranoid — actual limit either raised or never as tight as feared. Hypothesis (c) confirmed. No need for systematic measurement — investigation cost > information value. -**Side effect:** Memory entry `feedback_skill_description_length_limit.md` deleted same commit (no longer load-bearing). YAML colon-space gotcha memory (`feedback_skill_description_yaml_colon_gotcha.md`) kept — different concern, still valid. -**Next action:** (none — closed) -**Branch:** n/a - - - ---- - - -## 🟢 [using-synology-ops-disambiguation-uplift] — Add explicit disambiguation clause to `using-synology-ops` description (sibling parity with `using-vds-ops`). - -**Status:** done (wontfix) -**Where I stopped:** Closed 2026-05-25 — Synology NAS decommissioned, no longer in fleet. Disambiguation between NAS / VDS for shared container names (`traefik` etc.) is moot when only VDS exists. Acceptance criteria no longer have a target. -**Next action:** (none — closed as wontfix) -**Branch:** n/a - - - - -## 🟢 [using-yt-tools-listen-skill-update] — Расширить `skills/using-yt-tools/SKILL.md` поддержкой нового CLI `yt-listen` (audio/FFT analysis). - -**Дизайн-контекст:** -- Спецификация: `mcp__projects-meta__knowledge_get` slug `concepts/yt-tools-audio` в `OpeItcLoc03/common`. -- Process trace: `~/projects/.workshop/.archive/2026-05-25-yt-tools-audio.md`. -- Текущий SKILL.md (v0.3.x): уже триггерится на YouTube URL + transcript/frames; расширить аудио-триггерами и iterative-флоу. - -**Изменения в SKILL.md:** - -1. **`description` frontmatter** — добавить аудио-семантику без раздувания (existing description уже длинноват, аккуратно): - - Новые триггеры: «послушай момент N», «BPM/тональность/гармония видео», «спектрограмма», «что в музыке на T», «listen to fragment», «analyze audio». - -2. **Steps section** — расширить iterative-флоу: - - Для музыкальных URL: `yt-transcript` опциональный (если captions есть), `yt-listen --timestamps T1,T2,...` primary. - - Output: per timestamp — `clip_TTTT.wav` + `spectrum_TTTT.png` + `features_TTTT.md`. - - Агент Read'ом получает spectrum.png (vision) + features.md (числа). - - Помнить: spectrum image-only недостаточен; всегда читать features.md в паре (Dixit et al., arXiv 2411.12058). - -3. **What NOT to do** — точечная защита от scope creep: - - НЕ вызывать Whisper на смешанной музыке (без source-separation = мусор). Если user просит lyrics из музыки — сказать что это отдельный pipeline (Demucs + Whisper), out of scope. - - НЕ интерпретировать spectrum-PNG без features.md. - -4. **Step 0 probe** — добавить проверку `yt-listen` в существующую цепочку (PATH → pipx-shim → legacy venv). - -**Bump:** PATCH (0.3.x → 0.3.(x+1)) — поверхностное расширение, не breaking. - -**TDD-mode:** `claude-skills` имеет `follow tdd-criteria` в CLAUDE.md, но это markdown-документ (SKILL.md), не код — TDD не применим. Behavioral smoke-test покрывается отдельной таской `using-yt-tools-listen-test-trigger`. - -**Status:** done -**Where I stopped:** shipped (fd8a382, NOT pushed per task instruction). SKILL.md v0.3.1 → v0.3.2 PATCH. Изменения: (1) description frontmatter — добавлены audio-триггеры (BPM/тональность/гармония/спектрограмма/listen to fragment/analyze audio); (2) "Three flows" + новый Flow C — audio-analysis под "When to use"; (3) Step 0 probe расширен — yt-listen в install-set (5 binaries вместо 4) + диагностика "только yt-frames без yt-listen = старый 0.1.x"; (4) Inputs-table добавлена Flow C row (--duration, --mode interval, --no-wav, --no-spectrogram, --linear, --chroma, --sample-rate); (5) Steps добавлена "### Flow C — audio-analysis" секция с pipeline-шагами и stdout-контрактом; (6) What NOT to do: точечная защита от Whisper-on-mixed-music (Demucs+Whisper отдельный pipeline, out of scope) + правило "spectrum-PNG только в паре с features.md" (VLM ~50-60% Dixit et al. arXiv 2411.12058). Install.sh не запускался, hermes/mapping.yaml не правился, push отложен (test-trigger разблокирован, но требует чистой сессии). -**Next action:** (none — kept until merged) -2. Прочитать `concepts/yt-tools-audio` из global wiki + workshop archive. -3. Открыть `skills/using-yt-tools/SKILL.md`. -4. Внести изменения по 4 пунктам выше. -5. Bump version в frontmatter (PATCH). -6. Commit: `feat(using-yt-tools): add yt-listen support (audio/FFT) v0.3.`. -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):** - -1. **Trigger activation positive (минимум 4 фразы):** - - «послушай момент 2:30 в этом ролике » → агент вызывает `yt-listen URL --timestamps 2:30`. - - «какой BPM в » → `yt-listen URL` (без timestamp = bulk-mode hint или quick-default). - - «listen to fragment at 1:15 » → `yt-listen URL --timestamps 1:15`. - - «спектрограмма видео » → `yt-listen --timestamps` с хотя бы одним таймкодом (агент должен выбрать sensible default или спросить). - -2. **Trigger activation negative (3 близкие, но не свои):** - - «расшифруй видео » → `yt-transcript`, НЕ `yt-listen`. - - «покажи кадр на 1:23 » → `yt-frames`, НЕ `yt-listen`. - - «о чём этот ролик » → `yt-transcript` + summary, НЕ `yt-listen` (нет музыкального контекста). - -3. **What-NOT-to-do compliance:** - - User: «дай lyrics из <музыкальный URL>» → агент НЕ должен вызывать Whisper / `yt-transcribe-music`; должен объяснить что это отдельный pipeline (Demucs + Whisper), out of scope `yt-listen`. - -4. **E2E против реального URL** (короткий музыкальный клип, e.g. 1-минутный royalty-free track): - - `yt-listen URL --timestamps 0:30 --duration 10s` создаёт 3 артефакта в `./yt-cache//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-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:** done -**Where I stopped:** Закрыто 2026-06-17 попутно при build-integrity фиксе (билд был RED — 5 unmapped-скилов). Запись `meta-host-routing` добавлена в `hermes/mapping.yaml` секцию pending с `intended: {mode: auto, category: meta}` + reason (projects-meta MCP tasks_create/knowledge_ingest/meta_status, cross-repo writes, review PASS но -install + tool-side аудит ещё открыты). Билд зелёный. Schema version не трогал. Commit `43f9912`. -**Next action:** (none — kept until merged). pending→auto только после -install baseline + tool-side аудита. -**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-` 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/.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 | ""` в frontmatter задачи — маркер точки разрыва сессии. - -После закрытия задачи (статус 🟢), ДО `tasks_claim_next`: -1. Прочитать frontmatter закрытой задачи -2. Если `session_break` присутствует — вывести: - `🔚 SESSION BOUNDARY — [slug] закрыта. Рекомендую завершить текущую сессию. Следующий трек: [value | "см. STATUS.md"]` -3. Остановиться, не клеймить следующую задачу - -Без флага — поведение прежнее. - -## Acceptance criteria -- [ ] SKILL.md → v1.2.0 -- [ ] Поле `session_break` задокументировано в frontmatter-конвенциях (тип: bool | string, примеры) -- [ ] Правило проверки: ПОСЛЕ close, ДО claim-next — явно вписано в раздел Task completion -- [ ] Формат SESSION BOUNDARY сообщения зафиксирован дословно - -## Skills -- invoke `using-tasks` (прочитать текущий SKILL.md перед правкой) - -## Permissions -- interns: no -- auto-push: yes - -## Weight -needs-claude - -**Weight:** needs-claude -**Status:** done -**Where I stopped:** Shipped — `skills/using-tasks/SKILL.md` 1.1.0→1.2.0 (MINOR). Added `session_break` marker: (1) optional `**Session break:**` field in the STATUS.md format block + new "### `session_break` marker" subsection documenting type (bool | string) with examples (`true` → "см. STATUS.md", `""` → 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: "" # optional — using-tasks остановится после close и предложит закрыть сессию -``` - -Добавить Q6 в pre-flight gate: -> "Нужен ли разрыв сессии после этой задачи? (domain-switch, milestone, heavy infra)" - -Если да — ставить `session_break: "<название следующего трека или hint>"` в создаваемую задачу. - -Usage guidance (три случая): -1. Смена домена / репо — переход между несвязанными треками -2. Milestone-задача — последняя в группе sub-tasks фичи -3. Тяжёлые инфра-задачи — shared checkout, migrations - -## Acceptance criteria -- [ ] SKILL.md → v0.2.2 -- [ ] Template: поле `session_break` с inline-комментарием и примером -- [ ] Pre-flight Q6 добавлен после Q5 (notify) -- [ ] Usage guidance: три случая когда ставить - -## Skills -- invoke `delegate-task` (прочитать текущий SKILL.md перед правкой) - -## Permissions -- interns: no -- auto-push: yes - -## Weight -needs-claude - -**Status:** 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 | ""]` 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. - -Проверить: -- [x] Правило стоит ПОСЛЕ close, ДО claim-next (не наоборот) -- [x] Формат SESSION BOUNDARY сообщения соответствует дизайну (включает slug и hint) -- [x] Отсутствие флага не меняет поведение (регрессия) -- [x] Версия поднята до 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-тасок в этом же файле (`` в локальном STATUS.md). Альтернатива, которую отверг: `tasks_close confirm:true` — отдал реконсиляцию meta-системы раннеру. -**Next action:** (none — kept until merged) -**Branch:** n/a - - -` в локальном STATUS.md). Альтернатива, которую отверг: `tasks_close confirm:true` — отдал реконсиляцию meta-системы раннеру. --> - ---- - - -## 🟢 [session-break-delegate-task-review] — Review реализации `session_break` в `delegate-task` skill. - -Проверить: -- [x] Q6 добавлен на правильном месте (после Q5 notify) -- [x] Template: поле `session_break` с понятным inline-комментарием -- [x] Usage guidance: три случая явно перечислены -- [x] Версия поднята до 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-review] — Review скила `using-system-snapshot`. - -Проверить: -- [x] 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) -- [x] Запрет на утверждение состояния без вызова snapshot — явно прописан (4 места: Overview core rule, When to use, What NOT to do, Common mistakes) -- [x] Формат вывода достаточно краткий (одна строка на секцию) — 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`. - -- [x] Ориентация действительно идёт через `tasks_get_status`, не Read — **deviation validated** (см. ниже) -- [x] Нет регрессий — полный обзор доски всё ещё работает когда нужен -- [x] Правило архивации 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 мин) → жёсткое предупреждение "⚠️ поллер ведёт `` — нельзя работать параллельно", требовать явного подтверждения 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 - - - ---- - - -## 🟢 [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.md` changed (no versioned artifact), so `meta(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:** /` — inbox-уведомление при завершении -- Без `Weight` — поллер не берёт; `needs-human` — только ручное - -**TDD-фазы:** -1. RED: baseline-субагент без скила — фиксируем пропущены ли поля -2. GREEN: минимальный SKILL.md закрывающий gaps -3. 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:** /` — inbox-уведомление при завершении -- Без `Weight` — поллер не берёт; `needs-human` — только ручное - -**TDD-фазы:** -1. RED: baseline-субагент без скила — фиксируем пропущены ли поля -2. GREEN: минимальный SKILL.md закрывающий gaps -3. 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-процессов. - -**Что делает скил (поведение):** -1. Вызвать `tasks_claim_next` (с учётом POLLER_PROJECTS из env или аргумента) -2. Если задача найдена — прочитать description, выполнить работу в текущей сессии (все инструменты доступны), закрыть через `tasks_close` -3. Если задач нет — **выйти из цикла**, доложить пользователю («очередь пуста»). Не вызывать ScheduleWakeup напустую — это сжигало бы токены каждые N секунд ради пустой проверки. -4. Повторить с п.1 -5. Остановиться при явном сигнале пользователя (сообщение в чат) или при `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:** -1. Агент с скилом корректно claim → work → close → repeat -2. При отсутствии задач — останавливает цикл (не polling, не ScheduleWakeup), сообщает пользователю -3. При ошибке в задаче — паркует (tasks_update status=paused), не виснет -4. Heartbeat: либо документировано как использовать с длинным TTL, либо со ссылкой на `heartbeat-side-channel` -5. Скил задокументирован по стандарту superpowers (frontmatter name/description, CSO-оптимизация) -6. 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-процессов. - -**Что делает скил (поведение):** -1. Вызвать `tasks_claim_next` (с учётом POLLER_PROJECTS из env или аргумента) -2. Если задача найдена — прочитать description, выполнить работу в текущей сессии (все инструменты доступны), закрыть через `tasks_close` -3. Если задач нет — `ScheduleWakeup(60s)`, ждать -4. Повторить с п.1 -5. Остановиться при явном сигнале пользователя (сообщение в чат) или при `budget.remaining() < threshold` - -**Только скил, программных изменений нет.** Все нужные инструменты (`tasks_claim_next`, `tasks_close`, `ScheduleWakeup`) уже существуют. - -**TDD — обязательно:** -- Сначала написать baseline сценарий (subagent без скила): агент получает задачу, что он делает? Зафиксировать нарушения. -- Написать SKILL.md закрывающий эти нарушения -- Прогнать compliance-сценарий с скилом: агент следует loop корректно -- Проверить edge cases: нет задач, задача провалилась, пользователь прервал - -**Acceptance criteria:** -1. Агент с скилом корректно claim → work → close → repeat -2. При отсутствии задач — ждёт через ScheduleWakeup, не крашится -3. При ошибке в задаче — паркует (tasks_update status=paused), не виснет -4. Heartbeat: либо документировано как использовать с длинным TTL, либо со ссылкой на `heartbeat-side-channel` -5. Скил задокументирован по стандарту superpowers (frontmatter name/description, CSO-оптимизация) -6. 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-tasks` session_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 `CronCreate` for long-watch → loophole; reworded long-watch to mandate `ScheduleWakeup` (this session) and forbid `CronCreate` (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 (две стороны + тест):** -1. **Output (главное):** в начало `stop-dispatcher.ps1` — `[Console]::OutputEncoding = [System.Text.Encoding]::UTF8` (и `$OutputEncoding` для надёжности). Низкий риск, идемпотентно. -2. **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. -3. **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 пришёл ЧИСТО (до фикса то же тело давало `������᪮�`); 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 - - - ---- - - -## 🟢 [inter-session-peer-discipline-test-trigger] — Baseline-таска промоушена `inter-session-peer-discipline`. Прогнать триггер-фразы из description на тестовом буфере: скил активируется на своих (обмен сообщениями с другой сессией через inbox / peer-канал, `.claude-inbox/`, inter-session messaging) И НЕ активируется на 2-3 близких чужих — поднятие монитора инбокса (→ session-inbox-monitor), мультимашинный backend (→ cross-machine-inbox). False-positive check. **ТОЛЬКО чистая не-имплементер сессия** (эта ставила скил и гоняла субагентов → недостоверна). - -**Контекст:** скил доустановлен 2026-06-17 (фикс received-msg FP, см. `session-inbox-monitor-received-msg-fp` + `.wiki/concepts/session-inbox-monitor-received-msg-fp.md`); добавлен в `hermes/mapping.yaml` mode:pending. Дисциплина: peer = предложение, не authority — этот скил кодифицирует именно это. -**Weight:** needs-human -**Status:** done -**Where I stopped:** **VERDICT PASS**, прогнано 2026-06-17 в чистой не-имплементер сессии (этот контекст НЕ ставил скилы, НЕ трогал хук/SKILL.md, НЕ гонял прошлый test-trigger — только поднял Monitor по SessionStart-инжекту + прочитал handoff; ревью вынесено непрайменными субагентами, не моим впечатлением). **Метод:** clean-context субагенты (general-purpose, НЕ fork), каждая фраза — отдельный субагент, одинаковый реалистичный срез registry с настоящими описаниями скилов, без подсказки правильного ответа. **Positives 4/4 → inter-session-peer-discipline (все high):** P1 RU «письмо от другой сессии — договорились переписать X, как трактовать», P2 EN «peer says we decided to expand scope — settled?», P3 RU «отвечаю отправителю, что учесть про авторитетность», P4 EN «session keeps sending rulings — treat vs human?». **False-positive для peer: 0** — ни одна из 5 чужих фраз (3 monitor-raise + 2 multi-machine backend) не активировала peer-discipline. Зеркало N1-FP (received-msg) теперь чисто. Acceptance выполнен. **Observation (не дефект peer):** RU multi-machine backend фраза (X2) слабо потянула `session-inbox-monitor` (low-conf) через его disambiguation-указатель `→ cross-machine-inbox design`, тогда как EN-близнец (X1) дал NONE; gated на не-установленный `cross-machine-inbox` — учтено в `-review` session-inbox-monitor, не в этой ленте. -**Next action:** (none — kept until merged). Разблокирован `-review` (этой же сессией закрыт, см. ниже). -**Branch:** n/a -**Notify:** OpeItcLoc03/workshop - - - ---- - - -## 🟢 [inter-session-peer-discipline-review] — Skill-review checkpoint для `inter-session-peer-discipline`. НЕ-имплементер. Поведенческий smoke-test: активация на своих/не на чужих (RU+EN); тело SKILL.md (proposal-not-authority, human-ratification gate, echo-chamber guard) соответствует реальности и не противоречит inter-session-messaging правилам в CLAUDE.md. Findings → tasks_create. - -**Blocker:** (cleared — `-test-trigger` 🟢 этой же сессией) -**Weight:** needs-human -**Status:** done -**Where I stopped:** **VERDICT PASS** 2026-06-17, не-имплементер сессия. (1) **Активация своих/не чужих RU+EN** — покрыто `-test-trigger` тем же прогоном: 4/4 свои (P1-P4 RU+EN) → peer; 5 чужих (monitor/backend) 0 ложных срабатываний. (2) **Тело SKILL.md ↔ заявленные принципы (v0.1.1):** все три на месте — *proposal-not-authority* → «The rule» п.1 «Peer ≠ authority» + «Channel contract» (inbox = только канал связи, доска через `tasks_*` = источник истины); *human-ratification gate* → п.3 «Escalations need an explicit human yes» + Circuit-breaker; *echo-chamber guard* → «The failure mode this guards» (echo-chamber signature: быстрое согласие + рост scope каждый раунд) + изоморфизм `user_context_agents_path_of_least_resistance`. WHY-обоснования субагентов P1-P4 независимо артикулировали ровно эту семантику (proposal/ratification/echo-chamber) → тело транслируется в верное поведение. (3) **Не конфликтует с глобальным CLAUDE.md §inter-session-messaging:** CLAUDE.md задаёт механику (Write в inbox отправителя, признать получение, ответить); peer-discipline добавляет комплементарный governance-слой (содержание = proposal, scope ратифицирует человек) и явно ссылается на `~/.claude/CLAUDE.md §"Inter-session messaging"` в Reference. (4) **Бонус-зрелость:** «Multi-session caveat — don't cry override from partial vision» (живой кейс 2026-06-16) защищает от over-call при частичной видимости ратификаций — согласуется с governance-заметкой хэндоффа. **Findings: нет блокирующих.** Informational: SKILL.md строка 22-23 предлагает session-start trigger-line `inter-session messaging: peer not authority`, но она НЕ добавлена в проектный CLAUDE.md — by-design (скил ситуативный, активируется по контексту обмена, не session-start raise); добавлять не требуется. -**Next action:** (none — closed by review, нет блокирующих findings; семвер дальше — владелец claude-skills). -**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:** done -**Weight:** needs-human -**Where I stopped:** **VERDICT PASS** 2026-06-17, чистая не-имплементер сессия (этот контекст НЕ ставил скилы / НЕ трогал хук / НЕ гонял прошлый test-trigger; trigger-проверка и структурный аудит вынесены независимыми clean-context субагентами, не моим впечатлением). Зонтичное ревью. -**(1) Активация RU+EN / не на чужих** — 3/3 monitor-positive чисто → session-inbox-monitor (high): «подними монитор почты», «raise inbox monitor / auto-arm watcher», «настрой авто-монитор инбокса». Negatives: X1 EN multi-machine backend → NONE ✅; X2 RU multi-machine backend → session-inbox-monitor **low-conf** ⚠️ (зацеп за disambiguation-указатель `→ cross-machine-inbox design`). FP-finding `received-msg-fp` учтён как **RESOLVED via (b)** — не open. -**(2) SessionStart sweep+inject** — PASS. Sweep прибивает осиротевшие мониторы ИМЕННО этого инбокса по dual-key (`CLAUDE_INBOX_MONITOR` сентинел + forward-slash inbox-путь), Stop-Process -Force, строго ДО inject. Inject поднимает РОВНО один Monitor (`while…sleep 15` — это poll-loop внутри одного Monitor, не N мониторов; де-дуп по имени файла). Headless: хук НЕ детектит, skip делегирован агенту — задокументировано (нет надёжного hook-level сигнала), тело ↔ хук консистентны. -**(3) Stop-хук block-fix** — PASS, цикла нет. Сообщения MOVE в `.read/` ДО построения block-reason; `$inboxContext` непуст только при наличии файлов прямо в `.claude-inbox/` → после слива следующий Stop видит пустой инбокс → guard `if ($inboxContext)` ложен → block не ставится. Locked-файл: `catch{continue}` пропускает, не клинит. -**(4) Тело SKILL.md ↔ реальность** — PASS. Каждое утверждение (sweep per-inbox, де-дуп по имени, opt-in gate, fires on startup/resume/clear/compact, Stop force-deliver→.read, /clear не триггерит SessionEnd, mojibake-fix в stop-dispatcher) сверено с кодом хука — совпадает. Repo-копия и установленная `inbox-monitor.ps1` байт-идентичны. -**Findings:** 1 CONCERN (latent) → follow-up `session-inbox-monitor-encoding-guard-followup` (ниже): `inbox-monitor.ps1` не выставляет `[Console]::OutputEncoding=UTF8` (есть в stop-dispatcher); сегодня безопасно (`$ctx` ASCII), но inbox-путь интерполируется в stdout → latent mojibake если появится non-ASCII путь/контент. Informational (не tasks): X2 RU-backend low-conf pull (gated на не-установленный cross-machine-inbox); micro-note D — тело ссылается на `interactive-lock.ps1` твин, но логика inline в stop-dispatcher через `interactive-lock-cli.js` (cross-ref на sibling, не self-claim). -**hermes:** PASS ревью НЕ снимает гейт pending→auto — держать **pending** до tool-side аудита (settings.json write, Get-CimInstance|Stop-Process kill, Monitor raise), как в хэндоффе. -**Next action:** (none — closed by review; семвер дальше — владелец claude-skills). -**Blocker:** (cleared — 5 baseline/content + test-trigger все 🟢) -**Branch:** n/a -**Notify:** OpeItcLoc03/workshop - - - ---- - - -## 🟢 [session-inbox-monitor-encoding-guard-followup] — Forward-guard: `skills/session-inbox-monitor/hooks/inbox-monitor.ps1` (SessionStart-инжектор) не выставляет `[Console]::OutputEncoding`, которое уже есть в `stop-dispatcher.ps1`. Found at `-review` 2026-06-17 (structural audit item E, CONCERN). - -**Симптом (latent, не активный):** хук эмитит `ConvertTo-Json` ($ctx + $cmd) в stdout под тем же WinPS-5.1 redirected-pipe путём, что ловил mojibake в stop-dispatcher (см. закрытую `session-inbox-monitor-stophook-utf8-fix`). Сегодня безопасно — `$ctx`/`$cmd` чистый ASCII (комменты намеренно используют `-`, не `—`). НО: inbox-путь (`$inboxFwd`) — user-data — интерполируется в stdout (строка ~78); если в пути или в `$ctx` появится non-ASCII символ, additionalContext придёт искажённым. Файл без BOM и без OutputEncoding-guard. - -**Fix (one-liner):** добавить `[Console]::OutputEncoding = [System.Text.Encoding]::UTF8` (и `$OutputEncoding` для надёжности) в начало `inbox-monitor.ps1` — зеркало stop-dispatcher. Низкий риск, идемпотентно. После — re-deploy в `~/.claude/hooks/` (hash-parity) + bump SKILL.md PATCH (forward-guard в Failure modes/Side effects). -**Альтернатива (wontfix):** принять как осознанный latent risk, задокументировать «inbox-monitor.ps1 ASCII-only by contract» в SKILL.md — но guard дешевле инварианта «никогда не клади non-ASCII в inbox-путь». - -**Weight:** needs-human -**Status:** done -**Where I stopped:** Шипнуто 2026-06-17 — выбран **fix** (one-liner дешевле инварианта «ASCII-only»). (1) В `inbox-monitor.ps1` после `$ProjectDir`-гейта добавлен `[Console]::OutputEncoding = [System.Text.Encoding]::UTF8` + `$OutputEncoding` (зеркало stop-dispatcher), с комментарием про redirected-pipe forward-guard; текст коммента чистый ASCII (не вношу non-ASCII в сам source). (2) **Регрессия под WinPS 5.1 (тот же движок):** parse 0 ошибок; прогон хука против проекта с кириллическим путём (`тест-инбокс-кириллица`) через Start-Process→RedirectStandardOutput; raw-байты прочитаны как no-BOM UTF-8 → JSON валиден, кириллический путь в `additionalContext` round-trip'нулся БЕЗ искажения. (3) Re-deploy в `~/.claude/hooks/inbox-monitor.ps1` — **SHA256 byte-identical** с репо (бэкап `.bak-encguard`). (4) SKILL.md Mojibake failure-mode расширен (инжектор несёт тот же guard), bump 0.2.1→**0.2.2 PATCH**. NB: install/hermes/dist-rebuild не трогал — для PATCH достаточно reload-plugins (как в прошлых yt-tools/using-tasks PATCH-закрытиях); установленный хук — то, что работает в рантайме, он обновлён. -**Next action:** (none — kept until merged). При желании — `/reload-plugins` чтобы установленная копия SKILL.md (docs) подтянула 0.2.2; рантайм-поведение уже на месте (хук задеплоен). -**Branch:** master -**Notify:** OpeItcLoc03/workshop - - - ---- - - -## 🟢 [context7-cli-skill] — Переделать using-context7 с MCP-привязки на CLI-first (идея 16): pi не видит context7 (мост claude-mcp-bridge читает только ~/.claude.json, context7 живёт в ~/.claude/settings.json как HTTP MCP https://mcp.context7.com/mcp). Решение: using-context7 v2 — CLI `ctx7` (npm v0.5.8) + скил в суверенном каталоге; любой агент вызывает ctx7 в bash без MCP-регистрации. API-ключ ctx7sk-… из ~/.claude/settings.json → разовая конфигурация в ~/.config/projects-secrets/ (паттерн interns.env). Принцип: CLI-first (обзор инструментов 2026-08-11), как browser-cdp против Chrome DevTools MCP. - -**Status:** done -**Where I stopped:** using-context7 v1.0.0 → v2.0.0: MCP-bound → CLI-first (ctx7 npm). Проверено: ctx7 library/docs работают АНОНИМНО (ключ не нужен — он для MCP/rate-limit; ctx7 login для лимитов, опционально). Секреты не плодили — перенос ключа в projects-secrets НЕ делаем (не нужен, анонимный путь достаточен). Git Bash-нюанс задокументирован (//owner/repo). Установлено в ~/.claude/skills, линт чист. setup-context7 остаётся для MCP-маршрута (ctx7 setup), но канон = CLI. -**Next action:** (none — kept until merged) -**Branch:** n/a - - - ---- - - -## 🟢 [rename-repo-to-skills] — Ренейм репо/папки claude-skills → skills (идея 11 буфера .workshop/.brainstorm/claude-to-agents.md): снять историческую привязку к claude. Шаги: (1) Gitea-ренейм OpeItcLoc03/claude-skills → OpeItcLoc03/skills; (2) локальная папка + git remote set-url; (3) правки ссылок: scripts/update.{sh,ps1} (URL), build-hermes.py, project-bootstrap, hermes/mapping.yaml installer_path (meta/claude-skills-installer); (4) ренейм скила update-claude-skills → update-skills (semver-bump, hermes-mapping, баслайны); (5) ресинк кэша projects-meta + миграция ~6 таск-таргетов OpeItcLoc03/claude-skills → OpeItcLoc03/skills; (6) верификация: свежий клон с нового URL, греп старого имени = 0 в живых ссылках. - -**Status:** done -**Where I stopped:** Gitea OpeItcLoc03/claude-skills → OpeItcLoc03/skills (301 redirect). Локальная папка → projects/skills, remote обновлён. Ссылки: scripts/update.{sh,ps1}, build-hermes.py, project-bootstrap, project-discipline, pulling-before-work, recommend-dont-menu, active-platform, inter-session-peer-discipline, using-projects-meta, using-system-snapshot, README.md, hermes/mapping.yaml (installer_path + entry). update-claude-skills → update-skills v0.2.0 (+ установленная копия в ~/.claude/skills). poller-scope.json → OpeItcLoc03/skills. Кэш projects-meta ресинкнут (46 проектов, 0 ошибок). Остаточные ссылки: исторические .tasks/.read/закрытые + using-yt-tools стаб (удаляется в skill-frontmatter-lint). -**Next action:** (none — kept until merged) -**Branch:** n/a - - - ---- - - -## 🟢 [skill-frontmatter-lint] — Линт SKILL.md по спецификации Agent Skills (идея 17, найдено pi-линтом 2026-08-11): (1) починить YAML-frontmatter using-interns (description неэкранированный plain-scalar, «Rule 4: ask-mode») + сократить ≤1024 (сейчас 1076); (2) сократить description ≤1024: using-vds-ops (1097), using-wiki-graph (1132); (3) удалить deprecated-стаб using-yt-tools (YAML сломан, противоречив — «no trigger phrases» при наличии триггеров в description; контент мигрировал в plugin OpeItcLoc03/yt-tools); (4) линт-скрипт (YAML парсится + description ≤1024 + обязательные поля) в пайплайн при update-skills. Верификация: скрипт-линт по всем SKILL.md = 0 ошибок. - -**Status:** done -**Where I stopped:** using-interns v0.3.1 (YAML block-scalar + desc 788), using-wiki-graph v0.1.1 (desc 776), ralph-loop-execution получил frontmatter (name/version/description — раньше вообще без него, не активировался). using-yt-tools стаб удалён (репо + ~/.claude/skills). using-vds-ops в репо уже был ок (932) — переустановлен (инсталл был stale 1097). Добавлен scripts/lint-skills.py (YAML + description≤1024 + required fields; missing version = warning) + встроен в update.{sh,ps1} перед install. Линт: репо и ~/.claude/skills = 38 скилов, 0 violations (6 soft warnings: legacy без version). -**Next action:** (none — kept until merged) -**Branch:** n/a - - - ---- - - +# Archived — Done batch 2026-08 + +Moved out of `.tasks/STATUS.md` to keep the active board lean. +Snapshot of all 🟢 done blocks from `.tasks/STATUS.md` as of sovereign-catalog-wave2-review close 2026-08-12 (51 blocks + review task). +Moved out of `.tasks/STATUS.md` to keep the active board lean. +Full source is git history; this file is for grep-able historical context. + +--- + +## 🟢 [session-inbox-monitor-pi-extension] — Pi (pi-coding-agent) support: global inbox delivery for all pi sessions, any directory. + +**Status:** 🟢 done (shipped 2026-08-10). +**Where I stopped:** pi-native порт скила собран, протестирован и задеплоен. **Session-scoped**: смотрит только `/.claude-inbox/` (свой проект). Первая версия (глобальный скан всех инбоксов, `PI_INBOX_ROOTS`) отменена в тот же день — правило vitya: «ты другие инбоксы читать не имеешь права. Только в своей директории». Расширение `inbox-monitor.ts`: PUSH-поллер 15s по своему инбоксу (интерактив) + PULL `agent_settled` sweep; доставка `pi.sendUserMessage` с заголовком `[inbox] <имя-файла>` + тело, move в `.read/`; dedup per-process, `.read/` move — кросс-процессный first-wins против CC-хуков; headless (`ctx.hasUI===false`) — без доставки (сообщения ждут интерактив, зеркалит CC-headless); opt-in как у CC (инбокс-дир или строка `inbox monitor: raise on start`). Source of truth: `.common/lib/pi-extensions/inbox-monitor.ts` + `inbox-monitor.test.mjs` (3 блока, ALL PASS, `node --experimental-strip-types`, decoy-проверка: чужой инбокс не тронут). Деплой: `~/.pi/agent/extensions/` byte-identical (diff=0). SKILL.md v0.3.0 — секция «Pi (pi-coding-agent) support — session-scoped global extension». +**Next action:** (none — kept until merged). Живой лоад в реальном pi TUI (авто-дискавери `/reload`) — проверить при следующей интерактивной сессии. + + + + +## 🟢 [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/.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 + + + +--- + + +## 🟢 [using-synology-ops-review] — Skill-review checkpoint для using-synology-ops (промоушен 2026-05-12). + +**Status:** done (wontfix) +**Where I stopped:** Closed 2026-05-25 — Synology NAS decommissioned permanently. Skill `using-synology-ops` is now dead-code candidate (full retire tracked separately). Review acceptance criteria (behavioral smoke-test, Steps behavior, Failure modes, What NOT to do) have no target — both the underlying MCP server (`opsmcp.kzntsv.site`) and the host fleet (modulair-* containers) are gone. +**Next action:** (none — closed as wontfix; full skill retire is a separate task) +**Branch:** n/a + + + +--- + + +## 🟢 [using-vds-ops-description-length-investigate] — Investigate description length vs MEMORY ≤900 char limit. Drift between memory feedback и реальным harness behavior? + +**Status:** done (wontfix — empirical close) +**Where I stopped:** Closed 2026-05-25. Empirical evidence sufficient: `using-vds-ops` description = 1473 chars activates correctly (7/7 behavioral smoke-test PASSED, harness listing shows full description, hermes/mapping.yaml processes it fine). MEMORY note `feedback_skill_description_length_limit.md` was paranoid — actual limit either raised or never as tight as feared. Hypothesis (c) confirmed. No need for systematic measurement — investigation cost > information value. +**Side effect:** Memory entry `feedback_skill_description_length_limit.md` deleted same commit (no longer load-bearing). YAML colon-space gotcha memory (`feedback_skill_description_yaml_colon_gotcha.md`) kept — different concern, still valid. +**Next action:** (none — closed) +**Branch:** n/a + + + +--- + + +## 🟢 [using-synology-ops-disambiguation-uplift] — Add explicit disambiguation clause to `using-synology-ops` description (sibling parity with `using-vds-ops`). + +**Status:** done (wontfix) +**Where I stopped:** Closed 2026-05-25 — Synology NAS decommissioned, no longer in fleet. Disambiguation between NAS / VDS for shared container names (`traefik` etc.) is moot when only VDS exists. Acceptance criteria no longer have a target. +**Next action:** (none — closed as wontfix) +**Branch:** n/a + + + + +## 🟢 [using-yt-tools-listen-skill-update] — Расширить `skills/using-yt-tools/SKILL.md` поддержкой нового CLI `yt-listen` (audio/FFT analysis). + +**Дизайн-контекст:** +- Спецификация: `mcp__projects-meta__knowledge_get` slug `concepts/yt-tools-audio` в `OpeItcLoc03/common`. +- Process trace: `~/projects/.workshop/.archive/2026-05-25-yt-tools-audio.md`. +- Текущий SKILL.md (v0.3.x): уже триггерится на YouTube URL + transcript/frames; расширить аудио-триггерами и iterative-флоу. + +**Изменения в SKILL.md:** + +1. **`description` frontmatter** — добавить аудио-семантику без раздувания (existing description уже длинноват, аккуратно): + - Новые триггеры: «послушай момент N», «BPM/тональность/гармония видео», «спектрограмма», «что в музыке на T», «listen to fragment», «analyze audio». + +2. **Steps section** — расширить iterative-флоу: + - Для музыкальных URL: `yt-transcript` опциональный (если captions есть), `yt-listen --timestamps T1,T2,...` primary. + - Output: per timestamp — `clip_TTTT.wav` + `spectrum_TTTT.png` + `features_TTTT.md`. + - Агент Read'ом получает spectrum.png (vision) + features.md (числа). + - Помнить: spectrum image-only недостаточен; всегда читать features.md в паре (Dixit et al., arXiv 2411.12058). + +3. **What NOT to do** — точечная защита от scope creep: + - НЕ вызывать Whisper на смешанной музыке (без source-separation = мусор). Если user просит lyrics из музыки — сказать что это отдельный pipeline (Demucs + Whisper), out of scope. + - НЕ интерпретировать spectrum-PNG без features.md. + +4. **Step 0 probe** — добавить проверку `yt-listen` в существующую цепочку (PATH → pipx-shim → legacy venv). + +**Bump:** PATCH (0.3.x → 0.3.(x+1)) — поверхностное расширение, не breaking. + +**TDD-mode:** `claude-skills` имеет `follow tdd-criteria` в CLAUDE.md, но это markdown-документ (SKILL.md), не код — TDD не применим. Behavioral smoke-test покрывается отдельной таской `using-yt-tools-listen-test-trigger`. + +**Status:** done +**Where I stopped:** shipped (fd8a382, NOT pushed per task instruction). SKILL.md v0.3.1 → v0.3.2 PATCH. Изменения: (1) description frontmatter — добавлены audio-триггеры (BPM/тональность/гармония/спектрограмма/listen to fragment/analyze audio); (2) "Three flows" + новый Flow C — audio-analysis под "When to use"; (3) Step 0 probe расширен — yt-listen в install-set (5 binaries вместо 4) + диагностика "только yt-frames без yt-listen = старый 0.1.x"; (4) Inputs-table добавлена Flow C row (--duration, --mode interval, --no-wav, --no-spectrogram, --linear, --chroma, --sample-rate); (5) Steps добавлена "### Flow C — audio-analysis" секция с pipeline-шагами и stdout-контрактом; (6) What NOT to do: точечная защита от Whisper-on-mixed-music (Demucs+Whisper отдельный pipeline, out of scope) + правило "spectrum-PNG только в паре с features.md" (VLM ~50-60% Dixit et al. arXiv 2411.12058). Install.sh не запускался, hermes/mapping.yaml не правился, push отложен (test-trigger разблокирован, но требует чистой сессии). +**Next action:** (none — kept until merged) +2. Прочитать `concepts/yt-tools-audio` из global wiki + workshop archive. +3. Открыть `skills/using-yt-tools/SKILL.md`. +4. Внести изменения по 4 пунктам выше. +5. Bump version в frontmatter (PATCH). +6. Commit: `feat(using-yt-tools): add yt-listen support (audio/FFT) v0.3.`. +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):** + +1. **Trigger activation positive (минимум 4 фразы):** + - «послушай момент 2:30 в этом ролике » → агент вызывает `yt-listen URL --timestamps 2:30`. + - «какой BPM в » → `yt-listen URL` (без timestamp = bulk-mode hint или quick-default). + - «listen to fragment at 1:15 » → `yt-listen URL --timestamps 1:15`. + - «спектрограмма видео » → `yt-listen --timestamps` с хотя бы одним таймкодом (агент должен выбрать sensible default или спросить). + +2. **Trigger activation negative (3 близкие, но не свои):** + - «расшифруй видео » → `yt-transcript`, НЕ `yt-listen`. + - «покажи кадр на 1:23 » → `yt-frames`, НЕ `yt-listen`. + - «о чём этот ролик » → `yt-transcript` + summary, НЕ `yt-listen` (нет музыкального контекста). + +3. **What-NOT-to-do compliance:** + - User: «дай lyrics из <музыкальный URL>» → агент НЕ должен вызывать Whisper / `yt-transcribe-music`; должен объяснить что это отдельный pipeline (Demucs + Whisper), out of scope `yt-listen`. + +4. **E2E против реального URL** (короткий музыкальный клип, e.g. 1-минутный royalty-free track): + - `yt-listen URL --timestamps 0:30 --duration 10s` создаёт 3 артефакта в `./yt-cache//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-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:** done +**Where I stopped:** Закрыто 2026-06-17 попутно при build-integrity фиксе (билд был RED — 5 unmapped-скилов). Запись `meta-host-routing` добавлена в `hermes/mapping.yaml` секцию pending с `intended: {mode: auto, category: meta}` + reason (projects-meta MCP tasks_create/knowledge_ingest/meta_status, cross-repo writes, review PASS но -install + tool-side аудит ещё открыты). Билд зелёный. Schema version не трогал. Commit `43f9912`. +**Next action:** (none — kept until merged). pending→auto только после -install baseline + tool-side аудита. +**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-` 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/.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 | ""` в frontmatter задачи — маркер точки разрыва сессии. + +После закрытия задачи (статус 🟢), ДО `tasks_claim_next`: +1. Прочитать frontmatter закрытой задачи +2. Если `session_break` присутствует — вывести: + `🔚 SESSION BOUNDARY — [slug] закрыта. Рекомендую завершить текущую сессию. Следующий трек: [value | "см. STATUS.md"]` +3. Остановиться, не клеймить следующую задачу + +Без флага — поведение прежнее. + +## Acceptance criteria +- [ ] SKILL.md → v1.2.0 +- [ ] Поле `session_break` задокументировано в frontmatter-конвенциях (тип: bool | string, примеры) +- [ ] Правило проверки: ПОСЛЕ close, ДО claim-next — явно вписано в раздел Task completion +- [ ] Формат SESSION BOUNDARY сообщения зафиксирован дословно + +## Skills +- invoke `using-tasks` (прочитать текущий SKILL.md перед правкой) + +## Permissions +- interns: no +- auto-push: yes + +## Weight +needs-claude + +**Weight:** needs-claude +**Status:** done +**Where I stopped:** Shipped — `skills/using-tasks/SKILL.md` 1.1.0→1.2.0 (MINOR). Added `session_break` marker: (1) optional `**Session break:**` field in the STATUS.md format block + new "### `session_break` marker" subsection documenting type (bool | string) with examples (`true` → "см. STATUS.md", `""` → 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: "" # optional — using-tasks остановится после close и предложит закрыть сессию +``` + +Добавить Q6 в pre-flight gate: +> "Нужен ли разрыв сессии после этой задачи? (domain-switch, milestone, heavy infra)" + +Если да — ставить `session_break: "<название следующего трека или hint>"` в создаваемую задачу. + +Usage guidance (три случая): +1. Смена домена / репо — переход между несвязанными треками +2. Milestone-задача — последняя в группе sub-tasks фичи +3. Тяжёлые инфра-задачи — shared checkout, migrations + +## Acceptance criteria +- [ ] SKILL.md → v0.2.2 +- [ ] Template: поле `session_break` с inline-комментарием и примером +- [ ] Pre-flight Q6 добавлен после Q5 (notify) +- [ ] Usage guidance: три случая когда ставить + +## Skills +- invoke `delegate-task` (прочитать текущий SKILL.md перед правкой) + +## Permissions +- interns: no +- auto-push: yes + +## Weight +needs-claude + +**Status:** 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 | ""]` 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. + +Проверить: +- [x] Правило стоит ПОСЛЕ close, ДО claim-next (не наоборот) +- [x] Формат SESSION BOUNDARY сообщения соответствует дизайну (включает slug и hint) +- [x] Отсутствие флага не меняет поведение (регрессия) +- [x] Версия поднята до 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-тасок в этом же файле (`` в локальном STATUS.md). Альтернатива, которую отверг: `tasks_close confirm:true` — отдал реконсиляцию meta-системы раннеру. +**Next action:** (none — kept until merged) +**Branch:** n/a + + +` в локальном STATUS.md). Альтернатива, которую отверг: `tasks_close confirm:true` — отдал реконсиляцию meta-системы раннеру. --> + +--- + + +## 🟢 [session-break-delegate-task-review] — Review реализации `session_break` в `delegate-task` skill. + +Проверить: +- [x] Q6 добавлен на правильном месте (после Q5 notify) +- [x] Template: поле `session_break` с понятным inline-комментарием +- [x] Usage guidance: три случая явно перечислены +- [x] Версия поднята до 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-review] — Review скила `using-system-snapshot`. + +Проверить: +- [x] 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) +- [x] Запрет на утверждение состояния без вызова snapshot — явно прописан (4 места: Overview core rule, When to use, What NOT to do, Common mistakes) +- [x] Формат вывода достаточно краткий (одна строка на секцию) — 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`. + +- [x] Ориентация действительно идёт через `tasks_get_status`, не Read — **deviation validated** (см. ниже) +- [x] Нет регрессий — полный обзор доски всё ещё работает когда нужен +- [x] Правило архивации 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 мин) → жёсткое предупреждение "⚠️ поллер ведёт `` — нельзя работать параллельно", требовать явного подтверждения 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 + + + +--- + + +## 🟢 [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.md` changed (no versioned artifact), so `meta(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:** /` — inbox-уведомление при завершении +- Без `Weight` — поллер не берёт; `needs-human` — только ручное + +**TDD-фазы:** +1. RED: baseline-субагент без скила — фиксируем пропущены ли поля +2. GREEN: минимальный SKILL.md закрывающий gaps +3. 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:** /` — inbox-уведомление при завершении +- Без `Weight` — поллер не берёт; `needs-human` — только ручное + +**TDD-фазы:** +1. RED: baseline-субагент без скила — фиксируем пропущены ли поля +2. GREEN: минимальный SKILL.md закрывающий gaps +3. 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-процессов. + +**Что делает скил (поведение):** +1. Вызвать `tasks_claim_next` (с учётом POLLER_PROJECTS из env или аргумента) +2. Если задача найдена — прочитать description, выполнить работу в текущей сессии (все инструменты доступны), закрыть через `tasks_close` +3. Если задач нет — **выйти из цикла**, доложить пользователю («очередь пуста»). Не вызывать ScheduleWakeup напустую — это сжигало бы токены каждые N секунд ради пустой проверки. +4. Повторить с п.1 +5. Остановиться при явном сигнале пользователя (сообщение в чат) или при `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:** +1. Агент с скилом корректно claim → work → close → repeat +2. При отсутствии задач — останавливает цикл (не polling, не ScheduleWakeup), сообщает пользователю +3. При ошибке в задаче — паркует (tasks_update status=paused), не виснет +4. Heartbeat: либо документировано как использовать с длинным TTL, либо со ссылкой на `heartbeat-side-channel` +5. Скил задокументирован по стандарту superpowers (frontmatter name/description, CSO-оптимизация) +6. 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-процессов. + +**Что делает скил (поведение):** +1. Вызвать `tasks_claim_next` (с учётом POLLER_PROJECTS из env или аргумента) +2. Если задача найдена — прочитать description, выполнить работу в текущей сессии (все инструменты доступны), закрыть через `tasks_close` +3. Если задач нет — `ScheduleWakeup(60s)`, ждать +4. Повторить с п.1 +5. Остановиться при явном сигнале пользователя (сообщение в чат) или при `budget.remaining() < threshold` + +**Только скил, программных изменений нет.** Все нужные инструменты (`tasks_claim_next`, `tasks_close`, `ScheduleWakeup`) уже существуют. + +**TDD — обязательно:** +- Сначала написать baseline сценарий (subagent без скила): агент получает задачу, что он делает? Зафиксировать нарушения. +- Написать SKILL.md закрывающий эти нарушения +- Прогнать compliance-сценарий с скилом: агент следует loop корректно +- Проверить edge cases: нет задач, задача провалилась, пользователь прервал + +**Acceptance criteria:** +1. Агент с скилом корректно claim → work → close → repeat +2. При отсутствии задач — ждёт через ScheduleWakeup, не крашится +3. При ошибке в задаче — паркует (tasks_update status=paused), не виснет +4. Heartbeat: либо документировано как использовать с длинным TTL, либо со ссылкой на `heartbeat-side-channel` +5. Скил задокументирован по стандарту superpowers (frontmatter name/description, CSO-оптимизация) +6. 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-tasks` session_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 `CronCreate` for long-watch → loophole; reworded long-watch to mandate `ScheduleWakeup` (this session) and forbid `CronCreate` (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 (две стороны + тест):** +1. **Output (главное):** в начало `stop-dispatcher.ps1` — `[Console]::OutputEncoding = [System.Text.Encoding]::UTF8` (и `$OutputEncoding` для надёжности). Низкий риск, идемпотентно. +2. **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. +3. **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 пришёл ЧИСТО (до фикса то же тело давало `������᪮�`); 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 + + + +--- + + +## 🟢 [inter-session-peer-discipline-test-trigger] — Baseline-таска промоушена `inter-session-peer-discipline`. Прогнать триггер-фразы из description на тестовом буфере: скил активируется на своих (обмен сообщениями с другой сессией через inbox / peer-канал, `.claude-inbox/`, inter-session messaging) И НЕ активируется на 2-3 близких чужих — поднятие монитора инбокса (→ session-inbox-monitor), мультимашинный backend (→ cross-machine-inbox). False-positive check. **ТОЛЬКО чистая не-имплементер сессия** (эта ставила скил и гоняла субагентов → недостоверна). + +**Контекст:** скил доустановлен 2026-06-17 (фикс received-msg FP, см. `session-inbox-monitor-received-msg-fp` + `.wiki/concepts/session-inbox-monitor-received-msg-fp.md`); добавлен в `hermes/mapping.yaml` mode:pending. Дисциплина: peer = предложение, не authority — этот скил кодифицирует именно это. +**Weight:** needs-human +**Status:** done +**Where I stopped:** **VERDICT PASS**, прогнано 2026-06-17 в чистой не-имплементер сессии (этот контекст НЕ ставил скилы, НЕ трогал хук/SKILL.md, НЕ гонял прошлый test-trigger — только поднял Monitor по SessionStart-инжекту + прочитал handoff; ревью вынесено непрайменными субагентами, не моим впечатлением). **Метод:** clean-context субагенты (general-purpose, НЕ fork), каждая фраза — отдельный субагент, одинаковый реалистичный срез registry с настоящими описаниями скилов, без подсказки правильного ответа. **Positives 4/4 → inter-session-peer-discipline (все high):** P1 RU «письмо от другой сессии — договорились переписать X, как трактовать», P2 EN «peer says we decided to expand scope — settled?», P3 RU «отвечаю отправителю, что учесть про авторитетность», P4 EN «session keeps sending rulings — treat vs human?». **False-positive для peer: 0** — ни одна из 5 чужих фраз (3 monitor-raise + 2 multi-machine backend) не активировала peer-discipline. Зеркало N1-FP (received-msg) теперь чисто. Acceptance выполнен. **Observation (не дефект peer):** RU multi-machine backend фраза (X2) слабо потянула `session-inbox-monitor` (low-conf) через его disambiguation-указатель `→ cross-machine-inbox design`, тогда как EN-близнец (X1) дал NONE; gated на не-установленный `cross-machine-inbox` — учтено в `-review` session-inbox-monitor, не в этой ленте. +**Next action:** (none — kept until merged). Разблокирован `-review` (этой же сессией закрыт, см. ниже). +**Branch:** n/a +**Notify:** OpeItcLoc03/workshop + + + +--- + + +## 🟢 [inter-session-peer-discipline-review] — Skill-review checkpoint для `inter-session-peer-discipline`. НЕ-имплементер. Поведенческий smoke-test: активация на своих/не на чужих (RU+EN); тело SKILL.md (proposal-not-authority, human-ratification gate, echo-chamber guard) соответствует реальности и не противоречит inter-session-messaging правилам в CLAUDE.md. Findings → tasks_create. + +**Blocker:** (cleared — `-test-trigger` 🟢 этой же сессией) +**Weight:** needs-human +**Status:** done +**Where I stopped:** **VERDICT PASS** 2026-06-17, не-имплементер сессия. (1) **Активация своих/не чужих RU+EN** — покрыто `-test-trigger` тем же прогоном: 4/4 свои (P1-P4 RU+EN) → peer; 5 чужих (monitor/backend) 0 ложных срабатываний. (2) **Тело SKILL.md ↔ заявленные принципы (v0.1.1):** все три на месте — *proposal-not-authority* → «The rule» п.1 «Peer ≠ authority» + «Channel contract» (inbox = только канал связи, доска через `tasks_*` = источник истины); *human-ratification gate* → п.3 «Escalations need an explicit human yes» + Circuit-breaker; *echo-chamber guard* → «The failure mode this guards» (echo-chamber signature: быстрое согласие + рост scope каждый раунд) + изоморфизм `user_context_agents_path_of_least_resistance`. WHY-обоснования субагентов P1-P4 независимо артикулировали ровно эту семантику (proposal/ratification/echo-chamber) → тело транслируется в верное поведение. (3) **Не конфликтует с глобальным CLAUDE.md §inter-session-messaging:** CLAUDE.md задаёт механику (Write в inbox отправителя, признать получение, ответить); peer-discipline добавляет комплементарный governance-слой (содержание = proposal, scope ратифицирует человек) и явно ссылается на `~/.claude/CLAUDE.md §"Inter-session messaging"` в Reference. (4) **Бонус-зрелость:** «Multi-session caveat — don't cry override from partial vision» (живой кейс 2026-06-16) защищает от over-call при частичной видимости ратификаций — согласуется с governance-заметкой хэндоффа. **Findings: нет блокирующих.** Informational: SKILL.md строка 22-23 предлагает session-start trigger-line `inter-session messaging: peer not authority`, но она НЕ добавлена в проектный CLAUDE.md — by-design (скил ситуативный, активируется по контексту обмена, не session-start raise); добавлять не требуется. +**Next action:** (none — closed by review, нет блокирующих findings; семвер дальше — владелец claude-skills). +**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:** done +**Weight:** needs-human +**Where I stopped:** **VERDICT PASS** 2026-06-17, чистая не-имплементер сессия (этот контекст НЕ ставил скилы / НЕ трогал хук / НЕ гонял прошлый test-trigger; trigger-проверка и структурный аудит вынесены независимыми clean-context субагентами, не моим впечатлением). Зонтичное ревью. +**(1) Активация RU+EN / не на чужих** — 3/3 monitor-positive чисто → session-inbox-monitor (high): «подними монитор почты», «raise inbox monitor / auto-arm watcher», «настрой авто-монитор инбокса». Negatives: X1 EN multi-machine backend → NONE ✅; X2 RU multi-machine backend → session-inbox-monitor **low-conf** ⚠️ (зацеп за disambiguation-указатель `→ cross-machine-inbox design`). FP-finding `received-msg-fp` учтён как **RESOLVED via (b)** — не open. +**(2) SessionStart sweep+inject** — PASS. Sweep прибивает осиротевшие мониторы ИМЕННО этого инбокса по dual-key (`CLAUDE_INBOX_MONITOR` сентинел + forward-slash inbox-путь), Stop-Process -Force, строго ДО inject. Inject поднимает РОВНО один Monitor (`while…sleep 15` — это poll-loop внутри одного Monitor, не N мониторов; де-дуп по имени файла). Headless: хук НЕ детектит, skip делегирован агенту — задокументировано (нет надёжного hook-level сигнала), тело ↔ хук консистентны. +**(3) Stop-хук block-fix** — PASS, цикла нет. Сообщения MOVE в `.read/` ДО построения block-reason; `$inboxContext` непуст только при наличии файлов прямо в `.claude-inbox/` → после слива следующий Stop видит пустой инбокс → guard `if ($inboxContext)` ложен → block не ставится. Locked-файл: `catch{continue}` пропускает, не клинит. +**(4) Тело SKILL.md ↔ реальность** — PASS. Каждое утверждение (sweep per-inbox, де-дуп по имени, opt-in gate, fires on startup/resume/clear/compact, Stop force-deliver→.read, /clear не триггерит SessionEnd, mojibake-fix в stop-dispatcher) сверено с кодом хука — совпадает. Repo-копия и установленная `inbox-monitor.ps1` байт-идентичны. +**Findings:** 1 CONCERN (latent) → follow-up `session-inbox-monitor-encoding-guard-followup` (ниже): `inbox-monitor.ps1` не выставляет `[Console]::OutputEncoding=UTF8` (есть в stop-dispatcher); сегодня безопасно (`$ctx` ASCII), но inbox-путь интерполируется в stdout → latent mojibake если появится non-ASCII путь/контент. Informational (не tasks): X2 RU-backend low-conf pull (gated на не-установленный cross-machine-inbox); micro-note D — тело ссылается на `interactive-lock.ps1` твин, но логика inline в stop-dispatcher через `interactive-lock-cli.js` (cross-ref на sibling, не self-claim). +**hermes:** PASS ревью НЕ снимает гейт pending→auto — держать **pending** до tool-side аудита (settings.json write, Get-CimInstance|Stop-Process kill, Monitor raise), как в хэндоффе. +**Next action:** (none — closed by review; семвер дальше — владелец claude-skills). +**Blocker:** (cleared — 5 baseline/content + test-trigger все 🟢) +**Branch:** n/a +**Notify:** OpeItcLoc03/workshop + + + +--- + + +## 🟢 [session-inbox-monitor-encoding-guard-followup] — Forward-guard: `skills/session-inbox-monitor/hooks/inbox-monitor.ps1` (SessionStart-инжектор) не выставляет `[Console]::OutputEncoding`, которое уже есть в `stop-dispatcher.ps1`. Found at `-review` 2026-06-17 (structural audit item E, CONCERN). + +**Симптом (latent, не активный):** хук эмитит `ConvertTo-Json` ($ctx + $cmd) в stdout под тем же WinPS-5.1 redirected-pipe путём, что ловил mojibake в stop-dispatcher (см. закрытую `session-inbox-monitor-stophook-utf8-fix`). Сегодня безопасно — `$ctx`/`$cmd` чистый ASCII (комменты намеренно используют `-`, не `—`). НО: inbox-путь (`$inboxFwd`) — user-data — интерполируется в stdout (строка ~78); если в пути или в `$ctx` появится non-ASCII символ, additionalContext придёт искажённым. Файл без BOM и без OutputEncoding-guard. + +**Fix (one-liner):** добавить `[Console]::OutputEncoding = [System.Text.Encoding]::UTF8` (и `$OutputEncoding` для надёжности) в начало `inbox-monitor.ps1` — зеркало stop-dispatcher. Низкий риск, идемпотентно. После — re-deploy в `~/.claude/hooks/` (hash-parity) + bump SKILL.md PATCH (forward-guard в Failure modes/Side effects). +**Альтернатива (wontfix):** принять как осознанный latent risk, задокументировать «inbox-monitor.ps1 ASCII-only by contract» в SKILL.md — но guard дешевле инварианта «никогда не клади non-ASCII в inbox-путь». + +**Weight:** needs-human +**Status:** done +**Where I stopped:** Шипнуто 2026-06-17 — выбран **fix** (one-liner дешевле инварианта «ASCII-only»). (1) В `inbox-monitor.ps1` после `$ProjectDir`-гейта добавлен `[Console]::OutputEncoding = [System.Text.Encoding]::UTF8` + `$OutputEncoding` (зеркало stop-dispatcher), с комментарием про redirected-pipe forward-guard; текст коммента чистый ASCII (не вношу non-ASCII в сам source). (2) **Регрессия под WinPS 5.1 (тот же движок):** parse 0 ошибок; прогон хука против проекта с кириллическим путём (`тест-инбокс-кириллица`) через Start-Process→RedirectStandardOutput; raw-байты прочитаны как no-BOM UTF-8 → JSON валиден, кириллический путь в `additionalContext` round-trip'нулся БЕЗ искажения. (3) Re-deploy в `~/.claude/hooks/inbox-monitor.ps1` — **SHA256 byte-identical** с репо (бэкап `.bak-encguard`). (4) SKILL.md Mojibake failure-mode расширен (инжектор несёт тот же guard), bump 0.2.1→**0.2.2 PATCH**. NB: install/hermes/dist-rebuild не трогал — для PATCH достаточно reload-plugins (как в прошлых yt-tools/using-tasks PATCH-закрытиях); установленный хук — то, что работает в рантайме, он обновлён. +**Next action:** (none — kept until merged). При желании — `/reload-plugins` чтобы установленная копия SKILL.md (docs) подтянула 0.2.2; рантайм-поведение уже на месте (хук задеплоен). +**Branch:** master +**Notify:** OpeItcLoc03/workshop + + + +--- + + +## 🟢 [context7-cli-skill] — Переделать using-context7 с MCP-привязки на CLI-first (идея 16): pi не видит context7 (мост claude-mcp-bridge читает только ~/.claude.json, context7 живёт в ~/.claude/settings.json как HTTP MCP https://mcp.context7.com/mcp). Решение: using-context7 v2 — CLI `ctx7` (npm v0.5.8) + скил в суверенном каталоге; любой агент вызывает ctx7 в bash без MCP-регистрации. API-ключ ctx7sk-… из ~/.claude/settings.json → разовая конфигурация в ~/.config/projects-secrets/ (паттерн interns.env). Принцип: CLI-first (обзор инструментов 2026-08-11), как browser-cdp против Chrome DevTools MCP. + +**Status:** done +**Where I stopped:** using-context7 v1.0.0 → v2.0.0: MCP-bound → CLI-first (ctx7 npm). Проверено: ctx7 library/docs работают АНОНИМНО (ключ не нужен — он для MCP/rate-limit; ctx7 login для лимитов, опционально). Секреты не плодили — перенос ключа в projects-secrets НЕ делаем (не нужен, анонимный путь достаточен). Git Bash-нюанс задокументирован (//owner/repo). Установлено в ~/.claude/skills, линт чист. setup-context7 остаётся для MCP-маршрута (ctx7 setup), но канон = CLI. +**Next action:** (none — kept until merged) +**Branch:** n/a + + + +--- + + +## 🟢 [rename-repo-to-skills] — Ренейм репо/папки claude-skills → skills (идея 11 буфера .workshop/.brainstorm/claude-to-agents.md): снять историческую привязку к claude. Шаги: (1) Gitea-ренейм OpeItcLoc03/claude-skills → OpeItcLoc03/skills; (2) локальная папка + git remote set-url; (3) правки ссылок: scripts/update.{sh,ps1} (URL), build-hermes.py, project-bootstrap, hermes/mapping.yaml installer_path (meta/claude-skills-installer); (4) ренейм скила update-claude-skills → update-skills (semver-bump, hermes-mapping, баслайны); (5) ресинк кэша projects-meta + миграция ~6 таск-таргетов OpeItcLoc03/claude-skills → OpeItcLoc03/skills; (6) верификация: свежий клон с нового URL, греп старого имени = 0 в живых ссылках. + +**Status:** done +**Where I stopped:** Gitea OpeItcLoc03/claude-skills → OpeItcLoc03/skills (301 redirect). Локальная папка → projects/skills, remote обновлён. Ссылки: scripts/update.{sh,ps1}, build-hermes.py, project-bootstrap, project-discipline, pulling-before-work, recommend-dont-menu, active-platform, inter-session-peer-discipline, using-projects-meta, using-system-snapshot, README.md, hermes/mapping.yaml (installer_path + entry). update-claude-skills → update-skills v0.2.0 (+ установленная копия в ~/.claude/skills). poller-scope.json → OpeItcLoc03/skills. Кэш projects-meta ресинкнут (46 проектов, 0 ошибок). Остаточные ссылки: исторические .tasks/.read/закрытые + using-yt-tools стаб (удаляется в skill-frontmatter-lint). +**Next action:** (none — kept until merged) +**Branch:** n/a + + + +--- + + +## 🟢 [skill-frontmatter-lint] — Линт SKILL.md по спецификации Agent Skills (идея 17, найдено pi-линтом 2026-08-11): (1) починить YAML-frontmatter using-interns (description неэкранированный plain-scalar, «Rule 4: ask-mode») + сократить ≤1024 (сейчас 1076); (2) сократить description ≤1024: using-vds-ops (1097), using-wiki-graph (1132); (3) удалить deprecated-стаб using-yt-tools (YAML сломан, противоречив — «no trigger phrases» при наличии триггеров в description; контент мигрировал в plugin OpeItcLoc03/yt-tools); (4) линт-скрипт (YAML парсится + description ≤1024 + обязательные поля) в пайплайн при update-skills. Верификация: скрипт-линт по всем SKILL.md = 0 ошибок. + +**Status:** done +**Where I stopped:** using-interns v0.3.1 (YAML block-scalar + desc 788), using-wiki-graph v0.1.1 (desc 776), ralph-loop-execution получил frontmatter (name/version/description — раньше вообще без него, не активировался). using-yt-tools стаб удалён (репо + ~/.claude/skills). using-vds-ops в репо уже был ок (932) — переустановлен (инсталл был stale 1097). Добавлен scripts/lint-skills.py (YAML + description≤1024 + required fields; missing version = warning) + встроен в update.{sh,ps1} перед install. Линт: репо и ~/.claude/skills = 38 скилов, 0 violations (6 soft warnings: legacy без version). +**Next action:** (none — kept until merged) +**Branch:** n/a + + + +--- + + ## 🟢 [sovereign-catalog-wave2-review] — Review каталога после волны 2 фазы 1 (не-имплементер сессия). Scope: (1) провенанс author/adapted-from во всех скилах + scripts/add-provenance.py (commit ab51c2e); (2) project-bootstrap v1.13.0 de-superpowers (шаблон, таблица триггеров); (3) tdd-criteria v0.3.0 секция Test quality (commit 2edcb0e); (4) grilling v0.2.0 — семейство схлопнуто из 3 в 1 (commits 6204e8c, ff68762), Docs-режим; (5) README Sovereignty/Adapted-from (en+ru). Проверять: дискриминация триггеров чистыми pi -p субагентами (5 pos → grilling, 4 neg чисто), lint 0/0, dist 39, ~/.claude/skills синхрон, семвер-бампы корректны. Evidence-метод: clean-context не-имплементер субпроцессы (pi -p). **Status:** done @@ -1149,5 +1149,175 @@ Findings → follow-up tasks в claude-skills. --- - - + + +## 🟢 [project-discipline-dist-rebuild] — dist/project-discipline.skill устарел (v0.1.2 внутри vs source v0.2.0) — коммит 42ed5ea не пересобрал пакет (нарушение Rule 3). Найдено: sovereign-catalog-wave2-review (F1). + +**Status:** done +**Where I stopped:** closed without action — починено воркшопом upstream (d7903c3): dist/project-discipline.skill пересобран, внутри version: 0.2.1. — 42ed5ea bumped project-discipline v0.1.2→v0.2.0 (Rule 4 push-freely) коснувшись только skills/project-discipline/SKILL.md; dist/project-discipline.skill несёт v0.1.2 (ask-before-push семантика). update-skills раскатит старый пакет. +**Next action:** (none — done upstream d7903c3) +** Пересобрать: bash scripts/build.sh --prune (или build.ps1 -Prune) → проверить version: 0.2.0 внутри dist/project-discipline.skill (unzip -p ... | grep ^version); commit "build(project-discipline): rebuild dist archive v0.1.2→v0.2.0". Автор фикса — имплементер 42ed5ea. +**Branch:** master +**Weight:** cheap-ok +**Notify:** OpeItcLoc03/workshop + + +--- + + + + +## 🟢 [project-discipline-description-contradiction] — frontmatter description в project-discipline самопротиворечив: новое Rule 4 (push freely) + остаток старого grant-текста («разреши автопуш», session end resets to ask-mode) + Rule 5 продублирован (L13-15 и L18-20). Description идёт в available-skills system prompt → другие проекты получают противоречивую push-политику. Найдено: sovereign-catalog-wave2-review (F2). + +**Status:** done +**Where I stopped:** closed without action — починено воркшопом upstream (d7903c3): grant-текст + дублированный Rule 5 вычищены из description, source v0.2.1. — skills/project-discipline/SKILL.md L11-20: L11-15 новое Rule 4 + L16-17 старый grant-текст «— grant via "разреши автопуш"…» + L18-20 дубль Rule 5. Тело (L82-103) корректно (push-gate модель). +**Next action:** (none — done upstream d7903c3) +** Переписать description: выкинуть grant-текст («разреши автопуш»/«allow auto-push»/session reset), свести Rule 5 в один пункт, сохранить push-gate-нюанс (books — auto-deploy). Сверить с телом Rule 4. Bump: PATCH 0.2.1 (текст-фикс) — решение при исполнении. Автор фикса — имплементер 42ed5ea. +**Branch:** master +**Weight:** needs-claude +**Notify:** OpeItcLoc03/workshop + + +--- + + + + +## 🟢 [de-superpowers-skill-readmes] — 3 per-skill README ещё несут superpowers-ссылки после волны de-superpowers: project-bootstrap/README.md:47 (фактически врёт про шаблон — «use superpowers» уже удалён из CLAUDE.md.template), project-discipline/README.md:13 (docs/superpowers/ пути), recommend-dont-menu/README.md:7 (superpowers:brainstorming). Найдено: sovereign-catalog-wave2-review (F4). + +**Status:** done +**Where I stopped:** done — 3 README вычищены (bootstrap L47 под актуальный шаблон; discipline L13 без docs/superpowers/ + заодно стейл Rule 4 «Commit yes, push no» → «Push freely by default» — тот же класс, что F2; recommend-dont-menu L7 без superpowers:brainstorming). dist пересобран (build.ps1 -Names), lint 39/0. +**Next action:** (none — done) +**Branch:** master +**Weight:** cheap-ok +**Notify:** OpeItcLoc03/workshop + + + +--- + + +## 🟢 [skills-live-claudemd-superpowers-trigger] — корневой CLAUDE.md репо skills всё ещё содержит триггер «use superpowers» (L5); шаблон project-bootstrap уже без него (de-superpowers), свой файл не перегенерирован. Найдено: sovereign-catalog-wave2-review (F5). + +**Status:** done +**Where I stopped:** done — «use superpowers» удалён из корневого CLAUDE.md; остальные 12 триггерных строк сверены с установленными скилами (все валидны: caveman, using-wiki, using-tasks, using-projects-meta, pulling-before-work, session-handoff, session-inbox-monitor, project-discipline, tdd-criteria, using-interns, recommend-dont-menu, active-platform). +**Next action:** (none — done) +**Branch:** master +**Weight:** cheap-ok +**Notify:** OpeItcLoc03/workshop + + + +--- + + +## 🟢 [using-tasks-archive-path-fix] — `skills/using-tasks/SKILL.md` документирует `.tasks/archive/YYYY-MM.md`, реальная конвенция репо — `.tasks/.archive/done-YYYY-MM.md` (см. `done-2026-05.md`, `done-2026-08.md`). Найдено: sovereign-catalog-wave2-review (finding, передано воркшопу 13:43Z). + +**Status:** done +**Where I stopped:** done — SKILL.md v1.4.0→v1.4.1 (PATCH): 5 путей исправлены (layout → `.archive/done-YYYY-MM.md`, intro, «Where» + commit-пример + Rules-буллет → `.tasks/.archive/done-YYYY-MM.md`), README чист. dist пересобран (build.ps1 -Names using-tasks), lint 39/0. Фикс: `bff9c62`. +**Next action:** (none — done) +**Branch:** master +**Weight:** cheap-ok +**Notify:** OpeItcLoc03/workshop + + + + +## 🟢 [brainstorming-skill-review] — Review нового скила `brainstorming` v0.1.0 (не-имплементер сессия). Scope: `skills/brainstorming/SKILL.md` + dist + README (commit 5d2e455) — адаптация diverging-фазы из obra/superpowers @ 6.2.0 (MIT) под наши конвенции. + +## Обязательные скилы — вызвать до начала работы + +- invoke `pulling-before-work` — `git pull --ff-only` ПЕРЕД началом ревью (свежий origin, никаких рассинхронов); это же правило при коммите отчёта: pull перед push +- invoke `using-tasks` — статус задачи + +Проверять: (1) HARD-GATE «не имплементировать без одобренного дизайна» присутствует и не ослаблен; (2) spec-location соответствует project-discipline rule 1 (.brainstorm/ в зоне, .wiki/concepts/ в проектах); (3) триггер-дискриминация чистыми pi -p субагентами: «забрендшторми», «поштормим», «накидай идеи», "brainstorm this" → brainstorming; «прогриль мой план» → grilling (не коллизит); «порекомендуй» → recommend-dont-menu (не коллизит); (4) lint 0/0, dist/brainstorming.skill пересобран, ~/.claude/skills/brainstorming синхронен, adapted-from пин корректен (obra/superpowers @ 6.2.0); (5) переход в grilling/промоушен описан, а не в writing-plans. Evidence-метод: clean-context не-имплементер субпроцессы (pi -p). Отчёт писать в .workshop/.brainstorm/brainstorming-skill-review.md. Полосы: доска skills — твоя (close/push), .workshop — моя; отчёт в .workshop — единственное твоё касание зоны. + +**Status:** done +**Where I stopped:** VERDICT PASS 6/6 (HARD-GATE, spec-location Rule 1, transition grilling/промоушен, lint 42/0, dist 0/42, pin obra/superpowers @ 6.2.0, README en+ru). Trigger-дискриминация clean pi -p: pos 4/4 → brainstorming, neg 2/2 (прогриль→grilling, порекомендуй→recommend-dont-menu) без коллизий. 3 информационных findings (using-tasks 1.4.0 installed vs 1.4.1 — вне скоупа; каталог 42 — diagnosing-bugs/writing-skills не ревьюились; протокол полос соблюдён). Отчёт: .workshop/.brainstorm/brainstorming-skill-review.md. +**Next action:** (none — closed by review, VERDICT PASS) (не имплементер): 1) invoke pulling-before-work (pull --ff-only); 2) clean-context pi -p субагенты для триггер-дискриминации + статическая проверка SKILL.md/dist/README; 3) отчёт в .workshop/.brainstorm/brainstorming-skill-review.md; 4) pull перед push доски +**Branch:** n/a +**Notify:** OpeItcLoc03/workshop + + +--- + + +## 🟢 [diagnosing-bugs-writing-skills-review] — Review новых скилов `diagnosing-bugs` + `writing-skills` (v0.1.0 оба, не-имплементер сессия). Scope: HARD-GATE не ослаблен (diagnosing: no fixes w/o root cause; writing: no skill w/o failing test); анти-дубль гард (anti-sproul 45+); триггер-дискриминация clean pi -p (коллизии: «зафиксируй» в writing-skills вс гриллинг docs-mode, «почему падает» вс using-vds-ops инциденты); lint/dist/install/pin/README. + +**Status:** done +**Where I stopped:** VERDICT PASS. HARD-GATE'ы целы (no-fixes-without-root-cause / no-skill-without-failing-test), anti-sproul жив, lint 45/0, dist/install sync, pins ok (mattpocock 84fdeffd + obra 6.2.0), README en+ru. Trigger clean pi -p: db 2/2 pos + 1/1 neg; ws 2/2 pos + 2/2 neg; F1: bare «почему падает» → system-snapshot, с субъектом работает; F2: «зафиксируй» пересекается с grilling docs-mode (контекст решает). Отчёт: .workshop/.brainstorm/diagnosing-bugs-writing-skills-review.md. +**Next action:** (none — closed by review, VERDICT PASS) clean-context pi -p субагенты (пос и нег для обоих скилов) + статика; отчёт в .workshop/.brainstorm/diagnosing-bugs-writing-skills-review.md; pull перед push. +**Branch:** n/a +**Notify:** OpeItcLoc03/workshop + + +--- + + + +## 🟢 [session-ritual-context7-pins-review] — Не-имплементер ревью трёх изменений волны «7, 16 и 2» (commit 7b80a32): (1) session-handoff v0.4.0 — ритуал закрытия (idea 7: на session-end агент сам предлагает wiki-ingest + закрытия тасок; мутации = предложения, не молча; ритуал только на session-end фразе, не на substantive commit); (2) setup-context7 v2.0.0 — CLI-first переписывание (idea 16: установка ctx7 CLI, ключ в ~/.config/projects-secrets/ctx7.env, миграция с MCP-плагина — uninstall + чистка mcpServers.context7; подтверждение перед мутациями; smoke через ctx7 library); (3) vendored pins backfill (idea 2: caveman×5 → JuliusBrussee/caveman @ 0993277, find-skills → vercel-labs/skills @ c6f69c6, PATCH 0.1.1/1.0.1). Scope: HARD-GATE'ы (ритуал не пишет молча; setup-context7 не мутирует без подтверждения), триггер-дискриминация (ритуал vs using-tasks «закрываем эту таску»; «настрой context7» vs using-context7), lint/dist/install parity, README-таблица провенанса, description ≤1024 (idea 17). + +**Status:** done +**Where I stopped:** VERDICT PASS. Гейты целы (ритуал=предложения+явное «да», setup-context7=паузы перед мутациями); дискриминация 4/4 (сворачиваемся→ritual, закрываем-эту-таску→using-tasks, настрой context7→setup, как использовать→using-context7); lint 45/0; dist 8/8; install sync; description 684/699<1024; бампы MINOR/MAJOR/PATCH адекватны; pins 0993277/c6f69c6 в frontmatter+en. F1: README.ru L84-85 «TBD» → follow-up readme-ru-pins-backfill. Отчёт: .workshop/.brainstorm/session-ritual-context7-pins-review.md. +**Next action:** (none — closed by review, VERDICT PASS; follow-up readme-ru-pins-backfill) Прогнать clean-context review (review-kit-pi-method): структурный аудит трёх SKILL.md + lint 45/0 + dist parity + триггер-дискриминация pi -p для session-handoff (session-end фразы) и setup-context7. Вердикт → письмо в skills/.agents/inbox/ или закрытие таски. +**Branch:** n/a +**Notify:** OpeItcLoc03/skills + + +--- + + + +## 🟢 [readme-ru-pins-backfill] — README.ru.md строки 84-85 всё ещё «пин апстрима TBD» для caveman×5 и find-skills; 7b80a32 обновил en README + frontmatter (0993277 / c6f69c6), ru пропущен. Найдено: session-ritual-context7-pins-review (F1). en+ru parity — контракт каталога. + +**Status:** done +**Where I stopped:** F1 закрыт: README.ru.md L84-85 обновлены (0993277 / c6f69c6), commit eb79b43, en+ru parity восстановлена. +**Next action:** (none — kept until merged) +**Branch:** master +**Weight:** cheap-ok +**Notify:** OpeItcLoc03/workshop + + + +--- + + +## 🟢 [session-close-ritual-pi-extension] — Headless-часть ритуала закрытия (idea 7, claude-to-agents): pi-extension на `agent_settled` (по образцу inbox-monitor в .common/lib/pi-extensions/), который инжектит агенту сообщение «прогони ритуал закрытия» ОДИН раз за сессию (дедуп-гард, иначе петля agent_settled → ритуал → снова agent_settled). Интерактивная часть уже в session-handoff v0.4.0 (мутации = предложения, явное «да»). Деплой byte-identical в ~/.pi/agent/extensions/, функциональные тесты (положительный + decoy). + +**Status:** done +**Where I stopped:** Extension built, tested, deployed: .common/lib/pi-extensions/session-close-ritual.ts (source) → ~/.pi/agent/extensions/ byte-identical. agent_end (не agent_settled — settle = no-followup-left, teardown) + hasUI=false guard + opt-in (CLAUDE.md trigger-line + .tasks/ + .git) + per-session loop-guard. Функциональные тесты 6/6 (positive once+loop, no-opt-in, no-.tasks, no-.git, interactive-skip, session-reset). Live: headless pi -p в opt-in проекте — ритуал выполнен: handoff-write по шаблону (frontmatter, recent commits, open треки, «Спроси user'а» с предложениями), wiki-ingest/закрытия — предложения, молча ничего не закрыто, лупы нет. Коммит .common d10da8d. +**Next action:** (none — done, deployed; /reload в pi подхватит) Взять за образец .common/lib/pi-extensions/inbox-monitor.ts (PULL на agent_settled + дедуп per-process). Написать session-close-ritual.ts: on('agent_settled') → один раз за сессию инжект «выполни ритуал закрытия сессии (session-handoff v0.4.0): handoff-write + предложи wiki-ingest + предложи закрытия тасок». Тесты: прогон с реальным агентом — ритуал запускается ровно один раз, повторный agent_settled не триггерит. +**Branch:** n/a +**Notify:** OpeItcLoc03/skills + + +--- + + + +## 🟢 [session-close-ritual-extension-review] — Не-имплементер ревью pi-extension `session-close-ritual.ts` (headless-часть ритуала закрытия, idea 7). Скоуп: (1) структурный аудит кода — `.common/lib/pi-extensions/session-close-ritual.ts` (5473 B, dependency-free): opt-in логика (CLAUDE.md trigger-line + `.tasks/` + `.git`), loop-guard per-session-per-cwd, выбор `agent_end` vs `agent_settled` (обоснование в шапке файла), headless-only guard (`hasUI===false`), граница мутаций в инжектируемом сообщении (только handoff-write, wiki/закрытия — предложения); (2) тесты `.test.mjs` — покрывают ли 6 кейсов заявленных (positive once+loop, no-opt-in, no-.tasks, no-.git, interactive-skip, session-reset); (3) деплой byte-identical `~/.pi/agent/extensions/` vs source; (4) live-поведение: headless pi -p в opt-in проекте — ритуал ровно один раз, без лупы. Автор импл = тот же сессия что закрыла session-handoff ревью (anti-self-review обойдён) — ревью нужно для чистоты зоны. Commit: .common d10da8d, таска session-close-ritual-pi-extension 🟢. + +**Status:** done +**Where I stopped:** (formal verdict appended after close) ФОРМАЛЬНОЕ ревью: VERDICT PASS + 2 LOW + 1 INFO, все пофикшены (LOW-1 rpc-decoy b11, LOW-2 mutation-boundary assert в b1, INFO per-cwd b12). Тесты 6→10→12/12, .common fb4ce3f, деплой byte-identical, live 1× без мутаций кроме handoff-write. agent_end-рационал подтверждён по исходникам pi (agent-session.js:779-780). +**Next action:** (none — kept until merged) +**Branch:** n/a +**Notify:** OpeItcLoc03/skills + + + +--- + + +## 🟢 [command-index-review] — Не-имплементер ревью нового скила `command-index` v0.1.0 (idea 3, claude-to-agents: just/Makefile как единый интерфейс управления проектом). Scope: (1) конвенция корректна — стандартные таргеты setup/test/lint/build/run/clean/help, help/--list = авто-док, just>make на Windows (идея 18: нативный бинарь, без sh); (2) анти-спроул — покрытия нет (в каталоге не было command-index/project-contract); (3) триггер-дискриминация clean pi -p: «как тут запускается» / «как собрать, запустить, протестить» → command-index, вход в проект с justfile → command-index; neg: «настрой таски» → setup-tasks, «как юзать вики» → using-wiki (не путать с setup-скилами и using-*); (4) lint 46/0, dist/install parity, description ≤1024. Follow-up (не скоуп): project-bootstrap эмитит justfile при бутстрапе. + +**Status:** done +**Where I stopped:** VERDICT PASS. Конвенция корректна (таргеты setup/test/lint/build/run/clean/help, авто-док, just>make Windows); анти-спроул чист (ours); дискриминация clean pi -p: P1/P2 → command-index, N1 → setup-tasks, N2 → using-wiki; lint 46/0; dist/install sync; description 800≤1024. F1: README (en+ru) без строки → follow-up readme-command-index-row (с F2 стейл install.ps1). Отчёт: .workshop/.brainstorm/command-index-review.md. +**Next action:** (none — closed by review, VERDICT PASS; follow-up readme-command-index-row) Прогнать clean-context review: структурный аудит SKILL.md против конвенции (стандартные таргеты, авто-док, just>make, НЕ-список), триггер-дискриминация pi -p (2-3 pos + 2 neg), lint 46/0, dist/install parity, description ≤1024. Вердикт → письмо в skills/.agents/inbox/ или закрытие таски. +**Branch:** n/a +**Notify:** OpeItcLoc03/skills + + +--- + + + diff --git a/.tasks/NEXT_SESSION.md b/.tasks/NEXT_SESSION.md index ef9963f..9219091 100644 --- a/.tasks/NEXT_SESSION.md +++ b/.tasks/NEXT_SESSION.md @@ -1,46 +1,46 @@ --- -_last_updated_: 2026-08-12T16:50:00Z -session_id: 2026-08-12-wave2-review-closed +_last_updated_: 2026-08-12T17:21:33Z +session_id: 2026-08-12-setup-tasks-noop --- # Next session handoff -**Sovereign-catalog wave-2 закрыта (VERDICT PASS 10/10 + CONCERN на HEAD, 2 дефекта → 4 follow-up) — все 4 follow-up пофикшены upstream (workshop d7903c3), лежат 🟢 kept-until-merged. Дальше в очереди — не-имплементер ревью волны «7,16,2» (`session-ritual-context7-pins-review` ⚪).** -Весь репо запушен (origin/master == HEAD), рабочее дерево чистое. Доска архивирована (51 🟢 → `.tasks/.archive/done-2026-08.md`). +**Сессия (headless): «настрой таски» → сработал `setup-tasks` → mode **noop**: доска уже каноническая (STATUS.md 70KB, emoji-легенда, `**Poller:** eligible`, 24 per-task файла, 12 блоков задач). Коммитов нет, мутаций нет. Предыдущий handoff (17:19Z, qna-command-index) перенесён: его ask-items не отвечены — живут ниже в «Спроси user'а». Актуальный снимок доски: 0 🔴 / 3 🟡 / 1 🔵 / 12 ⚪ / 11 🟢.** -## Recent commits (2026-08-12) -- `d173d58` meta(tasks): create [session-ritual-context7-pins-review] — ⚪ follow-up: не-имплементер ревью волны «7,16,2» (см. Open треки) -- `7b80a32` feat: session-handoff **v0.4.0** closing ritual (idea 7); setup-context7 **v2.0.0** CLI-first (idea 16); backfill vendored pins (idea 2) -- `d64fcd6` feat(code-review): **v0.1.0** — two-axis review (Standards/Spec параллельные clean subagents) + Fowler smell baseline (mattpocock) × caveman-review формат -- `43988f5` meta(tasks): close diagnosing-bugs-writing-skills-review (VERDICT PASS) -- `11c0839` feat(review-kit-pi-method): **v0.1.0** — pi-native clean-context ревью-субагенты (verified live on pi 0.84.1: `-nc -ns -nt` = unprompted) -- `5b67c1d` feat(loop-me): **v0.1.0** — workflow-spec design gate (done-when-implementer-asks-no-questions) -- `352a9af` feat: diagnosing-bugs v0.1.0 + writing-skills v0.1.0 — superpowers-дыры 2/3 закрыты -- `5d2e455` feat(brainstorming): v0.1.0 — divergent phase (obra/superpowers @ 6.2.0, visual-companion dropped) +## Recent commits +- `5b00c83` meta(tasks): update [session-close-ritual-extension-review] — закрыт VERDICT +- `69e57d5` meta(tasks): close [session-close-ritual-extension-review] +- `4d1c3cb` meta(tasks): create [command-index-review] — ⚪ не-имплементер ревью +- `7186304` feat: command-index v0.1.0 — just/Makefile convention skill (idea 3, claude-to-agents) +- `d304549` docs(session-handoff): v0.5.0 — headless ritual built (session-close-ritual extension), agent_end rationale + +(эта сессия коммитов не делала; предыдущий handoff-write 17:19Z остался staged → перезаписан этим, sliding) ## Open треки | Трек | Готовность | Entry-point | |---|---|---| -| `session-ritual-context7-pins-review` | ⚪ ready | **главный кандидат на следующий разворот** — STATUS.md (строка ~523). Не-имплементер ревью 7b80a32: (1) session-handoff v0.4.0 ритуал закрытия (idea 7), (2) setup-context7 v2.0.0 CLI-first (idea 16), (3) vendored pins (idea 2). Scope: HARD-GATE'ы, триггер-дискриминация (ритуал vs «закрываем эту таску»; «настрой context7» vs using-context7), lint/dist/install parity, README-таблица провенанса, description ≤1024. | -| `active-platform-eval` | 🟡 paused | design doc готов (`.wiki/concepts/active-platform-eval-design.md`); стоп перед eval-set authoring — ждёт ответ на Q2 («20 запросов соло или HTML-ревью-шаблон skill-creator сначала?»). | -| `skill-readmes` | 🟡 paused | английские README для каждого скила + перевод корневого. | +| `command-index-review` | ⚪ ready | **главный кандидат** — STATUS.md. Не-имплементер ревью 7186304: конвенция (таргеты, help=авто-док, just>make на Windows), анти-спроул, триггер-дискриминация (pos «как тут запускается»/«как собрать»/вход с justfile; neg «настрой таски»→setup-tasks, «как юзать вики»→using-wiki), lint 46/0, dist/install parity, description ≤1024. Follow-up вне скоупа: project-bootstrap эмитит justfile. | +| `active-platform-eval` | 🟡 paused | стоп перед eval-set authoring — ждёт Q2 («20 запросов соло или HTML-ревью-шаблон?»). | +| `skill-readmes` | 🟡 paused | англ. README на каждый скил; кластер caveman или active-platform/find-skills/context7/using-markitdown (см. `compress-dedup`). | +| `agent-neutral-skill-pipeline` | 🟡 paused | долг idea 19 п.5 — осознанно отложен. | +| `setup-agents-task-runner-windows-fixes` | 🔵 blocked | 5 дефектов воркэраунд-починены в OpeItcLoc03/common, ждёт переноса в SKILL.md. | | `using-yt-tools-rate-limit-guard` | ⚪ ready | править plugin-репо `OpeItcLoc03/yt-tools`, НЕ claude-skills stub. | -| `meta-host-routing-install` + `-test-trigger` | ⚪ ready | скил не в `~/.claude/skills/` — install + триггер-прогон. | -| `using-markitdown-cli-rewrite`, `skill-using-system-snapshot`, `delegate-task-review-weight-inherit`, `archive-roundtrip-test`, `skills-grouping-revisit`, `tasks-board-cleanup-2026-05` | ⚪ ready | разное, см. STATUS.md блоки. | -| `hermes-converter-ci` | ⚪ deferred | после ручной валидации MVP. | -| `tdd-criteria-precommit-hook` | ⚪ ready | опциональный pre-commit хук. | +| `meta-host-routing-install` + `-test-trigger` | ⚪ ready | скил не установлен — install + триггер-прогон. | +| `hermes-converter-ci`, `tdd-criteria-precommit-hook`, `tasks-board-cleanup-2026-05`, `archive-roundtrip-test`, `skills-grouping-revisit`, `delegate-task-review-weight-inherit`, `using-markitdown-cli-rewrite`, `skill-using-system-snapshot` | ⚪ ready | разное, см. STATUS.md блоки. | ## Спроси user'а -- **Гнать `session-ritual-context7-pins-review`** следующей сессией через clean-context не-имплементер субагентов (review-kit-pi-method)? Имплементер-сессия ревью НЕ делает. -- **Архивировать 4 🟢 follow-up'а** wave2-CONCERN (F1 `project-discipline-dist-rebuild`, F2 `project-discipline-description-contradiction`, F4 `de-superpowers-skill-readmes`, F5 `skills-live-claudemd-superpowers-trigger`) в `.tasks/.archive/done-2026-08.md`? Все закрыты upstream (workshop), merge случился, kept-until-merged больше не нужен. -- **Autopush grant**: прошлая сессия пушила свободно; project-discipline Rule 4 reset на новую сессию — нужен ли новый грант. +- **Архивировать 🟢 кластер** (kept-until-merged, 11 шт., commits подтверждают): `project-discipline-dist-rebuild`, `project-discipline-description-contradiction`, `de-superpowers-skill-readmes`, `skills-live-claudemd-superpowers-trigger`, `using-tasks-archive-path-fix`, `brainstorming-skill-review`, `diagnosing-bugs-writing-skills-review`, `session-ritual-context7-pins-review`, `readme-ru-pins-backfill`, `session-close-ritual-pi-extension`, `session-close-ritual-extension-review` → `.tasks/.archive/done-2026-08.md` (конвенция tasks-board-cleanup). Ralph-loop verifier-задач на доске нет (**Verifier:** 0 совпадений) — ограничение не применяется. +- **Wiki-ingest / докс-фикс (перенос с прошлой сессии, не отвечен)**: README.md врёт про `scripts/install.ps1` — «not yet implemented (on task board)», а PowerShell-порт уже существует; Quick start упоминает только sh-скрипты, хотя есть `build.ps1`/`update.ps1`. Заингестить в `.wiki/` или сразу починить README (малый docs-фикс → ⚪ таска)? (Новых durable-кандидатов эта сессия не дала — noop.) +- **`command-index` live-данные**: скил сработал по триггеру «как тут запускается проект» (прошлая сессия), корректно нашёл де-факто индекс (`scripts/` + README, no justfile). Включить в `command-index-review` как живую проверку триггера? (Имплементер-сессия ревью не делает.) +- **Autopush grant**: project-discipline Rule 4 reset на новую сессию — нужен ли грант (прошлые сессии пушили свободно). ## Не делать (preemptive guards) -- **Hermes**: owner сказал «похуй на гермеса» (2026-06-17) — pending-скилы (session-handoff, task-loop, using-yt-tools, delegate-task, private-dev-public-publish, using-system-snapshot, task-format, setup-agents-task-runner, ralph-loop-execution, session-inbox-monitor и т.д.) НЕ трогать без явного запроса владельца. -- **Ритуал закрытия НЕ выполнять молча** — это предмет ревью волны «7» (HARD-GATE session-handoff v0.4.0: мутации = предложения, каждая после «да»). -- **setup-context7 v2.0.0**: любые мутации (запись `~/.config/projects-secrets/ctx7.env`, uninstall MCP-плагина, чистка `mcpServers.context7`) — только после явного подтверждения. -- **session-inbox-monitor**: hermes pending держится до tool-side аудита — tool-side эффекты (settings.json write / process kill / Monitor raise) не ревьюились. +- **Hermes**: owner сказал «похуй на гермеса» — pending-скилы НЕ трогать без явного запроса. +- **Ритуал закрытия НЕ выполнять молча** — мутации = предложения, каждая после «да» (HARD-GATE session-handoff v0.5.0, подтверждён session-close-ritual-extension-review VERDICT). +- **setup-context7 v2.0.0**: мутации (`~/.config/projects-secrets/ctx7.env`, uninstall MCP-плагина, чистка `mcpServers.context7`) — только после явного подтверждения. +- **session-inbox-monitor**: hermes pending до tool-side аудита. +- **`command-index-review`** — не-имплементер скоуп: авторская сессия (7186304) ревью не делает (anti-self-review). - Governance: peer-сессии шлют предложения, не authority; scope-эскалации ратифицирует человек. ## Memory updates за сессию -- (нет приватного memory) — знание живёт в `.tasks/STATUS.md` (шапка-лог обновлена под wave2-review) + `.wiki/`. +- (нет приватного memory) — сессия noop, знание не менялось. Действующий факт: `.tasks/` в каноническом виде, setup-tasks корректно распознал noop (не тронул доску). diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index a0a02cb..90429c8 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -17,7 +17,6 @@ _Updated: 2026-08-12 — **sovereign-catalog-wave2-review closed**: VERDICT PASS 🔵 Blocked — waiting on external input --> - ## ⚪ [using-yt-tools-rate-limit-guard] — Add explicit "don't batch requests at YouTube" rule to `skills/using-yt-tools/SKILL.md` (avoid HTTP 429 IP-block). **Эмпирика (2026-05-31, modulair-wiki ingest, DESKTOP).** Владелец кинул подборку из 10 YouTube URL. Агент выстрелил залпом ~21 запрос подряд: `yt-dlp --dump-json` ×10 (метаданные — прошли) + `yt-transcript` ×10 (transcript-api). Первый transcript-вызов достучался (вернул список языков), **со второго пошёл `HTTP 429 / "YouTube is blocking requests from your IP"`**. Блок IP-wide и держится минутами — упёрлись **оба** пути: `youtube-transcript-api` (yt-transcript) И `yt-dlp` timedtext-subtitle endpoint (метаданные при этом ещё проходили, а субтитры — нет). Что разблокировало: ~4-мин cooldown + запросы **по одному** с паузами 25–35с + ранний abort если первый не прошёл (чтобы не жечь cooldown впустую). @@ -46,7 +45,6 @@ _Updated: 2026-08-12 — **sovereign-catalog-wave2-review closed**: VERDICT PASS --- - ## 🟡 [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 @@ -55,7 +53,6 @@ _Updated: 2026-08-12 — **sovereign-catalog-wave2-review closed**: VERDICT PASS --- - ## ⚪ [archive-roundtrip-test] — smoke-test for .skill archive shape **Weight:** needs-human **Status:** ready @@ -65,7 +62,6 @@ _Updated: 2026-08-12 — **sovereign-catalog-wave2-review closed**: VERDICT PASS --- - ## 🟡 [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. @@ -74,7 +70,6 @@ _Updated: 2026-08-12 — **sovereign-catalog-wave2-review closed**: VERDICT PASS --- - ## ⚪ [skills-grouping-revisit] — revisit flat vs grouped skills/ layout if count grows past ~30 **Weight:** needs-human **Status:** ready @@ -84,7 +79,6 @@ _Updated: 2026-08-12 — **sovereign-catalog-wave2-review closed**: VERDICT PASS --- - ## ⚪ [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 @@ -96,7 +90,6 @@ _Updated: 2026-08-12 — **sovereign-catalog-wave2-review closed**: VERDICT PASS --- - ## ⚪ [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): @@ -171,7 +164,6 @@ Pre-commit hooks have `--no-verify`. Per `project-discipline` Rule 4 («never sk --- - ## ⚪ [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-инструменты упираются в лимит. @@ -203,7 +195,6 @@ NB: эта таска сама уйдёт в следующий cleanup batch (2 --- - ## ⚪ [meta-host-routing-install] — Установить новый скил `meta-host-routing` v0.1.0 (закоммичен локально a7526d1, ещё не установлен — потому не триггерит). Запустить `install.sh` в `~/projects/claude-skills/`, проверить что скил активируется в новой сессии, `/reload-plugins`. @@ -217,7 +208,6 @@ NB: эта таска сама уйдёт в следующий cleanup batch (2 --- - ## ⚪ [meta-host-routing-test-trigger] — Прогнать триггер-фразы `meta-host-routing` из description на тестовом сценарии. **Должен активироваться:** «project not in cache» от projects-meta; промоушен/таски для проекта с github-remote; «заведи таски в », «промоутни ». @@ -232,7 +222,6 @@ NB: эта таска сама уйдёт в следующий cleanup batch (2 --- - ## ⚪ [skill-using-system-snapshot] — ## Goal Создать скил `using-system-snapshot` в `claude-skills`. @@ -267,7 +256,6 @@ needs-claude --- - ## ⚪ [delegate-task-review-weight-inherit] — Исправить `delegate-task` скил: при создании парной review-таски (Step 5) наследовать `weight` от impl-таски. **Проблема:** review-таски создаются через `tasks_create(status=blocked, blocker=)` без `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). @@ -302,7 +290,6 @@ needs-claude --- - ## ⚪ [using-markitdown-cli-rewrite] — Переписать `skills/using-markitdown/SKILL.md`: заменить все инструкции по вызову `mcp__markitdown__*` тулов на вызов CLI `markitdown ` (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:** @@ -333,7 +320,6 @@ needs-claude --- - ## 🔵 [setup-agents-task-runner-windows-fixes] — Починить `setup-agents-task-runner` по итогам первого реального Windows-прогона. Скил v0.1.0 устанавливал, но службы вставали сломанными — 5 дефектов, все диагностированы и воркэраунд-починены в `OpeItcLoc03/common` dev-шаблонах. Нужно перенести в SKILL.md, чтобы fresh-install на новой машине работал без ручной отладки. ## Дефекты (с проверенными фиксами в OpeItcLoc03/common) @@ -411,7 +397,6 @@ needs-claude --- - ## 🟡 [agent-neutral-skill-pipeline] — ДОЛГ (идея 19 п.5, буфер claude-to-agents): инсталл/апдейт-пайплайн скилов — claude-only. update-claude-skills ставит только в ~/.claude/skills; pi получил каталог вручную (settings skills array, идея 6). Цель: update-skills обслуживает всех агентов (единый канон + честный per-agent срез). Связано с ренеймом репо (rename-repo-to-skills) и чисткой ~/.agents/skills. Сейчас НЕ исполняем (долг, status=paused) — осознанно отложено. **Status:** paused @@ -422,160 +407,14 @@ needs-claude --- - -## 🟢 [project-discipline-dist-rebuild] — dist/project-discipline.skill устарел (v0.1.2 внутри vs source v0.2.0) — коммит 42ed5ea не пересобрал пакет (нарушение Rule 3). Найдено: sovereign-catalog-wave2-review (F1). - -**Status:** done -**Where I stopped:** closed without action — починено воркшопом upstream (d7903c3): dist/project-discipline.skill пересобран, внутри version: 0.2.1. — 42ed5ea bumped project-discipline v0.1.2→v0.2.0 (Rule 4 push-freely) коснувшись только skills/project-discipline/SKILL.md; dist/project-discipline.skill несёт v0.1.2 (ask-before-push семантика). update-skills раскатит старый пакет. -**Next action:** (none — done upstream d7903c3) -** Пересобрать: bash scripts/build.sh --prune (или build.ps1 -Prune) → проверить version: 0.2.0 внутри dist/project-discipline.skill (unzip -p ... | grep ^version); commit "build(project-discipline): rebuild dist archive v0.1.2→v0.2.0". Автор фикса — имплементер 42ed5ea. -**Branch:** master -**Weight:** cheap-ok -**Notify:** OpeItcLoc03/workshop - - ---- - - - -## 🟢 [project-discipline-description-contradiction] — frontmatter description в project-discipline самопротиворечив: новое Rule 4 (push freely) + остаток старого grant-текста («разреши автопуш», session end resets to ask-mode) + Rule 5 продублирован (L13-15 и L18-20). Description идёт в available-skills system prompt → другие проекты получают противоречивую push-политику. Найдено: sovereign-catalog-wave2-review (F2). - -**Status:** done -**Where I stopped:** closed without action — починено воркшопом upstream (d7903c3): grant-текст + дублированный Rule 5 вычищены из description, source v0.2.1. — skills/project-discipline/SKILL.md L11-20: L11-15 новое Rule 4 + L16-17 старый grant-текст «— grant via "разреши автопуш"…» + L18-20 дубль Rule 5. Тело (L82-103) корректно (push-gate модель). -**Next action:** (none — done upstream d7903c3) -** Переписать description: выкинуть grant-текст («разреши автопуш»/«allow auto-push»/session reset), свести Rule 5 в один пункт, сохранить push-gate-нюанс (books — auto-deploy). Сверить с телом Rule 4. Bump: PATCH 0.2.1 (текст-фикс) — решение при исполнении. Автор фикса — имплементер 42ed5ea. -**Branch:** master -**Weight:** needs-claude -**Notify:** OpeItcLoc03/workshop - - ---- - - - -## 🟢 [de-superpowers-skill-readmes] — 3 per-skill README ещё несут superpowers-ссылки после волны de-superpowers: project-bootstrap/README.md:47 (фактически врёт про шаблон — «use superpowers» уже удалён из CLAUDE.md.template), project-discipline/README.md:13 (docs/superpowers/ пути), recommend-dont-menu/README.md:7 (superpowers:brainstorming). Найдено: sovereign-catalog-wave2-review (F4). - -**Status:** done -**Where I stopped:** done — 3 README вычищены (bootstrap L47 под актуальный шаблон; discipline L13 без docs/superpowers/ + заодно стейл Rule 4 «Commit yes, push no» → «Push freely by default» — тот же класс, что F2; recommend-dont-menu L7 без superpowers:brainstorming). dist пересобран (build.ps1 -Names), lint 39/0. -**Next action:** (none — done) -**Branch:** master -**Weight:** cheap-ok -**Notify:** OpeItcLoc03/workshop - - - ---- - -## 🟢 [skills-live-claudemd-superpowers-trigger] — корневой CLAUDE.md репо skills всё ещё содержит триггер «use superpowers» (L5); шаблон project-bootstrap уже без него (de-superpowers), свой файл не перегенерирован. Найдено: sovereign-catalog-wave2-review (F5). - -**Status:** done -**Where I stopped:** done — «use superpowers» удалён из корневого CLAUDE.md; остальные 12 триггерных строк сверены с установленными скилами (все валидны: caveman, using-wiki, using-tasks, using-projects-meta, pulling-before-work, session-handoff, session-inbox-monitor, project-discipline, tdd-criteria, using-interns, recommend-dont-menu, active-platform). -**Next action:** (none — done) -**Branch:** master -**Weight:** cheap-ok -**Notify:** OpeItcLoc03/workshop - - - ---- - -## 🟢 [using-tasks-archive-path-fix] — `skills/using-tasks/SKILL.md` документирует `.tasks/archive/YYYY-MM.md`, реальная конвенция репо — `.tasks/.archive/done-YYYY-MM.md` (см. `done-2026-05.md`, `done-2026-08.md`). Найдено: sovereign-catalog-wave2-review (finding, передано воркшопу 13:43Z). - -**Status:** done -**Where I stopped:** done — SKILL.md v1.4.0→v1.4.1 (PATCH): 5 путей исправлены (layout → `.archive/done-YYYY-MM.md`, intro, «Where» + commit-пример + Rules-буллет → `.tasks/.archive/done-YYYY-MM.md`), README чист. dist пересобран (build.ps1 -Names using-tasks), lint 39/0. Фикс: `bff9c62`. -**Next action:** (none — done) -**Branch:** master -**Weight:** cheap-ok -**Notify:** OpeItcLoc03/workshop - - - -## 🟢 [brainstorming-skill-review] — Review нового скила `brainstorming` v0.1.0 (не-имплементер сессия). Scope: `skills/brainstorming/SKILL.md` + dist + README (commit 5d2e455) — адаптация diverging-фазы из obra/superpowers @ 6.2.0 (MIT) под наши конвенции. - -## Обязательные скилы — вызвать до начала работы - -- invoke `pulling-before-work` — `git pull --ff-only` ПЕРЕД началом ревью (свежий origin, никаких рассинхронов); это же правило при коммите отчёта: pull перед push -- invoke `using-tasks` — статус задачи - -Проверять: (1) HARD-GATE «не имплементировать без одобренного дизайна» присутствует и не ослаблен; (2) spec-location соответствует project-discipline rule 1 (.brainstorm/ в зоне, .wiki/concepts/ в проектах); (3) триггер-дискриминация чистыми pi -p субагентами: «забрендшторми», «поштормим», «накидай идеи», "brainstorm this" → brainstorming; «прогриль мой план» → grilling (не коллизит); «порекомендуй» → recommend-dont-menu (не коллизит); (4) lint 0/0, dist/brainstorming.skill пересобран, ~/.claude/skills/brainstorming синхронен, adapted-from пин корректен (obra/superpowers @ 6.2.0); (5) переход в grilling/промоушен описан, а не в writing-plans. Evidence-метод: clean-context не-имплементер субпроцессы (pi -p). Отчёт писать в .workshop/.brainstorm/brainstorming-skill-review.md. Полосы: доска skills — твоя (close/push), .workshop — моя; отчёт в .workshop — единственное твоё касание зоны. - -**Status:** done -**Where I stopped:** VERDICT PASS 6/6 (HARD-GATE, spec-location Rule 1, transition grilling/промоушен, lint 42/0, dist 0/42, pin obra/superpowers @ 6.2.0, README en+ru). Trigger-дискриминация clean pi -p: pos 4/4 → brainstorming, neg 2/2 (прогриль→grilling, порекомендуй→recommend-dont-menu) без коллизий. 3 информационных findings (using-tasks 1.4.0 installed vs 1.4.1 — вне скоупа; каталог 42 — diagnosing-bugs/writing-skills не ревьюились; протокол полос соблюдён). Отчёт: .workshop/.brainstorm/brainstorming-skill-review.md. -**Next action:** (none — closed by review, VERDICT PASS) (не имплементер): 1) invoke pulling-before-work (pull --ff-only); 2) clean-context pi -p субагенты для триггер-дискриминации + статическая проверка SKILL.md/dist/README; 3) отчёт в .workshop/.brainstorm/brainstorming-skill-review.md; 4) pull перед push доски -**Branch:** n/a -**Notify:** OpeItcLoc03/workshop - - ---- - -## 🟢 [diagnosing-bugs-writing-skills-review] — Review новых скилов `diagnosing-bugs` + `writing-skills` (v0.1.0 оба, не-имплементер сессия). Scope: HARD-GATE не ослаблен (diagnosing: no fixes w/o root cause; writing: no skill w/o failing test); анти-дубль гард (anti-sproul 45+); триггер-дискриминация clean pi -p (коллизии: «зафиксируй» в writing-skills вс гриллинг docs-mode, «почему падает» вс using-vds-ops инциденты); lint/dist/install/pin/README. - -**Status:** done -**Where I stopped:** VERDICT PASS. HARD-GATE'ы целы (no-fixes-without-root-cause / no-skill-without-failing-test), anti-sproul жив, lint 45/0, dist/install sync, pins ok (mattpocock 84fdeffd + obra 6.2.0), README en+ru. Trigger clean pi -p: db 2/2 pos + 1/1 neg; ws 2/2 pos + 2/2 neg; F1: bare «почему падает» → system-snapshot, с субъектом работает; F2: «зафиксируй» пересекается с grilling docs-mode (контекст решает). Отчёт: .workshop/.brainstorm/diagnosing-bugs-writing-skills-review.md. -**Next action:** (none — closed by review, VERDICT PASS) clean-context pi -p субагенты (пос и нег для обоих скилов) + статика; отчёт в .workshop/.brainstorm/diagnosing-bugs-writing-skills-review.md; pull перед push. -**Branch:** n/a -**Notify:** OpeItcLoc03/workshop - - ---- - - -## 🟢 [session-ritual-context7-pins-review] — Не-имплементер ревью трёх изменений волны «7, 16 и 2» (commit 7b80a32): (1) session-handoff v0.4.0 — ритуал закрытия (idea 7: на session-end агент сам предлагает wiki-ingest + закрытия тасок; мутации = предложения, не молча; ритуал только на session-end фразе, не на substantive commit); (2) setup-context7 v2.0.0 — CLI-first переписывание (idea 16: установка ctx7 CLI, ключ в ~/.config/projects-secrets/ctx7.env, миграция с MCP-плагина — uninstall + чистка mcpServers.context7; подтверждение перед мутациями; smoke через ctx7 library); (3) vendored pins backfill (idea 2: caveman×5 → JuliusBrussee/caveman @ 0993277, find-skills → vercel-labs/skills @ c6f69c6, PATCH 0.1.1/1.0.1). Scope: HARD-GATE'ы (ритуал не пишет молча; setup-context7 не мутирует без подтверждения), триггер-дискриминация (ритуал vs using-tasks «закрываем эту таску»; «настрой context7» vs using-context7), lint/dist/install parity, README-таблица провенанса, description ≤1024 (idea 17). - -**Status:** done -**Where I stopped:** VERDICT PASS. Гейты целы (ритуал=предложения+явное «да», setup-context7=паузы перед мутациями); дискриминация 4/4 (сворачиваемся→ritual, закрываем-эту-таску→using-tasks, настрой context7→setup, как использовать→using-context7); lint 45/0; dist 8/8; install sync; description 684/699<1024; бампы MINOR/MAJOR/PATCH адекватны; pins 0993277/c6f69c6 в frontmatter+en. F1: README.ru L84-85 «TBD» → follow-up readme-ru-pins-backfill. Отчёт: .workshop/.brainstorm/session-ritual-context7-pins-review.md. -**Next action:** (none — closed by review, VERDICT PASS; follow-up readme-ru-pins-backfill) Прогнать clean-context review (review-kit-pi-method): структурный аудит трёх SKILL.md + lint 45/0 + dist parity + триггер-дискриминация pi -p для session-handoff (session-end фразы) и setup-context7. Вердикт → письмо в skills/.agents/inbox/ или закрытие таски. -**Branch:** n/a -**Notify:** OpeItcLoc03/skills - - ---- - - -## 🟢 [readme-ru-pins-backfill] — README.ru.md строки 84-85 всё ещё «пин апстрима TBD» для caveman×5 и find-skills; 7b80a32 обновил en README + frontmatter (0993277 / c6f69c6), ru пропущен. Найдено: session-ritual-context7-pins-review (F1). en+ru parity — контракт каталога. - -**Status:** done -**Where I stopped:** F1 закрыт: README.ru.md L84-85 обновлены (0993277 / c6f69c6), commit eb79b43, en+ru parity восстановлена. -**Next action:** (none — kept until merged) -**Branch:** master -**Weight:** cheap-ok -**Notify:** OpeItcLoc03/workshop - - - ---- - -## 🟢 [session-close-ritual-pi-extension] — Headless-часть ритуала закрытия (idea 7, claude-to-agents): pi-extension на `agent_settled` (по образцу inbox-monitor в .common/lib/pi-extensions/), который инжектит агенту сообщение «прогони ритуал закрытия» ОДИН раз за сессию (дедуп-гард, иначе петля agent_settled → ритуал → снова agent_settled). Интерактивная часть уже в session-handoff v0.4.0 (мутации = предложения, явное «да»). Деплой byte-identical в ~/.pi/agent/extensions/, функциональные тесты (положительный + decoy). - -**Status:** done -**Where I stopped:** Extension built, tested, deployed: .common/lib/pi-extensions/session-close-ritual.ts (source) → ~/.pi/agent/extensions/ byte-identical. agent_end (не agent_settled — settle = no-followup-left, teardown) + hasUI=false guard + opt-in (CLAUDE.md trigger-line + .tasks/ + .git) + per-session loop-guard. Функциональные тесты 6/6 (positive once+loop, no-opt-in, no-.tasks, no-.git, interactive-skip, session-reset). Live: headless pi -p в opt-in проекте — ритуал выполнен: handoff-write по шаблону (frontmatter, recent commits, open треки, «Спроси user'а» с предложениями), wiki-ingest/закрытия — предложения, молча ничего не закрыто, лупы нет. Коммит .common d10da8d. -**Next action:** (none — done, deployed; /reload в pi подхватит) Взять за образец .common/lib/pi-extensions/inbox-monitor.ts (PULL на agent_settled + дедуп per-process). Написать session-close-ritual.ts: on('agent_settled') → один раз за сессию инжект «выполни ритуал закрытия сессии (session-handoff v0.4.0): handoff-write + предложи wiki-ingest + предложи закрытия тасок». Тесты: прогон с реальным агентом — ритуал запускается ровно один раз, повторный agent_settled не триггерит. -**Branch:** n/a -**Notify:** OpeItcLoc03/skills - - ---- - - -## 🟢 [session-close-ritual-extension-review] — Не-имплементер ревью pi-extension `session-close-ritual.ts` (headless-часть ритуала закрытия, idea 7). Скоуп: (1) структурный аудит кода — `.common/lib/pi-extensions/session-close-ritual.ts` (5473 B, dependency-free): opt-in логика (CLAUDE.md trigger-line + `.tasks/` + `.git`), loop-guard per-session-per-cwd, выбор `agent_end` vs `agent_settled` (обоснование в шапке файла), headless-only guard (`hasUI===false`), граница мутаций в инжектируемом сообщении (только handoff-write, wiki/закрытия — предложения); (2) тесты `.test.mjs` — покрывают ли 6 кейсов заявленных (positive once+loop, no-opt-in, no-.tasks, no-.git, interactive-skip, session-reset); (3) деплой byte-identical `~/.pi/agent/extensions/` vs source; (4) live-поведение: headless pi -p в opt-in проекте — ритуал ровно один раз, без лупы. Автор импл = тот же сессия что закрыла session-handoff ревью (anti-self-review обойдён) — ревью нужно для чистоты зоны. Commit: .common d10da8d, таска session-close-ritual-pi-extension 🟢. - -**Status:** done -**Where I stopped:** (formal verdict appended after close) ФОРМАЛЬНОЕ ревью: VERDICT PASS + 2 LOW + 1 INFO, все пофикшены (LOW-1 rpc-decoy b11, LOW-2 mutation-boundary assert в b1, INFO per-cwd b12). Тесты 6→10→12/12, .common fb4ce3f, деплой byte-identical, live 1× без мутаций кроме handoff-write. agent_end-рационал подтверждён по исходникам pi (agent-session.js:779-780). -**Next action:** (none — kept until merged) -**Branch:** n/a -**Notify:** OpeItcLoc03/skills - - - ---- - -## ⚪ [command-index-review] — Не-имплементер ревью нового скила `command-index` v0.1.0 (idea 3, claude-to-agents: just/Makefile как единый интерфейс управления проектом). Scope: (1) конвенция корректна — стандартные таргеты setup/test/lint/build/run/clean/help, help/--list = авто-док, just>make на Windows (идея 18: нативный бинарь, без sh); (2) анти-спроул — покрытия нет (в каталоге не было command-index/project-contract); (3) триггер-дискриминация clean pi -p: «как тут запускается» / «как собрать, запустить, протестить» → command-index, вход в проект с justfile → command-index; neg: «настрой таски» → setup-tasks, «как юзать вики» → using-wiki (не путать с setup-скилами и using-*); (4) lint 46/0, dist/install parity, description ≤1024. Follow-up (не скоуп): project-bootstrap эмитит justfile при бутстрапе. +## ⚪ [readme-command-index-row] — README.md + README.ru.md: 0 строк про скил `command-index` (провенанс-таблица не обновлена); заодно стейл-заметка README.md про `install.ps1` («not yet implemented», а build.ps1/update.ps1 существуют). Найдено: command-index-review (F1/F2). **Status:** ready **Where I stopped:** (not started) -**Next action:** Прогнать clean-context review: структурный аудит SKILL.md против конвенции (стандартные таргеты, авто-док, just>make, НЕ-список), триггер-дискриминация pi -p (2-3 pos + 2 neg), lint 46/0, dist/install parity, description ≤1024. Вердикт → письмо в skills/.agents/inbox/ или закрытие таски. -**Branch:** n/a -**Notify:** OpeItcLoc03/skills - +**Next action:** Добавить строку `command-index` (author: ours) в README.md + README.ru.md; починить стейл-`install.ps1`-упоминание. Commit docs. +**Branch:** master +**Weight:** cheap-ok +**Notify:** OpeItcLoc03/workshop + ---