References¶
- The Resolver Engine —
resolver-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, andschemaVersiongating.RETAIL_STUDIO_RESOLVER_ENGINE_BRIEF.mdis its single-file form. This brief never restates an engine mechanism; see The Resolver Engine Dependency. - The discussion record —
RETAIL_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, notvisibilityTier - DB-native only for Composer content; S3 for baseline stills
- Visual regression only where the responsible human isn't already watching