Skip to content

Commit 9fdcdbf

Browse files
authored
Merge pull request #286 from OpenKnots/okcode/release-stability-checklist
Add pre-release release validation checklist
2 parents 5e8e9e0 + 773dfd9 commit 9fdcdbf

7 files changed

Lines changed: 949 additions & 3 deletions

File tree

docs/release.md

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,16 @@ bun run release:smoke
6262

6363
`bun run lint` is a zero-warning gate.
6464

65+
### Pre-release validation
66+
67+
Run the comprehensive pre-release validator before cutting any RC or promoting to stable:
68+
69+
```bash
70+
bun run release:validate <version>
71+
```
72+
73+
This checks documentation completeness, version alignment, git state, iOS project version, and optionally runs all quality gates. Use `--skip-quality` for a docs-only pass or `--ci` for CI pipelines.
74+
6575
## Platform matrix
6676

6777
Blocking stable matrix:
@@ -127,9 +137,12 @@ Before tagging:
127137
- `CHANGELOG.md`
128138
- `docs/releases/vX.Y.Z.md`
129139
- `docs/releases/vX.Y.Z/assets.md`
130-
3. Confirm Apple signing/notarization secrets.
131-
4. Confirm Windows signing secrets.
132-
5. Confirm `NODE_AUTH_TOKEN`, `RELEASE_APP_ID`, and `RELEASE_APP_PRIVATE_KEY`.
140+
- `docs/releases/vX.Y.Z/rollout-checklist.md` (version-specific rollout playbook)
141+
- `docs/releases/vX.Y.Z/soak-test-plan.md` (version-specific soak test cases)
142+
3. Run `bun run release:validate <version>` and fix any failures.
143+
4. Confirm Apple signing/notarization secrets.
144+
5. Confirm Windows signing secrets.
145+
6. Confirm `NODE_AUTH_TOKEN`, `RELEASE_APP_ID`, and `RELEASE_APP_PRIVATE_KEY`.
133146

134147
## RC soak rules
135148

docs/releases/v0.16.0.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ Right-panel diff review, editable code previews, stronger branch/worktree handli
2828
- **Desktop:** Download from [GitHub Releases](https://github.com/OpenKnots/okcode/releases/tag/v0.16.0). This release includes signed macOS arm64/x64 DMGs, Linux x64 AppImage, and Windows x64 NSIS installer. Filenames are listed in [assets.md](v0.16.0/assets.md).
2929
- **iOS:** Available via TestFlight (uploaded automatically by the coordinated release workflow).
3030

31+
## Rollout
32+
33+
See the [rollout checklist](v0.16.0/rollout-checklist.md) for the step-by-step release playbook and [soak test plan](v0.16.0/soak-test-plan.md) for structured RC validation test cases.
34+
3135
## Known limitations
3236

3337
OK Code remains early work in progress. Keep an eye on reconnect behavior, long-running stream recovery, and platform-specific desktop packaging edge cases during RC soak and stable promotion.

docs/releases/v0.16.0/assets.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,13 @@ The iOS build is uploaded directly to App Store Connect / TestFlight by the [Rel
4545
| Marketing version | `0.16.0` |
4646
| Build number | Set from `GITHUB_RUN_NUMBER` at build time |
4747

48+
## Rollout documentation
49+
50+
| Document | Purpose |
51+
| -------- | ------- |
52+
| [rollout-checklist.md](rollout-checklist.md) | Step-by-step release playbook (pre-flight through post-release) |
53+
| [soak-test-plan.md](soak-test-plan.md) | Structured 48-hour RC soak test cases |
54+
4855
## Checksums
4956

5057
SHA-256 checksums are not committed here; verify downloads via GitHub's release UI or `gh release download` if you use the GitHub CLI.
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
# v0.16.0 Rollout Checklist
2+
3+
Step-by-step playbook for the v0.16.0 release. Each phase must complete before advancing to the next.
4+
5+
## Phase 0: Pre-flight (before tagging)
6+
7+
- [ ] Verify all package versions are `0.16.0`:
8+
- `apps/server/package.json`
9+
- `apps/desktop/package.json`
10+
- `apps/web/package.json`
11+
- `apps/mobile/package.json`
12+
- `packages/contracts/package.json`
13+
- [ ] Verify iOS `MARKETING_VERSION` matches in `project.pbxproj`.
14+
- [ ] Confirm `CHANGELOG.md` has `## [0.16.0] - 2026-04-05` entry.
15+
- [ ] Confirm `docs/releases/v0.16.0.md` exists with Summary, Highlights, Upgrade sections.
16+
- [ ] Confirm `docs/releases/v0.16.0/assets.md` exists with all artifact tables.
17+
- [ ] Confirm `docs/releases/README.md` includes v0.16.0 row.
18+
- [ ] Run the pre-release validator:
19+
```bash
20+
node scripts/pre-release-validate.ts 0.16.0
21+
```
22+
- [ ] Confirm the working tree is clean (`git status --porcelain` is empty).
23+
- [ ] Confirm you are on the `main` branch.
24+
25+
### Secrets verification
26+
27+
- [ ] Apple signing certificate (`CSC_LINK`, `CSC_KEY_PASSWORD`) is current and not expired.
28+
- [ ] Apple notarization API key (`APPLE_API_KEY`, `APPLE_API_KEY_ID`, `APPLE_API_ISSUER`) is valid.
29+
- [ ] Windows Azure Trusted Signing secrets are configured:
30+
- `AZURE_TENANT_ID`, `AZURE_CLIENT_ID`, `AZURE_CLIENT_SECRET`
31+
- `AZURE_TRUSTED_SIGNING_ENDPOINT`, `AZURE_TRUSTED_SIGNING_ACCOUNT_NAME`
32+
- `AZURE_TRUSTED_SIGNING_CERTIFICATE_PROFILE_NAME`, `AZURE_TRUSTED_SIGNING_PUBLISHER_NAME`
33+
- [ ] iOS signing (`IOS_CERTIFICATE_P12`, `IOS_CERTIFICATE_PASSWORD`, `IOS_PROVISIONING_PROFILE`) is valid.
34+
- [ ] `NODE_AUTH_TOKEN` (npm) is active.
35+
- [ ] `RELEASE_APP_ID` and `RELEASE_APP_PRIVATE_KEY` (GitHub App for finalize) are set.
36+
37+
### Quality gates
38+
39+
All seven gates must pass with zero warnings:
40+
41+
- [ ] `bun run fmt:check`
42+
- [ ] `bun run lint`
43+
- [ ] `bun run typecheck`
44+
- [ ] `bun run test`
45+
- [ ] `bun run --cwd apps/web test:browser`
46+
- [ ] `bun run test:desktop-smoke`
47+
- [ ] `bun run release:smoke`
48+
49+
## Phase 1: Cut the RC
50+
51+
- [ ] Run the release preparation script:
52+
```bash
53+
node scripts/prepare-release.ts 0.16.0-rc.1 \
54+
--full-matrix \
55+
--summary "Right-panel diff review, editable code previews, stronger branch handling, and a more stable release train"
56+
```
57+
- [ ] Verify the `v0.16.0-rc.1` tag was created and pushed.
58+
- [ ] Verify `release.yml` workflow was triggered:
59+
- Actions URL: https://github.com/OpenKnots/okcode/actions/workflows/release.yml
60+
- [ ] Monitor the six-job pipeline:
61+
1. `Preflight` — quality gates
62+
2. `Desktop macOS arm64` — signed/notarized DMG
63+
3. `Desktop Linux x64` — AppImage
64+
4. `Desktop Windows x64` — signed NSIS installer
65+
5. `iOS TestFlight` — archive and upload
66+
6. `Publish CLI` — npm publish with `next` tag
67+
7. `Publish GitHub Release` — prerelease with all artifacts
68+
8. `Finalize` — version bump commit to main
69+
70+
### Artifact verification (RC)
71+
72+
- [ ] macOS arm64: Download DMG, verify Gatekeeper opens it without warning.
73+
- [ ] Linux x64: Download AppImage, verify it launches.
74+
- [ ] Windows x64: Download installer, verify it installs and launches.
75+
- [ ] CLI: `npx okcodes@0.16.0-rc.1 --version` returns `0.16.0-rc.1`.
76+
- [ ] CLI: `npx okcodes@0.16.0-rc.1 --help` renders help text.
77+
- [ ] CLI: `npx okcodes@0.16.0-rc.1 doctor --help` renders doctor help.
78+
- [ ] iOS: TestFlight build appears in App Store Connect within 30 minutes.
79+
- [ ] GitHub Release: Prerelease flag is set, "latest" flag is not set.
80+
- [ ] GitHub Release: All expected artifacts are attached (DMGs, AppImage, EXE, YMLs, blockmaps, docs).
81+
82+
## Phase 2: RC Soak (48 hours)
83+
84+
Start: ____-__-__T__:__Z
85+
End: ____-__-__T__:__Z
86+
87+
### Soak exit criteria
88+
89+
- [ ] No Sev-1 or Sev-2 issues filed during soak period.
90+
- [ ] No crash-on-launch on macOS arm64, Windows x64, or Linux x64.
91+
- [ ] Updater verification: Install v0.15.0 desktop app, verify it detects and applies the v0.16.0-rc.1 update.
92+
- [ ] TestFlight install succeeds on at least one device.
93+
- [ ] `npx okcodes@0.16.0-rc.1 --version` still works at end of soak.
94+
95+
### Feature-specific soak testing (v0.16.0)
96+
97+
These checks validate the high-risk surface area introduced in this release:
98+
99+
- [ ] **Right-panel diff viewer**: Open a thread with file changes, verify diffs render in the right panel. Toggle between files. Verify panel defaults and opening behavior.
100+
- [ ] **Editable code preview**: Open a code preview, make edits, verify autosave persists. Reload the app, verify edits survived.
101+
- [ ] **Rebase-before-commit flow**: Create a branch that has diverged from main. Trigger commit with rebase enabled. Verify conflicts are surfaced if they exist. Verify clean rebase completes.
102+
- [ ] **GitHub repo cloning**: Clone a public repo via the entry point. Clone a private repo (verify auth flow). Verify the cloned repo opens in a thread.
103+
- [ ] **Provider session restart on CWD change**: Start a session, then switch the active worktree. Verify the provider session restarts cleanly without user intervention.
104+
- [ ] **Shell env sanitization**: Set unusual environment variables (e.g., modified `PATH`, `NODE_OPTIONS`). Launch an agent session. Verify the session starts without inheriting unsafe env.
105+
- [ ] **Build metadata**: Verify the web UI displays the correct build version and commit hash. Verify the server reports matching metadata.
106+
107+
### iOS TestFlight device checks
108+
109+
Run on two devices: one current-generation and one older-generation supported device.
110+
111+
Device 1: ______________ (iOS __.__)
112+
Device 2: ______________ (iOS __.__)
113+
114+
- [ ] Pair the mobile companion with a desktop/server instance.
115+
- [ ] Restore a previously saved pairing.
116+
- [ ] Open a thread and send a follow-up message.
117+
- [ ] Approve an action and answer a user-input request.
118+
- [ ] Background the app, wait 30 seconds, foreground it.
119+
- [ ] Receive a notification and tap it to return to the thread.
120+
121+
### If soak fails
122+
123+
If any blocker is found during the soak period:
124+
1. Fix the issue on `main`.
125+
2. Cut `v0.16.0-rc.2` with the fix included.
126+
3. Restart the 48-hour soak from the beginning.
127+
4. Do NOT promote a failed RC to stable.
128+
129+
## Phase 3: Promote to Stable
130+
131+
Only after the 48-hour soak completes with all exit criteria met.
132+
133+
- [ ] Verify the RC commit is the same commit that will be promoted (no new commits needed).
134+
- [ ] Run the promotion:
135+
```bash
136+
node scripts/prepare-release.ts 0.16.0 \
137+
--full-matrix \
138+
--summary "Right-panel diff review, editable code previews, stronger branch handling, and a more stable release train"
139+
```
140+
- [ ] Verify the `v0.16.0` tag was created on the same commit as `v0.16.0-rc.1`.
141+
- [ ] Monitor all six workflow jobs to completion.
142+
143+
### Artifact verification (stable)
144+
145+
- [ ] macOS arm64 DMG: Launches, Gatekeeper passes.
146+
- [ ] Linux x64 AppImage: Launches.
147+
- [ ] Windows x64 installer: Installs and launches.
148+
- [ ] CLI: `npm install -g okcodes@0.16.0` succeeds.
149+
- [ ] CLI: `okcodes --version` returns `0.16.0`.
150+
- [ ] iOS: New TestFlight build appears.
151+
- [ ] GitHub Release: "latest" flag is set, prerelease flag is not set.
152+
- [ ] GitHub Release: Release notes body matches `docs/releases/v0.16.0.md`.
153+
- [ ] Updater: v0.15.0 desktop app detects and applies the v0.16.0 stable update.
154+
155+
## Phase 4: Post-release
156+
157+
- [ ] Verify `finalize` job pushed version bump commit to `main`.
158+
- [ ] Verify `main` branch has `chore(release): prepare v0.16.0` commit.
159+
- [ ] Trigger Intel compatibility build (optional, non-blocking):
160+
```bash
161+
gh workflow run release-intel-compat.yml -f version=0.16.0
162+
```
163+
- [ ] Update any external documentation or announcements referencing the new version.
164+
- [ ] Close any GitHub issues resolved by this release.
165+
- [ ] Monitor error reporting and community channels for 24 hours post-release.
166+
167+
## Timeline
168+
169+
| Phase | Duration | Starts after |
170+
| ----- | -------- | ------------ |
171+
| Pre-flight | ~30 min | Decision to release |
172+
| Cut RC | ~45 min | Pre-flight passes |
173+
| RC Soak | 48 hours | All RC artifacts verified |
174+
| Promote to stable | ~45 min | Soak exit criteria met |
175+
| Post-release monitoring | 24 hours | Stable artifacts verified |
176+
177+
Total time from decision to stable: ~3 days minimum.

0 commit comments

Comments
 (0)