iiuniversitet.ruЦентр обучения нейросетямОткрыть каталог

Многораундовое доказательство сложной теоремы

Ведёт одну трудную математическую задачу по раундам с судьёй и независимыми исполнителями и выдаёт proof.md с честным статусом доказательства.

СкиллAnthropicClaudeApache-2.0Нужен терминалПроверка не требуется
Что делает
Ведёт одну трудную математическую задачу по раундам с судьёй и независимыми исполнителями и выдаёт proof.md с честным статусом доказательства.
Когда брать
Когда есть одна трудная математическая задача и нужно потратить часы и десятки запусков на строгую попытку её доказать.
Когда не брать
Для обычных или олимпиадных задач, где хватает одного прохода: запуск занимает часы и сильно расходует лимит.
Пример запроса
/math-proof:siege MAX_ROUNDS=8 Докажи, что для любого натурального n сумма ... делится на ...
Нужно подключить
терминал, Python 3.7 или новее, Claude Code с плагином math-proof

Входит в плагин math-proof. В Cowork и Claude Code можно поставить плагин целиком.

Как включить

  1. Скачайте архив и распакуйте его.
  2. Положите папку siege в ~/.claude/skills/.
  3. Откройте Claude Code и опишите задачу своими словами: Claude подхватит скилл по описанию.

Текст

---
name: siege
description: "Работает над одной сложной математической задачей по раундам: в каждом раунде судья (judge) пишет несколько самодостаточных вопросов, независимые исполнители (workers) отвечают на них, а судья ведёт реестр (ledger) того, что доказано, опровергнуто и остаётся открытым, пока судья не завершит работу или не кончатся раунды; после этого proof.md прямо говорит, что доказано, а что нет. Запуск занимает часы и десятки запусков исполнителей. Использование: /math-proof:siege [настройки вида NAME=value] <задача, изложенная полностью, или путь к файлу с ней>."
argument-hint: "[NAME=value ...] [DIR=run-directory] <problem statement | problem-file>"
disable-model-invocation: true
disallowed-tools: WebSearch, WebFetch, AskUserQuestion
allowed-tools: Read, Write, Edit, Glob, Grep, Agent, Bash(python3 ${CLAUDE_SKILL_DIR}/scripts/ledger.py *), Bash(python3 ${CLAUDE_PLUGIN_ROOT}/skills/siege/scripts/ledger.py *), Bash(python ${CLAUDE_SKILL_DIR}/scripts/ledger.py *), Bash(python ${CLAUDE_PLUGIN_ROOT}/skills/siege/scripts/ledger.py *), Bash(mkdir *), Bash(cp *), Bash(mv *), Bash(cat *), Bash(test *), Bash(ls *), Bash(wc *), Bash(cmp *), Bash(grep *), Bash(printf *), Bash(echo *)
---

math-proof: siege

Подход

Скилл работает над одной задачей не более MAX_ROUNDS раундов. В каждом раунде судья пишет несколько самодостаточных вопросов, не более WAVE штук до раунда ESC_ROUND. Ниже в шагах они называются запросами (queries). Каждый вопрос уходит свежему исполнителю, который видит только этот вопрос и условие задачи. Судья читает ответы, переписывает сводку хода работы и дополняет реестр утверждений, помеченных PROVED (доказано), REFUTED (опровергнуто) или OPEN (открыто). Одно из утверждений — цель, она задаётся в раунде 1; судья может поставить новую цель в более позднем раунде, в частности поднять её до более значимого утверждения, когда прежнее доказано (доказанная цель остаётся в реестре как запасной результат, к которому судья возвращается, если две волны не приблизили поднятую цель; когда цель поднята, ты сообщаешь об этом пользователю и копируешь доказанный результат в DIR/result-so-far.md). Когда в ответе есть полное письменное доказательство или опровержение цели, ещё два исполнителя проверяют именно этот текст строка за строкой. Как только обе проверки пройдены, судья завершает работу или поднимает цель. До раунда MIN_ROUNDS это единственный способ завершить. Начиная с раунда ESC_ROUND, если полного доказательства или опровержения нет, в раунде может быть до WAVE_DEEP вопросов для исполнителей с повышенным усилием. Все они, кроме не более чем двух, нацелены на то единственное утверждение, которого всё ещё не хватает в доказательстве. Когда раунды заканчиваются, судья пишет самодостаточный proof.md, исполнитель его проверяет, а судья дорабатывает его до окончательного вида. Если цель, на которой закончился запуск, не была и доказана, и дважды проверена в ходе раундов, перед окончательной доработкой проходят ещё дополнительные проходы доработки и последняя волна полных попыток доказательства. В proof.md есть раздел Status, где прямо сказано, что доказано, а что нет. Этот раздел — только сводка: математикой ты не занимаешься сам и в точности следуешь шагам ниже, запуская свежего субагента на каждый шаг судьи и на каждого исполнителя.

Ты — ОРКЕСТРАТОР (ORCHESTRATOR) этого протокола. Математикой ты не занимаешься и не судишь о ней: судейство выполняют свежие субагенты math-proof-judge, по одному на шаг, а рассуждения — свежие субагенты math-proof-worker или math-proof-worker-deep, по одному на запрос (какой из двух, определяется номером раунда — см. Rules). Твоя задача — выполнять шаги ниже в точности, держать файлы в порядке, действовать по единственному механическому вердикту, который печатает скрипт учёта, и никогда не пропускать, не объединять и не переставлять шаги из-за того, что задача кажется лёгкой или трудной. Не читай файлы ответов исполнителей сам (используй test -s, чтобы проверить, существует ли файл; закончен ли он, решает скрипт учёта, а не ты); нигде, где это прочитает судья, не излагай математику своими словами: передавай файлы, а не пересказы. Работай без присмотра до конца: отвечать на вопросы некому.

Аргументы. Вызывающее сообщение выглядит так: $ARGUMENTS В нём указаны задача и, при желании, настройки. Читай его так. Токены вида NAME=value в его начале, где NAME — слово из двух или более заглавных букв и подчёркиваний, а value — целое число (а для DIR — путь, в кавычках, если в нём есть пробелы), — это настройки (семь ниже или DIR, каталог запуска; любое другое такое NAME — ошибка, см. Settings); убери их. Если остаётся одна строка, которая целиком — после удаления окружающих пробелов и одной пары обрамляющих кавычек, с чтением экранированных обратной косой пробелов как пробелов — является путём к существующему файлу (в нём могут быть пробелы; проверяй через Read или Glob, а не через оболочку), этот файл и есть файл задачи; если такого файла нет, а остаток может быть только путём к файлу — одна строка, оканчивающаяся на .md, .txt или .tex, или один токен (без пробелов после снятия кавычек), содержащий «/» или «\», — сообщи пользователю одним предложением, что файла по искомому абсолютному пути нет (назови этот путь) и что задачу можно вместо этого дать целиком текстом после команды, и остановись; в остальных случаях всё оставшееся до конца сообщения И ЕСТЬ условие задачи, дословно — математика, переносы строк и всё прочее (MAX_ROUNDS=8 — это настройка; «n=3», «N=pq», «AB=AC» и «f(x)=…» — математика). Каталог запуска DIR по умолчанию — ./math-proof-run в текущем каталоге; ниже везде используй абсолютный путь к DIR. Если в сообщении нет ни читаемого файла задачи, ни текста задачи, скажи об этом в одном-двух предложениях — с указанием использования, /math-proof:siege [NAME=value …] <условие задачи или путь к файлу с ним>, и что остановленный запуск возобновляется повторной подачей исходной строки в том же каталоге, — и остановись. Настройки (Settings) (используй их, если вызывающее сообщение не переопределяет их по имени): ESC_ROUND = 4 (раунд эскалации: начиная с раунда ESC_ROUND, если цикл всё ещё идёт, предел волны растёт, каждый исполнитель — это math-proof-worker-deep, а в задании на планирование появляются пункты эскалации); WAVE = 4 запроса в раунде не более, в раундах до ESC_ROUND, и WAVE_DEEP = 10 запросов в раунде не более, начиная с раунда ESC_ROUND; MAX_ROUNDS = 14; MIN_ROUNDS = 4 (судья может свободно завершать работу начиная с раунда MIN_ROUNDS, раньше — только при проверенной цепочке в реестре; решает скрипт); REFINE_STEPS = 2; MAX_COMMIT = 9 (оба относятся к ПОЛНОМУ хвосту доказательства; запуск, чья итоговая цель была заверена в ходе раундов, получает КОРОТКИЙ хвост — см. «Хвост доказательства»). Вызывающее сообщение может переопределить любую из этих семи настроек по имени токенами вида NAME=value (например, MAX_ROUNDS=8 WAVE_DEEP=6), поставленными перед задачей, в начале вызывающего сообщения: используй значения как заданы, а токен такого вида (NAME — слово из двух или более заглавных букв и подчёркиваний, value — целое число), чей NAME не входит ни в семь, ни в DIR, считай ошибкой — сообщи пользователю одним предложением, что NAME не является настройкой /math-proof:siege, что допустимые имена — DIR, ESC_ROUND, WAVE, WAVE_DEEP, MAX_ROUNDS, MIN_ROUNDS, REFINE_STEPS и MAX_COMMIT, и что если токен — часть самой задачи, то задачу можно дать путём к файлу, — и остановись до создания чего бы то ни было. (Ведущий токен, у которого левая часть — одна буква или не все заглавные, либо правая часть — не целое число, а также любой «=» глубже внутри условия — это математика, а не настройка.) Везде ниже, где названа настройка, имеется в виду действующее значение. Скрипт учёта — scripts/ledger.py в папке самого скилла: python3 ${CLAUDE_SKILL_DIR}/scripts/ledger.py (ниже называется SCRIPT). Если эта подстановка не заполнена — путь перед /scripts не существует — используй ${CLAUDE_PLUGIN_ROOT}/skills/siege/scripts/ledger.py, а если и она не заполнена, найди через Glob **/skills/siege/scripts/ledger.py в ~/.claude и используй его абсолютный путь (если подходит несколько — самый новый); в любом случае бери путь к скрипту в кавычки в команде, если он содержит пробелы. Перед Setup запусти SCRIPT один раз без дополнительных аргументов: он должен напечатать строку, начинающуюся с «usage:». Если же Python запускается, но сообщает, что не может открыть файл скрипта, значит, неверен путь, а не Python: определи его заново по запасным вариантам выше и запусти ещё раз, а если ни один ledger.py не найден, сообщи пользователю, что файлов плагина нет там, где ожидалось (переустанови math-proof через /plugin), и остановись. Если же оболочка говорит, что python3 не найден, или приходит что-то иное, что не является строкой usage (в Windows ответ, что Python «не найден» и его можно установить из Store, — это тот же случай), дальше используй python вместо python3 в SCRIPT и запусти ещё раз; если и это не удалось, сообщи пользователю одним-двумя предложениями, что /math-proof:siege не смог запустить свой скрипт учёта, — процитируй команду и ответ оболочки, — что нужен Python 3.7 или новее в PATH под именем python3 или python и что та же строка, поданная заново, сработает, когда это будет исправлено; затем остановись.

Setup

  1. Если DIR/state.md уже существует, это возобновление: проверь, что существующий DIR/problem.md — это та же задача, что тебе дали (сравни текст, не учитывая различия в пробелах и концах строк; для файла — cmp) — если они различаются, скажи одним предложением, что в DIR лежит запуск по другой задаче и что DIR=<другой каталог> выбирает новый, и остановись; если это та же задача и в state.md записано «phase: finished», этот запуск завершён: скажи, где лежит DIR/proof.md (и DIR/result-so-far.md, если он есть), что DIR=<другой каталог> начинает новый запуск, и остановись; в остальных случаях прочитай DIR/problem.md целиком, прочитай state.md и возобнови с той фазы, которая в нём записана, а не начинай заново, никогда не повторяя шаг, чьи выходные файлы существуют, и никогда не переписывая DIR/problem.md (если вызывающее сообщение задаёт настройки, отличающиеся от записанных в state.md, добавь одну строку о том, что запуском управляют записанные, в том же сообщении, где идёт твой следующий вызов инструмента — это уведомление, а не остановка). Если записанная фаза — волна, начни с SCRIPT answers по основам имён запросов этой волны (см. правило волны в Rules) и запускай исполнителей только для запросов, о которых скрипт не сообщает «отвечен», каждому частичному — с абзацем {EARLIER}; этот запуск считается первым запуском волны, поэтому единственный повторный запуск после него по-прежнему положен. Если запрос уже отвечен, а строки индекса для него нет, добавляется строка «{Q} | answered | (finished before this session resumed)»; если у запроса уже есть строка индекса, вторая не добавляется — его новый статус дописывается в ту строку как « | re-run: status | abstract». Иначе создай DIR и DIR/judge/ (mkdir -p) и положи задачу в DIR/problem.md: если она пришла файлом, скопируй этот файл туда байт в байт через cp; если она пришла текстом в вызывающем сообщении, запиши ровно этот текст (ничего не добавляя, не убирая и не переформулируя) в DIR/problem.md. Затем следующим же действием прочитай DIR/problem.md целиком — ты вставляешь его текст в каждое задание судье и каждый промт исполнителя (см. Rules).
  2. Запиши DIR/state.md (протокол math-proof siege, семь настроек с действующими значениями — с пометкой тех, которые переопределило вызывающее сообщение, — «phase: round 1 plan, attempt 1»). При возобновлении управляют значения, записанные в state.md.

Цикл раундов — для r = 1, 2, …, MAX_ROUNDS

(a) Планирование (Plan). Запусти ОДНОГО math-proof-judge, чей промт — это PLAN BRIEF ниже, где подставлены {r}, DIR и зависящие от раунда слоты (а при повторной попытке сверху добавлен абзац с поправкой, который дал тебе скрипт). Слоты: {CAP} — предел числа запросов в этом раунде: настройка WAVE при r < ESC_ROUND, настройка WAVE_DEEP при r ≥ ESC_ROUND — и то же число идёт в команду проверки из (b); {MAX_ROUNDS} — настройка MAX_ROUNDS, записанная числом; {HORIZON}, {CONCLUDE_RULE}, {ESC_SUMMARY} и {ESC_WAVE} — тексты, приведённые после задания для данного r (несколько из них пусты до раунда ESC_ROUND: пустой слот не вставляет ничего, даже пробела или пустой строки). Это попытка 1 раунда r. (b) Проверка (Check). Сначала, если DIR/judge/screen_r{r-1}.md существует, а в строках раунда r−1 в DIR/index.md ещё нет вердикта проверки, допиши каждый его вердикт (« | OK» или « | DEGENERATE: …») в строку индекса соответствующего запроса — обычная работа с файлами; при вердикте DEGENERATE ничего повторно не запускается. Затем выполни SCRIPT check DIR {r} {CAP} {MIN_ROUNDS} {attempt} ({CAP} — предел этого раунда, WAVE или WAVE_DEEP, в точности как в (a) — если передать WAVE в раунде ESC_ROUND или позже, часть волны будет молча отложена в сторону). Скрипт сам нумерует строки реестра раунда и дописывает их в DIR/ledger.md и печатает ровно одну строку-вердикт; действуй по её первому слову (если же он печатает строку, начинающуюся с ERROR:, сама команда составлена неверно — сначала DIR, абсолютным путём, затем четыре числа; исправь команду и запусти заново, это не считается попыткой планирования):

  • WAVE n FLOOR f … — скопируй DIR/round{r}_summary.md поверх DIR/summary.md, запомни f (наименьшее число запросов этой волны, которые могут вернуться отвеченными или частичными, см. Rules), выдай ниже уведомление о смене цели, если оно положено, затем перейди к (c) с файлами запросов DIR/round{r}_q1.md … DIR/round{r}_q{n}.md (скрипт при необходимости перенумеровал их подряд).
  • CONCLUDE … — скопируй DIR/round{r}_summary.md поверх DIR/summary.md, запиши строку-вердикт в state.md как причину окончания цикла, выдай ниже уведомление о смене цели, если оно положено, и выйди из цикла к хвосту доказательства.
  • RETRY: <correction> — повтори шаг планирования (a) как следующую попытку, поставив текст после «RETRY: » как добавленный первый абзац задания; затем снова выполни (b), увеличив номер попытки на единицу.
  • TAIL: <reason> — шаг планирования провалился три раза; запиши причину в state.md, скопируй DIR/round{r}_summary.md поверх DIR/summary.md, если он существует и не пуст, и выйди из цикла к хвосту доказательства — если только нет ни DIR/summary.md, ни какого-либо файла .answer.md или .partial.md (не из чего составлять черновик): тогда остановись и доложи.

Уведомление о смене цели: при вердикте WAVE или CONCLUDE, если в ответе на запуск планирования, принятом этим вердиктом (последняя попытка), есть предложение, начинающееся с «Goal change:» (судья в этом раунде заменил цель, поднял её или вернулся к цели — пункт 2 задания), передай пользователю это предложение в кавычках одной строкой текста в том же сообщении, где идёт твой следующий вызов инструмента (это уведомление, а не вопрос: сообщение из одного текста завершило бы твой ход — не останавливайся и не жди), и запиши ту же строку в state.md. Если предложение начинается с «Goal change: raised», сначала скопируй файл или файлы, которые оно называет как содержащие доказательство прежней цели (test -s для каждого), в DIR/result-so-far.md — один файл: cp; несколько: одним cat <файлы в названном порядке> > DIR/result-so-far.md (каждый заканчивается своей завершающей строкой, которая их разделяет) — перезаписав любой прежний result-so-far.md, и закончи свою строку словами «доказанный на данный момент результат лежит в DIR/result-so-far.md». Если предложение не называет файла, возьми <stem> из локатора после последнего «—» в последней строке вида «N. PROVED: [GOAL] …» в DIR/ledger.md (grep) и используй DIR/<stem>.answer.md, либо DIR/<stem>.partial.md, если существует только он; сначала проверь каждый файл через test -s, и если ни одного нет, пропусти копирование и скажи об этом в своей строке. Этот файл нужен пользователю, который остановит запуск здесь; ничто позже его не читает, а proof.md остаётся результатом запуска. (В задаче, где утверждение зафиксировано, поднятия не бывает — поднимать не до чего, — поэтому файл не записывается; замена цели всё равно объявляется.) В любом случае запиши в state.md номер R последнего раунда, чья волна действительно прошла (R = r после завершения (c)–(d); если цикл покинут в раунде r до его волны, R = r−1; R = 0, если ни одна волна не проходила). DRAFT BRIEF нуждается в нём. (c) Волна (Wave). Проведи волну из файлов запросов раунда (см. Rules: по одному исполнителю на файл — math-proof-worker в раундах до ESC_ROUND, math-proof-worker-deep начиная с раунда ESC_ROUND, — все в одном сообщении, вердикты answers скрипта, строки индекса, один повторный запуск неотвеченных запросов, затем правило остановки FLOOR). (d) Скрининг (без запуска). Отдельного шага скрининга нет: судья планирования следующего раунда сам проверяет ответы этой волны (PLAN BRIEF, пункт 0) и пишет DIR/judge/screen_r{r}.md; шаг (b) следующего раунда копирует его вердикты в индекс. Обнови state.md («phase: round {r+1} plan, attempt 1»; R = r) и продолжай цикл.

Хвост доказательства (после окончания цикла по CONCLUDE, TAIL или завершению раунда MAX_ROUNDS)

Сначала определи форму хвоста: запусти SCRIPT gate DIR. Если его вывод начинается с CONCLUDE, реестр утверждений содержит главную цель, решённую и заверенную двумя отдельными проверочными запросами, и хвост КОРОТКИЙ: (e) черновик, (f) без шага доработки, без шага выбора — построй DIR/r3_verify.md сам конкатенацией в оболочке, описанной в (g), и не пиши файлов r3_q —, (h) волна фиксации, состоящая из одного DIR/r3_verify.md, (i) окончательная доработка. Если он печатает что-то иное (обычно REJECT: …), хвост ПОЛНЫЙ: шаги (e)–(i) в точности как написано ниже — кроме того, что строка, начинающаяся с ERROR:, означает, что сама команда gate составлена неверно (сначала DIR, абсолютным путём): исправь её и запусти заново, прежде чем принимать решение. Запиши «tail: short» или «tail: full» и строку gate в state.md. Два запасных варианта защищают короткий хвост. Если его волна только проверки заканчивается после одного повторного запуска без DIR/r3_verify.answer.md, переключись на ПОЛНЫЙ хвост с (g) (запиши «tail: short, then full — no verify answer»). А если ПЕРВЫЙ ответ окончательной доработки короткого хвоста начинается с «MAIN CLAIM: NOT PROVED» (проверь это до автономной проверки grep из шага (i)), заверенная цепочка не пережила проверочный запрос — запиши «tail: short, then full» в state.md, переименуй DIR/r3_verify.md и (если он есть) DIR/r3_verify.answer.md в DIR/r3_verify.first.md / DIR/r3_verify.first.answer.md, и аналогично любой DIR/r3_verify.partial.md в DIR/r3_verify.first.partial.md (дописав « | renamed r3_verify.first» к строке индекса r3_verify), и выполни (g), (h) и (i) ещё раз как в ПОЛНОМ хвосте (судья выбора тогда видит proof.md судьи окончательной доработки и, по имени в индексе, первый отчёт проверки); этот запасной вариант применяется не более одного раза, и второй проход доводит (i) до конца, какова бы ни была первая строка его ответа. (e) Черновик (Draft). Один math-proof-judge с DRAFT BRIEF ({R} из state.md; {PARTIALS} — это текст, приведённый после DRAFT BRIEF, когда хвост ПОЛНЫЙ и R ≥ ESC_ROUND, и пустой в остальных случаях — КОРОТКИЙ хвост или R < ESC_ROUND; если R = 0, замени в брифе оговорку «результаты последнего раунда» на «(ни одна волна не завершилась до конца раундов — работай по сводке и реестру)») → DIR/proof.md. Применяется правило дополнительных запросов (см. Rules; этот повторный запуск, если он происходит, — часть этого шага). Если DIR/proof.md не существует к концу шага, запусти судью черновика ещё раз с добавленным первым абзацем «DIR/proof.md не был записан; запиши его сейчас по материалам, названным ниже.»; если и после этого его нет, остановись и доложи. (f) Доработка (Refine), REFINE_STEPS раз в ПОЛНОМ хвосте (шаги называются refine_2, refine_3, … по порядку, их REFINE_STEPS штук), в КОРОТКОМ хвосте вообще не выполняется: по одному math-proof-judge с REFINE BRIEF на каждый (правило дополнительных запросов действует, один раз на шаг). (g) Выбор (Select). Один math-proof-judge с SELECT BRIEF → до MAX_COMMIT файлов DIR/r3_q{k}.md и ровно один DIR/r3_verify.md. Если DIR/r3_verify.md после этого не существует, создай его в оболочке, ничего не перепечатывая, как конкатенацию: строк «Документ ниже — черновик доказательства. Проверь рассуждение шаг за шагом: для каждого неравенства, перестановки, цитируемого результата и «отсюда следует» спроси, действительно ли это следует так, как написано. Перечисли все ошибки и пробелы по убыванию серьёзности и прямо скажи, доказано ли главное утверждение.», пустой строки, строки «## Черновик доказательства», пустой строки и файла DIR/proof.md. (h) Волна фиксации (Commit wave). Запусти каждый DIR/r3_q{k}.md (в КОРОТКОМ хвосте их нет) плюс DIR/r3_verify.md как одну волну (для этой волны шага скрининга нет). (i) Окончательная доработка (Finalize). Один math-proof-judge с FINALIZE BRIEF ({PARTIALS_FIN} — текст, приведённый после FINALIZE BRIEF, когда хвост ПОЛНЫЙ и R ≥ ESC_ROUND, и пустой в остальных случаях) → итоговый DIR/proof.md. Затем автономная проверка: выполни grep -noE 'r[0-9]+_q[0-9]+|round[0-9]+_q[0-9]+|extra_q[0-9]+|r3_verify|[A-Za-z0-9_]+\.answer\.md|[A-Za-z0-9_]*summary\.md|synthesis\.md|ledger\.md|notes\.md|index\.md' DIR/proof.md || true (обычная работа с файлами; математику ты не читаешь; пустой вывод означает, что proof.md чист). Если он что-то печатает, proof.md всё ещё ссылается на файлы запуска, которые рецензент открыть не может: запусти судью окончательной доработки ЕЩЁ ОДИН раз с FINALIZE BRIEF, перед которым стоит добавленный первый абзац «DIR/proof.md всё ещё ссылается на файлы запуска (grep нашёл: {совпадения, не более десяти, через запятую}). Рецензент читает один proof.md и открыть их не может. Перепиши DIR/proof.md так, чтобы каждое рассуждение, на которое он опирается, было полностью выписано внутри самого proof.md, без ссылок на какие-либо файлы этого каталога.», запиши «standalone-check: resent» в state.md и прими любой proof.md, который оставит этот запуск (проверку не повторяй). Обнови state.md («phase: finished»). Ответь пользователю: где лежит proof.md, сколько раундов прошло и почему цикл закончился (строка-вердикт скрипта), сколько запросов исполнителям было запущено, сколько из них отвечено и сколько закончились частичными, заменялась ли или поднималась ли цель (одна строка, из state.md; если DIR/result-so-far.md существует, скажи, что в нём лежит прежний результат в том виде, как его написал исполнитель, проверенный только в той мере, как записано в строке о смене цели, и что proof.md и его раздел Status заменяют его), и абзац Status судьи из его ответа окончательной доработки в виде цитаты. Не пересказывай и не оценивай математику сам.

Правила, действующие на всём протяжении

  • Каждый шаг судьи и каждый исполнитель — это НОВЫЙ запуск субагента (инструмент Agent) с явно заданным subagent_type; никогда не опускай его. Субагенты поставляются вместе с этим плагином, и в твоём списке агентов они обычно показаны под именами с областью плагина — math-proof:math-proof-judge, math-proof:math-proof-worker, math-proof:math-proof-worker-deep. Выбирай имя отдельно для каждой из трёх ролей: используй короткое имя (math-proof-judge, math-proof-worker, math-proof-worker-deep), если твой список агентов его предлагает, иначе — имя с областью; смешивать две формы можно (копия с коротким именем в каталоге агентов пользователя или проекта — это способ, которым пользователь меняет настройки одной роли, и она должна иметь приоритет). Если одна из трёх не указана ни под одним именем, сообщи пользователю, что субагентов плагина math-proof нет в списке агентов этой сессии — пусть откроет /plugin, проверит, что math-proof установлен и включён, перезапустит Claude Code и подаст ту же строку /math-proof:siege заново, — и остановись до раунда 1. Запиши в state.md имя, использованное для каждой роли. Шаги судьи используют math-proof-judge. Исполнители — волны раундов и их повторные запуски — используют math-proof-worker в раундах до ESC_ROUND и math-proof-worker-deep в раунде ESC_ROUND и каждом более позднем; исполнители хвоста доказательства (волны дополнительных запросов, волна фиксации, r3_verify) используют math-proof-worker-deep, если волна проходила в раунде ESC_ROUND или позже (R ≥ ESC_ROUND в state.md), и math-proof-worker в остальных случаях. Выбор определяется исключительно номером раунда, никогда твоим собственным мнением о том, как идёт попытка. Никогда не используй повторно, не возобновляй и не отправляй сообщения более раннему субагенту. Не передавай model инструменту Agent: судьи и исполнители работают на модели этой сессии. Запускай всю волну ОДНИМ сообщением, чтобы исполнители работали параллельно; никогда не запускай субагента в фоне.
  • В каждом задании и промте исполнителя ниже DIR означает абсолютный путь к каталогу запуска, а остальные {слоты в фигурных скобках} — названные значения; подставь их и отправь текст в остальном ДОСЛОВНО. Не добавляй ободрений, подсказок, мнений о задаче, сроков или сводок результатов ни в одно задание или промт.
  • Одно фиксированное дополнение к КАЖДОМУ запуску math-proof-judge: после задания добавь пустую строку, строку «Условие задачи (для справки — авторитетный текст находится в DIR/problem.md; руководствуйся файлом везде, где эта копия расходится с ним или выглядит искажённой):» и затем полное содержимое DIR/problem.md байт в байт (ты прочитал его при подготовке). Это справочный материал, чтобы уже первый запрос судьи содержал условие задачи; он не меняет ни одной инструкции задания, а правило заданий о том, что судья не должен копировать условие в файлы запросов, остаётся в силе; DIR/problem.md, который называет каждое задание, остаётся авторитетным текстом. (Промты исполнителей несут тот же текст в фиксированной форме, данной ниже.) Вставляй его точно: копируй текст, который ты прочитал из DIR/problem.md, символ в символ, никогда по памяти и никогда не перепечатывая.
  • Ты никогда сам не пишешь и не правишь файлы запросов, файлы ответов (законченные или частичные), сводки, файлы реестра, notes.md или proof.md. Единственные файлы, которые ты пишешь, — state.md, index.md, копия задачи, запасной r3_verify.md и result-so-far.md (оба только копированием или конкатенацией); помимо этого ты только копируешь или перемещаешь файлы там, где это велит шаг (cp/mv: summary.md и переименования r3_verify.first в хвосте доказательства). Ты не читаешь файлы ответов дальше проверки того, что они существуют (test -s); какие из них закончены, решает скрипт учёта (SCRIPT answers, ниже), а никогда не ты.
  • Промты исполнителей всегда в точности такие, где {Q} — основа имени файла запроса (например, round2_q3, extra_q1, r3_q2, r3_verify), {PROBLEM} — полное содержимое DIR/problem.md байт в байт, а {EARLIER} — пустая строка — кроме случая запуска запроса, о котором последний запуск answers этой волны сообщил «partial»: тогда {EARLIER} — это абзац, приведённый после этого промта, с пустой строкой до и после него: «Файл задачи: DIR/{Q}.md — прочитай его первым; задача относится к условию, приведённому ниже (авторитетный текст задачи хранится в DIR/problem.md; прочитай его, если что-либо в копии ниже выглядит искажённым). Пиши ответ в DIR/{Q}.answer.md по ходу работы, а когда закончишь, каким бы ни был итог, сделай последней строкой файла вот эту завершающую строку, в точности: === END OF ANSWER {Q} === {EARLIER} Условие задачи (дословно, для справки): {PROBLEM}» {EARLIER}, когда он не пуст, — в точности: «Предыдущая попытка исполнителя над этой задачей была прервана на полпути; её незаконченный ответ лежит в DIR/{Q}.partial.md — прочитай его после файла задачи, используй из него всё, что можешь проверить сам, ничему в нём не доверяй как установленному и напиши собственный полный ответ в DIR/{Q}.answer.md, закончив его завершающей строкой выше.» По завершающей строке отличают законченный ответ от такого, где исполнителя прервали на середине (лимитом использования, ошибкой или пределом числа ходов); её проверяет скрипт учёта, а ты — никогда.
  • Проведение волны файлов запросов означает: запустить по одному исполнителю того типа, который использует эта волна (math-proof-worker или math-proof-worker-deep, см. первое правило), на каждый файл, все в одном сообщении. Когда все вернулись — и не раньше: исполнитель, который ещё работает, всё ещё пишет свой файл — выполни SCRIPT answers DIR {Q1} {Q2} … с основами имён файлов запросов волны, отдельной командой, и прочитай, что он печатает, прежде чем писать какую-либо строку индекса или что-либо запускать. Он решает, ничего не читая, какие файлы ответов закончены, и печатает по одной строке на запрос — «{Q}: answered» (DIR/{Q}.answer.md заканчивается завершающей строкой этого запроса: его исполнитель его закончил), «{Q}: partial» (исполнитель что-то записал, но не закончил; скрипт переместил этот незаконченный файл в DIR/{Q}.partial.md, чтобы файл .answer.md всегда означал законченный ответ) или «{Q}: no answer» — и затем строку «TOTAL (n queries): …» с тремя счётчиками (если вместо этого он печатает строку ERROR, можно спокойно исправить команду — сначала DIR, затем основы имён вроде round2_q1 — и запустить снова). Допиши в DIR/index.md ОДНУ строку на запрос: «{Q} | answered | », «{Q} | partial | » или «{Q} | no answer | » как сказал скрипт, а затем первые 300 символов ответа исполнителя тебе (его краткое изложение, а не содержимое файла ответа), заменив переводы строк пробелами, чтобы запись осталась в одной строке. Затем, если — и только если — какой-то запрос волны не отвечен, перезапусти свежего исполнителя на каждый такой запрос (один раз, все в одном сообщении; для отвеченных запросов ничего не запускай; промт частичного запроса несёт абзац {EARLIER}, который передаёт новому исполнителю незаконченный файл), и когда все вернутся, снова выполни SCRIPT answers со ВСЕМИ основами имён волны (отвеченных запросов это не затрагивает) и допиши к существующей строке индекса каждого повторно запущенного запроса (инструментом Edit; второй строки для запроса не добавляется) « | re-run: answered | », « | re-run: partial | » или « | re-run: no answer | » в соответствии с новым отчётом, а затем первые 300 символов ответа нового исполнителя, как раньше (запрос, прерванный дважды, остаётся частичным; скрипт оставляет более длинный из двух незаконченных файлов как DIR/{Q}.partial.md, а другой рядом как DIR/{Q}.partial.prev.md). Итак, строка индекса выглядит как «{Q} | status | abstract», иногда с продолжением « | re-run: status | abstract», и статус повторного запуска, если он есть, — действующий; задания планирования, черновика, доработки и окончательной доработки объясняют судьям, что такое частичный файл. Никогда не запускай исполнителя на запрос между возвратом исполнителя и запуском answers, который его учитывает. Запомни строку TOTAL последнего запуска answers для волны — того, что по всем её основам имён, так что его число n равно размеру волны: ею пользуются правило FLOOR ниже и state.md.
  • Пользователь не будет отвечать тебе в течение этой сессии: никогда не заканчивай ход вопросом, как поступить, не жди подтверждения и никогда не останавливайся досрочно из-за того, что что-то пошло не так — решай по этим правилам и продолжай, пока протокол не закончится или пока правило ниже не велит остановиться. Субагент, вернувший ошибку, прерванный результат или пустой ответ, записывается в index.md / state.md, и протокол продолжается; один потерянный исполнитель — это нормально; шаг судьи, вернувшийся с ошибкой или прерванный, перезапускается один раз немедленно. Если один и тот же шаг судьи проваливается (завершается ошибкой или не пишет ни одного из своих файлов) дважды подряд, остановись и доложи, где всё стоит. Если после окончания волны раунда и её одного повторного запуска answered + partial в последней строке TOTAL меньше числа FLOOR, которое скрипт напечатал в своём вердикте WAVE (вердикты скрининга в расчёт не идут), остановись и доложи: что-то системное неисправно, и продолжать — значит впустую тратить шаги судьи — скажи пользователю, что вероятнее всего причина в лимите использования или сбое, оборвавшем работу исполнителей, что файлы запуска целы и что подача той же строки /math-proof:siege в этом каталоге возобновит запуск, когда причина исчезнет. (Если n в этой строке TOTAL меньше размера волны, ты запустил answers только для части основ — сначала запусти его для всех.) У волн дополнительных запросов и фиксации порога нет.
  • Дополнительные запросы: когда задание черновика или доработки это разрешает, судья может написать до 3 файлов с именами DIR/extra_q{k}.md, используя следующие неиспользованные номера k; на весь запуск положен бюджет в 10 (как только существует DIR/extra_q10.md, больше записывать нельзя — задания об этом говорят). Когда в ответе судьи сказано, что он записал файлы дополнительных запросов, убедись, что они существуют, проведи их как волну (ответы ложатся в DIR/extra_q{k}.answer.md, а для запроса, прерванного дважды, — в DIR/extra_q{k}.partial.md; какой именно вариант, показывает индекс), затем перезапусти тот же шаг ОДИН РАЗ с добавленным первым абзацем: «Твои дополнительные запросы получили ответы: прочитай DIR/extra_q*.answer.md (индекс показывает, какие из них существуют). Закончи шаг сейчас; не пиши в этом шаге новых дополнительных запросов.» Вторая партия дополнительных файлов от перезапущенного шага остаётся на диске без ответа.
  • Переписывай DIR/state.md после каждого шага: протокол, настройки, текущая фаза, счётчики попыток и растущий журнал по одной строке на шаг; строка планирования каждого раунда также записывает предел волны, переданный команде проверки, а строка каждой волны — тип запущенных исполнителей и последнюю строку TOTAL (например, «cap 10, math-proof-worker-deep ×9, answered 8, partial 1, no answer 0»). Это твоя единственная память на случай, если этот разговор когда-нибудь сожмут; если ты не уверен, где находишься, снова прочитай state.md и ${CLAUDE_SKILL_DIR}/SKILL.md.

PLAN BRIEF (раунд {r} из не более чем {MAX_ROUNDS}; {CAP}, {HORIZON}, {CONCLUDE_RULE}, {ESC_SUMMARY} и {ESC_WAVE} зависят от r, см. (a) и ниже)

Шаг: планирование раунда {r} из не более чем {MAX_ROUNDS}.{HORIZON} Файлы: задача — в DIR/problem.md; твои рабочие заметки — в DIR/notes.md; сводка хода работы с прошлого раунда — в DIR/summary.md (в раунде 1 её нет); реестр утверждений — в DIR/ledger.md (отсутствует или пуст, пока в него ничего не записано); результаты прошлого раунда — это файлы DIR/round{r-1}_q*.answer.md, чья строка в DIR/index.md имеет статус «answered» (каждая строка выглядит как «query | status | abstract», иногда с продолжением «| re-run: status | abstract», и тогда действует статус повторного запуска; в раунде 1 их нет), а также DIR/extra_q*.answer.md, если они существуют. У запроса со статусом «partial» вместо этого есть файл DIR/round{r-1}_q{k}.partial.md: заметки движка, который был прерван на полпути. Прочитай и его, ради зацепок и материала для новых запросов, но ничто в нём не установлено — он может подсказать строку OPEN или запрос, но никогда сам по себе — строку PROVED (одно исключение: если в нём лежит полное письменное доказательство или опровержение утверждения [GOAL] либо более ранней, с тех пор поднятой цели, которую всё ещё охватывает правило аудита ниже, то это доказательство считается «имеющимся на руках» для правила аудита точно так, как если бы файл был закончен — ты также пишешь заверенную строку [GOAL], которой требуют правила аудита и завершения, с основой имени этого запроса (например, round3_q2) как локатором — и дальше решают проверочные запросы). (Каждый законченный файл результата заканчивается служебной строкой «=== END OF ANSWER … ===»: она не часть математики; не включай её ни в что, что ты склеиваешь или цитируешь.) Сначала прочитай задачу, свои заметки, сводку, реестр и индекс, затем файлы результатов прошлого раунда — каждый файл один раз, целиком. 0. Сначала скрининг (раунды 2 и позже). Читая файлы результатов прошлого раунда, проверь, что каждый является настоящей попыткой ответить на свой запрос, а не отказом, пустым или почти пустым файлом, текстом не по теме или работой над другой задачей. Запиши DIR/judge/screen_r{r-1}.md по одной строке на запрос этого раунда, в точности «round{r-1}_q{k}: OK» или «round{r-1}_q{k}: DEGENERATE: причина в одну строку» («DEGENERATE: no answer» для запроса, чей статус — no answer; .partial.md частичного запроса проверяется тем же критерием, что и законченный файл — незаконченность сама по себе не вырожденность), и во всём, что ниже, игнорируй каждый файл, который ты пометил DEGENERATE. Это скрининг, а не оценка: неверный, слабый или неполный ответ всё равно OK. Ты руководишь структурированной многораундовой попыткой решить трудную математическую задачу. В каждом раунде ты составляешь запросы, которые независимо отправляются глубокому движку рассуждений с очень большим бюджетом на размышления; результаты возвращаются файлами, и ты сворачиваешь установленное в сводку хода работы, прежде чем составлять следующий раунд. Это раунд {r} из не более чем {MAX_ROUNDS}.{HORIZON} {CONCLUDE_RULE} Сделай три вещи по порядку. 1. Обнови сводку хода работы. Перепиши её с нуля в DIR/round{r}_summary.md: она ЗАМЕНЯЕТ предыдущую сводку и является единственной памятью последующих раундов (и итоговой сборки доказательства) о том, что было раньше, поэтому переноси вперёд всё, что остаётся актуальным. Записывай: что установлено, со ссылкой на файл результата, который это показал (например, round2_q3); многообещающий частичный прогресс; тупики и почему каждый является тупиком; и открытые пробелы между текущим состоянием и целью. Будь честен: завышенная сводка отравляет каждый последующий раунд. Не больше 6000 слов. Затем реши, куда целиться дальше: закончи сводку разделом, называющим, на чём должен сосредоточиться следующий раунд, — заострить самый сильный частичный результат, закрыть самый несущий открытый пробел, проверить то, от чего попытка теперь зависит, или отказаться от тупиковой линии ради свежего взгляда. Ранние раунды обычно исследуют (разные независимые переформулировки и подходы); поздние раунды обычно эксплуатируют (сфокусированные попытки, проверка ключевых шагов). Выбор каждый раз за тобой.{ESC_SUMMARY} 2. Обнови реестр утверждений. Наряду со сводкой запуск ведёт нумерованный реестр утверждений, каждое помечено PROVED, REFUTED или OPEN. В отличие от сводки, реестр никогда не переписывается: строки, которые ты пишешь сейчас, ДОПИСЫВАЮТСЯ дословно (нумерация добавляется за тебя), а существующая запись утрачивает силу только добавлением явной строки RETRACT с её номером. Запиши DIR/round{r}_ledger_block.md, содержащий ТОЛЬКО новые строки этого раунда, по одной на строку, каждая вида «PROVED: утверждение в одно предложение — локатор», «REFUTED: утверждение в одно предложение — локатор», «OPEN: утверждение в одно предложение — локатор» (локатор = основа имени файла результата, например round2_q3), или «RETRACT 4: причина в одно предложение, почему запись 4 больше не действует». Добавляй строку для каждого несущего утверждения, которое этот раунд решил или открыл, новую строку для любого утверждения, чей статус изменился (самая новая строка про утверждение отменяет более старые), и строку RETRACT для всего, что теперь известно как неверное. Держи строки по одному предложению: полный реестр дословно переносится в каждый последующий раунд и в итоговую сборку доказательства — это единственная память об этой попытке, которую нельзя свернуть. Пометь строку, формулирующую главную цель, тегом [GOAL] сразу после слова статуса («PROVED: [GOAL] …», «OPEN: [GOAL] …»), а тегом [AUDIT] пометь строку PROVED, фиксирующую, что отдельный проверочный запрос проверил полную письменную цепочку доказательства (назови локатор этого запроса и сошлись на заверяемую запись как «entry N» или «#N»). Ставь теги по мере появления строк. В раунде 1 напиши ровно одну строку [GOAL]. Если задача фиксирует утверждение, которое нужно решить, то это утверждение — всё утверждение как поставлено, все его части — и есть цель; если задача открытая (улучшить, расширить или усилить данную работу; найти значимый результат о чём-либо), выбери цель сейчас — одно точное утверждение, самый значимый результат, который, по твоей оценке, эта попытка может установить, — и запиши его как строку [GOAL], OPEN, пока не решено. (i) Строки статуса. Пиши ещё одну строку [GOAL] для того же утверждения только при смене его статуса (OPEN → PROVED или REFUTED, либо обратно в OPEN, когда проверочный запрос находит пробел — тогда ещё и RETRACT строки PROVED) — и тогда именно в том раунде, чьи файлы результатов впервые содержат полное письменное доказательство, чтобы проверочные запросы, которые ты составляешь на том же шаге, заверяли строку, которая уже пронумерована, когда придут их ответы, — либо чтобы вернуться к нему по пункту (iv) ниже; никогда не переписывай её просто другими словами, поскольку считается только самая новая строка [GOAL], а строка [AUDIT] должна ссылаться по номеру на заверяемую ею запись [GOAL], которая является самой новой, если с тех пор цель не двигалась (строки в твоём блоке нумеруются дальше от последней записи DIR/ledger.md в порядке файла). (ii) Смена цели. Цель не зафиксирована: на любом более позднем шаге планирования ты можешь поставить новую цель, написав новую строку OPEN [GOAL], и она станет целью с этого момента (это не повод целиться низко в раунде 1: выбирай цель раунда 1 в точности как выше); во всём этом задании «строка [GOAL]» и «утверждение [GOAL]» означают самую новую действующую строку [GOAL] и её утверждение. Есть две причины поставить новую цель. Заменить цель (RETRACT прежней строки [GOAL] — если она была PROVED и доказательство держится, перезапиши то, что она доказала, как обычную строку PROVED без тега — затем напиши новую), если она оказалась ложной, некорректной или уже известной, а также если ты обнаруживаешь, что она уже, чем утверждение, которое ставит сама задача, или отличается от него, — тогда поставленное утверждение становится новой целью (это замена, а не поднятие, даже если более узкая цель уже была PROVED: в задаче, которая фиксирует своё утверждение, вердикт запуска относится к этому утверждению); для цели, которую ты сам выбрал в раунде 1 в открытой задаче, опровержение означает «замени и продолжай» (о цели, к которой ты поднялся, см. (iii)), а строка REFUTED [GOAL] завершает запуск, только когда это утверждение поставила сама задача. Или поднять цель: когда текущая цель PROVED, если более значимый результат теперь кажется достижимым за оставшиеся раунды — более сильное утверждение или общий случай доказанного — напиши новое утверждение как строку OPEN [GOAL] (локатор roundN_plan, где N — номер этого раунда), на том же уровне требований, что и выбор раунда 1 (одно точное утверждение, которое, по твоей оценке, эта попытка может установить, а не такое, которое, насколько ты можешь судить, ложно, некорректно или уже известно). Поднятие — всегда строка OPEN: никогда не пиши как строку PROVED [GOAL] утверждение, более сильное, чем то, что файлы результатов действительно доказывают. Когда задача сама поставила утверждение и оно доказано как поставлено, поднимать не до чего: завершай. (iii) Что оставляет на месте поднятие. Когда ты поднимаешь цель, не отзывай доказанную цель и её строки [AUDIT]: они остаются в силе как обычные записи, и именно этот результат итоговый документ представляет, если поднятая цель не достигнута. Если же проверочный запрос находит пробел в доказательстве цели, от которой ты поднялся, сделай RETRACT её строки PROVED [GOAL] — никогда не оставляй в силе строку PROVED [GOAL], чьё доказательство не прошло проверку, — и заново реши по (ii), какое утверждение является целью (чтобы вернуться к более ранней, запиши её как самую новую строку OPEN [GOAL] и нацель волну на пробел). Опровержение (REFUTED) поднятой цели не является вердиктом запуска, и его опровержению не нужны проверочные запросы (правило аудита ниже — для цели, на которой запуск может завершиться): запиши его как строку «REFUTED: [GOAL] …» с названием опровергающего файла, затем заново сформулируй под ней доказанную тобой цель, как описывает (iv), и завершай на ней. Поднятие — это суждение, а не обязанность: если ничего явно более значимого не кажется достижимым, завершай на доказанной цели по правилу завершения, приведённому выше в этом задании; а если первые две волны, нацеленные на поднятую цель (волна раунда, в котором ты поднял цель, — первая), не приблизили её — нет ни её доказательства, ни нового пути к нему, — то на следующем шаге планирования вернись к уже доказанной цели и завершай. Возвращение имеет приоритет над цепочкой и правилами прогресса из сводки и над правилом эскалации ниже, которые направляют волну на застрявшее утверждение, только пока оно остаётся целью: шаг с возвращением не составляет никаких запросов, кроме проверочных, которых правило аудита всё ещё требует для цели, к которой он возвращается (одна волна аудита, затем завершение). Кроме возврата к уже доказанной цели, не меняй цель на более слабую только потому, что её трудно доказывать: то, что установлено на пути к недостигнутой цели, представляется шагами написания доказательства так, как есть. Более сильные или дальнейшие результаты, которые ты не принимаешь целью, остаются обычными строками PROVED/OPEN и относятся к разделу доказательства «Other routes». (iv) Возвращение. Чтобы вернуться к цели, доказанной ранее (поднятое утверждение не поддалось), заново сформулируй её в блоке этого раунда как строку «PROVED: [GOAL] …» со ссылкой на её более раннюю запись как «entry N» или «#N», поставив её после любой другой строки [GOAL], которая есть в блоке, чтобы она стала самой новой (строки нумеруются в порядке файла), и под ней заново сформулируй её заверения как строки [AUDIT], каждая с локатором своего проверочного запроса, как раньше, и номером новой строки в той же форме (посчитай: если DIR/ledger.md заканчивается записью 23, а заново сформулированная цель — вторая строка твоего блока, это запись 25) — достаточно одной такой строки, если строка заново сформулированной цели ссылается на более раннюю запись, иначе две, из отдельных запросов; затем завершай по правилу завершения. Оставь файл пустым, если никакое утверждение не было решено, открыто, изменено или отозвано. 3. Составь запросы следующего раунда — или заверши. Тогда и только тогда, когда имеющийся материал полностью устанавливает цель, запиши DIR/round{r}_DONE.md с одной строкой, называющей, где материал её устанавливает, и не пиши запросов (если на этом шаге ты поднимаешь цель, составь вместо этого волну для неё — никогда не пиши DIR/round{r}_DONE.md на том же шаге, что и поднятие). Иначе напиши от 1 до {CAP} файлов запросов DIR/round{r}_q1.md, DIR/round{r}_q2.md, … (подряд идущие номера), нацеленных на выбранную тобой мишень. Пока строка [GOAL] имеет статус OPEN, параллельные запросы дёшевы и независимы, поэтому предпочитай использовать большую часть бюджета; делай их по-настоящему разными попытками взять мишень, а не переформулировками одной попытки. Когда полное письменное доказательство (или опровержение) утверждения [GOAL] на руках, волна сжимается: составь проверочные запросы, которых требует правило аудита ниже, плюс не более 2 других, нацеленных на то, что понадобится итоговому документу с доказательством (полная запись следствия, доказательство леммы, которая только цитировалась, независимое второе доказательство). Если же на этом шаге ты поднимаешь цель (пункт 2), волна не сжимается: проверочные запросы для доказанной цепочки всё равно уходят — когда их заверения вернутся в более позднем раунде, запиши их как строки [AUDIT] с их локаторами и ссылкой по номеру на запись PROVED той цели, которую они заверяют, даже если цель с тех пор сдвинулась, — а остальная часть волны, до предела, составляется для новой строки OPEN [GOAL]. Когда это задание содержит правило эскалации ниже, эта часть волны подчиняется ему, а поднятое утверждение считается утверждением [GOAL], доказательства которого нет на руках: сначала вернись и дай сводке раздел «The chain and the missing statement» для поднятого утверждения (правило сводки (iii); если пока ничто его не сводит к чему-то, само поднятое утверждение и есть недостающее утверждение, а его строка OPEN [GOAL] служит его записью в реестре), затем составь эту часть волны по правилу эскалации. Каждый запрос должен быть самодостаточным: движок рассуждений видит ТОЛЬКО этот файл запроса, за которым следует полное условие задачи, — ни сводки, ни реестра, ни других результатов, ни другого раунда, — поэтому включай прямо в текст любой прежний результат или частичное рассуждение, на котором запрос строится (длинные фрагменты вставляй из файла ответа через оболочку, а не перепечатывая). НЕ копируй само условие задачи ни в какой запрос. Правило целеполагания (действует в каждом раунде). Из составленных тобой запросов как минимум половина (с округлением вверх) должна ПЫТАТЬСЯ решить открытые вопросы, которые этот запуск сам отметил: открытые вопросы, названные в файлах результатов, утверждения OPEN в реестре и открытые пробелы в твоей сводке. Помечай каждый такой запрос, делая его ПЕРВУЮ строку в точности «kind: attempt», и называй внутри него конкретный открытый вопрос, который он пытается решить. Запрос-попытка пытается РЕШИТЬ свой вопрос — доказать, опровергнуть или свести к чему-то строго более лёгкому, — а не обозревать его, заново выводить известное вокруг него или шлифовать документ. Вердикт, что вопрос «established: open» (или что цель выходит за пределы современного уровня знаний), НЕ окончателен, и последующие раунды не должны наследовать его как решённый: заново открой вопрос и нацель запросы-попытки прямо на него. Правило аудита (действует в каждом раунде). Всякий раз, когда файл результата на руках даёт полное письменное доказательство (или опровержение) утверждения [GOAL] — или цели, от которой ты поднялся, на этом шаге или раньше (не опровержение цели, до которой ты поднялся: пункт 2 (iii)), — которое заверили менее двух проверочных запросов, как минимум столько запросов этого раунда, сколько ещё не хватает (два или один), должны быть независимыми проверочными запросами этой письменной цепочки — если несколько файлов результатов дают полное доказательство, выбери самое полное и отправь оба проверочных запроса против этой же цепочки. Каждый несёт полное рассуждение дословно — собери файл запроса оболочкой из файла ответа (cat, sed; из частичного файла — по исключению, приведённому у перечня файлов выше), не перепечатывай и не пересказывай его, — и просит пошаговую проверку каждого вывода, заканчивающуюся явным вердиктом о том, доказывает ли цепочка утверждение в точности как оно сформулировано; они считаются запросами-попытками (первая строка «kind: attempt», с названием записи [GOAL], которую они проверяют); два заверения удовлетворяют условию — добавляй третье, только если оно проверяет то, чего два других не проверяют. Когда такое заверение приходит положительным, запиши его как строку PROVED [AUDIT] с его локатором и ссылкой по номеру на запись [GOAL], которую оно заверяет (завершённая строка этой цели, даже если цель с тех пор была поднята); когда реестр после этого удовлетворяет условиям (см. выше), завершай.{ESC_WAVE} Правило обращения к первоисточнику. Текущая сводка — это сжатие, и она может опустить или исказить то, что результат на самом деле говорил. Всякий раз, когда ты опираешься на прежний результат или противоречишь ему — при переписывании сводки, в строке реестра, при выборе мишени или при решении завершить, — сначала прочитай файл ответа этого результата и исходи из того, что в нём на самом деле сказано, а не из пересказа в сводке. Наконец, перепиши DIR/notes.md и ответь менее чем в 150 слов: завершено или нет, сколько файлов запросов и сколько из них запросы-попытки, и мишень одним предложением. Если в этом раунде ты заменил цель, поднял её или вернулся к цели (пункт 2), добавь ещё одно предложение, не входящее в 150 слов, начинающееся с «Goal change:» — что из трёх, какой была цель и какая она теперь (каждая — короткой фразой), и уже доказанный результат, если он держится, с номером его записи в реестре и числом проверочных запросов, заверивших его на данный момент; при поднятии также назови полным путём файл или файлы ответов, содержащие полное доказательство этого результата (форма: «Goal change: raised — entry N, proved in DIR/roundK_qJ.answer.md (certified by M verify queries so far), is …; the goal is now …»).

{CONCLUDE_RULE} при r < MIN_ROUNDS — в точности: «Ты можешь завершить в этом раунде, до раунда {MIN_ROUNDS}, как только в реестре утверждений главная цель будет решена — строка PROVED или REFUTED с тегом [GOAL] («PROVED: [GOAL] …») — и будут как минимум две строки PROVED с тегом [AUDIT]. Каждая строка [AUDIT] — это заверение, возвращённое отдельным проверочным запросом, который проверил полную письменную цепочку доказательства (а не набросок или план); она должна назвать локатор этого запроса (например, round3_q2) и сослаться на строку [GOAL] или на строку, на которую та ссылается, по номеру записи в реестре, написанному «entry 12» или «#12», — как минимум одна строка [AUDIT] ссылается на саму строку [GOAL]. Когда реестр удовлетворяет условиям, реши на этом шаге одно из двух: завершить или поднять цель (пункт 2 ниже говорит, когда и как) и составить волну для поднятой цели. Не проводи дополнительных волн только ради того, чтобы дойти до раунда {MIN_ROUNDS}, или ради шлифовки — шлифовку делают следующие за этим шаги написания доказательства. Ставь теги по мере появления строк. Если реестр пока не удовлетворяет условиям, составь волну (правило аудита ниже говорит, когда она должна содержать проверочные запросы).» — а при r ≥ MIN_ROUNDS — в точности: «Начиная с этого раунда ты можешь завершить, как только имеющийся материал полностью устанавливает утверждение [GOAL] — за исключением того, что если на руках есть полное письменное доказательство, которое заверили менее двух проверочных запросов, то правило аудита ниже действует и в этом раунде (одна волна аудита, затем завершение) — а когда такое доказательство на руках, блок реестра этого раунда уже должен содержать решённую строку [GOAL], записанную в обычной форме реестра «PROVED: [GOAL] …» (или «REFUTED: [GOAL] …») без чего-либо между словом статуса и тегом — то, что оно пока не заверено, не требует отдельной пометки, заверение фиксируют строки [AUDIT], — на том же шаге, на котором составляются его проверочные запросы. Когда утверждение [GOAL] установлено, ты либо завершаешь (после его волны аудита, где применяется правило аудита), либо поднимаешь цель (пункт 2 ниже; поднятие не обязано ждать аудитов), но никогда не делаешь оба действия на одном шаге: шаг, поднимающий цель, не пишет файла DONE, поскольку поднятая цель решается волной, а не завершением. Если ты поднял цель в более раннем раунде, а поднятое утверждение не поддалось, ты можешь завершить на уже доказанной цели, заново сформулировав её как самую новую строку [GOAL], как описывает пункт 2 (iv). В последнем раунде делай именно так, а не позволяй раундам просто кончиться.»

{HORIZON} пуст при r ≤ MAX_ROUNDS−2; при r = MAX_ROUNDS−1 — в точности: « Так что после этого раунда может пройти не более одного раунда.», а при r = MAX_ROUNDS — в точности: « Так что это последний раунд: то, что вернут его запросы, идёт сразу в шаги написания доказательства, без дальнейшего раунда, который мог бы на это отреагировать.» (Обрати внимание на ведущий пробел. {MAX_ROUNDS} в задании — это настройка MAX_ROUNDS, записанная числом, в каждом раунде.)

{ESC_SUMMARY} пуст при r < ESC_ROUND; при r ≥ ESC_ROUND — в точности (с ведущим пробелом): « Начиная с этого раунда сводкой управляют ещё четыре правила; поскольку правило (iii) требует от тебя собственной математики, запиши файл сводки с перенесённым материалом и пунктами (i)–(ii), прежде чем прорабатывать (iii), затем дополни его — сообщение, потраченное только на размышления, может быть прервано, и то, что не записано, теряется. (i) Постоянные результаты: веди раздел с таким названием, перечисляя каждую строку реестра PROVED, которая является теоремой о задаче в целом (для всех параметров), точной переформулировкой или сведением утверждения [GOAL] к названному более простому или классическому утверждению, либо полным решением естественного частного случая — каждую с её локатором, — даже если она сама не может довести цель до конца; никогда не убирай запись из этого раздела (вместо этого пометь её «не на текущей линии»), потому что если цель не достигнута, итоговый документ строится вокруг них. (ii) Тупики: путь считается тупиковым только по точному утверждению, которое было REFUTED, и по файлу результата, который его опроверг, и записывается именно в такой форме. Один файл результата, сообщающий о препятствии, неудачном поиске внутри одного анзаца или одного кандидата или о том, что путь охватывает только часть цели, закрывает этого кандидата, а не путь: перечисли такие пути среди открытых пробелов как «отложен, не опровергнут», открытый для повторной атаки. (iii) Цепочка и недостающее утверждение. Сначала реши, есть ли на руках полное письменное доказательство или опровержение утверждения [GOAL]. Файл результата, доказывающий недостающее утверждение прошлого раунда точно в том виде, как оно сформулировано, когда этой цепочке больше ничего не нужно, ЯВЛЯЕТСЯ таким: в этом случае запиши строку [GOAL] как PROVED (или REFUTED, если это опровержение) в блок реестра этого раунда, сославшись по номерам на записи, которые использует цепочка, и назвав локатор нового доказательства, и составь проверочные запросы правила аудита так, чтобы они несли ВСЮ цепочку — рассуждения цитируемых записей и новое доказательство, каждое вставленное из своего файла ответа, соединённые выводом цепочки в точности так, как его излагает сводка прошлого раунда. Если полное письменное доказательство или опровержение на руках, этим путём или любым другим, пропусти остаток (iii) и весь (iv). Иначе сводка содержит раздел с заголовком в точности «The chain and the missing statement», переписываемый каждый раунд, из четырёх помеченных частей. Chain (цепочка): вывод, по которому утверждение [GOAL] (или его отрицание, когда идёт линия опровержения — тогда читай «доказательство недостающего утверждения» ниже соответственно) следует из результатов, уже PROVED, — они цитируются по номеру в реестре, только формулировки — вместе ровно с ОДНИМ ещё не доказанным утверждением; выпиши вывод по шагам так, чтобы читатель, у которого есть цитируемые записи и доказательство этого одного утверждения, имел бы полное доказательство. Если материал пока не сводит цель к единственному утверждению, возьми в качестве недостающего утверждения самое сильное промежуточное утверждение, которое основной линии нужно следующим, и скажи в цепочке, что останется после него. Missing statement (недостающее утверждение): это одно утверждение, выписанное полностью и самодостаточно — каждый квантор, каждый объект определён, и вместе с ним указана каждая гипотеза задачи, которой оно может пользоваться (утверждение, лишённое нужной ему гипотезы, становится ложным, и его опровержение тогда дискредитирует здравую линию). Оно может нести собственные гипотезы — ограничение на часть объектов или на часть диапазона параметров, — только если цепочка показывает со ссылками на записи PROVED, что всё вне этих гипотез уже решено; утверждение, доказательство которого всё равно оставило бы нерешёнными некоторые из объектов, допускаемых задачей, — это частный случай, а не недостающее утверждение. Из утверждений, которые завершили бы цепочку, предпочитай самое простое и конкретное. Внеси его в реестр как строку OPEN (в качестве локатора пиши roundN_plan, где N — номер этого раунда) при первой формулировке и всякий раз, когда меняется его формулировка — и тогда ещё и RETRACT строки OPEN той формулировки, которую оно заменяет, — чтобы последующие раунды и запросы могли на него ссылаться. Why it should hold (почему оно должно выполняться): твой собственный набросок, не более пятнадцати строк, почему ты в это веришь и каким рассуждением его можно было бы доказать — занимайся этой математикой сам: если ты видишь возможный механизм, любого рода, который его даст, сформулируй его точно; твоя гипотеза, которую движки затем докажут или опровергнут, — одна из самых полезных вещей, которые даёт этот шаг. Tried so far (что пробовали): по одной строке на каждый запрос, уже потраченный на это утверждение или его более раннюю формулировку, — локатор, использованный подход и результат (доказательство частного случая, эквивалентная переформулировка, препятствие, ничего); одинаковые копии одной задачи делят строку; указанный так подход считается опробованным. (iv) Проверка прогресса. Открой раздел о мишени словами о том, дали ли последние два раунда прогресс по цепочке, причём прогрессом считается ТОЛЬКО: доказательство недостающего утверждения; доказательство утверждения [GOAL]; новый результат PROVED, верный для каждого объекта, который допускают гипотезы, и сокращающий цепочку; или замена недостающего утверждения строго более простым (более простым, а не просто более узким), с заново выведенной цепочкой. Решение ещё одной части объектов при открытой трудной части недостающего утверждения — так что утверждение лишь сужается — или эквивалентная его переформулировка записываются в (i), но не являются прогрессом в этом смысле. Если прогресса не было, напиши «main line stalled — no universal progress», скажи одной строкой, что в твоём наброске или разложении отличается от прошлого раунда, и не отвечай на это открытием ещё одного частного случая или обращением к другим путям ради широты: волна (если только пункт 2 (iii) теперь не велит вернуться к уже доказанной цели и завершить) идёт на само недостающее утверждение по Closing rule ниже, а меняться должен твой собственный набросок в (iii) — другой механизм для того же утверждения или другое разложение цепочки с другим недостающим утверждением. Если файл результата ОПРОВЕРГ недостающее утверждение в точности как сформулировано, не спасай его простым исключением класса контрпримера (если только запись PROVED уже не решает этот класс и цепочка этого не говорит): либо сформулируй исправленное недостающее утверждение и заново выведи для него цепочку полностью, либо запиши линию как тупиковую по (ii) и построй цепочку следующей наиболее многообещающей линии. Начиная с этого раунда «проверка» как мишень означает только аудиты цели по правилу аудита и ту единственную проверку цепочки, которую допускает пункт (c) правила Closing rule.»

{ESC_WAVE} пуст при r < ESC_ROUND; при r ≥ ESC_ROUND — в точности (с ведущим пробелом; {CAP} подставляется как в других местах): « Правило эскалации (этот раунд и каждый последующий, пока на руках нет полного письменного доказательства или опровержения утверждения [GOAL] — как только оно есть, включая случай, описанный правилом сводки (iii), когда доказанное недостающее утверждение завершает цепочку, правило аудита и сжатая волна выше берут управление на себя, а (a)–(c) ниже тогда игнорируются). Движки, отвечающие в этом раунде, имеют куда больший бюджет на размышления, чем в начальных раундах, и волна может содержать до {CAP} запросов: используй большую их часть и трать её на недостающее утверждение твоей цепочки, сформулированное полностью, а не на обзоры и не на широту ради самой широты. (a) Каждый запрос атакует: он пытается решить недостающее утверждение, само утверждение [GOAL] или вопрос, ответ на который решил бы или строго свёл бы одно из них (решение лишь для части объектов не является сведением). Не трать запросы на изложение, шлифовку, повторный вывод или проверку результатов, которые не завершают цепочку [GOAL] — этим занимаются шаги написания доказательства после раундов, со своим бюджетом запросов, — так что единственные проверочные запросы раунда — это запросы правила аудита (проверочные запросы, заверяющие цель, которая была доказана, а потом поднята, считаются запросами правила аудита) и та единственная проверка цепочки, которую допускает пункт (c). Не трать запрос на просьбу к движку вспомнить или восстановить доказательство из литературы, утверждения [GOAL] или чего-либо другого: у движков нет библиотеки, и такая задача не даёт им материала для рассуждений (использование известных теорем внутри атаки — другое дело, и оно допустимо). (Только в последних двух раундах — начальная строка этого задания «Step: plan round …» тогда скажет об этом явно, словами «one further round» или «the final round»; если в ней нет ни того, ни другого, это не один из них — до двух запросов могут вместо этого проверить или полностью записать постоянные результаты, которые будет представлять итоговый документ.) (b) Closing rule (правило завершения). Напиши ОДИН файл задачи, который просит полное доказательство в точности недостающего утверждения твоей цепочки — или же явный контрпример к нему — и содержит: утверждение дословно так, как его излагает сводка; каждый прежний результат, на который оно может опираться, вставленный полностью вместе с доказательством из файлов ответов (cat, sed — никогда не пересказывая); вывод [GOAL] из него по цепочке, чтобы движок видел, для чего утверждение нужно, и мог сказать об этом, если сам этот вывод ошибочен; твой набросок того, почему оно должно выполняться, предложенный как подсказка, которую движок вправе отбросить; и явное предложение о том, что доказательство утверждения лишь для части охватываемых им случаев — подкласса его объектов или поддиапазона его параметров — не отвечает на вопрос, хотя о нём следует сообщить, если больше ничего найти не удалось. Сохрани его как файл запроса q1 этого раунда (первый из названных выше файлов) и скопируй байт в байт (cp) в q2 и q3: три движка независимо пытаются решить одно и то же утверждение — независимые попытки над одним корректно поставленным утверждением здесь ценнее, чем по одной попытке на три утверждения. Эти одинаковые копии задуманы (указание выше против переформулировок одной попытки на них не распространяется), и все три — запросы-попытки (первая строка «kind: attempt», с названием недостающего утверждения как открытого вопроса, который они пытаются решить). (c) Остальные запросы — используй большую часть предела — тоже идут на недостающее утверждение, каждый самодостаточен (несёт те же вставки, если ниже не сказано иное), и каждый — либо ещё одна побайтовая копия задания из Closing rule (допустимо: это ещё одна независимая попытка), либо что-то по-настоящему от него отличающееся: атака названным подходом, которого нет в списке «Tried so far» (назови его в задании; движок может отойти от него, если объяснит почему); или продолжение подхода из списка с частичного результата, который он вернул, с этим результатом, вставленным в текст; или самый трудный отдельный шаг твоего собственного наброска, вырезанный и поставленный как самодостаточное утверждение; или единственное препятствие, поднятое файлом результата против утверждения, поставленное как то, что нужно преодолеть или заострить до контрпримера. В первом раунде, когда ставится недостающее утверждение, и снова всякий раз, когда меняется его формулировка, один из этих запросов вместо этого пытается ОПРОВЕРГНУТЬ его в точности как сформулировано — явным построением или выводом из него чего-то заведомо ложного. Когда одно и то же недостающее утверждение уже атаковали в двух предыдущих раундах, одному из этих запросов даётся только само утверждение и формулировки цитируемых записей (без доказательств, без наброска), и его просят сначала самому вывести, что утверждение завершило бы [GOAL], а затем атаковать его первым ходом, которого не использовала ни одна из перечисленных попыток, — движок, который обнаруживает, что вывод не проходит или что утверждение неправдоподобно, говорит об этом, и это результат, на который нужно реагировать по правилу сводки (iv). НЕ БОЛЕЕ ДВУХ запросов волны могут идти в другое место: на пути, от которых основная линия не происходит (отложены, не опровергнуты, по правилу сводки (ii)), или — не более одного из них — на проверку одного шага PROVED, на котором держится цепочка и который ещё не проверял отдельный запрос. Все они — запросы-попытки (первая строка «kind: attempt»).»

DRAFT BRIEF

Шаг: черновик доказательства. Файлы: задача — в DIR/problem.md; твои рабочие заметки — в DIR/notes.md; твоя текущая сводка всего, что установила попытка, — в DIR/summary.md; реестр утверждений — в DIR/ledger.md; результаты последнего раунда — это самые новые файлы DIR/round{R}_q*.answer.md, помеченные answered и не DEGENERATE в DIR/index.md; файлы результатов всех более ранних раундов и DIR/extra_q*.answer.md лежат там, и к ним можно обращаться по имени (файл DIR/…_q{k}.partial.md, там, где индекс помечает запрос как partial, — это незаконченные и непроверенные заметки прерванного движка: только зацепки, ничто в нём не установлено; а строка «=== END OF ANSWER … ===», закрывающая каждый законченный файл, — служебная, а не математика). Сначала прочитай задачу, заметки, сводку, реестр и результаты последнего раунда. Ты руководишь структурированной многораундовой попыткой решить трудную математическую задачу. Раунды завершены. Теперь твоя задача: написать DIR/proof.md, содержащий сильнейший путь к цели — самое полное рассуждение, которое нашла попытка, — с полностью выписанным рассуждением,{PARTIALS} плюс короткую заметку о каждом другом пути, который стоит зафиксировать, и честное изложение всего, что остаётся пробелом, — чётко помеченный пробел ценнее замазанного. Если самая новая строка [GOAL] не PROVED — либо PROVED, но не заверена двумя строками [AUDIT], и её письменное доказательство не выдерживает твоей собственной проверки — а в реестре в силе есть строка PROVED [GOAL] для другого утверждения (цель, которая была достигнута, а затем поднята; если таких несколько, самая недавняя), то именно эта доказанная цель является главным утверждением proof.md. Изложи её как теорему документа и выпиши её полное рассуждение целиком по файлам результатов, которые называет для неё реестр (если файл, названный реестром, — это файл .partial.md, возьми текст из файлов проверочных запросов, которые его несли и чьи ответы его заверили); это не один из менее значимых результатов. Поднятая цель идёт после неё, как утверждение, которое пытались доказать, вместе со всем, что было установлено на пути к ней, и раздел Status говорит, что есть что. Используй python3 всякий раз, когда конкретное вычисление подтвердит или убьёт шаг: проверь предполагаемое тождество на примерах, проверь константу, численно проверь заявленный контрпример. Проверка лучше веры. Если один или несколько целевых запросов глубокого рассуждения решили бы несущий вопрос, ты можешь записать их как следующие неиспользованные файлы DIR/extra_q{k}.md (не более 3 на этом шаге; ни одного, если уже существует DIR/extra_q10.md), каждый самодостаточный — движок видит только этот файл, за которым идёт условие задачи, — поэтому включай прямо в текст всё, на чём он строится, и не копируй в него задачу, — и скажи в своём ответе, что ты это сделал; на них ответят, и тебя вызовут ещё раз. Запиши DIR/proof.md на этом шаге в любом случае. Перепиши DIR/notes.md. Ответь менее чем в 150 слов.

{PARTIALS} пуст в КОРОТКОМ хвосте и всегда, когда R < ESC_ROUND; в ПОЛНОМ хвосте при R ≥ ESC_ROUND — в точности (с ведущим пробелом): « и — поскольку самая новая строка [GOAL] не заверена — также выписанные полностью вместе с доказательствами в основном тексте (после теоремы более ранней доказанной цели, когда применимо предложение ниже о поднятой цели) и перед изложением того, что остаётся открытым: каждый результат PROVED в реестре или сводке, который решает естественный частный случай, даёт точную переформулировку или сведение цели (изложи как теорему: «утверждение верно для всех … при условии …»), либо отождествляет цель или её открытое ядро с названным известным утверждением, самые общие первыми — для цели, которую попытка не решила, рецензент судит о ней по сведениям и частичным результатам, которые она действительно устанавливает, так что это и есть документ, а не побочные заметки;»

REFINE BRIEF (имя шага {S} = refine_2, refine_3, … по порядку)

Шаг: {S}. Файлы: задача — в DIR/problem.md; твои рабочие заметки — в DIR/notes.md; текущий черновик — DIR/proof.md; файлы результатов — DIR/round*_q*.answer.md (результаты всех раундов) и DIR/extra_q*.answer.md, перечисленные со статусом в DIR/index.md (у запроса со статусом там «partial» вместо этого есть DIR/…_q{k}.partial.md, незаконченные и непроверенные заметки прерванного движка: зацепки, а не результаты; а строка «=== END OF ANSWER … ===», закрывающая каждый законченный файл, — служебная, а не математика); реестр утверждений — DIR/ledger.md, а текущая сводка — DIR/summary.md. Сначала прочитай задачу, свои заметки и черновик; обращайся к любому файлу результата по имени, когда понадобится. Ты ведёшь структурированную параллельную попытку решить трудную математическую задачу и находишься между волнами. Твоя задача на этом шаге: сделать proof.md строго лучше. Заново выведи самые слабые шаги, ищи ошибки как враждебный рецензент и используй python3, чтобы проверить каждое конкретное вычислительное утверждение, на которое ты опираешься. Если один целевой запрос глубокого рассуждения решил бы несущий пробел, ты можешь записать его как следующий неиспользованный DIR/extra_q{k}.md (не более 3 на этом шаге; ни одного, если уже существует DIR/extra_q10.md), самодостаточный — движок видит только этот файл, за которым идёт условие задачи, — поэтому включай прямо в текст всё, на чём он строится, и не копируй в него задачу, — и скажи в своём ответе, что ты это сделал. Затем перепиши DIR/proof.md целиком, предварительно сохранив входящий черновик как DIR/judge/{S}_previous_proof.md. Будь честен в том, что остаётся пробелом, — чётко помеченный пробел ценнее замазанного. Перепиши DIR/notes.md. Ответь менее чем в 150 слов.

SELECT BRIEF

Шаг: выбор путей для волны фиксации. Файлы: задача — в DIR/problem.md; твои рабочие заметки — в DIR/notes.md; черновик доказательства — в DIR/proof.md; результаты последнего раунда (и любой более ранний файл результата, который тебе нужен) по DIR/index.md (запрос, помеченный там как «partial», имеет лишь непроверенные заметки в DIR/…_q{k}.partial.md от движка, прерванного на полпути); реестр утверждений — DIR/ledger.md. Ты ведёшь структурированную параллельную попытку решить трудную математическую задачу; у тебя есть черновик доказательства и полные результаты поиска. Твоя задача — шаг фиксации протокола: любой результат с конкретным путём (названная цепочка лемм, конкретная конструкция) к цели получает запрос фиксации с полным бюджетом на размышления: «Маршрут: [путь]. Напиши полное строгое доказательство.». Плюс один проверочный запрос, который проверяет рассуждение черновика доказательства шаг за шагом. (Если цель была доказана, а более поздняя, поднятая цель — нет, главное утверждение черновика — доказанная цель; конкретные пути к поднятой цели по-прежнему можно фиксировать.) Выбери не более {MAX_COMMIT} путей, которые стоит зафиксировать (меньше — тоже хорошо: только пути с чем-то конкретным). Для каждого напиши запрос как DIR/r3_q1.md, DIR/r3_q2.md, …, включив фактическое содержание пути (а не ссылку на него — движок не видит ничего, кроме файла запроса, за которым идёт условие задачи). НЕ копируй условие задачи ни в какой запрос. Также напиши ровно один DIR/r3_verify.md, содержащий полный текущий черновик доказательства (скопированный целиком из DIR/proof.md оболочкой — cat, — а не перепечатанный) и просящий пошаговую проверку: для каждого неравенства, перестановки, цитируемого результата и «отсюда следует» — действительно ли это следует так, как написано; перечислить каждую ошибку или пробел по убыванию серьёзности и прямо сказать, доказано ли главное утверждение. Используй python3, если быстрое вычисление решит, какие пути настоящие. Перепиши DIR/notes.md. Ответь менее чем в 100 слов списком записанных файлов.

FINALIZE BRIEF

Шаг: окончательная доработка. Файлы: задача — в DIR/problem.md; твои рабочие заметки — в DIR/notes.md; черновик доказательства, ушедший в волну фиксации, — в DIR/proof.md; результаты волны фиксации — DIR/r3_q*.answer.md, а отчёт проверочного запроса — DIR/r3_verify.answer.md (DIR/index.md показывает, какие из них существуют; если ни одного нет, дорабатывай по черновику; запрос, помеченный в индексе как «partial», вместо этого имеет DIR/r3_q{k}.partial.md или DIR/r3_verify.partial.md, незаконченные заметки прерванного движка — непроверенные, так что доказательство в них — это зацепка для проверки, а не результат, а пробелы, перечисленные в прерванном проверочном отчёте, всё равно стоит проверить, хотя отсутствие его итогового вердикта ничего не говорит ни в ту, ни в другую сторону; строка «=== END OF ANSWER … ===», закрывающая каждый законченный файл, — служебная); реестр утверждений — DIR/ledger.md. Прочитай всё это. Ты ведёшь структурированную параллельную попытку решить трудную математическую задачу. Волна фиксации вернулась. Твоя задача — заключительный шаг протокола: собрать итоговый proof.md из лучшего результата фиксации (или из черновика, если ни один запрос фиксации не дал лучшего). Итерируй: если проверочный запрос нашёл пробелы, исправь то, что можно исправить, по имеющемуся материалу; используй python3, чтобы проверить каждое конкретное вычислительное утверждение, на которое ты опираешься. Будь честен в итоговом документе в том, что остаётся пробелом, — чётко помеченный пробел ценнее замазанного. Итоговый документ должен излагать ответ на задачу и давать полное рассуждение, затем короткий раздел «Status», прямо говорящий, доказано ли полностью главное утверждение, и перечисляющий всё, что остаётся пробелом, и короткий раздел «Other routes» обо всём остальном, что стоит зафиксировать{PARTIALS_FIN}. Если самая новая строка [GOAL] не PROVED — либо PROVED, но не заверена двумя строками [AUDIT], а её письменное доказательство не выдерживает проверочного отчёта и твоих исправлений — а в реестре в силе есть строка PROVED [GOAL] для другого утверждения (цель была поднята после достижения; если таких несколько, самая недавняя), то главное утверждение — это доказанная цель, изложенная и доказанная как теорема документа, а не представленная как менее значимый результат. Поднятая цель сообщается после неё как та, что пытались доказать, а не как пробел в главном утверждении, и раздел Status прямо говорит, какое утверждение главное и что поднятая цель не достигнута. proof.md читает самостоятельно рецензент, который не может открыть ни один другой файл этого каталога: никогда не ссылайся в нём на файлы запуска (r*_q*, extra_q*, *.answer.md, проверочный отчёт, заметки, скрипты); выписывай каждое рассуждение, на которое опираешься, полностью в proof.md, переписывая его по файлам исполнителей, если нужно. Сначала сохрани входящий черновик как DIR/judge/finalize_previous_proof.md, затем запиши итоговый DIR/proof.md. Перепиши DIR/notes.md. Ответь менее чем в 200 слов: сначала строка, начинающаяся в точности «MAIN CLAIM: PROVED» или «MAIN CLAIM: NOT PROVED» (вердикт твоего раздела Status о главном утверждении proof.md, как оно определено выше; PROVED здесь означает, что главный результат документа — доказательство или опровержение этого утверждения — полон), затем в той же строке тире и это главное утверждение одной фразой, затем абзац Status.

{PARTIALS_FIN} пуст в КОРОТКОМ хвосте и всегда, когда R < ESC_ROUND; в ПОЛНОМ хвосте при R ≥ ESC_ROUND — в точности (с ведущим пробелом): « (только намеченные или не развитые пути — тогда как каждое сведение, переформулировка или частный случай PROVED, относящиеся к цели, принадлежат основному тексту, выписанные полностью, самые общие первыми)»

Перевод: iiuniversitet. Оригинал: https://github.com/anthropics/claude-plugins-official/tree/main/plugins/math-proof/skills/siege, лицензия Apache-2.0. Изменения: перевод на русский язык.

Оригинал на английском
---
name: siege
description: "Work on one hard mathematics problem in rounds: each round a judge writes a few self-contained questions, independent workers answer them, and the judge keeps a ledger of what is proved, refuted and open, until the judge concludes or the rounds run out, and then a proof.md says plainly what is and is not proved. A run takes hours and dozens of worker runs. Usage: /math-proof:siege [NAME=value settings] <the problem, stated in full, or the path of a file holding it>."
argument-hint: "[NAME=value ...] [DIR=run-directory] <problem statement | problem-file>"
disable-model-invocation: true
disallowed-tools: WebSearch, WebFetch, AskUserQuestion
allowed-tools: Read, Write, Edit, Glob, Grep, Agent, Bash(python3 ${CLAUDE_SKILL_DIR}/scripts/ledger.py *), Bash(python3 ${CLAUDE_PLUGIN_ROOT}/skills/siege/scripts/ledger.py *), Bash(python ${CLAUDE_SKILL_DIR}/scripts/ledger.py *), Bash(python ${CLAUDE_PLUGIN_ROOT}/skills/siege/scripts/ledger.py *), Bash(mkdir *), Bash(cp *), Bash(mv *), Bash(cat *), Bash(test *), Bash(ls *), Bash(wc *), Bash(cmp *), Bash(grep *), Bash(printf *), Bash(echo *)
---

# math-proof: siege

## The approach
The skill works on one problem in at most MAX_ROUNDS rounds. Each round a judge writes a few self-contained
questions, at most WAVE of them before round ESC_ROUND. The steps below call them queries. Each question goes
to a fresh worker that sees only that question and the problem statement. The judge reads the answers,
rewrites the running summary, and adds to a ledger of claims marked PROVED, REFUTED or OPEN. One claim is the
goal, set in round 1; the judge may set a new goal at a later round, and in particular may raise it to a more
significant statement once it is proved (the proved goal then stays in the ledger as the fallback result, to
which the judge returns if two waves bring the raised goal no nearer; when the goal is raised you tell the user and
copy the proved result to DIR/result-so-far.md). When an answer holds a complete written proof or disproof of the goal, two more workers check that exact text
line by line. Once both pass, the judge concludes or raises the goal. Before round MIN_ROUNDS, that is the only
way to conclude. From round ESC_ROUND on, if no complete proof or disproof is in hand, a round may
hold up to WAVE_DEEP questions for higher-effort workers. All but at most two of them aim at the one statement
still missing from the proof. After the rounds end, the judge writes a self-contained proof.md, a worker
checks it, and the judge finalizes it. Unless the goal the run ends on was both proved and checked twice during
the rounds, there are also extra revision passes and a last wave of full proof attempts before finalizing.
proof.md has a Status section that says plainly what is and is not proved. This section is only a summary: you do none of the mathematics
yourself, and you follow the steps below exactly, launching a fresh sub-agent for every judge step and every
worker.

You are the ORCHESTRATOR of this protocol. You do not do the mathematics yourself and you do not judge it:
the judging is done by fresh `math-proof-judge` subagents, one per step, and the reasoning by fresh `math-proof-worker` or
`math-proof-worker-deep` subagents, one per query (which of the two is fixed by the round number — see Rules). Your job is to run the steps below exactly, keep the files in order, act on the one
mechanical verdict the bookkeeping script prints, and never skip, merge or reorder steps because the problem
looks easy or hard. Do not read the workers' answer files yourself (use `test -s` to see whether one exists;
the bookkeeping script, not you, decides whether it is finished); do not summarize mathematics in your own words anywhere a judge will read it — pass files, not
paraphrases. Work unattended to the end: there is nobody to answer questions.

**Arguments.** The invoking message reads: $ARGUMENTS
It gives the problem and, optionally, settings. Read it this way. Tokens of the form NAME=value at its start,
where NAME is a word of two or more capital letters and underscores and value is a whole number (or, for DIR,
a path, quoted if it contains spaces), are settings (the seven below, or DIR, the run directory; any other such
NAME is an error, see Settings); remove them. If what remains is a single line that, taken as a whole —
surrounding whitespace and one pair of enclosing quotation marks removed, backslash-escaped spaces read as spaces
— is the path of an existing file (it may contain spaces; check with Read or Glob, not the shell), that file is
the problem file; if no such file exists and what remains can only be a file path — a single line ending in .md,
.txt or .tex, or a single token (no spaces once the quotes are removed) containing "/" or "\" — tell the user in
one sentence that no file exists at the absolute path you looked for (give it) and that the problem can instead
be given in full as text after the command, and stop; otherwise everything that remains, to the end of the
message, IS the problem statement, verbatim — mathematics, line breaks and all (MAX_ROUNDS=8 is a setting;
"n=3", "N=pq", "AB=AC" and "f(x)=…" are mathematics). The run directory DIR defaults to ./math-proof-run under the
current directory; use DIR's absolute path everywhere below. If the message holds neither a readable problem
file nor any problem text, say so in one or two sentences — with the usage, `/math-proof:siege [NAME=value …]
<problem statement, or the path of a file holding it>`, and that a stopped run is resumed by giving its
original line again in the same directory — and stop.
**Settings** (use these unless the invoking message overrides them by name): ESC_ROUND = 4 (the escalation
round: from round ESC_ROUND on, if the loop is still running, the wave cap rises, every worker is a
`math-proof-worker-deep`, and the plan brief carries its escalation clauses); WAVE = 4 queries per round at most in
rounds before ESC_ROUND and WAVE_DEEP = 10 queries per round at most from round ESC_ROUND on; MAX_ROUNDS = 14;
MIN_ROUNDS = 4 (the judge may conclude freely from round MIN_ROUNDS on, earlier only with an
audited chain in the ledger — the script decides); REFINE_STEPS = 2; MAX_COMMIT = 9 (both apply to the FULL proof tail; a run whose final goal was certified during the rounds gets the SHORT tail — see "The proof tail"). The invoking message may override any of these seven by
name, with tokens of the form NAME=value (for example MAX_ROUNDS=8 WAVE_DEEP=6) placed before the problem, at
the start of the invoking message: use the values as given, and treat such a token there (NAME a word of two or
more capitals and underscores, value a whole number) whose NAME is neither one of the seven nor DIR as an error — tell the user in one sentence
that NAME is not a setting of /math-proof:siege, that the accepted names are DIR, ESC_ROUND, WAVE, WAVE_DEEP,
MAX_ROUNDS, MIN_ROUNDS, REFINE_STEPS and MAX_COMMIT, and that if the token is part of the problem itself the
problem can be given as a file path instead — and stop before creating anything. (A leading token whose
left-hand side is a single letter or not all capitals, or whose right-hand side is not a whole number, and any
"=" further inside the problem statement, is mathematics, not a setting.)
Wherever a setting is named below, it means the value in force.
The bookkeeping script is scripts/ledger.py in this skill's own folder: `python3 ${CLAUDE_SKILL_DIR}/scripts/ledger.py`
(called SCRIPT below). If that placeholder was not filled in — the path before /scripts does not exist — use
`${CLAUDE_PLUGIN_ROOT}/skills/siege/scripts/ledger.py`, and if that one is unfilled too, Glob for
`**/skills/siege/scripts/ledger.py` under ~/.claude and use its absolute path (if several match, the newest); in
every case quote the script path in the command if it contains spaces. Before Setup, run SCRIPT once with no
further arguments: it should print a line beginning "usage:". If instead Python runs but says it cannot open the
script file, the path is wrong, not Python: resolve it again by the fallbacks above and run once more, and if no
ledger.py can be found tell the user the plugin's files are not where expected (reinstall math-proof from
`/plugin`) and stop. If instead the shell says python3 cannot be found, or anything else comes back that is not
the usage line (on Windows, a reply that Python "was not found" and can be installed from the Store is this
case), use `python` in place of `python3` in SCRIPT from then on and run it once more; if that fails too, tell
the user in one or two sentences that /math-proof:siege could not run its bookkeeping script — quote the command
and the shell's reply — that it needs Python 3.7 or later on the PATH as python3 or python, and that the same
line given again will work once that is fixed; then stop.

## Setup
1. If DIR/state.md already exists, this is a resume: check that the existing DIR/problem.md is the same problem
   you were given (compare the text, ignoring differences in whitespace and line endings; for a file, `cmp`) —
   if it differs, say in one sentence that DIR holds a run on a different problem and that `DIR=<another
   directory>` selects a fresh one, and stop; if it is the same and state.md records "phase: finished", that run
   is complete: say where DIR/proof.md is (and DIR/result-so-far.md, if it exists), that `DIR=<another
   directory>` starts a fresh run, and stop; otherwise Read DIR/problem.md in full, read state.md and
   resume from the phase it records instead of starting over, never redoing a step whose output files exist and
   never rewriting DIR/problem.md (if the invoking message gives settings that differ from those recorded in
   state.md, include one line saying the recorded ones govern this run in the same message as your next tool
   call — a notice, not a stop). If the phase recorded is a wave, start with `SCRIPT answers` on that wave's
   query stems (see the wave rule under Rules) and launch workers only for the queries the script does not report
   answered, each partial one with its {EARLIER} paragraph; that launch counts as the wave's first, so its one
   re-run still follows. A query already answered whose index line is missing gets the line
   "{Q} | answered | (finished before this session resumed)"; a query that already has an index line gets no
   second one — its new status is appended to that line as " | re-run: status | abstract" instead.
   Otherwise create DIR and DIR/judge/ (`mkdir -p`) and put the problem at DIR/problem.md: if
   it came as a file, copy that file there byte for byte with `cp`; if it came as text in the invoking message,
   Write exactly that text (nothing added, removed or reworded) to DIR/problem.md. Then, as your very next
   action, Read DIR/problem.md in full — you paste its text into every judge brief and every worker prompt (see
   Rules).
2. Write DIR/state.md (protocol math-proof siege, the seven settings with the values in force — marking any the invoking
   message overrode —, "phase: round 1 plan, attempt 1"). On a resume, the values recorded in state.md govern.

## The round loop — for r = 1, 2, …, MAX_ROUNDS
**(a) Plan.** Launch ONE `math-proof-judge` whose prompt is the PLAN BRIEF below with {r}, DIR and the round-dependent
slots filled in (and, on a retry, the correction paragraph the script gave you added at the top). The slots:
{CAP} is this round's cap on the number of queries — the Setting WAVE while r < ESC_ROUND, the Setting
WAVE_DEEP when r ≥ ESC_ROUND — and the same number goes into the check command of (b); {MAX_ROUNDS} is the MAX_ROUNDS setting, written as a number; {HORIZON}, {CONCLUDE_RULE}, {ESC_SUMMARY} and {ESC_WAVE} are the texts given
after the brief for this r (several are empty before round ESC_ROUND: an empty slot inserts nothing, not even
a space or a blank line). This is attempt 1 of round r.
**(b) Check.** First, if DIR/judge/screen_r{r-1}.md exists and round r−1's lines in DIR/index.md carry no screening verdict yet,
append each of its verdicts (" | OK" or " | DEGENERATE: …") to that query's index line — plain file handling; nothing is
re-run on a DEGENERATE verdict. Then run `SCRIPT check DIR {r} {CAP} {MIN_ROUNDS} {attempt}` ({CAP} = this round's cap, WAVE or WAVE_DEEP, exactly as in (a) —
passing WAVE in round ESC_ROUND or later would silently set part of the wave aside). It numbers and appends the round's
ledger lines to DIR/ledger.md itself and prints exactly one verdict line; act on its first word (if instead it prints a line
beginning `ERROR:`, the command itself was malformed — DIR first, as an absolute path, then the four numbers; correct
the command and run it again, which does not count as a plan attempt):
- `WAVE n FLOOR f …` — copy DIR/round{r}_summary.md over DIR/summary.md, note f (the fewest queries of this
  wave that may come back answered or partial, see Rules), give the goal-change notice below if one is due, then
  go to (c) with the query files DIR/round{r}_q1.md … DIR/round{r}_q{n}.md (the script has renumbered them
  consecutively if needed).
- `CONCLUDE …` — copy DIR/round{r}_summary.md over DIR/summary.md, record the verdict line in state.md as the
  reason the loop ended, give the goal-change notice below if one is due, and leave the loop for the proof tail.
- `RETRY: <correction>` — relaunch the plan step (a) as the next attempt, with the text after "RETRY: " as an
  added first paragraph of the brief; then run (b) again with the attempt number increased by one.
- `TAIL: <reason>` — the plan step failed three times; record the reason in state.md, copy
  DIR/round{r}_summary.md over DIR/summary.md if it exists and is non-empty, and leave the loop for the proof
  tail — unless no DIR/summary.md exists and no .answer.md or .partial.md file exists at all (nothing to draft
  from): then stop and report instead.
Goal-change notice: on a `WAVE` or `CONCLUDE` verdict, if the reply of the plan launch this verdict accepted (the
latest attempt) has a sentence beginning "Goal change:" (the judge replaced, raised or came back to a goal this
round — item 2 of the brief), give the user that sentence, quoted, as one line of text in the same message as your
next tool call (a notice, not a question: a message of text alone would end your turn — do not stop or wait), and
record the same line in state.md. If the sentence begins "Goal change: raised", first copy the file or files it
names as holding the earlier goal's proof (`test -s` each) to DIR/result-so-far.md — one file: `cp`; several: one
`cat <files in the order named> > DIR/result-so-far.md` (each ends with its own end line, which separates them)
— overwriting any earlier result-so-far.md, and end your line with "the proved result so far is in
DIR/result-so-far.md". If the sentence names no file, take `<stem>` from the locator after the final "—" of the last
line of the form "N. PROVED: [GOAL] …" in DIR/ledger.md (grep) and use `DIR/<stem>.answer.md`, or
`DIR/<stem>.partial.md` if only that exists; `test -s` each file first, and if none exists, skip the copy and say
so in your line. That file is for a user who stops the run here; nothing later reads it, and proof.md remains the
run's deliverable. (On a problem that fixes its claim a raise never happens — there is nothing to raise to — so
the file is never written; a replacement is still announced.)
In every case record in state.md the number R of the last round whose wave actually ran (R = r after (c)–(d)
complete; when the loop is left at round r before its wave, R = r−1; R = 0 if no wave ever ran). The DRAFT BRIEF
needs it.
**(c) Wave.** Run the wave of the round's query files (see Rules: one worker per file — `math-proof-worker` in rounds
before ESC_ROUND, `math-proof-worker-deep` from round ESC_ROUND on —, all in one message, the script's `answers` verdicts, index lines, one
re-run of the queries not answered, then the FLOOR stop rule).
**(d) Screen (no launch).** There is no separate screening step: the next round's plan judge screens this wave's
answers itself (PLAN BRIEF, item 0) and writes DIR/judge/screen_r{r}.md; step (b) of the next round copies its
verdicts into the index. Update state.md ("phase: round {r+1} plan, attempt 1"; R = r) and continue the loop.

## The proof tail (after the loop ends, by CONCLUDE, TAIL, or finishing round MAX_ROUNDS)
First fix the tail's shape: run `SCRIPT gate DIR`. If its output begins `CONCLUDE`, the claims ledger holds the
headline goal settled and certified by two separate verify queries, and the tail is SHORT: (e) draft, (f) no refine step, no select step — build DIR/r3_verify.md yourself by the shell concatenation described under (g) and
write no r3_q files —, (h) a commit wave consisting of DIR/r3_verify.md alone, (i) finalize. If it prints
anything else (normally `REJECT: …`), the tail is FULL: steps (e)–(i) exactly as written below — except that a line
beginning `ERROR:` means the gate command itself was malformed (DIR first, as an absolute path): correct it and run
it again before deciding. Record "tail: short" or "tail: full" and
the gate's line in state.md. Two fallbacks guard the short tail. If its verify-only wave ends, after the one re-run, with no
DIR/r3_verify.answer.md, switch to the FULL tail from (g) on (note "tail: short, then full — no verify answer"). And if the
FIRST finalize reply of the short tail begins "MAIN CLAIM: NOT PROVED" (check this before the stand-alone grep check of
step (i)), the certified chain did not survive the verify query — note "tail: short, then full" in state.md,
rename DIR/r3_verify.md and (if it exists) DIR/r3_verify.answer.md to DIR/r3_verify.first.md / DIR/r3_verify.first.answer.md,
and likewise any DIR/r3_verify.partial.md to DIR/r3_verify.first.partial.md (appending " | renamed r3_verify.first" to the r3_verify index line), and run (g), (h) and (i) once more as in the FULL tail (the select judge then sees the finalize judge's proof.md
and, by the name in the index, the first verify report); this fallback applies at most once, and the second pass carries
(i) to the end whatever its reply's first line says.
**(e) Draft.** One `math-proof-judge` with the DRAFT BRIEF ({R} from state.md; {PARTIALS} is the text given after the
DRAFT BRIEF when the tail is FULL and R ≥ ESC_ROUND, and empty otherwise — SHORT tail, or R < ESC_ROUND; if R = 0 replace the brief's "final round's
results" clause by "(no wave completed before the rounds ended — work from the summary and ledger)") →
DIR/proof.md. The extra-query rule applies (see Rules; that relaunch, if it happens, is part of this step). If
DIR/proof.md does not exist once the step is over, launch the draft judge one more time with the added first
paragraph "DIR/proof.md was not written; write it now from the material named below."; if it still does not
exist, stop and report.
**(f) Refine**, REFINE_STEPS times in the FULL tail (step names refine_2, refine_3, … in order, REFINE_STEPS of them), not at all in the SHORT
tail: one `math-proof-judge` each with the REFINE BRIEF (extra-query rule applies, once per step).
**(g) Select.** One `math-proof-judge` with the SELECT BRIEF → up to MAX_COMMIT files DIR/r3_q{k}.md and exactly one
DIR/r3_verify.md. If DIR/r3_verify.md does not exist afterwards, create it with the shell, without retyping
anything, as the concatenation of: the lines "The document below is a draft proof. Check the argument step by
step: for every inequality, interchange, cited result, and 'it follows that', ask whether it actually follows
as written. List every error or gap in order of severity, and say explicitly whether the main claim is
proved.", a blank line, the line "## The draft proof", a blank line, and the file DIR/proof.md.
**(h) Commit wave.** Run every DIR/r3_q{k}.md (there are none in the SHORT tail) plus DIR/r3_verify.md as one
wave (no screen step for this wave).
**(i) Finalize.** One `math-proof-judge` with the FINALIZE BRIEF ({PARTIALS_FIN}: the text given after the FINALIZE BRIEF
when the tail is FULL and R ≥ ESC_ROUND, empty otherwise) → the final DIR/proof.md. Then the stand-alone
check: run `grep -noE 'r[0-9]+_q[0-9]+|round[0-9]+_q[0-9]+|extra_q[0-9]+|r3_verify|[A-Za-z0-9_]+\.answer\.md|[A-Za-z0-9_]*summary\.md|synthesis\.md|ledger\.md|notes\.md|index\.md' DIR/proof.md || true`
(plain file handling; you are not reading the mathematics; no output means proof.md is clean). If it prints anything, proof.md still points at run
files a referee cannot open: launch the finalize judge ONCE more with the FINALIZE BRIEF preceded by the added
first paragraph "DIR/proof.md still refers to run files (grep found: {the matches, at most ten, comma-separated}).
A referee reads proof.md alone and cannot open them. Rewrite DIR/proof.md so that every argument it relies on is
written out in full inside proof.md itself, with no reference to any file in this directory.", note
"standalone-check: resent" in state.md, and accept whatever proof.md that launch leaves (do not repeat the check).
Update state.md ("phase: finished"). Reply to the user with: where proof.md is,
how many rounds ran and why the loop ended (the script's verdict line), how many worker queries ran, how
many were answered and how many ended partial, whether the goal was ever replaced or raised (one line, from
state.md; if DIR/result-so-far.md exists, say that it holds the earlier result as the worker wrote it, checked
only as far as the goal-change line recorded, and that proof.md and its Status section supersede it), and the judge's Status paragraph from its finalize reply, quoted. Do not
restate or assess the mathematics yourself.

## Rules that hold throughout
- Every judge step and every worker is a NEW subagent launch (the Agent tool) with `subagent_type` set
  explicitly; never omit it. The sub-agents ship with this plugin and your agent list normally shows them under
  plugin-scoped names — `math-proof:math-proof-judge`, `math-proof:math-proof-worker`, `math-proof:math-proof-worker-deep`.
  Decide the name seat by seat: for each of the three, use the bare name (`math-proof-judge`, `math-proof-worker`,
  `math-proof-worker-deep`) if your agent list offers it, otherwise the scoped name; mixing the two forms is fine (a
  bare-named copy in the user's or the project's agents directory is how a user changes that one seat's settings,
  and is meant to win). If one of the three is listed under neither name, tell the user that the math-proof
  plugin's sub-agents are not in this session's agent list — open `/plugin` to check that math-proof is installed
  and enabled, restart Claude Code, and give the same /math-proof:siege line again — and stop before round 1.
  Record in state.md the name used for each seat. Judge steps use `math-proof-judge`. Workers — round waves and their re-runs — use `math-proof-worker` in rounds
  before ESC_ROUND and `math-proof-worker-deep` in round ESC_ROUND and every later round; the workers of the proof
  tail (extra-query waves, the commit wave, r3_verify) use `math-proof-worker-deep` if a wave ran in round ESC_ROUND
  or later (R ≥ ESC_ROUND in state.md) and `math-proof-worker` otherwise. The choice is purely by round number, never
  by your own view of how the attempt is going. Never reuse, resume or send a message to an earlier subagent.
  Do not pass a `model` to the Agent tool: judges and workers run on this session's model.
  Launch a whole wave in ONE message so the workers run in parallel; never run a subagent in the background.
- In every brief and worker prompt below, DIR stands for the run directory's absolute path and the other
  {bracketed} slots for the values named; substitute them and send the text otherwise VERBATIM. Do not add
  encouragement, hints, opinions about the problem, deadlines, or summaries of results to any brief or prompt.
- One fixed addition to EVERY `math-proof-judge` launch: after the brief, append a blank line,
  the line "Problem statement (for reference — DIR/problem.md is the authoritative text; go by the file wherever
  this copy differs or looks garbled):" and then the complete contents of DIR/problem.md, byte for byte (you read
  it during setup). It is reference material so the judge's first request already contains
  the problem; it changes no instruction in the brief, and the briefs' rule that the judge must not copy the
  problem statement into query files still stands; DIR/problem.md, which every brief names, remains the authoritative
  text. (Worker prompts carry the same text, in the fixed form given below.) Paste it exactly: copy the text you
  read from DIR/problem.md character for character, never from memory and never retyped.
- You never write or edit query files, answer files (finished or partial), summaries, ledger files, notes.md or
  proof.md yourself. The only files you write are state.md, index.md, the problem copy, the fallback r3_verify.md
  and result-so-far.md (both by copying or concatenation only); beyond that you only copy or move files where a
  step says so (cp/mv: summary.md, and the r3_verify.first renames in the proof tail). You do not read answer files beyond confirming they exist (`test -s`);
  which of them are finished is decided by the bookkeeping script (`SCRIPT answers`, below), never by you.
- Worker prompts are always exactly this, with {Q} the query file stem (for example round2_q3, extra_q1,
  r3_q2, r3_verify), {PROBLEM} the complete contents of DIR/problem.md, byte for byte, and {EARLIER} an empty
  line — except when launching a query that this wave's latest `answers` run reported "partial", where {EARLIER} is the paragraph
  given after this prompt, with an empty line before it and after it:
  "Task file: DIR/{Q}.md — read it first; the task concerns the problem stated below (DIR/problem.md holds the
  authoritative text of the problem; read it if anything in the copy below looks garbled). Write your answer to
  DIR/{Q}.answer.md as you go, and when you have finished, whatever the outcome, make the file's last line this
  end line, exactly:
  === END OF ANSWER {Q} ===
  {EARLIER}
  Problem statement (verbatim, for reference):
  {PROBLEM}"
  {EARLIER}, when not empty, is exactly: "An earlier worker's attempt at this task was cut off part-way; its
  unfinished answer is DIR/{Q}.partial.md — read it after the task file, use whatever in it you can check
  yourself, trust none of it as established, and write your own complete answer to DIR/{Q}.answer.md, ending
  with the end line above."
  The end line is how a finished answer is told from one a worker was cut off in the middle of (by a usage
  limit, an error or its turn limit); the bookkeeping script checks for it, you never do.
- Running a wave of query files means: launch one worker of the type this wave uses (`math-proof-worker` or
  `math-proof-worker-deep`, see the first rule) per file, all in one message. When all have returned — never earlier: a worker still running is still
  writing its file — run `SCRIPT answers DIR {Q1} {Q2} …` with the stems of the wave's query files, as a
  command on its own, and read what it prints before you write any index line or launch anything. It decides,
  without your reading anything, which answer files are finished, and prints one line per query — "{Q}: answered" (DIR/{Q}.answer.md ends with that query's end line: its worker
  finished it), "{Q}: partial" (a worker wrote something but never finished; the script has moved that
  unfinished file to DIR/{Q}.partial.md, so that a .answer.md file always means a finished answer) or "{Q}: no
  answer" — and then a line "TOTAL (n queries): …" with the three counts (if it prints an ERROR line instead,
  it is safe to correct the command — DIR first, then stems such as round2_q1 — and run it again).
  Append to DIR/index.md ONE line per query: "{Q} | answered | ", "{Q} | partial | " or "{Q} | no answer | "
  as the script said, followed by the first 300 characters of the worker's reply to you (its abstract — not the
  answer file's contents), with newlines replaced by spaces so the entry stays on a single line. Then, if — and
  only if — some query of the wave is not answered, relaunch a fresh worker for each such query (once, all in
  one message; launch nothing for answered queries; a partial query's prompt carries the {EARLIER} paragraph,
  which hands the new worker the unfinished file), and when they have all returned run `SCRIPT answers` again
  with ALL the wave's stems (answered queries are unaffected), and append to the existing index line of each re-run
  query (with the Edit tool; no second line for the query)
  " | re-run: answered | ", " | re-run: partial | " or " | re-run: no answer | "
  as it now reports, followed by the first 300 characters of the new worker's reply as before (a query cut off twice stays partial; the script keeps the
  longer of its two unfinished files as DIR/{Q}.partial.md and the other beside it as DIR/{Q}.partial.prev.md).
  So an index line reads "{Q} | status | abstract", sometimes followed by " | re-run: status | abstract", and
  the re-run's status, when there is one, is the one in force; the plan, draft, refine and finalize briefs tell
  the judges what a partial file is. Never launch a worker for a query
  between a worker's return and the `answers` run that accounts for it. Note the TOTAL line of the last `answers` run for the wave — the one
  over all its stems, so its count n equals the wave's size: the FLOOR rule below and state.md use it.
- No user will answer you during this session: never end your turn to ask how to proceed, never wait for confirmation, and
  never stop early because something went wrong — decide by these rules and keep going until the protocol is
  finished or a rule below says to stop. A subagent that returns an error, an interrupted result or an empty
  reply is recorded in index.md / state.md and the protocol carries on; one lost worker is normal; a judge step
  that comes back errored or interrupted is relaunched once immediately. If the same judge step fails (errors out, or writes none of its files) twice in a
  row, stop and report where things stand. If, once a round's wave has ended after its one re-run,
  answered + partial on that last TOTAL line is smaller than the FLOOR number the script printed with its WAVE
  verdict (screening verdicts do not count against this), stop and report: something systematic is wrong and
  continuing would only spend judge steps on nothing — tell the user the likeliest cause is a usage limit or an
  outage that cut the workers off, that the run's files are intact, and that giving the same /math-proof:siege line
  again in this directory resumes the run once the cause has cleared. (If that TOTAL line's n is smaller than the wave, you ran
  `answers` on only some stems — run it on all of them first.) The extra-query and commit waves have no floor.
- Extra queries: when a draft or refine brief allows it, the judge may write up to 3 files named
  DIR/extra_q{k}.md using the next unused numbers k; the whole run has a budget of 10 (once DIR/extra_q10.md
  exists, no more may be written — the briefs say so). When a judge's reply says it wrote extra query files,
  confirm they exist, run them as a wave (their answers land in DIR/extra_q{k}.answer.md, or in
  DIR/extra_q{k}.partial.md for one cut off twice — the index says which), then relaunch that same step ONCE
  with this added first paragraph: "Your extra queries have been answered: read DIR/extra_q*.answer.md (the
  index says which exist). Finish the step now; do not write further extra queries in this step." A second
  batch of extra files from the relaunched step is left on disk unanswered.
- Rewrite DIR/state.md after every step: protocol, settings, current phase, attempt counters, and a growing
  one-line-per-step log; each round's plan line also records the wave cap passed to the check command and each
  wave's line the worker type launched and the last TOTAL line (e.g. "cap 10, math-proof-worker-deep ×9, answered 8,
  partial 1, no answer 0"). It is your only memory if this conversation is ever compacted; if you find yourself
  unsure where you are, read state.md and ${CLAUDE_SKILL_DIR}/SKILL.md again.

## PLAN BRIEF (round {r} of at most {MAX_ROUNDS}; {CAP}, {HORIZON}, {CONCLUDE_RULE}, {ESC_SUMMARY} and {ESC_WAVE} depend on r, see (a) and below)
> Step: plan round {r} of at most {MAX_ROUNDS}.{HORIZON} Files: the problem is DIR/problem.md; your running notes are
> DIR/notes.md; the running summary from the previous round is DIR/summary.md (absent in round 1); the claims
> ledger is DIR/ledger.md (absent or empty until something is recorded); the previous round's results are the
> files DIR/round{r-1}_q*.answer.md whose line in DIR/index.md gives the status "answered" (each line reads
> "query | status | abstract", sometimes followed by "| re-run: status | abstract", and then the re-run's
> status is the one that holds; none in round 1), plus DIR/extra_q*.answer.md if any exist. A query whose
> status is "partial" has instead a file DIR/round{r-1}_q{k}.partial.md: the notes of an engine that was cut
> off part-way. Read it too, for leads and for material to build new queries on, but nothing in it is
> established — it can prompt an OPEN line or a query, never by itself a PROVED line (one exception: if it
> holds a complete written proof or refutation of the [GOAL] claim, or of an earlier goal, since raised, that
> the audit rule below still covers, that proof counts as "in hand" for the audit rule exactly as if the file were
> finished — you also write the settled [GOAL] line that the audit and conclusion rules call for, with that
> query's stem (e.g. round3_q2) as its locator — and the verify queries then decide).
> (Every finished result file ends with a bookkeeping line "=== END OF ANSWER … ===": it is not part of the
> mathematics; leave it out of anything you splice or quote.) Read the problem, your notes, the summary, the
> ledger and the index first, then the previous round's result files — each file once, in full.
>
> 0. Screen first (rounds 2 and later). As you read the previous round's result files, check that each is a
> genuine attempt at its query — not a refusal, an empty or near-empty file, off-topic text, or work on a
> different problem. Write DIR/judge/screen_r{r-1}.md with one line per query of that round, exactly
> "round{r-1}_q{k}: OK" or "round{r-1}_q{k}: DEGENERATE: one-line reason" ("DEGENERATE: no answer" for a query
> whose status is no answer; a partial query's .partial.md is screened by the same test as a finished file —
> being unfinished is not itself degenerate), and ignore every file you marked DEGENERATE in everything below.
> This is screening, not grading: a wrong, weak or incomplete answer is still OK.
>
> You are directing a structured multi-round attempt at a hard mathematics problem. Each round, you compose
> queries that are sent independently to a deep reasoning engine with a very large thinking budget; the
> results come back as files, and you fold what they established into a running summary before composing the
> next round. This is round {r} of at most {MAX_ROUNDS}.{HORIZON} {CONCLUDE_RULE}
>
> Do these three things, in order.
>
> 1. Update the running summary. Rewrite it from scratch into DIR/round{r}_summary.md: it REPLACES the
> previous summary and is the only memory later rounds (and the final proof assembly) have of what came
> before, so carry forward everything still relevant. Record: what has been established, citing the result
> file that showed it (e.g. round2_q3); promising partial progress; dead ends, and why each is dead; and the
> open gaps that stand between the current state and the goal. Be honest — an overclaimed summary poisons
> every later round. Keep it under 6000 words. Then decide where to target next: end the summary with a
> section naming where the next round should concentrate — sharpening the strongest partial result, closing
> the most load-bearing open gap, verifying something the attempt now depends on, or abandoning a dead line for
> a fresh lens. Early rounds usually explore (varied independent reformulations and approaches); later rounds
> usually exploit (focused attempts, verification of key steps). The choice is yours each round.{ESC_SUMMARY}
>
> 2. Update the claims ledger. Alongside the summary, the run keeps a numbered ledger of claims, each marked
> PROVED, REFUTED, or OPEN. Unlike the summary, the ledger is never rewritten: the lines you write now are
> APPENDED verbatim (the numbering is added for you), and an existing entry is removed from force only by
> appending an explicit RETRACT line naming its number. Write DIR/round{r}_ledger_block.md containing ONLY this
> round's new lines, one per line, each of the form "PROVED: one-sentence claim — locator", "REFUTED:
> one-sentence claim — locator", "OPEN: one-sentence claim — locator" (locator = the result file stem, e.g.
> round2_q3), or "RETRACT 4: one-sentence reason entry 4 no longer stands". Append a line for every
> load-bearing claim this round settled or opened, a new line for any claim whose status changed (the newest
> line for a claim supersedes older ones), and a RETRACT line for anything now known wrong. Keep lines to one
> sentence: the full ledger is carried verbatim into every later round and into the final proof assembly — it
> is the one memory of this attempt that cannot fold away. Tag the line that states the headline goal with
> [GOAL] right after the status word ("PROVED: [GOAL] …", "OPEN: [GOAL] …"), and tag with [AUDIT] a PROVED
> line recording that a separate verify query checked a complete written proof chain (name that query's
> locator and cite the entry it certifies as "entry N" or "#N"). Tag lines as they arise. In round 1 write
> exactly one [GOAL] line. If the problem fixes the claim to be settled, that claim — the whole claim as posed,
> all parts — is the goal; if the task is
> open-ended (improve, extend or strengthen a given work; find a significant result about something), choose
> the goal now — one precise statement, the most significant result you judge this attempt can establish — and
> record it as the [GOAL] line, OPEN until settled. (i) Status lines. Write a further [GOAL] line for the same
> claim only when its status changes (OPEN → PROVED or REFUTED, or back to OPEN when a verify query finds a
> gap — then also RETRACT the PROVED line) — and then in the very round whose result files first contain the
> complete written proof, so that the verify queries you compose in the same step certify a line that is
> already numbered when their answers return — or to come back to it under (iv) below; never merely to re-word
> it, since only the newest [GOAL] line counts, and an [AUDIT] line must cite by number the [GOAL] entry it
> certifies, which is the newest one when the goal has not moved since (lines in your block are numbered on from
> the last entry of DIR/ledger.md, in file order). (ii) Changing the goal. The goal is not fixed: at any later plan step you may set a new goal by writing a new OPEN [GOAL] line, which is the
> goal from then on (this is no reason to aim low in round 1: choose the round-1 goal exactly as above);
> throughout this brief, "the [GOAL] line" and "the [GOAL] claim" mean the newest [GOAL] line in force and its
> claim. There are two reasons to set a new goal. Replace the goal (RETRACT the old [GOAL] line — if it was
> PROVED and the proof stands, re-enter what it proved as an ordinary untagged PROVED line — then write the new
> one) if it turned out false, ill-posed or already known, and also if you find it is narrower than, or
> different from, the claim the problem itself poses — then the posed claim is the new goal (a replacement, not
> a raise, even when the narrower goal was already PROVED: on a problem that fixes its claim the run's verdict is
> about that claim); for a goal you chose yourself in round 1 on an open-ended task, a refutation means replace it and continue (for a goal you raised to, see (iii)), and a
> REFUTED [GOAL] line ends the run only when the problem itself posed that claim. Or raise the goal: once the
> current goal is PROVED, if a more significant result now looks within reach of the rounds that remain — a
> stronger statement, or the general case of what was proved — write the new statement as an OPEN [GOAL] line
> (locator roundN_plan, N being this round's number), held to the same standard as the round-1 choice (one
> precise statement that you judge this attempt can establish, not one that as far as you can tell is false,
> ill-posed or already known). A raise is always an OPEN line: never write as a PROVED [GOAL] line a claim
> stronger than what the result files actually prove. When the problem itself posed the claim and it is proved
> as posed, there is nothing to raise to: conclude. (iii) What a raise leaves in place. When you raise, do not retract the proved goal or its
> [AUDIT] lines: they stay in force as ordinary entries, and that result is what the final document presents if
> the raised goal is not reached. If instead a verify query finds a gap in the proof of the goal you raised away
> from, RETRACT its PROVED [GOAL] line — never leave in force a PROVED [GOAL] line whose proof has failed its
> check — and decide afresh under (ii) which statement is the goal (to return to the earlier one, write it as the
> newest OPEN [GOAL] line and aim the wave at the gap). A REFUTED raised goal is not the run's verdict, and its
> refutation needs no verify queries (the audit rule below is for a goal the run may conclude on): record it as a
> "REFUTED: [GOAL] …" line naming the refuting file, then re-state the goal you proved below it, as (iv)
> describes, and conclude on that. Raising is a judgment, not a duty: if nothing clearly more significant looks
> within reach, conclude on the proved goal under the rule on concluding given earlier in this brief; and if the
> first two waves aimed at a raised goal (the raising round's own wave is the first) leave it no nearer — no
> proof of it, and no new route to one — then at the next plan step come back to the goal already proved and
> conclude. Coming back takes precedence over the summary's chain and progress rules and the escalation rule
> below, which direct a wave at a stalled statement only while it stays the goal: a step that comes back
> composes no queries other than any verify queries the audit rule still requires for the goal it returns to (one audit wave, then
> conclude). Other than coming back to a goal already proved, do not swap a goal for a weaker one because it is
> proving hard: what was established toward an unreached goal is presented by the proof-writing steps as it
> stands. Stronger or further results that you do not adopt as the goal stay as ordinary PROVED/OPEN lines and belong in the proof's "Other routes" section. (iv) Coming back. To come back to
> a goal proved earlier (the raised statement did not yield), re-state it in this round's block as a "PROVED:
> [GOAL] …" line citing its earlier entry as "entry N" or "#N", placed after any other [GOAL] line the block
> holds so that it is the newest (lines are numbered in file order), and below it re-state its certifications as
> [AUDIT] lines, each naming its verify query's locator as before and citing the new line's number in the same
> form (count it: if DIR/ledger.md ends at entry 23 and the re-stated goal is the second line of your block, it
> is entry 25) — one such line suffices when the re-stated goal line cites the earlier entry, otherwise two, from
> separate queries; then conclude under the rule on concluding. Leave the file empty if no claim was settled,
> opened, changed, or retracted.
>
> 3. Compose the next round's queries — or conclude. If and only if the material in hand fully establishes
> the goal, write DIR/round{r}_DONE.md containing one line naming where the material establishes it, and write
> no queries (if you raise the goal in this step, compose a wave for it instead — never write
> DIR/round{r}_DONE.md in the same step as a raise). Otherwise write between 1 and {CAP} query files DIR/round{r}_q1.md, DIR/round{r}_q2.md, …
> (consecutive numbers) aimed at the target you chose. While the [GOAL] line is OPEN, parallel queries are
> cheap and independent, so prefer using most of the budget; make them genuinely different attempts at the
> target, not rewordings of one attempt. Once a complete written proof (or refutation) of the [GOAL] claim is in
> hand, the wave shrinks: compose the verify queries the audit rule below requires plus at most 2 others, aimed
> at what the final proof document will need (a corollary's full write-up, the proof of a lemma that was only
> cited, an independent second proof). If instead you raise the goal in this step (item 2), the wave does not
> shrink: the verify queries for the proved chain still go out — when their certifications return in a later
> round, record them as [AUDIT] lines naming their locators and citing by number the PROVED entry of the goal
> they certify, even though the goal has since moved on — and the rest of the wave, up to the cap, is composed
> for the new OPEN [GOAL] line. When this brief carries the escalation rule below, that part of the wave follows
> it, with the raised statement as the [GOAL] claim of which no proof is in hand: first go back and give the
> summary its 'The chain and the missing statement' section for the raised statement (summary rule (iii); if
> nothing yet reduces it, the raised statement itself is the missing statement, and its OPEN [GOAL] line serves
> as its ledger entry), then compose that part of the wave under the escalation rule. Each query must be
> self-contained: the reasoning engine sees ONLY that query file followed by the complete problem statement — no
> summary, no ledger, no other results, no other round — so include, inline, any prior result or partial
> argument the query builds on (splice long passages in from the answer file with the shell rather than
> retyping them). Do NOT copy the problem statement itself into any query.
> Targeting rule (applies every round). Of the queries you compose, at least half (rounded up) must ATTEMPT
> open questions this run has itself flagged: the open questions named in result files, the OPEN claims in
> the ledger, and the open gaps in your summary. Mark each such query by making its FIRST line exactly
> "kind: attempt", and name inside it the specific open question it attempts. An attempt query tries to SETTLE
> its question — prove it, refute it, or reduce it to something strictly easier — not to survey it, re-derive
> known ground around it, or polish the document. A verdict that a question is "established: open" (or that
> the goal is beyond the state of the art) is NOT final and must not be inherited by later rounds as settled:
> reopen it and aim attempt queries directly at it.
> Audit rule (applies every round). Whenever a result file in hand gives a complete written proof (or
> refutation) of the [GOAL] claim — or of a goal you raised away from, in this step or earlier (not the
> refutation of a goal you raised to: item 2 (iii)) — that fewer
> than two verify queries have yet certified, at least as many of this round's queries as are still missing (two, or one)
> must be independent verify queries of that written chain — if several result files each give a complete proof,
> pick the most complete one and send both verify queries against that same chain. Each carries the complete argument verbatim —
> assemble the query file with the shell from the answer file (cat, sed; from the partial file, under the
> exception given with the file list above), do not retype or paraphrase it — and
> asks for a step-by-step check of every inference, ending in an explicit verdict on whether the chain proves
> the claim exactly as stated; they count as attempt queries (first line "kind: attempt", naming the [GOAL]
> entry they audit); two certifications satisfy the gate — add a third only if it checks something the two do
> not. When such a certification comes back positive, record it as a PROVED [AUDIT] line naming its locator and
> citing, by number, the [GOAL] entry it certifies (that goal's settled line, even if the goal has since been
> raised); when the ledger then qualifies (see above), conclude.{ESC_WAVE}
> Retrieval rule. The running summary is a compression and can drop or invert what a result actually said.
> Whenever you rely on or contradict a prior result — in the summary rewrite, in a ledger line, in your target
> choice, or in a decision to conclude — first read that result's answer file and work from what it actually
> says, not from the summary's paraphrase of it.
>
> Finally rewrite DIR/notes.md, and reply in under 150 words: concluded or not, how many query files and how
> many of them are attempt queries, and the target in one sentence. If you replaced, raised or came back to a
> goal this round (item 2), add one more sentence, not counted in the 150 words, beginning "Goal change:" —
> which of the three, what the goal was and what it is now (each in a short phrase), and the result already
> proved if one stands, with its ledger entry number and how many verify queries have certified it so far; for a
> raise, also name by full path the answer file or files that hold that result's complete proof (form: "Goal
> change: raised — entry N, proved in DIR/roundK_qJ.answer.md (certified by M verify queries so far), is …; the
> goal is now …").

{CONCLUDE_RULE} is, when r < MIN_ROUNDS, exactly: "You may conclude in this round, before round {MIN_ROUNDS},
as soon as the claims ledger holds the headline goal settled — a PROVED or REFUTED line tagged [GOAL] ("PROVED:
[GOAL] …") — and at least two PROVED lines tagged [AUDIT]. Each [AUDIT] line is the certification returned by a
separate verify query that checked the complete written proof chain (not a sketch or outline); it must name
that query's locator (e.g. round3_q2) and cite the [GOAL] line, or a line it cites, by ledger id written "entry
12" or "#12" — at least one [AUDIT] line citing the [GOAL] line itself. When the ledger qualifies, decide in
this step between two things: conclude, or raise the goal (item 2 below says when and how) and compose a wave
for the raised goal. Do not run further waves merely to reach round {MIN_ROUNDS} or to polish — the
proof-writing steps that follow do the polishing. Tag lines as they arise. If the ledger does not yet qualify,
compose a wave (the audit rule below says when it must contain verify queries)."
— and when r ≥ MIN_ROUNDS it is exactly: "From this round on you may conclude whenever the material in hand
fully establishes the [GOAL] claim — except that if a complete written proof is in hand that fewer than two verify queries
have yet certified, the audit rule below still applies this round (one audit wave, then conclude) — and when such a proof is in hand,
this round's ledger block must already carry the [GOAL] line settled, written in the ledger's ordinary form
"PROVED: [GOAL] …" (or "REFUTED: [GOAL] …") with nothing between the status word and the tag — that it is not
yet certified needs no mark of its own, the [AUDIT] lines record certification —, in the same step that composes
its verify queries. Once the [GOAL] claim is established you either conclude (after its audit wave, where the
audit rule applies) or raise the goal (item 2 below; a raise need not wait for the audits), never both in one
step: a step that raises the goal writes no DONE file, since a raised goal is settled by a wave, not by concluding. If you raised the goal in an earlier round and
the raised statement has not yielded, you may conclude on the goal already proved, re-stating it as the newest
[GOAL] line as item 2 (iv) describes. In the final round, do that rather than letting the rounds simply run out."

{HORIZON} is empty when r ≤ MAX_ROUNDS−2; when r = MAX_ROUNDS−1 it is exactly: " So at most one further round
can run after this one." and when r = MAX_ROUNDS exactly: " So this is the final round: whatever its queries
return goes straight to the proof-writing steps, with no further round to act on it." (Note the leading space.
{MAX_ROUNDS} in the brief is the MAX_ROUNDS setting written as a number, every round.)

{ESC_SUMMARY} is empty when r < ESC_ROUND; when r ≥ ESC_ROUND it is exactly (leading space included):
" From this round on four further rules govern the summary; because rule (iii) asks you for mathematics of your
own, write the summary file with its carried-forward material and (i)–(ii) before working (iii) out, then extend
it — a message spent only thinking can be cut off and what was not written is lost. (i) Standing results: keep a
section of that name listing every PROVED ledger line that is a theorem about the problem in general (all parameters), an exact
reformulation or reduction of the [GOAL] claim to a named simpler or classical statement, or a complete
solution of a natural special case — each with its locator — even when it cannot by itself finish the goal;
never drop an entry from this section (mark it 'not on the current line' instead), because if the goal is not
reached the final document is built around these. (ii) Dead ends: a route is dead only by a precise statement
that was REFUTED and the result file that refuted it, and is recorded in exactly that form. One result file
reporting an obstruction, a failed search inside one ansatz or one candidate, or that a route reaches only part
of the goal, closes that candidate, not the route: list such routes under the open gaps as 'set aside, not
refuted', open to re-attack. (iii) The chain and the missing statement. First decide whether a complete written
proof or refutation of the [GOAL] claim is in hand. A result file that proves last round's missing statement
exactly as stated, when that chain needs nothing further, IS one: in that case record the [GOAL] line PROVED (or
REFUTED, for a disproof) in this round's ledger block, citing by number the entries the chain uses and naming the
new proof's locator, and compose the audit rule's verify queries so that they carry the WHOLE chain — the cited
entries' arguments and the new proof, each spliced from its answer file, joined by the chain's derivation exactly
as last round's summary states it. If a complete written proof or refutation is in hand, that way or any other,
skip the rest of (iii) and all of (iv). Otherwise the summary carries a section headed exactly 'The chain and the
missing statement', rewritten every round, with four labeled parts. Chain: the derivation by which the [GOAL]
claim (or its negation, when the line pursued is a disproof — then read 'proof of the missing statement' below
accordingly) follows from results already PROVED — cited by ledger
number, statements only — together with exactly ONE further statement not yet proved; write the derivation out
step by step, so that a reader holding the cited entries and a proof of that one statement would hold a complete
proof. If the material does not yet reduce the goal to a single statement, take as the missing statement the
strongest intermediate claim the main line needs next, and say in the chain what would still remain after it.
Missing statement: that one statement written out in full and self-contained — every quantifier, every object
defined, and every hypothesis of the problem it may use stated with it (a statement stripped of a hypothesis it
actually needs becomes false, and its refutation then discredits a sound line). It may carry hypotheses of its
own — a restriction to some of the objects or to part of the parameter range — only if the chain shows, citing
PROVED entries, that everything outside those hypotheses is already settled; a statement whose proof would still
leave some of the objects the problem admits unsettled is a special case, not the missing statement. Among
statements that would complete the chain prefer the simplest and most concrete. Enter it in the ledger as an
OPEN line (as locator write roundN_plan, N being this round's number) the first time you state it and whenever
its wording changes — and then also RETRACT the OPEN line of the wording it replaces — so that later rounds and
queries can refer to it. Why it should hold: your own sketch, in at most fifteen lines, of why you believe it and
by what kind of argument it could be proved — do this mathematics yourself: if you can see a candidate mechanism,
of whatever kind, that would give it, state it precisely; a conjecture of yours that the engines then prove or
refute is among the most useful things this step produces. Tried so far: one line per query already spent on
this statement or an earlier wording of it — locator, the approach it took, and what it yielded (a proof of a
special case, an equivalent reformulation, an obstruction, nothing); identical copies of one task share a line;
an approach so listed counts as tried. (iv) Progress test. Open the target section by saying whether the last two
rounds produced progress on the chain, counting as progress ONLY: a proof of the missing statement; a proof of the
[GOAL] claim; a new PROVED result that holds for every object the hypotheses admit and shortens the chain; or the
replacement of the missing statement by a strictly simpler one (simpler, not merely narrower), with the chain
re-derived. Settling a further part of the objects while the hard part of the missing statement stays open — so
that the statement merely narrows — or an equivalent reformulation of it, is recorded under (i) but is not
progress in this sense. If there was none, write 'main line stalled — no universal progress', say in one line
what in your sketch or decomposition differs from last round's, and do not respond by opening another special
case or by turning to other routes for breadth: the wave (unless item 2 (iii) now has you come back to a goal
already proved and conclude) goes to the missing statement itself under the Closing rule below, and what must change is your own sketch in (iii) — a different mechanism for the same statement, or
a different decomposition of the chain with a different missing statement. If a result file REFUTED the missing
statement exactly as stated, do not rescue it merely by excluding the counterexample's class (unless a PROVED
entry already settles that class, and the chain says so): either state a corrected missing statement and
re-derive the chain for it in full, or record the line as dead under (ii) and build the chain of the next most
promising line. From this round on, 'verifying' as a target means only the audit rule's goal audits and the one
chain check the Closing rule's item (c) allows."

{ESC_WAVE} is empty when r < ESC_ROUND; when r ≥ ESC_ROUND it is exactly (leading space included; {CAP} substituted
as elsewhere):
" Escalation rule (this round and every later one, for as long as no complete written proof or refutation of
the [GOAL] claim is in hand — once one is, including the case summary rule (iii) describes of a proved missing
statement that completes the chain, the audit rule and the shrunken wave above take over, and (a)–(c) below are
then ignored). The engines answering this round have a much larger thinking budget than those of the opening
rounds, and the wave may hold up to {CAP} queries: use most of it, and spend it on the missing statement of your
chain, stated in full — not on surveys, and not on breadth for its own sake. (a) Every query attacks: it attempts
the missing statement, the [GOAL] claim itself, or a question whose answer would settle or strictly reduce one of
them (settling it for part of the objects only is not a reduction). Do not spend queries on writing up,
polishing, re-deriving or verifying results that do not complete the [GOAL] chain — the proof-writing steps
after the rounds do that, with their own query budget — so the only verify queries in a round are the audit
rule's (the verify queries certifying a goal that was proved and then raised count as the audit rule's) and
the one chain check item (c) allows. Do not spend a query asking an engine to recall or reconstruct a
proof from the literature, of the [GOAL] claim or of anything else: the engines have no library to consult, and
such a task gives them nothing to reason with (invoking known theorems inside an attack is another matter, and
fine). (Only in the final two rounds — this brief's opening 'Step: plan round …' line will then say so
explicitly, in the words "one further round" or "the final round"; if it carries neither, this is not one of
them — up to two queries may instead verify, or write up in full, the standing results the final document will
present.) (b) Closing rule.
Write ONE task file that asks for a complete proof of exactly the missing statement of your chain — or else an
explicit counterexample to it — and that contains: the statement, verbatim as the summary states it; every prior
result it may rest on, spliced in full with its proof from the answer files (cat, sed — never paraphrased); the
chain's derivation of the [GOAL] from it, so that the engine sees what the statement is for and can say so if
that derivation is itself flawed; your sketch of why it should hold, offered as a suggestion the engine is free
to discard; and the explicit sentence that a proof of the statement for only some of the cases it covers — a
sub-class of its objects or a sub-range of its parameters — does not answer the question, though it should be
reported if it is all that was found. Save it as this round's query file q1 (the first of the files named above)
and copy it byte for byte (cp) to q2 and q3: three engines attempt the same statement independently —
independent attempts at one well-posed statement are worth more here than one attempt each at three statements.
These identical copies are intended (the instruction above against rewordings of one attempt does not apply to
them), and all three are attempt queries (first line 'kind: attempt', naming the missing statement as the open
question they attempt). (c) The remaining queries — use most of the cap — also go to the missing statement, each
self-contained (carrying the same splices unless said otherwise below), and each is either a further
byte-for-byte copy of the closing task (allowed: it is one more independent attempt) or genuinely different from
it: an attack by a named approach that does not appear under 'Tried so far' (name it in the task; the engine may
depart from it if it says why); or a listed approach continued from the partial result it returned, with that
result spliced in; or the hardest single step of your own sketch, cut out and posed as a self-contained claim; or
the one obstruction a result file raised against the statement, posed as the thing to overcome or to sharpen into
a counterexample. In the first round a missing statement is posed, and again whenever its wording has changed,
one of these queries instead tries to REFUTE it exactly as stated — by an explicit construction, or by deriving
from it something known to be false. When the same missing statement has already been attacked in two earlier
rounds, one of these queries is given only the statement and the cited entries' statements (no proofs, no
sketch), and is asked first to derive for itself that the statement would complete the [GOAL] and then to attack
it by a first move none of the listed attempts used — an engine that finds the derivation does not go through,
or the statement implausible, says so, and that is a result to act on under summary rule (iv). At most TWO
queries of the wave may go elsewhere: to routes the main line does not descend from (set aside, not refuted,
under summary rule (ii)), or —
at most one of them — to checking one PROVED step the chain rests on that no separate query has yet checked. All
of these are attempt queries (first line 'kind: attempt')."

## DRAFT BRIEF
> Step: proof draft. Files: the problem is DIR/problem.md; your running notes are DIR/notes.md; your running
> summary of everything the attempt established is DIR/summary.md; the claims ledger is DIR/ledger.md; the
> final round's results are the newest DIR/round{R}_q*.answer.md files marked answered and not DEGENERATE in
> DIR/index.md; every earlier round's result files and DIR/extra_q*.answer.md are there to consult by name (a
> DIR/…_q{k}.partial.md file, where the index marks a query partial, is the unfinished and unverified notes of
> an engine that was cut off: leads only, nothing in it is established; and the "=== END OF ANSWER … ===" line
> that closes each finished file is bookkeeping, not mathematics).
> Read the problem, notes, summary, ledger and the final round's results first.
>
> You are directing a structured multi-round attempt at a hard mathematics problem. The rounds have concluded.
> Your job now: write DIR/proof.md containing the strongest route to the goal — the most complete argument the
> attempt found — with its full argument spelled out,{PARTIALS} plus a short note on every other route worth recording,
> and an honest statement of anything that remains a gap — a clearly-marked gap is worth more than a
> papered-over one. If the newest [GOAL] line is not PROVED — or is PROVED but not certified by two [AUDIT]
> lines and its written proof does not survive your own check — and the ledger holds, in force, a PROVED [GOAL]
> line for a different claim (a goal that was reached and then raised; if several, the most recent), then that
> proved goal is proof.md's main claim. State it as the document's theorem and write its complete argument out
> in full from the result files the ledger names for it (where the file the ledger names is a .partial.md file,
> take the text from the verify query files that carried it and whose answers certified it); it is not one of the
> lesser results. The raised goal
> comes after it, as a statement that was attempted, with whatever was established toward it, and the Status
> section says which is which. Use python3 whenever a concrete computation would confirm or kill a step: check a
> candidate identity on examples, verify a constant, test a claimed counterexample numerically. Checking beats
> believing. If one or a few targeted deep-reasoning queries would settle a load-bearing point, you may write
> them as the next unused DIR/extra_q{k}.md files (at most 3 in this step; none once DIR/extra_q10.md exists),
> each self-contained — the engine sees only that file followed by the problem statement, so include inline
> whatever it builds on and do not copy the problem into it — and say in your reply that you did; they will be
> answered and you will be invoked once more. Write DIR/proof.md in this step regardless. Rewrite
> DIR/notes.md. Reply in under 150 words.

{PARTIALS} is empty in the SHORT tail and whenever R < ESC_ROUND; in the FULL tail with R ≥ ESC_ROUND it is
exactly (leading space included): " and — because
the newest [GOAL] line is not certified — also written out in full with their proofs, in the body (after the
theorem of an earlier proved goal, when the sentence below about a raised goal applies) and ahead of the statement
of what remains open: every PROVED result in the ledger or summary that settles a natural special case, gives an exact reformulation or reduction of the goal (state it as a theorem: 'the claim holds for all …
provided …'), or identifies the goal or its open core with a named known statement, the most general first —
for a goal the attempt did not settle, a referee judges it by the reductions and partial results it
actually establishes, so these are the document, not side notes;"

## REFINE BRIEF (step name {S} = refine_2, refine_3, … in order)
> Step: {S}. Files: the problem is DIR/problem.md; your running notes are DIR/notes.md; the current draft is
> DIR/proof.md; the result files are DIR/round*_q*.answer.md (every round's results) and DIR/extra_q*.answer.md,
> listed with their status in DIR/index.md (a query whose status there is "partial" has instead a
> DIR/…_q{k}.partial.md, the unfinished and unverified notes of an engine that was cut off: leads, not results;
> and the "=== END OF ANSWER … ===" line that closes each finished file is bookkeeping, not mathematics); the
> claims ledger is DIR/ledger.md and the running summary DIR/summary.md.
> Read the problem, your notes and the draft first; consult any result file by name when you need it.
>
> You are running a structured parallel attempt at a hard mathematics problem and you are between waves. Your
> job this step: make proof.md strictly better. Re-derive the weakest steps, hunt for errors as a hostile
> referee would, and use python3 to check every concrete computational claim you rely on. If one targeted
> deep-reasoning query would settle a load-bearing gap, you may write it as the next unused DIR/extra_q{k}.md
> (at most 3 in this step; none once DIR/extra_q10.md exists), self-contained — the engine sees only that file
> followed by the problem statement, so include inline whatever it builds on and do not copy the problem into
> it — and say in your reply that you did. Then rewrite DIR/proof.md in full, first saving the incoming draft as
> DIR/judge/{S}_previous_proof.md. Be honest about what remains a gap — a clearly-marked gap is worth more than
> a papered-over one. Rewrite DIR/notes.md. Reply in under 150 words.

## SELECT BRIEF
> Step: select routes for the commit wave. Files: the problem is DIR/problem.md; your running notes are
> DIR/notes.md; the draft proof is DIR/proof.md; the final round's results (and any earlier result file you need), per DIR/index.md (a query marked "partial" there has only unverified notes in a DIR/…_q{k}.partial.md, from an engine cut off part-way); the claims ledger DIR/ledger.md.
>
> You are running a structured parallel attempt at a hard mathematics problem; you have a draft proof document
> and the full results of the pursuit. Your job is the commit step of the protocol: any result with a concrete
> route (a named lemma chain, a specific construction) toward the goal gets a commit query at the full thinking
> budget: "Route: [the route]. Write the full rigorous proof." Plus one verify query that checks the draft
> proof's argument step by step. (If a goal was proved and a later, raised goal was not, the draft's main claim
> is the proved goal; concrete routes toward the raised goal may still be committed.)
> Select at most {MAX_COMMIT} routes worth committing (fewer is fine — only routes with something concrete).
> For each, write the query as DIR/r3_q1.md, DIR/r3_q2.md, …, with the route's actual content included (not a
> reference to it — the engine sees nothing but the query file followed by the problem statement). Do NOT copy
> the problem statement into any query. Also write exactly one DIR/r3_verify.md containing the complete
> current draft proof (copied in full from DIR/proof.md with the shell — cat —, not retyped) and asking for a step-by-step check: for every
> inequality, interchange, cited result and "it follows that", does it actually follow as written; list every
> error or gap in order of severity and say explicitly whether the main claim is proved.
> Use python3 if a quick computation would settle which routes are real. Rewrite DIR/notes.md. Reply in under
> 100 words with the list of files written.

## FINALIZE BRIEF
> Step: finalize. Files: the problem is DIR/problem.md; your running notes are DIR/notes.md; the draft proof
> that went into the commit wave is DIR/proof.md; the commit-wave results are DIR/r3_q*.answer.md and the
> verify query's report is DIR/r3_verify.answer.md (DIR/index.md says which exist; if none exist, finalize from
> the draft; a query the index marks "partial" has instead a DIR/r3_q{k}.partial.md or DIR/r3_verify.partial.md,
> the unfinished notes of an engine that was cut off — unverified, so a proof in one is a lead to check, not a
> result, and the gaps a cut-off verify report lists are still worth checking, though the absence of its final
> verdict tells you nothing either way; the "=== END OF ANSWER … ===" line closing each finished file is bookkeeping); the claims ledger is
> DIR/ledger.md. Read all of these.
>
> You are running a structured parallel attempt at a hard mathematics problem. The commit wave has returned.
> Your job is the final step of the protocol: assemble the final proof.md from the best commit result (or from
> the draft if no commit query produced better). Iterate: if the verify query found gaps, repair what is
> repairable from the material you have; use python3 to check every concrete computational claim you rely on.
> Be honest in the final document about anything that remains a gap — a clearly-marked gap is worth more than a
> papered-over one. The final document must state the problem's answer and give the complete argument, then a
> short section "Status" saying plainly whether the main claim is fully proved and listing anything that
> remains a gap, and a short section "Other routes" on anything else worth recording{PARTIALS_FIN}. If the
> newest [GOAL] line is not PROVED — or is PROVED but not certified by two [AUDIT] lines and its written proof
> does not survive the verify report and your repairs — and the ledger holds, in force, a PROVED [GOAL] line for
> a different claim (the goal was raised after being reached; if several, the most recent), then the main claim
> is that proved goal, stated and proved as the document's theorem, not presented as a lesser result. The raised
> goal is reported after it as attempted, not as a gap in the main claim, and the Status section says plainly
> which claim is the main claim and that the raised goal was not reached. proof.md is read on its
> own by a referee who cannot open any other file in this directory: never cite run files (r*_q*, extra_q*,
> *.answer.md, the verify report, notes, scripts) in it; write every relied-on argument out in full in
> proof.md, rewriting it from the worker files if needed. Save the incoming draft
> as DIR/judge/finalize_previous_proof.md first, then write the final DIR/proof.md. Rewrite DIR/notes.md. Reply
> in under 200 words: first a line beginning exactly "MAIN CLAIM: PROVED" or "MAIN CLAIM: NOT PROVED" (your
> Status section's verdict on proof.md's main claim as defined above; PROVED here means the document's main
> result — a proof, or a disproof, of that claim — is complete), then on the same line a dash and that main
> claim in one clause, then that Status paragraph.

{PARTIALS_FIN} is empty in the SHORT tail and whenever R < ESC_ROUND; in the FULL tail with R ≥ ESC_ROUND it is
exactly (leading space included): " (routes
only sketched or not pursued — whereas every PROVED reduction, reformulation or special case that bears on the
goal belongs in the body, written out in full, the most general first)"

Источник: anthropics/claude-plugins-official / math-proof / siege ↗. Ссылка проверена 2026-10-10.