A lock lease lasts 15 minutes by default and can be set up to one hour.
Chapter 1
The content model: everything is a governed object
Content truth lives in a per-tenant object store, not in files. This chapter covers what an object is, how it is changed, and where the line between publishing and releasing sits.
What a governed object is
A governed object is a record with a stable id, a type (page, article, theme, navigation and others), a body, and a history. Every change adds a history entry, and entries are never pruned.
Two counters track change. version moves on every write, including locks and publishes. content_revision moves only when the content itself changes. Approvals pin a content revision, so approving a page approves exactly what was read.
Pages are built from named sections. Sections carry stable ids, which is what lets tracking and experiments follow a piece of content across edits.
Object verbs
The only way to change content
- 1
Check out
Take a lock on one object. You receive a lock token and the current record version.
- 2
Patch
Send typed operations with the token and the version you last read. A stale version or a missing lock is refused.
- 3
Validate
A dry run applies the same checks as a real write and persists nothing. Use it before patching.
- 4
Publish
Export the object to git. This keeps your lock on purpose, so concurrent changes are caught.
- 5
Check in
Release the lock. If you skip this, the object stays locked to everyone else until the lease ends.
Locks and conflicts
What the system refuses, and why
Error 423 means you hold no valid lock: check out again.
Error 409 means your record version is stale: read again, then retry.
An invalid resulting body fails with 422 and nothing is written.
A retry after a timeout reuses the same idempotency key and returns the original result, not a duplicate.
Public and private
Private fields never reach readers
Objects can carry private fields, such as strategy notes and intent. They stay in the store.
They are stripped when the reader copy is built, the renderer emits only public fields of public content, and the validator checks the reader copy as well. Credentials and review notes are kept out of reader-visible text for the same reason.

Publish is not release
Publish commits a JSON export to git with a marker that skips the build. It is dark: nothing on the live site changes.
Release is a separate action that starts one production build, which ships every export accumulated since the last release. A deploy status check then confirms what production serves.
So a successful publish proves the export exists. It does not prove a reader can see the change.
Status
What is established
- Verified live
- Object verbs, locks and revisions
- Verified live
- Dark publish, then separate release
- Verified live
- Private fields stay in the store
Used to write this page
Two distinct steps
Checked at build and validation
Questions
- Can an agent edit content by changing files?
No. Exports in git are generated output. Governed changes go through object verbs.
- Why two counters?
Locking and publishing should not look like content changes. Only content_revision tells you the words or layout moved.