Site: Synthesia staging (synthesia-staging-eaffee4c3a254eec5b5e4)
Workspace ID: 6387b01c79342a04d2fec9fe
Domain: www.synthesia.io
Reported behavior: "Publish now" spins, eventually shows success toast, but CMS doesn't update on live page and items remain in "Changes in draft."
CMS Collection Field Groups — Backend Spec (slim)
Epic: CMSAUTH-5112 | Full spec: Tech Spec — CMS Collection Field Groups (V2) | Public API RFC: RFC v2
This is a backend-focused subset of the full tech spec. It covers the data model, persistence, HTTP API, validation, and gating. Frontend (Flux stores, action creators, UI) and public API V2 details live in the full spec.
Codebase: /Users/aaronschachter/Code/wrkspcs. Before writing anything, read:
src/collections/Todos.ts— most recently added collection, closest pattern to followsrc/collections/Workspaces.ts— workspace capability flagssrc/lib/workspaceSettings.ts+src/lib/workspaceSettingsAccess.ts— settings patternsrc/app/api/mcp/lib/handlers/todos.ts— most recently added MCP handler, closest pattern to followsrc/app/api/mcp/lib/toolDefinitions.ts— tool definition patternsrc/app/(frontend)/projects/[projectId]/ProjectShell.tsx— tab/shell patternsrc/app/(frontend)/projects/[projectId]/todos/— most recently added frontend route, closest pattern to follow
Codebase: /Users/aaronschachter/Code/wrkspcs. Before writing anything, read:
src/collections/Notes.ts,src/collections/Docs.ts— collection patternssrc/collections/Todos.ts— most recently added collection, closest pattern to followsrc/collections/Workspaces.ts— workspace capability flagssrc/lib/workspaceSettings.ts+src/lib/workspaceSettingsAccess.ts— settings patternsrc/app/api/mcp/lib/handlers/todos.ts— most recently added MCP handler, closest pattern to followsrc/app/api/mcp/lib/toolDefinitions.ts— tool definition patternsrc/app/(frontend)/projects/[projectId]/ProjectShell.tsx— tab/shell pattern
Codebase: /Users/aaronschachter/Code/wrkspcs. Before writing anything, read:
src/collections/Notes.ts,src/collections/Docs.ts— collection patternssrc/collections/Workspaces.ts— workspace capability flagssrc/app/api/mcp/lib/handlers/notes.ts— MCP handler patternsrc/app/api/mcp/lib/toolDefinitions.ts— tool definition patternsrc/app/(frontend)/projects/[projectId]/ProjectShell.tsx— tab/shell pattern
wrkspcs: DailyPlans + AgendaItems + Todos implementation prompt
Codebase: /Users/aaronschachter/Code/wrkspcs. Before writing anything, read:
src/collections/Notes.ts,src/collections/Docs.ts— collection patternssrc/collections/Workspaces.ts— workspace capability flagssrc/lib/workspaceSettings.ts+src/lib/workspaceSettingsAccess.ts— settings patternsrc/app/api/mcp/lib/handlers/notes.ts— MCP handler patternsrc/app/api/mcp/lib/toolDefinitions.ts— tool definition pattern
Single Page Publishing reuses existing publication records via Publication.findLatestForDatabase(), which is a simple "newest by timestamp" query with no filtering by publish type, domain, or strategy. Combined with the fact that multiple publications can be "live" simultaneously across different domains, this creates a class of bugs where SPP can cross-pollinate publication IDs between domains and cause CMS content inconsistencies.
- Each custom domain has its own
lastPublicationIdfield - Full site publishes only update
lastPublicationIdon domains included incustomDomainsTargets(the domains selected for that publish)
The "enterprise publishing workflow" is a multi-stage publishing system gated by the ALLOW_PUBLISHING_WORKFLOWS entitlement (Enterprise plans only). It introduces a staging-to-production promotion model that fundamentally changes how publishing works in the Designer.
| Aspect | Regular (Self-Serve) | Enterprise Publishing Workflow |
|---|
Goal: Extend CustomDomainService with foundational methods (getSubdomainAndDomains, getManifest), then use them in the Dynamo admin database detail page to show which publication each domain is rendering and warn when the manifest's publicationVersion drifts from the custom domain model's lastPublicationId.
CustomDomainServicelives atpackages/domains/custom-domains/server/src/custom-domain.service.ts. It currently hasfindBySiteId(delegates toFIND_CUSTOM_DOMAINS_BY_SITE_ID) andSITE_FILES_DOMAINinjected. It does NOT yet haveREAD_DOMAIN_MANIFESTinjected.- The manifest lives at
{domain}/manifest.jsonin the site-files S3 bucket. It's aRecord<string, unknown>with fields likepublicationVersion,redirectDomain,cosmic,redirects,localization, etc. We care aboutpublicationVersionfor now. - A DAL function to read a single domain's manifest already exists in the legacy layer