სერვისები
Verification Sprint 1: first working slice
Weeks 3-4: a Polish or EU company identified by VAT number gets level L1 automatically, in under 60 seconds, with evidence in storage and a badge in the feed - built on sources that already work with no key and no contract.
This is a sprint plan with a list of readiness criteria, not a report of completed work: the VIES/Biala lista/KRS connectors, the case state machine, WORM evidence storage and the verification-operator role are not deployed in this demo. Document date: 10 September 2026.
Entry conditions: what already exists
The sprint starts from implementation against an already-written, machine-checked contract, not from design. Backend hosting is the one open question - a day-1 decision.
| Artifact | Status |
|---|---|
| Спринт 0: БД, міграція 001, довідники, імпорт 10 773 заявок | Виконано, 25 із 25 приймальних тестів на живій БД |
| 002_verification.sql — 12 таблиць, 2 тригери, подання досьє | Написано, застосовано і перевірено, 42 із 42 тестів |
| verification.schema.json, openapi-verification.yaml | Написано, 36 із 36 контрактних перевірок |
| verification_sources.json (13), verification_checks.json (14) | Написано, звірено з DDL і OpenAPI |
| probe_sources.py | Прогнано на живих джерелах |
Sprint scope
| Item | Duration | What it covers | Done when |
|---|---|---|---|
V1 Каталоги і конфігурація | 2 д | Завантажувач каталогів джерел і перевірок при старті з seed/, ідемпотентний upsert; ключі джерел — у секретах середовища, а не в коді; джерело needs_key без ключа стартує як unavailable, не падає; ендпойнт GET /verification/sources віддає фактичний стан. | Сервіс піднімається на чистій БД, каталоги збігаються з файлами байт у байт, GET /verification/sources показує 13 джерел із реальним станом. |
V2 Три коннектори живих джерел | 4 д | VIES (identity.vat_active, без ключа, лише асинхронно), Biała lista (monitor.vat_status + знімок рахунків), KRS (identity.registry_match_pl, 204 = не знайдено, stanZDnia → source_as_of); спільний контракт, кеш за TTL, експоненційна пауза, 3 спроби, потім unavailable. | Офлайн-фікстури для кожного джерела зелені, прапорець --live робить один реальний запит, недоступність джерела дає unavailable з кодом причини, а не виняток. |
V3 Машина справи | 5 д | Створення справи, черга перевірок, паралельний запуск, збірка результатів; правила рішення з ТЗ §5 (рішучі перевірки, blocking_unavailable, override_blocking з подвійним скороченням строку і окремою подією в журналі); автоматичне схвалення без оператора, коли всі обов'язкові перевірки пройдено; перехід у manual_review з переліком причин. | Компанія з чинним NIP проходить від POST /verification/cases до рівня L1 без участі людини, а компанія з недоступним блокуючим джерелом гарантовано в цю точку не потрапляє. |
V4 Докази і зберігання | 2 д | Об'єктне сховище з увімкненим WORM, запис сирого відгуку, SHA-256, розмір, тип; source_as_of окремо від fetched_at; retention_until = дата перевірки + 5 років, завдання прибирання за розкладом; тимчасові підписані посилання в GET /verification/checks/{id}/evidence. | Доказ, записаний тиждень тому, віддається за хешем, а спроба видалити його роллю застосунку відхиляється базою. |
V5 API і ролі | 3 д | 10 шляхів із openapi-verification.yaml, валідація запитів і відповідей проти схеми в рантаймі; роль оператора верифікації окремо від адміністратора, журнал розкриття контактів подією contact_reveal; ліміт частоти на подання справ. | Відповідь, що не відповідає схемі, не виходить із сервісу — вона дає 500 і запис у журнал, а не мовчазне порушення контракту. |
V6 Досьє і бейдж у SPA (фронтенд) | 3 д | Бейдж у стрічці — чотири стани, без відтінків і зірочок; сторінка досьє з переліком перевірок, джерелом, датою перевірки і датою стану джерела, позначкою застарілого; екран стану власної справи для заявника. | Досьє показує рівно те, що є в базі, а недоступне джерело виглядає як недоступне — тим самим способом, яким це вже роблять вкладки погоди й кордонів. |
V7 CI-гейти | 1.5 д | Два обов'язкові статуси в правилі захисту гілки: «Контракт модуля верифікації» і «Інваріанти верифікації»; живий зонд джерел — у щоденний запуск за розкладом, не в перевірку pull request; п'ять негативних PR (unavailable зі знахідками; схвалення з непорожнім blocking_unavailable; критична зміна без призупинення; pass без строку дії; блокуюче джерело, позначене як лише ручне). | Усі п'ять негативних PR червоні, а звичайний PR зелений. |
V8 Юридичний трек (паралельно, день 1) | паралельно | Звернення до ДП НАІС за договором на API ЄДР (18 000 грн з ПДВ на календарний місяць); запит ключа до Державного реєстру санкцій РНБО; резервний тариф агрегатора на випадок затримки договору (від 399 грн на місяць за 400 перевірок); оцінка легітимного інтересу (LIA) і шаблон DPA з провайдером даних. | Усі три звернення надіслані й мають вхідний номер. Результат до кінця спринту не очікується — очікується запущений процес. |
Calendar
| Day | Work |
|---|---|
| 1 | Рішення про хостинг. Розгортання бекенду і сховища. Юридичний трек V8 — усі три звернення |
| 2 | V1 каталоги і конфігурація |
| 3–4 | V2 VIES і Biała lista |
| 5 | V2 KRS, кеш і TTL |
| 6–7 | V3 машина справи, правила рішення |
| 8 | V3 override_blocking, V4 докази і WORM |
| 9 | V5 API і ролі; фронтенд V6 паралельно з дня 7 |
| 10 | V7 гейти, негативні PR, наскрізний прогін, демонстрація |
Resource: 1 backend engineer full-time, 0.5 integrations, 0.5 frontend from day 7, 0.5 QA/CI. The legal track is owned by the product owner.
What is NOT in Sprint 1
- Українські джерела: ЄДР, санкції РНБО, ЄДРСР — Спринт 2, після ключів і договору
- Рівень L2, документи, право підпису, контрольний платіж — Спринт 2
- Планувальник дельта-моніторингу і сповіщення — Спринт 3; знімки реквізитів уже пишуться в Спринті 1, тож планувальнику буде що порівнювати
- Кабінет оператора зі складним ручним розглядом — у Спринті 1 достатньо мінімального переліку справ і кнопки рішення
- Напрям B (ingest-агент) стартує з тижня 4 окремою людиною і не конкурує за бекенд-ресурс
Sprint acceptance criteria
- Компанія з чинним польським NIP отримує L1 автоматично за менш ніж 60 секунд від подання, без дотику оператора
- Компанія з statusVat не Czynny отримує fail за рішучою перевіркою і не отримує жодного рівня
- При недоступному блокуючому джерелі справа переходить у manual_review, а не схвалюється
- Схвалення з override_blocking дає рівень із удвічі коротшим строком і окремою подією в журналі
- Доказ кожної перевірки віддається за хешем; видалити його роллю застосунку неможливо
- Знімок офіційних банківських рахунків із Biała lista збережено — навіть без планувальника, бо це база для Спринту 3
- Бейдж у стрічці й досьє показують джерело і дві дати; жодного агрегованого балу в інтерфейсі немає
- «Контракт модуля верифікації» (36) і «Інваріанти верифікації» (42) — обов'язкові статуси в правилі захисту гілки, обидва зелені на main
- П'ять негативних PR блокуються CI
- Усі наявні перевірки Спринту 0 і контрактні перевірки репозиторію лишаються зеленими
Sprint risks and mitigations
| Risk | Early warning sign | Action |
|---|---|---|
| Рішення про хостинг затягується | День 1 закінчився без середовища | Тимчасово розгорнути на VPS із бекапами; це оборотне, на відміну від простою всього спринту |
| VIES відповідає повільно або з перебоями | Затримка перевищує 2 с у прогонах | Перевірка вже асинхронна за задумом; результат unavailable з повтором, онбординг не блокується |
| KRS повертає 204 як помилку в коннекторі | Хибні fail у фікстурах | Явний тест на «компанію не знайдено» в наборі фікстур із дня 1 |
| Обсяг V3 недооцінено | До дня 7 машина справи не проходить наскрізь | Пожертвувати V6 (бейдж у SPA) на користь V3; демонструвати через API |
| Договір із НАІС не рухається | Немає вхідного номера до дня 3 | Одразу вмикати резервний тариф агрегатора, щоб Спринт 2 не зсунувся |
Sprint cost by source
| Source | Cost in Sprint 1 |
|---|---|
| VIES, Biała lista, KRS | 0 — публічні, без ключа |
| ДП НАІС | 0 у спринті; з моменту договору — 18 000 грн з ПДВ на місяць |
| Агрегатор (резерв) | від 399 грн на місяць за 400 перевірок |
| OpenSanctions | 0 у спринті; далі 0,10 EUR за запит або власне розгортання |
| Об'єктне сховище доказів | Мізерна за обсягами спринту |
Handoff from this sprint to Sprint 2
Спринт 2 (тижні 5–7) починається з того місця, де Спринт 1 зупинився, і додає: український напрям через отримані ключі, рівень L2 з документами і правом підпису, судовий і санкційний скринінг із ручним розглядом. Дельта-моніторинг і сповіщення — Спринт 3, тижні 7–8, паралельно з початком напряму C.