Skip to content

docs(architecture): сховище relay — інтерфейс store, дозволені SQLite і PostgreSQL - #69

Merged
vitaliytv merged 1 commit into
mainfrom
claude/relay-store-implementations
Aug 12, 2026
Merged

docs(architecture): сховище relay — інтерфейс store, дозволені SQLite і PostgreSQL#69
vitaliytv merged 1 commit into
mainfrom
claude/relay-store-implementations

Conversation

@vitaliytv

Copy link
Copy Markdown
Member

Проблема

stack.md фіксував сховище relay як «Bun + PostgreSQL». Реалізація в nitra/mt-rust (PR #45) зробила персистентний store на SQLite — і канон розійшовся з кодом. Roadmap прямо забороняє мовчазне співіснування двох контрактів, тож це треба було закрити явно.

Чому не «переписати PostgreSQL → SQLite»

Це замінило б одну хибну привʼязку іншою. stack.md за власним фронтматером — шар reference: «одна реалізація може зробити інакше без розбіжності». Прибитий цвяхами продукт БД у цьому шарі — це помилка рівня, а не помилка вибору.

Тому названо те, що справді нормативне: інтерфейс store зі схемою за access.md, і три дозволені реалізації — in-memory (dev), SQLite, PostgreSQL. Вибір бекенда — питання деплою (одноінстансний relay проти кількох інстансів), а не архітектури.

Умова замість продукту

Замість назви БД поставлено перевірну вимогу: будь-яка реалізація мусить проходити спільний контрактний набір тестів — взаємозамінність доводиться однаковою поведінкою, а не однаковим переліком методів.

Це не декларація. У PR #45 цей набір уже спрацював: він упіймав, що setMemberRole мусить бути upsert-ом — update-only реалізація тихо ламала б accept запрошення.

Що з принципом №10

Принцип «один код контракту» каже, що дві імплементації контракту неминуче розходяться. Тут це явно розібрано в самому тексті, а не обійдено: один раз існує семантика операцій store (шар contract, access.md), а не спосіб їх зберігання; від розходження стереже контрактний набір.

Зміни

  • docs/architecture/stack.md — секція «Relay-інфраструктура» і рядок таблиці; деплой уточнено (SQLite — PVC, PostgreSQL — CNPG); auth винесено в окремий пункт (був злитий в один рядок із БД)
  • docs/log.md — запис 2026-08-12
  • .cspell.json — два слова

Свідомо не чіпав: docs/architecture/stack.en.md — це derived-переклад (authored: false, sourceFileCrc); він перегенерується окремо, і саме розбіжність crc його для цього й помічає. Прецедент — #66, який теж правив stack.md без мовних дзеркал. Запис у log.md від 2026-07-11 («PostgreSQL — окрема задача») лишається як історія рішення — журнал не переписується заднім числом.

Лінт чистий.

… і PostgreSQL

stack.md фіксував «Bun + PostgreSQL», а реалізація в nitra/mt-rust зробила
персистентний store на SQLite — канон розійшовся з кодом.

Розвʼязання не «переписати PostgreSQL на SQLite», а зняти хибну
привʼязку: stack.md за власним фронтматером — шар reference, де вибір
бекенда вільний, а нормативним є контракт. Тому названо інтерфейс store
зі схемою за access.md і три дозволені реалізації (in-memory, SQLite,
PostgreSQL), а умова поставлена одна й перевірна — спільний контрактний
набір тестів.

Явно зафіксовано, чому це не порушує принцип №10 «один код контракту»:
один раз існує семантика операцій store, а не спосіб їх зберігання.
@vitaliytv
vitaliytv merged commit ba6243b into main Aug 12, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant