Головна/Завдання/Частина 4/Передстартовий прогін
Передстартовий прогін: ворота допуску
1Що це
Передстартовий прогін - машинна перевірка здачі: ми беремо зафіксований коміт, збираємо стек, піднімаємо його на машині учасника і дивимося, чи сідає він за стіл. Зелений вердикт - допуск; червоний - одна перездача у вікні (01-submit.md, розділ 3).
Прогін не ставить балів і не пробує вашу стратегію: партія проби коротка, суперники - грамоти-заглушки, жереб службовий. Перевіряється провід, а не гра.
Зелений CI у вашому репозиторії нічого не означає: ворота - це наш прогін і тільки він.
2Ступені
Ступені йдуть по порядку; перший, що впав, зупиняє решту. Імена ступенів приходять у вердикт полем name, причина - полем detail.
| # | Ступінь | Що перевіряє | Часта причина провалу |
|---|---|---|---|
| 1 | repo | дзеркало знялося, гілка за замовчуванням є, коміт зафіксовано, розмір дзеркала в ліміті, дерево вивантажено | репозиторій недоступний, гілки немає, дзеркало більше за 200 МіБ |
| 2 | secrets | сканер витоків на дереві та історії коміту | ключ, токен або пароль в історії |
| 3 | nakaz | bot/nakaz.yaml на місці і проходить три ступені лінтера | грамоти немає, крок не зі словника, селектор не зі словника |
| 4 | lang | zaria.bot запускає node з файлом із каталогу бота; у каталозі тільки TS і JS | команда запуску не node, вихідний код іншою мовою |
| 5 | stack | compose.yaml читається, ролі на місці, правила машини дотримано | дві голови, bind-том, include, контекст збірки поза репозиторієм |
| 6 | build | образи зібралися з коміту, замок записано | збірка не вклалася у 20 хвилин, немає lockfile, помилка компіляції |
| 7 | up | відкат до знімка підняв стек | сервіс падає на старті, чекає того, чого немає |
| 8 | hello | голова присягнула вузлу в лобі і вела слот сама | бот не встиг до дедлайну лобі, слот вела грамота, кадр не за схемою |
| 9 | health | /health відповідає до партії і 200 після неї | ручка слухає 127.0.0.1, а не 0.0.0.0; після партії відповідає 503 |
| 10 | metrics | /metrics віддає п'ять канонних лічильників | лічильник перейменовано або він зник |
| 11 | hq-bundle | штаб віддає / сторінкою text/html і всі її місцеві ресурси 200 | збірка штабу не потрапила в образ, шлях до ресурсу битий |
Ступінь hq-bundle іде, тільки якщо в стеку є роль zaria.hq. Штаб для допуску не обов'язковий: не оголосили - ступеня просто немає, вердикт від цього червоним не стане, і до партій вас допустять. Ціна відсутності штабу - нуль із двадцяти балів його осі на прийманні (частина 3). Ворота допуску і бали - різні речі.
3Партія проби
Проба - справжня коротка партія на тому самому шлюзі, з тією самою печаткою і тією самою адресою вузла, що в залікового пакета. Два сусідні місця ведуть грамоти-заглушки: запис партії вимагає протокольних ботів у всіх трьох слотах, а судимо ми одного учасника.
Голова мусить присягнути за час лобі і вести слот сама. Епізоди наказу в пробі припустимі, але їхнє число друкується в detail: слот, який усю пробу вела грамота, - це провал ступеня hello.
Перед пробою машина відкочується до знімка - так само, як перед кожним прогоном залікового пакета. Прогін міряє і час відкату: він друкується в detail ступеня up.
4Вердикт
Вердикт приходить у кабінет (01-submit.md, розділ 4):
{
"sha": "9f2c1b...",
"digest": "sha256:...",
"at": "2026-10-10T18:04:11Z",
"ok": false,
"checks": [
{ "name": "repo", "ok": true, "detail": "mirror synced, main@9f2c1b0e4a77, 12.4 MiB" },
{ "name": "lang", "ok": true, "detail": "zaria.bot: node dist/main.js, directory bot, no foreign sources" },
{ "name": "stack", "ok": true, "detail": "services 2: head head, control head:7801, hq hq:8080" },
{ "name": "hello", "ok": false, "detail": "no oath by the lobby deadline: the nakaz ran the slot" }
]
}Порожні значення в незібраного стека чесні й упізнавані: SHA із сорока нулів означає "коміту немає", sha256 порожнього входу - "стек не зібрано".
Вердикт з ok: true може нести перевірку, що впала: означає, конвеєр визнав її такою, що не замикає. Що замикає, а що ні, видно з поля ok вердикту, а не з кольору окремого рядка.
Сперечатися з вердиктом можна апеляцією на рядок: номер прогону, ім'я ступеня і його detail (scoring.md, 14). Розбіжність нашого повторного прогону з початковим тлумачиться на вашу користь.
5Прогін у себе
npx zaria-kit preflightКоманда жене ті самі одинадцять ступенів на вашій машині: збирає стек із робочого дерева (або з коміту з прапорцем --sha), піднімає його, грає пробу і друкує такий самий список перевірок.
| Прапорець | За замовчуванням | Що змінює |
|---|---|---|
--sha КОМІТ | робоче дерево | що збирати: дерево чи коміт |
--ticks N | 60 | довжина партії проби |
--keep | вимк. | не гасити стек після прогону: можна зайти руками |
--json ФАЙЛ | preflight.json | куди писати вердикт |
--lang uk\|en | zaria.lang | мова виводу |
Потрібні Docker із compose v2 і Node.js 24. Секрет реєстру прогін бере зі змінної ZORIA_NPM_AUTH вашого оточення і передає його збірці так само, як це робимо ми (02-build.md, розділ 7); в образ він не потрапляє.
Відмінності від нашого прогону - машина і мережа: у нас стек стоїть на своїй машині з відкатом до знімка, у вас - на вашій. Ступені, коди і причини ті самі.
6Тренувальний день 07.10
Коміт фіксується 06.10 о 21:00 UTC, прогін іде вранці 07.10, далі ваша голова грає один пакет проти двох ботів організаторів. Усе це поза заліком: частки не рахуються, балів немає.
У кабінет приходить вердикт прогону і запис пакета: ті самі файли, що в залікового пакета (part3/03-record.md, розділ 6). Це перша можливість побачити свій штаб на своєму справжньому записі і свої лічильники каналу на справжньому вузлі.
Провал тренувального дня нічим не загрожує: він не ворота, а репетиція. Ворота - прогін 10.10.
Суперники тренувального дня - голови архетипів SDK, ті самі, що в локальному пакеті (part2/06-local-pack.md, розділ 3). Які саме - оголосимо новиною напередодні.