docs(reading-discipline): companion v2 — глубина внутреннего заземления охотника (проектная запись)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
# Дизайн (companion) v2: глубина «внутреннего заземления» охотника — graph-first + навык-читалка + провенанс
|
||||
|
||||
**Дата:** 2026-06-21
|
||||
**Статус:** companion-заметка к [surfacing-open-questions v5](2026-06-21-surfacing-open-questions-design-v5.md) (КАНОН другой сессии) — **на согласование, не форк**
|
||||
**Тип:** углубление одной клетки движка охотника; правок стены НЕ добавляет
|
||||
**Замена:** отменяет v1 (`2026-06-21-hunter-internal-grounding-depth-design.md`) — удалить при коммите-уборке.
|
||||
**Новое в v2 vs v1:** закрыто замечание судьи — *«провенанс-метка не гарантирует чтение узла целиком, только факт обращения; имитация глубины возможна»* (новый §3.1 + §3.2).
|
||||
**Происхождение:** brainstorming-сессия с владельцем 2026-06-19…21 (кодовая фраза «роутер-наставник»). Началось как «переделать стену под чтение» → скорректировано: исполнение уже задавлено, дыра — в зоне написания ТЗ; охотник уже покрывает мышление + сбор(внутр/внеш). Эта заметка — недостающая ГЛУБИНА внутреннего сбора.
|
||||
|
||||
---
|
||||
|
||||
## 1. Куда это встаёт (одна клетка, не новая машина)
|
||||
|
||||
В §4.0 охотника таблица заземления. Строка **«внутренний факт → читает сам (Read/Grep) → метка `внутр:файл:строка`»** говорит ЧТО заземлять и КАК пометить, но **не говорит КАК читать**. Сюда и ложится эта заметка. Так же — в §4.5 («глубина заземления пропорционально тяжести»).
|
||||
|
||||
Мы НЕ строим вторую церемонию вокруг чтения и НЕ гейтим чтение стеной. Более лёгкий рычаг охотника — провенанс каждого факта — остаётся. Мы поднимаем **качество и доказуемость** заземления.
|
||||
|
||||
## 2. Проблема
|
||||
|
||||
Провенанс-метка доказывает, что агент **смотрел** на `файл:строка` — но не что он **понял узел**. Можно процитировать фрагмент, прочитанный криво, или сослаться на строку, которую грепнул не читая узла. «Случайное чтение как попало»: грепнул слово → кусок → догадка по фрагменту как факт → план не туда → перепечатка на реализации.
|
||||
|
||||
## 3. Решение: три шага заземления внутреннего факта
|
||||
|
||||
1. **Граф-первым (навигация, не содержимое).** `/graphify query "<вопрос>"` → какие узлы/файлы относятся к делу. Находит ВСЕ каналы, а не один по грепу.
|
||||
2. **Узел целиком через навык-читалку (содержимое).** Для кода — [audit-context-building](../../../) (ultra-granular line-by-line, «контракт раньше внутренностей»). Читаем УЗЕЛ целиком, не фрагмент.
|
||||
3. **Метка-провенанс** (как §4.0): `внутр:файл:строка`.
|
||||
|
||||
**Уровень дисциплины — по типу контента:** код → граф обязателен (смысл в графе ссылок); спека/конфиг/закон → целиком-внимательно; проза → свободно. Опора — `READING_CONTENT_TYPES` в [reading-discipline.mjs](../../../tools/reading-discipline.mjs#L14).
|
||||
**Глубина — пропорционально тяжести (§4.5):** 🔴 блокер — граф+узел-целиком ДО закрытия; 🟡 важное — если дёшево, иначе `допущение`; 🟢 мелочь — ярлык.
|
||||
|
||||
### 3.1 Замечание судьи: провенанс = доступ, не понимание (закрытие)
|
||||
|
||||
**Голая метка `внутр:файл:строка` доказывает только ФАКТ ОБРАЩЕНИЯ — глубину можно сымитировать** (грепнул, процитировал, узла не читал). Метка-доступа **необходима, но недостаточна**. Закрываем двумя слоями, оба уже есть в арсенале охотника:
|
||||
|
||||
- **(а) Провенанс уровня ПОНИМАНИЯ, не доступа.** Факт обязан нести **контракт/инвариант узла**, выводимый ТОЛЬКО из чтения целиком, а не номер строки. Плохо: `внутр:floor-decide.mjs:35` (доступ). Хорошо: `floor режет ЗАПИСЬ в .env, чтение режет ОТДЕЛЬНЫЙ read-path-deny, escape его не читает — внутр:floor-decide.mjs:133-181 + read-path-deny.mjs`. Заявленный контракт — артефакт **понимания**; номер строки — артефакт **доступа**.
|
||||
- **(б) Состязательная сверка скептиком (§4.2 охотника).** Свежий read-only субагент `Explore`, не видевший разговора, **независимо переводит те же узлы** и возвращает контракт текстом. **Расхождение** между заземлением агента и выводом скептика = сигнал имитации/поверхностности → на стол владельцу. Дёшево сфальсифицировать глубину нельзя, когда независимый читатель её аудитит.
|
||||
|
||||
### 3.2 Остаточный риск (честно)
|
||||
|
||||
Ни (а), ни (б) не **доказывают** понимание математически — LLM способен сочинить правдоподобный контракт, а скептик ошибиться. Это **поднимает цену фальсификации** (надо соврать связно И совпасть с независимым читателем), а не делает её невозможной. Это defense-in-depth, не доказательство — в духе «честного максимума» стены (memory `subagent-falsified-test-results`: контроллер обязан проверять сам). Финальный само-проход охотника (§4.0: делим на `проверено/воля/допущение/выдумка`) — последний фильтр: факт без контракта-понимания падает в `допущение`, не в `проверено`.
|
||||
|
||||
## 4. Worked example (сжатый)
|
||||
|
||||
Задача: «`.env` нельзя прочитать вообще, даже с escape».
|
||||
- **Случайно:** `grep .env` → кусок floor-decide → «SECRET_PATH_RE значит .env режется» (догадка) → патч floor → чтение всё равно проходит → перепечатка.
|
||||
- **Глубоко:** `/graphify query` → floor-decide + read-path-deny + escape-grant; `audit-context-building` читает узлы целиком → контракт: floor = ЗАПИСЬ, чтение = read-path-deny, escape его не читает. Метка несёт контракт (§3.1а). Скептик независимо подтверждает/опровергает (§3.1б). Вопрос «патч не туда» всплывает на заземлении, в разговоре — не перепечаткой.
|
||||
|
||||
## 5. Существующая опора (не с нуля)
|
||||
|
||||
- [reading-discipline.mjs](../../../tools/reading-discipline.mjs) — `classifyReadingContent` (типы), `classifyReadKind`, роутер выбирает читалку/воздерживается. Гейт ДР-1 **выключен** ([:114](../../../tools/reading-discipline.mjs#L114)) — в БЛОК-виде не нужен; берём классификацию + выбор читалки.
|
||||
- [audit-context-building](../../../) — готовая «правильная читалка кода».
|
||||
- скептик-субагент `Explore` — уже в §4.2 охотника; здесь дополнительно несёт роль анти-имитации (§3.1б).
|
||||
- graphify — навигационный вход.
|
||||
|
||||
## 6. Зависимость, несущая всю идею (риск)
|
||||
|
||||
**Жизнеспособность = монотонная функция качества и свежести графа.** Сейчас граф **не парсит код стены**: `.mjs` нет в код-детекте graphify; узлы `tools/*.mjs` в `graph.json` — лишь текст из упоминаний в docs, не AST. Чинить ПЕРВЫМ: научить graphify видеть `.mjs` → полный AST-граф `tools/` → авто-обновление (post-commit hook graphify, AST бесплатен).
|
||||
|
||||
## 7. Что НЕ меняем (границы / YAGNI)
|
||||
|
||||
- Провенанс-дисциплина охотника — лёгкий рычаг, остаётся; добавляем качество+доказуемость, не гейт.
|
||||
- Гейт ДР-1 в БЛОК-виде не реактивируем; чтение под опечатанным планом свободно (решение владельца 2026-06-18).
|
||||
- Никакой «печати плана чтения под наставника» — тяжелее, чем нужно.
|
||||
- «Блокировать все навыки кроме мышления» — снято (уликами не подтвердилось).
|
||||
|
||||
## 8. Координация (§15 — обязательно)
|
||||
|
||||
Companion, не самостоятельный канон. Перед реализацией — согласовать с сессией охотника, влить в §4.0/§4.5 их spec, не форк. Метки держать байт-совместимыми (`внутр:файл:строка`).
|
||||
|
||||
## 9. Открытая развилка (не закрыта)
|
||||
|
||||
(а) **нога ВНУТРИ охотника** (узко, при проработке ТЗ) или (б) **самостоятельная reading-discipline для всех фаз сбора контекста** (охотник — потребитель)? Владелец не выбрал. По умолчанию — (а), минимально-инвазивное.
|
||||
Reference in New Issue
Block a user