Context
Previously, content drafts were created automatically when a user initiated a “Create content” flow (e.g. clicking + Add New).
This led to:
- Accidental and abandoned drafts
- Polluted CMS content lists
- Inconsistent creation semantics between media and non-media content
- Inability to run meaningful validations before persistence
Media content types (video, image, audio) implicitly enforced intent via uploads, while other content types created placeholder drafts without user confirmation.
Decision
- Content drafts MUST NOT be created implicitly on navigation or CTA interaction.
- A content record will be created only after explicit user intent, expressed by submitting a minimal required payload (e.g. title).
Rules
- Clicking + Add New does not create any database records.
- All content types must pass through a Create Gate before draft creation.
- Draft creation requires:
- A non-empty title
- A valid content type
- Any other invariant validations required by the CMS
- Only after successful validation is a draft content record persisted.
- Media uploads and editors attach to an already-created draft and never create content implicitly.
Resulting Flow
- User clicks + Add New CTA present in the page header - each CTA is aware of the content creation it should trigger.
- System presents a minimal create form (e.g. title)
- User submits → validations run
- Draft is created explicitly
- User gets can choose to close the modal or open the draft in edit view.
Consequences
Positive
- Prevents accidental and polluted draft content
- Enables validation before persistence
- Unifies creation semantics across all content types
- Aligns with explicit intent → side-effect architectural principles
- Simplifies auditing, filtering, and content lifecycle reasoning
Trade-offs
- Adds one additional step to content creation
- Requires UI changes to introduce a create gate
Notes
- This decision intentionally separates navigation intent from data persistence.
- Creation of CMS content is treated as a deliberate, validated action.