19 KiB
Журнал багов и квирков
Файл для фиксации обнаруженных проблем, которые требуют разбирательства или решения позже.
Заводится командой заказчика «запиши в баг» + краткое описание. Claude добавляет запись с текущей датой в конец списка. Если описание не передано — Claude задаёт уточняющие вопросы (где, симптом, как воспроизвести).
Формат записи:
## YYYY-MM-DD HH:MM — Краткий заголовок
**Где:** компонент / файл / сценарий
**Симптом:** что пользователь видит / что не работает
**Детали:** что точно происходит, репро, цитаты ошибок
**Статус:** открыт / расследуется / в работе / закрыт
**Решение:** (когда найдём)
**Связано:** (ссылки на спеки/планы/записи, если есть)
Не дублирует:
docs/Открытые_вопросы_v8_3.md— там бизнес/продуктовые вопросы (Биз-*,CTO-*,Ю-*,Диз-*)docs/superpowers/specs/— там design specsdocs/superpowers/plans/— там implementation plans
Здесь — техника, баги и квирки, которые надо помнить, но они не блокируют работу прямо сейчас.
2026-05-30 — Невозможно записать в memory из проектной сессии при активной защите v4
Где: связка хуков tools/enforce-memory-coverage.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 строки 100-115) - Skill body от любого plugin-skill тоже приходит как user-message с text → становится «последним user prompt'ом» → перебивает override-фразу заказчика, отправленную ранее
- Хук 2 (
enforce-normative-content-rules) требует Skillclaude-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, либо ослабить хуки.
Воспроизведение:
- Открыть проектную сессию Claude в репо Лидерры
- Активировать любой Skill (например,
claude-md-management:revise-claude-md) - Попытаться
Writeфайла вmemory/*.md - Хук 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 — спеки защиты 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 (matcher Bash) + 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 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 (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 сам).