docs: черновики deliderra-cleanup и app-path-split-legacy-fix спеки и планы plus bag wall-read-block
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -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 — нужен предохранитель (эскалация к владельцу).
|
||||
@@ -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("}
|
||||
]
|
||||
```
|
||||
@@ -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("}
|
||||
]
|
||||
```
|
||||
@@ -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("}
|
||||
]
|
||||
```
|
||||
@@ -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("}
|
||||
]
|
||||
```
|
||||
@@ -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"}
|
||||
]
|
||||
```
|
||||
@@ -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("}
|
||||
]
|
||||
```
|
||||
@@ -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("}
|
||||
]
|
||||
```
|
||||
@@ -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("}
|
||||
]
|
||||
```
|
||||
@@ -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', <root>, '--config', <config>, '--reporter', 'json']`,
|
||||
где `<root>` и `<config>` берутся из `resolveVitestConfig(gitCwd, exists)`. Параметр `exists`
|
||||
инъектируется (для теста), по умолчанию — `existsSync`. Функция чистая: никакого исполнения,
|
||||
никакого fs кроме инъектируемого предиката.
|
||||
|
||||
## Алгоритм {#al1}
|
||||
|
||||
1. `resolveVitestConfig` импортируется из `tools/produce-verify-receipt.mjs` — единый источник
|
||||
выбора: есть `app/vitest.config.tools.mjs` → app-режим (`root=<repo>/app`); иначе корень
|
||||
репозитория (`root=<repo>`, `config=<repo>/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=<repo>/app`, config из `app` —
|
||||
обратная совместимость сохранена.
|
||||
- Нет `app/`-конфига (этот репозиторий) → `root=<repo>`, 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"}
|
||||
]
|
||||
```
|
||||
Reference in New Issue
Block a user