Skip to content

References

  • The Resolver Engineresolver-engine-mkdocs-site/ (same folder), the source of truth for every engine mechanism this brief consumes: the pipeline, the motion graph, layout.mode, pin, flowBox, pinPoint, background, price, cues, keyframes, and schemaVersion gating. RETAIL_STUDIO_RESOLVER_ENGINE_BRIEF.md is its single-file form. This brief never restates an engine mechanism; see The Resolver Engine Dependency.
  • The discussion recordRETAIL_STUDIO_TEMPLATE_COMPOSER_NOTES.md (same folder): the full history of how each position here was reached, reopened, and revised, including the build-velocity baseline (its §15), the Remotion Studio / Editor Starter evaluation (§12), and the Canva-style interactivity notes (§13) that this brief doesn't carry. Where this brief and the notes disagree, the notes are the fuller record of why; this brief is the current position.
  • Superseded source documents, now folded into the engine site and not to be read as current: RETAIL_STUDIO_LAYOUT_AND_ANIMATION_SHAPE.md (the layout/animation shape doc), .specifications/text-engine-22072026-specification.md (the Text Engine functional spec, NEO-1253).

Tickets cited

Not a live Linear lookup — just what each means in this brief.

Ticket Meaning here
NEO-1253 The Text Engine and layout/motion rework — retired; its consolidated scope is now the Resolver Engine, awaiting its own ticket
NEO-1657 Schema migration tooling — built in a worktree, not personally verified, not merged (Identity, Versions & Schema Versioning)
NEO-1668 "Entain Shell Template Briefing" — the review-rigour precedent (Testing, Preview & Incident Response)
NEO-1669 "AE Template Form Builder" — the opaque-config-key re-keying precedent a tracked rename's high confidence rests on (Fork, Rebase & Conflict Resolution)
NEO-1315 Sticker Builder — considered and rejected as the base for Element authoring (Editing UI & Canvas)

Key code references

For grounding, not exhaustive.

Path Why it matters
apps/web/src/pages/retail-studio/CampaignEditorShell.tsx Campaign-as-diff, undo, autosave; the one existing restructure capability (adding a sticker layer)
apps/web/src/hooks/retail-studio/useCampaignAutosave.ts, apps/web/src/lib/retail-studio/campaign-autosave-controller.ts The diff / PATCH / conflict model
apps/web/src/lib/retail-studio/layout-mode.ts, useMaxLayoutMode.ts, useEffectiveLayoutMode.ts The layoutMode tier system and its "affordance, not authorisation" caveat; the ceiling-versus-chosen pattern
packages/shared/src/capabilities.ts, apps/api-v1/src/lib/permissions.ts The org-scoped capability layer Composer's tiers build on
apps/api-v1/src/retail-studio/retail-studio.controller.ts (patchCampaign) The closest analog to Change application; whole-request gating
packages/retail-studio-schema/src/zod.ts (componentLayerSchema, assetRefSchema) What a component is; the brand-asset reference pattern the brand-style roles extend
packages/retail-studio-schema/src/validate.ts The one server-side layoutModeRank use — a document-shape rule, not a caller check
apps/web/src/components/RetailStudio/Scenes/CanvasSelectionOverlay.tsx The shared selection / manipulator core under both canvases
apps/web/src/components/TemplateBuilder/EditStep.tsx, ManifestBindingsEditor The primitive-placement and manifest-binding core the Element-authoring tool extracts
apps/web/src/components/RetailStudio/TemplateEditor/* The scene-level board / library
useRetailStudioStore (pushFieldBatchUndo) The compound-undo precedent
render-dlq.ts, the PostHog render_failed / qc_failed events The existing, silent render-failure signal

Matthew's technical preferences

  • One typed Change[] as the only mutation path, compacted, split by altitude
  • One mechanism reused at three altitudes; manifests generated the way a template's is today
  • Everything a frozen version; forks explicit; rebase never silent; Approve Migration always
  • { value, unit: "targetFraction" } reused rather than a second unit type, on space and on time
  • No authored pivot, no min/max clamp, no per-Element placement tier — nothing that duplicates a mechanism that already exists
  • Build on the existing capability layer; editTier, not visibilityTier
  • DB-native only for Composer content; S3 for baseline stills
  • Visual regression only where the responsible human isn't already watching