Глосарій, out-of-scope та відкриті питання
Терміни домену
Section titled “Терміни домену”| Термін | Значення |
|---|---|
| Абітурієнт | Вступник до ЗВО — основний користувач Abitly.org. |
| ЗВО | Заклад вищої освіти (університет/коледж). |
| Спеціальність | Освітня програма, на яку вступає абітурієнт. |
| Оффер | Конкурсна пропозиція: зв’язка ЗВО + спеціальність, на яку подаються заяви (entity Offer в api-v2). Основна одиниця моніторингу та інтент-сигналів. |
| Вступлист | Колекція збережених офферів у кабінеті abitly.org; буває публічна (шериться за URL) або приватна. Див. Фічі. |
| Симуляція вступу | Платний конструктор пріоритетного вступліста: за балами НМТ і списком КП рахує шанс (КБ vs прохідний), запас і вердикт (куди реально проходиш). Тріада намір/шанс/запас. Стан 1 (статус на даних 2025) — у проді; Стан 2 (вердикт широкого конкурсу на живих даних 2026) — відкладено. Див. simulation. |
| Мої пріоритети | Безкоштовний док-компаньйон вступліста: постійний бічний сайдбар на всіх публічних сторінках, куди абітурієнт одним кліком кидає вступи з тизера шансів калькулятора, бачить статус «куди проходжу» (евристика на даних 2025) і перетягує порядок. Той самий список, що й «Симуляція вступу» (simulation_application), але без пейволу — апселить у платний вердикт. Свідомо ≠ «Вступлисти» (збережені каталоги). 🚧 гілка vladbandurin/priorities-dock. Див. priorities. |
| Інсайдер-відгук | Картка реального студента ЗВО зі Studsearch (фото, опис, соцмережі), яку Abitly показує на сторінці оферу (GET /students, до 5 за university/faculty/speciality). Див. uni-page. |
| Бандл (матеріалів) | Strapi-колекція кількох PDF-матеріалів зі спільною разовою ціною (m2m material↔bundle). Див. materials. |
| SKU оплати | Три типи покупки через Monobank: разовий Premium (матеріали), AI-tutor tokens (пакети), підписка Free/Pro/Max. Див. checkout. |
| AI-tutor tokens | Пакети токенів для AI-тьютора НМТ (/tutor): small_250/best_1000/power_2000; жива оплата Monobank, баланс у зовнішньому tutor-wallet. Див. plans-billing. |
| ЄДЕБО | Єдина державна електронна база з питань освіти (державний реєстр). |
| Strapi | Headless CMS, джерело контенту (ЗВО, спеціальності, статті). |
| Mini App | Next.js-додаток, що запускається з Telegram-бота кнопкою. |
| Valkey | Form Redis (форк після ліцензійних змін у Redis 7.4). |
| Typesense | Open-source search engine, що використовується у Abitly API. |
| CodeStarSourceConnection | AWS-нативна інтеграція з GitHub через OAuth. |
| MCP | Model Context Protocol — спосіб дати AI-агентам інструменти. Див. реєстр. |
| Runbook | Покроковий плейбук для конкретного інциденту. |
| SSM-redeploy | Самописна Lambda, що форсить ECS rolling deploy при зміні SSM-параметра. |
| IaC / Terraform | Уся AWS-інфра кодифікована в репо cloud-infrastructure — 4 env-стеки, локальний state, власний decision-log.md. |
Терміни домену — маркетинг {#marketing}
Section titled “Терміни домену — маркетинг {#marketing}”Словник для системи маркетингу (re-engagement + продажі через email/Telegram). Архітектура — services/abitly-marketing + ADR-0001 / 0002 / 0003.
| Термін | Значення |
|---|---|
| Контакт | Маркетингова особа, якій адресуються кампанії (= BaseUser). Має ≥1 канальну ідентичність. Це сама особа, а не email-рядок чи TelegramUser. |
| Канальна ідентичність | Конкретний канал досяжності контакта: email-акаунт або TelegramUser. 30k email + 5k Telegram — це ідентичності, не обов’язково різні особи. |
| Campaign (кампанія) | Разова розсилка на сегмент у визначений момент (batch). |
| Journey / Automation (сценарій) | Послідовність повідомлень, що тригериться подією або станом контакта, а не календарною датою. |
| Сегмент | Набір контактів, відібраних за правилом (стадія + інтент + поведінка). Цільова аудиторія кампанії/сценарію. |
| Lifecycle stage (стадія) | Де контакт у вступному циклі — визначає ціль кампанії. |
| Активний проспект | У поточному вступному циклі, виконує дії. Ціль: продаж (Premium / Subscription / Tokens). |
| Сплячий проспект | Зареєстрований, ще в поточному циклі, але не конвертувався / неактивний. Ціль: реактивація → продаж. |
| Зарахований (минулий цикл) | Вступив або вийшов з циклу. Ціль: крос-сейл на Studsearch, не реактивація Abitly. |
| Інтент-сигнал | Декларована намірена дія контакта: які Offer (ЗВО + спеціальність) він моніторить через OfferApplicant / MonitoringOpenDay. Основне пальне для персоналізації. |
| Згода (consent) | Правова підстава слати маркетинг конкретному контакту по каналу. Реєстраційна згода ≠ маркетингова. Зберігається з джерелом, часом і скоупом. |
| Re-permission (переотримання згоди) | Кампанія-перепитування: збирає явну маркетингову згоду + свіжий інтент у контактів, де її ще нема. Перша кампанія Abitly буде саме такою (немає explicit opt-in + холодний домен). |
| Преференс-центр | Сторінка, де контакт керує згодою, каналами й темами. Кожен лист має на неї посилання + one-click unsubscribe. |
| Consent ledger | Append-only журнал згоди (consent_event) + проєкція (consent_current), keyed by channel_identity_id — щоб згода/suppression пережили late-link merge. Читається ConsentGuard у send-pipeline. ADR-0007. |
| Fact-Pack | Незмінний валідований знімок фактів (offers, дедлайни, бали), який AI отримує як structured input; ground truth для валідатора. ADR-0003. |
| Advice-correctness gate | Перевірка над fact-validator: ловить не вигадані, а неправильно скомбіновані реальні факти (напр. «бал 169 > 168.5 → вступиш») і хард-банить гарантії вступу. ADR-0009. |
| Fail-closed engagement | Поки prod lake-house не існує, engagement-події викидаються+рахуються, ніколи не пишуться в shared RDS. ADR-0002. |
| Tone of Voice (ToV) | Канон голосу Abitly для всієї user-facing копії: на «ти», без канцеляриту, словник замін, термінологія. Джерело правди — Brand Book; портативна дистиляція для зовнішніх LLM — ToV Rules. Скіли: /brand-voice · /brand-review · /brand-guardian. |
Out-of-scope
Section titled “Out-of-scope”Живуть у спільних з Abitly/Studsearch акаунтах, але не належать контекст-хабу.
| Контекст | Деталі | Чому виключено |
|---|---|---|
FMF (fmf-frontend, fmf-strapi) | Сайт ФМФ КПІ | Outsource-замовлення, окремий продукт. |
AWS yangon-* стек | 4 ECS-сервіси + RDS dev-yangon-rds + ElastiCache + Lambda + Terraform + ECR + ALB + bastion + SSM /yangon/* + S3 *yangon* + CloudFront dev-yangon-search | Окремий продукт, поза скоупом. |
Railway overflowing-elegance | SearXNG + OpenClaw | Окрема search/scrape інфра, поза скоупом. |
Railway Studsearch services | Frontend (FAILED 2026-04-28) + Backend (latestDeployment null) | Prod-Studsearch на AWS — Railway-копія не використовується. |
Railway FMF | fmf-strapi + fmf-frontend + Strapi Postgres | Outsource (вище). |
| Internal abitly-org репо | abitly-content, abitly-design, abitly-universities, abitly | Workspace’и контент-/дизайн-команди, не сервіси. |
Legacy (кандидати на archive)
Section titled “Legacy (кандидати на archive)”| Репо | Останній push | Що було |
|---|---|---|
abitly-tg-bot | 2025-09 | v1 бота, замінено на abitly-tg-bot-v2 |
abitly-tg-bot-v2 | 2026-06 | v2 бота (TS · Telegraf · Railway), замінено на abitly-tg-bot-v3 (Python · aiogram 3 · AWS ECS) |
abitly-frontend | 2023-10 | старий фронт, замінено на abitly-frontend-v2, branch development |
api | 2023-09 | старий API, замінено на abitly-api-v2, branch dev |
courses | 2022-10 | модуль курсів, prod branch |
studsearch-old-backend | 2024-09 | старий Studsearch backend (TypeScript), branch frontend |
studsearch-db | 2021-09 | crawler ЗВО |
abitly-product, stud-search-product | 2025-03 | порожні meta-репо |
Можна архівувати в GitHub (gh repo archive abitly-org/<repo>) — не блокує доступ до історії.
Історія перейменувань
Section titled “Історія перейменувань”| Сервіс | Еволюція |
|---|---|
| Telegram bot | abitly-tg-bot (v1, 2025-09) → abitly-tg-bot-v2 (TS · Telegraf · Railway) → abitly-tg-bot-v3 (Python · aiogram 3 · AWS ECS Fargate, cutover ~2026-06-02). Токен @abitlybot переключено на v3; Railway-бот знятий, Mini App лишилась на Railway. Картка → Telegram bot. |
| Frontend | abitly-frontend → abitly-frontend-v2. |
| API | api → abitly-api-v2. |
Tooling-репо (не картки сервісів, але корисні)
Section titled “Tooling-репо (не картки сервісів, але корисні)”| Репо | Призначення |
|---|---|
abitly-skills | Python — Claude Code skills для команди |
abitly-scrape | парсер днів відкритих дверей українських ЗВО |
abitly-blog | multi-agent AI FAQ generator (UA, з PDF) |
strapi-materials-parser | PDF uploader → Strapi material entry |
nmt-tests-generator | React+Vite UI для створення NMT-тестів + Strapi |
TODO: створити окремий розділ /tools/ якщо вирішимо документувати.
Закриті питання (для журналу)
Section titled “Закриті питання (для журналу)”- ✅ Стек кожного prod-сервісу — з
package.json. - ✅ AWS-сервіси per service —
aws describe-*(eu-central-1). - ✅ Роль Railway — Telegram Mini App (бот мігровано на AWS ECS Fargate, 2026-06).
- ✅ Postgres — RDS
studsearch-prod/ DBabitly_prod_db, схемиabitly(API+bot),telegram(bot logs),public(Strapi),studsearch(Studsearch backend). - ✅ Платежі — Monobank (SSM
MONOBANK_TOKEN). - ✅ Auth — Google OAuth + JWT + Telegram login.
- ✅ Analytics — власний lake-house + GTM (
NEXT_PUBLIC_GOOGLE_TAG_MANAGERу prod frontend). - ✅ Sentry — частково: підключений тільки у frontend prod (org
abitly, regionde.sentry.io). Backend — Telegram-logger. - ✅ Frontend logging — triple-channel: Sentry + Telegram (
/api/logger) + Loki напряму (lokiLogger). - ✅ Telegram bot mode — long polling (aiogram 3, один інстанс — ADR 0001). Env
BOT_TOKEN. HealthcheckGET /healthcheck:3000. Cron0 7 * * *(APScheduler, Europe/Kyiv). Хостинг — AWS ECS Fargate (abitly-prod-tg-bot). - ✅ Strapi deploy — GitHub Actions
docker buildx --platform linux/arm64→ ECR → CodePipeline → EC2 (з Caddy reverse proxy). - ✅ Cloudflare account —
Info@abitly.org's Account(id0f2d9ae8b2976e235eefc16812fb91bb). - ✅ Studsearch
mysql2— dead dependency (підтверджено grep’ом). - ✅ Studsearch Telegram bot username —
@StudSearchBot. - ✅ Tutor service —
https://tutor-api.abitly.org.
Відкриті TODO
Section titled “Відкриті TODO”-
Owner-и кожного сервісу— усі 9 prod-сервісів: @Vladbandurin. Bus factor 1. - Подвійний перший дотик email: новому користувачу йдуть і PostHog-onboarding (+30 хв), і SES welcome-серія email-сервісу — узгодити, хто веде перший лист (email-маркетинг).
- Studsearch Telegram bot — де живе репо/runtime (підтверджено: НЕ у
studsearch-backend-v2). - Task-def бота (dev/prod): env/secret промокодів (
ABITLY_ADMIN_API_KEY+ IAM) додані руками — віддзеркалити в Terraformcloud-infrastructure(promo-codes). -
Abitly bot username—@abitlybot. -
Strapi origin-cert expiry— 2041-05-24 (15-річний Cloudflare Origin Certificate, випущений 2026-05-28). -
Алерти Grafana— Slack workspace (target). Канал —TODO:точна назва. -
DBA-контакт для shared-RDS— @Vladbandurin (self). -
DO Droplet з— відмова від DO, міграція на AWS (заплановано). Зараз поки на DO.abitly-monitoring -
Архівувати legacy v1 репо— не архівувати (залишаємо доступними). - CRM/Support bot: подати Meta App Review (Advanced Access:
pages_messaging,instagram_manage_messages, Human Agent) — без нього IG/Messenger приймає DM лише від акаунтів власного бізнесу (dev mode). - Дизайн-система Abitly (
design-system-claude.md— токени + базовий ToV) — згаданий у Brand Book, але не входить у ToV-бандл.TODO:де живе документ. -
Чи документувати tooling-репо у— ні, поза скоупом хабу.tools/ - Studsearch Telegram bot — webhook чи polling, де репо.
- EmailOctopus-акаунт (логін/біллінг) — де живе identity
abitly.org(email service). - Серверна подія
simulation_purchaseу PostHog з Monobank-вебхука — закриє недооблік покупок у email-воронках (email-маркетинг). -
Деплой-таргет live-дашборда «Вступ 2026»— CF Pagesabitly-vstup-live.pages.devза Cloudflare Access (приватно); відкриття публічно — рішення власника (vstup-live-dashboard). -
Mini App— legacy (попередній deploy перед Railway), кандидат на cleanup з CORS.f3jfl.ondigitalocean.app -
DO App Platform— legacy, прибрати зsea-lion-app-82n43+urchin-app-lysihFRONT_URLSSM. -
— окремий host (не Amplify branch).test.studsearch.org - SMTP-провайдер (значення
SMTP_HOSTSecureString — треба читати з-під SecureString-роллю обережно). - Cloudflare zone-level налаштування + перелік DNS-записів (через CF MCP
execute). - Чи документувати tooling-репо (
abitly-skills/scrape/blog/...) уtools/. - Алерти Grafana — куди (Telegram чат
TELEGRAM_LOG_CHAT_ID?). - DBA-контакт / on-call для shared-RDS ескалації.
- DO Droplet з
abitly-monitoring— IP/доступ. -
Tutor service— окремий продукт цієї ж команди, не документується в цьому хабі. - Чи archive-нути legacy v1 репо в GitHub.
- Telegram bot — прив’язка акаунту: узгодити Redis (бекенд мінтить
abitly:link:*у спільний Redis ↔ бот має task-local sidecar-Redis) + підтвердити mint-ендпоінт уabitly-api-v2. - Telegram bot —
/helpno-op (команда в менюsetMyCommandsбез хендлера). - Telegram bot — prod Terraform (
infra/terraform/) безbackend.tf→ local state (dev на S3 remote); імпортувати в remote state. Dev-сервісabitly-dev-tg-botкерується out-of-band. План: згорнути в централізований cloud-infrastructure. - Фічі web — стан флага
NEXT_PUBLIC_DISABLE_PROMOTIONSу prod SSM (увімкнені промо чи ні). - Фічі web — тарифи Free/Pro/Max: коли вмикається gating (billing в api-v2 змержено, нічого не gate-ить).
- Фічі web — точні URL-шляхи фіч на abitly.org (заповнюються в картках features/ під час browse-аудиту; Wave 1 — заповнено 2026-06-13).
- Симуляція вступу — серверний entitlement-guard на CRUD
/profile/simulation/*(зараз paywall лише фронтовий +JwtAuthGuard). - Симуляція вступу — добити атрибуцію: PUBLISH GTM-workspace, ремап
simulation_purchase→purchase/Ecommerce, Monobank referral-exclusion (pay.mbnk.biz). ✅ Meta-side закрито (Purchase-піксель на success-сторінці, FE PR #497/#499, prod) — див. Платна реклама Meta; GTM/GA4-side ще відкрито. - Симуляція вступу — звірити
premium_ordersbuyer_emailvs entityemail(drift у міграції) + політикуreversed(рефанд не відкликає entitlement). - Платна реклама Meta — переключити оптимізацію кампаній sim2026 з проксі-конверсії (перегляд success) на справжню подію Purchase, коли накопичиться; + CAPI (server-side Purchase з Monobank-вебхука, keyed на
orderId). - «Мої пріоритети» — запушити гілку
vladbandurin/priorities-dock+ PR (зараз 9 комітів попередуorigin/main, не на remote, не в проді). - «Мої пріоритети» — опублікувати GTM-workspace + зареєструвати 7 подій як CD у GA4 (⚠️ property вже 49/50); додати impression-подію (add-rate/rail→open) і відсутній у коді
priorities_save_prompt_shown. - «Мої пріоритети» — logged-in remove/reorder лише локальні + read-side серверна гідрація (
hydrate/order) відкладені; розглянути сервернийPOST /profile/simulation/importзамість крихкого клієнтського replay (droppedall-or-nothing). - «Мої пріоритети» — підключити поверхні Фази 2/3 (офер-картки пошуку, рейтингові списки) → розширити
PrioritySource; координація z-index/offset немодального aside із кабінетнимBottomNavіFilterDrawer. - Фічі web — розрив контракту deep-links: фронт шле
?start=<offerId>з карток оферів, бот v3 цей payload не обробляє → додати хендлер у бота або прибрати CTA (bot-deeplinks). - Фічі web —
/compare(порівняння ЗВО): підтвердити live-статус і додати в картки. - Фічі кабінету — авторизований UI не верифіковано браузером (headed GStack Browser крашиться; JWT у localStorage, cookie-import не несе сесію). Картки features/ кабінету — code-derived; потребують візуальної звірки під тест-акаунтом.
- Фічі кабінету — точний бекенд-роут прогресу/тестів (
testQueries.progressData) + сама фіча «Тести» (/tests) не задокументовані. - Бот — specialty-broadcasts розірвано: tg-bot v3 ADR-0008 (2026-06-02, репо
abitly-tg-bot-v3) видаливfilter_specialities/filter_universities(імена таблиць >63 симв. →UndefinedTableError, краш/start); відновити join або лишити фільтр лише за регіонами. -
InsightSlotна дашборді кабінету — V1 backend завжди повертаєnull(V2-vision); увімкнути або прибрати з UI. - Підписки Free/Pro/Max — повний backend у api-v2, але
FeatureResolverServiceніхто не викликає (gate-ить лише сам себе),GET /subscriptions/plans→[], фронтенд-UI немає. Засіяти плани + застосувати гейти або зафіксувати як свідому паузу. Див. plans-billing. - AI-тьютор (
/tutor) — жива prod-фіча з оплатою токенів, власної картки фічі ще немає (згадується в checkout/plans-billing без лінка). Створити картку. -
about-page— EN single-type у Strapi опублікований, але містить український текст →/en/aboutпоказує UA; SEO-метадані беруться з i18nmeta.about.*, не зі Strapi (зміна в CMS не оновлює title/OG). - Закрити застарілий PR #409 (
feat/about-page-strapi) — дубль уже виконаної міграції About на Strapi (на main з 2026-06-09, commit c3939230). -
promotions— станNEXT_PUBLIC_DISABLE_PROMOTIONSу prod SSM/abitly/prod/frontend/(інверсна семантика: промо лише коли змінна НЕ задана). - DTO
create-token-purchaseу api-v2 має застарілий Swagger-examplebest_1500— реальні slug-иsmall_250/best_1000/power_2000. - БД — схема
nmt_testsмістить лише біллінгtutor_token_orders(міграція1777576003123); однойменна з таблицеюabitly.nmt_tests. Перейменувати схему (напр.billing) або перенести таблицю вabitly. Див. databases. - БД —
abitly-mcp-replica(read-replicastudsearch-prod, live-перевірено 2026-06-15) не відображена в IaC; згорнути в Terraform. - БД —
abitly-dev-pgbackup retention 35 діб проти 7 у prod (studsearch-prod); звірити, чи навмисно. - БД — prod-RDS
PubliclyAccessible=trueз 5 /32-allowlist на 5432; звузити список і розглянути private-only. - БД —
abitly-api-v2/docs/entities.mdне покриває ~12 новіших таблиць (біллінг/матеріали/refresh_tokens); оновити per-table довідник у репо API. - Recsys — джерело lineage:
24_to_25_offer_connectionзі спеки 2026-06-06 на проді не існує (перевірено 2026-07-12); визначити крос-річний ключ до ре-імпорту наступної кампанії (fallback(university_id, speciality_code)+ edu-programs). Див. ADR-0013. - Recsys — юрперевірка формату маркування платних бустів (Закон «Про рекламу») до першого продажу. Див. ADR-0015.
- Recsys — призначення
abitly.offer_requests(1.59M рядків, маєabitly_id): 2024-кампанія чи повна історія; чи корисна для щільності FBT. - Recsys — ETL-доступ до replica: SG
abitly-mcp-replicaпускає лише Fargate SG; додати SG ECS-тасок recsys (fallback — дозоване читання primary поза піком).