Skip to content

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-задачи, точные пути, интерфейсы и команды находятся в приложениях:

  1. Core publishing
  2. Domains and QR
  3. Document import
  4. AI content
  5. Rich media
  6. Tenant analytics

Исходные продуктовые и архитектурные решения описаны в 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 publishingCRUD, preview, immutable publish/rollback, gatewayЭтап 0
2. Domains + QRSubdomain/custom domain, TLS, stable QRCore manifest/gatewayКонец этапа 1
3. Document importPDF/image → reviewed merge proposalDraft API, storageС этапом 4
4. AI contentDescriptions/translations/images → reviewed candidatesDraft/media/storageС этапом 3
5. Video + 3DValidated MP4/GLB with lazy fallbackAI job/budget/review lifecycleПосле этапа 4
6. AnalyticsSigned events, aggregates, dashboard/export/deleteManifest/renderer hooksПосле core contracts
7. Launch + operationsStaging 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 ask endpoint.
  • [ ] 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 имеет bounded fetch keepalive fallback.
  • [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 menu1CRUD/RBAC, deterministic renderer, manifest, publish/rollback и outage tests
QR на *.dailymark.me2Wildcard staging URL, QR scan, stable URL и TLS runbook
Custom domain2Ownership/routing, exact-host authorization и staging certificate
Распознавание загруженного документа3Golden PDF/image corpus и reviewed merge transaction
AI-картинки и описания4Provider contracts, policy corpus, approval audit и cost ledger
Видео или 3D для menu item5Validated MP4/GLB, poster, lazy-load и fallback tests
Analytics каждого tenant6Signed events, RLS, aggregation, dashboard, export, retention и deletion tests
Управленческие чек-листы0–7Readiness, 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.