Files
claude-skills/.tasks/STATUS.md

1426 lines
178 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Task Board
_Updated: 2026-06-17 — **review-kit прогнан в чистой не-имплементер сессии: 3 трека закрыты VERDICT PASS**`inter-session-peer-discipline-test-trigger` (pos 4/4→peer high, 0 FP на 5 чужих RU+EN), `inter-session-peer-discipline-review` (тело v0.1.1 несёт все 3 принципа, не конфликтует с CLAUDE.md), `session-inbox-monitor-review` (зонтик: активация 3/3 monitor + neg clean [X2 low-conf observation]; структурный аудит хуков 5 PASS/1 CONCERN; received-msg-fp учтён RESOLVED via b; hermes держим pending до tool-side аудита). Метод — clean-context непрайменные субагенты + независимый структурный аудит. Единственный finding (UTF-8 guard) сразу пофикшен и закрыт: `session-inbox-monitor-encoding-guard-followup` 🟢 — `[Console]::OutputEncoding=UTF8` forward-guard в inbox-monitor.ps1, кириллический regression под WinPS 5.1 PASS, задеплоен byte-identical, SKILL.md v0.2.2. Ранее: session-inbox-monitor-test-trigger closed (VERDICT PASS; clean-session run, 7 непрайменных субагентов: pos 4/4→session-inbox-monitor [вкл. CLAUDE.md-line P4], neg 2/3 [N2 backend→none, N3 received-msg EN→none, N1 received-msg RU→FP]; FP borderline + body-load-self-correcting, корень=inter-session-peer-discipline не установлен; follow-up `session-inbox-monitor-received-msg-fp` заведён; `-review` разблокирован [нужна НЕ-имплементер сессия]; строка `inbox monitor: raise on start` добавлена в CLAUDE.md по согласию user). Ранее: task-loop-test-trigger closed (VERDICT PASS; live clean-session run: pos 6/6→task-loop, neg discrimination clean, task-loop FP 0/3, behavioral 4/4 [consult-gate, session_break BOUNDARY, empty-stop-no-poll, long-watch ScheduleWakeup≥1200 not CronCreate]; registry confirmed real via subagent probe; **ALL 3 task-loop baselines now done**; finding: session_break is the fragile gate — body-load-dependent, informational only, no fix). Ранее: task-loop-hermes-mapping closed (task-loop entry → hermes/mapping.yaml mode:pending, intended auto/mcp; reason claim/close/heartbeat + ScheduleWakeup; YAML validated; schema version untouched. 2 of 3 task-loop baselines now done; -test-trigger ⚪ remains, needs clean session). Ранее: task-loop-install closed (skill installed to ~/.claude/skills/, diff-identical to source, visible in available-skills with full description post-/reload-plugins; -test-trigger unblocked → ⚪ ready, needs clean session). Ранее: using-tasks-session-lock shipped (using-tasks 1.3.0→1.4.0; session lock guard: start step 1 + end step 1 + .gitignore + Structure docs). Ранее: meta-host-routing-review closed (VERDICT PASS; behavioral 8/8 via clean-context subagents — 5 pos→meta-host-routing, 3 neg routed away incl. known-Gitea Skip-clause; Steps verified vs live infra: yt-tools→OpeItcLoc03/meta-yt-tools dedicated host resolves, .common grep hits, excludesFile/auth.toml present; failure-modes→STOP+ask, What-NOT accurate; no blocking findings on skill v0.3.0. Observation: task acceptance «resolves .common» is stale — skill+reality route yt-tools to dedicated meta-yt-tools host. Caveat: -install + -hermes-mapping baselines remain ⚪ open — skill not in ~/.claude/skills nor hermes/mapping.yaml; review covers content+trigger-discrimination only, not live-harness activation). Ранее: task-format skill v0.1.0 created (TDD via writing-skills; RED 3-fail → GREEN 2-pass). Ранее: using-markitdown-cli-rewrite-review done (VERDICT PASS; SKILL.md без `mcp__markitdown__`, CLI-примеры совпадают с `markitdown 0.1.6 --help`, version 1.0.0→1.0.1 PATCH, dist консистентен; 1 informational finding — docker-контейнер респаунится из out-of-scope `~/.claude.json` MCP-регистрации → follow-up `using-markitdown-mcp-deregister` needs-human). Ранее: skill-using-system-snapshot-review done (VERDICT PASS 3/3; live tool-contract verify + 9-way fresh-context trigger test, 8 clean; 3 informational findings, none blocking — incl. missing deployment scaffold: skill not installed / not in hermes-mapping / no baseline tasks). Ранее: using-tasks-status-read-perf done (using-tasks 1.2.0→1.3.0; done-task archival rule fixes STATUS.md bloat; literal `tasks_get_status`-for-orientation swap NOT done — tool can't enumerate the board, documented). Ранее: session-break-using-tasks done (using-tasks 1.1.0→1.2.0; `session_break` marker — stop after close before claim-next). Ранее: delegate-task-review done (VERDICT PASS; smoke-test 6/6 fresh subagents, no blocking findings, 3 informational notes). Ранее: delegate-task-test-trigger done (pos 5/5, neg 2/3; FP на «создать задачу себе» → follow-up delegate-task-description-fp-fix, shipped v0.2.1). Ранее (2026-06-08): откат churn'а от агент-раннера (always-on dry-run): 5 тасок (using-yt-tools-rate-limit-guard, archive-roundtrip-test, skills-grouping-revisit, hermes-converter-ci, tdd-criteria-precommit-hook) спуриозно claimed/blocked из-за workspace-divergence бага раннера → возвращены в ⚪ ready. yt-tools re-scoped на plugin-репо `OpeItcLoc03/yt-tools` (исходный stub deprecated)._
**Poller:** eligible
<!--
Canonical layout. One block per task. Per-task deep context lives in
.tasks/<task-slug>.md (created by using-tasks when a task becomes active
or paused). Historical Done entries dropped — git log is the history.
Status legend:
🔴 Active — only one at a time
🟡 Paused — in progress, resumable
⚪ Ready — defined, not started
🟢 Done — kept until merged
🔵 Blocked — waiting on external input
-->
## ⚪ [using-yt-tools-rate-limit-guard] — Add explicit "don't batch requests at YouTube" rule to `skills/using-yt-tools/SKILL.md` (avoid HTTP 429 IP-block).
**Эмпирика (2026-05-31, modulair-wiki ingest, DESKTOP).** Владелец кинул подборку из 10 YouTube URL. Агент выстрелил залпом ~21 запрос подряд: `yt-dlp --dump-json` ×10 (метаданные — прошли) + `yt-transcript` ×10 (transcript-api). Первый transcript-вызов достучался (вернул список языков), **со второго пошёл `HTTP 429 / "YouTube is blocking requests from your IP"`**. Блок IP-wide и держится минутами — упёрлись **оба** пути: `youtube-transcript-api` (yt-transcript) И `yt-dlp` timedtext-subtitle endpoint (метаданные при этом ещё проходили, а субтитры — нет). Что разблокировало: ~4-мин cooldown + запросы **по одному** с паузами 2535с + ранний abort если первый не прошёл (чтобы не жечь cooldown впустую).
Второй, смежный баг той же сессии: `yt-transcript` по умолчанию просит `--lang en` и **промахивается мимо ручных `en-US` субтитров** (видео с manually-created `en-US` и без `en` отдаёт "no transcript"). Лечится `--lang en-US,en` (или вообще автоопределением).
**Что добавить в SKILL.md:**
1. **What NOT to do** — новый буллет: «**Не пулять в YouTube пачкой запросов.** Несколько URL подряд (или metadata+transcript залпом) → `HTTP 429`, IP-block на минуты, бьёт оба пути (transcript-api и yt-dlp). Обрабатывай по одному, с паузой ≥2535с между; при пакете из N URL — последовательно, не параллельно. Если уже словил 429 — cooldown ~35 мин перед повтором, проверяй первый запрос и не продолжай залп если он упал.»
2. **Failure modes** — новая строка: симптом `HTTP 429 Too Many Requests` / `"blocking requests from your IP"` → причина: слишком много запросов подряд (rate-limit, не приватность/регион) → действие: cooldown + по одному с паузами; НЕ retry в цикле без задержки. Отличать от `yt-dlp source download failed` (это реальная недоступность видео).
3. (опц.) **Inputs / Flow A** — упомянуть `--lang en-US,en` как дефолт-страховку для ручных не-`en` субтитров (видео NE/прочие с `en-US`-only).
**Bump:** PATCH (поверхностное расширение guidance, не breaking).
**TDD:** не применим (markdown-документ). Behavioral-смок опционален: «дай 5 URL» → агент обрабатывает последовательно с паузами, не залпом.
**Дисциплина:** после правки — bump version в frontmatter, commit `feat(using-yt-tools): rate-limit guard (no-batch) vX.Y.Z`; install/hermes-mapping/push — отдельно, как в прошлых yt-tools-тасках (для PATCH достаточно reload-plugins).
**Weight:** needs-human
**Status:** ready — **RE-SCOPED 2026-06-08:** исходный таргет `skills/using-yt-tools/SKILL.md` устарел — это deprecated inert stub (v0.4.1), канонический контент мигрировал в **plugin-репо `OpeItcLoc03/yt-tools`** (v0.6.0), там же живут секции, на которые ссылается задача (вкл. буллет «Не retry на yt-dlp failures» для расширения). Правило по-прежнему нужно — но вносить его в plugin-репо, не в stub. (Находка автономного агента 2026-06-08; consult по «какой репо править» → halt при `consult_policy=human-only`; decision-trail в per-task файле.)
**Where I stopped:** (not started в правильном репо) — баг и фикс зафиксированы по живой сессии 2026-05-31; правка отложена в задачу (владелец просил не лезть в глобальный скил из проекта modulair-wiki).
**Next action:** В репо `OpeItcLoc03/yt-tools` (plugin) открыть его SKILL.md, внести пункты 13 (rate-limit guard), bump PATCH, commit. Свериться с существующим «Не retry на yt-dlp failures» — расширить его, а не плодить дубль. (НЕ править claude-skills stub.)
**Branch:** master
<!-- created-by: vitya@DESKTOP / from: modulair-wiki ingest session / 2026-05-31 -->
<!-- re-scoped: vitya@.admin-exec / 2026-06-08 / target moved claude-skills stub → OpeItcLoc03/yt-tools plugin (agent finding during always-on dry-run) -->
---
## 🟡 [skill-readmes] — write English README.md for every skill + translate root README
**Status:** paused
**Where I stopped:** infra-skill cluster done — READMEs for `project-bootstrap`, `setup-wiki`, `setup-tasks`, `using-wiki`, `using-tasks`; root README translated; cross-links between all five skills wired up
**Next action:** continue with the next batch — suggest the caveman cluster (`caveman`, `caveman-commit`, `caveman-review`, `caveman-help`, `caveman-compress`, `compress`) since they form a coherent group; or jump to `active-platform`, `find-skills`, `setup-context7`, `using-context7`, `using-markitdown` if the caveman cluster needs deduplication first (see `compress-dedup` task)
**Branch:** master
---
## 🟢 [install-ps1] — paired install.sh + install.ps1 (cross-platform parity, with --prune)
**Status:** done
**Where I stopped:** All 3 acceptance items shipped 2026-05-25. (a) `scripts/install.ps1` existed pre-task. (b) `--prune` / `-Prune` flag added in commit `6cf0e98` (paired sh + ps1; combined-flag pattern; global-scan; default off; smoke-tested on disposable target dirs against fake stale skills). (c) Concept page `.wiki/concepts/install-cross-platform.md` written this commit: parity contract, --prune design choices, rejected alternatives, scope vs build/.skill prune.
**Next action:** (none — kept until merged)
**Branch:** master
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-25 / 3/3 acceptance met; build-script analogue for dist/.skill prune remains separate concern -->
---
## 🟢 [install-ps1-build-prune-followup] — Add matching `--prune` flag to `scripts/build.{sh,ps1}` for `dist/<name>.skill` artefacts (analogue of install-script prune).
**Status:** done
**Where I stopped:** Shipped 2026-05-25. `--prune` / `-Prune` added to both `build.sh` and `build.ps1`. Bash arg-parses out `--prune` from positionals, runs prune at the end of the script against `dist/*.skill` (works regardless of which build branch executed — zip-path or powershell.exe delegation). PS `-Prune` switch runs after the build loop. Same default-off / global-scan / print-and-delete pattern as install-side. Smoke-tested with fake `dist/fake-stale-{sh,ps}.skill` files against real `dist/` — both paths pruned correctly without touching real archives. `[skip-tdd: wrapper]` carve-out applies. Wiki page `.wiki/concepts/install-cross-platform.md` extended with new "Build-side --prune" section + scope note that `dist-hermes/` is separate. Index + log updated.
**Next action:** (none — kept until merged)
**Branch:** master
<!-- created-by: vitya@DESKTOP-NSEF0UK / 2026-05-25 / origin: [install-ps1] close — natural extension to build scripts -->
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-25 / acceptance: bash + PS prune ✅; smoke-test ✅; wiki extended ✅ -->
---
## ⚪ [archive-roundtrip-test] — smoke-test for .skill archive shape
**Weight:** needs-human
**Status:** ready
**Where I stopped:** (not started) — caught the PowerShell-Compress-Archive backslash bug manually; a smoke-test would catch the next regression automatically
**Next action:** add a script that builds `dist/<name>.skill`, unzips into a temp dir, and `diff -r` against `skills/<name>/`. Fail on any difference. Run from CI or pre-commit if we add one
**Branch:** (not started)
---
## 🟡 [active-platform-eval] — eval-driven tuning of active-platform (description + body), absorbs `[active-platform-tuning]`
**Status:** paused
**Where I stopped:** design doc complete (`.wiki/concepts/active-platform-eval-design.md`, ~150 lines); per-task file complete (`.tasks/active-platform-eval.md`); STATUS.md collapsed the two original ⚪ tasks into this one block. Pre-flight verified: `claude` CLI on PATH at `C:\nvm4w\nodejs\claude.ps1` (Claude Code 2.1.128); `run_loop.py` present at `~/.claude/plugins/cache/claude-plugins-official/skill-creator/unknown/skills/skill-creator/scripts/run_loop.py`. Stopped right before eval-set authoring at user request — paused for asynchronous follow-up. No code touched, no tooling launched, no `.tasks/active-platform-eval/` workspace dir created yet.
**Next action:** resume by answering Q2 from the chat ("eval set — write 20 queries solo from current SKILL.md + concept-page open questions, or run skill-creator's HTML review template first for user-driven edits before kickoff?"), then (a) build `.tasks/active-platform-eval/eval-set.json`, (b) snapshot skill to `.tasks/active-platform-eval/skill-snapshot/`, (c) launch run_loop.py in background, (d) parallel manual body sweep, (e) apply changes + bump to 1.1.0 + rebuild + reinstall + final report + commit.
**Branch:** master
---
## ⚪ [skills-grouping-revisit] — revisit flat vs grouped skills/ layout if count grows past ~30
**Weight:** needs-human
**Status:** ready
**Where I stopped:** (not started) — current 14 skills fit fine in flat `skills/`; threshold for revisiting is ~30
**Next action:** when triggered (skill count crosses threshold), evaluate variant B (grouped by family) vs variant C (flat + manifest) from the original brainstorm in `.wiki/concepts/repo-layout.md`
**Branch:** (not started)
---
## ⚪ [hermes-converter-ci] — [deferred — после ручной валидации MVP] CI hook (Gitea-pipeline или GitHub-Action если зеркалим): на push to master запустить `scripts/build-hermes.py`, сравнить diff `dist-hermes/`, авто-коммит если изменения (или PR-шаблон). Цель — чтобы `dist-hermes/` всегда матчил `skills/`+`hermes/mapping.yaml`+`hermes/skills/` без ручного запуска build. Не блокирует MVP — первая итерация делается ручным запуском конвертера. Дизайн: `.wiki/concepts/hermes-skills-rollout-design.md`.
**Weight:** needs-human
**Status:** ready
**Where I stopped:** unblocked 2026-05-07 — `hermes-mvp-coverage` shipped в `a003b80`; MVP живой на фабрике.
**Next action:** Выбрать платформу CI (Gitea Actions vs внешняя), написать workflow, прогнать тестовый push.
**Branch:** master
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-06T20:21:57.210Z -->
---
## ⚪ [tdd-criteria-precommit-hook] — Optional pre-commit hook script that automates the bright-line checks from `tdd-criteria` Anti-loophole rules 1 and 4. Project owner opts in per-repo by symlinking / copying to `.git/hooks/pre-commit` (or via `husky` / `lefthook` integration if the project uses them).
**Two checks** (both bright-line, both fail-closed):
**Check 1 — `[skip-tdd: <category>]` validation.** If `git diff --cached --name-only` includes a `*.ts` / `*.js` / `*.py` / similar code file (excluding tests and Permissive-zoned paths like `*.css` / `*.env*` / `*.md` / `*.yaml`), require either:
- A `*.test.*` / `*.spec.*` / `test_*.py` / similar file present in the same diff, OR
- The commit subject (read from `$1` arg, line 1 of `$1` = msg path) matches `\[skip-tdd: (visual|spike|oneshot|wrapper)\]`.
If neither holds → block with message:
```
TDD policy violation: code change without test or skip marker.
Add a test, or include [skip-tdd: <visual|spike|oneshot|wrapper>] in commit subject.
See claude-skills/.wiki/concepts/tdd-criteria-design.md for which category applies.
```
**Check 2 — Test-modification audit (`[test-modify]` rule 4).** Detect test-modifying changes in `git diff --cached`:
- Removed line matching `^-\s*(expect|assert|assertThat|chai\.)\(` (assertion deletion)
- Added/removed lines that change argument values inside `expect(...)` / `assert(...)` calls
- Added `.skip` / `\.xit\b` / `@pytest\.mark\.skip` / `@Disabled` / `@Ignore` annotations
- Deleted `it(...)` / `test(...)` / `def test_*` definitions (matches `^-\s*(it|test|describe)\(` or `^-def test_`)
If any matched → require commit subject matches `\[test-modify: [^:]+: was .+; is .+; reason: .+\]`. Block otherwise with message:
```
Test-modification without [test-modify: ...] marker.
Required format: [test-modify: <name>: was <literal>; is <literal>; reason: <Z>]
The was/is must be the LITERAL assertion expressions, not paraphrased.
See tdd-criteria Anti-loophole rule 4.
```
ALSO: if `git diff --cached --name-only` includes both a test-pattern file AND an impl-pattern file → block:
```
Test changes must be in a separate commit from impl changes (tdd-criteria rule 4b).
Run: git reset HEAD <impl-files> && git commit (test-only) && git add <impl-files> && git commit (impl-only).
```
**Implementation:**
- Bash script (single file). Cross-platform: works on Linux/macOS and on Windows under git-bash (which Claude/Hermes both already run on).
- Path: `~/projects/claude-skills/scripts/tdd-criteria-precommit-hook.sh`. Plus a Windows wrapper `.ps1` that delegates if needed.
- Tested on a real repo before commit (`books` is a good candidate — it has Jest tests + `*.test.js` convention).
- Documented in `claude-skills/.wiki/concepts/tdd-criteria-design.md` «See also» section (already linked).
**Activation pattern (per-repo):**
```bash
# Symlink or copy the hook
ln -sf ~/projects/claude-skills/scripts/tdd-criteria-precommit-hook.sh \
.git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
```
Or via `lefthook.yml` / `.husky/pre-commit` if the project already uses one of those.
**Out of scope:**
- Mutation testing (Stryker, mutmut) — separate heavyweight infra, not this hook.
- Coverage gates — different mechanism, different cost/benefit.
- Visual regression infra (Percy, Chromatic) — Permissive-5 acknowledges this is heavyweight; not bundled.
- Auto-fixing the violation — hook only blocks; fix is human's job.
**Why this is optional, not required by the SKILL.md:**
The skill is **policy** that lives in claude-skills and gets pulled into agent context per project. The hook is **enforcement** that needs per-project setup. Some projects opt out of pre-commit hooks entirely (e.g. `karu` if it's pure CSS — no code surface to enforce). Forcing the hook into the skill would couple policy to tooling.
**Bypass:**
Pre-commit hooks have `--no-verify`. Per `project-discipline` Rule 4 («never skip hooks unless user explicitly asks») agents must not use `--no-verify` — but humans can in emergencies. Each `--no-verify` use should be self-flagged in the commit body («bypassed pre-commit because: ...»). Not enforceable by the hook itself; this is a higher-level audit.
**Weight:** needs-human
**Status:** ready
**Where I stopped:** (not started)
**Next action:** Решить, нужен ли hook (он опционален) — если да, написать `~/projects/claude-skills/scripts/tdd-criteria-precommit-hook.sh` по спеке в description, протестировать на `books` (Jest-конвенция `*.test.js`), задокументировать activation pattern. Если нет — закрыть как `wontfix` с пометкой что fence чисто социальная (commit subject visible в `git log`).
**Branch:** master
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-07T05:10:28.610Z -->
---
## ⚪ [tasks-board-cleanup-2026-05] — Архивная чистка `.tasks/STATUS.md`: переместить все 🟢 done-блоки в `.tasks/.archive/done-2026-05.md`, оставить в STATUS.md только header + status legend + 🔴/🟡/⚪/🔵 блоки. Цель — разгрузить файл от исторического шума без потери data (git history + явный архивный файл для текстового поиска).
Предпосылка: на 2026-05-07 в `claude-skills/.tasks/STATUS.md` накопилось ~18+ 🟢 done-блоков (rolled out за 2026-04-25 — 2026-05-07: tdd-criteria-rollout, hermes-rollout, bootstrap-related, project-creation-lifecycle, recommend-dont-menu и т.д.). Convention в шапке файла говорит «🟢 Done — kept until merged», но проект работает на master-only (нет ветвления для merge), поэтому convention превратилась в «kept forever». Файл рос до ~600 строк / 26K токенов — Read-инструменты упираются в лимит.
После чистки STATUS.md остаётся только активный board (🔴/🟡/⚪/🔵 + closed `[bootstrap-upgrade-canonical-triggers]` если уже отработал). Архивный файл `.tasks/.archive/done-2026-05.md` сохраняет полный текст всех перемещённых блоков для grep-поиска и historical context.
**Weight:** needs-human
**Status:** ready
**Where I stopped:** Создана 2026-05-07. После rollout v1.10.0/1.10.1 на STATUS.md накопилось много свежих 🟢 (bootstrap-add-tdd-trigger, refresh-project-bootstrap closed-as-superseded, bootstrap-fix-tdd-recommend-template, bootstrap-upgrade-canonical-triggers если уже отработал). Хороший момент для batch-archive.
**Next action:** 1) Прочитать `.tasks/STATUS.md` целиком (Read in chunks if needed). 2) Идентифицировать все блоки `## 🟢 [...]` — разделители `---`. 3) Создать `.tasks/.archive/` директорию (если нет). 4) Записать `.tasks/.archive/done-2026-05.md` с шапкой:
```markdown
# Archived — Done batch 2026-05
Перемещено из `.tasks/STATUS.md` 2026-05-07 в рамках board-cleanup. Полный список 🟢 done-тасок, шипанутых в апреле-мае 2026.
Полный source — git history `.tasks/STATUS.md` до commit X.
---
```
И подряд все 🟢-блоки в исходном виде.
5) Edit `.tasks/STATUS.md`: убрать все 🟢-блоки + соседние `---` разделители. Header + status legend + 🔴/🟡/⚪/🔵 блоки оставить. 6) Verify: `grep '^## ' .tasks/STATUS.md | wc -l` — было ~28+, должно остаться число активных (🔴+🟡+⚪+🔵, ожидание ~10-12). 7) Commit `meta(tasks): archive done batch 2026-05 → .tasks/.archive/done-2026-05.md` с body, описывающим какие группы перемещены (tdd-criteria, hermes, bootstrap, etc.) и итоговый count. 8) `tasks_close`.
NB: эта таска сама уйдёт в следующий cleanup batch (2026-06 или подобный), так что не пытаться её закрыть+архивировать в одном коммите.
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: meeting-room / 2026-05-07T09:43:23.919Z -->
---
## 🟢 [using-synology-ops-review] — Skill-review checkpoint для using-synology-ops (промоушен 2026-05-12).
**Status:** done (wontfix)
**Where I stopped:** Closed 2026-05-25 — Synology NAS decommissioned permanently. Skill `using-synology-ops` is now dead-code candidate (full retire tracked separately). Review acceptance criteria (behavioral smoke-test, Steps behavior, Failure modes, What NOT to do) have no target — both the underlying MCP server (`opsmcp.kzntsv.site`) and the host fleet (modulair-* containers) are gone.
**Next action:** (none — closed as wontfix; full skill retire is a separate task)
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-12T16:22:03.380Z -->
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-25 / wontfix: NAS decommissioned -->
---
## 🟢 [using-vds-ops-description-length-investigate] — Investigate description length vs MEMORY ≤900 char limit. Drift between memory feedback и реальным harness behavior?
**Status:** done (wontfix — empirical close)
**Where I stopped:** Closed 2026-05-25. Empirical evidence sufficient: `using-vds-ops` description = 1473 chars activates correctly (7/7 behavioral smoke-test PASSED, harness listing shows full description, hermes/mapping.yaml processes it fine). MEMORY note `feedback_skill_description_length_limit.md` was paranoid — actual limit either raised or never as tight as feared. Hypothesis (c) confirmed. No need for systematic measurement — investigation cost > information value.
**Side effect:** Memory entry `feedback_skill_description_length_limit.md` deleted same commit (no longer load-bearing). YAML colon-space gotcha memory (`feedback_skill_description_yaml_colon_gotcha.md`) kept — different concern, still valid.
**Next action:** (none — closed)
**Branch:** n/a
<!-- created-by: vitya@DESKTOP-NSEF0UK / 2026-05-21 / origin: [using-vds-ops-review] fresh-eyes subagent informational note #1 -->
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-25 / wontfix: empirically 1473 chars works, memory note was paranoid; entry deleted -->
---
## 🟢 [using-synology-ops-disambiguation-uplift] — Add explicit disambiguation clause to `using-synology-ops` description (sibling parity with `using-vds-ops`).
**Status:** done (wontfix)
**Where I stopped:** Closed 2026-05-25 — Synology NAS decommissioned, no longer in fleet. Disambiguation between NAS / VDS for shared container names (`traefik` etc.) is moot when only VDS exists. Acceptance criteria no longer have a target.
**Next action:** (none — closed as wontfix)
**Branch:** n/a
<!-- created-by: vitya@DESKTOP-NSEF0UK / 2026-05-21 / origin: [using-vds-ops-review] fresh-eyes subagent informational note #2 -->
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-25 / wontfix: NAS decommissioned; sibling skill using-synology-ops itself is now a retirement candidate — see follow-up question -->
## 🟢 [using-yt-tools-listen-skill-update] — Расширить `skills/using-yt-tools/SKILL.md` поддержкой нового CLI `yt-listen` (audio/FFT analysis).
**Дизайн-контекст:**
- Спецификация: `mcp__projects-meta__knowledge_get` slug `concepts/yt-tools-audio` в `OpeItcLoc03/common`.
- Process trace: `~/projects/.workshop/.archive/2026-05-25-yt-tools-audio.md`.
- Текущий SKILL.md (v0.3.x): уже триггерится на YouTube URL + transcript/frames; расширить аудио-триггерами и iterative-флоу.
**Изменения в SKILL.md:**
1. **`description` frontmatter** — добавить аудио-семантику без раздувания (existing description уже длинноват, аккуратно):
- Новые триггеры: «послушай момент N», «BPM/тональность/гармония видео», «спектрограмма», «что в музыке на T», «listen to fragment», «analyze audio».
2. **Steps section** — расширить iterative-флоу:
- Для музыкальных URL: `yt-transcript` опциональный (если captions есть), `yt-listen --timestamps T1,T2,...` primary.
- Output: per timestamp — `clip_TTTT.wav` + `spectrum_TTTT.png` + `features_TTTT.md`.
- Агент Read'ом получает spectrum.png (vision) + features.md (числа).
- Помнить: spectrum image-only недостаточен; всегда читать features.md в паре (Dixit et al., arXiv 2411.12058).
3. **What NOT to do** — точечная защита от scope creep:
- НЕ вызывать Whisper на смешанной музыке (без source-separation = мусор). Если user просит lyrics из музыки — сказать что это отдельный pipeline (Demucs + Whisper), out of scope.
- НЕ интерпретировать spectrum-PNG без features.md.
4. **Step 0 probe** — добавить проверку `yt-listen` в существующую цепочку (PATH → pipx-shim → legacy venv).
**Bump:** PATCH (0.3.x → 0.3.(x+1)) — поверхностное расширение, не breaking.
**TDD-mode:** `claude-skills` имеет `follow tdd-criteria` в CLAUDE.md, но это markdown-документ (SKILL.md), не код — TDD не применим. Behavioral smoke-test покрывается отдельной таской `using-yt-tools-listen-test-trigger`.
**Status:** done
**Where I stopped:** shipped (fd8a382, NOT pushed per task instruction). SKILL.md v0.3.1 → v0.3.2 PATCH. Изменения: (1) description frontmatter — добавлены audio-триггеры (BPM/тональность/гармония/спектрограмма/listen to fragment/analyze audio); (2) "Three flows" + новый Flow C — audio-analysis под "When to use"; (3) Step 0 probe расширен — yt-listen в install-set (5 binaries вместо 4) + диагностика "только yt-frames без yt-listen = старый 0.1.x"; (4) Inputs-table добавлена Flow C row (--duration, --mode interval, --no-wav, --no-spectrogram, --linear, --chroma, --sample-rate); (5) Steps добавлена "### Flow C — audio-analysis" секция с pipeline-шагами и stdout-контрактом; (6) What NOT to do: точечная защита от Whisper-on-mixed-music (Demucs+Whisper отдельный pipeline, out of scope) + правило "spectrum-PNG только в паре с features.md" (VLM ~50-60% Dixit et al. arXiv 2411.12058). Install.sh не запускался, hermes/mapping.yaml не правился, push отложен (test-trigger разблокирован, но требует чистой сессии).
**Next action:** (none — kept until merged)
2. Прочитать `concepts/yt-tools-audio` из global wiki + workshop archive.
3. Открыть `skills/using-yt-tools/SKILL.md`.
4. Внести изменения по 4 пунктам выше.
5. Bump version в frontmatter (PATCH).
6. Commit: `feat(using-yt-tools): add yt-listen support (audio/FFT) v0.3.<x+1>`.
7. **НЕ запускать install.sh, НЕ делать push, НЕ править hermes/mapping.yaml**`install` и `hermes-mapping` идут отдельными скил-baseline-тасками (создадутся если/когда понадобятся; для PATCH update обычно достаточно reload-plugins).
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-25T09:51:08.193Z -->
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-05-25T10:38:20.156Z / note: shipped (fd8a382, NOT pushed per task instruction). SKILL.md v0.3.1 → v0.3.2 PATCH. Изменения: (1) description frontmatter — добавлены audio-триггеры (BPM/тональность/гармония/спектрограмма/listen to fragment/analyze audio); (2) "Three flows" + новый Flow C — audio-analysis под "When to use"; (3) Step 0 probe расширен — yt-listen в install-set (5 binaries вместо 4) + диагностика "только yt-frames без yt-listen = старый 0.1.x"; (4) Inputs-table добавлена Flow C row (--duration, --mode interval, --no-wav, --no-spectrogram, --linear, --chroma, --sample-rate); (5) Steps добавлена "### Flow C — audio-analysis" секция с pipeline-шагами и stdout-контрактом; (6) What NOT to do: точечная защита от Whisper-on-mixed-music (Demucs+Whisper отдельный pipeline, out of scope) + правило "spectrum-PNG только в паре с features.md" (VLM ~50-60% Dixit et al. arXiv 2411.12058). Install.sh не запускался, hermes/mapping.yaml не правился, push отложен (test-trigger разблокирован, но требует чистой сессии). -->
---
## 🟢 [using-yt-tools-listen-test-trigger] — Behavioral smoke-test для расширения `using-yt-tools` под `yt-listen`. Без TDD per-se (это смок поверх готового), но включает explicit before-after evidence — что без скила агент не вызывает `yt-listen` на новых триггерах, а с обновлённым скилом — вызывает корректно.
**Дизайн-контекст:** см. `concepts/yt-tools-audio` (target=`OpeItcLoc03/common`) — какие триггеры обязательны, какой output ожидаем.
**TDD-mode (per `claude-skills` `follow tdd-criteria`):** для behavioral skill-теста applicable интерпретация — **write expectations first, then verify**. Тест-сценарии сформулировать ДО запуска агента, не подгонять под наблюдаемое поведение.
**Acceptance (test scenarios):**
1. **Trigger activation positive (минимум 4 фразы):**
- «послушай момент 2:30 в этом ролике <URL>» → агент вызывает `yt-listen URL --timestamps 2:30`.
- «какой BPM в <URL>» → `yt-listen URL` (без timestamp = bulk-mode hint или quick-default).
- «listen to fragment at 1:15 <URL>» → `yt-listen URL --timestamps 1:15`.
- «спектрограмма видео <URL>» → `yt-listen --timestamps` с хотя бы одним таймкодом (агент должен выбрать sensible default или спросить).
2. **Trigger activation negative (3 близкие, но не свои):**
- «расшифруй видео <URL>» → `yt-transcript`, НЕ `yt-listen`.
- «покажи кадр на 1:23 <URL>» → `yt-frames`, НЕ `yt-listen`.
- «о чём этот ролик <URL>» → `yt-transcript` + summary, НЕ `yt-listen` (нет музыкального контекста).
3. **What-NOT-to-do compliance:**
- User: «дай lyrics из <музыкальный URL>» → агент НЕ должен вызывать Whisper / `yt-transcribe-music`; должен объяснить что это отдельный pipeline (Demucs + Whisper), out of scope `yt-listen`.
4. **E2E против реального URL** (короткий музыкальный клип, e.g. 1-минутный royalty-free track):
- `yt-listen URL --timestamps 0:30 --duration 10s` создаёт 3 артефакта в `./yt-cache/<vid>/audio/`.
- `features_0030.md` содержит BPM, key, хотя бы одну строку chord progression, RMS, spectral centroid.
- `spectrum_0030.png` валиден (открывается, ~1024×384, mel-scale читаема).
**Закрытие:** все 4 группы зелёные, findings — отдельные follow-up tasks через `tasks_create` если есть.
**Status:** done
**Where I stopped:** behavioral 8/8 ✅ (4 pos→yt-listen, 3 neg-route→transcript/frames, 1 W-NOT-do→Demucs+Whisper pointer); E2E content 5/5 ✅ (BPM 113.5, Key G# Minor, chord G#→D#, RMS 0.14/0.22, centroid 2882 Hz; PNG 1024×384 mel+log+viridis vision-checked); naming divergence + PATH-shim gap → follow-ups: OpeItcLoc03/common slug=yt-listen-naming-align, claude-skills slug=using-yt-tools-listen-path-shim-investigate
**Next action:** (none — kept until merged)
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-25T09:51:38.340Z -->
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-05-25T12:36:06.299Z / note: behavioral 8/8 ✅ (4 pos→yt-listen, 3 neg-route→transcript/frames, 1 W-NOT-do→Demucs+Whisper pointer); E2E content 5/5 ✅ (BPM 113.5, Key G# Minor, chord G#→D#, RMS 0.14/0.22, centroid 2882 Hz; PNG 1024×384 mel+log+viridis vision-checked); naming divergence + PATH-shim gap → follow-ups: OpeItcLoc03/common slug=yt-listen-naming-align, claude-skills slug=using-yt-tools-listen-path-shim-investigate -->
---
## 🟢 [using-yt-tools-listen-path-shim-investigate] — SKILL.md Prerequisites/Invoke pattern рекомендует `$HOME\.local\bin\yt-dlp.exe` — на DESKTOP-NSEF0UK даёт `SRE module mismatch` (uv-managed cpython-3.12 corrupt). Working path = `$HOME\pipx\venvs\yt-tools\Scripts`. Источник: E2E E1 в `using-yt-tools-listen-test-trigger` STEP 5 — default invoke упал, ручной prepend venv Scripts dir починил. Решить: shim-corruption local или systemic gap в SKILL.
**Status:** done (wontfix — machine-local transient)
**Where I stopped:** Closed 2026-05-25. SRE не воспроизводится. На машине обнаружены три yt-dlp: (a) `Python313\Scripts\yt-dlp.exe` (system pip, первый на PATH), (b) `~\.local\bin\yt-dlp.exe` (uv tool install → uv-managed Python 3.14.3), (c) `~\pipx\venvs\yt-tools\Scripts\yt-dlp.exe` (pipx-bundled с yt-tools, Python 3.12.13). Все три отвечают `--version` exit 0. Все три интерпретатора (3.12.13/3.13.13/3.14.3) импортят `re` без SRE error. Shim'ы `yt-listen.exe` в `.local/bin` и pipx venv — байт-идентичны (SHA256 match). Диагноз task'и «uv-managed cpython-3.12 corrupt» вероятно misdiagnosis — реальный виновник на момент smoke-test был `Python313\Scripts\yt-dlp.exe` (первый на PATH). uv с тех пор апгрейднулся 3.12 → 3.14.3, что независимо могло залечить состояние. SKILL.md "Locating binaries" уже имеет корректную fallback chain (PATH → `~/.local/bin` → legacy venv); прописывать `$HOME\pipx\venvs\yt-tools\Scripts` приоритетным не нужно.
**Next action:** (none — closed as wontfix; если рекуррент на другой машине — root-cause вероятно corrupt system-Python `_sre.pyd`, не SKILL gap)
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/claude-skills / 2026-05-25T12:35:52.467Z -->
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-25 / wontfix: SRE не воспроизводится; три yt-dlp на машине (Python313 system / uv / pipx-bundled), все работают; shim'ы byte-identical; SKILL.md уже корректна -->
---
## ⚪ [meta-host-routing-install] — Установить новый скил `meta-host-routing` v0.1.0 (закоммичен локально a7526d1, ещё не установлен — потому не триггерит).
Запустить `install.sh` в `~/projects/claude-skills/`, проверить что скил активируется в новой сессии, `/reload-plugins`.
**Weight:** needs-human
**Status:** ready
**Where I stopped:** (not started)
**Next action:** Запустить install.sh, открыть новую CC-сессию, убедиться что meta-host-routing в available-skills, /reload-plugins.
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-27T06:51:20.306Z -->
---
## 🟢 [meta-host-routing-hermes-mapping] — Добавить запись `meta-host-routing` в `~/projects/claude-skills/hermes/mapping.yaml`.
Режим: **pending** (не auto) — скил трогает инструменты/окружение (projects-meta MCP: tasks_create/knowledge_ingest/meta_status), требует отдельного hermes-аудита перед auto-promotion.
**Weight:** needs-human
**Status:** 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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-27T06:51:27.010Z -->
<!-- closed-by: vitya@claude-skills:clean-session / 2026-06-17 / mapped pending (intended auto/meta) during hermes build-integrity fix; build GREEN; commit 43f9912 -->
---
## ⚪ [meta-host-routing-test-trigger] — Прогнать триггер-фразы `meta-host-routing` из description на тестовом сценарии.
**Должен активироваться:** «project not in cache» от projects-meta; промоушен/таски для проекта с github-remote; «заведи таски в <github-проект>», «промоутни <github-проект>».
**НЕ должен (false-positive check):** обычный Gitea-проект уже в projects-meta (прямой маршрут); 2-3 близкие фразы из соседних доменов (using-projects-meta query, обычный tasks_create в known-проект).
**Weight:** needs-human
**Status:** ready
**Where I stopped:** (not started)
**Next action:** В чистой сессии прогнать активацию на своих фразах И убедиться что не фаерит на 2-3 чужих близких; зафиксировать результат.
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-27T06:51:35.089Z -->
---
## 🟢 [meta-host-routing-review] — Skill-review checkpoint для meta-host-routing (промоушен 2026-05-27).
**Источник дизайна:** `~/projects/.workshop/.archive/2026-05-10-meta-out-of-repo.md` (правило) + причина создания в `.workshop/.wiki/log.md` (2026-05-27).
**Импл-таски:** meta-host-routing-install, -hermes-mapping, -test-trigger.
**Кто делает:** НЕ имплементер. Другая сессия / агент.
**Поведенческий smoke-test (acceptance):**
- Активируется на каждой триггер-фразе из description (RU/EN).
- НЕ активируется на близких чужих фразах (known-Gitea-проект → прямой маршрут).
- Steps отрабатывают: detect (github remote / not-in-cache) → resolve meta-host (grep .common) → route. На реальном кейсе yt-tools резолвит `.common`.
- Failure modes уводят в STOP+ask (no host found / multiple hosts), не в гадание.
- What NOT to do соответствует реальности.
NB: написан целиком в обход workshop-promote skeleton-флоу (по решению user'а), потому тело уже заполнено — ревью проверяет содержание, не пустой каркас.
Findings → follow-up tasks в claude-skills.
**Закрытие:** когда findings зафайлены ИЛИ «нет findings» в close-note. Семвер дальше — владелец claude-skills.
**Status:** done
**Where I stopped:** Ревью прогнано 2026-06-11 против текущего v0.3.0 (НЕ имплементер; baseline `-test-trigger` субсумирован этим smoke-тестом). **Вердикт: PASS, нет блокирующих findings.** (1) Behavioral smoke-test 8/8 чисто через clean-context субагентов (simulated registry: meta-host-routing + using-projects-meta/using-tasks/delegate-task/setup-tasks/project-bootstrap, без подсказки ожидаемого ответа): positives 5/5 → meta-host-routing (P1 not-in-cache, P2 github-remote, P3 RU «заведи таски в github-проект», P4 RU «промоутни yt-tools», P5 EN github-hosted); negatives 3/3 мимо (N1 «по всем проектам»→using-projects-meta, N2 «заведи таску в books» known-Gitea→delegate-task [явно сослался на Skip-клаузу], N3 «обнови статус … в текущем проекте»→using-tasks). Ноль false-positive. (2) Steps executable против ЖИВОЙ инфры: Step 2a yt-tools→`OpeItcLoc03/meta-yt-tools` резолвится (projects-meta трекает доску); Step 2b grep yt-tools в `.common` даёт хиты; excludesFile+`~/.config/git/ignore` паттерны+auth.toml на месте. (3) Failure modes все уводят в STOP+ask / детерминированный recovery, не в гадание. (4) What-NOT-to-do — все 4 пункта реальны и консистентны со Skip-клаузой. (5) Completeness vs design: тело верно операционализирует meta-out-of-repo; `meta-<project>` naming укоренён в archive option-(ii) + уточнён 2026-05-27. **Findings: нет (на сам скил).** Observation (не дефект скила): acceptance-критерий этой таски «резолвит `.common`» УСТАРЕЛ — скил v0.3.0 + реальность роутят yt-tools в dedicated host `OpeItcLoc03/meta-yt-tools` (`.common` держит только done-архив); скил СВЕЖЕЕ спеки, само-резолвится этим закрытием. **Caveat (deployment):** `-install` и `-hermes-mapping` baselines НЕ зелёные — скил не в `~/.claude/skills/` и не в `hermes/mapping.yaml`; ревью покрывает только content+trigger-discrimination (subagent-proxy registry), НЕ живую активацию в харнесе и не build-зелёность. Эти 2 остаются под своими ⚪ тасками; новых follow-up НЕ завожу.
**Next action:** (none — closed by review, нет блокирующих findings; семвер дальше — владелец claude-skills). `-test-trigger` фактически покрыт (8/8) — закрыть его может владелец отдельно.
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-27T06:51:48.622Z -->
<!-- closed-by: DESKTOP-NSEF0UK:claude-opus:21356 / 2026-06-11 / VERDICT PASS; behavioral 8/8 (5 pos→mhr, 3 neg routed away), Steps verified vs live infra (meta-yt-tools host + .common grep), failure-modes→STOP, What-NOT accurate; no blocking findings; observation: task acceptance «.common» stale (skill v0.3.0 routes yt-tools→meta-yt-tools); caveat: install+hermes-mapping baselines still open -->
---
## 🟢 [private-dev-public-publish-install] — [skill private-dev-public-publish, baseline 1/3] Установить скил. Запустить `install.sh` в `~/projects/claude-skills/`, проверить что скил активируется в новой сессии (триггер-фразы из description), сделать `/reload-plugins`. Skeleton-коммит: 63eab18. NB: тело скила пока пустой каркас (Steps/Failure modes/… не заполнены) — это нормально для install (description достаточно для активации); тело дописывается вторым проходом «доведём private-dev-public-publish».
**Status:** done
**Where I stopped:** Установлен 2026-05-29 через `install.ps1 -Names private-dev-public-publish` (Windows) → `~/.claude/skills/private-dev-public-publish/SKILL.md`. Подтверждено: скил появился в available-skills прямо в этой сессии (харнес подхватил без явного /reload-plugins).
**Next action:** (none — done; настоящий behavioral-тест активации = задача -test-trigger в чистой сессии)
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-29T09:45:22.748Z -->
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-29 / installed via install.ps1; visible in available-skills this session -->
<!-- amg-handoff: 2026-05-29 / Claude — install verified by skill appearing in available-skills mid-session -->
---
## 🟢 [private-dev-public-publish-hermes-mapping] — [skill private-dev-public-publish, baseline 2/3] Добавить запись в `~/projects/claude-skills/hermes/mapping.yaml`. **Режим: pending** (НЕ auto) — скил не чисто стилевой: его Steps трогают git/gh/Gitea-API, токены, force-push, удаление/приватность репо. Требует отдельного аудита перед auto-режимом.
**Status:** done
**Where I stopped:** Запись добавлена в `hermes/mapping.yaml` (секция pending — behavioral audit required), `mode: pending` + `intended: {mode: auto, category: software-development}` + reason про git/gh/Gitea-API/токены/force-push/приватность. Стиль зеркалит using-vds-ops/session-handoff. version маппинга не бампал — schema-версия, не контент.
**Next action:** (none — done; перевод pending→auto только после аудита tool-side эффектов, гейт = -test-trigger + review)
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-29T09:45:29.551Z -->
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-29 / mapping entry added, mode:pending, intended auto/software-development -->
---
## 🟢 [private-dev-public-publish-test-trigger] — [skill private-dev-public-publish, baseline 3/3] Прогнать триггер-фразы из description на тестовом буфере: убедиться что активируется на СВОИХ фразах («опубликовать форк на гитхаб», «приватный гитеа публичный гитхаб», «publish a fork without exposing dev history», «curated publish to github») И НЕ активируется на 2-3 близких чужих (false-positive check): напр. «инициализируй проект» (→ project-bootstrap), «запушь на гитхаб» (обычный push, не публикация форка), «настрой приватный репо» (без upstream/публикации).
**Status:** done
**Where I stopped:** Прогнано 2026-05-29 через 7 параллельных clean-context субагентов (каждый — свежий контекст, прокси чистой сессии; имплементер прайменный). Результат: 4/4 positive → private-dev-public-publish ✅; 3/3 negative мимо (инициализируй→project-bootstrap, запушь→project-discipline push-gate, настрой приватный репо→project-bootstrap) ✅. Ноль false-positive. Findings нет — description хорошо отскоплен.
**Next action:** (none — done; clean pass, follow-up не требуется)
**Blocker:** (cleared)
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-29T09:45:38.735Z -->
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-29 / 4/4 pos + 3/3 neg clean, no false-positive, no findings (subagent clean-context proxy) -->
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-29T09:45:38.735Z -->
---
## 🟢 [private-dev-public-publish-review] — Skill-review checkpoint для private-dev-public-publish (промоушен 2026-05-29).
**Источник дизайна:** .workshop/.archive/2026-05-29-skill-private-dev-public-publish.md.
**Импл-таски:** private-dev-public-publish-{install, hermes-mapping, test-trigger}.
**Предусловие:** второй проход дописал тело каркаса (Steps/Failure modes/Side effects/What NOT to do) из архива — иначе поведенческий smoke-test нечего проверять.
**Кто делает:** НЕ имплементер. Другая сессия / другой агент. Identity-not-location.
**Поведенческий smoke-test (acceptance):**
- Активируется в чистой сессии на каждой триггер-фразе description (RU И EN).
- НЕ активируется на 2-3 близких чужих (project-bootstrap, обычный git push, приватный репо без публикации).
- Каждый шаг Steps отрабатывает на тестовом сценарии (fork + private Gitea + curated copy) без ошибок.
- Failure modes уводят в abort, не в частичный успех (особ.: безродный снапшот вместо форка; meta молча проигнорена глобальным gitignore; релиз без полного исходника).
- What NOT to do соответствует реальности.
Findings → follow-up tasks (private-dev-public-publish-<gap>-fix) в claude-skills.
**Закрытие:** все findings зафайлены ИЛИ ревьюер подтвердил «нет findings».
**NB семвер:** version 0.1.0 записан промоутером; дальнейшие бампы — владелец claude-skills, не ревьюер.
**Status:** done
**Where I stopped:** Review прогнан 2026-05-29 свежим non-implementer субагентом против заполненного тела v0.2.0. Вердикт: CHECK 1 (полнота vs архив) PASS, CHECK 2 (executability Steps) FAIL, CHECK 3 (failure modes→abort) PASS, CHECK 4 (What-NOT) PASS, CHECK 5 (description↔body) PASS. **3 findings, все устранены в том же v0.2.0 (некоммиченный инкремент, без двойного бампа):** (1) Step 5 копировал dev→pub без exclusion → утечка `.wiki/`/`.tasks/`/`CLAUDE.md` в публичный форк — добавлен явный meta-exclude + `.gitignore`-backstop + `git status`-чек + новый 4-й failure mode; (2) `origin` pub-папки не заводился до push — Step 4 теперь клонирует форк в pub (origin=fork, upstream=canonical); (3) minor — Step 3 «на той же базе» механизирован (clone fork→add gitea remote→push base). Re-install выполнен.
**Next action:** (none — done; все findings зафайлены и зафиксированы fix'ами; follow-up tasks не требуются)
**Blocker:** (cleared)
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-29T09:45:58.420Z -->
<!-- closed-by: vitya@DESKTOP-NSEF0UK / 2026-05-29 / non-implementer subagent review; 3 findings (meta-leak in copy, undefined pub origin, unmechanized base) all fixed in v0.2.0 -->
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-29T09:45:58.420Z -->
---
## 🟢 [delegate-task-install] — Запустить install.sh в ~/projects/claude-skills/, проверить что скил delegate-task активируется в новой сессии, сделать /reload-plugins.
**Weight:** needs-claude
**Notify:** OpeItcLoc03/workshop
**Status:** done
**Where I stopped:** hot-loaded the skill mid-session (same evidence the prior install task closed on). A clean-session behavioral trigger run is intentionally scoped to the separate `delegate-task-test-trigger` task, not this install task.
No code/TDD surface (markdown skill + board update). The install writes outside the repo to `~/.claude/skills/`, so the only committable artifact was the `.tasks/STATUS.md` close.
**Next action:** (none — kept until merged)
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T08:42:01.631Z -->
<!-- closed-by: DESKTOP-NSEF0UK:claude-opus:11140 / 2026-06-09 / installed via install.ps1; visible in available-skills this session -->
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-06-09T09:20:28.812Z / note: hot-loaded the skill mid-session (same evidence the prior install task closed on). A clean-session behavioral trigger run is intentionally scoped to the separate `delegate-task-test-trigger` task, not this install task.
No code/TDD surface (markdown skill + board update). The install writes outside the repo to `~/.claude/skills/`, so the only committable artifact was the `.tasks/STATUS.md` close. -->
---
## 🟢 [delegate-task-hermes-mapping] — Добавить запись delegate-task в ~/projects/claude-skills/hermes/mapping.yaml. Режим: pending (скил трогает MCP-инструменты — требует аудит перед auto).
**Weight:** needs-claude
**Notify:** OpeItcLoc03/workshop
**Status:** done
**Where I stopped:** ed entry — which confirms `delegate-task` is now correctly mapped. Mapping `meta-host-routing` requires its own per-skill audit (mode + category) and belongs to a separate task; I did not guess it. Recommend a follow-up task to map `meta-host-routing` so the build goes green again.
Note: I skipped the session-handoff hook suggestion — this is a one-shot delegated task, not an interactive session.
**Next action:** (none — kept until merged)
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T08:42:04.880Z -->
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-06-09T09:23:28.902Z / note: ed entry — which confirms `delegate-task` is now correctly mapped. Mapping `meta-host-routing` requires its own per-skill audit (mode + category) and belongs to a separate task; I did not guess it. Recommend a follow-up task to map `meta-host-routing` so the build goes green again.
Note: I skipped the session-handoff hook suggestion — this is a one-shot delegated task, not an interactive session. -->
---
## 🟢 [delegate-task-test-trigger] — Прогнать триггер-фразы из description на тестовом буфере: убедиться что скил активируется на своих фразах И не активируется на 2-3 близких чужих (false-positive check).
Тест-фразы (должны активировать): «делегировать таску», «delegate task», «создать задачу на агента», «поставить задачу агенту», «tasks_create для».
False-positive check (не должны активировать): «создать задачу себе», «обновить таску», «закрыть таску».
**Weight:** needs-claude
**Notify:** OpeItcLoc03/workshop
**Status:** done
**Where I stopped:** Прогнано 2026-06-09 через clean-context субагентов (свежий контекст = прокси чистой сессии, имплементер прайменный). Каждому давалась только тест-фраза как первое сообщение + реалистичный neighborhood available-skills (delegate-task + конкуренты using-tasks/using-projects-meta/setup-tasks/session-handoff и др.), без подсказки «какой скил ожидается». **Positives 5/5 ✅:** «делегировать таску»→delegate-task; «delegate task to the books project»→delegate-task; «создать задачу на агента»→delegate-task; «поставить задачу агенту»→delegate-task; «tasks_create для проекта X»→delegate-task. **Negatives 2/3:** «обновить таску»→using-tasks ✅, «закрыть таску»→using-tasks ✅, **«создать задачу себе [на завтра]»→delegate-task ❌ FALSE POSITIVE (5/5 trials, консистентно)**. Корень: триггер «создать задачу на агента» матчится по стему «создать задачу», а негатив-клауза "Does NOT apply when doing the work yourself" слишком абстрактна чтобы перебить literal-match под 1%-rule — субагенты распознавали «себе»-исключение в reasoning, но всё равно ставили delegate-task FIRST. Finding → follow-up `delegate-task-description-fp-fix` (ниже) + кормит `delegate-task-review`.
**Next action:** (none — done; follow-up зафайлен)
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T08:42:09.557Z -->
<!-- closed-by: DESKTOP-NSEF0UK:claude-opus:11140 / 2026-06-09 / pos 5/5, neg 2/3; reliable FP on «создать задачу себе» (5/5 trials) → follow-up delegate-task-description-fp-fix -->
---
## 🟢 [delegate-task-description-fp-fix] — Устранить false-positive активацию `delegate-task` на «создать задачу себе» (self-assigned task).
**Находка** (`delegate-task-test-trigger`, 2026-06-09, 5/5 trials): фраза «создать задачу себе [на завтра]» консистентно фаерит `delegate-task` вместо `using-tasks`. Триггер `«создать задачу на агента»` матчится по стему «создать задачу»; негатив-клауза "Does NOT apply when doing the work yourself" слишком абстрактна — субагенты распознавали «себе» в reasoning, но всё равно ставили delegate-task FIRST под 1%-rule.
**TDD:** N/A (markdown/description). Верификация = повторный clean-context trigger-прогон.
**Weight:** needs-claude
**Status:** done
**Where I stopped:** Shipped 2026-06-09. `skills/delegate-task/SKILL.md` 0.2.0→0.2.1 (PATCH). Description negative-clause сделана literal+routed: «создать задачу себе» / «task for myself» / «поставить себе задачу» → using-tasks; body "Не применяется" получил self-assigned буллет + дизамбигуатор («на агента»/«агенту»/«в проект X» = делегирование; «себе»/«myself» = своя доска). Верификация — fresh-context субагенты, симулированный available-skills registry (новое описание + конкуренты using-tasks/using-projects-meta/setup-tasks/session-handoff), без подсказки об ожидаемом ответе: **positives 5/5** (все 5 делегирующих фраз → delegate-task, регресса нет), **negative «создать задачу себе на завтра» 4/5 → using-tasks** (было 0/5 до фикса). Единственный остаточный miss reasoned правильно («себе»→using-tasks), но споткнулся об eval-артефакт (промпт форсил имя скила в первой строке ДО reasoning), не об неоднозначность описания. Concept page `.wiki/concepts/delegate-task-negative-trigger-fp.md` + index/log обновлены. NB: re-install (`~/.claude/skills/`) и hermes/mapping не трогал — install это отдельная baseline-таска (для PATCH достаточно reload-plugins), а правка только negative-clause не меняет tool-touching семантику (mapping mode остаётся pending).
**Next action:** (none — kept until merged). Optional follow-up: разблокировать `delegate-task-review` (его smoke-test включает этот negative-кейс).
**Branch:** n/a
<!-- created-by: DESKTOP-NSEF0UK:claude-opus:11140 / from: delegate-task-test-trigger finding / 2026-06-09 -->
<!-- closed-by: DESKTOP-NSEF0UK:claude-opus:11140 / 2026-06-09 / 0.2.0→0.2.1 PATCH; literal negative-clause; verified pos 5/5 + neg 4/5 (was 0/5); 1 residual miss = eval-harness artifact -->
---
## 🟢 [delegate-task-review] — Skill-review checkpoint для delegate-task (промоушен 2026-06-09).
**Источник дизайна:** .workshop/.archive/2026-06-09-agent-task-delegation-format.md.
**Импл-таски:** delegate-task-install, delegate-task-hermes-mapping, delegate-task-test-trigger.
**Кто делает:** не имплементер. Другая сессия / другой день.
**Поведенческий smoke-test:**
- Активируется на каждой trigger-фразе из description (RU + EN)
- Не активируется на «создать задачу себе», «обновить таску», «закрыть таску»
- Pre-flight gate (4 вопроса) задаётся перед tasks_create
- Тело задачи содержит секцию «## Обязательные скилы» с императивными invoke
- Поля weight/notify/allow_upgrade присутствуют в созданной задаче
- Failure modes уводят в abort, не в частичный успех
Findings → follow-up tasks через tasks_create в claude-skills.
**Status:** done
**Where I stopped:** Review прогнан 2026-06-09 свежей non-implementer сессией против SKILL.md v0.2.1 (включает negative-trigger fp-fix). Все 3 blocker-таски 🟢 (install/hermes-mapping/test-trigger). **VERDICT: PASS — нет блокирующих findings.** Smoke-test 6 bullets: (1) trigger activation — 6/6 fresh clean-context субагентов: pos 3/3 [«делегировать таску»/«delegate task to the books project»/«поставить задачу агенту» → delegate-task], neg 3/3 [«создать задачу себе на завтра»/«обновить таску»/«закрыть таску» → using-tasks]; ранее FP-кейс «себе» теперь маршрутится верно (v0.2.1 literal-negative держится под fresh eyes); (2) negatives — ✅; (3) pre-flight gate ПРИСУТСТВУЕТ перед tasks_create (Step 1 до Step 3); (4) «## Обязательные скилы» с императивными invoke — ✅ (Step 2 template); (5) weight/notify/allow_upgrade — ✅ в template; (6) failure modes → abort/re-ask, не частичный успех — ✅. CHECK completeness vs design archive: все элементы Round 7/8 присутствуют (default skill-set, steering-loop поля, paired review-task, TDD да/нет, разрешения). CHECK executability: все Steps исполнимы реальным tasks_create (notify=native param; weight/allow_upgrade пишутся в body как board-convention — поллер читает оттуда; dry-run confirm=false; paired review-task через status=blocked+blocker — native). **3 информационные заметки (не дефекты, follow-up не заводил):** (a) pre-flight gate теперь 5 вопросов (добавлен Q0 critical-infra→needs-human), а design-архив/acceptance говорят «4» — это улучшение, согласованное с What-NOT-to-do правилами про needs-human для инфры; skill менять не надо, текст acceptance устарел; (b) body-template хардкодит `.wiki/concepts/<slug>.md`, design Round 6 хотел выбор папки (concepts/entities/raw) — concepts/ разумный дефолт per wiki-schema; (c) Inputs перечисляет weight/allow_upgrade рядом с notify, но native tasks_create-параметр только notify — weight/allow_upgrade это body-поля; косметика, не дефект.
**Next action:** (none — done; PASS, нет блокирующих findings, follow-up tasks не требуются)
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T08:42:20.151Z -->
<!-- closed-by: DESKTOP-NSEF0UK:claude-opus:26012 / 2026-06-09 / VERDICT PASS; smoke-test 6/6 (trigger pos 3/3 + neg 3/3 fresh subagents); completeness+executability checks pass; 3 informational notes, no blocking findings, no follow-up tasks -->
---
## 🟢 [session-break-using-tasks] — ## Goal
Add `session_break` field support to `using-tasks` skill v1.1.0 → v1.2.0.
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-06-09T13:34:20.319Z / note: hermes/mapping.yaml` и не запускал install.** Версия в mapping — это schema-версия, не контент (подтверждено прошлыми тасками); для policy-правки install/mapping идут отдельными baseline-тасками. Если нужен re-install в `~/.claude/skills/` — это вне скоупа этой задачи.
3. **Не пушил**, хотя в задаче `auto-push: yes` — прямая инструкция раннера («do NOT push — the runner delivers it») перевешивает. -->
## Design
Поле `session_break: true | "<hint>"` в frontmatter задачи — маркер точки разрыва сессии.
После закрытия задачи (статус 🟢), ДО `tasks_claim_next`:
1. Прочитать frontmatter закрытой задачи
2. Если `session_break` присутствует — вывести:
`🔚 SESSION BOUNDARY — [slug] закрыта. Рекомендую завершить текущую сессию. Следующий трек: [value | "см. STATUS.md"]`
3. Остановиться, не клеймить следующую задачу
Без флага — поведение прежнее.
## Acceptance criteria
- [ ] SKILL.md → v1.2.0
- [ ] Поле `session_break` задокументировано в frontmatter-конвенциях (тип: bool | string, примеры)
- [ ] Правило проверки: ПОСЛЕ close, ДО claim-next — явно вписано в раздел Task completion
- [ ] Формат SESSION BOUNDARY сообщения зафиксирован дословно
## Skills
- invoke `using-tasks` (прочитать текущий SKILL.md перед правкой)
## Permissions
- interns: no
- auto-push: yes
## Weight
needs-claude
**Weight:** needs-claude
**Status:** done
**Where I stopped:** Shipped — `skills/using-tasks/SKILL.md` 1.1.0→1.2.0 (MINOR). Added `session_break` marker: (1) optional `**Session break:**` field in the STATUS.md format block + new "### `session_break` marker" subsection documenting type (bool | string) with examples (`true` → "см. STATUS.md", `"<hint>"` → named next track) and where it lives (task frontmatter / board mirror); (2) Task completion **step 6** — after close 🟢 + commit, before `tasks_claim_next`, read the closed task's `session_break`; if present, print the verbatim SESSION BOUNDARY line and STOP, else behaviour unchanged; (3) Rules bullet "Honour `session_break`". Verbatim message fixed dead-on per design. Wiki: `concepts/using-tasks-session-break.md` + index + log. All 4 acceptance criteria met (docs/policy artifact — no test surface; coverage by diff inspection).
**Next action:** (none — kept until merged; paired review task `session-break-using-tasks-review` unblocked)
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T10:15:26.019Z -->
<!-- closed-by: DESKTOP-NSEF0UK:claude-opus:18704 / 2026-06-09 / 1.1.0→1.2.0 MINOR; session_break marker (format docs + Task-completion step 6 + Rules bullet + verbatim SESSION BOUNDARY line); wiki concept page; 4/4 acceptance met by inspection (markdown policy, no test surface) -->
---
## 🟢 [session-break-delegate-task] — ## Goal
Add `session_break` as optional field to `delegate-task` task body template v0.2.1 → v0.2.2.
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-06-09T13:39:17.598Z / note: in real time` rule is a hard requirement, and this mirrors the sibling `using-tasks-session-break.md`. Alternative passed over: extending the existing sibling page instead of a new one.
- **Left `session-break-delegate-task-review` 🔵 blocked** (did not auto-unblock) — mirrors how the sibling `session-break-using-tasks-review` was left after its impl closed; review claiming is handled separately. -->
## Design
Добавить в template тела задачи:
```
session_break: "<hint>" # optional — using-tasks остановится после close и предложит закрыть сессию
```
Добавить Q6 в pre-flight gate:
> "Нужен ли разрыв сессии после этой задачи? (domain-switch, milestone, heavy infra)"
Если да — ставить `session_break: "<название следующего трека или hint>"` в создаваемую задачу.
Usage guidance (три случая):
1. Смена домена / репо — переход между несвязанными треками
2. Milestone-задача — последняя в группе sub-tasks фичи
3. Тяжёлые инфра-задачи — shared checkout, migrations
## Acceptance criteria
- [ ] SKILL.md → v0.2.2
- [ ] Template: поле `session_break` с inline-комментарием и примером
- [ ] Pre-flight Q6 добавлен после Q5 (notify)
- [ ] Usage guidance: три случая когда ставить
## Skills
- invoke `delegate-task` (прочитать текущий SKILL.md перед правкой)
## Permissions
- interns: no
- auto-push: yes
## Weight
needs-claude
**Status:** done
**Where I stopped:** Shipped — `skills/delegate-task/SKILL.md` 0.2.1→0.2.2 (PATCH). Authoring side of the `session_break` marker (consumer = using-tasks v1.2.0). (1) Pre-flight gate 5→6 questions: new Q (item `5.`, after `4. notify`) — "Session-break после этой задачи? (domain-switch / milestone / heavy infra)"; if yes → set `session_break` in body, if no → omit (default unchanged). (2) Template trailer gains optional `[**session_break:** true | "<hint>"]` with inline comment (next to weight/notify/allow_upgrade; `session_break` = same lowercase frontmatter key using-tasks reads). (3) Usage-guidance block after the template lists the three set-it cases + ties to using-tasks Task-completion step 6 / SESSION BOUNDARY line. (4) What-NOT-to-do bullet warns against setting it routinely. Wiki: `concepts/delegate-task-session-break.md` (links [[using-tasks-session-break]]) + index + log. All 4 acceptance criteria met by inspection (markdown policy artifact — no test surface). NB on numbering: SKILL numbers pre-flight 0-indexed (04), 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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T10:15:32.125Z -->
<!-- closed-by: DESKTOP-NSEF0UK:claude-opus:18704 / 2026-06-09 / 0.2.1→0.2.2 PATCH; session_break authoring field (pre-flight Q6 + optional template trailer field + 3-case usage guidance + What-NOT bullet); wiki concept page; 4/4 acceptance met by inspection (markdown policy, no test surface) -->
---
## 🟢 [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-тасок в этом же файле (`<!-- closed-by … -->` в локальном STATUS.md). Альтернатива, которую отверг: `tasks_close confirm:true` — отдал реконсиляцию meta-системы раннеру.
**Next action:** (none — kept until merged)
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T10:15:45.969Z -->
<!-- closed-by: DESKTOP-NSEF0UK:claude-opus:18704 / 2026-06-09 / VERDICT PASS; 4/4 acceptance met (rule placement step 6 after-close-before-claim ✅; SESSION BOUNDARY verbatim ✅; absent-flag no-regression ✅; v1.2.0 via 9a518fc ✅); no blocking findings, no follow-up -->
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-06-09T14:14:12.142Z / note: **не** вызывая `mcp__projects-meta__tasks_close` — этот тул мутирует Gitea-remote (push-like), что конфликтует с инструкцией раннера "do NOT push — the runner delivers it". Это совпадает с видимым паттерном закрытия прошлых review-тасок в этом же файле (`<!-- closed-by … -->` в локальном STATUS.md). Альтернатива, которую отверг: `tasks_close confirm:true` — отдал реконсиляцию meta-системы раннеру. -->
---
## 🟢 [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T10:15:48.687Z -->
<!-- closed-by: DESKTOP-NSEF0UK:claude-opus:18704 / 2026-06-09 / VERDICT PASS; 4/4 acceptance met (Q6 placement after notify ✅; template field w/ inline comment ✅; 3-case usage guidance ✅; v0.2.2 ✅); author↔consumer key match grep-verified; 1 informational note (0-indexed numbering, cosmetic), no blocking findings, no follow-up -->
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-06-09T14:17:28.456Z / note: 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.) -->
---
## 🟢 [skill-using-system-snapshot] — ## Goal
Создать скил `using-system-snapshot` в `claude-skills`.
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-06-09T13:44:08.725Z / note: Shipped skills/using-system-snapshot/SKILL.md v0.1.0 (commit 069b041, NOT pushed per runner). Thin read-only wrapper over meta_system_snapshot: 3 trigger groups (what's running / system status / poller alive — RU+EN), explicit no-claim-without-call rule, 3-line output format (poller / docker / tasks), liveness split (poller+docker live, tasks cached), scope-defers to using-vds-ops + using-projects-meta. Dependency documented (Prerequisites → setup-projects-meta). Output shape verified live. 3/3 acceptance met. Wiki concept page + index + log. TDD N/A (markdown); behavioral smoke-test = paired -review task. -->
## Назначение
Заменить разрозненные ops-проверки (tasklist, docker ps, meta_status вручную) одним вызовом `mcp__projects-meta__meta_system_snapshot` в начале сессии.
## Содержание скила
- **Когда вызывать**: старт сессии при ops-контексте; перед любым утверждением о состоянии процессов/поллера
- **Что делать**: вызвать `mcp__projects-meta__meta_system_snapshot`, интерпретировать ответ
- **Формат вывода**: одна строка на секцию — поллер (стоп/работает + проекты), docker (ОК / список проблем), задачи (сводка по проектам)
- **Запрет**: не утверждать состояние процессов без предварительного вызова snapshot
## Acceptance criteria
- [ ] `skills/using-system-snapshot/SKILL.md` создан
- [ ] Trigger-фразы описаны: «что запущено», «состояние системы», «поллер работает?»
- [ ] Dependency: инструмент `meta_system_snapshot` должен быть готов (`meta-system-snapshot` в .common)
## Permissions
- interns: no
- auto-push: yes
## Weight
needs-claude
**Weight:** needs-claude
**Status:** ready
**Where I stopped:** Разблокировано 2026-06-09 — meta-system-snapshot в OpeItcLoc03/common закрыт (review прошёл, live call верифицирован).
**Next action:** Написать skills/using-system-snapshot/SKILL.md
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T11:01:41.414Z -->
---
## 🟢 [skill-using-system-snapshot-review] — Review скила `using-system-snapshot`.
Проверить:
- [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T11:01:59.476Z -->
<!-- closed-by: DESKTOP-NSEF0UK:claude-opus:18704 / 2026-06-09 / VERDICT PASS 3/3 acceptance; live tool-contract verify + 9-way fresh-context trigger test (8 clean); 3 informational findings (task-count overlap by-design, local-container gap = vds-ops scope, deployment scaffold missing); no skill edits / no bump -->
---
## 🟢 [using-tasks-status-read-perf] — ## Goal
Убрать жалобы агента на «огромный STATUS.md» в `using-tasks` skill.
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-06-09T13:50:40.834Z / note: l` or run `install.sh`** — consistent with prior `using-tasks` tasks (policy edits → separate baseline tasks; mapping version is schema-not-content; reload-plugins suffices for a PATCH/MINOR policy change).
- **Did not archive this repo's own bloated board** — that's a separate task (`tasks-board-cleanup-2026-05`); kept scope to the SKILL.
- **TDD N/A** — markdown policy artifact, no code surface. -->
## Проблема
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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T11:05:08.162Z -->
<!-- closed-by: DESKTOP-NSEF0UK:claude-opus:18704 / 2026-06-09 / using-tasks 1.2.0→1.3.0; done-task archival rule shipped; literal tasks_get_status swap NOT done (tool can't enumerate board — factual error in task premise), documented in concepts/using-tasks-status-archival.md; deviation flagged for review task -->
---
## 🟢 [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T11:05:18.063Z -->
<!-- closed-by: DESKTOP-NSEF0UK:claude-opus:18704 / 2026-06-09 / VERDICT PASS 3/3 — deviation (tasks_get_status can't enumerate board) validated against live tool schema; no regression; archival rule clear; no blocking findings -->
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-06-09T16:42:41.689Z / note: 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`. -->
---
## 🟢 [using-tasks-session-lock] — Добавить в скил `using-tasks` проверку repo-level `.tasks/.lock` при session start и session end.
**Session start:** читать `.lock` в cwd-репо. Если `type:"agent"` и TTL свежий (heartbeat не старше 10 мин) → жёсткое предупреждение "⚠️ поллер ведёт `<slug>` — нельзя работать параллельно", требовать явного подтверждения user'а для override.
После подтверждения (или если лок отсутствует/stale): писать `.tasks/.lock` `{type:"interactive", started_at, ttl_minutes:120}`.
**Session end/pause:** удалять `.tasks/.lock` если `type:"interactive"` и принадлежит текущей сессии.
**TTL:** agent-lock stale если heartbeat > 10 мин назад; interactive-lock stale если started_at > 2ч назад — молча перезаписывать.
**Acceptance criteria:**
**Owner:** DESKTOP-NSEF0UK:claude-sonnet:26920
**Claim token:** bf6cb6d5-65b3-49d8-b663-fde3ff37f462
**Claim expires at:** 2026-06-11T10:07:05.664Z
- свежий agent-lock → предупреждение + требование подтверждения перед любой работой
- interactive-lock пишется при session start, удаляется при session end/pause
- stale lock (TTL истёк) → перезаписывается без предупреждения
- `.tasks/.lock` в `.gitignore`
## Обязательные скилы — вызвать до начала работы
- invoke `using-tasks` — для управления статусом задачи
- invoke `project-discipline` — дисциплина коммитов/пушей
- invoke `using-wiki` после закрытия — заингесть `.wiki/concepts/using-tasks-session-lock.md`
**TDD:** нет — markdown policy artifact; behavioral smoke = парная review-таска
**Разрешения:** интерны: да | автопуш: нет
**weight:** needs-claude
**notify:** OpeItcLoc03/workshop
**Status:** done
**Where I stopped:** Shipped using-tasks 1.3.0→1.4.0 (MINOR). (1) Session start new step 1: lock guard — reads .tasks/.lock; active agent-lock (type:"agent", heartbeat ≤10 min) → hard warning + require user confirmation; stale lock (TTL expired) → silently overwrite; absent/cleared → write type:"interactive" lock. (2) Session end new step 1: release lock — delete .tasks/.lock if type:"interactive". (3) Structure section: .lock entry + gitignore callout. (4) Rules: "Honour .tasks/.lock" bullet. (5) .gitignore: .tasks/.lock entry added. (6) dist rebuilt.
**Next action:** (none — kept until merged)
**Branch:** n/a
**Notify:** OpeItcLoc03/workshop
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T13:57:13.936Z -->
<!-- closed-by: DESKTOP-NSEF0UK:claude-sonnet:26920 / 2026-06-11 / using-tasks 1.3.0→1.4.0 MINOR; session lock guard (start step 1 + end step 1 + Structure + Rules + .gitignore); 4/4 acceptance met by inspection (markdown policy artifact) -->
---
## 🟢 [delegate-task-review-weight-inherit] — Исправить `delegate-task` скил: при создании парной review-таски (Step 5) наследовать `weight` от impl-таски.
**Проблема:** review-таски создаются через `tasks_create(status=blocked, blocker=<impl-slug>)` без `weight` параметра. Reconciler обрабатывает авто-анблок только задач с `**Weight:** needs-claude` или `**Weight:** cheap-ok` в теле. Без поля — задача навечно остаётся 🔵, поллер её не видит. Воспроизводилось трижды за одну сессию (session-break-using-tasks-review, session-break-delegate-task-review, skill-using-system-snapshot-review, using-tasks-status-read-perf-review).
**Фикс:** в Step 5 шаблона явно указывать weight при `tasks_create` review-таски. Правило: review-таска наследует weight impl-таски, но не выше `needs-claude` (review не бывает `cheap-ok` — риск игнора invoke-инструкций слабыми моделями).
**Acceptance criteria:**
- Step 5 в SKILL.md явно говорит: создавать review-таску с `weight` = weight impl-таски (но min `needs-claude`)
- `tasks_create` вызов в Step 5 включает `weight` параметр в примере/описании
- What-NOT-to-do: не создавать review-таску без weight
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-06-09T16:55:13.755Z / note: переди `origin/master`. Дополнительного коммита не требуется.
**Допущение (low-stakes, фиксирую для аудита):** я не стал создавать новый коммит-дубликат поверх `fedb6fc` ради «нового SHA» и не закрывал таску на доске через `tasks_close` — закрытие/reconcile оставляю runner'у после доставки коммита. Альтернатива, которую отверг: сделать пустой/переоформляющий коммит — отверг как фабрикацию работы. -->
## Обязательные скилы — вызвать до начала работы
- invoke `using-tasks` — для управления статусом задачи
- invoke `project-discipline` — дисциплина коммитов/пушей
- invoke `using-wiki` после закрытия — заингесть `.wiki/concepts/delegate-task-review-weight.md`
**TDD:** нет — markdown policy artifact; behavioral smoke = парная review-таска
**Разрешения:** интерны: да | автопуш: нет
**weight:** needs-claude
**notify:** OpeItcLoc03/workshop
**Status:** ready
**Where I stopped:** (not started)
**Next action:** Открыть `skills/delegate-task/SKILL.md`, найти Step 5, добавить явное наследование weight при tasks_create review-таски. Bump PATCH.
**Branch:** n/a
**Notify:** OpeItcLoc03/workshop
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T14:11:55.964Z -->
---
## 🟢 [using-markitdown-cli-rewrite] — Переписать `skills/using-markitdown/SKILL.md`: заменить все инструкции по вызову `mcp__markitdown__*` тулов на вызов CLI `markitdown <path|url>` (v0.1.6, доступен в системном PATH). Убрать секцию про MCP setup/docker. После обновления SKILL.md — остановить и удалить локальный docker контейнер markitdown-mcp (`docker stop markitdown-mcp && docker rm markitdown-mcp`). Bump PATCH version в frontmatter скила.
**Acceptance criteria:**
- SKILL.md не содержит `mcp__markitdown__` — только CLI-вызовы
- `docker ps` не показывает markitdown-mcp
- version bumped (PATCH)
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-06-09T17:48:42.039Z / note: n that loads the MCP. A full decommission would deregister it — flagged as a recommended follow-up in the concept page.
- **Rebuilt the `dist/` artifact** (not explicitly asked) to keep the committed repo internally consistent — low-stakes, reversible. Did **not** run `install.ps1` or touch `hermes/mapping.yaml` (separate baseline tasks per repo convention; PATCH update only needs reload-plugins). -->
## Обязательные скилы — вызвать до начала работы
- invoke `using-tasks` — для управления статусом задачи
- invoke `project-discipline` — дисциплина коммитов/пушей
- invoke `using-interns` — для file-read/grep операций
- invoke `using-wiki` после закрытия — заингесть `.wiki/concepts/using-markitdown-design.md` если существует
**TDD:** нет — markdown policy artifact; behavioral smoke: `markitdown --help` выводит usage
**Разрешения:** интерны: да | автопуш: да
**weight:** needs-claude
**notify:** OpeItcLoc03/workshop
**Status:** ready
**Where I stopped:** (not started)
**Next action:** Открыть `skills/using-markitdown/SKILL.md`, заменить все mcp__markitdown__ вызовы на CLI-эквиваленты, bump PATCH, затем `docker stop markitdown-mcp && docker rm markitdown-mcp`.
**Branch:** n/a
**Notify:** OpeItcLoc03/workshop
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T17:43:55.116Z -->
---
## 🟢 [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-09T17:44:01.459Z -->
<!-- closed-by: DESKTOP-NSEF0UK:claude-opus:11584 / 2026-06-09 / VERDICT PASS; acceptance 3/3 + 2 bonus checks green; 1 informational finding (docker respawn from out-of-scope ~/.claude.json MCP registration) → follow-up using-markitdown-mcp-deregister -->
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-06-09T17:52:34.604Z / note: 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`** -->
---
## 🟢 [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
<!-- created-by: DESKTOP-NSEF0UK:claude-opus:11584 / from: using-markitdown-cli-rewrite-review finding / 2026-06-09 -->
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-06-09T18:00:53.166Z / note: Confirmed by owner: MCP not needed. Removed mcpServers.markitdown from ~/.claude.json, docker rm containers, docker rmi markitdown-mcp:latest (1.52GB freed). -->
---
## 🟢 [create-task-format-for-poller-skill] — Создать скил `task-format` в `claude-skills/skills/` по TDD-процессу (`superpowers:writing-skills`).
**Weight:** needs-claude
**Зачем:** правила оформления задач для автономного поллера (`**Weight:**`, `**Notify:**`) должны жить в скиле, который едет с `factory` к внешним пользователям. Вики — внутренняя, скилы — публичные.
**Что знаем (из исходника `projects-meta-mcp/src/lib/status-md.ts`):**
- `**Weight:** needs-claude | needs-human | cheap-ok` — capability-фильтр поллера
- `**Notify:** <owner>/<repo>` — inbox-уведомление при завершении
- Без `Weight` — поллер не берёт; `needs-human` — только ручное
**TDD-фазы:**
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:** <owner>/<repo>` — 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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-11T08:39:18.657Z -->
<!-- closed-by: DESKTOP-NSEF0UK:claude-opus / 2026-06-11 / note: closed by inspection — TDD evidence (RED 3-fail / GREEN 2-pass subagent runs) is the acceptance coverage for a markdown skill; install to ~/.claude/skills + hermes mapping deferred as a follow-up (mirrors using-system-snapshot deployment-scaffold note) -->
---
## 🟢 [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-11T13:36:09.044Z -->
## 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.
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-06-11T14:37:43.578Z / note: 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 -->
---
## 🟢 [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/claude-skills / 2026-06-11T14:37:55.052Z -->
<!-- closed-by: DESKTOP:claude-opus / 2026-06-11 / installed via install.ps1, diff-identical to source; task-loop visible in available-skills with full description post-/reload-plugins; clean-session behavioral test deferred to -test-trigger -->
---
## 🟢 [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/claude-skills / 2026-06-11T14:38:06.509Z -->
<!-- closed-by: DESKTOP:claude-opus / 2026-06-11 / task-loop entry added mode:pending, intended auto/mcp, reason claim/close/heartbeat + ScheduleWakeup; YAML validated, task-loop mapped; schema version untouched -->
---
## 🟢 [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.
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-06-11T15:10:36.486Z / note: VERDICT PASS — pos 6/6→task-loop, neg clean, task-loop FP 0/3, behavioral 4/4 (consult-gate, session_break BOUNDARY, empty-stop-no-poll, long-watch ScheduleWakeup≥1200 not CronCreate); registry real via probe; all 3 task-loop baselines closed -->
## Обязательные скилы — вызвать до начала работы
- 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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/claude-skills / 2026-06-11T14:38:22.728Z -->
<!-- closed-by: DESKTOP:claude-opus:clean-session / 2026-06-11 / VERDICT PASS — pos 6/6→task-loop, neg clean (delegate-task/using-tasks/none-w-exclusion), task-loop FP 0/3, behavioral 4/4 (consult-gate, session_break BOUNDARY, empty-stop-no-poll, long-watch ScheduleWakeup≥1200 not CronCreate); registry confirmed real via probe; finding: session_break gate fragile when body not loaded (informational, no fix needed); all 3 task-loop baselines now closed -->
---
## 🟢 [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-17T07:15:43.717Z -->
---
## 🟢 [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-17T07:15:52.974Z -->
---
## 🟢 [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-17T07:16:08.442Z -->
<!-- closed-by: vitya@claude-skills:clean-session / 2026-06-17 / VERDICT PASS — pos 4/4 (incl. CLAUDE.md-line P4), neg 2/3; N1 RU received-msg FP, borderline + body-load-self-correcting, root=inter-session-peer-discipline not installed; follow-up session-inbox-monitor-received-msg-fp filed; CLAUDE.md trigger-line added (user-approved); -review unblocked -->
---
## 🟢 [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) на <project>/.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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-17T07:16:22.572Z -->
---
## 🟢 [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-17T07:16:32.739Z -->
---
## 🟢 [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 пришёл ЧИСТО (до фикса то же тело давало `<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`); no-loop подтверждён. Root-cause = output-encoding (read был уже UTF8), как диагностировано; Start-Process-репро баг не ловил — только реальный harness-spawn путь. NB: stop-dispatcher.ps1 machine-local (вне git) — фикс на этой машине; для multi-machine надо внести в workshop-сетап, что шипает хук (нотифай ушёл).
**Next action:** (none — kept until merged). Multi-machine propagation фикса stop-dispatcher — на стороне workshop-сетапа.
**Branch:** n/a
**Notify:** OpeItcLoc03/workshop
<!-- created-by: vitya@claude-skills / from: -stophook-blockfix-proof finding + workshop encoding-report / 2026-06-17 -->
<!-- closed-by: vitya@claude-skills / 2026-06-17 / OutputEncoding=UTF8 applied to stop-dispatcher.ps1, in-situ Cyrillic regression PASS, SKILL.md writer-guide v0.2.1 -->
<!-- amg: stop-dispatcher.ps1 machine-local, fix not in git; workshop owns multi-machine propagation -->
---
## 🟢 [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
<!-- created-by: vitya@claude-skills:clean-session / from: session-inbox-monitor-test-trigger N1 FP / 2026-06-17 -->
<!-- closed-by: vitya@claude-skills / 2026-06-17 / option (b) structural — installed inter-session-peer-discipline (byte-identical), N1 FP-twin verified routing to it; human-ratified (peer workshop proposed, not authority per inter-session-peer-discipline) -->
---
## 🟢 [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
<!-- created-by: vitya@claude-skills / from: inter-session-peer-discipline install (received-msg-fp fix) + workshop hermes-ledger coordination / 2026-06-17 -->
<!-- closed-by: vitya@claude-skills:clean-session / 2026-06-17 / VERDICT PASS — pos 4/4 → inter-session-peer-discipline (high), 0 false-positive (5 foreign phrases: 3 monitor→session-inbox-monitor, X1 backend→NONE, X2 backend→monitor low-conf); clean-context unprimed subagents -->
---
## 🟢 [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
<!-- created-by: vitya@claude-skills / from: workshop hermes-ledger coordination / 2026-06-17 -->
<!-- closed-by: vitya@claude-skills:clean-session / 2026-06-17 / VERDICT PASS — activation covered by -test-trigger (4/4 pos, 0 FP RU+EN); body v0.1.1 carries all 3 principles (proposal-not-authority / ratification-gate / echo-chamber-guard); complements global CLAUDE.md inter-session-messaging; no blocking findings -->
---
## ⚪ [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
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-17T07:16:46.949Z -->
<!-- closed-by: vitya@claude-skills:clean-session / 2026-06-17 / VERDICT PASS — activation 3/3 monitor + neg clean (X2 low-conf observation); structural audit 5 PASS/1 CONCERN (A sweep, B inject-one+headless, C no-loop, D body↔reality, E encoding-concern); received-msg-fp RESOLVED via (b); hermes stays pending until tool-side audit; 1 follow-up filed (encoding-guard) -->
---
## 🟢 [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
<!-- created-by: vitya@claude-skills:clean-session / from: session-inbox-monitor-review structural audit item E (CONCERN) / 2026-06-17 -->
<!-- closed-by: vitya@claude-skills:clean-session / 2026-06-17 / fix shipped — OutputEncoding=UTF8 forward-guard in inbox-monitor.ps1, WinPS-5.1 Cyrillic-path regression PASS, deployed byte-identical (SHA256 parity), SKILL.md v0.2.2 PATCH -->
---
## ⚪ [setup-agents-task-runner-windows-fixes] — Починить `setup-agents-task-runner` по итогам первого реального Windows-прогона. Скил v0.1.0 устанавливал, но службы вставали сломанными — 5 дефектов, все диагностированы и воркэраунд-починены в `OpeItcLoc03/common` dev-шаблонах. Нужно перенести в SKILL.md, чтобы fresh-install на новой машине работал без ручной отладки.
## Дефекты (с проверенными фиксами в OpeItcLoc03/common)
1. **winsw serviceaccount: v3-схема при v2.12.0 пине.** Шаблоны: `<username>.\{{USER}}</username>` + `<allowservicelogonright>` (схема winsw v3). Пин — v2.12.0, молча игнорит незнакомые элементы → служба падает на LocalSystem без ошибки. Эталон из `sample-allOptions.xml` v2.12.0: `<domain>`+`<user>`+`<allowservicelogon>`. Фикс: коммит 681fcda. → привести serviceaccount-блок шаблонов к v2-схеме + заметка «схема обязана совпадать с major пина winsw».
2. **projects-meta-mcp не разворачивается в install-layout.** appeals импортит `projects-meta-mcp/dist/...` (bare, `file:../projects-meta-mcp` junction); watchdog — `../../../projects-meta-mcp/dist/...` (относит., ждёт соседа install-dir). Phase 4 копирует изолированно → junction виснет на `%LOCALAPPDATA%\projects-meta-mcp` → ERR_MODULE_NOT_FOUND краш-луп. → Phase 4: развернуть `projects-meta-mcp` соседом install-dir (junction на dev-дерево либо deploy-копия) + перенаправить appeals node_modules junction.
3. **PORT 3000 — коллизия с дев-портом.** Перенесён на 4316 во всех хост-юнитах (winsw/systemd/launchd) + watchdog TASK_RUNNER_URL. Docker-внутренний 3000 не трогали. Коммит 211d662. → дефолт хост-порта 4316.
4. **Home-резолюция.** Под LocalSystem `os.homedir()` → systemprofile → auth.toml не найден. После фикса run-as-user снимается само. На машине добавлен USERPROFILE/HOME env в рендеренные XML (не в dev-шаблоны). → решить: полагаться на run-as-user ИЛИ добавить env в шаблоны (тест на fresh-машине).
5. **Phase 8 не ловил LocalSystem** (службы Running как SYSTEM, прошли). → Phase 8 ассертить SERVICE_START_NAME/StartName == целевой юзер + порт-проверку.
Мелочь: PIN.md стух (.NET461 заметка vs self-contained Core 18МБ). Фикс 31bd5a9.
## Acceptance
- Fresh Windows-установка через обновлённый скил: 3 службы run-as-user (не LocalSystem), не-дев порты, отвечают по HTTP — без ручной правки junction/схемы/порта.
- Phase 8 реально ассертит аккаунт + порты.
- Linux/mac-ветки проверены на тот же класс (sibling-deploy, схема юнитов); winsw-специфична только деф.1.
- ВЕРИФИКАЦИЯ install-результата требует Windows-машины — если раннер на не-Windows, правки портируются и коммитятся, full-install проверка деферится (отметить в close-ноте).
## Обязательные скилы — вызвать до начала работы
- invoke `using-tasks` — статус задачи
- invoke `project-discipline` — semver-bump SKILL.md + дисциплина коммитов/пушей
- invoke `writing-skills` — правка скила по канону (Iron Law: тест-сценарий до правки)
- invoke `using-projects-meta` — контекст в OpeItcLoc03/common
**Контекст:** проверенные фиксы — `OpeItcLoc03/common` коммиты 681fcda / 211d662 / 31bd5a9, шаблоны `lib/agents-task-runner/service/`. Ops-runbook `concepts/agents-task-runner-ops.md` (who-does-what).
**TDD:** нет (правка процедуры; верификация = реальная установка).
**Разрешения:** интерны: нет | автопуш: нет
**Weight:** needs-claude
**Notify:** OpeItcLoc03/workshop
## Дефекты (с проверенными фиксами)
1. **winsw serviceaccount: v3-схема при v2.12.0 пине.** Шаблоны использовали `<username>.\{{USER}}</username>` + `<allowservicelogonright>` — это схема winsw **v3**. Пин — v2.12.0, который **молча игнорит** незнакомые элементы → служба падает на **LocalSystem** (без ошибки!). Эталон из `sample-allOptions.xml` v2.12.0: `<domain>` + `<user>` + `<allowservicelogon>`. Фикс в common: коммит 681fcda. → Skill: serviceaccount-блок шаблонов привести к v2-схеме; добавить заметку «схема обязана совпадать с major пина winsw».
2. **projects-meta-mcp не разворачивается в install-layout.** appeals импортит `projects-meta-mcp/dist/...` (bare, через `file:../projects-meta-mcp` junction); watchdog — `../../../projects-meta-mcp/dist/...` (относит. путь, ждёт соседа install-dir). Phase 4 копирует appeals/runner изолированно → npm-junction виснет на несуществующий `%LOCALAPPDATA%\projects-meta-mcp` → ERR_MODULE_NOT_FOUND краш-луп. → Skill Phase 4: добавить шаг — развернуть `projects-meta-mcp` соседом install-dir (junction на dev-дерево либо deploy-копия) + перенаправить appeals node_modules junction. На этой машине решено единым junction `%LOCALAPPDATA%\projects-meta-mcp` → dev-дерево (согласовано с тем, что TASKS_BIN уже ссылается на dev-дерево).
3. **PORT 3000 — коллизия с дев-портом.** Раннер сидел на 3000 (Next/CRA/Express default) — фоновая autostart-служба не должна его занимать. Перенесён на 4316 (рядом с appeals :4317) во всех хост-юнитах (winsw/systemd/launchd) + watchdog TASK_RUNNER_URL. Docker-внутренний 3000 не трогали. Коммит 211d662. → Skill/README: дефолт хост-порта 4316.
4. **Home-резолюция под службой.** Пока служба была LocalSystem, `os.homedir()` давал `C:\WINDOWS\system32\config\systemprofile` → `auth.toml` не находился. На этой машине добавлен `<env USERPROFILE>`/`<env HOME>` в РЕНДЕРЕННЫЕ XML (не в dev-шаблоны). После фикса run-as-user (деф.1) проблема снимается сама (USERPROFILE берётся из токена vitya). → Skill: решить — полагаться на run-as-user ИЛИ для надёжности добавить USERPROFILE env в шаблоны (протестировать на fresh-машине без загруженного профиля).
5. **Phase 8 не ловил LocalSystem.** Скил считал успехом «службы Running» — но они прекрасно бежали как LocalSystem (благодаря env-хаку). → Skill Phase 8: ассертить `SERVICE_START_NAME`/`StartName` == целевой юзер, а не только Running. Проверка порта (нет 3000-коллизии) тоже.
Мелочь: PIN.md стух (`.NET Framework 4.6.1` — на деле self-contained .NET Core, 18 МБ; .NET461 — отдельный ассет). Фикс 31bd5a9.
## Acceptance
- Fresh Windows-установка через обновлённый скил даёт 3 службы **run-as-user** (не LocalSystem), на не-дев портах, все отвечают по HTTP — БЕЗ ручной правки junction/схемы/порта.
- Phase 8 скила реально ассертит аккаунт + порты.
- Линукс/мак-ветки проверены на тот же класс (sibling-deploy, схема юнитов) — winsw-специфична только деф.1.
## Обязательные скилы — вызвать до начала работы
- invoke `using-tasks` — управление статусом задачи
- invoke `project-discipline` — semver-bump SKILL.md (это versioned-артефакт) + дисциплина коммитов/пушей
- invoke `writing-skills` — правка скила по канону
- invoke `using-projects-meta` — кросс-проектный контекст (фиксы живут в OpeItcLoc03/common)
**Контекст:** проверенные фиксы и эталон-схема — в `OpeItcLoc03/common` (коммиты 681fcda / 211d662 / 31bd5a9, шаблоны `lib/agents-task-runner/service/`). Ops-runbook `concepts/agents-task-runner-ops.md` (секция who-does-what).
**TDD:** нет — правка процедуры скила; верификация = реальная установка на Windows-машине.
**Разрешения:** интерны: нет | автопуш: нет
**Status:** ready
**Where I stopped:** workspace: working tree dirty
**Next action:** Портировать проверенные фиксы в SKILL.md (Phases) + дотянуть dev-шаблоны. См. тело.
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-06-18T08:12:28.107Z -->
---