Tjenester

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 — усі три звернення
2V1 каталоги і конфігурація
3–4V2 VIES і Biała lista
5V2 KRS, кеш і TTL
6–7V3 машина справи, правила рішення
8V3 override_blocking, V4 докази і WORM
9V5 API і ролі; фронтенд V6 паралельно з дня 7
10V7 гейти, негативні 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

  1. Компанія з чинним польським NIP отримує L1 автоматично за менш ніж 60 секунд від подання, без дотику оператора
  2. Компанія з statusVat не Czynny отримує fail за рішучою перевіркою і не отримує жодного рівня
  3. При недоступному блокуючому джерелі справа переходить у manual_review, а не схвалюється
  4. Схвалення з override_blocking дає рівень із удвічі коротшим строком і окремою подією в журналі
  5. Доказ кожної перевірки віддається за хешем; видалити його роллю застосунку неможливо
  6. Знімок офіційних банківських рахунків із Biała lista збережено — навіть без планувальника, бо це база для Спринту 3
  7. Бейдж у стрічці й досьє показують джерело і дві дати; жодного агрегованого балу в інтерфейсі немає
  8. «Контракт модуля верифікації» (36) і «Інваріанти верифікації» (42) — обов'язкові статуси в правилі захисту гілки, обидва зелені на main
  9. П'ять негативних PR блокуються CI
  10. Усі наявні перевірки Спринту 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, KRS0 — публічні, без ключа
ДП НАІС0 у спринті; з моменту договору — 18 000 грн з ПДВ на місяць
Агрегатор (резерв)від 399 грн на місяць за 400 перевірок
OpenSanctions0 у спринті; далі 0,10 EUR за запит або власне розгортання
Об'єктне сховище доказівМізерна за обсягами спринту

Handoff from this sprint to Sprint 2

Спринт 2 (тижні 5–7) починається з того місця, де Спринт 1 зупинився, і додає: український напрям через отримані ключі, рівень L2 з документами і правом підпису, судовий і санкційний скринінг із ручним розглядом. Дельта-моніторинг і сповіщення — Спринт 3, тижні 7–8, паралельно з початком напряму C.

Model files