Files
claude-skills/.tasks/.archive/done-2026-05.md
2026-05-07 14:06:30 +03:00

451 lines
54 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.
# Archived — Done batch 2026-05
Перемещено из `.tasks/STATUS.md` 2026-05-07 в рамках board-cleanup. Полный список 🟢 done-тасок, шипанутых в апреле-мае 2026.
Полный source — git history `.tasks/STATUS.md` до commit 5d9d2f8.
---
## 🟢 [bootstrap-skill-deps-check] — refactor project-bootstrap Step 5.6 into a generic skill-dependencies check (replaces per-skill `Step 5.X` mirror shape)
**Status:** done
**Where I stopped:** `skills/project-bootstrap/SKILL.md` Step 5.6 переписан с single-skill `superpowers`-only detector на generic `trigger → fulfiller` table walker (9-row inline map: 8 skills + 1 plugin; `kind` flag drives install-command emission); README Workflow Step 5.6 description обновлён под новую форму; `version:` 1.6.0 → 1.7.0 (MINOR — adds capability, absorbs prior detector cleanly); `dist/project-bootstrap.skill` rebuilt + installed; `~/.claude/skills/project-bootstrap/SKILL.md` shows `version: 1.7.0`; design page `.wiki/concepts/bootstrap-skill-deps-check.md` written (rationale: why generic over per-skill mirrors, skill/plugin kind distinction, MCP-server caveat, source-of-truth invariant between SKILL map ↔ `assets/CLAUDE.md.template`); `.wiki/index.md` + `.wiki/log.md` updated. Subsumes `[bootstrap-recommend-projects-meta]` by absorption.
**Next action:** (none — kept until merged)
**Branch:** master
---
## 🟢 [bootstrap-recommend-projects-meta] — Step 5.7 in project-bootstrap: recommend `setup-projects-meta` if MCP tools missing
**Status:** done
**Where I stopped:** closed by absorption 2026-05-05 — `[bootstrap-skill-deps-check]` shipped a generic Step 5.6 that walks the whole canonical trigger list (`using-projects-meta` is one of 9 rows in the inline `trigger → fulfiller` map). The per-skill mirror this task envisioned was rejected as a copy-paste explosion shape; the generic walker handles the same case + the analogous gap for every other canonical trigger.
**Next action:** (none — kept until merged)
**Branch:** master
---
## 🟢 [compress-dedup] — resolve compress vs caveman-compress duplication
**Status:** done
**Where I stopped:** `skills/compress/` deleted as a byte-identical dupe of `skills/caveman-compress/` (SHA256 match across all 7 scripts/ files; SKILL.md diff was `name:` + Process step 2 only; README + SECURITY only in caveman-compress). Ported the better Process-step wording from compress (`cd <directory_containing_this_SKILL.md>` instead of brittle `cd caveman-compress`) into `skills/caveman-compress/SKILL.md`. Added `version: 1.0.0` to caveman-compress frontmatter (first versioned release; aligns with skill-versioning concept). Removed: `skills/compress/`, `dist/compress.skill`, `~/.claude/skills/compress/` (manual prune — install.sh has no prune step). Rebuilt `dist/caveman-compress.skill` + reinstalled to `~/.claude/skills/caveman-compress/` (verified `version: 1.0.0` + new Process step on disk). Harness skill listing confirms `compress` is gone, only `caveman-compress` remains. `.wiki/concepts/compress-dedup.md` written (rationale + rejected alternatives: alias-stub has no harness mechanism, "keep both" wastes listing budget, "delete caveman-compress" loses README + SECURITY); `.wiki/index.md` + `.wiki/log.md` updated.
**Next action:** (none — kept until merged)
**Branch:** master
---
## 🟢 [refresh-project-bootstrap] — Run the `project-bootstrap` skill in this repo to refresh its layout to the canonical state (git, .gitignore, README.md, .wiki/, .tasks/, CLAUDE.md). The skill handles both greenfield bootstrap and refresh of existing repos.
**Status:** done
**Where I stopped:** (not started)
**Next action:** Invoke the `project-bootstrap` skill at the repo root, confirm each file write, push to main.
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: projects-meta-mcp / 2026-05-01T09:03:49.873Z -->
<!-- closed-by: OpeItcLoc03@DESKTOP-NSEF0UK / 2026-05-07T07:52:32.249Z / note: Superseded by `[bootstrap-upgrade-canonical-triggers]` (создана 2026-05-07 как часть rollout v1.10.0, наследует scope — прогон upgrade-mode скила на этом репо). Эта таска от 2026-05-01 — до v1.10.0 канона; newer task имеет более конкретные acceptance criteria (verify-step, manifest update, reference-коммит). Закрытие newer задачи выполнит цель этой. -->
---
## 🟢 [using-projects-meta-fix-paths] — fix stale `~/.local/projects-meta-mcp/` paths in `setup-projects-meta` SKILL.md
**Status:** done
**Where I stopped:** `setup-projects-meta/SKILL.md` lines 152154 (Phase 5 platform-path table) переписаны с `~/.local/projects-meta-mcp` на `~/projects/.common/lib/projects-meta-mcp` (Windows/Linux/macOS варианты); `version:` bump 1.0.0 → 1.0.1 (PATCH, doc consistency); rebuild `dist/setup-projects-meta.skill` + install в `~/.claude/skills/setup-projects-meta/` подтверждены (frontmatter `version: 1.0.1` в установленной копии); `using-projects-meta/{SKILL,README}.md` уже были чистые из прошлых коммитов; line 224 (`Path forms (~/.local/..., ~/.config/..., ~/projects/...) are identical on all three.`) намеренно оставлена как generic POSIX-path syntax aside, не projects-meta install reference
**Next action:** (none — kept until merged)
**Branch:** master
<!-- created-by: vitya@local / from: meeting-room / 2026-05-05 -->
---
## 🟢 [interns-repo-read-skill-updates] — Skill-side updates for the `repo_read` intern (design at claude-skills/.wiki/concepts/interns-repo-read-design.md). Two coordinated edits: (1) `using-interns/SKILL.md` routing section — add hints on when to use `repo_read` vs `bulk_text_read`, MINOR bump; (2) `setup-interns/SKILL.md` — add Node-in-PATH check + optional `npx repomix@latest --version` pre-warm step, MINOR bump. Blocked by `common#interns-repo-read-impl` only for end-to-end test; skill edits themselves can ship in parallel.
**Status:** done
**Where I stopped:** both skills edited (0.1.0→0.2.0), rebuilt + installed, versions verified on disk
**Next action:** (none — kept until merged)
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-05T20:05:05.877Z -->
---
## 🟢 [project-creation-lifecycle-skill] — Extend `project-bootstrap` (or add a new `create-project` skill) to cover the **full new-project lifecycle**, not just upgrading an existing folder.
**Gap surfaced 2026-05-06** при промоушене брейнсторма `factory-bootstrap`: репо `git.kzntsv.site/OpeItcLoc03/factory` был создан ad-hoc (git init + gitea repo create + push), без бутстрапа `.tasks/STATUS.md` и `.wiki/index.md`. Из-за этого `projects-meta-mcp:sync-runner.ts:69` отбрасывал репо как «не проект», и `knowledge_ingest target=factory` / `tasks_create target=factory` валились с «project not in cache». Промоушн встал, пришлось вручную сидить layout через прямые `Write` + push. Это чинится один раз в скиле, а не каждый раз руками.
**Что должен делать новый flow** (один обход):
1. Создать локальную папку `~/projects/<dotpath>/` (валидация: latin, kebab-case, не существует).
2. `git init` + первоначальный `.gitignore` + минимальный `README.md`.
3. Создать гитеа-репо в org/user через Gitea API (auth из `~/.config/projects-mcp/auth.toml`), set remote, push initial commit.
4. Делегировать в `setup-wiki` + `setup-tasks` для канонического layout (или inline-fallback с записью в bootstrap-manifest).
5. `node ~/projects/.common/lib/projects-meta-mcp/dist/sync.js` — re-sync кэша, чтобы новый репо стал виден projects-meta.
6. Опционально: `tasks_create target=_meta slug=<proj>-onboarded` — чтобы новый проект засветился на кросс-проектном борде с момента создания.
**Два варианта дизайна — выбрать в скил-creator:**
- **(a) Extend `project-bootstrap`** — добавить flag `--create` (или авто-detection «папки нет / git remote нет»), который запускает шаги 13 и 56. Существующий path для «уже существующая папка → upgrade» сохраняется. Плюс: один скил для всего lifecycle. Минус: SKILL.md распухает.
- **(b) Новый скил `create-project`** — отдельный entry-point, в конце дёргает `project-bootstrap` для шагов 4 (layout). Плюс: single-responsibility. Минус: ещё один скил в реестре, юзеру выбирать какой звать.
Склоняюсь к (a) — `project-bootstrap` уже знает про оба режима init/upgrade (см. SKILL.md Step 0), четвёртый под-режим «greenfield + remote create» естественно туда ложится. Но это решение уровня skill-creator.
**Acceptance criteria:**
- Новый flow прогоняется на пустой папке: `~/projects/.test-greenfield/` → один вызов скила → конец: репо в gitea, layout в `.wiki/`/`.tasks/`, виден в `mcp__projects_meta__meta_status`.
- Существующий upgrade-mode не сломан (regression-test на `.factory/` после этого фикса — re-run должен быть no-op).
- README скила обновлён.
**Status:** done
**Where I stopped:** Shipped в `23431c5 feat(project-bootstrap): add greenfield-full mode with remote create`. Variant (a) — extend `project-bootstrap`. SKILL.md v1.8.0 → 1.9.0 (mode `greenfield-full` + `add-remote` + `upgrade`); Step 1.5 (remote create через Gitea API + auth.toml + push initial); Step 8 (projects-meta sync через `dist/sync.js`). README обновлён под три режима. ⚠️ Acceptance criteria smoke-test «один вызов на `.test-greenfield/`» **не прогонялся** — surfaced в `using-tasks-close-coverage-gate`. Закрыто по shipped-code-баребоне; regression-test трек отдельно.
**Next action:** (none — kept until merged); regression-smoke-test на пустой папке трекать через `using-tasks-close-coverage-gate`
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-06T18:19:47.732Z; closed: 2026-05-06 from claude-skills -->
---
## 🟢 [extend-project-discipline-brainstorm-workspaces] — Расширить `project-discipline` (`C:\Users\vitya\.claude\skills\project-discipline\SKILL.md`) явным обращением к **transit-zone / brainstorm-workspaces** типа `~/projects/.meeting-room/`.
**Gap surfaced 2026-05-05:** Rule 1 скила («project conventions override skill defaults») написан для проектов с `.wiki/` / `.tasks/`. Не покрывает кейс, когда workspace **сам по себе** — discussion-zone, и его README/CLAUDE.md явно говорит «здесь no `.tasks/`, transit zone, всё уезжает в глобал». В той сессии я неправильно применил «transit-zone autopilot» — потащил artifact из брейнсторма в `~/projects/.wiki/concepts/` без явной директивы пользователя. Корректировка: artifacts уезжают в `.brainstorm/<topic>.md` (in-progress) ИЛИ в глобал-вики (mature, user-directed) — никогда автопилотом по аналогии с Rule 1.
**Предлагаемая поправка к SKILL.md:**
1. Default destination для in-progress brainstorm artifacts: `.brainstorm/<topic>.md` (или чем README workspace'а это объявил).
2. Default destination для mature, cross-cutting outputs: `~/projects/.wiki/concepts/<topic>-design.md` через `mcp__projects-meta__knowledge_ingest`**только** когда user явно это направил.
3. Агент **не должен** auto-promote brainstorm-артефакты в глобал-вики по аналогии с Rule 1; convergence-moment решение принадлежит user'у.
**Reference:** `.meeting-room/CLAUDE.md` уже описывает «hard rules» этого workspace'а (правила §1§4) — это конкретный пример того, что project-discipline должен явно поддерживать.
**Acceptance criteria:**
- В SKILL.md `project-discipline` появилась секция «Transit-zone / brainstorm workspaces» с тремя пунктами выше.
- Регрессия: на тестовом meeting-room сессии (как 2026-05-05) агент не вытаскивает brainstorm в `.wiki/concepts/` без user-команды.
**Status:** done
**Where I stopped:** Shipped в `215afdd feat(project-discipline): add Rule 5 — transit-zone workspaces`. SKILL.md v0.1.0 → 0.1.1 (PATCH; описано в commit как добавление, де-факто новая секция — но user-decision на PATCH). Rule 5 содержит три обязательных пункта (`.brainstorm/<topic>.md` для in-progress, global wiki только по user-команде, no auto-promote по аналогии с Rule 1). `.meeting-room/CLAUDE.md` служит каноничным примером (упомянут в Example блоке Rule 5).
**Next action:** (none — kept until merged)
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-06T18:27:06.441Z; closed: 2026-05-06 from claude-skills -->
---
## 🟢 [recommend-dont-menu-skill] — Создать новый скил `recommend-dont-menu` (имя обсуждаемо в skill-creator) — codifies user-style override: в design-conversations, брейнстормах, code review агент даёт **одну аргументированную рекомендацию**, а не меню вариантов A/B/C/D.
**Why skill, not CLAUDE.md:** правило сейчас живёт в `~/.claude/CLAUDE.md` на одной машине (создан 2026-05-06). Per-machine, per-agent — на новом ноуте его не будет, Gemini/Copilot его не прочитают. Скил в claude-skills клонится на все машины как L1 component factory-manifest'а; trigger-line в CLAUDE.md template наследуется всеми проектами через project-bootstrap.
**Содержимое скила (SKILL.md body — готово, копируется из удалённого memory entry):**
> Default mode для design-questions: «Я рекомендую X, потому что Y₁, Y₂. Trade-off: Z. Возражения?»
>
> Альтернативы упоминать **только если они реально близки** или несут важный trade-off, который user должен взвесить — тогда коротко: «Если важно W — лучше X', но добавляет сложность; иначе X».
>
> Не перечислять варианты ради видимости вариативности. Меню тормозит когда один вариант очевидно лучше — вынуждает читать заведомо проигрышные опции и задвигает позицию агента за обтекаемое перечисление вместо ответственной рекомендации.
>
> Это override стандарта `superpowers:brainstorming`, где multiple-choice указан как preferred. User instructions > skill defaults.
**Frontmatter (черновик):**
```yaml
---
name: recommend-dont-menu
description: Use during design discussions, brainstorming, architecture reviews, or any "what should we do" question — give one argued recommendation with explicit trade-offs, not a multiple-choice menu. Override of superpowers:brainstorming default.
version: 0.1.0
---
```
**Triggers (когда скил активируется):**
- Любые design / architecture / "что выбрать" вопросы.
- Активные брейнстормы (где `superpowers:brainstorming` тоже бы подцепилось — этот скил **переопределяет** его стиль).
- Code review с альтернативами.
- В `.meeting-room/` — постоянно (в её workspace contract это default для совещаний).
**Cross-agent applicability:** скил — про стиль ответа, не про tool calls, поэтому работает на любом агенте без mappings (в отличие от `using-superpowers`, которому нужны `references/copilot-tools.md` и т.д.). В description явно отметить «works on any agent — pure response-style rule».
**Integration tasks:**
1. **Trigger-line в `project-bootstrap` CLAUDE.md template.** Добавить строку в canonical set (`assets/CLAUDE.md.template`, см. `project-bootstrap/SKILL.md` Step 5). Кандидаты: `prefer single recommendations`, `recommend, don't menu`, `argued recommendations`. Решает skill-creator. После — в Step 5.6 (skill dependencies check) добавить новую строку в trigger→fulfiller table.
2. **Свернуть `~/.claude/CLAUDE.md`** на машинах, где скил установлен, до одной trigger-строки. Текущее содержимое (1 параграф правила) переносится в SKILL.md body, в global CLAUDE.md остаётся только триггер.
3. **Cross-agent prop:** trigger-line должен попасть в `~/.gemini/GEMINI.md` и `~/.copilot/AGENTS.md` — следствие, отдельная подзадача (либо часть `setup-*` для соответствующих агентов, либо часть будущего factory L1 manifest'а).
**Acceptance criteria:**
- `~/.claude/skills/recommend-dont-menu/SKILL.md` существует, проходит skill-validation.
- Trigger-line в `project-bootstrap/assets/CLAUDE.md.template` + соответствующий ряд в Step 5.6 trigger→fulfiller table.
- Регрессионный smoke-test: в test-сессии после установки скила я (агент) на «как лучше — X или Y?» отвечаю «рекомендую X, потому что Z. Возражения?» вместо меню.
- В `using-superpowers/SKILL.md` или `superpowers:brainstorming` упомянут override (либо через priority-секцию, которая уже есть: «User instructions > Superpowers skills > Default»).
**Reference:** правило выкристаллизовалось в брейнсторме interns 2026-05-05, проверено многократно в `.meeting-room/` сессиях. Source content до удаления memory лежал в `feedback_brainstorm_recommend_dont_menu.md` (memory была удалена 2026-05-06 после переноса в `~/.claude/CLAUDE.md`, который сам теперь временный).
**Status:** done
**Where I stopped:** Shipped в `011a8b4 feat(recommend-dont-menu): add skill + integrate into project-bootstrap [v0.1.0 / v1.9.0]`. Skill at `skills/recommend-dont-menu/SKILL.md` v0.1.0; trigger-line `recommend, don't menu` в `project-bootstrap/assets/CLAUDE.md.template:12`; row в Step 5.6 trigger→fulfiller table at `project-bootstrap/SKILL.md:447`; override упомянут в SKILL.md секция "## Override". `project-bootstrap` bumped 1.8.0 → 1.9.0 (MINOR; одновременно с greenfield-full mode из `[project-creation-lifecycle-skill]` — single bump cover both features). Heading emoji приведён к `done`-канону 2026-05-06 (был ⚪ при `Status: 🟢 Done` — рассинхрон, surfaced `using-tasks-close-coverage-gate`).
**Next action:** (none — kept until merged)
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-06T18:31:57.105Z; closed: 2026-05-06 from claude-skills -->
---
## 🟢 [hermes-converter-mvp] — Build conversion infrastructure для Hermes-rollout: создать `hermes/mapping.yaml` (схема: per-skill `mode: auto|manual|skip`, `category`, `replace-rules`, `skip-list` + `reason`), написать `scripts/build-hermes.{sh,py}` (читает `skills/<name>/SKILL.md` или `hermes/skills/<name>/` для manual, применяет mapping, пишет `dist-hermes/<category>/<name>/`, генерит `dist-hermes/SKIPPED.md` с per-skip reason'ами). Прогнать через 4 universal: `pulling-before-work`, `active-platform`, `project-discipline`, `using-markitdown`. Закоммитить `dist-hermes/` для этих 4 в репу. Дизайн: `.wiki/concepts/hermes-skills-rollout-design.md`. Pre-encode security уроки (extraheader-pattern, POSIX-absolute paths, version-bump per Rule 3) на этапе шаблонов конвертера.
**Status:** done
**Where I stopped:** Shipped в `6b36b31 feat(hermes): MVP converter + 4 universal skills converted`. (1) `hermes/mapping.yaml` — 4-mode schema (`auto`/`manual`/`skip`/`pending`); 22 skills mapped explicitly; build fails on unmapped (verified on synthetic `fake-skill` → exit 1). (2) `scripts/build-hermes.py` — Python (PyYAML 6.0.3); replace-rules ordered string-substitution on SKILL.md only; manual mode copies `hermes/skills/<source>/` verbatim; SKIPPED.md auto-generated с pending intended-mode preserved. (3) 4 universal через converter в `dist-hermes/`: `pulling-before-work` + `project-discipline` (with READMEs) → `software-development/`; `active-platform` (replace-rules `**Windows + PowerShell.**``**Linux + bash.**` + reasoning sentence) → `software-development/`; `using-markitdown``productivity/`. (4) `dist-hermes/` committed (8 файлов: 4 SKILL.md + 2 README.md + SKIPPED.md). (5) Security infra: replace-rules + manual mode ready; concrete extraheader / POSIX / version-bump templates land в `hermes-flavour-mcp-setups` (per design separation `.wiki/concepts/hermes-skills-rollout-design.md` § Связанные таски). README.md updated (новая секция `### Build for Hermes` + Layout). Per-task file `.tasks/hermes-converter-mvp.md`. **Smoke:** idempotent re-run no diff; replace-rules verified via grep on `dist-hermes/.../active-platform/SKILL.md`; strict-mapping fail-fast verified.
**Next action:** (none — kept until merged); unblocks `[hermes-flavour-mcp-setups]`, `[hermes-installer-skill]`, `[hermes-mvp-coverage]`
**Branch:** master
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-06T20:21:21.315Z; closed: 2026-05-07 from claude-skills -->
---
## 🟢 [hermes-flavour-mcp-setups] — Переписать `setup-projects-meta` и `setup-context7` в Hermes-flavour: вместо клона/билда — yaml-edit `~/.hermes/config.yaml > mcp_servers.<name>` (stdio command pointing к `~/projects/.common/lib/projects-meta-mcp/dist/server.js`, env-vars из `~/.config/projects-mcp/auth.toml`), затем `/reload-mcp`. Обе версии лежат как `mode: manual` в `hermes/skills/setup-projects-meta-hermes/SKILL.md` и `hermes/skills/setup-context7-hermes/SKILL.md` (конвертер копирует as-is, без преобразований). Pre-check: бинарь existing в `~/projects/.common/lib/projects-meta-mcp/`, `auth.toml` existing в `~/.config/projects-mcp/`. Применить extraheader-pattern сразу на git-clone fallbacks (если pre-check провалится). Дизайн: `.wiki/concepts/hermes-skills-rollout-design.md`. Зависит от `hermes-converter-mvp` (нужен mapping.yaml schema понимающий `mode: manual`).
**Status:** done
**Where I stopped:** Shipped в `5990b06 feat(hermes): flavour-mcp-setups + installer-skill`. `hermes/skills/setup-projects-meta/SKILL.md` + `hermes/skills/setup-context7/SKILL.md` написаны (mode: manual, yaml-edit паттерн); mapping.yaml: оба pending → manual; `dist-hermes/mcp/setup-projects-meta/` + `dist-hermes/mcp/setup-context7/` populated; extraheader-pattern на git-clone fallback включён.
**Next action:** (none — kept until merged)
**Branch:** master
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-06T20:21:30.093Z; closed: 2026-05-07 from claude-skills -->
---
## 🟢 [hermes-installer-skill] — Написать `dist-hermes/meta/claude-skills-installer/SKILL.md` — recursive bootstrap installer для Hermes-стороны. SKILL'у на триггер «установи скилы из claude-skills» / «обнови claude-skills»: итерирует по `dist-hermes/<category>/<name>/` (всем кроме `meta/`), для каждого вызывает `skill_manage(action='create', category=<cat>, name=<name>, content=<SKILL.md>, assets=<recursively references/scripts/templates/assets>)`. Учитывать `dist-hermes/SKIPPED.md` — не пытаться установить пропущенные. Документировать **bootstrap-процедуру** в `claude-skills/README.md` (Linux/Hermes раздел): один раз вручную `skill_manage(action='create', from=<path к этому SKILL.md>)`, далее команда «обнови claude-skills» работает сама. Recursive: installer обновляется вместе со всем остальным через `git pull && trigger update`. Дизайн: `.wiki/concepts/hermes-skills-rollout-design.md`.
**Status:** done
**Where I stopped:** Shipped в `5990b06 feat(hermes): flavour-mcp-setups + installer-skill`. `dist-hermes/meta/claude-skills-installer/SKILL.md` написан (recursive bootstrap, iterates dist-hermes/ excluding meta/, calls skill_manage); README.md Hermes quick-start секция добавлена.
**Next action:** (none — kept until merged); smoke-test на фабричной Linux box ещё не прогонялся
**Branch:** master
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-06T20:21:39.875Z; closed: 2026-05-07 from claude-skills -->
---
## 🟢 [hermes-mvp-coverage] — Расширить `hermes/mapping.yaml` и пропустить через converter оставшиеся 9 MVP-скилов: `setup-tasks`, `using-tasks`, `setup-wiki`, `using-wiki`, `using-projects-meta`, `using-context7`, `project-bootstrap` (адаптируется последним — orchestrator). Замечания: (a) `using-wiki`/`setup-wiki` поверх Hermes built-in `research/llm-wiki` — наша schema (`.wiki/CLAUDE.md`, `entities/persons/`, `packages/`, `raw/research,transcripts`) сохраняется через override-precedence; (b) `project-bootstrap` Hermes-flavour убирает CLAUDE.md trigger-lines (Hermes auto-discover), оставляет git/gitignore/README/setup-wiki/setup-tasks orchestration. End-to-end smoke-test на фабричной Linux-машине: `git clone claude-skills` на чистую box → `skill_manage` installer → trigger «установи всё» → `hermes skills list` показывает все 13 в правильных категориях → `mcp__projects_meta__*` тулы доступны после `/reload-mcp`. Дизайн: `.wiki/concepts/hermes-skills-rollout-design.md`.
**Status:** done
**Where I stopped:** Shipped в `a003b80 feat(hermes): mvp-coverage — 9 skills converted`. mapping.yaml: 7 pending → auto. dist-hermes/ populated: software-development (project-bootstrap), productivity (recommend-dont-menu, setup-tasks, using-tasks), research (setup-wiki, using-wiki), mcp (using-context7, using-projects-meta). pending count now 0. active-platform replace-rule verified (Windows+PowerShell → Linux+bash in body).
**Next action:** (none — kept until merged); unblocks `hermes-converter-ci`
**Branch:** master
---
## 🟢 [using-tasks-close-coverage-gate] — Расширяет `using-tasks` SKILL **двумя коррелированными правилами для decision-points** (изначально таска была только про close-coverage; scope-priority добавлен 2026-05-06 после session-start ревью отчёта claude-skills агента).
**Часть A — Pre-close coverage gate** (исходный scope). `using-tasks` должен явно требовать coverage-проверку acceptance-criteria тестами **перед** вызовом `tasks_close`. Surfaced 2026-05-06 в код-ревью factory-bootstrap fallout: 3 из 4 common-фиксов закрыты по «150/150 / 151/151 tests pass» (existing suite), но новые behaviour не покрыты — нет теста на `cached = null` invalidation, нет теста на `AggregateStatusEnum` validation error, partial test на archived-filter. Acceptance criteria требовали regression-тестов — пропущены. Также: после `feat:`/`fix:` коммита skill должен подсказывать «эта работа закрывает таску `<slug>`?» — иначе код shipped (`215afdd`, `23431c5` в claude-skills) при stale ⚪ ready статусе (`extend-project-discipline-brainstorm-workspaces`, `project-creation-lifecycle-skill`).
**Часть B — Scope priority at recommendation time** (added 2026-05-06). При session-start (или любой триггер «что делать дальше / куда копаем»), рекомендации должны идти **в порядке**: сначала ranked-список из cwd-проекта (🔴 active → 🟡 paused → ⚪ ready), потом — **одна footnote-строка** «есть 🔴 в других проектах: <N>, см. `tasks_aggregate`», если релевантно. Cross-project — информация, не driver рекомендации. Surfaced когда другой агент в claude-skills cwd рапортовал «Срочные — 3 🔴 в других проектах (stostayer.new, modules-db, crsc.web)» — выводя cross-project в первую строку, хотя у юзера cwd был claude-skills и интересовали локальные таски. `using-projects-meta` уже декларирует local-first для **чтений** — нужно распространить на **recommendation phase**.
Парный фикс к `common#tasks-close-normalize-body` (там tooling, тут policy/skill). После закрытия: новые hermes-таски попадут в починенный close-flow + рекомендации фокусируются в cwd-проекте.
**Status:** done
**Where I stopped:** Shipped в `b0d2d51 feat(using-tasks): pre-close coverage gate + local-first recommendations [v1.1.0]`. Часть A: `### Task completion` step 1 — pre-close coverage check со списком acceptance criteria и грозой gap'а; новая секция `### Post-commit task closure prompt` — на `feat:`/`fix:` коммитах prompt про closure (skips `chore:`/`meta:`). Часть B: новая секция `### Recommendations / "what's next" trigger` — local cwd-board first, cross-project как одна footnote-строка; explicit cross-project trigger flips order. README.md mirrored. Version bump 1.0.0 → 1.1.0 (MINOR, **не PATCH** как было в next_action — Rule 3 grades adding 2 new operation types as capability addition). Build+install подтверждены, `~/.claude/skills/using-tasks/SKILL.md` shows `version: 1.1.0`. **Smoke-tests:** (1) coverage-check триггернулся на самой этой close-операции (acceptance criteria verified inline above); (2) local-first рекомендации сработали раньше в этой сессии — на «discipline pre-reqs первыми» отчёт фокусировался на claude-skills, не на cross-project 🔴.
**Next action:** (none — kept until merged)
**Branch:** master
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-06T20:22:25.116Z; closed: 2026-05-06 from claude-skills -->
---
## 🟢 [tdd-criteria-skill-write] — runtime artefact for the TDD-criteria policy. Design rationale (the «why» behind every rule + the anti-vandalism leading argument + the test-immutability second-order defence) lives in `.wiki/concepts/tdd-criteria-design.md` (already promoted via `meeting-room-promote-brainstorm` 2026-05-07; NOTE: design doc was promoted at 2026-05-07T04:00 with 3 anti-loophole rules; **rule 4 (test-immutability) was added in this task description below at 2026-05-07T05:00 after user surfaced the symmetric vandalism risk; the impl session must mirror rule 4 into the design doc as well — see «Design doc amendment» section below**).
This task writes the **runtime SKILL.md** + amends the design doc to include rule 4.
**Frontmatter (YAML):**
- `name: tdd-criteria`
- `version: 0.1.0`
- `description: >` (multi-line) — must include trigger phrases the agent recognises: "TDD", "test-driven", "следуй TDD", "use TDD", "should I write tests", "skip tdd", "[skip-tdd: ...]", "[test-modify: ...]", and the bare topic name `tdd-criteria`. Also state cross-agent applicability and reference the design page.
**Body sections (use `project-discipline` and `recommend-dont-menu` as structural templates):**
1. **`# tdd-criteria`** — one-line tag-line.
2. **`## When this runs`** — trigger phrases (session-start trigger via `follow tdd-criteria` line in CLAUDE.md, plus on-demand triggers); explicit «applies before any code touches a *.ts/*.js/*.py file the agent didn't author this session».
3. **`## Default mode`** — one sentence: «TDD by default. Skip only if one of four bright-line carve-outs matches and is marked in commit subject.»
4. **`## Decision algorithm (8 questions, top-down)`** — copy the algorithm block verbatim from design doc.
5. **`## Ironclad rules (TDD obligatory)`** — 4 rules, each ≤3 lines: trigger property + what test type. No rationale (rationale = design doc).
6. **`## Permissive carve-outs (skip + marker required)`** — 4 categories, each ≤2 lines: trigger + marker.
7. **`## Anti-loophole`** — **4 rules** (was 3 before the 2026-05-07 amendment):
- Rule 1: skip-without-category invalid
- Rule 2: spike-survivor (backfill-tests task on merge)
- Rule 3: friction is the point (don't relax before ≥2 weeks)
- **Rule 4 (NEW): tests are append-only by default.** Modifying assertion / deleting test / disabling (`it.skip`/`xit`/`@skip`/`@Disabled`) requires:
- **Marker in commit subject:** `[test-modify: <test-name>: was <X>; is <Y>; reason: <Z>]` where `<X>` and `<Y>` are the **literal assertion expressions** (not paraphrased).
- **Separate commit from impl changes:** a commit must not modify both `*.test.*` and `src/*` files (or project-equivalents). `git log --grep '\[test-modify'` must give a clean test-only audit trail.
- **Why literal `was/is`:** an agent forced to write the literal assertion publishes exactly what they're rewriting. Reasons like «updated to match new behaviour» hide vandalism — agents will use them whenever allowed.
- **Bright-line check** for an optional pre-commit hook (see follow-up task `tdd-criteria-precommit-hook`): diff includes removed `expect(...)` / changed assertion args / added `.skip`/`xit`/`@skip` / deleted test definition AND commit subject has no matching `[test-modify: ...]` → block. AND files include both test-pattern and impl-pattern → block (require split).
- Composite-task pattern (decompose by artefact) is example, not rule.
8. **`## Cross-agent applicability`** — pure policy, no Claude tool refs, Hermes-mappable as `mode: auto`.
9. **`## Out of scope`** — does not enforce via git hooks (separate optional task `tdd-criteria-precommit-hook`); does not modify project CLAUDE.md (that's `project-bootstrap`'s job); does not run tests.
10. **`## Why this exists`** — one paragraph: «Tests make behaviour an invariant; without them code is an artefact silent-deletable by agents. AND: the test itself must be defended too (rule 4) — otherwise the contract collapses back into an artefact when the agent rewrites the failing test. Full rationale at `.wiki/concepts/tdd-criteria-design.md`
**Constraints:**
- No `Read/Edit/Glob/Bash` references in body — keep it agent-agnostic.
- No code blocks with shell commands — pure policy doc.
- Length target: ≤220 lines (project-discipline ~140, this is denser due to rule 4).
- Frontmatter version starts at `0.1.0` (per Rule 3 of `project-discipline`: first edit of new versioned artefact = add 0.1.0, not bump).
**Design doc amendment (do in same impl session):**
After SKILL.md is written, also amend `~/projects/claude-skills/.wiki/concepts/tdd-criteria-design.md` to add rule 4 to the «Anti-loophole» section AND extend «The argument behind TDD-default» with a sub-section «The contract is only as strong as the contract itself». Full text below — paste verbatim, no rewriting:
---
**ADD to «The argument behind TDD-default» section, after the existing paragraphs:**
```markdown
### The contract is only as strong as the contract itself
But there's a **second-order vandalism mode** that the bare contract argument doesn't cover: the agent doesn't delete the code, it rewrites the **test**. Test fails → agent changes the expected value, adds `.skip`, or deletes the test → test now passes → success reported.
If the contract artefact (the test) is rewritable by the same agent that's failing to satisfy it, the invariant collapses back into an artefact. The defence requires **two layers**:
1. **Code is defended by tests.** Ironclad rules 1-4 below.
2. **Tests are defended by process discipline.** Anti-loophole rule 4 below — append-only by default, modifications require literal-`was/is` marker in commit subject, test changes are separate commits from impl changes.
Both layers are needed. Either alone leaves a path-of-least-resistance route to «success».
```
**ADD to «Anti-loophole» section (after rule 3):**
```markdown
4. **Tests are append-only by default** (added 2026-05-07). New tests: free. **Modifying** an existing assertion, **deleting** a test, or **disabling** it (`it.skip`, `xit`, `@pytest.mark.skip`, `@Disabled`, etc.) requires both:
**a)** A marker in commit subject:
```
[test-modify: <test-name>: was <X>; is <Y>; reason: <Z>]
```
Where `<X>` and `<Y>` are the **literal assertion expressions** before and after, not paraphrased. Example:
```
[test-modify: validates email format: was expect(isValid("a@b")).toBe(true); is expect(isValid("a@b.com")).toBe(true); reason: tightened spec to require TLD]
```
**b)** Test changes go in a **separate commit** from any impl changes. A single commit must not modify both `*.test.*` and `src/*` files (or their project-equivalents). This forces an audit-able split — `git log --grep '\[test-modify'` shows every test rewrite cleanly.
**Why literal `was/is`, not free-form reason:** an agent forced to write the literal assertion publishes exactly what they're rewriting. If `42` was the correct expectation and they changed it to `43` to make a buggy fix pass, the literal `was 42; is 43` line in `git log` identifies the culprit. A reason like «updated to match new behaviour» hides everything — agents will use it whenever it is allowed.
**Bright-line check** (for an optional pre-commit hook, see follow-up task `tdd-criteria-precommit-hook`):
- `git diff --cached` includes a removed `expect(...)` / `assert(...)` / `assertThat(...)` line, OR
- changes the arguments of an existing assertion call, OR
- adds `.skip`, `xit`, `@skip`, `@Disabled`, etc. annotation, OR
- deletes a test file or `it(...)` / `test(...)` / `def test_*` definition
AND the commit subject does not contain `[test-modify: ...]` matching the format above → block.
AND `git diff --cached --name-only` includes both test-pattern and impl-pattern files → block (require split).
5. **Don't apply rule 4 retroactively** to tests written before the rule was adopted. The rule applies to test changes made after the project's CLAUDE.md picks up `follow tdd-criteria`. Existing test bodies aren't grandfathered into requiring `was/is` for a one-time rewrite.
```
**ADD to «What's excluded as not bright-line»:**
- ~~«Tests should not be modified casually»~~ — paraphrasable, agents will modify casually and call it «refactor». Replaced by Anti-loophole rule 4 with literal-evidence requirement.
**ADD to «Trade-offs» section:**
- **The literal-`was/is` requirement is verbose** for a renamed test or trivial typo fix. The verbosity is the point — an agent that genuinely fixed a typo writes the same assertion twice with one character changed; an agent that rewrote a failing test writes obviously different assertions. Reading `git log --grep '\[test-modify'` shows the difference at a glance.
**UPDATE frontmatter** to add `amended: "2026-05-07: added test-immutability defence (Anti-loophole rule 4) after user noted symmetric vandalism risk on tests"`.
---
**Commit pattern for impl session:**
- Commit 1: `skills/tdd-criteria/SKILL.md` (new file). Subject: `feat(skills): tdd-criteria skill v0.1.0 [TDD-default + 4 carve-outs + 4 anti-loophole rules incl. test-immutability]`.
- Commit 2: `.wiki/concepts/tdd-criteria-design.md` (amend). Subject: `docs(tdd-criteria): rule 4 — test-immutability defence (was X; is Y marker)`. Note: this is wiki, not test code, so `[test-modify]` rule doesn't apply to this commit — rule 4 governs *test* file changes, not wiki rationale changes.
**Frontmatter (YAML):**
- `name: tdd-criteria`
- `version: 0.1.0`
- `description: >` (multi-line) — must include trigger phrases the agent recognises: "TDD", "test-driven", "следуй TDD", "use TDD", "should I write tests", "skip tdd", "[skip-tdd: ...]", "[test-modify: ...]", and the bare topic name `tdd-criteria`. Also state cross-agent applicability and reference the design page.
**Body sections (use `project-discipline` and `recommend-dont-menu` as structural templates):**
1. **`# tdd-criteria`** — one-line tag-line.
2. **`## When this runs`** — trigger phrases (session-start trigger via `follow tdd-criteria` line in CLAUDE.md, plus on-demand triggers); explicit «applies before any code touches a *.ts/*.js/*.py file the agent didn't author this session».
3. **`## Default mode`** — one sentence: «TDD by default. Skip only if one of four bright-line carve-outs matches and is marked in commit subject.»
4. **`## Decision algorithm (8 questions, top-down)`** — copy the algorithm block verbatim from design doc.
5. **`## Ironclad rules (TDD obligatory)`** — 4 rules, each ≤3 lines: trigger property + what test type. No rationale (rationale = design doc).
6. **`## Permissive carve-outs (skip + marker required)`** — 4 categories, each ≤2 lines: trigger + marker.
7. **`## Anti-loophole`** — 3 bullets: skip-without-category invalid; spike-survivor rule; composite-task = decompose by artefact.
8. **`## Cross-agent applicability`** — pure policy, no Claude tool refs, Hermes-mappable as `mode: auto`.
9. **`## Out of scope`** — does not enforce via git hooks (separate optional task `tdd-criteria-precommit-hook`); does not modify project CLAUDE.md (that's `project-bootstrap`'s job); does not run tests.
10. **`## Why this exists`** — one paragraph: «Tests make behaviour an invariant; without them code is an artefact silent-deletable by agents. Full rationale at `.wiki/concepts/tdd-criteria-design.md`
**Constraints:**
- No `Read/Edit/Glob/Bash` references in body — keep it agent-agnostic.
- No code blocks with shell commands — pure policy doc.
- Length target: ≤200 lines (project-discipline is ~140 — similar density).
- Frontmatter version starts at `0.1.0` (per Rule 3 of `project-discipline`: first edit of new versioned artefact = add 0.1.0, not bump).
**Status:** done
**Where I stopped:** Shipped в `954f8ba feat(skills): tdd-criteria skill v0.1.0`. SKILL.md 86 lines, 4 ironclad + 4 permissive + 4 anti-loophole (incl. rule 4 test-immutability), 0 Claude-tool refs. Design doc amended в `2ba6981` — rule 4 + subsection + trade-off + excluded formulation added.
**Next action:** (none — kept until merged)
**Branch:** master
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-07T04:02:05.413Z -->
---
## 🟢 [tdd-criteria-hermes-mapping] — Add entry for `tdd-criteria` skill to `~/projects/claude-skills/hermes/mapping.yaml`. Required step — `build-hermes.py` fails on unmapped skills.
**Entry (place alphabetically among `auto`-mode skills, after `project-discipline`):**
```yaml
tdd-criteria:
mode: auto
category: software-development
```
**No `replace-rules`** — the skill is pure policy (no Claude-tool refs like `Read`/`Edit`/`Bash`/`Glob` in SKILL.md body). Verified by `tdd-criteria-skill-write` task constraints.
**Verification step:** run `python ~/projects/claude-skills/scripts/build-hermes.py` after edit — output must include `tdd-criteria` in the converted list under `dist-hermes/software-development/tdd-criteria/`. If build fails on `Unmapped skill: tdd-criteria` the entry didn't take; if it fails with replace-rule errors, the SKILL.md inadvertently has Claude-tool refs (loop back to `tdd-criteria-skill-write` to clean).
**Out of scope:** no Hermes-side install / activation (Hermes side handled by `hermes-mvp-coverage` task family separately). This task only ensures the converter knows about the skill.
**Status:** done
**Where I stopped:** Shipped в `7d308ff feat(hermes): add tdd-criteria mapping (auto, software-development) + rebuild dist-hermes`. Build verified: `dist-hermes/software-development/tdd-criteria/SKILL.md` created. No replace-rules needed (pure policy skill).
**Next action:** (none — kept until merged)
**Branch:** master
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-07T04:02:21.684Z -->
---
## 🟢 [tdd-criteria-build-install] — Build `dist/tdd-criteria.skill` archive, install to `~/.claude/skills/tdd-criteria/`, commit both `dist/` and `dist-hermes/` artefacts. Closes the rollout loop — after this task the skill is live for both Claude (next session) and Hermes (next factory deploy).
**Steps:**
1. `bash ~/projects/claude-skills/scripts/install.sh tdd-criteria` — copies `skills/tdd-criteria/``~/.claude/skills/tdd-criteria/` (replaces if exists). Verifies skill is loadable in next Claude session.
2. `bash ~/projects/claude-skills/scripts/build.sh tdd-criteria` — zips `skills/tdd-criteria/``dist/tdd-criteria.skill`. Cross-platform: bash on Linux/macOS, delegates to PowerShell on Windows without `zip`.
3. `python ~/projects/claude-skills/scripts/build-hermes.py` — regenerates `dist-hermes/` (already done in `tdd-criteria-hermes-mapping`'s verification step, but re-run for clean state before commit).
4. Commit: `dist/tdd-criteria.skill` + `dist-hermes/software-development/tdd-criteria/` (whole tree).
5. Push (subject to project-discipline Rule 4 — ask user if no auto-push grant).
**Verification:**
- `ls ~/.claude/skills/tdd-criteria/SKILL.md` exists.
- `ls ~/projects/claude-skills/dist/tdd-criteria.skill` exists, size > 0.
- `ls ~/projects/claude-skills/dist-hermes/software-development/tdd-criteria/SKILL.md` exists.
- Optional: in a fresh Claude session, ask «what skills do you have for TDD?» — `tdd-criteria` should surface.
**Out of scope:** activation in specific projects (separate task `tdd-criteria-rollout-projects` if user wants to add `follow tdd-criteria` trigger to selected `CLAUDE.md`s). Skill is reachable via description-based pull regardless.
**Status:** done
**Where I stopped:** Shipped в `62a54c9 build(tdd-criteria): add dist archive`. `install.sh``~/.claude/skills/tdd-criteria/`; `build.sh``dist/tdd-criteria.skill` (2862 bytes); `build-hermes.py``dist-hermes/software-development/tdd-criteria/SKILL.md`. All three artefacts verified on disk.
**Next action:** (none — kept until merged)
**Branch:** master
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-07T04:02:38.862Z -->
---
## 🟢 [tdd-criteria-review] — Code-review checkpoint для брейнсторма `tdd-criteria` (промоушен 2026-05-07).
**Status:** done
**Where I stopped:** Review complete. 7-point checklist passed. 4 findings applied directly as v0.2.0 (trigger-loophole fix, composite-tasks + refactoring sections, file-extension expansion, wrapper line-count clarification, spike-survivor .tasks/ fallback, foreign-schema fix). 3 minor items deferred as wontfix (retroactivity marker — negligible risk; spike-survivor already has fallback; refactoring is now documented). SKILL.md 0.1.0→0.2.0, design doc amended, rebuilt + reinstalled + hermes rebuilt.
**Next action:** (none — kept until merged)
**Branch:** master
<!-- created-by: OpeItcLoc03@DESKTOP-NSESKTOP-NSEF0UK / from: claude-skills / 2026-05-07 -->
---
## 🟢 [bootstrap-add-tdd-trigger] — Добавить `tdd-criteria` в раскатку `project-bootstrap`: канонический триггер в шаблоне `CLAUDE.md` + запись в Step 5.6 (skill-deps check). Сейчас у `tdd-criteria` v0.1.0 есть Hermes-mapping (commit 7d308ff — авто-классификатор по домену software-development), но текстового триггера в раскатываемом `CLAUDE.md` нет — старые/новые проекты явного крючка для агента не получают, срабатывание только через классификацию. Паттерн повторяет коммиты d0a450c (`follow project discipline`, v1.5.0) и dcad950 (`pull remote before work`, v1.4.0). Версия `project-bootstrap` 1.9.0 → 1.10.0 (MINOR — новый канонический триггер).
**Status:** done
**Where I stopped:** Shipped в `e566df4 feat(project-bootstrap): add tdd-criteria to canonical triggers [v1.10.0]`. Trigger-line `follow TDD criteria` добавлен в `assets/CLAUDE.md.template` + Step 5.6 trigger→fulfiller table. Version 1.9.0 → 1.10.0.
**Next action:** (none — kept until merged)
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: meeting-room / 2026-05-07T06:05:13.068Z; closed: 2026-05-07 from claude-skills -->
---
## 🟢 [bootstrap-upgrade-canonical-triggers] — Прогнать `project-bootstrap` v1.10.0 в upgrade-режиме на этом проекте. Цель — дописать в `CLAUDE.md` 2 недостающих канонических триггера: `follow tdd-criteria`, `recommend, don't menu`. Уже присутствуют: `pull remote before work`, `follow project discipline`, `delegate to interns when allowed`, `we're on Windows`. Аудит 2026-05-07 через `bulk_text_read`. Контекст — координатор `[bootstrap-rollout-canonical-triggers]` в `_meta` (commit dd933fd). Пилот на `books` подтвердил идемпотентность (158fc95).
**Status:** done
**Where I stopped:** Shipped в `ac0fa57 chore(bootstrap): upgrade CLAUDE.md — add tdd-criteria, recommend-dont-menu triggers`. 2 файла изменены: CLAUDE.md (+2 triggers), manifest 1.2.0→1.10.1. Verify подтверждён — `git diff --stat` показывал 2 файла. Unblock готов — можно продолжить mass-unblock 5-string группы.
**Next action:** (none — kept until merged)
**Branch:** master
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: meeting-room / 2026-05-07T06:57:11.004Z -->
---
## 🟢 [bootstrap-fix-tdd-recommend-template] — Fix bug в `project-bootstrap@1.10.0`: CLAUDE.md template-литерал (lines 339-342 в `skills/project-bootstrap/SKILL.md`) содержит только 4 канонических триггера, отсутствуют `follow tdd-criteria` и `recommend, don't menu` — те, что v1.10.0 заявляла добавить. Соответствующие prose-paragraph (lines 351-385) тоже отсутствуют для этих двух. Step 5.6 (skill-deps map, lines 444-449) при этом полный — все 6 строк правильно мапятся.
Симптом: upgrade-mode на репе, где отсутствуют `tdd-criteria` и `recommend-dont-menu` (например claude-skills, cancel-music-webstore, meeting-room, projects-meta-mcp), детектит «already canon» (потому что 4 template-строки уже на месте), не вставляет недостающие 2.
Воспроизведено 2026-05-07 на `claude-skills`: `upgrade project` отрапортовал «CLAUDE.md — Already canon. All template triggers present; extras (follow tdd-criteria, recommend, don't menu) preserved» — но в реальности эти 2 строки отсутствуют (`Select-String` пусто, `bootstrap-manifest.md` остался на 1.2.0).
Корень: bootstrap-add-tdd-trigger task (closed `7bde0cd`) была реализована **частично** — version bump + Step 5.6 update сделан, template-литерал и prose не тронуты. Скил остался в неконсистентном состоянии.
**Status:** done
**Where I stopped:** Shipped в `aac9088 fix(project-bootstrap): v1.10.1`. Template + prose updated, 2 canonical triggers added. Upgrade tested on claude-skills — `ac0fa57` confirms 2-file change (CLAUDE.md +2, manifest 1.2.0→1.10.1).
**Next action:** (none — kept until merged)
**Branch:** master
---
END OF ARCHIVE