Головна/Завдання/Частина 4/Коміт і вікна
Коміт і вікна: як влаштовано здачу
1Що таке здача
Здача - це коміт. Ні архіву, ні образу, ні кнопки "надіслати": ви пушите у свій репозиторій із частини 1, а в момент вікна ми знімаємо дзеркало і фіксуємо коміт гілки за замовчуванням.
Фіксується останній коміт гілки за замовчуванням на момент дедлайну. Час коміту в git підробляється, часу push із git не видно, тому єдина позначка, якій ми віримо, - момент, коли ми зняли дзеркало. Запушили о 20:59 UTC - коміт ваш; о 21:01 UTC - він чекає наступного вікна.
Смикати теги, писати нам листи і натискати будь-що не потрібно. Усе, що від вас потрібно, - щоб гілка за замовчуванням до дедлайну була тією, якою ви хочете грати.
Після фіксації коміт архівується через git bundle і живе в нас: запис пакета посилається на репозиторій, SHA і замок стека. Це доказ походження коду, і він не залежить від того, що потім станеться з репозиторієм.
2Вікна
Дати - календар сезону; увесь час - UTC.
| Вікно | Фіксація | Прогін | Перездача |
|---|---|---|---|
| Тренувальний день | 06.10 21:00 | 07.10 | немає |
| Груповий етап | 09.10 21:00 | 10.10 | одна, до 10.10 21:00 |
| Вечір 1 | 15.10 03:00 | одразу | одна, до 09:00 |
| Вечір 2 | 16.10 03:00 | одразу | одна, до 09:00 |
| Вечір 3, фінальна здача | 17.10 03:00 | одразу | одна, до 09:00 |
Фінальна здача - коміт третього вечора. За ним оцінюються код 25, штаб 20 і розбір 10 (scoring.md, 6.4).
Коміт, що пройшов прогін, називається прийнятим. У вечорі грає коміт цього вечора, а якщо він не прийнятий - останній прийнятий (scoring.md, 6.3). Для першого вечора останній прийнятий - коміт групового етапу.
3Перездача
Після проваленого прогону у вас одна перездача всередині вікна. Полагодили - запросіть її:
POST /api/v1/me/stack/retry
{ "retry": { "kind": "retry", "requestedAt": "...", "state": "queued", "sha": null } }Ми знімаємо дзеркало в цей момент, фіксуємо новий HEAD і женемо прогін одразу. sha з'являється, коли дзеркало знято, і стан стає running; далі - ok або failed за вердиктом. Вердикт приходить у кабінет за хвилини.
Не запросили до кінця вікна - ми візьмемо HEAD самі в останню хвилину вікна і витратимо вашу перездачу на нього. Це рятує забудькуватість, але позбавляє другого погляду: вердикт прийде, коли лагодити вже пізно.
Перездача одна. Повтор того самого запиту, поки ми її не забрали, відповідає тим самим тілом - мережевий повтор перездачу не спалює; запит другої перездачі - 409 retry-used. Перездача, що не знадобилася у вікні, на наступне вікно не переноситься. Запит поза вікном - 409 no-retry-window.
Перездача після успішного прогону теж витрачається: якщо після зеленого вердикту ви запросили новий прогін і він провалився, грає останній прийнятий коміт.
4Що видно в кабінеті
Стан здачі:
GET /api/v1/me/stack
{
"status": "ok" | "failed" | "none",
"latest": { "id", "sha", "digest", "at", "ok", "checks": [ { "name", "ok", "detail" } ] },
"history": [ ... до 20 вердиктів, свіжі першими ... ],
"nextGameAt": "2026-10-11T21:40:00Z",
"submit": {
"window": { "id", "title", "freezeAt", "retryUntil", "phase" },
"submissions": [ { "kind": "window" | "retry", "auto", "requestedAt", "sha", "state" } ],
"retry": { "available", "used", "until" }
}
}sha - зафіксований коміт, digest - замок стека (02-build.md, розділ 5), checks - ступені прогону в порядку проходження (03-preflight.md). submit - ваша здача в поточному вікні: phase вікна - ahead (до фіксації), retry (іде вікно перездачі) або past; auto у здачі означає, що HEAD узяли ми самі в останню хвилину (3.2).
Сповіщення приходять у вашу скриньку (GET /api/v1/inbox):
| Привід | Коли |
|---|---|
submit-window | за добу до фіксації коміту: коли закривається вікно і до якої години живе перездача |
submit-fixed | вікно закрилося: коміт зафіксовано, прогін пішов |
prestart-failed | вердикт із ok: false: що впало і на якому ступені |
game-soon | за 30 хвилин до вашої гри |
results | коли опубліковано результат вашого пакета |
Жодних листів "усе добре" не буде: зелений вердикт лежить у GET /me/stack, а скринька зайнята тим, що вимагає дії. Листи про вікно і про фіксацію - якраз такі: перший кличе востаннє глянути на гілку, другий називає годину, до якої у вас є перездача.
5Вибування і пізні випадки
Немає прийнятого коміту до кінця вікна перездачі групового етапу - ви не потрапляєте в нарізку груп 11.10 (scoring.md, 5.1) і не граєте.
У вечорі: коміт не прийнятий - грає останній прийнятий. Прийнятих немає взагалі - вечір грає бот на вашому місці, ваші частки за нього - нуль.
Репозиторій недоступний у момент вікна (видалено, перейменовано, відкликано доступ) - дзеркало не знімається, прогін провалюється на ступені repo. Відновити доступ можна в межах вікна перездачі.
Збій на нашому боці - наш ризик, а не ваш: вікно, зірване нашим збоєм, продовжується на тривалість збою, і про це йде новина. Пакет, зірваний нашим збоєм, переграється в резервне вікно (scoring.md, 5.9); це не зсув розкладу.
Гілку за замовчуванням перейменовано між вікнами - береться та, яку оголошено в репозиторії на момент вікна. Порожня гілка, коміт без каталогу бота і коміт, який не збирається, - звичайний провал прогону з причиною.
6Що ми читаємо у вашому репозиторії
Тільки те, що потрібне збірці й оцінюванню: дерево коміту цілком. Дзеркало ми знімаємо з усього репозиторію - з усіма гілками й тегами, і ліміт 200 МіБ (02-build.md, 4.3) рахується по ньому всьому. Збираємо й оцінюємо лише коміт гілки за замовчуванням; інших гілок і налаштувань репозиторію не читаємо.
Дзеркало і git bundle зберігаються до кінця строку апеляцій за підсумком сезону, потім стираються.