Skip to content

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):

  1. Rechtsgutachten (€500-1500, 2 недели): Fachanwalt für IT-Recht. Ключевой вопрос: достаточно ли Canvas + WebAuthn SES для Textform при Eltern-подписаниях в Schule.
  2. CustDev: 10 Lehrer-интервью (0 EUR, 2 недели): понять текущий процесс, pain points, готовность использовать QR + PWA.
  3. CustDev: 5 Musikschulleiter (0 EUR, 1 неделя): понять отличия Schule vs Musikschule.
  4. 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