Commit 1ebd52e
feat(updater): floor the dev channel to stable so dev never falls behind (#20)
* docs(updater): design spec for flooring dev channel to stable
Guarantees the rolling dev updater channel never falls behind the stable
channel. Floors dev to stable at release time by copying the (channel-agnostic)
stable manifest into the dev path when stable is newer - no rebuild.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0137BoWLRRPzC9XqA14KHyFU
* docs(updater): revise dev-floor spec after codex review
Codex flagged that a release.yml-only floor is leaky:
- a stale in-flight dev build can redeploy below-stable (separate concurrency)
- deploy-landing.yml redeploys the whole site and can undo the floor
- macOS manual-download link keys off the dev channel, sending floored dev
users to the stale /tag/dev release
Revisions: floor before every whole-site driven-updates deploy (release.yml,
dev-channel.yml, deploy-landing.yml); add a local hard-gate assertion (remote
smoke becomes secondary); harden comparePrecedence (strip leading v); fix the
macOS About.vue link to follow the offered version shape.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0137BoWLRRPzC9XqA14KHyFU
* feat(updater): floor the dev channel to stable so dev never falls behind
The rolling dev updater channel could advertise a version BELOW stable: dev
versions self-correct only on a dev build, so a stable release with no following
dev build left dev pointing at an older version (observed: stable 0.2.0, dev
0.1.1-dev.24), stranding dev-channel users.
A Tauri update manifest body is channel-agnostic (the channel lives only in the
path; the url points at permanent tag assets; both channels share one updater
key), so flooring dev to stable is just copying the stable manifest into the dev
path. scripts/floor-dev-channel.mjs does this per target (copy when stable is
newer, seed when dev is absent, keep when dev is ahead) and asserts dev>=stable
on the LOCAL tree before deploy - a hard gate immune to Pages propagation lag.
Per codex review, the floor runs before EVERY whole-site driven-updates deploy,
not just release.yml: release.yml, dev-channel.yml (closes the stale in-flight
dev-build race across concurrency groups), and deploy-landing.yml (a landing
redeploy can't undo the floor). release.yml's post-deploy smoke also checks
dev>=stable as a secondary eventual verification.
Also fixes the macOS manual-download link (About.vue): it now follows the
offered VERSION shape, so a floored dev user (clean 0.2.0 on the dev channel) is
sent to /releases/latest (which has the assets), not the stale /tag/dev.
Tests: comparePrecedence (SemVer 11, leading-v + all-numeric-SHA tolerant),
floorChannel (floor/keep/seed/missing-stable), assertFloored, and the macOS
link cases. Design: docs/superpowers/specs/2026-06-25-dev-channel-floor-design.md.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0137BoWLRRPzC9XqA14KHyFU
* fix(updater): harden floor + sync spec after codex impl review
Codex review of the implementation found no P1; addressing the P2s:
- floor-dev-channel.mjs now validates the stable manifest's serveable shape
(non-empty platforms with url + signature) before copying it into dev, so a
malformed stable manifest is never propagated to a second channel. Adds a test.
- Spec sync: drop the never-implemented --stable-version flag (the floor reads
each target's stable version from --stable-dir uniformly), document the --ge
compare mode and the shape validation, and correct the macOS link target to
/releases/latest (intentional: always-current, matches the existing stable
path) rather than /tag/v<version>.
Full ui vitest suite green (181 tests).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0137BoWLRRPzC9XqA14KHyFU
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>1 parent 83097f3 commit 1ebd52e
8 files changed
Lines changed: 895 additions & 8 deletions
File tree
- .github/workflows
- docs/superpowers/specs
- scripts
- ui/src
- __tests__
- views
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
68 | 68 | | |
69 | 69 | | |
70 | 70 | | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
71 | 82 | | |
72 | 83 | | |
73 | 84 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
405 | 405 | | |
406 | 406 | | |
407 | 407 | | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
| 412 | + | |
| 413 | + | |
| 414 | + | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
408 | 421 | | |
409 | 422 | | |
410 | 423 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
273 | 273 | | |
274 | 274 | | |
275 | 275 | | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
276 | 289 | | |
277 | 290 | | |
278 | 291 | | |
| |||
330 | 343 | | |
331 | 344 | | |
332 | 345 | | |
333 | | - | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
334 | 373 | | |
335 | 374 | | |
336 | 375 | | |
| |||
Lines changed: 223 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
0 commit comments