ratchet-loop
Skill3 starsChanged 3 months agoMITView on GitHub
Одна метрика тянется до упора циклом с откатом: latency, число SQL-запросов, размер бандла, pass-rate. Каждая итерация мерится замороженным оценщиком (anti-Goodhart), улучшившее изменение остаётся, остальное откатывается через git; независимый verifier-проход проверяет, что метрика не обманута. Петля сама не терминируется — крутится до бюджета или плато. Используй когда пользователь говорит «оптимизируй метрику до упора», «крути, пока улучшается», «ratchet», или называет число, которое надо довести до минимума или максимума. Довести фичу до готовности — goal-pipeline; без измеримого скаляра ratchet-loop не подходит.
- Deletes or force-pushes
In this repository25 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- advanced-seo-optimizerSkill
- agent-workflowSkill
- aiogram-bot-auditorSkill
- change-reviewSkill
- codebase-reconSkill
- dependency-auditorSkill
- django-auditSkill
- docs-generatorSkill
- fastapi-architectSkill
- git-commit-plannerSkill
- goal-pipelineSkill
- harness-engineeringSkill
- migration-safety-auditorSkill
- obsidianSkill
- postgres-performanceSkill
- python-project-auditSkill
- release-managerSkill
- sageSkill
- session-catchupSkill
- spec-writerSkill
- test-coverage-auditorSkill
- ui-dnaSkill
- vps-opsSkill
The file
Files
Ratchet Loop
Оптимизационная петля-храповик поверх одной измеримой метрики. Идея взята из
autoresearch Карпатого и перенесена на brownfield: ты не «дорабатываешь фичу до
готовности» (это goal-pipeline), ты тянешь одно число — p95 latency, число
SQL-запросов на странице, размер бандла, pass-rate промпта, mutation score — и
оставляешь только то, что реально его сдвинуло в нужную сторону. Всё остальное
откатывается. История ветки = trail исследования.
Главный механизм — храповик: попробовал → измерил замороженным оценщиком →
если лучше, коммит остаётся (зубец защёлкнулся); если нет, git reset к
последнему «keep». Петля сама не заканчивается — крутится до бюджета, до плато
или до прерывания. Это отличает её от любой gate-петли с булевым «done».
Два предохранителя, без которых храповик вырождается в reward hacking, вшиты в контракт: замороженный оценщик (агент не имеет права его трогать; целостность проверяется хешем) и независимый verifier-проход (свежий суд по артефактам, а не по самоотчёту петли).
Чем НЕ является (анти-коллизия)
| Похоже на | Разница |
goal-pipeline | Coverage-пайплайн под хостовый /goal: разные фазы, терминируется на «все фазы done + аудит». ratchet-loop крутит ОДНУ задачу-вариацию на одном артефакте ради скаляра и сам не терминируется. /goal проверяет условие, а не «лучше ли число, иначе откат» — храповик в его модель не ложится. |
| In-session петля (паттерн, не навык) | Общая петля внутри текущей сессии без хостового оценщика и контракта оптимизации. ratchet-loop — не она: добавляет скаляр + направление, frozen eval, keep-or-revert и verifier. Нет оптимизируемого скаляра — ratchet-loop не подходит, работай обычным порядком. |
gate-loop (паттерн, не навык) / /goal "done when зелёное" | Булев гейт: «чини пока тесты/CI зелёные», терминируется когда щёлкнуло. ratchet тянет непрерывный скаляр и после «зелёного» продолжает жать. Для «до зелёного» отдельный скилл не нужен — это голый /goal или одна фаза goal-pipeline. |
spec-writer | Только пишет документ, ничего не исполняет и не меряет. |
Когда брать / когда не брать
Брать: есть одно число, которое надо двигать, и детерминированный (или почти) способ его померить на одном артефакте — оптимизация запроса/функции, снижение latency/памяти/запросов, ужатие бандла, подъём pass-rate промпта или few-shot-набора, рост mutation score. Изменения обратимы через git (чистый код, без сайд-эффектов).
Не брать:
- Нет скаляра, есть «довести фичу до готового» →
goal-pipeline. - Метрику нельзя померить автоматически и воспроизводимо → петле нечего тянуть; сперва сделай оценщик, потом возвращайся.
- Цель — булев гейт «до зелёного» → голый
/goal "done when ...". - Оптимизируемый артефакт сам по себе сайд-эффектный (миграция, деплой-скрипт,
рассылка) → откат через git не спасёт; это не задача для ratchet-loop, откажись
и эскалируй (
RL_HALT).
Предусловия
- Git-репозиторий, чистое рабочее дерево — храповик стоит на
git reset. Грязное дерево на старте → попроси закоммитить/стешить. Нет git → откажись (предложиgit init+ baseline-коммит, без него петля небезопасна). - Замороженный оценщик — команда (
make-цель или прямая), которая печатает скаляр в распознаваемой строке и не зависит от оптимизируемого артефакта как от источника правды.python eval.py→metric: 0.873, илиpytest tests/bench_test.py -qсо строкой метрики, илиmake bench. - Понятные команды проекта. Все прогоны — командами в терминале твоей среды; не заводи под это скрипты-файлы.
Профили автономности
Выбирается в этапе 0 (дефолт — checkpoint-on-verify), пишется в STATE.md:
checkpoint-on-verify / full-auto / per-keep — таблица «профиль → поведение →
когда» в references/loop-protocol.md.
Этап 0 — Контекст
- Профиль автономности — спроси одним
AskUserQuestion, если не задан (дефолт checkpoint-on-verify). Запиши вSTATE.md. - Git baseline —
git rev-parse HEADи проверка чистоты дерева (git status --porcelain). ЗапишиBaseline ref:вSTATE.md. Грязно → стоп, попроси привести дерево в порядок. - Память — подгрузи memory-индекс (
MEMORY.md), выборочно подними релевантное (предпочтения по стеку, прошлые прогоны по этому артефакту). Применённое вынеси в контракт как «Из памяти: …».
Этап 1 — Контракт оптимизации (программа петли)
Это самая важная часть: пока контракт не зафиксирован, петлю не запускай. Эхо задачи в одно предложение, затем определи и покажи пользователю контракт:
- Мутируемая цель — РОВНО один файл (по умолчанию) или явный малый набор. Только он редактируется. Всё прочее — заморожено.
- Замороженный оценщик — точная команда измерения + строка-якорь метрики
(например
^metric:или^val_bpb:). Оценщик и любые его данные-эталоны входят в frozen-set и не редактируются (этап 2). - Метрика и направление — один скаляр,
minimizeилиmaximize. Не «качество», не «быстрее» — конкретное число. - Порог шума (epsilon) — насколько метрика должна сдвинуться, чтобы считать это улучшением, а не дрожанием замера. Если замер шумный — оцени epsilon по 2–3 прогонам baseline.
- Бюджет на попытку — wall-clock таймаут (например 5 мин). Превышение → kill, попытка = crash/discard.
- Условие останова петли —
until-interrupted(дефолт), либоN trials, либоplateau:K(K попыток подряд без улучшения сверх epsilon).
Уточняющие вопросы — только истинные пробелы (что за метрика, чем мерить, что правим). Микро-детали — в показ контракта как предположения для правки в один клик.
Напечатай RL_CONTRACT со всеми полями и AskUserQuestion «Старт?» с режимами
правки (Старт · Поправить цель/оценщик · Сменить метрику/направление ·
Сменить бюджет/останов). Молчание ≠ подтверждение.
Пример заполненного контракта, заморозки оценщика, results.tsv и финала —
references/contract-example.md (снижение числа SQL-запросов на странице Django).
Этап 2 — Заморозка оценщика (anti-Goodhart core)
Без этого петля сжульничает в первую же ночь. После «Старт»:
- Перечисли все файлы frozen-set: скрипт оценщика, его данные/эталоны, конфиг замера, фикстуры бенча. Всё, что мутируемая цель не должна трогать.
- Зафиксируй их целостность:
git hash-object <file>по каждому (или хеш дерева подкаталога). Запиши в.ratchetrun/EVAL.lock. - Напечатай
RL_EVAL_LOCKEDсо списком файлов и хешей.
Жёсткое правило: мутируемая цель ≠ ни один файл frozen-set; их пересечение пусто. Если пользователь назвал оценщиком тот же файл, что и цель — стоп, объясни: агент, который и правит, и судит один файл, измеряет собственную выдумку.
Этап 3 — Baseline
Первая «попытка» — без правок: прогони оценщик как есть, чтобы получить отправную
точку. <eval-cmd> > .ratchetrun/run.log 2>&1, затем достань строку метрики
грепом по якорю из лога (^metric:). Не давай выводу затопить
контекст — только строка метрики (redirect + grep, не tee).
Запиши как best в STATE.md и первой строкой в results.tsv. Напечатай
RL_BASELINE: <metric>.
Если метрика это позволяет, на baseline сними и профиль (что доминирует в числе: какой запрос, какая функция, какой кусок бандла) — чтобы гипотезы целили в горячую точку, а не угадывали. Профиль — в лог, не в контекст.
Этап 4 — Ratchet-петля
Артефакты — в .ratchetrun/ (напомни добавить в .gitignore). results.tsv
не коммить (untracked), как и весь .ratchetrun/. Колонки (tab-separated):
trial commit metric status eval_ok descriptionЦикл (до условия останова, RL_HALT, или прерывания):
- Eval-integrity guard. Пере-сверь хеши frozen-set против
EVAL.lock. Любое расхождение →RL_HALT,STATE.md → Status: EVAL_TAMPERED, стоп. Прогон недействителен — оценщик изменился. - Гипотеза. Одно изменение мутируемой цели (что и зачем, 1 строка), нацеленное на горячую точку из профиля, а не наугад. Один рычаг за попытку — иначе непонятно, что именно сдвинуло метрику.
- Правка. Внеси её только в мутируемую цель.
- Прогон.
<eval-cmd> > .ratchetrun/run.log 2>&1с таймаутом бюджета. Превышение → kill процесса. - Считай метрику. Достань строку метрики грепом по якорю
<якорь>из.ratchetrun/run.log. Пусто → crash. - Решение храповика:
- crash (пусто/таймаут/ненулевой код) →
RL_CRASH; если причина тупая (опечатка, импорт) — почини и переран один раз; иначе discard. - улучшение (метрика лучше
bestпо направлению сверх epsilon) → keep:git commit, обновиbest,RL_KEEP: <metric>. - равно/хуже → revert:
git reset --hard <last-keep-commit>(илиgit restore),RL_REVERT. - критерий простоты: метрика в пределах epsilon, но код проще (меньше строк, убрали хак) → keep как упрощение. Крошечный выигрыш ценой уродливой сложности → discard.
- crash (пусто/таймаут/ненулевой код) →
- Лог. Допиши строку в
results.tsv(eval_ok= да/нет из шага 1). - Чекпоинт. Профиль
per-keepи был keep, ИЛИ накопилосьKkeep-ов (checkpoint-on-verify) → перейди в этап 5 (verifier), затемRL_HALT. - Прерывание. Пришло сообщение пользователя → пауза на границе попытки, разберись, спроси перед продолжением.
3-strike на crash
Три подряд crash без единого keep по одной линии идей → RL_HALT с историей попыток;
STATE.md → Status: BLOCKED. Не долби стену — смени направление гипотез или верни руль.
Если идеи кончились
Не останавливайся молча (профиль full-auto/until-interrupted). Перечитай контракт и
прошлые near-miss из results.tsv, скомбинируй частичные улучшения, попробуй более
радикальную правит цели. Плато объявляй только по условию plateau:K, не на глаз.
Этап 5 — Независимый verifier-проход
Per-trial решения — самоотчёт петли; «лучшее» нужно судить с чистого листа.
Рекомендуемая форма (истинная независимость) — свежая сессия/суб-агент без доступа
к транскрипту петли, судящая только по best-коммиту + контракту. Минимум —
отдельный проход в текущей сессии. Проверь:
- Целостность оценщика. Хеши frozen-set ==
EVAL.lock. Расхождение → провал, весь прогон под подозрением. - Воспроизводимость. Чистый чекаут
best-коммита → прогони оценщик заново → метрика воспроизводится в пределах epsilon. Ловит выдумку из транскрипта, кеш-фейк и недетерминизм. - Анти-хак скан диффа против baseline ref (см. «Жульничество» в references/loop-protocol.md).
- Без сайд-эффектов. Дифф трогает только мутируемую цель: нет новых миграций,
push, деплоя, сетевых вызовов, destructive ops, правок вне цели.
Напечатай RL_VERIFY с результатом каждого пункта. Провал любого → RL_HALT,
STATE.md → Status: VERIFY_FAILED, верни руль с диагнозом.
Этап 6 — Завершение (Definition of Done)
«Done» здесь — не «метрика красивая», а прогнанные проверки (стиль harness-engineering: DoD = гейт, а не пожелание):
RL_VERIFYзелёный: целостность оценщика + воспроизводимостьbestиз чистого чекаута + анти-хак скан чисто + ноль сайд-эффектов вне цели.HEAD==best-коммит; метрикаHEAD== записаннаяbest.results.tsvкогерентен: по строке на попытку, статусы согласованы с git-историей.- Memory writeback сделан (что сработало/не сработало по этому артефакту).
Затем RL_RUN_COMPLETE с 5-строчным резюме: метрика baseline→best (дельта), число
попыток (keep/discard/crash), какие идеи сработали, путь к results.tsv, остался ли
запас. Если доля недетерминированно-проверенного в verifier высока — баннер «⚠ метрика
шумная, перед мержем подтверди дельту на нескольких прогонах».
Что считается жульничеством (reward hacking)
Анти-хак скан этапа 5 ищет правки frozen-set, подглядывание ответа, ветки
«распознал оценщик → подыграл», глотание падений и сайд-эффекты ради метрики —
полная таксономия в references/loop-protocol.md.
Любое срабатывание → keep недействителен, откат, RL_HALT.
Маркеры транскрипта и память
Полная таблица маркеров (RL_CONTRACT, RL_KEEP, RL_HALT, RL_RUN_COMPLETE, …)
и правила memory-writeback (ratchet_<artifact-slug>.md) — в
references/loop-protocol.md. Читай его перед этапом 1
и перед завершением прогона.
Связанные навыки
goal-pipeline— когда задача не «тяни число», а «доведи фичу/рефакторинг до готового по фазам».harness-engineering— независимый verifier-проход и DoD здесь — те же гейты, что харнесс кладёт в Definition of Done проекта. ratchet-loop исполняет «оптимизация под замороженным оценщиком» как один из них.test-coverage-auditor/migration-safety-auditor— могут быть оценщиком или гейтом, если оптимизируешь именно покрытие/безопасность миграций.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

