Рекомендації блогу
Метадані
Section titled “Метадані”| Поле | Значення |
|---|---|
| Статус | 🚧 в розробці — abitly-recsys Phase 0/1 на main, frontend-інтеграція deferred |
| Поверхні | web (планується — стрічка блогу) |
| Доступність | безкоштовно |
| Власник | TODO: |
| Останнє підтвердження | 2026-06-14 · curl (live) + код:main (abitly-recsys) |
Призначення
Section titled “Призначення”Контроль порядку та курації контентних стрічок (Phase 1 — блог): редактор задає pin/boost/bury/hide/lock_order у адмінці, а сайт показує статті в обчисленому порядку замість «сирого» порядку Strapi. Базове ранжування Phase 1 — за свіжістю (recency); редакторські правила накладаються зверху (final = base_score ⊕ editorial).
User flow
Section titled “User flow”Точка входу (планується): https://abitly.org/uk/novyny (внутрішній роут /uk/blog, next-intl rewrite).
Запланований flow інтеграції (Task 1.7, deferred — див. docs/integration-abitly-web.md у abitly-recsys):
- Server-компонент індексу блогу тягне статті зі Strapi для поточної локалі.
- Формує
entityId = documentId@locale(Strapi v5documentId+ активна локаль — це identity-ключ read-model;slugper-locale не ключ). - Викликає recsys
rankIds({ surface: 'blog.articles', context: { locale }, candidates }). - Перевпорядковує статті за відповіддю; рендерить.
- Fail-open: якщо recsys недоступний —
rankIdsповертає вхідні id незмінними → зберігається порядок Strapi (без регресії).
Дані та API
Section titled “Дані та API”| Джерело | Ендпоінт / entity | Призначення |
|---|---|---|
abitly-recsys (окремий сервіс) | POST /v1/rank (surface: blog.articles | blog.categories) | обчислений порядок стрічки |
abitly-recsys | POST /v1/ingest/strapi (webhook) | синхронізація rankable-item зі Strapi (publish/update/unpublish/delete) |
| Strapi | content-types article, category | першоджерело контенту; recsys лише ранжує id, тіло статей далі віддає Strapi → data-flow |
Внутрішня модель recsys (Phase 1): entities rankable-item, editorial-rule, editorial-version, audit-event; кеш рішень у Valkey за editorialVersion. Реєстр поверхонь у packages/contracts декларує і неблогові слоти (university.offers, search.offers, home.students, university.specialties), але в Phase 1 зареєстровані тільки blog.articles + blog.categories.
Зв’язки з іншими фічами
Section titled “Зв’язки з іншими фічами”- Статті / блог — поверхня, на яку recsys накладатиме порядок (зараз — порядок Strapi).
- Track-events → lake-house — потенційне джерело engagement-сигналів для майбутніх фаз (зараз база ранжування — лише recency); data-flow аналітики.
| Репо | Шлях | Примітка |
|---|---|---|
abitly-recsys | apps/api/ (NestJS), apps/admin/ (Next.js адмінка) | control plane: ranking + editorial + ingest |
abitly-recsys | packages/contracts, packages/sdk | реєстр поверхонь + клієнтський SDK (@abitly/recsys-sdk, ще не опублікований) |
abitly-frontend-v2 | TODO: (планується src/lib/recsys.ts + reorder у server-компоненті блогу) | інтеграція deferred — імпорт SDK у фронтенд не доданий |
Обмеження та блокери
Section titled “Обмеження та блокери”- Web-інтеграція відкладена (Task 1.7). Залежить від двох умов, поки не виконаних: (1)
@abitly/recsys-sdkмає бути встановлюваним фронтендом (опублікувати в private registry / GitHub Packages або vendor — зараз це workspace-пакет); (2) recsys має бути задеплоєний із доступнимRECSYS_API_URL. До того ж імпорт у фронтенд не додають — він зламав би білд. - Не задеплоєно в prod.
docs/deploy.md— план (ECR + ECS Fargate, власна RDS, не sharedstudsearch-prod; Valkey; SSM/recsys/{env}/*). Жоден recsys-хост не відповідає на/health(перевірено curl 2026-06-14): web-поверхні немає. EnvRECSYS_API_URLу фронтенді ще не заведено. - Phase 1 scope. База ранжування = recency; персоналізації/engagement-сигналів немає. Неблогові слоти задекларовані в контрактах, але не зареєстровані.
- Блокери наступних фаз — знято 2026-07-12. Відкриті питання §13 design-spec 2026-06-06 закриті на grill-сесії: вироки — у spec
docs/superpowers/specs/2026-07-12-recommendation-core-design.md(репоabitly-mc) §9; рішення — ADR-0012…ADR-0015.abitly-recsysрозширюється до рекомендаційного ядра всіх сценаріїв (similar/FBT/next-basket/персональні) за season-2026 cut. - pgvector-курс. Якщо/коли recsys знадобиться вектор-пошук — це
CREATE EXTENSION vectorна власній RDS, не Supabase (ADR-0010).
Історія змін
Section titled “Історія змін”| Дата | Подія | Джерело |
|---|---|---|
| 2026-06-06 | Design-spec control plane (3 осі: retrieve/editorial/cache) | abitly-recsys docs/superpowers/specs/2026-06-06-recsys-control-plane-design.md |
TODO: | Phase 0/1 побудовано на main (api + admin + contracts + sdk, CI зелений, blog spine end-to-end) | abitly-recsys main (README, дерево репо) |
| 2026-06-14 | Картка створена; web-інтеграція підтверджено відсутньою (live curl) | PR картки |
| 2026-07-12 | §13 закрито; recsys → рекомендаційне ядро всіх сценаріїв (spec 2026-07-12 + ADR-0012…0015); season-2026 cut | grill-сесія, цей PR |