chore: adopt production as the gated release source (closes #152)#194
chore: adopt production as the gated release source (closes #152)#194cofade wants to merge 2 commits into
Conversation
|
@schutera — this PR is a policy/governance change and needs your explicit approval, not just a code review. The decision you're approvingFrom now on, all production releases — web services and firmware OTA — ship from the If you'd rather keep deploying from Two operator steps that are yours (can't be done from this PR)These need push access to
Status of the PR itself
🤖 Generated with Claude Code |
Reconcile the documented services deploy source with reality and unify it with firmware OTA on a single gated `production` branch. Investigation for #152 found three stacked problems: the docs named `production` while the live auto-deploy pulled `main`; firmware OTA and the services track were documented as separate; and `main`/`production` shared no common git ancestor (main's history was rebuilt), so `production` could never fast-forward and silently rotted. Decision (per maintainer): `production` becomes the single gated release branch for both web services and firmware OTA. `main` is the integration line; a release is a fast-forward of `production` onto a chosen `main` commit. `prod-*` tags are cut on `production`. - scripts/deploy.sh: BRANCH main -> production; branch-agnostic notify text - production-deployment.md: drop drift warning; add release/promotion + one-time host cutover section - production-runbook.md: document the promote-then-pull model - firmware-release.md: rewrite the branch & tag model (both tracks on production); replace the "known drift" callout with a history note; update the release-checklist commit/tag step - chapter 11: mark the drift lesson RESOLVED; record the unrelated-history root cause and the fast-forwardable-deploy-branch rule - new ADR-028; update README/esp-flashing/CLAUDE.md pointers The branch reconciliation (archive tag + force-reset of origin/production) and the one-time prod-host checkout are operator steps documented in ADR-028 and production-deployment.md, to run after this lands on main. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017drgAN84qrn61eZ1yZTdgS
The production-as-gated-release-branch model (#152 / ADR-030) was only spelled out in the firmware-OTA section. Add a concise hard rule to the top-level "Critical rules (do NOT violate)" list so every session knows prod releases ship from `production`, never from `main`. Links to the full mechanics rather than duplicating them. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
c0981d1 to
ebfde09
Compare
@schutera — this implements the decision you approved for #152:
productionbecomes the future release source.What changed
scripts/deploy.sh:BRANCH="main"→"production"; branch-agnostic notify text; firmware-publish +prod-*tags now rideproduction; success notify reminds operators to merge an auto-bump back tomain(cherry-pick won't restore fast-forwardability)..deploy.env.example: descriptions/comments updated frommaintoproduction.production-deployment.md,production-runbook.md,firmware-release.md, ch7README.md,esp-flashing.md,CLAUDE.md): rewritten to one coherent model —productionis the single gated release branch for both web services and firmware OTA;mainis the integration line; a release is a fast-forward ofproductiononto a chosenmaincommit. Added a release/promotion workflow + one-time host cutover; corrected the Docker-vs-PM2 attribution (scripts/deploy.shis the bare-metal PM2 path — no Docker).productioncould never fast-forward → silent drift) and the fast-forwardable-deploy-branch rule.Why
Investigation for #152 found the documented services deploy source (
production) didn't match reality (the livescripts/deploy.shtimer pulledmain), firmware OTA and services were documented as separate tracks, and — the root cause —mainandproductionshared no common git ancestor (main's history was rebuilt 2026-05-21), soproductionwas structurally unable to fast-forward and silently rotted. This change reconciles all of that into a single gatedproductionrelease branch carrying both tracks. Addresses #152.How tested
pio test -e native)pytest tests/e2e)No unit/e2e layer exercises deploy-branch configuration. Ran
bash -n scripts/deploy.sh(clean) andmake check-citations(7 OK, 0 problems). Passed three rounds of thesenior-reviewergate (final: clean, no P0/P1). The live deploy cutover is an operator step and cannot be exercised from CI — see the operator steps above.Checklist
bash -n+make check-citations+ review gate.prod-*tags now cut onproduction.🤖 Generated with Claude Code
https://claude.ai/code/session_017drgAN84qrn61eZ1yZTdgS
Generated by Claude Code