Skip to main content
Exemplar page — first pass. This is a proposal for review, not established policy — see CRUD overview. This page reuses Create’s surface tree rather than walking it again — see Choosing a surface, revisited — and covers only what’s genuinely different once an object already has data in it.

The problem

Create decides where an object is born. Once it exists, editing it raises questions Create never had to answer: the surface opens with values already in it, not a blank form: some edits are small enough to commit the instant they’re made, and others need everything held until an explicit Save; the surface has to know whether anything has changed at all; and the object might not be exactly as it was when the surface opened, if someone or something else touched it in the meantime. None of that is a new surface decision. It’s what happens once the surface Create’s tree already chose is holding an object that isn’t new anymore.

Choosing a surface, revisited

TITAN-CRUD-02 states the default: the same object type uses the same surface for Create and Update, unless a stated reason differs. Create already names the one legitimate case where it does — this page resolves it rather than inventing a second answer. A quick-create Modal is optimized for speed of creating something, not for that object’s whole life. Once the object exists, it has already earned whatever permanence its type implies — and its ongoing edit surface is the surface that permanence calls for, even if the object was born in a lighter one.
The exception is about the object type, not the individual object. A Tag is created in a two-second Modal and is still edited through that same lightweight surface for as long as it exists — a Tag never earns more permanence than that, so there’s nothing to graduate to. A saved filter is also quick-created in a Modal, but if it later becomes something people treat as a shared, first-class asset, its edit surface moves to the fuller one — Drawer or full page — at that point, not before. A Campaign or an integration never faces this question at all: both are already full-page objects from the moment they’re created, so Create and Update land on the same surface with no exception needed.

When this applies

  • The object already exists and its data is being changed, not authored for the first time.
  • The object was reached from Create’s “duplicated from an existing one” case — the surface is Create’s tree; the values arriving pre-filled from a template is this page’s concern.

When it doesn’t

Structure

Behavior

Constraints

Content

Accessibility

  • Opening the edit surface moves focus to its first field once values have loaded, matching Create’s own behavior for a Modal or Drawer. Moving focus before values arrive would land the reader in a field about to change under them.
  • A failed save’s inline error is announced per Inline editing’s rule for a single field, or Form validation’s rule for a whole-surface save.
  • The concurrent-edit re-confirmation states the specific change in its accessible description, not through color alone — the same requirement Destructive confirmation already states for its own body text.

Variations

Anti-patterns

Editing a Tag on a full page because “editing deserves more room than creating.” The Tag’s permanence hasn’t changed just because it now exists — see TITAN-UPDATE-02. Reopening the whole edit surface for a one-field change that Inline editing already covers. Adds a navigation and a full form for a change that takes one field and one second. Committing a multi-field edit field-by-field as each one changes, with no single Save. Leaves the object in a partially-applied combination of values nobody chose as a set. Silently discarding a save because the object changed on the server, with no way to see what changed. The reader loses their edit with no explanation — the same failure TITAN-DESTROY-09 already names for a dialog that closes on failure. CRUD overview, for the shared axes and TITAN-CRUD-02, which this page resolves. Create, whose surface this page reuses and whose Variations table first raised the pointer this page answers. Read, the sibling CRUD operation. Inline editing, for a single field’s whole behavior. Loading & skeletons, for the prefill-loading treatment. Destructive confirmation and Form validation, cited above rather than restated.
Last modified on September 7, 2026