Classification labels and publish approval
Every diagram in an organisation's library carries a classification label that says how far it may travel. An organisation can also hold a publish, or a public link, until an approver has looked at it.
TL;DR
| Question | Answer |
|---|---|
| What are the labels? | Public, Internal (the default) and Confidential. A diagram published before labels reads as Internal. |
| What does a label do? | Confidential is never shared at a public link. With "Share only diagrams labelled Public" on, only a Public diagram is. The label is also written into the stored picture's metadata and onto the name of a PNG or PDF export. |
| Who changes a label? | The owner and admins, either way. The member who published a diagram, only to a stricter label. Nobody else, and never a key. |
| What does approval do? | With "Publishing needs approval" on, a publish by someone who is not an approver is stored but held: only its publisher and the approvers see it until an approver approves. |
| Who approves? | The owner, the admins, and the members they choose. An approver publishes and shares directly. |
| What does an agent see? | The publish answers as usual, with approval and warning W601, "Held for approval by your organisation". It is data, never an error. |
| How long does a request wait? | 30 days. Then the daily sweep ends it, as a rejection does. |
1. The labels
| Label | Mark | Means |
|---|---|---|
| Public | A globe | May be shared at a public link. |
| Internal | A building | For the organisation. Shared publicly only where the owner allows public sharing and does not ask for Public. |
| Confidential | A lock, in the danger ink | Never shared at a public link. |
The library shows the label under each diagram's name as a mark and a word, and the list can be narrowed to one label. Every member, readers included, sees the labels.
Which label a new diagram gets
A publish can name its label (classification on publish_diagram and on POST /v1/diagrams/publish). Left out, the diagram takes the default of the deepest folder on its path that has one, and otherwise the organisation's default, Internal unless an owner or admin chose another. An agent's auto-publish takes the folder default the same way.
A member may choose a label at or above that default. A label below it is for the owner and admins, and is refused with 403 orgs.forbidden for anyone else.
Changing a label
Change a label from the row's menu in the library, or with Change beside the label on the diagram's page. The API is PATCH /orgs/{org}/diagrams/{id}/classification.
| Who | May |
|---|---|
| Owner, admin | Any label, either way, on any diagram |
| The member who published it | Only a stricter label: Public to Internal or Confidential, Internal to Confidential |
| Another member, a reader, an organisation key | Nothing |
A lock does not stop a label change. Each change is recorded as orgs.diagram.classify with the label before and after.
Labels and public links
| Rule | What happens |
|---|---|
| Confidential | A share is refused with 409 orgs.share_classified. Raising a shared diagram to Confidential ends its link at once; the portal asks first. |
| "Share only diagrams labelled Public" (the owner's switch) | Only a Public diagram may be shared. Turning it on ends the link of every shared diagram that is not Public, and says how many. |
| Public sharing is off | No diagram is shared, whatever its label. |
The label in the files
The stored picture carries the label in one empty metadata element, <metadata data-classification="confidential"/>, beside its id. It is never drawn on the picture. A public link's copy keeps it. A PNG or PDF exported from the diagram's page is named with the label at the end, such as card-vault-confidential.png.
2. Publish approval
Set it on the Settings tab, under Approval. The owner and admins choose.
| Setting | Choices |
|---|---|
| Publishing needs approval | Off (the default), Chosen folders (each folder and every folder inside it), or Every publish |
| Public sharing needs approval | Off or on |
| Hold organisation keys for approval too | Off (the default) or on. Only the owner changes it. |
| Approvers | Members chosen to approve beside the owner and admins. A reader is never one. |
What is held
| Publish | While approval covers its folder |
|---|---|
| A new diagram by a member or an agent connection | Stored and held. The publisher and the approvers see it, marked "Waiting for approval"; nobody else does, and a public link waits for it. |
| A new version of a diagram the library shows (the editor's save, an agent's drawing of the same title) | The library keeps the approved version. The new one waits, and the row says "New version waiting". |
| The same picture again | Nothing new. A held one stays held. |
| A public link, with "Public sharing needs approval" on | No link yet. The share answers 202 with the request. |
| Anything by the owner, an admin or a chosen approver | Goes ahead at once. |
| A publish or a new version by an organisation key | Goes ahead at once, unless the owner turns on "Hold organisation keys for approval too". Then it is held like a member's. |
Only the owner and admins make organisation keys from the Keys tab, and they publish directly, so a key does too by default. An agent connection is its member, so it is held whenever that member would be. An organisation key never makes a public link.
The Approvals queue
Approvers have an Approvals section under Governance, with the number waiting beside its name. Each request shows:
| Field | Shows |
|---|---|
| The picture | The new diagram, or the proposed version |
| What is asked | New diagram, New version or Public link |
| Who asked | The publisher's address, or an organisation key |
| Folder and label | Where it is filed and how it is labelled |
| Secret scan | How many things that look like a credential the scan found, under the organisation's scanning options |
| What changed | For a new version, each change by meaning: added, removed, renamed, moved, changed (the engine's compare_diagrams) |
Approve shows a new diagram to the library, puts a new version in place (the one before is kept as a previous version), or makes the public link with every check of a share run again. Reject deletes a new diagram, drops a new version, or makes no link. Either takes an optional comment of up to 500 characters. The publisher is emailed the outcome with the comment. Nobody decides what they asked for themselves.
A legal hold refuses a rejection of a new diagram, as it refuses every delete. An approval still goes ahead.
Below the queue, the requests decided or ended in the last 30 days are listed with their outcome.
Expiry
A request nobody decides ends 30 days after it was made. The daily sweep ends it as a rejection does and records orgs.diagram.approval_expire, with "Approval policy" as the actor. An organisation on legal hold keeps its held diagrams until the hold ends.
Approval and secret scanning
Secret scanning runs first. Under Block, a publish with a finding is refused and never reaches the queue. Under Warn it is held like any other, and the queue shows how many findings it has.
3. What an agent sees
A held publish is an answer, never an error:
Held for approval by your organisation: the diagram is stored in the Acme Team library, but only you and its approvers can see it until an approver approves it. (warning W601)Stored in the private library of "Acme Team", waiting for approval: https://app.plotwork.dev/orgs/acme-team/diagrams/5d1d7c8e-3f0a-4f6e-9a55-0d7c9b1f2a10The structured answer carries approval (state, requestId, kind, expiresAt, message, code) and a W601 warning. An auto-publish that was held carries the same warning among the drawing's warnings, and autoPublished.approval. The agent should tell the person and not publish again.
4. What the audit log records
| Event | When | Metadata |
|---|---|---|
orgs.diagram.classify | A label changed | from, to, shareEnded |
orgs.diagram.approval_request | A publish, a version or a link was held | kind, request, secretFindings, auto |
orgs.diagram.approve | An approver approved | kind, request, publisher, comment |
orgs.diagram.reject | An approver rejected | kind, request, publisher, comment |
orgs.diagram.approval_expire | The sweep ended a request | kind, request |
orgs.settings.classification | The labels' settings changed | default, sharePublicOnly, folders (how many), linksEnded |
orgs.settings.approval | The approval settings changed | publish, folders (how many), share, approvers (how many) |
None holds a folder's path or a diagram's source. On Enterprise they are sent to your SIEM like every other event.
See also
| Doc | Why |
|---|---|
| Organisations | The library, roles and the other Settings |
| Hosted diagrams | Publishing, and public links |
| Secret scanning | What the scan finds before a publish |
| Audit log | Reading and exporting the events |
| MCP server | publish_diagram and its answers |
| Diagnostic codes | W601 among the rest |