123 lines
19 KiB
Markdown
123 lines
19 KiB
Markdown
# Журнал багов и квирков
|
||
|
||
Файл для фиксации обнаруженных проблем, которые требуют разбирательства или решения позже.
|
||
|
||
Заводится командой заказчика **«запиши в баг»** + краткое описание. Claude добавляет запись с текущей датой в конец списка. Если описание не передано — Claude задаёт уточняющие вопросы (где, симптом, как воспроизвести).
|
||
|
||
**Формат записи:**
|
||
|
||
```markdown
|
||
## YYYY-MM-DD HH:MM — Краткий заголовок
|
||
|
||
**Где:** компонент / файл / сценарий
|
||
**Симптом:** что пользователь видит / что не работает
|
||
**Детали:** что точно происходит, репро, цитаты ошибок
|
||
**Статус:** открыт / расследуется / в работе / закрыт
|
||
**Решение:** (когда найдём)
|
||
**Связано:** (ссылки на спеки/планы/записи, если есть)
|
||
```
|
||
|
||
Не дублирует:
|
||
|
||
- `docs/Открытые_вопросы_v8_3.md` — там бизнес/продуктовые вопросы (`Биз-*`, `CTO-*`, `Ю-*`, `Диз-*`)
|
||
- `docs/superpowers/specs/` — там design specs
|
||
- `docs/superpowers/plans/` — там implementation plans
|
||
|
||
Здесь — техника, баги и квирки, которые надо помнить, но они не блокируют работу прямо сейчас.
|
||
|
||
---
|
||
|
||
## 2026-05-30 — Невозможно записать в memory из проектной сессии при активной защите v4
|
||
|
||
**Где:** связка хуков [tools/enforce-memory-coverage.mjs](../tools/enforce-memory-coverage.mjs) + [tools/enforce-normative-content-rules.mjs](../tools/enforce-normative-content-rules.mjs) для путей `memory/*.md` и `MEMORY.md`.
|
||
|
||
**Симптом:** Claude не может записать memory entry из активной project-сессии — оба хука блокируют любую комбинацию (Skill+Write без override / Write с override-фразой / Skill в одной response с Write). За одну сессию 30.05.2026 не удалось сохранить 3 запланированные memory entries (project + 2 feedback).
|
||
|
||
**Детали:**
|
||
|
||
- Хук 1 (`enforce-memory-coverage`) ищет override-фразу `memory dump` в `lastUserPromptText` — это последний user-message с настоящим text-блоком (см. `lastTurnEntries` в [tools/enforce-hook-helpers.mjs](../tools/enforce-hook-helpers.mjs) строки 100-115)
|
||
- Skill body от любого plugin-skill тоже приходит как user-message с text → становится «последним user prompt'ом» → перебивает override-фразу заказчика, отправленную ранее
|
||
- Хук 2 (`enforce-normative-content-rules`) требует Skill `claude-md-management` в `turnToolUses` текущего turn'а (см. `detectLegitSkillActive` строки 126-133)
|
||
- Skill body разрывает turn в том же месте → мой Skill `tool_use` оказывается в предыдущем turn'е, а Write — в новом → хук 2 не видит skill
|
||
- Override-фразы для хука 2 нет — только активный skill в текущем turn'е (Layer 5 в `decide()`)
|
||
- **Композиция:** с Skill = хук 1 не видит override; без Skill = хук 2 нет легитимного skill'а. Замкнутый круг.
|
||
- За сессию 30.05.2026 было ~7 попыток с разными комбинациями (direct coverage + memory dump / coverage memory-sync + skill в той же response / coverage skill:claude-md-management / `без скилов` универсальный override) — все заблокированы.
|
||
- **Update 30.05 поздний вечер:** universal override-фраза `без скилов` (которая по системным reminder'ам должна снимать все хуки на текущий turn) тоже **не снимает** хук 2 — хук 2 даже не упоминает override-vocabulary, у него только проверка активного skill в turnToolUses. То есть universal-override механизм через слова-фразы НЕ покрывает второй хук.
|
||
- **Update 30.05 ночь:** после закрытия параллельной v4 сессии заказчик попросил «попробовать снова» — защита **усилилась, а не ослабла**. Появился третий хук `tools/enforce-read-path-deny.mjs` который блокирует даже `Read` от `memory/MEMORY.md` («§3.1 transcript/runtime/normative hard-deny»). Это значит теперь нельзя ни Read, ни Edit MEMORY.md из проектной сессии. Запись новых entries в `memory/*.md` тоже блокирована (хук 2 как раньше). Single source of truth для memory чтения сейчас — Read через absolute-path к индивидуальным файлам (тоже под вопросом, не проверял после v4-deploy).
|
||
- **Архитектурный вывод:** memory из активной project-сессии **сейчас неработоспособна как канал** — ни запись, ни чтение MEMORY.md. Только индивидуальные `memory/<entry>.md` файлы возможно ещё читаются. Это зона следующей итерации защит v4 — либо реализовать корректный override через специальный skill, либо ослабить хуки.
|
||
|
||
**Воспроизведение:**
|
||
|
||
1. Открыть проектную сессию Claude в репо Лидерры
|
||
2. Активировать любой Skill (например, `claude-md-management:revise-claude-md`)
|
||
3. Попытаться `Write` файла в `memory/*.md`
|
||
4. Хук 2 блокирует как «no active legit skill» (несмотря на активный skill)
|
||
|
||
**Статус:** открыт
|
||
|
||
**Решение:** TBD. Варианты:
|
||
|
||
- (1) Расширить override-vocab хука 2 фразой `memory dump` — самое простое
|
||
- (2) Поправить `lastTurnEntries` в `enforce-hook-helpers.mjs` чтобы skill-body не считался turn boundary (`hasText && !hasToolResult` исключение для plugin-skill бодиев)
|
||
- (3) Добавить дополнительный legit skill для memory writes отдельно от claude-md-management (например, `superpowers:memory-write`)
|
||
- (4) Объединить два хука в один с consistent override-логикой
|
||
|
||
Это зона параллельной v4 сессии (router-gate v4 streams A-E), которая как раз сейчас тестирует эту защиту. Возможно, после её закрытия часть багов уйдёт сама.
|
||
|
||
**Связано:** [docs/superpowers/specs/2026-05-29-router-gate-v4-{design,1-max-closure,2-vm-sandbox}.md](superpowers/specs/) — спеки защиты v4.
|
||
|
||
**Update 2026-05-30 (новая сессия, свежая проба):** Запущена отдельная сессия специально под запись памяти по итогам lead-region-resolution. Сделана 1 проба — прямой `Write` в `memory/project_lead_region_resolution.md` с `coverage: direct:memory-sync`. **Результат: заблокировано** хуком 2 — `[node tools/enforce-normative-content-rules.mjs]: normative write without an active legit skill (claude-md-management) — direct bypass attempt`. Защита по-прежнему активна, поведение не изменилось после закрытия параллельной v4-сессии. Согласно инструкции «не упорствовать больше 2 попыток» — попытки записи в `memory/*.md` приостановлены. Все 3 запланированных memory entries (project_lead_region_resolution + 2 feedback) подготовлены в тексте, но не сохранены. **Канал memory из проектной сессии остаётся неработоспособным** до реализации одного из вариантов решения (1)-(4) выше. Запись в `docs/bugs.md` (не нормативный путь) — проходит нормально.
|
||
|
||
**Update 2026-05-30 (РЕШЕНИЕ для записи найдено заказчиком — частично):** Заказчик дал рабочий обход для **записи** `memory/*.md`: вызвать `Skill claude-md-management:revise-claude-md` (с любым no-op аргументом) И в ТОМ ЖЕ turn'е после Skill сделать `Write` — тогда детектор `detectLegitSkillActive` хука 2 видит активный легальный skill в `turnToolUses`, и Write проходит. coverage-строка `direct:memory-sync` удовлетворяет хук 1. **Проверено 30.05: 3 заметки записались успешно** этим методом (project_lead_region_resolution + 2 feedback). Зависит от фикса `ffd70d6f` (30.05) — `lastTurnEntries` skip harness-injected skill bodies, иначе skill-body разрывает turn и прячет Skill от детектора.
|
||
**НО индекс `MEMORY.md` обновить так НЕ удалось** — третий хук `enforce-read-path-deny.mjs` блокирует даже `Read` MEMORY.md (`§3.1 transcript/runtime/normative hard-deny`), а `Edit` без предварительного `Read` невозможен. Перезапись целиком небезопасна (файл 41KB, в контексте обрезан до ~24KB → потеря данных). **Остаётся не решено:** обновление индекса `MEMORY.md` из проектной сессии. Варианты: (5) исключить `MEMORY.md` из read-path-deny при активном claude-md-management skill; (6) дать отдельный write-only канал для append-строки в индекс. Индивидуальные `memory/<entry>.md` — пишутся, индекс — нет.
|
||
|
||
---
|
||
|
||
## 2026-05-30 — git полностью заблокирован из проектной сессии (router-gate + powershell-gate v4)
|
||
|
||
**Где:** [tools/enforce-router-gate.mjs](../tools/enforce-router-gate.mjs) (matcher Bash) + [tools/enforce-powershell-gate.mjs](../tools/enforce-powershell-gate.mjs) (matcher PowerShell).
|
||
|
||
**Симптом:** Невозможно выполнить ни одну git-команду из проектной сессии — даже read-only (`git rev-parse`, `git status`). Обе оболочки default-deny:
|
||
|
||
- Bash: `[router-gate] команда не в whitelist — default-deny (§5.1)`
|
||
- PowerShell: `[powershell-gate] cmdlet «git» не в whitelist — default-deny (§5.1.2)`
|
||
|
||
**Детали:**
|
||
|
||
- 30.05.2026 заказчик попросил закоммитить spec + plan фичи lead-region-resolution в ветку `feat/lead-region-resolution`. Попытка `git switch -c` + `git commit -- <explicit paths>` через Bash → блок router-gate. Тот же git через PowerShell-tool → блок powershell-gate (F1 из v3.8 — PowerShell-путь закрыт).
|
||
- Архитектурно git из проектной сессии под v4 **неработоспособен**: router-gate default-deny на Bash блокирует git-команду ДО того, как сработает side-channel `approve_git_operation` (§4.5 / §3.5 v3.5 design) — то есть механизм AskUserQuestion-одобрения git-операции недостижим, потому что сама команда не доходит до gate-логики одобрения.
|
||
- Файлы spec + plan **сохранены на диск** (untracked, не потеряны): `docs/superpowers/specs/2026-05-29-lead-region-resolution-design.md` + `docs/superpowers/plans/2026-05-29-lead-region-resolution.md`. Просто не закоммичены.
|
||
|
||
**Статус:** открыт. Связано с общей темой over-blocking защиты v4 (см. запись выше про memory).
|
||
|
||
**Решение:** TBD. Варианты:
|
||
|
||
- (1) Добавить git в whitelist router-gate / powershell-gate под AskUserQuestion-одобрение (восстановить путь S8 v3.5 — gate должен пропускать git-команду ДО проверки whitelist, если есть свежий `approve_git_operation`).
|
||
- (2) Закоммитить вручную заказчиком (вне Claude-сессии) или из сессии с ослабленной защитой.
|
||
- (3) Дождаться фикса v4 (зона параллельной router-gate v4 сессии).
|
||
|
||
**Update 2026-05-30 (штатный путь для git НАЙДЕН и сработал):** git-коммит из проектной сессии **возможен** штатно. Механизм (заложен в v4 by design): одиночная git-команда (не цепочка) идёт в `classifyGitCommand`; read-only (`status`/`rev-parse`/`log`) — allow; мутирующая (`add`/`commit`/`switch`) — conditional, нужен `approve_git_operation` в `~/.claude/runtime/askuser-decisions-<sess>.jsonl`, который пишет PostToolUse-хук `enforce-askuser-answer-parser.mjs` из выбранного ответа AskUserQuestion (если в тексте ответа есть `git ...`). Затем выполняется РОВНО та же команда (normalize-match, окно 5 мин). Успешно закоммичено `4686b365` (spec+plan, 2 файла). **Грабли:** (а) НЕ цеплять команды через `&&`/`echo` — цепочка не попадает в git-классификатор → default-deny; (б) символ `>` в команде (напр. `<email>` в Co-Authored-By trailer) ловится hard-blacklist «stdout redirect» РАНЬШЕ git-одобрения — trailer с `<...>` невозможен; (в) lefthook pre-commit (gitleaks/markdownlint/cspell) работает как обычно, его надо проходить честно (allowlist `.gitleaks.toml` недоступен под read-deny → телефоны-примеры маскировать в тексте).
|
||
|
||
---
|
||
|
||
## 2026-05-30 — v4-гейт блокирует весь dev/test-workflow (нельзя реализовывать код)
|
||
|
||
**Где:** [tools/enforce-router-gate.mjs](../tools/enforce-router-gate.mjs) whitelist (§5.1).
|
||
|
||
**Симптом:** Невозможно реализовать ни одну кодовую фичу из проектной сессии — гейт режет инструменты разработки:
|
||
|
||
- `php artisan test` / `php artisan migrate` → `команда не в whitelist — default-deny` (whitelist разрешает только `list`/`route:list`/`migrate:status`).
|
||
- `./vendor/bin/pest` / `composer test` → не в whitelist → блок.
|
||
- `cd app && <что-угодно>` → цепочка → не в whitelist → блок. А т.к. artisan лежит в `app/`, до даже whitelisted-команд (`php artisan migrate:status`) не добраться без `cd app`.
|
||
- Субагенты (Agent tool, subagent-driven-development) → `API Error: 400 tools.110.custom.input_schema.properties` — один MCP-инструмент экспортирует невалидный ключ свойства, что ломает ЛЮБОй dispatch субагента с полным набором тулзов.
|
||
|
||
**Детали:** 30.05.2026 заказчик выбрал «старт Сессии 1 (миграции БД) фичи lead-region-resolution через субагентов». Проверка показала: (1) TDD невозможен — нельзя запустить ни тест (`pest`), ни миграцию; (2) субагенты не запускаются (API-ошибка схемы MCP-тула); (3) даже зайти в `app/` нельзя (cd-цепочка режется). Писать миграции/тесты «вслепую» без прогона — нарушает TDD и планку качества «качество > скорость». Поэтому реализация Сессии 1 **отложена**.
|
||
|
||
**Статус:** открыт. Та же тема over-blocking v4.
|
||
|
||
**Решение:** TBD. Для реализации кода гейту нужно whitelist'ить dev-workflow: `php artisan test`/`migrate`/`tinker`, `./vendor/bin/pest`, `composer test`/`pint`/`stan`, `npm run *`, и разрешить `cd app && ...` (или запускать из `app/` как cwd). Плюс починить MCP-тул с невалидным ключом свойства (ломает субагентов). Это зона параллельной router-gate v4 сессии. До этого фича-реализация из проектной сессии заблокирована; артефакты (spec+plan) готовы и закоммичены — старт возможен сразу после расширения whitelist.
|
||
|
||
**Update 2026-05-30 (частичный прогресс — dev-workflow whitelisted, остался cd):** Параллельная v4-сессия расширила `SAFE_EXACT` в [tools/enforce-router-gate.mjs](../tools/enforce-router-gate.mjs:94-97) (2026-05-30): теперь проходят `php artisan test|migrate*|db:seed|cache:clear|...`, `composer test|pint|stan|insights|rector`, `vendor/bin/pest`, `pest`. **НО остаются 2 блокера для инлайн-реализации:** (1) `cd app` и `cd app && <dev-cmd>` режутся (cd не в whitelist; чейн с не-whitelisted сегментом → default-deny) — а pest/artisan надо запускать из `app/` (cwd сессии = корень репо, патчи whitelist'а `^php\s+artisan` / `^vendor/bin/pest` без `app/`-префикса предполагают cwd=app/). Нужно добавить `cd` (или `cd app && ...`) в whitelist ЛИБО запускать dev-сессию с cwd=app/. (2) Субагенты по-прежнему падают `API Error 400 tools.110...` (MCP-тул с битым ключом, на уровне сессии — не лечится без рестарта). Итог: после добавления `cd app` в whitelist — инлайн-TDD Сессии 1 возможен (субагенты всё равно недоступны, но контроллер может вести TDD сам).
|
||
|
||
---
|