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

Глосарій, out-of-scope та відкриті питання

ТермінЗначення
АбітурієнтВступник до ЗВО — основний користувач 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.
ЄДЕБОЄдина державна електронна база з питань освіти (державний реєстр).
StrapiHeadless CMS, джерело контенту (ЗВО, спеціальності, статті).
Mini AppNext.js-додаток, що запускається з Telegram-бота кнопкою.
ValkeyForm Redis (форк після ліцензійних змін у Redis 7.4).
TypesenseOpen-source search engine, що використовується у Abitly API.
CodeStarSourceConnectionAWS-нативна інтеграція з GitHub через OAuth.
MCPModel 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 ledgerAppend-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.

Живуть у спільних з 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-eleganceSearXNG + OpenClawОкрема search/scrape інфра, поза скоупом.
Railway Studsearch servicesFrontend (FAILED 2026-04-28) + Backend (latestDeployment null)Prod-Studsearch на AWS — Railway-копія не використовується.
Railway FMFfmf-strapi + fmf-frontend + Strapi PostgresOutsource (вище).
Internal abitly-org репоabitly-content, abitly-design, abitly-universities, abitlyWorkspace’и контент-/дизайн-команди, не сервіси.
РепоОстанній pushЩо було
abitly-tg-bot2025-09v1 бота, замінено на abitly-tg-bot-v2
abitly-tg-bot-v22026-06v2 бота (TS · Telegraf · Railway), замінено на abitly-tg-bot-v3 (Python · aiogram 3 · AWS ECS)
abitly-frontend2023-10старий фронт, замінено на abitly-frontend-v2, branch development
api2023-09старий API, замінено на abitly-api-v2, branch dev
courses2022-10модуль курсів, prod branch
studsearch-old-backend2024-09старий Studsearch backend (TypeScript), branch frontend
studsearch-db2021-09crawler ЗВО
abitly-product, stud-search-product2025-03порожні meta-репо

Можна архівувати в GitHub (gh repo archive abitly-org/<repo>) — не блокує доступ до історії.

СервісЕволюція
Telegram botabitly-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.
Frontendabitly-frontendabitly-frontend-v2.
APIapiabitly-api-v2.

Tooling-репо (не картки сервісів, але корисні)

Section titled “Tooling-репо (не картки сервісів, але корисні)”
РепоПризначення
abitly-skillsPython — Claude Code skills для команди
abitly-scrapeпарсер днів відкритих дверей українських ЗВО
abitly-blogmulti-agent AI FAQ generator (UA, з PDF)
strapi-materials-parserPDF uploader → Strapi material entry
nmt-tests-generatorReact+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 / DB abitly_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, region de.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. Healthcheck GET /healthcheck:3000. Cron 0 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 (id 0f2d9ae8b2976e235eefc16812fb91bb).
  • ✅ Studsearch mysql2 — dead dependency (підтверджено grep’ом).
  • ✅ Studsearch Telegram bot username — @StudSearchBot.
  • ✅ Tutor service — https://tutor-api.abitly.org.
  • 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) додані руками — віддзеркалити в Terraform cloud-infrastructure (promo-codes).
  • Abitly bot username@abitlybot.
  • Strapi origin-cert expiry2041-05-24 (15-річний Cloudflare Origin Certificate, випущений 2026-05-28).
  • Алерти Grafana — Slack workspace (target). Канал — TODO: точна назва.
  • DBA-контакт для shared-RDS@Vladbandurin (self).
  • DO Droplet з abitly-monitoringвідмова від DO, міграція на AWS (заплановано). Зараз поки на DO.
  • Архівувати 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 Pages abitly-vstup-live.pages.dev за Cloudflare Access (приватно); відкриття публічно — рішення власника (vstup-live-dashboard).
  • Mini App f3jfl.ondigitalocean.applegacy (попередній deploy перед Railway), кандидат на cleanup з CORS.
  • DO App Platform sea-lion-app-82n43 + urchin-app-lysihlegacy, прибрати з FRONT_URL SSM.
  • test.studsearch.org — окремий host (не Amplify branch).
  • SMTP-провайдер (значення SMTP_HOST SecureString — треба читати з-під 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 — /help no-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_purchasepurchase/Ecommerce, Monobank referral-exclusion (pay.mbnk.biz). ✅ Meta-side закрито (Purchase-піксель на success-сторінці, FE PR #497/#499, prod) — див. Платна реклама Meta; GTM/GA4-side ще відкрито.
  • Симуляція вступу — звірити premium_orders buyer_email vs entity email (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 (dropped all-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-метадані беруться з i18n meta.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-example best_1500 — реальні slug-и small_250/best_1000/power_2000.
  • БД — схема nmt_tests містить лише біллінг tutor_token_orders (міграція 1777576003123); однойменна з таблицею abitly.nmt_tests. Перейменувати схему (напр. billing) або перенести таблицю в abitly. Див. databases.
  • БД — abitly-mcp-replica (read-replica studsearch-prod, live-перевірено 2026-06-15) не відображена в IaC; згорнути в Terraform.
  • БД — abitly-dev-pg backup 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 поза піком).