Restaurant QR Menu Complete Program Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Реализовать в DailyMark управление ресторанными меню, импорт из документов, AI-обогащение, видео/3D, публикацию статического HTML по QR-коду на *.dailymark.me или кастомном домене и изолированную аналитику каждого tenant.
Architecture: Авторизованное приложение управляет tenant-scoped черновиками и асинхронными заданиями. Публикация собирает неизменяемый статический bundle в S3-compatible storage и атомарно активирует host manifest; отдельный read-only gateway раздаёт меню без зависимости от management API. OCR, AI, rich media, домены/QR и аналитика изолированы адаптерами и очередями, а любой сгенерированный контент требует ручного подтверждения.
Tech Stack: TypeScript, Bun, NestJS 11, TypeORM/PostgreSQL с FORCE RLS, Redis/BullMQ, Next.js 16, React 19, Ant Design 6, Caddy 2, S3-compatible storage, LiteLLM, внешние AI/media providers, Playwright.
Global Constraints
- Использовать существующие tenant, membership, location, auth, billing, CSRF, impersonation, audit и observability-механизмы DailyMark.
- Сохранять роли
Owner > Admin > Member; не создавать дополнительную persisted-роль. - Каждая новая tenant-таблица получает явную TypeORM-миграцию, runtime/CLI registration,
ENABLE ROW LEVEL SECURITYиFORCE ROW LEVEL SECURITY. - До установки dependency, запуска migration, изменения CI/CD или deployment получать разрешение по
.agent/protocols/permissions.md. - Следовать TDD: сначала failing test, затем минимальная реализация, повторный тест и отдельный conventional commit.
- OCR и AI создают только review candidates; они не публикуют и не меняют цены, ингредиенты или аллергены автоматически.
- Published bundles неизменяемы; неудачная сборка не заменяет active publication.
- Critical JavaScript не превышает 50 KiB gzip; HTML + CSS + critical JS не превышают 150 KiB gzip без учёта media.
- Видео и GLB не загружаются до взаимодействия пользователя и всегда имеют poster/fallback.
- Public analytics не принимает tenant ID как авторитетное значение от клиента, не использует cookies/fingerprinting и не хранит IP.
- Тяжёлые OCR/image/video/3D вычисления выполняются внешними providers, а production VPS только оркестрирует задания и валидирует результаты.
1. Как пользоваться документом
Этот файл — единая программа работ и management checklist. Детальные TDD-задачи, точные пути, интерфейсы и команды находятся в приложениях:
Исходные продуктовые и архитектурные решения описаны в design specification.
Правила статусов
[ ]— работа не начата или нет проверяемого evidence.[x]— пункт выполнен и evidence приложен к issue/PR.- Этап нельзя закрывать только по факту merge: требуется его exit checklist.
- Миграция, provider, public endpoint и deployment получают отдельного reviewer.
- Любое изменение shared contract сначала согласуется с downstream workstreams.
2. Принятые обратимые решения
- Продукт реализуется как модуль существующей DailyMark platform.
- MVP рассчитан на один ресторан или небольшую сеть; меню связывается с locations.
- Жизненный цикл:
draft → explicit publish → immutable version → rollback. - Первый импорт поддерживает PDF, PNG, JPEG и WebP.
- Основная локаль и reviewable переводы: RU, EN и Serbian Latin (
sr). - Объекты хранятся в private S3-compatible storage; public gateway читает только опубликованные prefixes.
*.dailymark.meобслуживается wildcard DNS/certificate flow; кастомные домены активируются только после ownership и routing verification.- AI/media provider выбирается конфигурацией и может быть отключён без нарушения доступности опубликованного меню.
- Raw analytics хранится 90 дней, агрегаты — 24 месяца.
3. Порядок и зависимости
| Этап | Результат | Зависит от | Можно параллельно |
|---|---|---|---|
| 0. Подготовка | Owners, approvals, budgets, providers, environments | Существующая платформа | — |
| 1. Core publishing | CRUD, preview, immutable publish/rollback, gateway | Этап 0 | — |
| 2. Domains + QR | Subdomain/custom domain, TLS, stable QR | Core manifest/gateway | Конец этапа 1 |
| 3. Document import | PDF/image → reviewed merge proposal | Draft API, storage | С этапом 4 |
| 4. AI content | Descriptions/translations/images → reviewed candidates | Draft/media/storage | С этапом 3 |
| 5. Video + 3D | Validated MP4/GLB with lazy fallback | AI job/budget/review lifecycle | После этапа 4 |
| 6. Analytics | Signed events, aggregates, dashboard/export/delete | Manifest/renderer hooks | После core contracts |
| 7. Launch + operations | Staging evidence, production approval, runbooks | Все выбранные этапы | Частично на каждом этапе |
MVP для первого tenant включает этапы 0–3 и базовую аналитику этапа 6. AI text/images, rich media и custom domains включаются feature flags после прохождения собственных acceptance gates.
Этап 0. Product, Security и Infrastructure Readiness
Результат: согласованы scope, владельцы, бюджеты, providers, environments и правила запуска.
Product checklist
- [ ] Назначены product owner, API owner, web owner, infrastructure owner, security/privacy reviewer и operations owner.
- [ ] Подтверждено, что меню является модулем DailyMark и использует существующий tenant boundary.
- [ ] Зафиксированы primary currency, RU/EN/SR, locations и ответственность ресторана за факты меню.
- [ ] Подтверждён первый tenant и репрезентативное меню для staging acceptance.
- [ ] Согласованы MVP и отложенные возможности.
- [ ] Согласована политика ручной модерации OCR/AI/media candidates.
- [ ] Утверждены лимиты upload, provider spend, storage и analytics retention.
Security and privacy checklist
- [ ] Security reviewer подтвердил FORCE RLS strategy для каждой tenant-таблицы.
- [ ] Утверждена exact-host authorization strategy для custom-domain TLS.
- [ ] Утверждены upload quarantine, MIME/magic-byte validation и malware scanner boundary.
- [ ] Утверждён перечень запрещённых AI-утверждений: выдуманные ingredients, allergens, dietary и health claims.
- [ ] Утверждена analytics event schema без PII, cookies и fingerprinting.
- [ ] Утверждены retention и tenant deletion/export workflows.
Infrastructure checklist
- [ ] Выбран S3-compatible provider и созданы отдельные dev/staging/prod buckets.
- [ ] Buckets private by default; public ACL отключён.
- [ ] Созданы отдельные read/write credentials для publisher и read-only credentials для gateway.
- [ ] DNS owner подтвердил wildcard record и автоматизированный DNS challenge.
- [ ] Определены staging hostnames для wildcard, custom domain и analytics collector.
- [ ] Выбраны OCR, image, video и 3D providers либо явно отключены для первой итерации.
- [ ] Provider DPA, billing, retention, content rights и data region одобрены.
- [ ] Approval references приложены до dependency/migration/CI/deployment действий.
Exit checklist
- [ ] Decision log содержит owners, scope, budgets, providers и feature flags.
- [ ] Environment contract перечисляет все config keys без secret values.
- [ ] Storage, DNS и provider runbooks имеют ответственных reviewer.
- [ ] Ни один следующий этап не заблокирован отсутствующим продуктовым решением.
Этап 1. Core Menu и Static Publishing
Результат: tenant создаёт и редактирует меню, публикует неизменяемый HTML bundle, открывает его на стабильном host и выполняет rollback.
Data and API checklist
- [ ] Созданы
Menu,MenuSection,MenuItem,MenuItemTranslation,MenuAsset,MenuDomain,MenuPublicationи audit relations. - [ ] Миграция
1723300000000-RestaurantMenus.tsпроходит up/down/up на test database. - [ ] Все tenant-таблицы зарегистрированы в TypeORM CLI/runtime и защищены FORCE RLS.
- [ ] Cross-tenant tests доказывают запрет чтения, изменения и publication.
- [ ] Owner/Admin могут publish/rollback; Member может редактировать draft, но получает server-side denial на publish.
- [ ] CRUD использует revision/optimistic concurrency и возвращает стабильные problem codes.
- [ ] Validation запрещает пустые primary names, отрицательные цены, неподдерживаемую currency/locale и dangling assets.
Renderer checklist
- [ ] Shared
MenuSnapshotV1,RenderedFile,PublicationManifestV1иHostManifestV1определены один раз. - [ ] Renderer является pure function и не обращается к repository/network/time/random.
- [ ] Один snapshot и renderer version дают идентичные bytes и SHA-256.
- [ ] HTML semantic, mobile-first, keyboard accessible и работает без JavaScript.
- [ ] Locale navigation, price formatting, allergens и image dimensions корректны для RU/EN/SR.
- [ ] CSP запрещает inline/eval и непредусмотренные origins.
- [ ] Golden fixtures и gzip budgets проходят.
Publication checklist
- [ ] BullMQ job idempotent по publication ID и выдерживает duplicate delivery.
- [ ] Bundle загружается в versioned prefix и проверяется через
head/get/checksum. - [ ] Active host manifest заменяется только после полной валидации bundle.
- [ ] Upload/build/checksum failure сохраняет предыдущую active publication.
- [ ] Rollback атомарно указывает на проверенную предыдущую immutable version.
- [ ] Orphan cleanup никогда не удаляет active или rollback-protected prefixes.
- [ ] Queue age, build latency, failure code и active version наблюдаемы.
Gateway checklist
- [ ]
apps/menuиспользует read-only storage credentials и не подключается к mutable menu database. - [ ] Host нормализуется и ищется только через точный
hostManifestKey. - [ ] Поддерживаются только GET/HEAD; traversal, encoded slash, IP literal и unknown host отклоняются.
- [ ] HTML получает корректный cache policy; immutable assets — long cache.
- [ ] Management API outage не делает опубликованное меню недоступным.
- [ ] Gateway health и p95 latency имеют alerts.
UI checklist
- [ ] Существуют menu list, editor, preview и publications panel.
- [ ] UI покрывает empty/loading/error/conflict/building/published/failed/read-only states.
- [ ] Вся копия существует в RU/EN/SR.
- [ ] Autosave показывает сохранённую revision и конфликт обновления.
- [ ] Publish readiness объясняет blocking errors до отправки.
- [ ] Rollback требует confirmation и показывает целевую version.
- [ ] Storybook accessibility и responsive checks проходят.
Exit checklist
- [ ] Staging menu проходит version
1 → 2 → rollback 1на одном stable host. - [ ] Bundle checksum, size и accessibility evidence приложены.
- [ ] RLS/RBAC и management-API outage drills проходят.
- [ ] Детальный core plan полностью закрыт.
Этап 2. Domains, TLS и QR
Результат: active menu доступно на зарезервированном *.dailymark.me и подтверждённом custom domain; стабильный QR переживает публикации и rollback.
Domain lifecycle checklist
- [ ] Hostname normalization одинакова в API, DNS verifier, Caddy authorization и gateway.
- [ ] Subdomain ограничен допустимыми labels и reserved-name list.
- [ ] Custom domain проходит IDNA normalization; IP literals и confusable/invalid forms отклоняются.
- [ ] Глобальная uniqueness error не раскрывает владельца домена.
- [ ] Ownership verification использует уникальный DNS token.
- [ ] Routing verification отдельно подтверждает правильное направление на DailyMark.
- [ ] Domain становится
activeтолько после ownership + routing + active publication. - [ ] Pending/disabled/unknown host не получает TLS authorization.
TLS checklist
- [ ] Wildcard certificate flow использует утверждённый automated DNS challenge.
- [ ] Custom domains используют On-Demand TLS только через internal exact-host
askendpoint. - [ ]
askтребует service token, сравнивает его constant-time и не логирует. - [ ] Internal RLS identity видит только exact active hostname.
- [ ] Rate limits ограничивают issuance attempts.
- [ ] Staging test доказывает denial неизвестного host без certificate issuance.
- [ ] Certificate expiry/renewal и authorization failures наблюдаемы.
QR checklist
- [ ] QR хранит stable HTTPS URL и opaque campaign slug, но не tenant/publication/database IDs.
- [ ] Campaign имеет tenant, menu, optional location, label и status.
- [ ] QR генерируется в SVG и print-ready PNG с quiet zone и error correction.
- [ ] Повторная генерация одной campaign детерминирована.
- [ ] Publish/rollback не изменяет QR URL.
- [ ] QR проверен камерой iOS и Android в целевом печатном размере.
- [ ] Reprint policy запрещает повторное использование disabled/reassigned domain.
UI and operations checklist
- [ ] Owner/Admin могут создать, проверить, активировать и отключить domain.
- [ ] Member не может менять domain/QR state.
- [ ] UI показывает точные DNS records и verification errors.
- [ ] Domain/QR screens переведены на RU/EN/SR.
- [ ] Runbook описывает DNS, certificate diagnosis, safe disable, token rotation и QR reprint.
Exit checklist
- [ ] Wildcard subdomain и custom domain показывают одну active publication.
- [ ] Unknown host, pending host и disabled host отклоняются.
- [ ] Stable QR проходит две публикации и rollback.
- [ ] Детальный domains/QR plan полностью закрыт.
Этап 3. Import и распознавание меню
Результат: PDF или изображение преобразуется в proposal с confidence/provenance и попадает в draft только после выборочного подтверждения.
Upload checklist
- [ ] Принимаются только PDF, PNG, JPEG и WebP после проверки magic bytes.
- [ ] Лимиты: 25 MiB, 40 PDF pages, 30 megapixels/image и 120 source files/tenant/day.
- [ ] Encrypted/malformed PDF, decompression bomb и MIME mismatch отклоняются.
- [ ] Object size и SHA-256 перепроверяются после presigned upload.
- [ ] Malware scanner fail closed; dirty object перемещается в quarantine.
- [ ] Cross-tenant access и quota race tests проходят.
OCR and structuring checklist
- [ ]
OcrProviderимеет deterministic fake и production adapter. - [ ] OCR сохраняет page order, text bounds, provider/model/request ID и usage.
- [ ] Retry возобновляет готовые pages и не дублирует работу.
- [ ] Proposal содержит confidence
0..1и page provenance для каждого поля. - [ ] Цена хранится в integer minor units; неоднозначные price/currency дают warning.
- [ ] Отсутствующие ingredients/allergens/dietary claims не выдумываются.
- [ ] Полный proposal валидируется до перехода в
needs_review.
Review checklist
- [ ] Reviewer видит source page рядом с предложенным полем.
- [ ] Low-confidence поля визуально выделены и не выбраны по умолчанию.
- [ ] Можно принять отдельные JSON-pointer fields и внести override.
- [ ] Accept требует current draft revision.
- [ ] Merge tenant-scoped, transactional, idempotent и audited.
- [ ] OCR никогда не меняет live publication напрямую.
- [ ] Original objects удаляются через 30 дней после terminal state, normalized OCR — через 90 дней.
Exit checklist
- [ ] Golden corpus RU/EN/SR, decimal comma, rotated text и ambiguous prices проходит.
- [ ] Worker restart, provider timeout, duplicate queue и poisoned output tests проходят.
- [ ] Review UI keyboard-accessible и переведён.
- [ ] Детальный import plan полностью закрыт.
Этап 4. AI descriptions, translations и images
Результат: owner/admin получает безопасные review candidates с lineage и cost, редактирует и подтверждает их в draft.
Budget and job checklist
- [ ] Tenant generation budget по умолчанию равен zero.
- [ ] Budget хранится и резервируется в integer euro cents атомарно.
- [ ] Estimated cost резервируется до enqueue; actual cost reconciled один раз.
- [ ] Retry/callback не списывает бюджет повторно.
- [ ] Daily tenant quota и monthly budget race tests проходят.
- [ ] Provider/model/policy versions и request IDs сохраняются.
Text checklist
- [ ] LiteLLM adapter требует strict structured output и bounded timeout.
- [ ] Menu facts передаются как untrusted quoted data.
- [ ] Description policy запрещает новые ingredients, allergens, dietary и health claims.
- [ ] Length, control characters, URLs и hostile item names валидируются.
- [ ] Translation сохраняет brands, units, currencies и явные allergen statements.
- [ ] Locale
srвыдаёт Serbian Latin. - [ ] Existing non-empty translation не перезаписывается без current draft revision.
Image checklist
- [ ] Async provider callback подписан HMAC и защищён timestamp/replay checks.
- [ ] Candidate принимает только JPEG/PNG/WebP размером 768–4096 px и не более 12 MiB.
- [ ] Image повторно кодируется, metadata удаляется, malware/policy result проверяется.
- [ ] Candidate object immutable и становится menu asset только после approval.
- [ ] Duplicate/out-of-order callbacks сходятся к одному terminal state.
- [ ] Rejected image удаляется через 7 дней.
Review and UI checklist
- [ ] Candidate показывает authoritative source facts, warnings, provider и cost.
- [ ] Text можно отредактировать перед approval.
- [ ] Approval/rejection доступны Owner/Admin и запрещены Member.
- [ ] Approval revision-checked, transactional, idempotent и audited.
- [ ] Approval меняет только draft и не запускает publish.
- [ ] AI Studio покрывает zero/exhausted budget, running, failed и review states.
- [ ] UI и disclosure переведены на RU/EN/SR.
Exit checklist
- [ ] Prompt-injection и invented-fact corpus проходит.
- [ ] Concurrent budget, duplicate callback и tenant isolation tests проходят.
- [ ] Cost ledger сходится с provider usage.
- [ ] Детальный AI plan полностью закрыт.
Этап 5. Video и 3D/GLB
Результат: для menu item можно сгенерировать и подтвердить оптимизированный MP4 или GLB с poster; public menu загружает media только по требованию.
Provider and job checklist
- [ ] Video и model3d providers реализуют общий submit/poll/callback contract.
- [ ] Callback HMAC, timestamp, duplicate, out-of-order и cancellation tests проходят.
- [ ] Provider downloads разрешены только по HTTPS с allowlisted hosts.
- [ ] Download ограничен 50 MiB до validation.
- [ ] Job использует tenant idempotency key и generation budget lifecycle.
- [ ] Provider disable switch не ломает опубликованные menus.
Video checklist
- [ ] Output: MP4, H.264, AAC или no audio,
faststart, максимум 20 sec/1080p/15 MiB. - [ ] ffprobe проверяет container, codecs, duration, dimensions и corruption до обработки.
- [ ] FFmpeg запускается без shell interpolation с CPU/memory/output/time bounds.
- [ ] Metadata удаляется, output повторно проверяется.
- [ ] JPEG/WebP poster обязателен и проходит image validation.
3D checklist
- [ ] Output: self-contained GLB 2.0 максимум 12 MiB.
- [ ] Limits: 150,000 triangles, 8 materials, 16 textures и 2048 px/texture edge.
- [ ] External/data URIs, scripts, cameras, lights и unsupported extensions отклоняются.
- [ ] Scene graph, buffers, accessors, transforms и animation duration валидируются.
- [ ] Unused data удаляется, resources deduplicated, textures bounded, GLB повторно валидируется.
- [ ] Poster обязателен и создаётся в network-isolated renderer либо принимается от provider после проверки.
Public renderer and UI checklist
- [ ] Snapshot содержит optional media kind/url/posterUrl/bytes/alt.
- [ ] Menu без rich media не получает media JavaScript.
- [ ] Video не autoplay и использует native controls.
- [ ] Model viewer загружается только после intersection + user activation.
- [ ] Poster имеет explicit dimensions; unsupported WebGL получает обычный fallback link.
- [ ] Menu text/price/allergens остаются доступны при blocked/corrupt media.
- [ ] Reduced motion, keyboard и localized labels проходят accessibility checks.
- [ ] Rich-media studio показывает cost, validation metrics и требует alt text.
Exit checklist
- [ ] Malicious/corrupt/oversized video и GLB corpus отклоняется.
- [ ] До interaction не загружается ни одного video/GLB byte.
- [ ] Representative mobile LCP regression не превышает 100 ms.
- [ ] Детальный rich-media plan полностью закрыт.
Этап 6. Tenant Analytics
Результат: tenant видит views/interactions по menu/item/locale/campaign/device bucket без PII и cross-tenant leakage.
Token and collector checklist
- [x] Publication token versioned, HMAC-SHA-256 signed, host-bound и действует 30 дней.
- [x] Active и previous signing keys поддерживают безопасную rotation.
- [x] Collector принимает body до 4 KiB и одно schema-valid event/request.
- [x] Допустимые events:
menu_view,item_view,item_media_open,locale_change. - [x] Item использует opaque public ID, а не database ID.
- [x] Campaign — allowlisted slug до 64 characters.
- [x] Signature, host, active publication и item ID валидируются до tenant context.
- [x] Event ID дедуплицируется; duplicate возвращает успешный
202. - [x] IP используется только как rotating Redis rate-limit digest до 15 minutes и не сохраняется.
- [x] Cookies, localStorage, sessionStorage, raw user-agent и fingerprint IDs отсутствуют.
Static instrumentation checklist
- [x] Menu view отправляется один раз на page load.
- [x] Item view возникает после 50% visibility в течение 1 second.
- [x] Media open и locale change отправляются после явного interaction.
- [x]
sendBeaconимеет boundedfetch keepalivefallback. - [x]
Do Not TrackиGlobal Privacy Controlотключают отправку. - [x] Collector failure не блокирует rendering/navigation.
- [x] Analytics script не больше 4 KiB gzip и не создаёт blocking request до first paint.
Storage and aggregation checklist
- [x] Raw events partitioned monthly по
received_at. - [x] FORCE RLS защищает raw, aggregate, retention и export paths.
- [x] Server assigns authoritative UTC timestamp.
- [x] Previous three tenant-local days пересчитываются idempotently под advisory lock.
- [x] DST, late event и overlapping worker tests проходят.
- [x] Raw partitions удаляются после 90 days; aggregates — после 24 months.
- [x] Retention run записывает examined/deleted/error counts.
- [x] Tenant deletion сходится при retry и очищает все live partitions и aggregates.
Dashboard and export checklist
- [x] APIs предоставляют summary, timeseries, items и aggregate CSV export.
- [x] Interactive date range ограничен 366 days.
- [x] Filters: menu, locale, campaign, date; timezone показан явно.
- [x] Metrics называются views/interactions, а не unique people.
- [x] Charts имеют semantic table alternative.
- [x] CSV нейтрализует formula-injection prefixes и ограничен 100,000 rows.
- [x] Cross-tenant query/export/delete tests проходят.
- [x] Dashboard покрывает empty/loading/error states и RU/EN/SR.
Exit checklist
- [x] Privacy field audit не находит PII, cookie или persistent visitor ID.
- [x] Collector staging load: p95 <150 ms и error rate <1% на утверждённой capacity.
- [ ] Retention, export, deletion, key rotation и outage drills проходят.
- [ ] Детальный analytics plan полностью закрыт.
Отмеченные пункты подтверждены focused tests и/или staging evidence. Непомеченные пункты требуют отдельного operational drill, внешнего owner approval или production evidence и намеренно не закрываются документацией.
Этап 7. Tenant Launch, Production Release и Operations
Tenant launch checklist
- [ ] Owner/Admin/Member assignments подтверждены; Member publication denial проверен.
- [ ] Currency, locales, locations, branding и factual responsibility подтверждены.
- [ ] Prices, ingredients, allergens, translations и media candidates вручную просмотрены.
- [ ] Mobile preview проверен на RU/EN/SR, accessibility и media fallback.
- [ ] Initial publication и rollback point проверены.
- [ ] Subdomain/custom domain и QR открывают одну active publication.
- [ ] Analytics events появляются только в dashboard запускаемого tenant.
- [ ] AI/media budgets и alerts включены либо features явно disabled.
Release checklist
- [ ] Unit, integration, e2e, RLS, provider contract, accessibility и performance suites зелёные.
- [ ]
git diff --check, typecheck, lint и format check проходят. - [ ] В release diff нет placeholder markers и отключённых security checks.
- [ ] Каждая migration проверена up/down/up и имеет backup/restore impact review.
- [ ] Staging проверяет publish, rollback, DNS/TLS, QR, providers и analytics.
- [ ] Object lifecycle защищает active и rollback publications.
- [ ] Monitoring dashboards и alerts активны до production traffic.
- [ ] Production migration/deployment имеет явное human approval.
Weekly operations checklist
- [ ] Проверить public availability и gateway p95 latency.
- [ ] Проверить queue age, failed/dead-letter jobs и webhook rejection.
- [ ] Проверить tenant/provider generation spend против budgets.
- [ ] Проверить storage growth, orphan cleanup и lifecycle failures.
- [ ] Проверить custom-domain verification, TLS failures и renewal risk.
- [x] Проверить analytics reject/drop/bot rates и retention runs.
- [ ] Проверить sample bundle: CSP, accessibility, cache headers и fallback integrity.
Incident checklist
- [ ] Классифицировать impact: management, publication, public delivery, TLS/domain, provider, media или analytics.
- [ ] Сохранить active publication и остановить новые jobs/publish при риске повреждения.
- [ ] Отключить affected provider/collector feature flag, сохранив static delivery.
- [ ] Использовать correlation/publication IDs без просмотра unrelated tenant content.
- [ ] Выполнить manifest/application rollback по runbook.
- [ ] После восстановления проверить tenant isolation и data integrity.
- [ ] Зафиксировать timeline, affected tenants, cost/data exposure, remediation и regression test.
Exit checklist
- [ ] Backup/restore, publication rollback и provider-disable drills прошли в staging.
- [ ] Operations, support, tenant docs и incident runbooks опубликованы.
- [ ] Alerts имеют owners и проверенный delivery channel.
- [ ] Production approval и release evidence приложены к release issue.
Analytics operations evidence is complete for staging: collector reject/drop/bot behavior, retention, deletion retry, outage recovery, dashboard confirmation and Sentry notification delivery are recorded in
docs-internal/menu-plan-status.md. Real signing-key replacement and production evidence remain intentionally open.
4. Management Checklists
Backlog readiness
- [ ] Ticket указывает этап и конкретную task детального плана.
- [ ] Указаны role, tenant boundary, happy path, failure path и acceptance evidence.
- [ ] UI ticket содержит RU/EN/SR и empty/loading/error/review states.
- [ ] AI ticket указывает authoritative facts, prohibited invention, reviewer, cost и retention.
- [ ] Public delivery ticket указывает cache/fallback/performance budgets.
- [ ] Analytics ticket указывает schema version, server dimensions, retention и tenant query.
- [ ] Infrastructure ticket указывает environment, rollback, observability и approval owner.
Sprint planning
- [ ] Consumed interfaces уже merged либо входят в тот же reviewed batch.
- [ ] Migration объединена с entity registration, RLS, revert и e2e test.
- [ ] Job содержит idempotency key, timeout, retry classes, terminal states и cost accounting.
- [ ] Provider adapter содержит deterministic fake и signed callback fixtures.
- [ ] В capacity включены accessibility, performance, security, docs и runbooks.
- [ ] Production provider work не начинается до commercial/privacy approval.
Pull request review
- [ ] Diff ограничен одной independently reviewable task.
- [ ] Red-green TDD evidence приложен.
- [ ] Cross-tenant negative tests существуют для каждой tenant resource.
- [ ] Public endpoint не принимает authoritative tenant identity от клиента.
- [ ] Logs/errors не содержат documents, prompts, raw output, credentials или visitor IP.
- [ ] Queue/webhook/event duplicate delivery безопасен.
- [ ] Publication failure сохраняет active manifest.
- [ ] UI имеет keyboard, focus, reduced-motion и fallback states.
- [ ] Copy добавлена во все три locale catalogs.
- [ ] External dependency сопровождается approval и operational docs.
Provider onboarding
- [ ] Legal entity, billing, DPA, content rights, region и retention одобрены.
- [ ] Staging/prod credentials разделены и передаются только через secrets.
- [ ] Signature, timestamp tolerance, retry, replay и rate limits задокументированы.
- [ ] Provider/model IDs являются config, а не hard-coded business logic.
- [ ] Cost units сопоставлены tenant ledger и quotas.
- [ ] Outage и malformed-output drills проходят.
- [ ] Provider отключается без нарушения существующих publications.
5. Definition of Done
Workstream считается завершённым только когда:
- [ ] Закрыты все tasks и checkboxes его детального плана.
- [ ] File/interface ledger совпадает с реализацией.
- [ ] Migration и FORCE RLS evidence приложены для каждой tenant-таблицы.
- [ ] Cross-tenant, role и public-identity negative tests проходят.
- [ ] Empty/loading/error/retry/fallback states реализованы и переведены.
- [ ] Metrics, alerts, retention и runbook покрывают новые jobs/endpoints/providers.
- [ ] Staging acceptance scenario выполнен с сохранёнными evidence.
- [ ] Reviewer сверил работу с design specification, а не только с тестами.
- [ ] Документация описывает tenant и operator workflows.
- [ ] Safe rollback или feature disable проверен.
6. Objective-to-Evidence Matrix
| Требование | Этап | Обязательное evidence |
|---|---|---|
| Управление и генерация static HTML menu | 1 | CRUD/RBAC, deterministic renderer, manifest, publish/rollback и outage tests |
QR на *.dailymark.me | 2 | Wildcard staging URL, QR scan, stable URL и TLS runbook |
| Custom domain | 2 | Ownership/routing, exact-host authorization и staging certificate |
| Распознавание загруженного документа | 3 | Golden PDF/image corpus и reviewed merge transaction |
| AI-картинки и описания | 4 | Provider contracts, policy corpus, approval audit и cost ledger |
| Видео или 3D для menu item | 5 | Validated MP4/GLB, poster, lazy-load и fallback tests |
| Analytics каждого tenant | 6 | Signed events, RLS, aggregation, dashboard, export, retention и deletion tests |
| Управленческие чек-листы | 0–7 | Readiness, stage exit, PR, release, operations и incident checklists этого файла |
7. Program Completion Gate
- [ ] Все выбранные этапы закрыли собственные exit checklists.
- [ ] Все обязательные evidence links приложены к program issue.
- [ ] Shared contracts и migrations согласованы между workstreams.
- [ ] Нет placeholder markers, undefined interfaces или конфликтующих locale/type names.
- [ ] Security/privacy и operations reviews завершены.
- [ ] Staging tenant проходит end-to-end путь: import → review → enrich → publish → QR/domain → analytics → rollback.
- [ ] Production запуск получил явное human approval.