Головна/Завдання/Частина 2/Локальний пакет
Локальний пакет: команда, склади, запис, час на такт
Локальний пакет - залікова одиниця у вас на машині: три партії одного жереба, ваш бот по черзі у вершинах A, B і C, два суперники, запис текою і частки 3, 2, 1 за кожну партію (01-rules.md, розділ 25). Грає його команда zaria-kit pack пакета @zoria/kit; у шаблоні бота вона викликається так:
npm run play # збирання бота і пакет у темпі 500 мс на такт
npm run play -- --fast # те саме без паузи між тактами1Прапорці
| Прапорець | За замовчуванням | Що змінює |
|---|---|---|
--seed N | 2026 | жереб пакета |
--packs K | 1 | пакетів поспіль на жеребах N, N+1, ... і підсумок за всіма |
--ticks N | 1200 | тактів у партії; коротка партія - для швидкої перевірки, не для оцінки |
--fast | вимк. | без паузи між тактами |
--vs A,B | обхідник,рівний | два суперники (розділ 3) |
--bot КОМАНДА | zaria.bot з package.json, інакше node dist/main.js | як запускати вашого бота; nakaz і manual - розділ 3 |
--nakaz ФАЙЛ | nakaz.yaml | грамота вашого місця |
--out КАТАЛОГ | records | куди писати записи |
--lobby МС | 10000 (manual - 120000) | скільки вузол чекає присяги |
--verbose | вимк. | журнал вузла повністю; його пише @zoria/server, англійською |
--provoke N | вимк. | вузол-провокатор рівня 1, 2 або 3: дублі кадрів і часті ротації, обриви з поверненням, зупинка процесу бота (рівень 3 - тільки з --bot КОМАНДА); наприкінці - лічильники кривизни і пропущені такти (04-protocol.md, розділи 8 і 9). Ручки рівнів відкриває доповнення 2 до оцінювання |
--lang uk\|en | zaria.lang з package.json, інакше uk | мова виводу команди |
Невідомий прапорець - помилка, а не значення за замовчуванням. Мова виводу команди обирається так: прапорець --lang, змінна ZARIA_LANG, поле zaria.lang у package.json каталогу бота (його пише init), інакше українська - мова конкурсу.
2Що відбувається
Вузол локального пакета - той самий код вузла @zoria/server, що грає залікові партії: шлюз на 127.0.0.1 (вільний порт), присяга, дедлайн 500 мс на кадр, страж наказу з вашою грамотою, запис журналів.
Перед кожною партією команда запускає вашого бота окремим процесом зі змінними середовища ZARIA_URL, ZARIA_TOKEN, ZARIA_ENGINE (хеш рушія вузла), ZARIA_BELIEF (файл щоденника віри) і ZARIA_LANG (мова виводу), а суперників - їхніми власними процесами. Після партії процеси гасяться: пам'ять між партіями не переноситься (01-rules.md, 25.4). Вивід бота йде з префіксом бот|, суперників - з їхніми іменами.
Бот мусить присягнути за час лобі (10 с). Не присягнув - місце глухе: за партію частка 0, слот до кінця партії веде ваша грамота (01-rules.md, 24.6). Так буває, якщо бота не зібрано (npm run build) або він упав до присяги.
Грамоту перевіряють до першої партії: зламана - помилка, пакет не починається.
3Склади
Суперники (--vs) - два імені через кому. Кожне - одне з:
- архетип SDK - дзеркальна голова рушія:
рівний,шир,обхідник,проривник,облягач; - зразок грамоти SDK:
черепаха,експансія,економка,хвилини,замовлення,тиск(05-nakaz.md, розділ 5); - шлях до власного файлу грамоти
.yaml.
Суперники присягають як боти, і частки рахуються як звичайно.
Ваше місце (--bot):
- команда - як запускати бота; за замовчуванням у шаблоні -
node dist/main.js; nakaz- місце веде ваша грамота, присягаючи як бот: так видно, чого вартий наказ сам по собі;manual- вузол друкує адресу і печатку місця перед кожною партією і чекає 120 с: бота запускаєте ви, наприклад під налагоджувачем:
``sh ZARIA_URL=ws://127.0.0.1:40123 ZARIA_TOKEN=seal-... node --inspect dist/main.js ``
4Мовчання і наказ
Мовчання такту - не лише відсутність відповіді: порожній список команд і кадр, у якому воротар відхилив усі команди, теж мовчання (01-rules.md, 23.2). Шість мовчань поспіль - слот веде грамота, і zaria-kit pack друкує епізоди:
партія 1: ваш слот вів наказ, такти 21-34Заглушка шаблону (дзеркало архетипу) мовчить, коли їй нема чого скомандувати, і такі епізоди в неї - норма. Ваш бот, якщо хоче вести слот сам, подає хоча б одну прийняту команду за кожні 6 тактів.
5Що лежить на диску
records/
evening.json зведення останнього пакета
pack-2026-1200-<час>/
match-1.runlog match-2.runlog match-3.runlog
belief-1.ndjson belief-2.ndjson belief-3.ndjson
pack.jsonmatch-N.runlog- журнал партії N: маніфест, кадри команд усіх трьох місць, ніки, епізоди наказу і відмови воротаря (04-protocol.md, розділ 10).belief-N.ndjson- щоденник віри вашого бота в партії N, рядок на такт (03-sdk.md, розділ 8).pack.json- зведення пакета:
| Поле | Що містить |
|---|---|
seed, ticks | жереб і довжина партії |
roster | учасники в порядку місць: ви, перший суперник, другий |
rotations | слоти учасників за партіями: [["A","B","C"],["B","C","A"],["C","A","B"]] |
shares | частки учасників за пакет |
shareParts | частки учасників за партіями |
absent | місце без присяги в партії: частка 0 |
breakdown | статті рахунку за пакет: total (рахунок), network (хвилини мережі), orders (замовлення), pactTax (податок), stolen (здобич завади, уже в хвилинах), jams і rams (кількість завад і таранів) |
matches | за партіями: файл журналу, розмір, sha256, рахунок за слотами, статті рахунку |
6Перевірити і перечитати запис
npx zaria-kit replay records/pack-2026-1200-<час>Команда відтворює всі три журнали рушієм без ботів і звіряє рахунок із pack.json. Запис іншого рушія не відтворюється - це норма після зсуву світу. Розбирати журнал за тактами - openJournal SDK (03-sdk.md, розділ 10).
Еталонний запис - пакет трьох архетипів, записаний рушієм випуску, - лежить у node_modules/@zoria/kit/records/example:
npx zaria-kit replay node_modules/@zoria/kit/records/example7Час на такт
Дедлайн відповіді - 500 мс від кадру. Вузол опитує три місця разом: дума сусіда не затримує ваш кадр. Шаблон міряє думу вашого бота - стратегію, кодеки і щоденник разом - і друкує наприкінці партії:
бот| партію закінчено (end): відповідей 1200, кидків 0, повернень 6; дума, мс: p50 1.0, p99 13.8, max 30.2повернень 6 у темпі 500 мс - не обриви: партія триває 600 с, і вузол планово ротує сесію приблизно раз на 90 с (04-protocol.md, 8.3). З --fast партія коротша за період ротації, і повернень 0.
Два правила вимірювання:
- Міряйте в темпі 500 мс, без
--fast. Без пауз хвіст виглядає втричі коротшим: кеші теплі, збирач сміття не встигає накопичувати. Цифра повного газу в заліку не повториться. - Дивіться на хвіст, а не на медіану. Один прострочений такт - мовчання цього такту; медіана про нього не скаже.
Оборот самого вузла в темпі 500 мс (замір , три дзеркальні голови): медіана 0.9 мс, p99 8.2 мс, найгірший такт 51.8 мс. Решта часу такту - ваша.
8Оцінка на багатьох жеребах
Один пакет - одна долина; вершини нерівні, і один жереб міряє радше долину, ніж бота. Порівнюйте версії бота пакетами:
npm run play -- --fast --packs 16 --seed 100Наприкінці - частки за кожним пакетом і сума з 9 * K. Змінюйте суперників (--vs): бот, який б'є двох суперників рівний, не зобов'язаний бити облягач.