Перейти до вмісту

Симуляція широкого конкурсу (vstup-simulation)

ПолеЗначення
ПродуктAbitly
Типworker / обчислювальний рушій
Статус🟢 prod (ручні запуски)
ВласникTODO:

Реалізує алгоритм розподілу бюджетних місць (Додаток 6, Наказ МОН №373): deferred acceptance по субконкурсах А/Б/ББ/В + широкий конкурс із суперобсягами. На вході — живий зріз abitly.offers + abitly.offer_requests; на виході — прохідні бали і прогноз статусу кожної заяви. Живить сторінки КП («хто куди проходить») і фічу симуляції вступу.

Репозиторій та рантайм

Section titled “Репозиторій та рантайм”
Репоhttps://github.com/abitly-org/vstup-simulation
Хостингніде не хоститься — запускається вручну з машини оператора (скіл /wide-run у репо); шляхи .env захардкожені на Windows-машину оркестратора
Спосіб деплоюнемає (git pull + node)
Публічні URL / доменинемає
  1. Зріз: одна REPEATABLE READ транзакція читає abitly.offers + abitly.offer_requests за рік (scripts/ingest/build-snapshot-db.mjs).
  2. Статичні входи з репо: data/<рік>/wide-competitions.json (реєстр широких конкурсів і суперобсяги), offer-specializations.csv, min-score-lookup.json.
  3. Симуляція: placement/run.mjs → етапи А/Б/В бюджету + контракт; детермінований tie-break (FNV-1a від abitly_id); незалежний fairness-верифікатор.
  4. Запис (одна транзакція): схема wide_competitionruns (draft/active/archived, unique active per year), groups, lanes, applications, offer_cutoffs; при --activate додатково оновлюється abitly.offer_requests.prediction_status/explanation (⚠️ без run_id, перезаписується безповоротно).

Оркестрація (скіл /wide-run)

Section titled “Оркестрація (скіл /wide-run)”

preflight (перевірка env/DDL/файлів, identity-assert БД) → dry-run (import-wide-run.mjs) → перегляд report.json → явна згода людини → --activateverify-wide-run.mjs. Активація блокується при fairness-порушеннях чи fatal-інваріантах. Тунель до БД (порти 55432 dev / 55433 prod) піднімає людина.

  • Залежить від: Postgres (читає abitly, пише wide_competition), даних abitly-parse, Redis (purge кешу після activate, fail-safe)
  • Від нього залежать: API (WideCompetitionController, OfferApplicantsController, live cutoffs у симуляції), сторінки КП на вебі
ЗміннаПризначенняДе зберігається
DB_HOST / DB_PORT / DB_NAME / DB_USERNAME / DB_PASSWORDціль запису (dev/prod)локальні .env / .env.prod оператора
REDIS_HOST / REDIS_PORT / REDIS_PASSWORDpurge кешу applicantsтам само
MIN_SCORE_YEARрік порогів допускувиставляється з --year
  • Прогнози не версіоновані: попередній prediction_status втрачається при кожному activate; відкат = re-activate старого рану (може бути pruned у БД, лишається у локальному архіві data/archive/wide-runs/).
  • Суперобсяги 2026 частково carryover-2025 (до МОН-розкладки) — прохідні ~37 груп орієнтовні; Б14д/Б29д стабільно занижені (кластер C1).
  • Якщо Redis недоступний під час activate — кеш /offer-applicants/* (TTL 1 год) показує старі прогнози до години.
  • min_obsyag=0 у всіх КП → етап Б (анулювання недоборів) фактично не спрацьовує.

Повна картина потоків даних → data-архітектура. Фіча-картка → wide-competition.