workflow-ship-and-observe — Release, Verify, Observe, Roll Back
Degree of freedom: MIXED. Rollback-vs-hotfix [HIGH freedom]; pin
target/SHA, prove revision, observe window [LOW freedom — run exactly].
Shipping is not merging. A release is done only when the intended revision is
live on the confirmed target, production smoke checks pass, and a defined
monitoring window elapses without crossing rollback thresholds — or a
rollback/hotfix has been executed.
Prove the deployed revision, then watch it. A 200 from a URL is not proof
that your code is live, and "it deployed" is not proof that it is healthy.
Before any browser action, read protocol-browser-anti-stall.
How to reason
- Pin — SHA, environment, mechanism, rollback, signals
- Ship — pipeline deploy; backend deps first
- Prove — live revision equals SHA; smoke on critical flows
- Watch — window elapsed under thresholds, or roll back
Worked example
Pin: a1b2c3d on Vercel production; rollback = previous promotion; Sentry + 5xx threshold set.
Ship: migrations applied; vercel deploy --prod succeeded.
Prove: /version returns a1b2c3d; checkout + login smoke 2xx.
Watch: 2h window, error rate flat → STABLE. A 5xx spike would have promoted previous and re-smoked.
Self-critique before reporting
- Revision proven — a 200 is not "our SHA is live"
- Level honest — deployed-verified ≠ observed-stable
- Threshold acted — known-bad prod was not "monitored more"
- Right owner — smoke methodology only →
deploy-verify; npm package → deploy-npm; not-yet-green → workflow-green-repo
Phase 0 — Pin the target and the revision [LOW freedom — run exactly]
Never guess where or what you are shipping. Establish:
- Source revision — the exact commit SHA to release. Confirm it is merged
and that the repository is green (route to
workflow-green-repo /
complete-everything if not). Record the SHA.
- Target environment — which environment and provider. Discover from the
repo, do not assume:
vercel.json, netlify.toml, fly.toml,
Dockerfile, render.yaml, Kubernetes manifests, GitHub Actions deploy
workflows, app.json/EAS, supabase/config.toml, Terraform. Confirm the
environment (staging vs production) with the user once and reuse it.
- Deploy mechanism — CI-on-merge, a manual pipeline trigger, or a CLI
command. Identify the exact command/workflow and how to read its status.
- Backend dependencies — migrations, edge functions, RLS, buckets,
secrets, cron. Per
full-stack-ship-discipline, these must deploy and be
verified alongside the frontend. Non-destructive schema required by the
approved release ships without re-asking on a confirmed target; destructive
data operations always ask first.
- Rollback plan — the concrete, executable way to revert this target
(previous deployment promotion, image/tag rollback, revert-and-redeploy,
migration down-path). If no rollback exists, say so before shipping.
- Signals — where errors and latency are observed (Sentry, provider logs,
Supabase logs/advisors, uptime checks) and the thresholds that mean "roll
back."
Write .cursor/ship-state.md:
# Ship & Observe: <app> → <environment>
Revision: <sha>
Target/provider: <name>
Deploy: <command/workflow>
Rollback: <exact procedure>
Monitor window: <duration> · thresholds: <error rate / latency / crash-free>
## Steps
- [ ] preflight: repo green + revision confirmed
- [ ] backend deps deployed + verified
- [ ] deploy triggered
- [ ] deployed revision matches <sha>
- [ ] production smoke: <critical flows>
- [ ] monitoring window elapsed within thresholds
- [ ] stable OR rollback/hotfix executed
## Evidence
- <step>: <command/result>
Phase 1 — Preflight [LOW freedom — run exactly]
- Confirm the release SHA is merged and green. Do not ship red or unmerged code.
- Deploy and verify backend dependencies first, so the frontend does not hit a
missing table/function on first request. Verify objects exist as the role the
client uses.
- Confirm the rollback procedure is real and, where possible, dry-run it.
Phase 2 — Deploy [LOW freedom — run exactly]
- Trigger the deploy via the identified mechanism. Never hand-edit production
state outside the pipeline.
- Wait for the deploy to reach a terminal state; capture the build/deploy logs.
A failed or partial deploy is a stop-and-fix, not a proceed.
Phase 3 — Verify the revision is live [LOW freedom — run exactly]
- Confirm the deployed revision equals the intended SHA — via the
provider's deployment metadata, a
/version/build-id endpoint, a build stamp,
or asset hashes. A reachable URL alone is not proof.
- Run production smoke checks on the critical flows: real navigation, auth,
a primary read and a primary write path. Capture console, network (2xx where
expected), and screenshots as evidence. Keep artifacts under
.playwright-mcp/.
Phase 4 — Observe the stability window [LOW freedom — run exactly]
- Watch the defined signals for the agreed window (scale it to release risk).
- Track error rate/new issues (Sentry), latency and 5xx (provider/Supabase
logs), new ERROR advisors, and crash-free rate for mobile.
- Crossing a threshold triggers Phase 5. Not crossing it after the window
elapses is the only path to a "stable" claim.
Phase 5 — Roll back or hotfix (only if a threshold is crossed) [HIGH freedom]
- If signals breach thresholds: execute the rollback procedure immediately,
confirm the prior healthy revision is live, and re-verify smoke checks.
- If forward-fix is clearly faster and safer than rollback, ship a hotfix
through the same pipeline and re-enter Phase 3. Record the decision and why.
- Never leave production in a known-bad state to "monitor more."
Phase 6 — Report [LOW freedom — do not skip]
## Ship & Observe — report
Released: <sha> → <environment/provider>
### Result: STABLE | ROLLED BACK | HOTFIXED | BLOCKED
### Evidence
- deploy: <log/status>
- revision live: <how confirmed> = <sha>
- smoke: <flows> → <result + artifacts>
- monitoring: <window> → error rate <x>, latency <y>, crash-free <z>
### Rollback/hotfix (if any)
- trigger: <threshold crossed> → action: <what ran> → outcome
### Follow-ups
- none | <tracked item>
Completion level is deployed-verified after Phase 3 and observed-stable
only after Phase 4 passes. Do not claim stability from a single smoke test.
Related
deploy-verify — the post-deploy smoke methodology this skill builds on
deploy-npm — for npm package releases (not app deployments)
full-stack-ship-discipline — backend must deploy and be verified too
iterate-post-launch — turn observed production signals into the next fixes
workflow-feedback-to-closure — route rollback/incident findings into tickets
verification-before-completion — deployed-verified vs observed-stable levels
1---2name: workflow-ship-and-observe3description: Take merged, repository-green code all the way to a verified, monitored production release for any app stack. Use when "ship it", "deploy to production", "release this", "go live", "roll this out", "promote to prod", or "cut a release" for a running application (not an npm package — use deploy-npm for that).4license: MIT5---67# workflow-ship-and-observe — Release, Verify, Observe, Roll Back89**Degree of freedom: MIXED.** Rollback-vs-hotfix `[HIGH freedom]`; pin10target/SHA, prove revision, observe window `[LOW freedom — run exactly]`.1112Shipping is not merging. A release is done only when the **intended revision is13live on the confirmed target, production smoke checks pass, and a defined14monitoring window elapses without crossing rollback thresholds** — or a15rollback/hotfix has been executed.1617> **Prove the deployed revision, then watch it.** A 200 from a URL is not proof18> that your code is live, and "it deployed" is not proof that it is healthy.1920**Before any browser action, read `protocol-browser-anti-stall`.**2122## How to reason23241. **Pin** — SHA, environment, mechanism, rollback, signals252. **Ship** — pipeline deploy; backend deps first263. **Prove** — live revision equals SHA; smoke on critical flows274. **Watch** — window elapsed under thresholds, or roll back2829## Worked example3031> **Pin:** `a1b2c3d` on Vercel production; rollback = previous promotion; Sentry + 5xx threshold set.32> **Ship:** migrations applied; `vercel deploy --prod` succeeded.33> **Prove:** `/version` returns `a1b2c3d`; checkout + login smoke 2xx.34> **Watch:** 2h window, error rate flat → STABLE. A 5xx spike would have promoted previous and re-smoked.3536## Self-critique before reporting3738- **Revision proven** — a 200 is not "our SHA is live"39- **Level honest** — deployed-verified ≠ observed-stable40- **Threshold acted** — known-bad prod was not "monitored more"41- **Right owner** — smoke methodology only → `deploy-verify`; npm package → `deploy-npm`; not-yet-green → `workflow-green-repo`4243## Phase 0 — Pin the target and the revision [LOW freedom — run exactly]4445Never guess where or what you are shipping. Establish:46471. **Source revision** — the exact commit SHA to release. Confirm it is merged48 and that the repository is green (route to `workflow-green-repo` /49 `complete-everything` if not). Record the SHA.502. **Target environment** — which environment and provider. Discover from the51 repo, do not assume: `vercel.json`, `netlify.toml`, `fly.toml`,52 `Dockerfile`, `render.yaml`, Kubernetes manifests, GitHub Actions deploy53 workflows, `app.json`/EAS, `supabase/config.toml`, Terraform. Confirm the54 environment (staging vs production) with the user once and reuse it.553. **Deploy mechanism** — CI-on-merge, a manual pipeline trigger, or a CLI56 command. Identify the exact command/workflow and how to read its status.574. **Backend dependencies** — migrations, edge functions, RLS, buckets,58 secrets, cron. Per `full-stack-ship-discipline`, these must deploy and be59 verified alongside the frontend. Non-destructive schema required by the60 approved release ships without re-asking on a confirmed target; destructive61 data operations always ask first.625. **Rollback plan** — the concrete, executable way to revert this target63 (previous deployment promotion, image/tag rollback, revert-and-redeploy,64 migration down-path). If no rollback exists, say so before shipping.656. **Signals** — where errors and latency are observed (Sentry, provider logs,66 Supabase logs/advisors, uptime checks) and the thresholds that mean "roll67 back."6869Write `.cursor/ship-state.md`:7071```md72# Ship & Observe: <app> → <environment>73Revision: <sha>74Target/provider: <name>75Deploy: <command/workflow>76Rollback: <exact procedure>77Monitor window: <duration> · thresholds: <error rate / latency / crash-free>7879## Steps80- [ ] preflight: repo green + revision confirmed81- [ ] backend deps deployed + verified82- [ ] deploy triggered83- [ ] deployed revision matches <sha>84- [ ] production smoke: <critical flows>85- [ ] monitoring window elapsed within thresholds86- [ ] stable OR rollback/hotfix executed8788## Evidence89- <step>: <command/result>90```9192## Phase 1 — Preflight [LOW freedom — run exactly]9394- Confirm the release SHA is merged and green. Do not ship red or unmerged code.95- Deploy and verify backend dependencies first, so the frontend does not hit a96 missing table/function on first request. Verify objects exist as the role the97 client uses.98- Confirm the rollback procedure is real and, where possible, dry-run it.99100## Phase 2 — Deploy [LOW freedom — run exactly]101102- Trigger the deploy via the identified mechanism. Never hand-edit production103 state outside the pipeline.104- Wait for the deploy to reach a terminal state; capture the build/deploy logs.105 A failed or partial deploy is a stop-and-fix, not a proceed.106107## Phase 3 — Verify the revision is live [LOW freedom — run exactly]108109- Confirm the **deployed revision equals the intended SHA** — via the110 provider's deployment metadata, a `/version`/build-id endpoint, a build stamp,111 or asset hashes. A reachable URL alone is not proof.112- Run production smoke checks on the critical flows: real navigation, auth,113 a primary read and a primary write path. Capture console, network (2xx where114 expected), and screenshots as evidence. Keep artifacts under `.playwright-mcp/`.115116## Phase 4 — Observe the stability window [LOW freedom — run exactly]117118- Watch the defined signals for the agreed window (scale it to release risk).119- Track error rate/new issues (Sentry), latency and 5xx (provider/Supabase120 logs), new ERROR advisors, and crash-free rate for mobile.121- **Crossing a threshold triggers Phase 5.** Not crossing it after the window122 elapses is the only path to a "stable" claim.123124## Phase 5 — Roll back or hotfix (only if a threshold is crossed) [HIGH freedom]125126- If signals breach thresholds: execute the rollback procedure immediately,127 confirm the prior healthy revision is live, and re-verify smoke checks.128- If forward-fix is clearly faster and safer than rollback, ship a hotfix129 through the same pipeline and re-enter Phase 3. Record the decision and why.130- Never leave production in a known-bad state to "monitor more."131132## Phase 6 — Report [LOW freedom — do not skip]133134```md135## Ship & Observe — report136Released: <sha> → <environment/provider>137### Result: STABLE | ROLLED BACK | HOTFIXED | BLOCKED138### Evidence139- deploy: <log/status>140- revision live: <how confirmed> = <sha>141- smoke: <flows> → <result + artifacts>142- monitoring: <window> → error rate <x>, latency <y>, crash-free <z>143### Rollback/hotfix (if any)144- trigger: <threshold crossed> → action: <what ran> → outcome145### Follow-ups146- none | <tracked item>147```148149Completion level is **deployed-verified** after Phase 3 and **observed-stable**150only after Phase 4 passes. Do not claim stability from a single smoke test.151152## Related153154- `deploy-verify` — the post-deploy smoke methodology this skill builds on155- `deploy-npm` — for npm package releases (not app deployments)156- `full-stack-ship-discipline` — backend must deploy and be verified too157- `iterate-post-launch` — turn observed production signals into the next fixes158- `workflow-feedback-to-closure` — route rollback/incident findings into tickets159- `verification-before-completion` — deployed-verified vs observed-stable levels