diff --git a/bags/2026-06-17-wall-read-block-bug1.md b/bags/2026-06-17-wall-read-block-bug1.md new file mode 100644 index 0000000..784bca1 --- /dev/null +++ b/bags/2026-06-17-wall-read-block-bug1.md @@ -0,0 +1,95 @@ +# БАГ — чтение под стеной «роутер-наставник» (impl-режим) + связанный десинк указателя + +**Дата:** 17.06.2026 +**Откуда:** живой прогон go-live security gate (отчёт `docs/security/2026-06-17-go-live-security-report.md`). +**Куда:** claude-brain (управляющий слой стены — `enforce-supreme-gate` и оркестрация). +**Связано:** `docs/superpowers/router-mentor-wall-GUIDE.md` (раздел «Уроки живого прогона»). + +--- + +## Суть бага (одной фразой) + +В режиме реализации (под опечатанным планом) чтение разрешено **только по пути +текущего шага**. Всё остальное читать нельзя — включая файлы, появившиеся во время +прогона, и **собственный вывод запущенных инструментов** (гейт ДР-1 в +`enforce-supreme-gate`). + +## Почему это серьёзно + +Многошаговая работа, где следующее действие зависит от прочитанного (аудит, +отладка, цепочки инструментов, проверка результата), под стеной фактически +слепнет. Обойти удалось только тем, что **владелец вставлял файлы в чат вручную** +(контекст разговора ≠ вызов Read-инструмента → стена его не трогает). Это +костыль, а не решение. + +## Случаи, где дефект бьёт + +1. **Свой же вывод не прочитать.** Длинная команда (сканер/сборка/тесты) + уезжает в фоновый запуск, результат пишется в temp-файл — открыть нельзя. + *Живой пример прогона:* не прочитался вывод Nuclei. +2. **Забыл прочитать до печати плана — всё.** Понадобился файл по ходу — под + планом не открыть; только переделывать план или просить владельца вставить. +3. **Сторонний сервис/процесс создал файл во время прогона.** Генератор, + выгрузка, отчёт другой задачи, артефакт CI — недоступны. +4. **Нечем проверить результат шага.** Сделал шаг, для проверки нужен другой + файл/лог — нельзя. Получается «сделал вслепую». +5. **Ветвление по содержимому невозможно.** «Если в конфиге X — делаем Y» не + работает: чтобы выбрать, надо прочитать. +6. **Диагностика ошибки по внешнему логу.** Шаг упал, ошибка «смотри лог тут» — + тот лог открыть нельзя. +7. **Промежуточный артефакт в цепочке инструментов.** Шаг N сделал файл, шаг N+1 + должен на него посмотреть — нельзя, только передать вслепую. +8. **Перечитать только что записанное.** Записал файл на шаге 2, на шаге 4 надо + свериться — закрыто. +9. **Неожиданная находка.** Поиск дал совпадение в файле, о котором при + планировании не знал — открыть его уже нельзя. +10. **Файлы от параллельной сессии.** Соседняя сессия добавила/закоммитила + файлы — мне их не глянуть. + +## Связь с рассинхроном указателя (важно для починки) + +Наивная мысль «добавить escape-метку `read:`» **опасна**: стена сейчас двигает +счётчик шагов вперёд **даже когда действие не прошло** (это и есть десинк F-J — +на прогоне так был пропущен шаг gitleaks: `supreme-gate` сдвинул указатель, а +`enforce-domain-skill-discipline` дальше в цепочке уронил действие). Если пустить +чтение через ту же машинерию шагов — **очередь сдвинется, план поедет**. + +Ключ: **чтение не является шагом.** Шаги плана — только `Write/Edit/Bash/MultiEdit`. +Значит разрешение на чтение должно работать **«сбоку от очереди»**, не касаясь +счётчика шагов. + +## Приоритет починки (для claude-brain) + +1. **ГЛАВНОЕ — счётчик шагов += 1 только при успешно завершённом настоящем + шаге.** Не на заблокированном действии, не на чтении, не на постороннем. + Это чинит десинк F-J И автоматически делает чтение безопасным (раз чтение не + шаг — оно не может сдвинуть очередь). +2. **Пассивно разрешить чтение** без escape и без касания очереди: + (а) собственный вывод инструментов, запущенных в этом плане (temp-файлы); + (б) файлы, появившиеся ПОСЛЕ опечатывания плана (их при планировании не было — + запрет «лишнего чтения» здесь нелогичен). +3. **Escape-метка `read:<путь>` — только крайний резерв**, и строго мимо + счётчика шагов (out-of-band), чтобы не повторить десинк. После п.1+п.2 почти + не нужна. + +## Критерий «починено» + +- Под опечатанным планом можно прочитать свой вывод и файлы, созданные после + печати, без сдвига очереди шагов. +- Падение/блокировка шага НЕ двигает указатель (десинк F-J не воспроизводится). +- При необходимости разовое `read:<путь>` через escape не ломает очередность. + +--- + +## БАГ-2 — наставник не видит часть плана + нет owner-seal при зацикле (17.06.2026) + +**Случай:** правка-поправка аудита (2 аддитивных Edit в `docs/`). Наставник 3 круга подряд (17, 18, 19) давал NO-GO с одним требованием: «добавь к каждому шагу явную пометку, что вердикт остаётся NO-GO». + +**Дефект 1 — наставник не видит доп.поля `steps-json`.** Контроллер добавил поле `note` к каждому шагу с требуемым текстом. Но наставник в своём представлении плана видит только `op`/`object`/`ref` — поле `note` (и любые доп.поля) **срезаются** до того, как план попадает к наставнику. Поэтому он снова и снова требует то, что уже добавлено → дедлок, план не пройти, сколько ни переписывай. + +**Дефект 2 — нет owner-seal при зацикле.** По дизайну после 3 NO-GO подряд должна появляться карточка арбитража owner-seal (3 кнопки: держусь контроллера / согласен / своё). На прогоне после кругов 17–19 карточка **не появилась** — круг не разрывался. Контроллер обошёл стену через терминал владельца. + +**Починка (для claude-brain):** +1. Наставник должен видеть план целиком, включая доп.поля шагов (`note`/`description`); ИЛИ задокументировать единственно поддержанный способ «пометки к шагу». +2. Счётчик «N NO-GO подряд» обязан реально триггерить owner-seal-карточку — проверить порог и срабатывание. +3. Требование, которое контроллер физически не может выразить в формате плана, не должно вести к бесконечному NO-GO — нужен предохранитель (эскалация к владельцу). diff --git a/docs/superpowers/plans/2026-06-17-claude-md-deliderra-cleanup-plan-v2.md b/docs/superpowers/plans/2026-06-17-claude-md-deliderra-cleanup-plan-v2.md new file mode 100644 index 0000000..06e76f1 --- /dev/null +++ b/docs/superpowers/plans/2026-06-17-claude-md-deliderra-cleanup-plan-v2.md @@ -0,0 +1,29 @@ +# План: чистка CLAUDE.md от продуктового контекста + указатель на онбординг-гайд + +## Цель + +Выполнить правки `CLAUDE.md` по дизайну: добавить в начало указатель на онбординг-гайд, +удалить из шапки и `§5` продуктовые пункты (объекта в `claude-brain` нет), перенумеровать `§5` +сквозной нумерацией с починкой внутренних ссылок. `§9` не трогается. Каждая правка проверяется +read-only командой; финальная проверка ищет все удалённые продуктовые термины разом. + +```skills-json +["claude-md-management"] +``` + +```steps-json +[ + {"op":"Edit","object":"CLAUDE.md","ref":"ct"}, + {"op":"Bash","object":"grep -c router-mentor-wall-GUIDE CLAUDE.md","ref":"cr"}, + {"op":"Edit","object":"CLAUDE.md","ref":"sc"}, + {"op":"Bash","object":"grep -ci forest CLAUDE.md","ref":"cr"}, + {"op":"Edit","object":"CLAUDE.md","ref":"cv"}, + {"op":"Bash","object":"grep -ci -e vuetify -e pa11y -e lighthouse -e inertia -e livewire -e filament -e motion -e schema.sql -e production CLAUDE.md","ref":"cr"} +] +``` + +```verified-context-json +[ + {"id":"vc1","kind":"EXTRACTED","ref":"tools/cost-pricing.mjs","anchor":"export const PRICING = Object.freeze("} +] +``` diff --git a/docs/superpowers/plans/2026-06-17-claude-md-deliderra-cleanup-plan-v3.md b/docs/superpowers/plans/2026-06-17-claude-md-deliderra-cleanup-plan-v3.md new file mode 100644 index 0000000..8e20b68 --- /dev/null +++ b/docs/superpowers/plans/2026-06-17-claude-md-deliderra-cleanup-plan-v3.md @@ -0,0 +1,33 @@ +# План: чистка CLAUDE.md от продуктового контекста + указатель на онбординг-гайд + +## Цель + +Выполнить правки `CLAUDE.md` по дизайну: добавить в начало указатель на онбординг-гайд, +удалить из шапки и `§5` продуктовые пункты (объекта в `claude-brain` нет), перенумеровать `§5` +сквозной нумерацией с починкой внутренних ссылок. `§9` не трогается. Каждая правка проверяется +read-only командой; финальная проверка ищет все удалённые продуктовые термины разом. + +Формат указателя согласован с владельцем заранее — **жирный блок-цитата** +(`> **❗ ПЕРВОЕ — прочитай гайд:** [router-mentor-wall-GUIDE.md](...) — …`). Единый стиль +применяется в шаге `ct`; дополнительного уточнения по ходу не требуется. + +```skills-json +["claude-md-management"] +``` + +```steps-json +[ + {"op":"Edit","object":"CLAUDE.md","ref":"ct"}, + {"op":"Bash","object":"grep -c router-mentor-wall-GUIDE CLAUDE.md","ref":"cr"}, + {"op":"Edit","object":"CLAUDE.md","ref":"sc"}, + {"op":"Bash","object":"grep -ci forest CLAUDE.md","ref":"cr"}, + {"op":"Edit","object":"CLAUDE.md","ref":"cv"}, + {"op":"Bash","object":"grep -ci -e vuetify -e pa11y -e lighthouse -e inertia -e livewire -e filament -e motion -e schema.sql -e production CLAUDE.md","ref":"cr"} +] +``` + +```verified-context-json +[ + {"id":"vc1","kind":"EXTRACTED","ref":"tools/cost-pricing.mjs","anchor":"export const PRICING = Object.freeze("} +] +``` diff --git a/docs/superpowers/plans/2026-06-17-claude-md-deliderra-cleanup-plan-v4.md b/docs/superpowers/plans/2026-06-17-claude-md-deliderra-cleanup-plan-v4.md new file mode 100644 index 0000000..510bec2 --- /dev/null +++ b/docs/superpowers/plans/2026-06-17-claude-md-deliderra-cleanup-plan-v4.md @@ -0,0 +1,33 @@ +# План: чистка CLAUDE.md от продуктового контекста + указатель на онбординг-гайд + +## Цель + +Выполнить правки `CLAUDE.md` по дизайну: добавить в начало указатель на онбординг-гайд, +удалить из шапки и `§5` продуктовые пункты (объекта в `claude-brain` нет), перенумеровать `§5` +сквозной нумерацией с починкой внутренних ссылок. `§9` не трогается. Каждая правка проверяется +read-only командой; финальная проверка ищет все удалённые продуктовые термины разом. + +Формат указателя согласован с владельцем заранее — **жирный блок-цитата** +(`> **❗ ПЕРВОЕ — прочитай гайд:** [router-mentor-wall-GUIDE.md](...) — …`). Единый стиль +применяется в шаге `ct`; дополнительного уточнения по ходу не требуется. + +```skills-json +["claude-md-management"] +``` + +```steps-json +[ + {"op":"Edit","object":"CLAUDE.md","ref":"ct"}, + {"op":"Bash","object":"grep -cF router-mentor-wall-GUIDE CLAUDE.md","ref":"cr"}, + {"op":"Edit","object":"CLAUDE.md","ref":"sc"}, + {"op":"Bash","object":"grep -ci forest CLAUDE.md","ref":"cr"}, + {"op":"Edit","object":"CLAUDE.md","ref":"cv"}, + {"op":"Bash","object":"grep -ci -e vuetify -e pa11y -e lighthouse -e inertia -e livewire -e filament -e motion -e schema.sql -e production CLAUDE.md","ref":"cr"} +] +``` + +```verified-context-json +[ + {"id":"vc1","kind":"EXTRACTED","ref":"tools/cost-pricing.mjs","anchor":"export const PRICING = Object.freeze("} +] +``` diff --git a/docs/superpowers/plans/2026-06-17-claude-md-deliderra-cleanup-plan.md b/docs/superpowers/plans/2026-06-17-claude-md-deliderra-cleanup-plan.md new file mode 100644 index 0000000..36abbbd --- /dev/null +++ b/docs/superpowers/plans/2026-06-17-claude-md-deliderra-cleanup-plan.md @@ -0,0 +1,31 @@ +# План: чистка CLAUDE.md от продуктового контекста + указатель на онбординг-гайд + +## Цель + +Выполнить правки `CLAUDE.md` по дизайну: добавить в начало указатель на онбординг-гайд, +удалить из шапки и `§5` продуктовые пункты (объекта в `claude-brain` нет), перенумеровать `§5` +сквозной нумерацией с починкой внутренних ссылок, добавить датированную запись в `§9`. Каждая +правка проверяется read-only командой. + +```skills-json +["claude-md-management"] +``` + +```steps-json +[ + {"op":"Edit","object":"CLAUDE.md","ref":"ct"}, + {"op":"Bash","object":"grep -c router-mentor-wall-GUIDE CLAUDE.md","ref":"cr"}, + {"op":"Edit","object":"CLAUDE.md","ref":"sc"}, + {"op":"Bash","object":"grep -c Forest CLAUDE.md","ref":"cr"}, + {"op":"Edit","object":"CLAUDE.md","ref":"cv"}, + {"op":"Bash","object":"grep -c Boost CLAUDE.md","ref":"cr"}, + {"op":"Edit","object":"CLAUDE.md","ref":"sc"}, + {"op":"Bash","object":"grep -c Vuetify CLAUDE.md","ref":"cr"} +] +``` + +```verified-context-json +[ + {"id":"vc1","kind":"EXTRACTED","ref":"tools/cost-pricing.mjs","anchor":"export const PRICING = Object.freeze("} +] +``` diff --git a/docs/superpowers/plans/2026-06-17-tools-app-path-split-legacy-fix-plan.md b/docs/superpowers/plans/2026-06-17-tools-app-path-split-legacy-fix-plan.md new file mode 100644 index 0000000..8a6b0aa --- /dev/null +++ b/docs/superpowers/plans/2026-06-17-tools-app-path-split-legacy-fix-plan.md @@ -0,0 +1,29 @@ +# План: фикс хардкода `app/` в `run-test-json` + диагностика расписки + +## Цель + +Мигрировать выбор корня и конфига сюиты в `tools/run-test-json.mjs` с захардкоженного `app/` +на общий `resolveVitestConfig` (от корня репозитория), покрыть чистую построительницу аргументов +тестами по TDD и эмпирически наблюдать исход производителя verify-расписки в текущем окружении. + +```skills-json +["test-driven-development"] +``` + +```steps-json +[ + {"op":"Edit","object":"tools/run-test-json.test.mjs","ref":"ct1"}, + {"op":"Bash","object":"npx vitest run tools/run-test-json.test.mjs --config vitest.config.tools.mjs --reporter dot","ref":"ct1"}, + {"op":"Edit","object":"tools/run-test-json.mjs","ref":"al1"}, + {"op":"Bash","object":"npx vitest run tools/run-test-json.test.mjs --config vitest.config.tools.mjs --reporter tap","ref":"al1"}, + {"op":"Bash","object":"node tools/produce-verify-receipt.mjs","ref":"dg1"}, + {"op":"Bash","object":"npx vitest run --config vitest.config.tools.mjs --no-file-parallelism","ref":"cr1"} +] +``` + +```verified-context-json +[ + {"id":"ax1","kind":"EXTRACTED","ref":"tools/run-test-json.mjs","anchor":"export function runVitestJson"}, + {"id":"ax2","kind":"EXTRACTED","ref":"tools/produce-verify-receipt.mjs","anchor":"export function resolveVitestConfig"} +] +``` diff --git a/docs/superpowers/specs/2026-06-17-claude-md-deliderra-cleanup-design-v2.md b/docs/superpowers/specs/2026-06-17-claude-md-deliderra-cleanup-design-v2.md new file mode 100644 index 0000000..4aeb5bd --- /dev/null +++ b/docs/superpowers/specs/2026-06-17-claude-md-deliderra-cleanup-design-v2.md @@ -0,0 +1,70 @@ +# Чистка оперативной карты CLAUDE.md от продуктового контекста + указатель на онбординг-гайд + +## Цель + +Привести `CLAUDE.md` в соответствие с фактом: репозиторий `claude-brain` — дом управляющего +слоя Claude (router / mentor / observer / registry / `tools/`), продукта в нём нет +(`app/` / `db/` / `web/` отсутствуют). Убрать из файла продуктовые инструкции, у которых в +этом репозитории нет объекта, и поднять в начало файла указатель на онбординг-гайд, который +новая сессия должна прочитать первым. + +## Контракт изменений {#ct} + +- В начало файла (над разделом «ГЛАВНОЕ») добавляется однострочный выделенный указатель: + первое чтение для новой сессии — `docs/superpowers/router-mentor-wall-GUIDE.md`. Указатель — + кликабельная markdown-ссылка относительным путём. +- Сохраняемые разделы (`§0`, `§1`, остаток `§5`, `§9`) сохраняют смысл; правки — только + удаление продуктовых пунктов, перенумерация `§5` и починка внутренних ссылок на номера. +- Файл остаётся валидным markdown; нумерованный список `§5` идёт без пропусков (1..N). + +## Что удаляется и что остаётся {#sc} + +Удаляется (продуктовое, объекта в `claude-brain` нет): + +- в шапке — заголовок «техконтекст Лидерры» (заменяется нейтральным «оперативная карта мозга») + и блок-нота про ребрендинг названия/палитры/шрифтов; +- в строке статуса файла — формулировка про «отложенный разбор тела» (разбор выполнен); +- в `§5` — пункт про подключение внешнего DB-помощника к production-БД; пункт про запрет + фронтовых библиотек чужого стека в пользу Vue+Vuetify; пункт про инструмент a11y; пункт про + расширенный UI-пул из координирующего свода; пункт про правку `db/schema.sql`; резервный + пункт про motion-runtime. + +Остаётся (машинерия управляющего слоя, актуальна для brain): + +- `§0` нормативный квинтет; `§1` цепочка приоритета правил; +- в `§5` — запрет ПДн/секретов в коммитах (gitleaks); запрет дублей инструментов; правило + синхронизации этого файла с Pravila/Tooling; запрет закрывать открытые вопросы без команды; + канал правок через плагин `claude-md-management`; обязательность Superpowers-skill; правило + docs-only коммитов; правило `/graphify query` перед codebase-вопросом; правило coverage для + записи памяти; +- `§9` история версий — без изменений. + +## Крайние случаи {#ec} + +- Внутренние ссылки вида «§5 п.N» в шапке и внутри `§5` после перенумерации обязаны указывать на + актуальные номера (иначе появятся битые перекрёстные ссылки). +- Удаление продуктовых пунктов не должно задеть соседние сохраняемые пункты: правки `§5` + выполняются одним аккуратным контурным фрагментом. +- Версии нормативного квинтета (Pravila/Tooling) не трогаются — их синхронизация отдельная + задача владельца. + +## Конвенция и нумерация {#cv} + +- `§5` перенумеровывается сквозной нумерацией 1..9 в порядке следования сохранённых пунктов. +- Внутренние перекрёстные ссылки на номера пунктов `§5` приводятся к новой нумерации + (правило-синхронизации, канал-правок, отсылки «flow п.N», «пп.N»). +- Терминология сохраняемых пунктов — «владелец» (вместо устаревшего «заказчик»), без иной + переформулировки смысла. + +## Критерий приёмки {#cr} + +- В начале файла присутствует строка-указатель на `router-mentor-wall-GUIDE.md`. +- В файле больше нет упоминаний продуктовых сущностей удалённых пунктов (внешний DB-помощник, + Vuetify-стек, инструмент a11y, ребрендинг-палитра, `db/schema.sql`, motion-runtime). +- `§5` — непрерывный список 1..9; внутренние ссылки на номера пунктов согласованы. + +```verified-context-json +[ + {"id":"vc1","kind":"EXTRACTED","ref":"tools/cost-pricing.mjs","anchor":"export const PRICING = Object.freeze("} +] +``` diff --git a/docs/superpowers/specs/2026-06-17-claude-md-deliderra-cleanup-design-v3.md b/docs/superpowers/specs/2026-06-17-claude-md-deliderra-cleanup-design-v3.md new file mode 100644 index 0000000..266989d --- /dev/null +++ b/docs/superpowers/specs/2026-06-17-claude-md-deliderra-cleanup-design-v3.md @@ -0,0 +1,72 @@ +# Чистка оперативной карты CLAUDE.md от продуктового контекста + указатель на онбординг-гайд + +## Цель + +Привести `CLAUDE.md` в соответствие с фактом: репозиторий `claude-brain` — дом управляющего +слоя Claude (router / mentor / observer / registry / `tools/`), продукта в нём нет +(`app/` / `db/` / `web/` отсутствуют). Убрать из файла продуктовые инструкции, у которых в +этом репозитории нет объекта, и поднять в начало файла указатель на онбординг-гайд, который +новая сессия должна прочитать первым. + +## Контракт изменений {#ct} + +- В начало файла (над разделом «ГЛАВНОЕ») добавляется однострочный выделенный указатель: + первое чтение для новой сессии — `docs/superpowers/router-mentor-wall-GUIDE.md`. Указатель — + кликабельная markdown-ссылка относительным путём. +- Сохраняемые разделы (`§0`, `§1`, остаток `§5`, `§9`) сохраняют смысл; правки — только + удаление продуктовых пунктов, перенумерация `§5` и починка внутренних ссылок на номера. +- Файл остаётся валидным markdown; нумерованный список `§5` идёт без пропусков (1..N). + +## Что удаляется и что остаётся {#sc} + +Удаляется (продуктовые инструкции, объекта в `claude-brain` нет): + +- в шапке — заголовок «техконтекст Лидерры» (заменяется нейтральным «оперативная карта мозга») + и блок-нота про ребрендинг названия/палитры/шрифтов; +- в строке статуса файла — формулировка про «отложенный разбор тела» (разбор выполнен); +- в `§5` — пункт про подключение внешнего DB-помощника к production-БД; пункт про запрет + фронтовых библиотек чужого стека в пользу Vue+Vuetify; пункт про инструмент a11y; пункт про + расширенный UI-пул из координирующего свода; пункт про правку `db/schema.sql`; резервный + пункт про motion-runtime. + +Остаётся (машинерия управляющего слоя, актуальна для brain): + +- `§0` нормативный квинтет; `§1` цепочка приоритета правил; +- в `§5` — запрет ПДн/секретов в коммитах (gitleaks); запрет дублей инструментов; правило + синхронизации этого файла с Pravila/Tooling; запрет закрывать открытые вопросы без команды; + канал правок через плагин `claude-md-management`; обязательность Superpowers-skill; правило + docs-only коммитов; правило `/graphify query` перед codebase-вопросом; правило coverage для + записи памяти; +- `§9` история версий — **без изменений**. Историческая запись о прошлой компакции может + упоминать прошлый продуктовый контекст как факт истории — это вне области чистки. + +## Крайние случаи {#ec} + +- Внутренние ссылки вида «§5 п.N» в шапке и внутри `§5` после перенумерации обязаны указывать на + актуальные номера (иначе появятся битые перекрёстные ссылки). +- Удаление продуктовых пунктов не должно задеть соседние сохраняемые пункты: правки `§5` + выполняются одним аккуратным контурным фрагментом. +- Версии нормативного квинтета (Pravila/Tooling) и историческая запись `§9` не трогаются. + +## Конвенция и нумерация {#cv} + +- `§5` перенумеровывается сквозной нумерацией 1..9 в порядке следования сохранённых пунктов. +- Внутренние перекрёстные ссылки на номера пунктов `§5` приводятся к новой нумерации + (правило-синхронизации, канал-правок, отсылки «flow п.N», «пп.N»). +- Терминология сохраняемых пунктов — «владелец» (вместо устаревшего «заказчик»), без иной + переформулировки смысла. + +## Критерий приёмки {#cr} + +- В начале файла присутствует строка-указатель на `router-mentor-wall-GUIDE.md`. +- В файле больше нет продуктовых инструкций удалённых пунктов: внешний DB-помощник к + production-БД, Vuetify-стек, инструмент a11y, ребрендинг-палитра, `db/schema.sql`, + motion-runtime. Историческая запись `§9` о прошлой компакции — вне области (факт истории, + не инструкция). +- `§5` — непрерывный список 1..9; внутренние ссылки на номера пунктов согласованы. + +```verified-context-json +[ + {"id":"vc1","kind":"EXTRACTED","ref":"tools/cost-pricing.mjs","anchor":"export const PRICING = Object.freeze("} +] +``` diff --git a/docs/superpowers/specs/2026-06-17-claude-md-deliderra-cleanup-design.md b/docs/superpowers/specs/2026-06-17-claude-md-deliderra-cleanup-design.md new file mode 100644 index 0000000..fbf3cd7 --- /dev/null +++ b/docs/superpowers/specs/2026-06-17-claude-md-deliderra-cleanup-design.md @@ -0,0 +1,71 @@ +# Чистка оперативной карты CLAUDE.md от продуктового контекста + указатель на онбординг-гайд + +## Цель + +Привести `CLAUDE.md` в соответствие с фактом: репозиторий `claude-brain` — дом управляющего +слоя Claude (router / mentor / observer / registry / `tools/`), продукта в нём нет +(`app/` / `db/` / `web/` отсутствуют). Убрать из файла продуктовые инструкции, у которых в +этом репозитории нет объекта, и поднять в начало файла указатель на онбординг-гайд, который +новая сессия должна прочитать первым. + +## Контракт изменений {#ct} + +- В начало файла (над разделом «ГЛАВНОЕ») добавляется однострочный выделенный указатель: + первое чтение для новой сессии — `docs/superpowers/router-mentor-wall-GUIDE.md`. Указатель — + кликабельная markdown-ссылка относительным путём. +- Все прочие сохраняемые разделы (`§0`, `§1`, остаток `§5`, `§9`) сохраняют смысл; правки — + только удаление продуктовых пунктов, перенумерация и починка внутренних ссылок на номера. +- Файл остаётся валидным markdown; нумерованный список `§5` идёт без пропусков (1..N). + +## Что удаляется и что остаётся {#sc} + +Удаляется (продуктовое, объекта в `claude-brain` нет): + +- в шапке — заголовок «техконтекст Лидерры» (заменяется нейтральным «оперативная карта мозга») + и блок-нота про ребрендинг названия/палитры/шрифтов; +- в строке статуса файла — формулировка про «отложенный разбор тела» (разбор выполнен); +- в `§5` — пункт про подключение внешнего DB-помощника к production-БД; пункт про запрет + фронтовых библиотек чужого стека в пользу Vue+Vuetify; пункт про инструмент a11y; пункт про + расширенный UI-пул из координирующего свода; пункт про правку `db/schema.sql`; резервный + пункт про motion-runtime. + +Остаётся (машинерия управляющего слоя, актуальна для brain): + +- `§0` нормативный квинтет; `§1` цепочка приоритета правил; +- в `§5` — запрет ПДн/секретов в коммитах (gitleaks); запрет дублей инструментов; правило + синхронизации этого файла с Pravila/Tooling; запрет закрывать открытые вопросы без команды; + канал правок через плагин `claude-md-management`; обязательность Superpowers-skill; правило + docs-only коммитов; правило `/graphify query` перед codebase-вопросом; правило coverage для + записи памяти; +- `§9` история версий. + +## Крайние случаи {#ec} + +- Внутренние ссылки вида «§5 п.N» в шапке и внутри `§5` после перенумерации обязаны указывать на + актуальные номера (иначе появятся битые перекрёстные ссылки). +- Раздел `§9` пополняется датированной записью о выполненной чистке — без поднятия версий + нормативного квинтета (синхронизация версий Pravila/Tooling — отдельная задача владельца). +- Удаление продуктовых пунктов не должно задеть соседние сохраняемые пункты: правки `§5` + выполняются одним аккуратным контурным фрагментом. + +## Конвенция и нумерация {#cv} + +- `§5` перенумеровывается сквозной нумерацией 1..9 в порядке следования сохранённых пунктов. +- Внутренние перекрёстные ссылки на номера пунктов `§5` приводятся к новой нумерации + (правило-синхронизации, канал-правок, отсылки «flow п.N», «пп.N»). +- Терминология сохраняемых пунктов — «владелец» (вместо устаревшего «заказчик»), без иной + переформулировки смысла. + +## Критерий приёмки {#cr} + +- В начале файла присутствует строка-указатель на `router-mentor-wall-GUIDE.md`. +- В файле больше нет упоминаний продуктовых сущностей удалённых пунктов (внешний DB-помощник, + Vuetify-стек, инструмент a11y, ребрендинг-палитра, `db/schema.sql`, motion-runtime). +- `§5` — непрерывный список 1..9; внутренние ссылки на номера пунктов согласованы. +- В `§9` есть датированная запись о чистке. + +```verified-context-json +[ + {"id":"vc1","kind":"EXTRACTED","ref":"tools/cost-pricing.mjs","anchor":"export const PRICING = Object.freeze("} +] +``` diff --git a/docs/superpowers/specs/2026-06-17-tools-app-path-split-legacy-fix-design.md b/docs/superpowers/specs/2026-06-17-tools-app-path-split-legacy-fix-design.md new file mode 100644 index 0000000..c55dd0f --- /dev/null +++ b/docs/superpowers/specs/2026-06-17-tools-app-path-split-legacy-fix-design.md @@ -0,0 +1,71 @@ +# Фикс наследия сплита: хардкод `app/` в инструментах прогона тестов + +## Цель {#goal} + +После разделения управляющего слоя из проекта Лидерра часть инструментов прогона тестов +осталась с жёстко прописанным путём `app/` — это подпапка layout'а Лидерры. В этом +репозитории папки `app/` нет: конфиг сюиты лежит в корне (`vitest.config.tools.mjs`). +Из-за хардкода прогон одного тест-файла через `tools/run-test-json.mjs` не находит конфиг, +возвращает `loadError`, и по-критерийный зелёный (`produce-criterion-greens`) выходит +никогда не зелёным. Цель — выбирать корень и конфиг сюиты ОТ КОРНЯ репозитория (как уже +делает `tools/produce-verify-receipt.mjs`), единым источником истины, и эмпирически +проверить, подписывает ли производитель verify-расписки расписку при дочернем прогоне сюиты +в этом окружении. + +## Контракт buildVitestJsonArgs {#ct1} + +Новая чистая экспортируемая функция в `tools/run-test-json.mjs`: +`buildVitestJsonArgs(testFile, gitCwd, exists)` → массив аргументов для `npx`: +`['vitest', 'run', testFile, '--root', , '--config', , '--reporter', 'json']`, +где `` и `` берутся из `resolveVitestConfig(gitCwd, exists)`. Параметр `exists` +инъектируется (для теста), по умолчанию — `existsSync`. Функция чистая: никакого исполнения, +никакого fs кроме инъектируемого предиката. + +## Алгоритм {#al1} + +1. `resolveVitestConfig` импортируется из `tools/produce-verify-receipt.mjs` — единый источник + выбора: есть `app/vitest.config.tools.mjs` → app-режим (`root=/app`); иначе корень + репозитория (`root=`, `config=/vitest.config.tools.mjs`). +2. `buildVitestJsonArgs` строит массив аргументов на основе результата (1). +3. I/O-функция `runVitestJson` вызывает `buildVitestJsonArgs(testFile, gitCwd)` и передаёт + результат в `execFileSync('npx', args, …)` вместо захардкоженного `app/`. Разбор stdout + (`parseVitestJson`) — без изменений. + +## Крайние случаи {#ec1} + +- Есть `app/vitest.config.tools.mjs` (layout Лидерры) → `root=/app`, config из `app` — + обратная совместимость сохранена. +- Нет `app/`-конфига (этот репозиторий) → `root=`, config из корня. +- `exists` инъектируем — выбор детерминирован и тестируем без файловой системы. + +## Конвенция заголовка {#cn1} + +Шапка-комментарий модуля `run-test-json` сохраняет существующий стиль (назначение, анти-вакуум +SE-LB-1/11). Новая функция документируется одной строкой назначения над сигнатурой. + +## Диагностика производителя расписки {#dg1} + +Эмпирически проверить под текущим окружением: запуск `node tools/produce-verify-receipt.mjs` +печатает `signed GREEN` (дочерний прогон сюиты отработал — выбор пути достаточен) либо +`NOT signed: suite-not-passed` (дочерний прогон не отработал — выбор пути верен, но нужна +отдельная стратегия прогона). Наблюдаемый исход фиксирует, достаточно ли одного выбора пути. + +## Граница задачи {#bd1} + +В границах: миграция выбора конфига в `run-test-json` на `resolveVitestConfig` (через TDD) и +наблюдение исхода производителя расписки. ВНЕ границ: если дочерний прогон не отрабатывает — +сама стратегия прогона (чтение готового результата вместо своего прогона / неколлапсирующая +конфигурация пула воркеров) — отдельная задача; здесь не реализуется. + +## Критерий приёмки {#cr1} + +- В построении аргументов прогона в `tools/run-test-json.mjs` нет литерала `'app'`. +- `buildVitestJsonArgs` покрыт тестами: app-режим и корневой режим (через инъекцию `exists`). +- Полная сюита (`vitest.config.tools.mjs`) зелёная. + +```verified-context-json +[ + {"id":"ax1","kind":"EXTRACTED","ref":"tools/run-test-json.mjs","anchor":"export function runVitestJson"}, + {"id":"ax2","kind":"EXTRACTED","ref":"tools/produce-verify-receipt.mjs","anchor":"export function resolveVitestConfig"} +] +```