Головна/Завдання/Частина 3/Завдання штабу
Доповнення 1: задачі штабу, бюджети і замір кадру
Доповнення до документа оцінки, розділ 9.3. Номер 1, дата , підписав головний рефері. Діє з фінальної здачі. Основний текст оцінки не змінюється: тут розкрито те, що він назвав доповненням, - задачі, якорі, бюджети, еталонний запис і драйвер.
Якорі й органи - 01-hq-contract.md, розділи 3 і 4. Запис і його формати - 03-record.md.
1Як рахується бал
У кожної можливості свій набір задач: Ш1 - п'ять, Ш2 - чотири, Ш3 - чотири, Ш4 - чотири, Ш5 - три. Усього двадцять.
Задачу розв'язано, якщо якір відповіді до кінця бюджету несе значення, рівне ключу. Ключ рахує рушій за тим самим записом.
Бал можливості - число розв'язаних задач, але верхній щабель (5, 4, 4, 4 і 3 відповідно) дається, тільки якщо розв'язано всі задачі можливості і кадр штабу не гірший за еталонний (розділ 4). Розв'язано всі задачі, а кадр гірший - бал на одиницю нижчий за верхній щабель.
Прогін один, за фінальною здачею (scoring.md, 6.4). Помилка в консолі або необроблений виняток за прогін - провал усього прогону (P3-11): рахується нуль за всіма п'ятьма можливостями. Тому спершу лагодять консоль, а потім задачі.
Штаб, який не зібрався або не відкрив запис, отримує нуль. Дод. бал за знахідку поза списком Ш1-Ш5 - окрема колонка (scoring.md, 11.2), до цих двадцяти не додається.
2Жереб задач
Задача - шаблон: що спитати, у якого якоря взяти відповідь, яким органом дістатися. Числа шаблона - такт, сота, номер партії, номер команди - беруться жеребом.
Жереб залікового прогону закритий до прогону і оголошується у звіті разом із відповідями. Ваш жереб вибирається прапорцем --seed: задачі ті самі, числа інші. Відповідь, вписана в код заздалегідь, не працює ні в кого.
Жереб бере тільки осмислені параметри: такт не раніший за 30-й і не пізніший за кінець партії, сота - голка долини з маніфесту, машина - з тих, з ким у фокуса був контакт до цього такту, номер команди - з тих, що в цьому такті були, партія - будь-яка з трьох. Якщо у фокуса в цьому такті немає жодної команди, жереб бере інший такт. Там, де задача дивиться назад (Ш2-2), такт береться не раніший за 330-й, щоб відлік назад лишався всередині партії.
Голки долини всюди, де їх рахують, - це голки з маніфесту партії. Світ заводить голки і поза цим списком; у рахунок Ш1-4 і Ш1-5 вони не йдуть.
Фокус - учасник, чий щоденник віри лежить у записі. В еталонному записі це одне місце з трьох; у вашому локальному - ваш бот.
3Задачі
Ш1. Правда проти віри (5 задач)
| ID | Що питає драйвер | Органи | Якір відповіді | Ключ |
|---|---|---|---|---|
| Ш1-1 | Чия голка стоїть у соті q,r на такті T партії M за правдою світу | go-match, go-tick, go-mode=truth, go-cell | cell-owner-truth | власник голки у світі рушія на такті T; голки немає - - |
| Ш1-2 | Що про ту саму соту думав бот фокуса | go-mode=belief, go-focus | cell-owner-belief | зі щоденника віри на такті T: нік, - (за вірою голка нічия) або ? (не знає) |
| Ш1-3 | Де за вірою фокуса чужа машина U і скільки тактів цій пам'яті | go-unit | ghost-cell і ghost-age | останній контакт з U не пізніше такту T зі щоденника віри: його сота і T мінус такт контакту; обидві величини правильні - задачу розв'язано |
| Ш1-4 | Скільки голок у фокуса на такті T розходяться з правдою | go-tick, go-focus | diff-count | число голок долини, де власник за вірою не дорівнює власникові за правдою; голки, про які фокус не знає нічого, не рахуються |
| Ш1-5 | Скільки голок долини мовчить за вірою фокуса | ті самі | dark-count | число голок маніфесту, у яких у вірі фокуса на такті T стоїть мовчання (dark) |
Ш2. Перемотування (4 задачі)
| ID | Що питає драйвер | Органи | Якір відповіді | Ключ |
|---|---|---|---|---|
| Ш2-1 | Рахунок фокуса на такті T партії M | go-match, go-tick | score | рахунок слота фокуса у світі рушія на такті T, один знак після крапки |
| Ш2-2 | Скільки голок, що горять, було у фокуса на 300 тактів раніше | go-tick (назад) | needles | голки фокуса, що горять, на такті T - 300 |
| Ш2-3 | Чим скінчився пакет | go-match=3, go-tick у кінець | shares | частки пакета з pack.json, у порядку залу |
| Ш2-4 | Рахунок фокуса після трьох переходів поспіль T1 -> T2 -> T3 | go-tick тричі | score | рахунок на такті T3; кожен перехід - у свій бюджет 5 с |
Ш3. Профайлер каналу (4 задачі)
| ID | Що питає драйвер | Органи | Якір відповіді | Ключ |
|---|---|---|---|---|
| Ш3-1 | Скільки байтів пішло в кадрі команд фокуса на такті T | go-match, go-tick | bytes | довжина кадру слота фокуса на такті T з журналу |
| Ш3-2 | Скільки команд подано і скільки відхилено на такті T | ті самі | orders і denied | число команд у кадрі і число відмов цього такту; обидві величини правильні - задачу розв'язано |
| Ш3-3 | За що відхилено команду номер i на такті T | go-order | deny-word | слово коду відмови з журналу (part2/04-protocol.md, 6.6); команду прийнято - - |
| Ш3-4 | На якому такті партії M у фокуса було найбільше відмов | go-match | deny-top-tick | такт із найбільшим числом відмов; за рівності - менший такт |
Ш4. Порівняння пресетів і переведення в бій (4 задачі)
Дано два записи одного жереба, зіграні різними пресетами нашого бота: preset-a і preset-b (03-record.md, розділ 5). Якорі ab-* порівнюють завжди цю пару, хоч би який запис був відкритий: go-pack і go-match тут вибирають, на чому стоїть показ, а не що з чим порівнювати. Статті беруться зі зведень пакетів - відкривати журнали для Ш4 немає навіщо.
| ID | Що питає драйвер | Органи | Якір відповіді | Ключ |
|---|---|---|---|---|
| Ш4-1 | Який пресет дав більше хвилин мережі за пакет | go-pack=preset-a | ab-winner | id запису з більшим breakdown.network за пакет; порівну - preset-a |
| Ш4-2 | На скільки розійшовся рахунок у партії M | go-pack, go-match | ab-diff | різниця breakdown.total двох записів у партії M, за модулем, один знак після крапки |
| Ш4-3 | За якою статтею розбіжність найбільша | ті самі | ab-top | ключ статті з найбільшою різницею за модулем: network, orders, stolen або pactTax |
| Ш4-4 | Перевести пресет P у бій | go-preset, do-promote | promote-status | код відповіді господаря на заявку: 200 або 409; штаб показує те, що прийшло |
Ш4-4 - про чесність показу. Господар відповідає за жеребом: іноді 200, іноді 409 (заморожено). Штаб, який малює успіх, не дочекавшись відповіді, задачі не розв'язує.
Ш5. Спостереження за поточною партією (3 задачі)
Драйвер подає партію ефіру по такту раз на 25 мс (--tempo, розділ 6): у двадцять разів швидше, ніж вузол на вечорі, де такт триває 500 мс (part2/01-rules.md, 6.1). Штаб мусить витримувати цей темп: якір tick не відстає від стелі більше ніж на 2 такти (Ш5-1).
| ID | Що питає драйвер | Органи | Якір відповіді | Ключ |
|---|---|---|---|---|
| Ш5-1 | Наскільки показ відстає від стелі | - | live-lag і tick | live-lag не більший за 2, і tick не менший за cap - 2 на момент читання |
| Ш5-2 | Рахунок фокуса в ефірі на поточному такті | - | score | рахунок на такті, який показує якір tick |
| Ш5-3 | Чим скінчилася партія ефіру | - | live-state і shares | live-state дорівнює end, shares дорівнюють часткам ЦІЄЇ партії - тим, що господар прислав у end |
4Кадр
Сценарій заміру: відкрити еталонний запис, пустити показ поспіль на 200 тактів, зробити три переходи (вперед, назад, вперед), повернутися на початок. Драйвер рахує час кадрів браузера і друкує 95-й перцентиль і найгірший кадр.
У тому самому прогоні на тій самій машині драйвер міряє наш еталон (records/hq-ref.html). Порівнюються обидві пари чисел: ваш 95-й перцентиль з еталонним і ваш найгірший кадр з еталонним. Допуск - 15 %: кадр вважається не гіршим за еталонний, якщо ваш 95-й перцентиль не більший за еталонний плюс 15 % і одна мілісекунда, а найгірший кадр - за еталонний плюс 15 % і дві мілісекунди. Суперечка про десяту частку мілісекунди - суперечка про шум, а не про швидкість.
Числа еталона на нашій машині приймання: 95-й перцентиль 12.4 мс, найгірший кадр 23.1 мс, вікно 1600x1000, масштаб 1, стеля кадрів у браузері знята. Вони опубліковані для орієнтира; залік рахує пару, зняту в одному прогоні з вашим штабом.
Кадри міряють тільки на сценарії 4.1. Завантаження, розбір запису і перше малювання в замір не входять - у них свій бюджет 15 секунд (01-hq-contract.md, 4.4).
5Звіт драйвера
Прогін закінчується файлом hq-report.json:
{
"hq": "ім'я штабу з hello",
"at": "2026-10-17T04:12:33Z",
"engine": "264a77c2a5405955f5aba04be240325d65cfe5d25269ae2f7c6a9fc7f4ff0e26",
"record": "1079e82de6ac6ef0c02f3aaf45c33d196c25999605a38e3809c22a82d5e00052",
"seed": 918273,
"tasks": [
{ "id": "Ш1-1", "ok": true, "want": "kuznya", "got": "kuznya", "ms": 412 },
{ "id": "Ш1-3", "ok": false, "want": "52", "got": "-", "ms": 3001 }
],
"frames": { "p95": 11.2, "worst": 24.8, "ref": { "p95": 9.4, "worst": 21.0 } },
"console": [],
"score": { "Ш1": 4, "Ш2": 4, "Ш3": 3, "Ш4": 2, "Ш5": 3, "total": 16 },
"clean": true,
"frameOk": true
}clean - чи була консоль чиста за прогін (P3-11); frameOk - чи вклався кадр у планку еталона (розділ 4). Обидва поля виведені з решти і стоять у звіті для того, щоб аркуш оцінки не рахував їх наново. record - sha256 зведення еталонного запису.
Той самий файл ви отримуєте в себе. У кабінет він приходить разом з аркушем оцінки (scoring.md, 2.6); апеляція сперечається з рядком звіту - задачею, відповіддю і ключем (scoring.md, 14).
6Прогін у себе
npx zaria-kit init hq # заготовка показу, якщо її ще немає
npx zaria-kit records # еталонний запис і пара пресетів
npm run build --workspace hq # або ваша команда збірки штабу
npx zaria-kit hq-check --seed 4242 # той самий драйвер, свій жереб| Прапорець | За замовчуванням | Що змінює |
|---|---|---|
--hq КАТАЛОГ | zaria.hq з package.json штабу | що відкривати |
--record КАТАЛОГ | records/reference | на якому записі ганяти задачі |
--seed N | випадковий | жереб параметрів задач |
--broadcast | вимк. | прогнати тільки сценарій показу: ефір, сторож, пісочниця |
--json ФАЙЛ | hq-report.json | куди писати звіт |
--ref ФАЙЛ | records/hq-ref.html | бандл еталона для планки кадру |
--tempo МС | 25 | темп ефіру в прогоні Ш5 |
--lang uk\|en | zaria.lang | мова виводу |
Драйверові потрібен Chrome або Chromium на машині; він відкриває штаб у пісочниці з тими самими заголовками, що й у нас.
7Що закрито
Відкрито все, чим міряють: шаблони задач, якорі, бюджети, ключі, сценарій заміру, сам драйвер і еталонний запис. Закритий тільки жереб залікового прогону - до звіту (2.2). Підігнати штаб під мірку можна єдиним способом: показувати правильні числа швидко. Межу відкритого проведено за тим самим законом Гудгарта, що й для коду (scoring.md, 8.8).