ЗОРЯ

Головна/Завдання/Частина 2/Локальний пакет

Локальний пакет: команда, склади, запис, час на такт

Локальний пакет - залікова одиниця у вас на машині: три партії одного жереба, ваш бот по черзі у вершинах A, B і C, два суперники, запис текою і частки 3, 2, 1 за кожну партію (01-rules.md, розділ 25). Грає його команда zaria-kit pack пакета @zoria/kit; у шаблоні бота вона викликається так:

опубліковано 28.09
shell
npm run play            # збирання бота і пакет у темпі 500 мс на такт
npm run play -- --fast  # те саме без паузи між тактами

1Прапорці

ПрапорецьЗа замовчуваннямЩо змінює
--seed N2026жереб пакета
--packs K1пакетів поспіль на жеребах N, N+1, ... і підсумок за всіма
--ticks N1200тактів у партії; коротка партія - для швидкої перевірки, не для оцінки
--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\|enzaria.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.json
  • match-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Перевірити і перечитати запис

shell
npx zaria-kit replay records/pack-2026-1200-<час>

Команда відтворює всі три журнали рушієм без ботів і звіряє рахунок із pack.json. Запис іншого рушія не відтворюється - це норма після зсуву світу. Розбирати журнал за тактами - openJournal SDK (03-sdk.md, розділ 10).

Еталонний запис - пакет трьох архетипів, записаний рушієм випуску, - лежить у node_modules/@zoria/kit/records/example:

shell
npx zaria-kit replay node_modules/@zoria/kit/records/example

7Час на такт

Дедлайн відповіді - 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.

Два правила вимірювання:

  1. Міряйте в темпі 500 мс, без --fast. Без пауз хвіст виглядає втричі коротшим: кеші теплі, збирач сміття не встигає накопичувати. Цифра повного газу в заліку не повториться.
  2. Дивіться на хвіст, а не на медіану. Один прострочений такт - мовчання цього такту; медіана про нього не скаже.

Оборот самого вузла в темпі 500 мс (замір , три дзеркальні голови): медіана 0.9 мс, p99 8.2 мс, найгірший такт 51.8 мс. Решта часу такту - ваша.

8Оцінка на багатьох жеребах

Один пакет - одна долина; вершини нерівні, і один жереб міряє радше долину, ніж бота. Порівнюйте версії бота пакетами:

shell
npm run play -- --fast --packs 16 --seed 100

Наприкінці - частки за кожним пакетом і сума з 9 * K. Змінюйте суперників (--vs): бот, який б'є двох суперників рівний, не зобов'язаний бити облягач.