SOP-077 — Change management for the SOP system (add / modify / retire an SOP)
SOP · owner: Operations (Process Engineer). Layer: SOP/Runbook (
docs/canon.md). This SOP governs changes to the SOP system itself — adding, modifying, or retiring an SOP and allocating its ID. It complements, does not duplicate, SOP-002 (docs/sop/change-management.md), which governs the generic document-change flow (propose → review → approve → version → publish). Where this SOP and SOP-002 overlap (review/approve/archive), SOP-002 is the home — this SOP links to it.
Interface Contract
- Inputs: review passed ← from <Quality & Risk> · trigger:
review passed - Inputs: binding arbitration call ← from <COO / Principal> · trigger:
arbitration decided - Outputs: approved SOP / operating-model doc → to Archivist · trigger:
artifact approved - Outputs: operating-model / canon doc added/changed → to Documentarian · trigger:
document changed - Handoff trigger (in): an SOP draft is reviewed and ready for preservation
- Handoff trigger (out): the COO (or doc owner) approves the SOP and it is archived
- Definition of Done before handoff:
- [ ] SOP carries a complete, parseable Interface Contract block
- [ ]
node scripts/handoff-reconcile.mjsreads GREEN (exit 0) - [ ] ID allocated in
docs/sop/registry.md(Operations-assigned, never reused) - [ ] Archived (0 drift); canon updated if the doc was added/moved (SOP-002 DoD)
- [ ] learnings captured to docs/knowledge/ if any
Purpose
A predictable path for changing the SOP system so every SOP has one global ID, one
home (docs/sop/), a parseable Interface Contract, and a green reconciler — and so a
new SOP wires into CI rather than drifting.
When to use
Adding a new recurring procedure, modifying an existing SOP, retiring a superseded one,
or allocating an SOP-NNN ID. For a one-off document change, use SOP-002 instead.
Flow
flowchart LR
P["Propose<br/>title · owner · purpose"] --> I["Allocate ID<br/>(registry band)"]
I --> Dr["Draft<br/>template + Interface Contract"]
Dr --> Rc{"Reconcile<br/>GREEN?"}
Rc -->|red| Dr
Rc -->|green| Ap["Approve<br/>(SOP-002)"]
Ap --> Ar["Archive + canon"]
classDef s fill:#1d4ed8,color:#fff,stroke:#1e3a8a
classDef d fill:#0f766e,color:#fff,stroke:#134e4a
class P,I,Dr,Ap,Ar s
class Rc d
Text fallback: Propose (send Operations the title, owner unit, one-line purpose) →
Allocate ID (Operations assigns the next free SOP-NNN in the owner’s band and adds
the registry row) → Draft from templates/sop.md with a complete Interface Contract
block → Reconcile (node scripts/handoff-reconcile.mjs; if RED, fix and re-run) →
Approve via SOP-002’s approver-by-class flow → Archive (Archivist, 0 drift) and
update canon if a doc was added/moved.
Steps
- Propose. Send Operations the title, owner unit, and one-line purpose. Do not self-assign an ID.
- Allocate the ID. Operations picks the next free
SOP-NNNin the owner’s band (docs/sop/registry.mdallocation table), never reusing a number, and adds the ledger row. - Draft the SOP flat in
docs/sop/fromtemplates/sop.md, including a complete, parseable Interface Contract block (interface-contract-spec.md§1). Everytrigger:value must be a verbatim phrase fromdocs/handoff-triggers.md; if a new trigger is needed, report it to Operations (reuse-beats-add) — never invent inline. - Reconcile. Run
node scripts/handoff-reconcile.mjs. Resolve every defect (GAP / OVERLAP / UNREGISTERED TRIGGER) until GREEN. An overlap escalates to canon RACI. - Approve per SOP-002’s approver-by-class table (SOP/runbook → Operations or doc owner).
- Archive (Archivist,
artifact approved) and updatedocs/canon.mdif a doc was added/moved/retired (document changedto the Documentarian). - Retire (if applicable): mark the registry row superseded, link the replacement; the ID is never reused.
Roles / approvers
| Step | Who |
|---|---|
| Propose / draft | the owning agent |
| Allocate ID | Operations (Process Engineer) — numbering authority |
| Approve | SOP-002 approver-by-class (Operations or doc owner; COO for Operations charters) |
| Archive | Archivist |
| Canon update | Documentarian |
Guardrails
- One global ID space, never self-assigned, never reused (
docs/sop/registry.md). - One home per SOP — flat in
docs/sop/; nothing underdocs/units/**/sops/. - No green, no done — the reconciler is the gate (GR-2); a defect blocks approval.
- Draw triggers from the registry; report additions, do not invent inline
(
interface-contract-spec.md§1.2). - Mirrors SOP-002 for review/approve/archive — link, do not duplicate (
CONTRIBUTING.md).
See also: docs/sop/change-management.md (SOP-002) · docs/sop/registry.md ·
docs/sop/SOP-078-handoff-reconciliation.md · docs/handoff-triggers.md ·
interface-contract-spec.md.