Publishing

How a draft becomes the version your readers see, who is allowed to publish, and what stays fixed afterwards.

<!-- Reviewed 2026-09-09 (the document page's archive confirm matches the Governance list's): the covered workspace's Archive confirm, when the document is a control's definition and that control carries an audit verdict, now asks "Archive an assessed control?" with an Archive anyway button — the same question the list asks — instead of printing the server's warning line. Nothing this page describes changed. --> <!-- Reviewed 2026-09-08 (no default team; team codes capped at three): the covered code lost one payload field (`isDefault` on `GET /api/teams?mine=true`, which no surface this page describes ever showed), renamed the team-less fallback helper, and had its comments corrected — the fallback itself is now the workspace's OLDEST team rather than its flagged one, which resolves to the same team on every workspace the app has made. New team codes are 2–3 characters; existing longer codes are untouched and keep numbering, because the numbers already issued cite them. Nothing this page states about behaviour changes. --> <!-- Reviewed 2026-09-07 (the PARAGRAPH rule — the panel follows the save): the covered document workspace refetches the Workflow panel and the activity feed when the editing session's quiet settle comes back, so the processes a save rebuilt from their paragraphs show without a reload. Nothing on this page changed. --> <!-- Reviewed 2026-09-09 (the record's ✦ door is retired — owner: "no need for that routing part of ai"): the covered DocumentWorkspace lost the button that opened the conversation about a document, so the one sentence on this page that named it now points at the sidebar's Chat entry and the composer's ⌖ picker. Publishing, versions, the review routes and the roles table are untouched. --> <!-- Reviewed 2026-09-04 (the Build button — docs/design/build-button/README.md): the covered src/components/governance/DocumentWorkspace.tsx changed; the "Being written" banner on a document being built from a marketplace template (Templates page); publishing is unchanged. --> <!-- Reviewed 2026-09-02 (Workflow panel redesign — one list, a process opens in place; docs/design/workflow-panel/README.md): the document workspace's only change is the Workflow panel's chrome gaining a muted Workflow icon before its title; the panel itself is described on Workflows in documents. Nothing this page describes moved. --> <!-- Reviewed 2026-09-02 (saving a document updates its processes and its agent): publishing is no longer what makes a document act or what the agent reads. Readers, runs and the assistant read the CURRENT text; publishing mints a numbered version for the record and stays the door a document-control workflow's approval step uses. The document's status row now reads Active / Archived (with the version beside it as a record) instead of "Draft — not yet in force". The note under the title says so. --> <!-- Reviewed 2026-08-30 (the header's save word speaks for the whole draft): the covered workspace gained one folded state — the top bar's save word now reads "Save failed" while the body's editing session has stopped recording, instead of resting at "Saved" beside the notice saying the opposite. Nothing this page describes moved: publishing, versions, the review routes and the roles table are untouched. The save word itself is documented where it lives, in Authoring -> The editor -> "How saving works". --> <!-- Reviewed 2026-08-30 (one state, active): the covered documentLifecycle changed only in comments — its publish-time trigger sync stays, now as the LEGACY body-chip hook rather than the gate that decides whether a workflow runs. Accepting a workflow is what makes it act (store.ts), so nothing this page describes about drafts, review or publishing moved; the workflow story is authoring/workflows.md, rewritten in the same change. --> <!-- Reviewed 2026-08-30 (the workflow leaves the document body): the covered workspace/lifecycle files changed only in workflow-storage wiring — chips retired from the editor surface and the document_workflows store took over behind the same seams. Nothing this page describes moved; the workflow story itself is authoring/workflows.md, rewritten in the same change. --> <!-- Reviewed 2026-08-29 (look before going back): the covered workspace's return-to-a-moment confirm now shows a comparison of the picked moment against the current document before the person decides. Publishing, approvals and every act this page documents are untouched; the act is described on [Versions and history](/docs/review/versions). --> <!-- Reviewed 2026-08-27 (the Download row defers a frame): the covered DocumentWorkspace opens the Download dialog one animation frame after the ⋯ menu closes — the same #692 deferral its Version-history and Archive rows already used. Un-deferred, the closing menu could wedge under the dialog and swallow its Escape (measured on dev 2026-08-25→27). Purely a timing fix: everything this page documents behaves exactly as written. --> <!-- Reviewed 2026-08-27 (the docked assistant is on the right, on EVERY record — owner decision): the covered workspace now hands the shell the rail fact instead of a side, and the panel takes the right edge on a control too. this page's one mention of the dock ("docks the assistant beside the draft") names no edge, and publishing, versions and approval are not touched by the change at all. --> <!-- Reviewed 2026-08-29 (the Workflow panel's "Add the first step" retires): the covered workspace stops hand-placing a first trigger chip from the panel's empty state and passes the panel a plain writability signal — the Builder is the one composition door. Nothing THIS page documents changed; the workflow surface is documented under Authoring → Workflows in documents. --> <!-- Reviewed 2026-08-26 (the Workflow door is unconditional): the covered workspace mounts the Workflow panel door on every document now, and its empty state explains the feature and places a first action. Nothing THIS page documents changed; the workflow surface is documented under Authoring → Workflows in documents. --> <!-- Reviewed 2026-08-26 (workflow door goes live-derived): the covered workspace now also watches the mounted editor for action chips, so the Workflow door appears the moment a chip is placed instead of after a reload. Nothing THIS page documents changed; the door itself is documented under Authoring → Workflows in documents. --> <!-- Reviewed 2026-08-24 (ONE REVISION PANEL, docs/REVISION-PANEL.md): the covered surface changed only in how the Version history panel is mounted (the one shared RevisionPanel over the unified records wire, docked on the right on every record kind). Nothing this page documents changed; the panel itself is described on review/versions. --> <!-- Reviewed 2026-08-24 (PANEL CONSOLIDATION): the covered workspace/editor wiring changed only in how the Version history panel is mounted (the one engine panel with the shared VersionHistory words, on every record kind). Nothing this page describes — its own subject matter — moved; the panel itself is documented on review/versions. --> <!-- Reviewed 2026-08-20 (the restore confirm names how much it steps over): the covered document surfaces changed only where returning to an editing session is confirmed — the dialog now counts the later changes it would replace, computed from the moments list the panel already holds. A restore moves the draft only, so no publishing step moved. Nothing this page documents changed; the act itself is described on [Versions and history](/docs/review/versions). --> <!-- Reviewed 2026-08-19 (one history): the covered workspace merged its Activity panel into Version history. Publishing, approvals and the review journey this page documents are unchanged — a published version is still minted the same way and still reads Active in the list. --> <!-- Reviewed 2026-08-18 (ONE VERSION GRAMMAR — a version is a COUNT): the editorial/material choice no longer forks the NUMBER; both options mint the same next count, and the tick now records only that the substance moved. The "Editorial or material" section already says this. The app-side VersionBumpChoice component is deleted and its covers entry re-pointed at the engine surface that renders the declaration today. --> <!-- Reviewed 2026-08-18 (organization style sheet rev 2): the covered workspace code gained per-level heading styles (h1–h3) threaded from the org sheet to the editor. Nothing THIS page documents changed behavior; the sheet is documented under Administration → Workspaces and Authoring → The editor. --> <!-- Reviewed 2026-08-17 (per-document font chip removed): the covered workspace code lost the Aa chip and its override plumbing — typography is now set only in Settings → General. Nothing THIS page documents changed behavior; the change itself is documented under Authoring → The editor → "The document font" and Administration → Workspaces. --> <!-- Reviewed 2026-08-17 (organization document style): the covered workspace/settings code gained the org-style cascade — documents render `override ?? organization style ?? app default`, and Settings → General gained a Document style section. Nothing THIS page documents changed behavior; the feature itself is documented under Administration → Workspaces → "The organization's document style" and Authoring → The editor → "The document font". --> <!-- Reviewed 2026-08-15 (one properties panel: Code, Owner, Created, Type, Status on all four record kinds). The document's Details panel now opens on those five shared rows and keeps Document control, files and Backed by below them; the panel is described in The editor. Nothing this page documents changed: the approval routes, the version label and the in-force record are all unchanged, and Document control still reports what was decided rather than being one of the five. --> <!-- Reviewed 2026-08-14 (approvals completion): documentLifecycle's submit gained an optional typed-submitter parameter (automation cadences; every session flow omits it). Nothing this page documents changed behavior. --> <!-- Reviewed 2026-08-14 (approvals phase 4c — documents join the review routing layer): the covered workspace/review code gained assignment wiring (assignees on the workspace read, an Assign control in the Approval panel, the shared routing verbs). Nothing THIS page documents changed behavior; routing itself is documented under Review → Submit and approve → My approvals. -->

A version is a record, not a gate. Your document is live from the moment it exists: what it says now is what your readers, your processes and the assistant read. Publishing keeps a numbered, immutable copy of that text for the record — the version an audit cites — and is the door a document-control workflow's Ask for approval step uses when your own procedure says documents must be approved. Nothing waits for it: the processes built from the document act on their own switch (see Authoring → Workflows in documents). Publishing mints the next version of a document — the fixed, approved copy your readers are pinned to from that moment on. Once a document has one, readers keep seeing it until the next one publishes, so you can edit freely without changing what the organisation is following.

A document does not need publishing to exist. It is active at v1 from the moment it is created and its readers can read it straight away; publishing is how a version is approved and how the label steps forward, not how a document is turned on. See the lifecycle.

What publishing does

When a document publishes, three things happen together:

  • The current draft content is captured as a published version and given a version label. The label is a count, so a document at v7 publishes as v8 — nobody is asked for a number.
  • The document's published pointer moves to the new version. Anyone with read access now sees it.
  • A fresh working draft opens on top of the new version, so editing can continue immediately.

Publishing does not switch a workflow on. A document is active from the moment you create it, and accepting its workflow is what makes it act — from the next matching event on, the accepted steps run, published or not. Runs already in flight finish on the steps they started with, and archiving the document stops its triggers.

The record itself says which is which: the Status row names the version in force, the Activity trail carries who approved it and when, and a Word export's generated Document control tables state the same facts on paper. Before a document's first approval there is no separate version for readers yet — what you are writing is what they are reading, and the first approval publishes v2.

An undecided proposal from the assistant is not part of the draft either. Work it wrote for a part somebody had already changed waits on the document's Assistant proposals panel until a person applies it, so a publish captures what is actually in the document and never carries a proposal nobody decided into the version readers see. See AI review and assistance.

Editorial or material

The system cannot tell a typo from a change of policy, so the person publishing can say — but is never made to answer. Every publish is an editorial change by default: wording, formatting, a correction that leaves the meaning alone; the version simply counts on, so v7 becomes v8. Published and hand-saved versions count up the same chain — if somebody saved v8 from the panel this morning, your publish mints v9 — so a version's number always places it in the document's one story. See Version history. When the substance moved and readers need to notice, tick Material change on the review surface before you approve: the number is the same either way — what the tick changes is what the record SAYS about the change, so a reader can see at a glance which versions moved the substance. Every label on the surface updates the moment you tick it, so the button you press names exactly what publishes.

Whichever way it lands, the version label is minted when the publish lands and never changes afterwards. A document's first publish has nothing to be material relative to, so the toggle does not appear for it.

The same quiet choice exists on both routes below: an approver may tick it when they approve, and the server's direct-publish verb takes it as a parameter.

Two routes to publish

RouteWho starts itWho publishesLogged as
ApprovalAnyone with Writer or Owner on the team submits for reviewAn Owner who is not the submitter approves, and the approval publishesapproval
Direct publishThe server's publish verb — administrative tooling or the automation layer; there is no button in the appThe Owner the verb runs asself-publish

Approval. Submitting takes an immutable copy so the approver reviews exactly the content that was sent (see Submit and approve). Approving publishes that copy in the same step: there is no separate publish click afterwards, and the submitter is told it went out and at which version. See Submit and approve.

Conversation about the submitted copy happens where every conversation happens — the document's Comments panel. Raise your points there, and keep the change-request note to the one sentence that says why the document is going back.

Direct publish. An Owner can publish their own draft without a second person. Open the document, choose Review & publish, read the change summary (open View changes for the block-by-block comparison), then press Publish v8 — one click, no confirmation step after it. This is the one sanctioned self-approval in the system and it is recorded as such: the activity log stores the publish as a self-publish. If you would rather have a second pair of eyes, have a review opened (see how a review is opened) and let another Owner decide it on their My Approvals page. Direct publish. The current draft can be published without a review — but only through the server's publish verb, at the Owner rung; the app offers no publish button anywhere. It is the one sanctioned self-approval in the system and it is recorded as such: the activity log stores the publish as a self-publish. The route a person takes is always the review: have one opened (see how a review is opened) and another Owner decides it on their My Approvals page.

Where approval state shows on a document

There is no approval panel on records. A document tells its approval story in three places, each doing one job:

  • Document control (in the Details panel): the standing facts — the version in force, who approved it, when it took effect, and In review — requested by … while a request is open. A label, never a workflow.
  • Activity (its button in the document's top bar, beside the other panel buttons since August 2026 — the panel itself still opens on the right edge): the full trail — every request, approval, send-back and withdrawal, permanently, with who and when.
  • The ⋯ menu: no approval act at all — copy link, Download (the same window every record kind opens, where the Version control decides whether you take the approved copy or the draft), archive. Reading a pending review's comparison happens from My Approvals, the same place it is decided.

Decisions are made on My Approvals, the one decide surface; reviews are opened with no button at all, and published the same way — approving is what publishes. See how a review is opened.

Who may publish

Team roleEdit the draftSubmit for reviewApprove someone's reviewPublish directly
ReaderNoNoNoNo
WriterYesYesNoNo
OwnerYesYesYes, unless they submitted itYes

Workspace owners and admins act as team Owners on any team's documents.

Two guards apply and cannot be overridden by any role:

  • Separation of duties. The person who submitted a review cannot approve it. A workspace owner who submitted is still refused. Another Owner has to decide it.
  • A pending review blocks a direct publish. While any approval request is open on the document — your own included — direct publish is refused: decide or withdraw that review first. This is the record lock, the same rule that holds every other write still while a reviewer reads.

If you lack the role, the app tells you plainly: publishing needs the team Owner role. Ask a team Owner.

Working with the assistant on a version

Publishing is yours, not the assistant's. Approving, publishing, and saving a version are actions people take — on My Approvals, from the document's ⋯ menu, and in version history. The assistant does not take them for you and has no way to.

What it does is the writing that leads up to them. Ask it to change a section and it proposes the edit as a diff you approve; once the draft says what you want, you publish it by the routes above. You start that conversation from Chat in the sidebar and pin the document with the ⌖ picker in the composer, which resumes the conversation you were last having about it. (A button in the document's own bar did this until September 2026; a record carries no button onto the assistant any more.)

It also knows the route. Ask "can we get this live?" — as a Writer or an Owner — and it tells you the truth: a draft reaches readers through a review decided on My Approvals. Nothing about your draft changes until that decision is taken.

The explanation travels with the change: every section the assistant edited is left with a margin comment from Alchex saying what it changed and why, so the reason lives beside the words rather than only in the chat that produced them. See Comments.

Returning the draft to an earlier point does not publish

Restoring an old version, or returning to an editing session, changes the draft only. Readers keep seeing the version in force until you publish a new one, and the published history keeps every step either way. It is also allowed while a review is open: a reviewer decides on the exact content their request pinned, and the draft cannot reach it.

Publishing an uploaded file

A document whose content is an uploaded file does not publish this way at all: it has no draft, so the upload itself is the publish, and replacing the file publishes the next edition. Nothing below applies to one. The rest of this section describes the review you can still ask for voluntarily on a file-backed record that has not published yet — where what you read before confirming is the file itself rather than a change list — there is no line-by-line comparison to make between two files. Ask another Owner works exactly as above. The editorial-or-material choice does not apply: you cannot make an editorial correction to a PDF somebody else issued, so an uploaded file counts on like everything else — v1, v2, v3 — and Alchex mints the next one rather than asking. The published version keeps the file's fingerprint, so what was approved is provably what shipped. See External documents.

Nothing to publish

If the draft is identical to the published version, the panel reports Nothing to publish. Make a change first, or close it. For an uploaded file the same message appears when the current file is byte-for-byte the published one — upload a different file to publish again.

An archived document publishes nothing either, and decides nothing: it is read-only, and its ⋯ menu offers no publish or review door until the document comes back. Restore it from the banner at the top of the document and the workflow resumes where it was. See Activity and archive.

Placeholders have to be filled in first

A document cannot be published while it still carries bracketed placeholders — [the approving role], [number] business days — the kind a template or a generated draft leaves for you to complete. The review surface names what is still open before you press anything and holds the publish button until it is resolved; and if a placeholder slips through any other door, the publish itself is refused with the same list.

This is a refusal rather than a warning on purpose. A warning at publish time is read by someone who has already decided to publish, and the cost of getting it wrong is not cosmetic: an issued procedure that tells its reader to insert a value is one nobody can actually follow, and in an audit it reads as a control that was never specified.

Three things that look like placeholders are not, and never block publishing: a reference chip, a link, and a bracketed number or date such as [12] or [2026-01-01]. Only brackets containing words are treated as an instruction left for the author.

A second refusal of the same kind guards workflow chips: a Set a field or Only if… step that names a field its record does not actually have is refused at publish, and the message names the chip and the fields it may use. So is a Read a connected source step naming a source your team does not hold — or one that has been archived. The alternative — letting it publish and discovering the mistake as a failed run some weeks later — is exactly the silence a publish gate exists to prevent. All of these refusals run on the same pinned copy, on every path a publish can take.

The check runs on the exact version being published — the copy pinned when the document went for review, not whatever the draft says at the moment somebody presses Approve. So what was checked and what gets issued are guaranteed to be the same text. It applies to both routes equally: publishing directly and approving a review.

What a published version means

A published version is a fixed record, not a live pointer into the draft. It keeps the exact content that was published, its version label, who published it, and when.

  • Published versions are immutable. Nothing in the app can edit or overwrite one — not an Owner, not a restore, not a later edit.
  • Older published versions are retained, never hidden. They stay readable in version history and are marked Superseded; the one readers see is marked Current.
  • Editing after a publish never touches what readers see. The new work sits in the draft until it publishes in turn.

No document can be deleted, published or not. That used to be a rule about publishing — from the first published version onwards, the delete action disappeared and the API refused it, because the versions, approvals and activity trail are the record. It is no longer conditional on anything: there is no delete action and no delete endpoint, for a published document or a draft that never left its author's hands.

Removing a document means Archive: it keeps every version, stays readable and auditable, and Restore on its banner brings it back. See Activity and archive.

What the document rests on

A control publishes the same way as any other document — and publishing is what puts its definition into effect: the audit runs against the published version, never the draft you are still writing.

Because that distinction decides whether a run means anything, a control's audit rail says which side of it you are on. It carries no publish button — nobody's role summons one, here or anywhere else — the rail simply states the basis, and the fix is the same as everywhere on this page: a review decided on My Approvals, or the server's publish verb.

Once the publish goes through, the rail catches up on its own: the definition it judges against is the one that was just published, and it says so without a page refresh — including when you published from the approval panel that replaced the rail while you were confirming. The same is true when a review is approved: approving is what publishes. See Controls and evidence.

Publishing a control also tidies up behind it. Files the control's text no longer cites are collected at the same time, and only when nothing anywhere else still points at them. The sweep never reaches outside the document's own team, and it never touches a connector label — a label outlives the sentence that cited it, because a workflow or another team's control may be reading the same source.

The document's panel carries Backed by — the evidence the document itself references. It is worth a look before you publish: it is the list an auditor would ask for, and a document that references nothing reads as Backs nothing yet — unproven. Publishing does not change the list; it is derived from the text, so it follows whatever the published body says. See References.

  • Version history — browsing, comparing and restoring past versions.
  • Comments — commenting on a passage of a live draft.
  • Comments — the record's one conversation, reviews included.
  • Permissions — the full role matrix.
<!-- Reviewed 2026-08-25 (workflow manager P1 — schema + repo): documentLifecycle's publish now also extracts workflow trigger chips into the workflow_triggers index (same write-through as citations, best-effort savepoint). No editor can place such a chip yet, so no published document contains one and publish behaves exactly as documented. Nothing this page documents changed. --> <!-- Reviewed 2026-08-26 (workflow manager P2 — the executor): the covered record routes gained post-commit workflow dispatch hooks (record created / submitted → runs; decisions → resume). No editor can place a workflow chip yet, so no published document declares a trigger and every documented flow behaves exactly as before. Nothing this page documents changed. --> <!-- Reviewed 2026-08-26 (workflow manager P4 — the Workflow panel): the document workspace gained a docked Workflow panel (Steps lanes + Runs), its door derived from the draft's chips or existing receipts (documented in authoring/workflows.md). Everything this page documents behaves exactly as before. -->