ЗОРЯ

Головна/Завдання/Частина 4/Коміт і вікна

Коміт і вікна: як влаштовано здачу

опубліковано 21.09

1Що таке здача

1.1

Здача - це коміт. Ні архіву, ні образу, ні кнопки "надіслати": ви пушите у свій репозиторій із частини 1, а в момент вікна ми знімаємо дзеркало і фіксуємо коміт гілки за замовчуванням.

1.2

Фіксується останній коміт гілки за замовчуванням на момент дедлайну. Час коміту в git підробляється, часу push із git не видно, тому єдина позначка, якій ми віримо, - момент, коли ми зняли дзеркало. Запушили о 20:59 UTC - коміт ваш; о 21:01 UTC - він чекає наступного вікна.

1.3

Смикати теги, писати нам листи і натискати будь-що не потрібно. Усе, що від вас потрібно, - щоб гілка за замовчуванням до дедлайну була тією, якою ви хочете грати.

1.4

Після фіксації коміт архівується через git bundle і живе в нас: запис пакета посилається на репозиторій, SHA і замок стека. Це доказ походження коду, і він не залежить від того, що потім станеться з репозиторієм.

2Вікна

2.1

Дати - календар сезону; увесь час - UTC.

ВікноФіксаціяПрогінПерездача
Тренувальний день06.10 21:0007.10немає
Груповий етап09.10 21:0010.10одна, до 10.10 21:00
Вечір 115.10 03:00одразуодна, до 09:00
Вечір 216.10 03:00одразуодна, до 09:00
Вечір 3, фінальна здача17.10 03:00одразуодна, до 09:00
2.2

Фінальна здача - коміт третього вечора. За ним оцінюються код 25, штаб 20 і розбір 10 (scoring.md, 6.4).

2.3

Коміт, що пройшов прогін, називається прийнятим. У вечорі грає коміт цього вечора, а якщо він не прийнятий - останній прийнятий (scoring.md, 6.3). Для першого вечора останній прийнятий - коміт групового етапу.

3Перездача

3.1

Після проваленого прогону у вас одна перездача всередині вікна. Полагодили - запросіть її:

схема
POST /api/v1/me/stack/retry
{ "retry": { "kind": "retry", "requestedAt": "...", "state": "queued", "sha": null } }

Ми знімаємо дзеркало в цей момент, фіксуємо новий HEAD і женемо прогін одразу. sha з'являється, коли дзеркало знято, і стан стає running; далі - ok або failed за вердиктом. Вердикт приходить у кабінет за хвилини.

3.2

Не запросили до кінця вікна - ми візьмемо HEAD самі в останню хвилину вікна і витратимо вашу перездачу на нього. Це рятує забудькуватість, але позбавляє другого погляду: вердикт прийде, коли лагодити вже пізно.

3.3

Перездача одна. Повтор того самого запиту, поки ми її не забрали, відповідає тим самим тілом - мережевий повтор перездачу не спалює; запит другої перездачі - 409 retry-used. Перездача, що не знадобилася у вікні, на наступне вікно не переноситься. Запит поза вікном - 409 no-retry-window.

3.4

Перездача після успішного прогону теж витрачається: якщо після зеленого вердикту ви запросили новий прогін і він провалився, грає останній прийнятий коміт.

4Що видно в кабінеті

4.1

Стан здачі:

схема
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).

4.2

Сповіщення приходять у вашу скриньку (GET /api/v1/inbox):

ПривідКоли
submit-windowза добу до фіксації коміту: коли закривається вікно і до якої години живе перездача
submit-fixedвікно закрилося: коміт зафіксовано, прогін пішов
prestart-failedвердикт із ok: false: що впало і на якому ступені
game-soonза 30 хвилин до вашої гри
resultsколи опубліковано результат вашого пакета
4.3

Жодних листів "усе добре" не буде: зелений вердикт лежить у GET /me/stack, а скринька зайнята тим, що вимагає дії. Листи про вікно і про фіксацію - якраз такі: перший кличе востаннє глянути на гілку, другий називає годину, до якої у вас є перездача.

5Вибування і пізні випадки

5.1

Доступ до репозиторію не підтверджено до 05.10 21:00 UTC - ви поза сезоном (частина 1, P1-06).

5.2

Немає прийнятого коміту до кінця вікна перездачі групового етапу - ви не потрапляєте в нарізку груп 11.10 (scoring.md, 5.1) і не граєте.

5.3

У вечорі: коміт не прийнятий - грає останній прийнятий. Прийнятих немає взагалі - вечір грає бот на вашому місці, ваші частки за нього - нуль.

5.4

Репозиторій недоступний у момент вікна (видалено, перейменовано, відкликано доступ) - дзеркало не знімається, прогін провалюється на ступені repo. Відновити доступ можна в межах вікна перездачі.

5.5

Збій на нашому боці - наш ризик, а не ваш: вікно, зірване нашим збоєм, продовжується на тривалість збою, і про це йде новина. Пакет, зірваний нашим збоєм, переграється в резервне вікно (scoring.md, 5.9); це не зсув розкладу.

5.6

Гілку за замовчуванням перейменовано між вікнами - береться та, яку оголошено в репозиторії на момент вікна. Порожня гілка, коміт без каталогу бота і коміт, який не збирається, - звичайний провал прогону з причиною.

6Що ми читаємо у вашому репозиторії

6.1

Тільки те, що потрібне збірці й оцінюванню: дерево коміту цілком. Дзеркало ми знімаємо з усього репозиторію - з усіма гілками й тегами, і ліміт 200 МіБ (02-build.md, 4.3) рахується по ньому всьому. Збираємо й оцінюємо лише коміт гілки за замовчуванням; інших гілок і налаштувань репозиторію не читаємо.

6.2

Дзеркало і git bundle зберігаються до кінця строку апеляцій за підсумком сезону, потім стираються.

6.3

Права нашого акаунта - ті самі, що з частини 1: запрошення не відкликається до кінця конкурсу (P1-07).