deliver: shipping is a procedure, not an event
0. Entry conditions: all of them
verify passed on everything in this release (evidence in STATE.md, not memory).
code-review clean on everything in this release (blockers and majors resolved), or its
trivial-tier skip recorded in STATE.md (verify §4 routes this).
scope-guard clean; specs in this release at status done.
- CI green on the exact commit being shipped. Local green is not CI green. No CI yet (no
remote/host)? Wire it now. First delivery is the moment. Genuinely impossible? Run the full
gate chain on a fresh clean checkout and record that explicit exception in STATE.md. On
GitHub, a first release also protects
main: the owner applies the runbook
docs/operations/branch-protection.md with repo admin.
- On a platform stack (the stack file's header declares a hosted platform): the target instance
and the repo still agree. Export the environment fresh and compare it against what is
committed; whatever was changed directly in the platform editor since the last export is
brought into the repo or deliberately dropped, and either way it happens before the release,
not during it. A repo that is behind its own instance ships a release that overwrites work
nobody reviewed. This is the platform's standard failure mode and the one CI cannot see:
green on the commit says nothing about what the instance holds.
- The product holds persistent data →
docs/operations/backup-restore.md exists and the
restore has been performed once, for real. An untested restore is a hope, not a backup.
- Compliance register (
docs/compliance/REGISTER.md) has no open blocking item. For a first
release or new data/AI processing, run comply first. A first release also proves the root
SECURITY.md holds: the reporting channel works (on GitHub: private vulnerability reporting
enabled in the repo settings), and once the product is placed on the market its support
period is published (comply fills the marked fields).
1. The release
- Version it: semantic version derived from Conventional Commits (breaking → major, feat →
minor, fix → patch). Tag:
vX.Y.Z.
- Changelog:
CHANGELOG.md at the root, newest version first. Generate from commits since the
last tag, then edit for a human reader: what changed for the user, in the product's voice.
Write the entry in the release commit and set its date when the tag is cut, so a dateless
heading is the visible sign that a release is prepared but not out.
- Deploy only via the runbook
docs/operations/deploy.md. First delivery? Write that
runbook now (target, credentials location (never in the repo), steps, verification URL,
rollback procedure) and test it by following it literally, from a clean state.
- Post-deploy verification: the runbook's smoke checks against the real environment: the
critical flows, not a browse-around. Record results.
- Rollback is part of delivery: before shipping, know the one command/procedure that undoes
this release, and that it works.
2. Milestone handover
Deliverable milestone for a client/owner → run handover so the repo is cold-start complete,
and demo against BRIEF's success criteria: per SC-item in this milestone, show it working.
A demo proves capability, not value: it works, and nobody has measured yet whether the promised
value arrived. So before the milestone closes, every shipped SC-item's measurement plan in BRIEF
carries a concrete read date ("quarterly" gets a date) and a named reader, set with the owner
because the measurement is theirs, and maintain's loop reads it when that date passes. An
SC-item BRIEF marks n/a has nothing to schedule; a quantified criterion with no plan at all is
a scope question, not a delivery blocker.
3. Record
STATE.md: phase (maintain after first production release), release line (version, date, sha,
environment), Now ▶. Deferred-but-shipped debt: DEBT.md rows checked against what shipped.
New operational facts (URLs, dashboards, schedules) → docs/operations/, listed in the
manifest. What this release cycle taught, a missing runbook step included, routes to INTAKE.md
as a candidate like any session lesson (checkpoint, step 3 of its method, owns that rule).
Report: version, where it now runs, evidence of the smoke checks, one next step. ⚓
1---2name: deliver3description: Release, deploy, or hand over a milestone in a disciplined, repeatable way. Use when shipping to users, deploying to an environment, tagging a release, or closing out a milestone. Nothing ships that verify hasn't passed.4---56# deliver: shipping is a procedure, not an event78## 0. Entry conditions: all of them910- `verify` passed on everything in this release (evidence in STATE.md, not memory).11- `code-review` clean on everything in this release (blockers and majors resolved), or its12 trivial-tier skip recorded in STATE.md (`verify` §4 routes this).13- `scope-guard` clean; specs in this release at status `done`.14- CI green on the exact commit being shipped. Local green is not CI green. No CI yet (no15 remote/host)? Wire it now. First delivery is the moment. Genuinely impossible? Run the full16 gate chain on a fresh clean checkout and record that explicit exception in STATE.md. On17 GitHub, a first release also protects `main`: the owner applies the runbook18 `docs/operations/branch-protection.md` with repo admin.19- On a platform stack (the stack file's header declares a hosted platform): the target instance20 and the repo still agree. Export the environment fresh and compare it against what is21 committed; whatever was changed directly in the platform editor since the last export is22 brought into the repo or deliberately dropped, and either way it happens before the release,23 not during it. A repo that is behind its own instance ships a release that overwrites work24 nobody reviewed. This is the platform's standard failure mode and the one CI cannot see:25 green on the commit says nothing about what the instance holds.26- The product holds persistent data → `docs/operations/backup-restore.md` exists and the27 restore has been performed once, for real. An untested restore is a hope, not a backup.28- Compliance register (`docs/compliance/REGISTER.md`) has no open blocking item. For a first29 release or new data/AI processing, run `comply` first. A first release also proves the root30 `SECURITY.md` holds: the reporting channel works (on GitHub: private vulnerability reporting31 enabled in the repo settings), and once the product is placed on the market its support32 period is published (`comply` fills the marked fields).3334## 1. The release35361. Version it: semantic version derived from Conventional Commits (breaking → major, feat →37 minor, fix → patch). Tag: `vX.Y.Z`.382. Changelog: `CHANGELOG.md` at the root, newest version first. Generate from commits since the39 last tag, then edit for a human reader: what changed *for the user*, in the product's voice.40 Write the entry in the release commit and set its date when the tag is cut, so a dateless41 heading is the visible sign that a release is prepared but not out.423. Deploy **only** via the runbook `docs/operations/deploy.md`. First delivery? Write that43 runbook now (target, credentials location (never in the repo), steps, verification URL,44 rollback procedure) and test it by following it literally, from a clean state.454. Post-deploy verification: the runbook's smoke checks against the real environment: the46 critical flows, not a browse-around. Record results.475. Rollback is part of delivery: before shipping, know the one command/procedure that undoes48 this release, and that it works.4950## 2. Milestone handover5152Deliverable milestone for a client/owner → run `handover` so the repo is cold-start complete,53and demo against BRIEF's success criteria: per SC-item in this milestone, show it working.5455A demo proves capability, not value: it works, and nobody has measured yet whether the promised56value arrived. So before the milestone closes, every shipped SC-item's measurement plan in BRIEF57carries a concrete read date ("quarterly" gets a date) and a named reader, set with the owner58because the measurement is theirs, and `maintain`'s loop reads it when that date passes. An59SC-item BRIEF marks `n/a` has nothing to schedule; a quantified criterion with no plan at all is60a `scope` question, not a delivery blocker.6162## 3. Record6364STATE.md: phase (`maintain` after first production release), release line (version, date, sha,65environment), Now ▶. Deferred-but-shipped debt: DEBT.md rows checked against what shipped.66New operational facts (URLs, dashboards, schedules) → `docs/operations/`, listed in the67manifest. What this release cycle taught, a missing runbook step included, routes to INTAKE.md68as a candidate like any session lesson (`checkpoint`, step 3 of its method, owns that rule).69Report: version, where it now runs, evidence of the smoke checks, one next step. ⚓