docs(mentor): процедура escape владельца (FLOOR-ESCAPE токен) в гайд стены

Зафиксирована процедура разового подписанного пропуска floor_escape: владелец пишет метку FLOOR-ESCAPE: <action> в ответе AskUser, среда подписывает ключом, окно 5 мин, одноразовый. Формат canonicalAction (bash/powershell/skill/write/mcp). Найдено по запросу владельца «расскажи и отметь в инструкции» (сессия 14.06).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-06-14 07:04:26 +03:00
parent f3ac36bef1
commit c00d2b17bb
2 changed files with 65 additions and 53 deletions
+38 -53
View File
@@ -1,6 +1,6 @@
# Brain Status (auto-generated)
Last updated: 2026-06-13T14:15:22.584Z
Last updated: 2026-06-14T03:11:23.658Z
| Контролёр | Состояние | Детали |
|---|---|---|
@@ -8,63 +8,53 @@ Last updated: 2026-06-13T14:15:22.584Z
| C2 Cross-ref consistency | ✅ | [cross-ref-checker] OK — 0 drift in 4 files |
| C3 Observer-of-observer | ✅ | [observer-of-observer] OK — last read 2 week(s) ago |
| C4 Сигнальный статус | ✅ | This file (self-reference) |
| C5 Observer-coverage | ✅ | 1283 episode(s) this month · Stop-hook + post-commit OK |
| C5 Observer-coverage | ✅ | 1327 episode(s) this month · Stop-hook + post-commit OK |
| C6 Chain map sync | ✅ | [chain-map-checker] OK — 16 chains in sync |
## Кто на посту (оборона М1–М6)
⚠️ **ПОСТ ПУСТОЙ** — не зарегистрированы: enforce-judge-gate.mjs (оборона НЕ подтверждена; SE-B/Δ8)
⚠️ **ПОСТ ПУСТОЙ** — не зарегистрированы: enforce-floor.mjs, enforce-supreme-gate.mjs, enforce-judge-gate.mjs, enforce-snapshot.mjs, enforce-floor-escape-consume.mjs, enforce-skill-journaler.mjs, enforce-verify-gate.mjs, enforce-criterion-gate.mjs (оборона НЕ подтверждена; SE-B/Δ8)
Судья М4: **live-block** (inert $0 / shadow / floor-only / live-block)
| Машина / страж | Хук | Зарегистрирован |
|---|---|---|
| М5 Пол (вето-до-плана / content-floor) | `enforce-floor.mjs` | ✅ |
| М2 Стена (действие = шаг плана) | `enforce-supreme-gate.mjs` | ✅ |
| М1/М5 Нормативный страж (КАРТА/ЗАКОН) | `enforce-normative-content-rules.mjs` | ✅ |
| М5 Read-exfil страж | `enforce-read-path-deny.mjs` | ✅ |
| М5 Egress-exfil страж | `enforce-mcp-classification.mjs` | ✅ |
| М6 Снимок (точка отката) | `enforce-snapshot.mjs` | ✅ |
| М6 Escape владельца (законная дверь) | `enforce-floor-escape-consume.mjs` | ✅ |
| М1 Журналер навыков | `enforce-skill-journaler.mjs` | ✅ |
| enforce-verify-gate.mjs | `enforce-verify-gate.mjs` | ✅ |
| enforce-criterion-gate.mjs | `enforce-criterion-gate.mjs` | ✅ |
| enforce-coverage-verify.mjs | `enforce-coverage-verify.mjs` | ✅ |
| enforce-todowrite-skill-verifier.mjs | `enforce-todowrite-skill-verifier.mjs` | ✅ |
| М5 Пол (вето-до-плана / content-floor) | `enforce-floor.mjs` | 🔴 |
| М2 Стена (действие = шаг плана) | `enforce-supreme-gate.mjs` | 🔴 |
| М4 Судья (приёмка + надзор) | `enforce-judge-gate.mjs` | 🔴 |
| М6 Снимок (точка отката) | `enforce-snapshot.mjs` | 🔴 |
| М6 Escape владельца (законная дверь) | `enforce-floor-escape-consume.mjs` | 🔴 |
| М1 Журналер навыков | `enforce-skill-journaler.mjs` | 🔴 |
| enforce-verify-gate.mjs | `enforce-verify-gate.mjs` | 🔴 |
| enforce-criterion-gate.mjs | `enforce-criterion-gate.mjs` | 🔴 |
Недавние escape владельца: 5 · Недавние блоки: 10
**Недавние escape владельца (детали):**
| Время | Действие | Причина |
|---|---|---|
| 2026-06-12T18:15:38.905Z | skill:audit-context-building:audit-context-building | escape владельца |
| 2026-06-12T15:15:18.359Z | bash:git commit -m "feat(mentor): arbitration-card pure builder (wave 2) - 6 tests green" | escape владельца |
| 2026-06-12T15:11:07.439Z | bash:git commit -m "feat(mentor): arbitration-card pure builder (wave 2) - 6 tests green" | escape владельца |
| 2026-06-12T15:07:09.523Z | bash:git commit -m "fix(verify): produce-verify-receipt Windows execFileSync npx to execSync" | escape владельца |
| 2026-06-12T14:59:05.419Z | bash:git commit -m "feat(mentor): mentor NO-GO counter L1 (wave 1) - 3 tests green" | escape владельца |
Недавние escape владельца: 0 · Недавние блоки: 10
**Недавние блоки (детали):**
| Время | Действие | Причина |
|---|---|---|
| 2026-06-13T14:15:10.446Z | powershell:$tempPath = $env:TEMP; Get-ChildItem "$tempPath\claude-economy-56021371-29a2-47f3-818c-c4639acfae95.json" -Er | разговорный режим: только думать/спрашивать (реализация — после печати артефакта и плана) |
| 2026-06-13T14:15:00.651Z | write:c:/users/administrator/.claude/projects/c---------------------crm-------------/56021371-29a2-47f3-818c-c4639acfae9 | path «C:/Users/Administrator/.claude/projects/c---------------------crm-------------/56021371-29a2-47f3-818c-c4639acfae9 |
| 2026-06-13T14:14:59.991Z | bash:cat "$TEMP/claude-economy-56021371-29a2-47f3-818c-c4639acfae95.json" 2>/dev/null \|\| echo "FILE_NOT_FOUND" | разговорный режим: только думать/спрашивать (реализация — после печати артефакта и плана) |
| 2026-06-13T14:14:59.895Z | bash:cat "$TEMP/claude-economy-56021371-29a2-47f3-818c-c4639acfae95.json" 2>/dev/null \|\| echo "FILE_NOT_FOUND" | floor: опасная по содержанию команда без аварийного выхода — блок (правило 8); FLOOR-ESCAPE: bash:cat "$TEMP/claude-econ |
| 2026-06-13T14:09:34.794Z | write:c:/users/administrator/.claude/projects/c---------------------crm-------------/56021371-29a2-47f3-818c-c4639acfae9 | path «C:/Users/Administrator/.claude/projects/c---------------------crm-------------/56021371-29a2-47f3-818c-c4639acfae9 |
| 2026-06-13T14:05:38.743Z | write:c:/users/administrator/.claude/projects/c---------------------crm-------------/56021371-29a2-47f3-818c-c4639acfae9 | path «C:/Users/Administrator/.claude/projects/c---------------------crm-------------/56021371-29a2-47f3-818c-c4639acfae9 |
| 2026-06-13T13:30:15.896Z | write:c:/моя/проекты/портал crm/документация | разговорный режим: только думать/спрашивать (реализация — после печати артефакта и плана) |
| 2026-06-13T13:30:06.021Z | bash:cat "$TEMP/claude-economy-56021371-29a2-47f3-818c-c4639acfae95.json" 2>/dev/null \|\| echo "NOT_FOUND" | разговорный режим: только думать/спрашивать (реализация — после печати артефакта и плана) |
| 2026-06-13T13:30:05.944Z | bash:cat "$TEMP/claude-economy-56021371-29a2-47f3-818c-c4639acfae95.json" 2>/dev/null \|\| echo "NOT_FOUND" | floor: опасная по содержанию команда без аварийного выхода — блок (правило 8); FLOOR-ESCAPE: bash:cat "$TEMP/claude-econ |
| 2026-06-13T13:30:04.996Z | write:c:/users/administrator/.claude/projects/c---------------------crm-------------/56021371-29a2-47f3-818c-c4639acfae9 | path «C:/Users/Administrator/.claude/projects/c---------------------crm-------------/56021371-29a2-47f3-818c-c4639acfae9 |
| 2026-06-14T03:10:30.235Z | write:c:/users/administrator/.claude/projects/c---------------------crm-------------/78967b63-b8e6-4101-92e9-f00d7d49bad | path «C:/Users/Administrator/.claude/projects/c---------------------crm-------------/78967b63-b8e6-4101-92e9-f00d7d49bad |
| 2026-06-14T03:10:23.129Z | write:c:/users/administrator/.claude/projects/c---------------------crm-------------/78967b63-b8e6-4101-92e9-f00d7d49bad | path «C:/Users/Administrator/.claude/projects/c---------------------crm-------------/78967b63-b8e6-4101-92e9-f00d7d49bad |
| 2026-06-14T02:51:22.689Z | write:c:/моя/проекты/портал crm/документация | действие не в плане (ожидался шаг undefined: Bash npx vitest run --root app --config vitest.config.tools.mjs) |
| 2026-06-14T02:51:14.396Z | write:c:/users/administrator/.claude/projects/c---------------------crm-------------/78967b63-b8e6-4101-92e9-f00d7d49bad | авторское сырьё-чтение вне шага плана — гейт ДР-1 (impl-режим) [тип: data] (W2) |
| 2026-06-14T02:51:14.296Z | write:c:/users/administrator/.claude/projects/c---------------------crm-------------/78967b63-b8e6-4101-92e9-f00d7d49bad | path «C:/Users/Administrator/.claude/projects/c---------------------crm-------------/78967b63-b8e6-4101-92e9-f00d7d49bad |
| 2026-06-14T02:51:13.289Z | write:c:/users/administrator/appdata/local/temp/claude-economy-78967b63-b8e6-4101-92e9-f00d7d49bad3.json | авторское сырьё-чтение вне шага плана — гейт ДР-1 (impl-режим) [тип: data] (W2) |
| 2026-06-14T02:51:09.145Z | bash:ls $TEMP/claude-economy-78967b63-b8e6-4101-92e9-f00d7d49bad3.json 2>/dev/null && cat $TEMP/claude-economy-78967b63- | действие не в плане (ожидался шаг undefined: Bash npx vitest run --root app --config vitest.config.tools.mjs) |
| 2026-06-14T02:51:08.997Z | bash:ls $TEMP/claude-economy-78967b63-b8e6-4101-92e9-f00d7d49bad3.json 2>/dev/null && cat $TEMP/claude-economy-78967b63- | floor: опасная по содержанию команда без аварийного выхода — блок (правило 8); FLOOR-ESCAPE: bash:ls $TEMP/claude-econom |
| 2026-06-14T02:45:37.824Z | write:c:/моя/проекты/портал crm/документация/tools/sign-of.mjs | действие не в плане (ожидался шаг undefined: Bash npx vitest run --root app --config vitest.config.tools.mjs) |
| 2026-06-14T02:44:04.007Z | bash:echo X | действие не в плане (ожидался шаг undefined: Bash npx vitest run --root app --config vitest.config.tools.mjs) |
## Метрики (информационные, не алерты)
- Observer evidence: 1283 episodes this month, 0 observer_error markers, 5 PII matches before filter
- Legacy v1 episodes (not in factor analysis): 1283
- Last /brain-retro: 17 day(s) ago
- Observer evidence: 1327 episodes this month, 0 observer_error markers, 5 PII matches before filter
- Legacy v1 episodes (not in factor analysis): 1327
- Last /brain-retro: 18 day(s) ago
- Использование узлов: см. `/brain-retro` (раз в спринт). missed_activations: 0. **Неиспользованные узлы — не алерт, если профильной задачи не было** (Pravila §16.4 v1.36; capability-readiness; см. memory `feedback_brain_unused_tools_not_problem` — outside-repo memory store).
## Метрики дисциплины
@@ -73,15 +63,15 @@ Baseline дисциплины роутера (этап 2 router discipline overh
| Тип задачи | Эпизодов | % с триггер-матчем | % через скил |
|---|---|---|---|
| planning | 183 | 5.5% | 19.1% |
| feature | 43 | 7.0% | 2.3% |
| planning | 192 | 5.2% | 18.8% |
| feature | 47 | 6.4% | 2.1% |
| analysis | 40 | 5.0% | 0.0% |
| bugfix | 36 | 11.1% | 19.4% |
| cleanup | 1 | 0.0% | 0.0% |
Router step distribution: 1: 647, 2: 462, 3: 18, 5: 135
Router step distribution: 1: 664, 2: 483, 3: 18, 5: 141
Boundaries applied (ADR / границы): 8 of 1262 эпизодов (0.6%).
Boundaries applied (ADR / границы): 8 of 1306 эпизодов (0.6%).
## Активные многоэтапные проекты
@@ -93,11 +83,11 @@ Boundaries applied (ADR / границы): 8 of 1262 эпизодов (0.6%).
## Длинные сессии
⚠️ Сегодня (2026-06-13 UTC) есть сессии с ≥50 ходов — корреляция с падением дисциплины роутинга (retro #5 candidate B).
⚠️ Сегодня (2026-06-14 UTC) есть сессии с ≥50 ходов — корреляция с падением дисциплины роутинга (retro #5 candidate B).
| session_id | макс. ход | % regulated | последний эпизод |
|---|---|---|---|
| `4da979ce` | 51 | 0% | 2026-06-13T00:20:12.068Z |
| `ed2cf787` | 52 | 14% | 2026-06-14T01:25:00.849Z |
Long sessions correlate with discipline drift. Если % regulated просел в текущей сессии — рассмотри перезапуск.
@@ -105,10 +95,10 @@ Long sessions correlate with discipline drift. Если % regulated просел
| Компонент | Токены (in/out) | USD |
|---|---|---|
| Classifier (Sonnet 4.6) | 63939/230062 | $3.64 |
| Classifier (Sonnet 4.6) | 63962/230393 | $3.65 |
| Self-assessment (Sonnet 4.6) | 0/0 | $0.00 |
| Reviewer (Opus 4.7 + fallback) | 0/0 | $0.00 |
| **Итого** | | **$3.64** |
| **Итого** | | **$3.65** |
## Аномалии классификатора
@@ -121,7 +111,7 @@ Episodes since last run: 542 / threshold: 10
## Reviewer: субагент vs fallback
0 эпизодов проверено из 1283.
0 эпизодов проверено из 1327.
## Reviewer findings
@@ -143,14 +133,7 @@ Episodes since last run: 542 / threshold: 10
## System Health
Топ-3 процессов с CPU > 1ч:
| PID | Имя | CPU-время | Возраст |
|---|---|---|---|
| 3356 | MsMpEng | 2.35ч | 0.0ч |
| 2728 | msedge | 1.09ч | NaNч |
⚠️ Проверь, не «осиротевшие» ли это процессы от завершённых Claude-сессий.
Долго работающих процессов нет (порог CPU > 1ч).
## Очередь обучения роутера
@@ -158,11 +141,13 @@ Episodes since last run: 542 / threshold: 10
## Покрытие дверей
✅ Все двери покрыты верховной стеной М2 (matcher: *).
⚠️ Есть забытые двери (matcher: (хук НЕ зарегистрирован)).
Непокрытые мутирующие инструменты: Edit, Write, MultiEdit, NotebookEdit, Bash, Task, Skill
## Целостность журналов действий
🔴 Битые цепочки (3 из 11):
🔴 Битые цепочки (3 из 13):
| session | broken at seq |
|---|---|
@@ -65,6 +65,33 @@
- Чтение `~/.claude/runtime` — закрыто. Вердикты/печать владелец видит в внешних логах вызовов;
участнику runtime недоступен — спрашивай владельца.
## Аварийный выход владельца (escape) — как выдать разовое разрешение
Если стена / пол / судья / гейт памяти блокирует действие, которое владелец всё-таки хочет
разрешить (напр. запись в память про саму стену), владелец выдаёт **разовый подписанный
пропуск** (floor_escape, Машина 6 + подпись M6 FIX-5). Процедура:
1. Контроллер задаёт **AskUserQuestion** (или владелец отвечает на текущий вопрос).
2. Владелец **в своём ответе пишет метку** `FLOOR-ESCAPE: <action>`, где `<action>`
каноническая строка действия (`canonicalAction`, [tools/escape-grant.mjs](../../tools/escape-grant.mjs)):
- Bash → `bash:<нормализованная команда>`
- PowerShell → `powershell:<нормализованная команда>`
- Skill → `skill:<имя-навыка в нижнем регистре>`
- Write/Edit/MCP-писатель → `write:<путь, нормализованный pathNormalizeSafe — lowercase + прямые слэши>`
- MCP-инструмент → `mcp:<имя>:<args-json>`
3. Среда (`enforce-askuser-answer-parser`, PostToolUse) видит **реальный** ответ владельца →
пишет пропуск в `~/.claude/runtime/askuser-decisions-<сессия>.jsonl` и **подписывает ключом
владельца** (`router-mentor-receipts`). Контроллер подделать не может (нет ключа; канал protected).
4. Пропуск **одноразовый**, окно **5 минут**. Потребитель при точном совпадении `canonicalAction`
пропускает ровно это действие (указатель не двигает).
**Пример** (разрешить запись файла памяти):
`FLOOR-ESCAPE: write:c:/users/administrator/.claude/projects/<проект>/memory/<файл>.md`
**Важно:** метка должна нести ТОЧНУЮ каноническую строку (путь в нижнем регистре, прямые слэши) —
иначе пропуск не совпадёт. Для широких задач проще временный maintenance (`"hooks": {}` + перезапуск).
Escape чтут стена М2 / пол М5 / судья М4 / гейт памяти; `router-gate` (USER-level git) — отдельно.
## Что под капотом (чтобы не лезть в код)
- Стена = `enforce-supreme-gate` (PreToolUse на все инструменты); оркестратор =