Requirements Analyst — stimmt's: Mobile Parent-School Signature Platform
Вердикт: GO MVP: 4-8 недель, 1 соло-разработчик + Claude Code, €0 бюджет Стек: React (PWA) + Canvas API + WebAuthn API + pdf-lib + Supabase + bun/Hono Рынок: DACH Schule + Musikschule (32 400 школ + 934 VdM Musikschulen, 187M Eltern-подписей/год)
0. Ключевые архитектурные решения (до написания требований)
Эти решения — фундамент, из которого выводятся все требования ниже.
| # | Решение | Обоснование |
|---|---|---|
| D1 | PWA, не нативное приложение | Родитель не устанавливает приложение. Сканировал QR → подписал → закрыл. Нулевой friction. |
| D2 | Без Eltern-аккаунта | Ключевое конкурентное преимущество против IServ/Sdui/WebUntis. Data minimization. |
| D3 | Подпись ТОЛЬКО на устройстве | Никакой сервер не видит сырую подпись. WebAuthn credential в device secure element. Canvas-изображение уходит только внутри PDF. |
| D4 | QR-код на бумаге — единственный канал дистрибуции | Lehrer распечатывает Elternbrief с QR. Ученик несёт домой. Родитель сканирует. Это существующий процесс, мы его не меняем, а оцифровываем. |
| D5 | WebAuthn как метод подтверждения | Face ID / Touch ID / PIN через platform authenticator. eIDAS SES (Simple Electronic Signature). Без биометрических данных на сервере. |
| D6 | Canvas-подпись (finger draw) | Визуальная подпись на HTML5 Canvas. Перед WebAuthn-подтверждением. Заменяет «wet signature» на бумаге. |
| D7 | Supabase как бэкенд | PostgreSQL + Row Level Security + Storage + Edge Functions. Соло-разработчик не пишет бэкенд с нуля. |
| D8 | bun/Hono для критичных эндпоинтов | PDF-генерация, WebAuthn verification — server-side логика, которую Supabase Edge Functions не тянут. |
1. MoSCoW-приоритизация
1.1 Must-Have (MVP — без этого продукта нет)
| ID | Требование | Обоснование |
|---|---|---|
| M1 | Lehrer-аккаунт с email/password | Lehrer — единственная роль, которой нужен аккаунт. Загружает документ, получает подписанный результат. |
| M2 | Загрузка PDF Lehrer-ом | Lehrer загружает Elternbrief/Anmeldeformular как PDF (до 5 МБ). |
| M3 | Генерация уникального QR-кода на документ | Каждый документ получает уникальный URL с токеном (UUID v4 + HMAC). URL ведёт на PWA. |
| M4 | PWA: открытие по QR-ссылке | Родитель сканирует QR камерой телефона → открывается PWA с документом. Без установки, без логина. |
| M5 | PWA: просмотр PDF-документа | Родитель видит Elternbrief внутри PWA (рендеринг PDF через pdf.js или встроенный <iframe>). |
| M6 | PWA: Canvas-подпись пальцем | HTML5 Canvas для рисования подписи пальцем/стилусом. Кнопка «Очистить» для повторной попытки. |
| M7 | PWA: WebAuthn-подтверждение (Face ID / Touch ID / PIN) | После рисования подписи — системный диалог биометрии/PIN через navigator.credentials.get(). |
| M8 | Генерация подписанного PDF | Серверная сборка: исходный PDF + Canvas-изображение подписи (встроенное в документ) + страница аудит-следа. pdf-lib. |
| M9 | Аудит-след в PDF | Последняя страница: timestamp (RFC 3339), WebAuthn credential ID (хвост), user agent, IP hash, хеш исходного документа (SHA-256). |
| M10 | Lehrer: скачивание подписанного PDF | Lehrer видит статус документа («ожидает» / «подписан» / «отклонён») и скачивает подписанный PDF. |
| M11 | Lehrer: список отправленных документов | Таблица: название, дата отправки, статус, количество подписей (для массовых). |
| M12 | Lehrer: dashboard со статистикой | Количество отправленных / подписанных / ожидающих документов за последние 30 дней. |
| M13 | Музыкальная школа: отдельный tenant/сегмент | Musikschulleiter входит как Lehrer, но видит брендирование Musikschule. Anmeldeformular вместо Elternbrief. |
| M14 | DSGVO: data minimization | Сервер НЕ хранит: Canvas-изображение отдельно от PDF, WebAuthn credential ID полностью, IP-адрес (только хеш). Только подписанный PDF + audit-лог. |
| M15 | DSGVO: право на удаление (Art. 17) | Lehrer может удалить документ. Сервер удаляет PDF + audit-лог в течение 24 часов. Безвозвратно. |
| M16 | PWA: отказ от подписания | Кнопка «Ablehnen» (отклонить). Родитель может отказаться подписывать. Lehrer получает уведомление. |
1.2 Should-Have (MVP+2 недели)
| ID | Требование |
|---|---|
| S1 | Lehrer: массовая отправка одного документа |
| S2 | Lehrer: отслеживание по Schüler-ам |
| S3 | Lehrer: напоминание о неподписанных |
| S4 | Lehrer: срок действия QR-кода |
| S5 | PWA: немецкий интерфейс (100%) |
| S6 | PWA: темная тема |
| S7 | Lehrer: экспорт списка статусов |
| S8 | PWA: accessibility (WCAG 2.1 AA) |
1.3 Could-Have (MVP+4 недели)
| ID | Требование |
|---|---|
| C1 | PWA: добавление на домашний экран |
| C2 | Lehrer: шаблоны Elternbrief |
| C3 | PWA: поддержка нескольких языков |
| C4 | PWA: офлайн-подписание |
| C5 | Schulleitung: агрегированный dashboard |
| C6 | Schulleitung: управление Lehrer-аккаунтами |
| C7 | PDF с несколькими подписями |
| C8 | PWA: PAdES baseline profile |
| C9 | Lehrer: интеграция с IServ/Sdui/WebUntis |
1.4 Won't-Have (явно исключено из MVP и v1)
| ID | Требование | Причина |
|---|---|---|
| W1 | Eltern-аккаунт / регистрация | Убивает ключевое УТП. Родитель не должен ничего создавать. |
| W2 | QES (Qualified Electronic Signature) | Требует сертифицированного TSP, затраты €50K+, 6+ месяцев сертификации. Не для соло. |
| W3 | Нативное мобильное приложение | PWA достаточно. App Store/Google Play — лишний friction для Eltern и замедление цикла «отправил QR → подписал». |
| W4 | Хранение сырых изображений подписей на сервере | Противоречит DSGVO-УТП data minimization. |
| W5 | Сбор биометрических данных | WebAuthn platform authenticator НЕ передаёт биометрию веб-приложению. Никаких отпечатков/лиц на сервере. |
| W6 | Интеграция с DocuSign/Adobe Sign | Мы — альтернатива, не комплемент. |
| W7 | Видеоидентификация / KYC | Не требуется для школьных документов. Textform + SES достаточно. |
| W8 | Блокчейн-нотаризация / timestamping | Переусложнение. Серверный timestamp + хеш дают достаточный след. |
| W9 | On-premises установка для школ | SaaS-first. On-premises требует IT-персонала в школе, которого нет. |
| W10 | Платёжная система в MVP | Бесплатный пилот с 5-10 школами. Оплата — после валидации. |
2. User Stories
2.1 Lehrer / Schulsekretaeriat (основной пользователь)
Персона: Классный руководитель 3b класса, Grundschule в NRW. Отправляет 2-3 Elternbrief-а в месяц классу из 28 Schüler-ов. Текущий процесс: печатает → раздаёт → ждёт → собирает → проверяет → хранит. 3-5 дней на один Elternbrief.
US-L01: Регистрация Lehrer-аккаунта - Lehrer переходит на сайт → вводит Schul-Email, Passwort, Name, Schule - Подтверждение email (magic link или 6-digit code) - После подтверждения — доступ в Dashboard - Acceptance criteria: Lehrer может войти и видит пустой Dashboard за <2 минуты с момента регистрации
US-L02: Загрузка и отправка Elternbrief - Кнопка «Neuer Elternbrief» → загрузка PDF (до 5 МБ) - Lehrer вводит название (по умолчанию — имя файла) - Опционально: вводит имена Schüler-ов (для S1) - Система генерирует страницу с QR-кодом + краткой инструкцией для Eltern - Lehrer распечатывает → раздаёт Schüler-ам - Acceptance criteria: от загрузки PDF до печати QR — <90 секунд. QR ведёт на валидный URL.
US-L03: Просмотр статуса документов - Dashboard: список отправленных документов, сортировка по дате - Каждый документ: название, дата, статус (отправлен/частично подписан/полностью подписан/просрочен), количество подписей - Фильтр по статусу, поиск по названию - Acceptance criteria: Lehrer видит все свои документы, может отфильтровать и найти любой за <10 секунд
US-L04: Скачивание подписанного PDF - Lehrer нажимает на подписанный документ → кнопка «Herunterladen» - Скачивается PDF с: исходным содержанием + визуальной подписью + страницей аудит-следа - Acceptance criteria: PDF содержит все страницы исходного документа, подпись на месте, аудит-след читаем
US-L05: Отслеживание по Schüler-ам (при массовой отправке — S1) - Lehrer отправляет Elternbrief 28 Schüler-ам → видит таблицу: имя Schüler, статус, дата подписи - Цветовая индикация: зелёный (подписано), жёлтый (ожидает), красный (просрочено/отклонено) - Acceptance criteria: Lehrer за <5 секунд определяет, кто не подписал
US-L06: Напоминание неподписавшим (S3) - Кнопка «Erneut senden» напротив Schüler-ов без подписи - Генерирует новый QR (старый деактивируется) - Acceptance criteria: Lehrer может напечатать новый QR только для выбранных Schüler-ов
US-L07: Удаление документа - Lehrer удаляет документ → подтверждение → PDF удаляется с сервера в течение 24 часов - Все QR-ссылки на этот документ становятся недействительными немедленно - Acceptance criteria: после удаления QR ведёт на страницу «Dokument gelöscht»
US-L08: Экспорт статусов (S7) - Кнопка «Exportieren als CSV» → скачивается CSV: Schüler-Name, Status, Datum - Acceptance criteria: CSV открывается в Excel/Numbers без ошибок кодировки (UTF-8 BOM)
2.2 Eltern (родитель)
Персона: Мать двоих детей, Grundschule. 2-3 Elternbrief-а в месяц на ребёнка. Телефон: iPhone или Android среднего сегмента. Не хочет устанавливать приложения, создавать аккаунты, запоминать пароли.
US-E01: Сканирование QR и открытие документа - Ребёнок приносит домой лист бумаги с QR-кодом - Родитель сканирует QR камерой телефона - Открывается веб-страница с Elternbrief - Acceptance criteria: от сканирования до просмотра документа — <5 секунд. Работает на iOS Camera и Android Camera/Google Lens.
US-E02: Просмотр Elternbrief - Родитель видит документ на экране телефона - Можно листать страницы (свайп), зумировать (pinch) - Документ отображается читаемо на экранах от 320px ширины - Acceptance criteria: весь текст документа читаем без горизонтального скролла на iPhone SE
US-E03: Подписание — Canvas - Кнопка «Unterschreiben» под документом → переход на страницу подписи - Область Canvas: «Bitte hier unterschreiben» (подпишите здесь) - Родитель рисует подпись пальцем - Кнопка «Löschen» (очистить) для повторной попытки - Acceptance criteria: Canvas работает без лага на телефонах 3-летней давности. Подпись выглядит естественно.
US-E04: Подписание — WebAuthn-подтверждение - После рисования — кнопка «Bestätigen» (подтвердить) - Системный диалог: Face ID / Touch ID / PIN (зависит от устройства) - После успешного подтверждения — экран успеха: «Dokument unterschrieben» - Acceptance criteria: от кнопки «Bestätigen» до экрана успеха — <3 секунды. WebAuthn работает на iOS 16+ и Android 9+.
US-E05: Отказ от подписания - Кнопка «Ablehnen» (отклонить) на странице подписи → подтверждение - Отказ зафиксирован. Lehrer получает уведомление. - Acceptance criteria: отказ виден Lehrer-у в статусе документа в течение 1 минуты
US-E06: Ошибка — QR истёк (после дедлайна) - Если Lehrer установил Frist и она прошла — страница показывает «Dieses Dokument ist nicht mehr gültig» с датой истечения - Acceptance criteria: сообщение понятно Eltern без технического жаргона
US-E07: Повторное открытие QR (после подписания) - Если родитель сканирует QR повторно — страница показывает «Bereits unterschrieben am [дата]» с возможностью скачать подписанный PDF - Acceptance criteria: родитель может скачать свою копию подписанного документа
2.3 Musikschulleiter / Administrator
Персона: Leiter частной Musikschule, 200 Schüler. Отправляет Anmeldeformular (договор на обучение) родителям. Нужно подписание раз в год на Schüler. Требуется брендирование Musikschule.
US-M01: Брендирование Musikschule - При регистрации Musikschule — логотип, название, контактные данные - QR-страница и PWA отображают логотип Musikschule - Acceptance criteria: на странице подписания Eltern видит логотип Musikschule, а не stimmt's
US-M02: Anmeldeformular с несколькими подписями (C7) - Anmeldeformular может требовать подписи обоих родителей - Первый родитель подписывает → второй родитель получает QR (или тот же QR открывается второй раз) - Acceptance criteria: оба родителя могут подписать один документ
US-M03: Годовой цикл - Musikschulleiter отправляет Anmeldeformular-ы раз в год всему контингенту - Массовая отправка 200 Schüler-ам - Acceptance criteria: массовая отправка работает для 200+ Schüler-ов без таймаута
2.4 Schulleitung / Administrator
Персона: Директор школы, 40 Lehrer, 800 Schüler. Хочет видеть общую картину и управлять доступом Lehrer-ов.
US-S01: Агрегированный dashboard (C5) - Статистика по школе: всего документов, подписей, % неподписанных - Разбивка по классам/Lehrer-ам - Среднее время от отправки до подписи - Acceptance criteria: Schulleitung видит данные по всей школе за <5 секунд после входа
US-S02: Управление Lehrer-аккаунтами (C6) - Добавление Lehrer-ов (email + имя) - Удаление/деактивация Lehrer-ов - Сброс пароля Lehrer-а - Acceptance criteria: добавление Lehrer-а занимает <30 секунд
3. Нефункциональные требования
3.1 DSGVO / Datenschutz
| ID | Требование | Реализация |
|---|---|---|
| N1 | Data minimization (Art. 5(1)(c)) | Сервер хранит ТОЛЬКО: Lehrer-email (хеш), Schul-email, подписанный PDF, audit-метаданные. Никаких Eltern-данных. |
| N2 | No biometric data | WebAuthn credential хранится в Secure Element устройства. Сервер получает только credential ID (не биометрия). |
| N3 | Canvas-изображение — транзитно | Подпись передаётся на сервер ТОЛЬКО внутри PDF-сборки и удаляется из памяти после генерации PDF. Нигде не сохраняется отдельно. |
| N4 | IP-адрес Eltern — только хеш | IP хешируется (SHA-256) перед записью в аудит-след. Полный IP не хранится. |
| N5 | Право на удаление (Art. 17) | Lehrer может удалить документ. Удаление с сервера в течение 24 часов. Подписанный PDF у Lehrer-а не модифицируется (он уже у него). |
| N6 | Право на доступ (Art. 15) | Lehrer может запросить все данные, связанные со своим аккаунтом. Экспорт в machine-readable формате (JSON). |
| N7 | AVV (Auftragsverarbeitungsvertrag) | Стандартный шаблон AVV для школ. Supabase — субпроцессор (DPA прилагается). Hetzner — немецкий хостер. |
| N8 | DPIA (Data Protection Impact Assessment) | DPIA обязателен ДО пилота с реальными школами. WebAuthn credential ID может считаться персональными данными. Нужен Rechtsgutachten. |
| N9 | Cookie consent | Только essential cookies (сессия Lehrer-а). Никаких tracking/analytics cookies без согласия. |
| N10 | Server location: EU/EWR | Hetzner (Nürnberg/Falkenstein) или эквивалент. Данные не покидают EU. |
3.2 Безопасность
| ID | Требование | Реализация |
|---|---|---|
| N11 | HTTPS only | Все соединения TLS 1.3. HSTS preload. |
| N12 | QR URL — одноразовый или с expiry | Token в URL проверяется: не истёк, не отозван, не использован (опционально). |
| N13 | Rate limiting на подписание | Максимум 5 попыток подписания с одного IP за 10 минут. |
| N14 | PDF-санитизация | При загрузке PDF удаляются: JavaScript, embedded files, external links, XFA forms. |
| N15 | Content Security Policy (CSP) | Strict CSP на PWA: нет inline scripts, нет eval, нет внешних ресурсов кроме Supabase. |
| N16 | Lehrer: password policy | Минимум 8 символов. bcrypt/argon2 хеширование. Rate limiting на логин. |
| N17 | WebAuthn: user verification required | userVerification: "required" — всегда требует биометрию/PIN, не просто присутствие. |
3.3 Доступность / Performance
| ID | Требование | Значение |
|---|---|---|
| N18 | Время загрузки PWA (first contentful paint) | <2 секунд на 4G |
| N19 | Время генерации подписанного PDF | <10 секунд для PDF до 5 МБ |
| N20 | QR URL доступность | 99.5% uptime в рабочие часы (8-18 CET, будни) |
| N21 | Размер PWA (полный) | <500 КБ (без учёта кешированного PDF) |
| N22 | PDF размер после подписания | Исходный размер + не более 200 КБ (подпись + аудит-страница) |
| N23 | Совместимость с браузерами | Safari iOS 16+, Chrome Android 9+, Chrome Desktop, Firefox Desktop, Safari Desktop |
| N24 | Адаптивность | Mobile-first. Экраны 320-428px (iPhone SE — iPhone 16 Pro Max). Десктоп для Lehrer-Dashboard. |
3.4 PWA / Офлайн
| ID | Требование |
|---|---|
| N25 | Service Worker: кеширование PWA-оболочки |
| N26 | Service Worker: кеширование PDF |
| N27 | Офлайн-подписание (C4) |
| N28 | Offline fallback |
4. Границы MVP
4.1 Входит в MVP (Must-Have: M1-M16)
Lehrer-side (веб-портал): - Регистрация/логин Lehrer-а - Загрузка PDF (один документ на отправку) - Генерация QR-кода - Dashboard: список документов со статусами - Скачивание подписанного PDF
Eltern-side (PWA): - Открытие документа по QR-ссылке - Просмотр PDF на телефоне - Canvas-подпись пальцем - WebAuthn-подтверждение (Face ID / Touch ID / PIN) - Отказ от подписания
Система: - Генерация подписанного PDF (исходный PDF + подпись + аудит-страница) - Аудит-след (timestamp, credential ID tail, user agent, IP hash, хеш документа) - Data minimization: подпись не хранится отдельно - Удаление документа Lehrer-ом
Технический фундамент: - Supabase: auth, база, storage, Row Level Security - React PWA: Vite + React Router - bun/Hono: PDF-микросервис - Hetzner: хостинг (немецкий дата-центр) - HTTPS/TLS, CSP, rate limiting
4.2 НЕ входит в MVP
- Массовая отправка (один PDF → много Schüler-ов) — S1
- Отслеживание по Schüler-ам — S2
- Напоминания — S3
- Срок действия QR-кода — S4
- Экспорт CSV — S7
- Шаблоны Elternbrief — C2
- Несколько подписей на документе — C7
- PAdES baseline — C8
- Офлайн-подписание — C4
- Агрегированный dashboard Schulleitung — C5
- Управление Lehrer-аккаунтами — C6
- Брендирование Musikschule — захардкожено лого в конфиге (без Selbstbedienung)
- Мультиязычность PWA — C3
- Платёжная система / тарифы — W10
- Интеграция с IServ/Sdui/WebUntis — C9
4.3 Технический долг, закладываемый осознанно
| # | Долг | Почему ок для MVP | Когда исправить |
|---|---|---|---|
| TD1 | Нет очереди для PDF-генерации | MVP: 5-10 школ, пиковая нагрузка — 30 подписаний в час. Синхронная генерация в Hono не упадёт. | v1.1: очередь на Redis |
| TD2 | Нет E2E-тестов | Ручное тестирование с первыми 5 школами. | v1.1: Playwright для критических путей |
| TD3 | Нет CI/CD кроме GitHub Actions для деплоя | Ручной деплой через CLI. | v1.1 |
| TD4 | Нет мониторинга кроме Supabase-логов | Достаточно для 5-10 школ. | v1.1: Sentry + Grafana |
| TD5 | Нет Schema migrations | Прямые изменения в Supabase через Dashboard. | v1.1: миграции в git |
5. Критерии приёмки MVP
5.1 Gate 1: Техническая готовность
| # | Критерий | Как проверить |
|---|---|---|
| G1.1 | Lehrer регистрируется за <2 минуты | Тайминг от первого визита до пустого Dashboard |
| G1.2 | Lehrer загружает PDF, получает QR за <90 секунд | Тайминг от кнопки «Upload» до страницы с QR |
| G1.3 | Родитель открывает QR → видит документ за <5 секунд (4G) | Chrome DevTools throttling: Fast 3G |
| G1.4 | Полный цикл подписания: QR → подпись → PDF у Lehrer-а — <3 минут | End-to-end тайминг |
| G1.5 | Подписанный PDF валиден: открывается в Adobe Reader, Preview, браузере | Проверить на 3 программах |
| G1.6 | Аудит-страница содержит: timestamp, credential ID tail, user agent, IP hash, документ hash | Визуальная проверка PDF |
| G1.7 | WebAuthn работает на iOS 16+ и Android 9+ | Тест на реальных устройствах (минимум iPhone и Android) |
| G1.8 | Canvas-подпись выглядит естественно (не пиксельная, не лагает) | Визуальная оценка на iPhone SE |
| G1.9 | После удаления документа QR ведёт на «Dokument gelöscht» | Проверка через 5 минут после удаления |
| G1.10 | Весь интерфейс на немецком, без английского текста | Полный audit UI |
5.2 Gate 2: DSGVO / Безопасность
| # | Критерий | Как проверить |
|---|---|---|
| G2.1 | HTTPS на всех эндпоинтах, HSTS | curl -I https://... |
| G2.2 | Canvas-изображение НЕ сохраняется отдельно от PDF | Проверить Supabase Storage — только PDF-файлы |
| G2.3 | IP-адрес Eltern хеширован в аудит-следе | Проверить аудит-страницу: нет полного IP |
| G2.4 | Full WebAuthn credential ID НЕ хранится на сервере (только хвост) | Проверить БД: поле credential_id_length < 20 символов |
| G2.5 | PDF-файл удаляется с сервера в течение 24 часов после запроса Lehrer-а | Проверить через 24 часа после удаления |
| G2.6 | CSP без 'unsafe-inline' и 'unsafe-eval' | Chrome DevTools → Security |
| G2.7 | Rate limiting на endpoint подписания | 5 быстрых POST → 6-й возвращает 429 |
| G2.8 | Нет трекеров, нет внешних скриптов на PWA | Просмотр исходного кода PWA |
5.3 Gate 3: Пользовательский опыт
| # | Критерий | Как проверить |
|---|---|---|
| G3.1 | Родитель подписывает документ за <15 секунд от открытия QR | Тайминг с реальными пользователями |
| G3.2 | Родитель понимает процесс без инструкции | Usability test: «Подпишите этот документ» (без подсказок) |
| G3.3 | На iPhone SE документ читаем без горизонтального скролла | Визуальная проверка |
| G3.4 | Кнопка «Ablehnen» видна и понятна | Usability test |
| G3.5 | После подписания — понятный экран успеха с возможностью скачать копию | Usability test |
5.4 Gate 4: Пилотная готовность
| # | Критерий |
|---|---|
| G4.1 | 5 школ согласились на пилот (минимально: 3) |
| G4.2 | Rechtsgutachten: подтверждение что WebAuthn SES = Textform для Schule (Fachanwalt für IT-Recht) |
| G4.3 | DPIA готов и подписан |
| G4.4 | AVV-шаблон готов для школ |
| G4.5 | Impressum + Datenschutzerklaerung на сайте |
6. Допущения (Assumptions)
| # | Допущение | Impact if wrong | Проверка |
|---|---|---|---|
| A1 | WebAuthn platform authenticator присутствует на 90%+ устройств DACH-Eltern | Critical. Если <70% устройств имеют Face/Touch/PIN — нужен fallback (Email-OTP). | Проверить статистику устройств целевой аудитории |
| A2 | Canvas-подпись + WebAuthn — достаточно для Textform/SES под Schuldokumente | Critical. Если Schulen требуют Schriftform (§126 BGB) — продукт неприменим. | Rechtsgutachten ДО кода (Gate 4.2) |
| A3 | Школы готовы использовать QR на бумаге (не только цифровые каналы) | High. Если школы хотят ТОЛЬКО email/Sdui — модель дистрибуции меняется. | CustDev с 10 Lehrer-ами |
| A4 | Родители умеют сканировать QR-коды | Medium. iOS Camera сканирует QR нативно с 2017. Android — Google Lens. Пенетрация высокая. | Usability test с 5 Eltern |
| A5 | Supabase Free Tier + Hetzner €5 VPS достаточно для пилота | Low. Если нет — €20/мес решит. | Мониторинг нагрузки |
| A6 | 187M Eltern-подписей/год — реалистичный TAM | Medium. Цифра включает все Schulformen и все виды Eltern-коммуникации. | Разбить по Schulform, типу документа |
| A7 | Соло-разработчик с Claude Code может построить MVP за 4-8 недель | Medium. Если затянется — расширить до 12 недель. Без внешних зависимостей. | Спринт-планирование Week 1 |
7. Edge Cases (критические)
| # | Edge Case | Severity | Mitigation |
|---|---|---|---|
| E1 | Устройство Eltern не поддерживает WebAuthn | Critical | Показать сообщение: «Ihr Gerät unterstützt keine Unterschrift. Bitte nutzen Sie ein anderes Gerät oder wenden Sie sich an die Schule.» Fallback: PIN-код через WebAuthn — поддерживается практически везде. |
| E2 | Eltern закрыл браузер до завершения подписания | High | Никакого состояния не сохранено. QR можно отсканировать заново — процесс начнётся сначала. |
| E3 | Eltern потерял QR-код / ребёнок не донёс | High | Lehrer нажимает «Erneut senden» — новый QR. Старый деактивируется. (S3 в v1.1; в MVP — Lehrer пересоздаёт документ заново.) |
| E4 | Сканирование QR в тёмном помещении | Medium | Достаточный контраст QR на бумаге. |
| E5 | PDF не помещается на экран телефона | High | pdf.js с адаптивным рендерингом. Если PDF — скан A4 (image-based) → отображается с зумом. |
| E6 | Canvas-подпись на очень маленьком экране (320px) | Medium | Canvas 320x150px минимально. Толщина линии адаптивна. |
| E7 | WebAuthn credential уже существует на устройстве (повторное подписание другого документа) | Low | navigator.credentials.get() с allowCredentials: [] (пустой) — пользователь выбирает существующий credential или создаёт новый. |
| E8 | PDF с вредоносным содержимым | Critical | Санитизация при загрузке: удаление JavaScript, embedded files, XFA forms через pdf-lib. |
| E9 | Одновременное подписание одного QR двумя Eltern (разделённая семья) | Medium | В MVP: первый подписавший — подпись засчитывается, второй видит «Bereits unterschrieben». C7 — поддержка множественных подписей. |
| E10 | Lehrer загрузил не PDF (Word, изображение) | Medium | Валидация MIME type + file signature. Показать ошибку «Bitte laden Sie eine PDF-Datei hoch». |
| E11 | Lehrer забыл пароль | Low | «Passwort vergessen» → magic link на Schul-Email. |
| E12 | Schule закрылась / Lehrer уволился — что с данными? | Medium | Процедура offboarding: все документы удаляются. Schulleitung может удалить Lehrer-аккаунт (C6 в v1.1). |
8. Data Model (MVP — логическая)
``` schule id: uuid name: text logo_url: text? # C1 — Musikschule created_at: timestamptz
lehrer id: uuid (Supabase auth.users) email: text (unique) schule_id: uuid -> schule name: text created_at: timestamptz
dokument id: uuid lehrer_id: uuid -> lehrer schule_id: uuid -> schule titel: text original_pdf_path: text # Supabase Storage path signed_pdf_path: text? # null пока не подписан schueler_liste: jsonb? # [{name: "Max Mustermann"}], null если одиночное frist: timestamptz? # дедлайн (S4, v1.1) status: text # 'pending' | 'signed' | 'rejected' | 'expired' created_at: timestamptz updated_at: timestamptz
unterschrift id: uuid dokument_id: uuid -> dokument schueler_name: text? # null если одиночное подписание credential_id_tail: text # последние 8 символов WebAuthn credential ID user_agent: text ip_hash: text # SHA-256(ip) dokument_hash: text # SHA-256 исходного PDF signed_at: timestamptz
qr_token id: uuid dokument_id: uuid -> dokument token_hash: text # SHA-256(token) schueler_index: int? # для массовой отправки (S1) used: boolean expires_at: timestamptz? # если установлен Frist (S4) created_at: timestamptz ```
Принципы data minimization:
- НЕТ таблицы eltern — родитель не существует как сущность в системе
- НЕТ хранения credential_id полностью — только хвост (8 символов) для аудит-следа
- НЕТ хранения IP-адреса — только SHA-256 хеш
- НЕТ хранения Canvas-изображения отдельно от PDF
- НЕТ cookie кроме сессионной для Lehrer-а
- original_pdf_path и signed_pdf_path удаляются с Storage при удалении документа
9. План работ (Solo + Claude Code)
| Неделя | Фокус | Ключевые артефакты |
|---|---|---|
| W1 | Фундамент + Rechtsgutachten | Supabase проект, Hetzner VPS, домен, PWA scaffold (Vite + React), параллельно запрос Fachanwalt |
| W2 | Lehrer-портал: регистрация + загрузка PDF | Supabase Auth, Lehrer-Dashboard UI, загрузка PDF в Storage |
| W3 | QR-генерация + PWA-просмотр PDF | QR token модель, PWA с pdf.js, Service Worker |
| W4 | Canvas-подпись + WebAuthn | Canvas компонент, WebAuthn интеграция, тестирование на реальных устройствах |
| W5 | PDF-сборка + аудит-след | Hono PDF-микросервис с pdf-lib, генерация подписанного PDF, аудит-страница |
| W6 | Интеграция + Lehrer-Dashboard | End-to-end поток, статусы документов, скачивание PDF |
| W7 | DSGVO + безопасность | DPIA, AVV, удаление документов, CSP, rate limiting, Impressum/Datenschutz |
| W8 | Тестирование + пилот | Ручное тестирование, фикс багов, пилот с 3-5 школами |
Gate после W3: Rechtsgutachten получен — GO/NO-GO. Gate после W5: PDF-сборка работает на 10 разных PDF — GO/NO-GO. Gate после W8: 5 школ на пилоте, 100+ подписаний — MVP accepted.
10. Итоговая оценка готовности
| Критерий | Оценка |
|---|---|
| Ясность ценностного предложения | Высокая — «без аккаунта, без приложения, 15 секунд» |
| Техническая реализуемость | Высокая — PWA + Canvas + WebAuthn + pdf-lib — зрелые API |
| Юридические риски | Средние — нужен Rechtsgutachten (Textform vs Schriftform для Schule) |
| Рыночные риски | Средние — нужна валидация «готовы ли школы платить» |
| MVP complexity | Низкая — 4-8 недель, соло + Claude Code |
| Зависимости | Минимальные — Supabase, Hetzner, WebAuthn browser API (зрелое) |
Обязательные действия ДО кода (Pre-MVP Gates):
- Rechtsgutachten (€500-1500, 2 недели): Fachanwalt für IT-Recht. Ключевой вопрос: достаточно ли Canvas + WebAuthn SES для Textform при Eltern-подписаниях в Schule.
- CustDev: 10 Lehrer-интервью (0 EUR, 2 недели): понять текущий процесс, pain points, готовность использовать QR + PWA.
- CustDev: 5 Musikschulleiter (0 EUR, 1 неделя): понять отличия Schule vs Musikschule.
- DPIA (0 EUR, 1 неделя, самостоятельно по шаблону): обязателен по DSGVO для обработки персональных данных (даже хешированных).
11. Расхождения с Zustimm (родительским проектом)
| Аспект | Zustimm | stimmt's | Обоснование |
|---|---|---|---|
| Аккаунт подписанта | Обязателен (HR-сотрудник) | Отсутствует (Eltern) | Ключевое УТП stimmt's |
| Платформа подписанта | Нативное приложение | PWA | Нулевой friction для Eltern |
| Канал дистрибуции | Push/email уведомления | QR на бумаге | Школьный процесс: бумага уже идёт домой |
| Бэкенд | FastAPI + PostgreSQL + Redis | Supabase + bun/Hono | Соло-разработчик, меньше кода |
| Мобильная ОС | React Native (Expo) | Нет нативного — только PWA | PWA достаточно для Canvas + WebAuthn |
| Рынок | B2B HR Mittelstand | B2B Schule + Musikschule | Разные циклы продаж, разная регуляция |
| Юридический уровень | Compliance Acknowledgement | Textform / SES (eIDAS) | Школьные документы — ниже требования чем HR |
| Android | Отложен до M12 | Нет проблемы — PWA кросс-платформенна | WebAuthn работает на Android Chrome |
| Цена | €20-200/мес (4 тарифа) | TBD после пилота | Школьный рынок более чувствителен к цене |
Документ создан: 2026-06-30 Версия: 1.0 — Initial Requirements Specification Следующий шаг VeriChain: Panel 05 — Product Manager