Проба планки — ловит ли свод по планке дефект в коде. В копию проекта сажается известное нарушение известного критерия, свод в ней делает сессия, не видевшая посаженного, а вердикт выносит машина: назвал ли свод посаженный критерий по посаженному адресу. Меряет суждение о коде, а не процесс обвязки — процесс меряет probe. Звать после правки политики планки, её словарей или модели свода и когда след проб пуст или старше такой правки. Вызывать по «проба планки», «ловит ли свод», «bar-probe».
Installs into .claude/skills of the current project.
Sponsors
SSkills DirectorySkills Directory
Know which skills are safe — weekly.
SSkills DirectorySkills Directory
Is that skill safe to install?
Are you the author of Bar Probe?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/igor-lx-bar-probe)
---
name: bar-probe
description: Проба планки — ловит ли свод по планке дефект в коде. В копию проекта сажается известное нарушение известного критерия, свод в ней делает сессия, не видевшая посаженного, а вердикт выносит машина: назвал ли свод посаженный критерий по посаженному адресу. Меряет суждение о коде, а не процесс обвязки — процесс меряет probe. Звать после правки политики планки, её словарей или модели свода и когда след проб пуст или старше такой правки. Вызывать по «проба планки», «ловит ли свод», «bar-probe».
user-invocable: true
---
# Проба планки: ловит ли свод посаженное нарушение
Печать свода по планке удостоверяет, что на каждый живой критерий дан ответ.
Верен ли ответ, она не удостоверяет. Эта проба меряет верность: в копию
проекта сажают известное нарушение известного критерия, свод делает сессия,
которая его не видела, и машина судит, назвал ли свод посаженное.
Устройство режима — посадки, прикрытия, суд, след — описано в
`.claude/tools/graph.md`, в разделе о режиме `bar-probe`. Здесь только
порядок работы.
## Чем отличается от `probe`
`probe` проверяет **процесс** обвязки на живой задаче: прочитаны ли нужные
правила, записана ли база, остановили ли ворота неверный коммит, и чем это
удержано. Этот скилл проверяет **суждение о коде**: найдёт ли свод дефект,
стоящий в строках. Проба вида «поймает ли свод такое-то нарушение» делается
здесь — посадкой в книгу `.claude/tools/bar-probes.json`, — а не пробой
`probe`.
## Когда звать
- правилась политика планки (`.claude/rules/quality.md`,
`.claude/rules/quality-scoped.md`), словари признаков или модель свода;
- след проб пуст либо старше последней такой правки. След — файл в базе,
названный полем `barProbeLedger` настройки; дату последней правки политики
даёт команда:
```
git log -1 --format=%cs -- .claude/rules/quality.md .claude/rules/quality-scoped.md
```
- в книге посадок лежат посадки, ни разу не прогнанные.
**Цена.** Каждая посадка — полный свод в песочнице: около `110 000` знаков
чтения даже на самую малую посадку (замер `2026-10-05`). Поэтому пробу зовут
по поводу из списка выше, а не на каждой правке, и сажают **пачкой**: свод
на пачку один, и постоянная часть — страницы критериев и строка на каждый —
оплачивается раз.
**Где сажать.** В свой проект — когда меряют свод на его коде. Когда меряют
планку саму — после её правки, по критериям, которых проект не держит, —
сажают на **стенд проб**: там у каждого критерия есть предмет и живы все
разделы. Посадки, которые решает машина, сессией не меряют: их держит тест
обвязки. Решает ли машина, говорит опора посадки — поле `held` в книге, а без
него опора критерия.
## Шаги
0. **Площадка.** Меряют свод на коде проекта — площадка сам проект. Меряют
планку саму — стенд проб, одной командой из корня проекта или мастерской:
`node .claude/tools/graph.mjs bar-probe --stand-build <пустая папка вне репозитория>`.
Она сажает текущую обвязку, ставит пакеты, кладёт стенд и кончается
сверкой базы; код не ноль — она печатает причину и команду разбора, и
проба до неё не начинается. Дальше все шаги — из этой папки.
1. **Посадить.** `node .claude/tools/graph.mjs bar-probe` — род посадки
выпадает случайно; `--existing` сажает в существующий код — вставкой
либо правкой (ближе к жизни), `--new` — новым файлом (верхняя граница
доли), `--removal` — удалением узла: имя, которое брал только он, остаётся
без потребителя, `--neighbour` — в соседа правленого, которого правка не
тронула, `--move` — в файл, который правка переносит либо переименовывает;
ключ рода сужает и пачку — номер другого рода в неё не ляжет;
`--seed=N` делает
посадку повторимой. `--criterion=ID` сажает посадку этого критерия,
`--batch=A,B,…` — пачку, по посадке на каждый названный критерий либо
номер книги. Режим печатает адрес песочницы и команду суда с номером
пробы; что посажено, он не печатает. Проект не вмещает ни одной посадки —
режим так и говорит и называет, сколько файлов кода нужно.
**Песочницу кладут вне репозитория**: `TMPDIR=<пустая папка вне
репозитория>`, на Windows — `TEMP`; той же переменной зовут и суд. Свод делает отдельная сессия,
стартовавшая в папке песочницы (шаг 2): шапка политики срабатывает на файл
внутри проекта этой сессии, то есть песочницы, и правила она получает один
раз — свои. Песочница внутри папки проекта, который зовёт свод, добавила бы
к ним доктрину мастерской: замер `2026-10-13`, пробный вызов с правилами
в две строки, создано `9 926` токенов контекста вне проекта и `68 979`
внутри.
2. **Сделать свод в песочнице сессией, не видевшей посаженного.** Это новая
сессия `claude -p`, стартовавшая в папке песочницы; задание ей — раздел
«Задание сессии свода», дословно. Шаг ручной по устройству: меряется сама
сессия, и машина его не заменит. Посаженное для неё — чужая правка:
законная судьба находки на нём — `вопрос`; `починено` гасит печать, и свод
ставят заново на конечном виде.
Команда — из папки песочницы, задание первым словом после `-p`, ключи после
него (`--allowedTools` принимает список и забрал бы задание, будь оно
позже):
```
cd <песочница> && env -u CLAUDE_CODE_CHILD_SESSION claude -p "<задание>" \
--session-id <uuid> --permission-mode acceptEdits \
--allowedTools "Bash(cd *)" "Bash(env *)" "Bash(node *)" "Bash(git *)" \
--output-format json > <папка вне песочницы>/svod.json
```
Устройство, каждое проверено пробным вызовом `2026-10-13` на Claude Code
`2.1.296`:
- **Вход отдельный не нужен**, модель та же, что у вызывающей сессии
(`modelUsage` в выводе называет её; ключ `--model` не передают). Уровень
рассуждения ключом не задают: сессия наследует окружение вызывающей, в
журнал и вывод он не пишется, поэтому его равенство прошлым пробам не
проверено.
- **Разрешения из `settings.json` песочницы не действуют**: папка не
принята как доверенная, и сессия печатает «Ignoring … permissions.allow
entries». Без `--allowedTools` её команды `node` отклоняются, а отказы
лежат в `permission_denials` вывода. `--bare` не передают: он снимает хуки.
- **Хуки песочницы идут**: страж на вызове Bash пишет след — файл
claude-harness-guard.json в папке git песочницы, ворота конца хода держат ход
(`stop --hook`). Ход кончается и паузой с причиной (`stop --pause`) —
тогда печати нет, и суд так и скажет. Мешает ли хук именно своду чтения,
покажет первый целый свод этим способом: записать, что именно и где.
- **Журнал** — `~/.claude/projects/<путь песочницы, косые черты → дефисы>/<uuid>.jsonl`.
`--session-id` делает имя известным заранее: без него сессия берёт номер
вызывающей, и два запуска из одной папки писали бы в один файл. Считают
по `message.id`, а не по записям: одно обращение лежит несколькими
записями с одним расходом.
- **Журнал не удаляют, пока разбор не записан.** Расход по статьям видно
только в нём: итоговой сводки хватает на счёт обращений и перечитывания,
но не на причины. Его копируют в сохранное место до уборки песочницы.
**Разбор записывается каждый прогон, без исключения** (требование
разработчика `2026-10-14`): таблица обращений, перечитывания, вызовов и
обращений по видам — в `.claude/rationale/loop.md`, раздел «Соразмерность:
что читать под задачу», строкой с датой, коммитом основания и числом
пойманных; там же модель цены, методика разбора и базовая линия
прогонов. Таблицу печатает режим
`node .claude/tools/graph.mjs bar-probe --cost --session=<uuid>` (либо
`--cost <путь журнала>`): вписывают его строку для замеров, числа в ней
уже в обратных кавычках. Прогон без записанной строки ловчесть показывает,
цену — нет. Запись строки держится вниманием: режим печатает, но в
`rationale/loop.md` не пишет.
- **Долго** — запускать в фоне (`run_in_background`, `timeout` до
`7 200 000` мс), код возврата `claude -p` брать из лога, а не из
уведомления о конце команды. Сессию свода запускают одну за раз.
Нет команды `claude` в окружении — запасной порядок прежний: субагент без
истории этой сессии, песочница внутри папки проекта
(`TMPDIR=<папка проекта>/probe-box`, папка в `.git/info/exclude`), чтобы
шапка политики на неё срабатывала. Цена такого свода несравнима с этим:
правила приходят дважды.
3. **Судить** — командой, которую напечатал шаг 1:
`node .claude/tools/graph.mjs bar-probe <номер>`, из папки проекта.
Исходы: `поймано`; `критерий назван, адрес другой`; `названо другим
критерием`; `мимо`. Пачку суд судит по посадке. Ненулевой код возврата —
на всём, кроме `поймано` у каждой. Счёт ложится в след; пачка — отдельной
долей. Промах в пачке перепроверяют одиночной пробой того же критерия.
4. **Отчёт и уборка.** В отчёт — исход, доля «поймано» по роду посадки и
медиана критериев, названных по адресу посадки, — всё из печати суда, —
и расход сессии свода из `bar-probe --cost` (обращений, перечитывание,
чтений протокола, отказов).
Исход «мимо» или «названо другим критерием» — находка обвязки: какого
признака не хватило своду. Чинится как любая находка: признаком в
планке, вопросом модели, новой посадкой в книгу — она проходит ворота
стенда (раздел «Правка книги посадок и стенда»). Промах чинится
классом, порядком скилла `probe`, раздел «Найденное лечится как класс, а
не как пример». Класс — какой формы нарушения не увидел держатель
критерия. Места рода — все критерии, чей держатель не видит той же
формы; перечень получают командой `bar-hold` и приводят в отчёте вместе с
ней. Починка идёт в держателе, а не под одну посадку; посадка в книгу —
на каждую форму рода. В отчёт идут те же четыре графы класса. При промахе суд
оставляет песочницу: разобрать протокол, затем удалить её и запись о
посадке — адреса суд печатает. Удаление ручное намеренно: протокол
промаха читают раньше, чем убирают.
## Задание сессии свода
Вместо `<песочница>` — адрес, который напечатал шаг 1. Выверено на девяти
пачках: перекрёстная сверка по находке и машинное «чисто» при закрытом наборе
форм в нём учтены. Задание одно на все пачки: переписанное своими словами,
оно делает замеры пачек несравнимыми.
Задание правлено `2026-10-13`: справочник инструмента из него снят, код
читается страницами `bar-read`, а не вторым чтением файлов. Пачки до этой
даты сравнимы с последующими по поимке — с оговоркой, что задание было
другим, — а по цене нет: прежнее задание посылало сессию в справочник на
`49 491` знак и к чтению каждого файла правки целиком поверх страниц.
Правлено повторно в тот же день: протокол читается одним вызовом по
строкам модели. Свод `2026-10-13` прочёл его пятью вызовами и примерно
восемью срезами оболочкой; с этого задания расход на протокол сравнивают
только с пачками после правки. Правлено в третий раз: страницы открываются
пачками. Пятый свод того дня шёл по одному вызову за обращение (`1,8`
вместо `2,3`–`2,6`), и это вероятный источник подорожания (причина не
доказана, журнал прогона не сохранили): каждое обращение заново проходит
весь накопленный контекст.
Правлено в четвёртый раз, по журналу шестого свода того дня (`79`
обращений, `27,6` млн токенов перечитывания, сохранён): `94 %` перечитывания
ушло не на чтение, а на заполнение — подбор формы клеток, срезы протокола
ради правил, разбор отказа своим скриптом, отказы оболочки на `heredoc` и
переменных. Запрет читать таблицы протокола снят: правила клеток и ключи
теперь печатает `bar`, и читать протокол сверх модели не за чем. Добавлено:
файл ответов — инструментом записи, команды — по одной, `git diff` не нужен
(страница кода называет правленые строки), `npm` не запускают. Расход с
пачками до этой правки не сравнивают.
Правлено в пятый раз `2026-10-17`: форма файла ответов и ключи лежат
файлом, а не в выводе `bar` — первый вывод был длиннее предела, который
среда отдаёт сессии, и ключи из его середины вырезались (девятый прогон).
Цену с прогонами до этой правки сравнивают по причинам.
```text
Ты — ревьюер кода. Работаешь в папке проекта `<песочница>` — git-репозиторий,
где кто-то другой внёс правку: она видна `git status` против последнего
коммита (новые файлы — неотслеживаемые). Задача: сделай свод по планке
правленого — режим `bar` без пути, полностью, до печати.
1. Команды инструмента (рабочая папка Bash между вызовами сбрасывается):
`cd <песочница> && env -u CLAUDE_CODE_CHILD_SESSION node .claude/tools/graph.mjs <режим> …`
Одна команда на вызов: без переменных оболочки, `heredoc`, труб и
перенаправлений — их оболочка без подтверждения не исполнит. Файлы пиши
инструментом записи файла. `npm` и прочие команды не запускай: в этой
сессии они не разрешены.
2. Начни с `… graph.mjs bar`: он соберёт модель правки, положит скелет
протокола в `.context/bar-protocol.md` и напечатает, что делать дальше.
Делай ровно то, что он велит: страницы `bar-read` и их слова, свидетели,
исход по каждому критерию, «итог по уровням», «база и документация».
Форму каждой строки ответа, словарь её клеток и ключи он кладёт файлом —
путь печатает вывод, открой его Read; справочника инструмента не читай. Из протокола читай только модель
предмета — одним вызовом Read, с offset и limit, которые назвал режим.
3. Страницы `bar-read` кладёт файлами и печатает их папку и имена: открывай
каждую инструментом Read, не оболочкой — тела критериев приходят в
контекст с первой открытой страницей, а прочитанная оболочкой страница их
не приносит. Страниц несколько десятков: открывай их пачками — несколько
вызовов Read в одном ответе, — а не по одной. Правленый код и срезы
соседей читай этими же страницами: они дают код предмета целиком и
дословно, а соседа — там, где он берёт предмет; страница кода называет
под заголовком правленые строки и снятые с их текстом, поэтому `git diff`
не нужен. Отдельным файлом открывай только то, чего страницы не дают
(строки соседа за срезом). Суди каждый критерий по его телу, а не по
заголовку. Нарушение — исход `нашлось`, адрес `путь:строка` там, где оно
стоит, словами — что не так; несколько мест — адрес у первого, остальные в
графе «что» после «ещё мест:». Найденное отмечается в каждом критерии, чьё
тело его называет. Пустой исход ставь чтением по странице критерия; исход,
который поставила машина, проверь по телу критерия.
4. Все ответы пиши одним файлом и вписывай одним вызовом `bar-fill`, затем
зови `bar`. Каждая находка встаёт в «Перекрёстную сверку находок» — со
словами и кандидатами. В графе «также» о каждом кандидате ответь `X`
либо `не X` и добавь любой другой критерий, чьё тело называет то же
нарушение; ни кандидатов, ни связей — `никакие`. Строки «также» можно
писать тем же файлом, что исходы, по форме ключа из вывода `bar`;
кандидата, о котором не сказано, режим назовёт дырой. Каждый названный
`X` обязан стоять «нашлось» с местом этой находки — поправь его строку.
5. Правка чужая, код не правь. Законная судьба находки — `вопрос`. Вопросы —
в `.context/13-questions.md`, по одному на файл с находками: заголовок
`## Вопрос N. …` называет файл, графы `**Задан:**`, `**Что решить.**`
(находки файла — критерий и строка), `**Последствие отсутствия ответа.**`.
6. Зови `… graph.mjs bar` снова, пока он не поставит печать; отказ объясняет,
чего не хватает. Работа закончена, когда напечатан отпечаток.
Запрещено: открывать и искать по `.claude/tools/bar-probes.json`,
`.claude/tools/bar-stand.json`, папкам `.claude/skills/bar-probe/` и
`.claude/state/`, файлам `bar-probe-*.plant.json`; запускать режим
`bar-probe`; править код, тесты и стили; править что-либо в `.claude/` —
ошибку инструмента опиши в ответе; коммитить.
В конце коротко: отпечаток печати (или почему её нет), все находки строками
`критерий — адрес — что не так`, и отдельно — где инструмент, по-твоему,
повёл себя неверно, особенно в перекрёстной сверке.
```
## Правка книги посадок и стенда
Новая или правленая посадка, правка стенда — собрать стенд (шаг 0) и в нём
позвать `node .claude/tools/graph.mjs bar-probe --stand-check`. Каждая
посадка-суждение обязана пройти ворота стенда: компилятор, линт, формат и
тесты. Посадка, уронившая их, показывает своду поломку, к её критерию не
относящуюся, и проба мерит не то. Режим называет каждую такую посадку;
правится посадка, а не ворота стенда. Работа закрыта, когда режим вернул
код ноль.
## Чего проба не доказывает
- **Доля рода «новым файлом» — верхняя граница**: посаженное отдельным файлом
заметнее настоящего дефекта.
- **Суд мерит полноту, а не точность**: свод, назвавший у посаженного каждый
критерий подряд, поймает всегда. Поэтому доля читается вместе с медианой
названных критериев.
- **Честность пробы держится вниманием**: запись о посадке лежит вне
песочницы, от случайного взгляда это защищает, от намеренного — нет.