Как запустить

Вся работа с бенчмарком идёт через одну команду — prism. Команды зовутся через uv run — отдельно активировать окружение не нужно, флаги передаются как есть. Эта страница — полный справочник: установка и каждая команда со всеми флагами.

Шпаргалка

prism без команды печатает короткую подсказку «что делать». Справка по любой команде — uv run prism <команда> --help.

Установка

Что нужно заранее: Docker, Python 3.10+, make. Для категории B — образ учебной 1С (prism-onec, собирается из своего дистрибутива; как получить — подскажет make onec-guide) и ключи API моделей в .env (нужны для генерации; чтобы смотреть готовый лидерборд — нет).

Окружение управляет uv (нет uv? — curl -LsSf https://astral.sh/uv/install.sh | sh; или соберите окружение обычным python -m venv .venv && source .venv/bin/activate && pip install -e . — тогда prism зовётся напрямую). Два инструмента: make — поставить, prism — пользоваться.

make setup-all            # окружение (uv) + docker-образы инструментов A + учебная 1С B
# хостовый dev-режим (без Docker, для категории A): make setup + флаги --runner/--bsl local
ЦельЧто ставит
make setup-allвсё в Docker (дефолт): окружение + образы инструментов A + учебная 1С B
make setup-dockerокружение + docker-образы инструментов A (без учебной 1С B)
make setupхостовый dev-режим: инструменты осей на хост (зови с --runner/--bsl local)
make image-onecобраз учебной 1С для категории B (проведёт по дистрибутиву, если его нет)

Команды одним взглядом

КомандаЧто делает
prism doctorбыстрый чек готовности: инструменты осей и ключи моделей (без сети)
prism pingживой минимальный запрос к моделям — проверить ключ и связь
prism generateмодели пишут код по задачам → results/experiment_*.json
prism scoreпересчитать оценку готового кода по осям S·M·O·P → results/auto/
prism leaderboardмгновенно показать лидерборд из готовой оценки (без пересчёта)
prism checkпроверить целостность: контракты, задания, эталоны, инструменты
prism auditпроверить здоровье корпуса результатов: инварианты поверх готовых оценок
prism artifactsразвернуть запись оценок обратно в сырьё прогона: логи 1С как они были
prism submitупаковать прогон для шеринга (хеш совместимости) или принять чужой
prism tasksпересобрать видимый банк задач (tasks/README.md)
prism docsпересобрать таблицы лидерборда и бейджи в README и доках из оценок
prism modelsпоказать каталог моделей — откуда брать ключи для --models (без сети)
prism rebuildпересобрать experiment_*.json из чекпойнтов .parts (если прогон обрывался)
prism chartsнарисовать графики лидерборда (SVG + PNG)

Первый запуск по шагам: doctor (всё ли готово) → ping (отвечают ли модели) → generate --category A --mock (сухой прогон без сети) → score (оценить) → submit (поделиться).

Где исполняется код кандидата

По умолчанию — в Docker-песочнице (код от нейросети недоверенный): категория A в образах prism-onescript + prism-bsl-ls, категория B — в prism-onec. Хостовый режим включается явно (--runner local / --bsl local). На баллы режим не влияет — только на то, где крутится песочница.


prism doctor

Быстрый (секунды, без прогонов в 1С и сетевых вызовов) ответ на вопрос «всё ли у меня есть, чтобы работать». Три среза: окружение (Python/uv), инструменты осей (OneScript, BSL LS, образ prism-onec) и какие ключи моделей заданы в .env. В конце — вердикт «готов к: генерации · оценке A · оценке B».

uv run prism doctor

Флагов нет. Каждый недостающий пункт несёт подсказку, что доставить.

prism ping

Живой минимальный запрос к каждой модели каталога: проверяет, что ключ канала рабочий и провайдер отвечает. Тратит немного токенов — по одному короткому запросу на модель. Модель без ключа не ошибка, а пропуск (запрос не делается).

uv run prism ping                       # все модели с заданными ключами
uv run prism ping --models deepseek gemini   # только выбранные
ФлагПо умолчаниюНазначение
--models [KEY ...]все из каталогакакие модели пинговать (ключи из generation/models.yaml)

Код возврата: 1, если хоть одна модель с ключом не ответила (годится для CI); пропуски на код не влияют.

prism generate

Модели пишут код кандидатов по задачам выбранной категории. Для каждой пары (задача, модель) собирается контекст (категория B — агентным сбором метаданных), делается прогон, ответы хешируются (для воспроизводимости) и пишутся в results/experiment_*.json — в той же схеме, которую читает prism score.

uv run prism generate --category A --mock                # сухой прогон без сети (проба конвейера)
uv run prism generate --category A --models sonnet5           # одна модель, все задачи A
uv run prism generate --category B --models gigachat_max opus # несколько моделей сразу
uv run prism generate --category A --dry-run             # только смета стоимости, без сети
uv run prism generate --category B --tasks B1 B2 --max-cost 5
ФлагПо умолчаниюНазначение
--category {A,B}обязателенкатегория задач
--models [KEY ...]все из каталогаключи моделей; список — prism models (каталог в generation/models.yaml)
--tasks [ID ...]все задачи категориикакие задачи генерировать (напр. A1 A2)
--edition EDITIONcoreиздание из editions/ (условия прогона)
--resume EXP_NAME—дозаписать в существующий эксперимент: пропустить готовые пары
--concurrency Nиз params.yamlпараллельных пар задача×модель
--max-cost USDбез капановые пары не запускать сверх порога стоимости
--retries N3повторов при транзиентном сбое сети
--dry-run—только предполётная смета стоимости, без вызовов сети
--mock [canonical|stub]—сухой прогон без сети: имитация модели mock/echo (canonical — эталон задачи, stub — заглушка)

Ключи API задаются в .env (копия .env.example) — он подхватывается автоматически. Какой ключ нужен для модели — по access.adapter в generation/models.yaml.

Надёжность больших прогонов

Каждый готовый результат сразу пишется в results/<exp>.parts/ (атомарно) — падение на 60/100 не теряет готовое. --resume <exp_name> дозапускает только недостающие/упавшие пары. Транзиентные сбои сети (429/5xx/таймаут) повторяются с паузой; перманентные (401/нет кредитов) — сразу. Цены берутся из датированной таблицы generation/pricing.yaml; модель без цены считается нулевой с предупреждением (бюджет недосчитан, а не врёт).

prism score

Авто-оценка Уровня 1 готовых генераций — без новой генерации, но с пересчётом: код кандидатов исполняется в песочнице (по умолчанию Docker), считаются оси S·M·O·P и общий балл Q, результат пишется в results/auto/<exp>_auto_l1.json. Без --experiment оценивается свежий прогон каждой категории (A и B).

uv run prism score                                 # свежий прогон A и B → два лидерборда
uv run prism score --full                          # + построчная таблица S·M·O·P·Q и срезы
uv run prism score --experiment results/experiment_A_<timestamp>.json
uv run prism score --models ygpt5_lite ygpt51_pro  # дооценить только эти модели (дозапись)
uv run prism score --runner local --bsl local      # на хосте вместо Docker
ФлагПо умолчаниюНазначение
--experiment PATHсвежайший каждой категории (A и B)какой набор генераций оценивать
--models [KEY ...]всеоценить только эти модели и дозаписать в существующий auto_l1 (прежние не пересчитываются)
--task [ID ...]все задачиоценить только эти задачи с дозаписью в auto_l1 (напр. --task B16 B17); комбинируется с --models
--edition EDITIONcoreиздание (какие оси считать)
--out PATHresults/auto/<exp>_auto_l1.jsonкуда писать (имеет смысл только с явным --experiment)
--full—построчная таблица S·M·O·P·Q и срезы по тегам вместо лидерборда
--concurrency Nenv / ≤4параллельных прогонов (поверх PRISM_CONCURRENCY)
--runner {local,docker}env / dockerпесочница оси M, OneScript (поверх PRISM_RUNNER)
--bsl {local,docker}env / dockerинструмент осей S/O, BSL LS (поверх PRISM_BSL)

prism leaderboard

Мгновенная сводка из уже посчитанной оценки L1 — читает results/auto/*_auto_l1.json, без пере-исполнения в 1С (доли секунды против минут у score). Без --experiment печатает свежий лидерборд каждой категории (A и B) единым снимком.

uv run prism leaderboard                           # свежий лидерборд A и B
uv run prism leaderboard --full                    # + построчная таблица и срезы по тегам
uv run prism leaderboard --experiment results/auto/<exp>_auto_l1.json   # конкретная оценка
ФлагПо умолчаниюНазначение
--experiment AUTO_L1свежайший каждой категориипуть к конкретной оценке *_auto_l1.json
--full—добавить построчную таблицу S·M·O·P·Q и срезы по тегам

prism check

Проверка целостности — «прехук» данных бенчмарка. Без аргументов прогоняет всё; флагами можно сузить до одной задачи или категории (быстрая итерация).

uv run prism check                  # полная проверка (гейт перед коммитом)
uv run prism check --task B15       # быстро: эталон только задачи B15
uv run prism check --category A     # эталоны только категории A

Четыре среза, от дешёвого к дорогому:

  1. Контракты метрики — конституция/протокол/издания/генерация грузятся и согласованы.
  2. Контракты заданий — каждая задача валидна; у исполнимых есть тесты и точки входа.
  3. Когерентность эталонов — canonical.bsl каждой задачи проходит свои скрытые тесты на 100% (разом валидирует и тесты, и эталон). Требует песочницы; нет инструмента — срез пропускается.
  4. Инструменты по осям — доступность OneScript (M), BSL LS (S/O), образа prism-onec (B).
ФлагПо умолчаниюНазначение
--task [ID ...]все задачипрогнать эталоны только этих задач
--category {A,B}обепрогнать эталоны только этой категории
--concurrency Nenv / ≤4параллельных прогонов
--runner {local,docker}env / dockerпесочница оси M
--bsl {local,docker}env / dockerинструмент осей S/O

Код возврата: 0 — нарушений нет; 1 — есть хоть один сбой (контракт или эталон, не прошедший свои тесты). Подходит для CI-гейта.

prism audit

Аудит корпуса результатов. Отличие от check простое: check проверяет определение бенчмарка (задачи, эталоны, контракты), audit — его результаты. Зелёный check про здоровье корпуса не говорит ничего: линейку мы проверяем вежливым кодом эталонов, а мерим ею невежливый код моделей, и ломается она именно на нём.

Аудит ничего не правит. Он читает results/ и печатает, где данные противоречат сами себе; что с этим делать, решает человек.

uv run prism audit                                  # оба прогона, сводка в терминал
uv run prism audit --category B                     # только платформенные задачи
uv run prism audit --out audit.md                   # плюс отчёт со списками записей
uv run prism audit --baseline results/auto/snapshots/<дата>_before_hygiene

Что проверяется:

  1. Связка рулона и оценок — у каждой оценки есть своя генерация, хеш ответа совпадает, нет сирот и дублей от прошлых прогонов, схема записей однородна.
  2. Условия прогона — известен ли потолок выхода, единый ли он по корпусу, какие ответы упёрлись в него (обрыв по длине) и какие пришли пустыми.
  3. Ответ без кода против оси S — текст без объявления функции не должен получать положительный балл за синтаксис.
  4. Ось O — код, который исполнился в оси M, но остался без замера оптимальности; причины неизмеренной оси, разложенные по видам.
  5. Оси M и P — что прилетело под общим маркером «Ошибка при вызове метода контекста (Выполнить)»: обращение к метаданным (ось P) или авторство текста запроса (ось M).
  6. Инфраструктура против вины модели — прогоны, не состоявшиеся по нашей вине.
  7. Задачи — где доля нулевого смысла так высока, что подозрение падает на саму задачу.
  8. Влияние неизмеренных осей на Q — насколько общий балл поднят выпадением оси.
  9. Дрейф — при --baseline построчная сверка с сохранённым снимком.
ФлагПо умолчаниюНазначение
--category {A,B}обетолько эта категория
--experiment PATHсвежий рулонконкретный experiment_*.json
--auto PATHсвежая оценкаконкретный *_auto_l1.json
--baseline DIRнеткаталог снимка для сверки дрейфа
--out PATHнетзаписать подробный отчёт в markdown

Код возврата: 0 — нарушений нет; 1 — есть. Предупреждения на код возврата не влияют.

prism artifacts

Отвечает на вопрос «почему у этой записи такой балл», не запуская 1С заново. Сырьё прогона лежит в хранилище замеров, а ключ прогона сохраняется в самой оценке (detail.M.run_key): по нему команда и достаёт артефакты.

uv run prism artifacts B12 "Qwen3.8 27b"             # логи в терминал
uv run prism artifacts B19 "Claude Opus 5" --out /tmp/raw   # сохранить файлами

Имя модели берётся подстрокой, регистр не важен. В терминал идут лог компиляции (check.log) и результат тестов (result.txt), плюс строка с отметкой обращения к данным и кодами завершения конфигуратора и сеанса. С --out в каталог кладутся три файла целиком: check.log, result.txt, load.log.

ФлагПо умолчаниюНазначение
--auto PATHсвежая оценкаконкретный *_auto_l1.json
--out DIRнетсохранить артефакты файлами вместо вывода в терминал
--exportнетсобрать сырьё всех опубликованных оценок в results/artifacts.jsonl.gz

Код возврата: 0 — сырьё найдено; 1 — записи нет ссылки на сырьё (посчитана до того, как ссылку стали сохранять) либо ключа нет в хранилище; 2 — запись или файл оценок не найдены.

Свежий клон тоже может проверить балл. Кэш замеров в репозиторий не идёт: это десятки мегабайт промежуточных прогонов. Но доказательная часть едет вместе с оценками: prism artifacts --export собирает в results/artifacts.jsonl.gz только те прогоны, на которые ссылаются сами записи (около тысячи, меньше мегабайта), и файл отслеживается git. При разборе команда сначала смотрит в кэш, а если его нет — в эту выгрузку. Пересобирать выгрузку нужно после пересчёта, который менял прогоны.

Чистка кэша стирает сырьё

Кэш results/.measure_cache/ служит сразу двум целям: ускоряет пересчёт и хранит логи прогонов целиком. Удалить каталог значит потерять возможность разобрать руками любой балл, кроме вошедших в выгрузку; пересчёт вернёт только цифры.

prism submit

Упаковать свой прогон для шеринга — так, чтобы автор бенчмарка мог влить его в лидерборд и быть уверенным, что цифры сравнимы. Оценки L1 на разных версиях бенчмарка несравнимы, поэтому к результату прикладывается compat_hash — отпечаток версии (метрика + набор задач).

# контрибьютор: упаковать свежую оценку
uv run prism submit                                # → results/submissions/<exp>_submission.json
uv run prism submit --experiment results/auto/<exp>_auto_l1.json

# автор: принять чужой пакет
uv run prism submit --verify file_submission.json          # сверить версию бенчмарка
uv run prism submit --verify file_submission.json --apply  # + влить в results/auto/
ФлагПо умолчаниюНазначение
--experiment AUTO_L1свежайшийкакую оценку упаковать
--verify FILE—режим автора: сверить отпечаток чужого пакета с текущим репозиторием
--apply—с --verify: при совместимости влить оценку в results/auto/

При совпадении отпечатка пакет можно вливать (--apply кладёт оценку в results/auto/, дальше лидерборд пересобирает prism docs); не совпал — прогон на другой версии, цифры несравнимы (код возврата 1).

prism tasks

Пересобирает видимый банк задач — файл tasks/README.md со списком всех заданий, их навыками и конструкциями 1С — из task.yaml каждой задачи. Запускать после добавления или изменения задач (это же гейтит prism check).

uv run prism tasks

Флагов нет.

prism docs

Пересобирает таблицы лидерборда и счётные бейджи в README.md и docs/leaderboard.md — подменяет помеченные регионы между <!-- prism:KEY --> данными из results/auto/*_auto_l1.json. Запускать после prism score.

uv run prism docs

Флагов нет. Таблицы — производные данные (источник правды — оценки в results/auto/), поэтому руками их не правят.


Переменные окружения

Управляют исполнением и не входят в идентичность балла. Работают из .env (см. .env.example) и как обычные переменные окружения. Приоритет: флаг CLI > переменная окружения > .env.

ПеременнаяПо умолчаниюЧто делает
PRISM_RUNNERdockerпесочница оси M (OneScript): docker | local
PRISM_BSLdockerинструмент осей S/O (BSL LS): docker | local
PRISM_CONCURRENCY≤4сколько кандидатов считать параллельно
PRISM_JAVAавтопоискпуть к java 21+ для BSL LS в режиме local
PRISM_ONEC_MEMORY—лимит памяти контейнера 1С (docker --memory), напр. 2g
PRISM_ONEC_CPUS—лимит CPU контейнера 1С (docker --cpus), напр. 1
PRISM_PROXY_RU—прокси для отечественных каналов (YandexGPT, GigaChat)
PRISM_PROXY_INTL—прокси для зарубежных каналов (OpenRouter)
PRISM_NO_CACHE—1 выключает кэш сырых замеров: прогон идёт на живую
PRISM_HTTP_TIMEOUT—таймаут запроса к провайдеру, секунды (для медленных каналов)

Не хватает памяти при параллельном прогоне категории B — снизьте PRISM_CONCURRENCY или задайте PRISM_ONEC_MEMORY / PRISM_ONEC_CPUS. При нехватке прогон честно помечается «не измерено», а не выдаёт неверный балл.

Кэш сырых замеров (results/.measure_cache/, в git не идёт). Ключ считается по содержимому входа песочницы: текст скрипта плюс версия инструмента. Поэтому правка протокола или скорера вход не меняет, сырьё берётся из кэша, а балл выводится заново, и пересчёт неизменных записей стоит секунды вместо часов. Таймауты не кэшируются: это свойство загрузки машины, а не входа. Выключить кэш и перепроверить движок на живую — PRISM_NO_CACHE=1.