Files
wadamesh/RELEASE_CHANNELS.md
T
Kaj SchittecatandClaude Opus 4.8 03e50b0609 touch: beta_21 — first stable build + test channel, MQTT bridge, contacts & signal-probe fixes
New: stable/test update channels with an opt-in "Get test builds (beta)" toggle on
OTA devices (switches both the update check and what you install); experimental
opt-in MQTT bridge (consent-gated, payload encryption, direct messages off by
default); Portugal (Narrow) region preset (#74); saved-contacts counter in the
Contacts overflow menu (#72).

Fixed: the signal probe is now strictly zero-hop so a repeater can't re-flood it;
the contact list sorts before capping so the most relevant contacts show, with a
"+N more — search to narrow" footer (#73); the blocked-users list opened from
Contacts shows the two-line title bar with a back button; the Contacts overflow
popup fits the screen again.

Also lands the two-channel release tooling (scripts/release.sh stable/beta modes +
gen-flasher-meta channel arg), the docs site, and the MQTT reference decryptor.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 17:34:11 +02:00

95 lines
5.3 KiB
Markdown

# WadaMesh release channels — Stable + Test
Goal: ship **test** builds to the community fast, let them shake out, then **promote**
a proven test build to **stable**. What ships to stable is exactly what was tested
(promote the binary, don't rebuild).
## Two concepts, kept separate
- **Branches** = where code lives.
- **Channels** = what a device / the flasher pulls (Stable vs Beta).
## Branches
- **`main`** — active line. All work lands here; every *test* release is cut from `main`. (Unchanged from today.)
- **`stable`** — promoted line. Moves only when a test build is blessed. Starts at the **beta_20** commit.
- Promote = `git branch -f stable <blessed beta commit>` + push, then run the stable-promotion publish.
## Versioning / tags
- **Test builds:** `beta_N` (immutable, incrementing), marked **GitHub pre-release**. Also mirrored to a rolling **`beta-latest`** pre-release (overwritten each time) for the Launcher beta sync.
- **Stable:** the blessed `beta_N`, marked **GitHub Latest**. Keep the `beta_N` id for now; friendly `vX.Y` names are an optional later polish (would need a rebuild-with-tag per promotion).
- First stable = **beta_20**.
## Distribution matrix
| Target | Stable | Test / Beta |
|---|---|---|
| GitHub release | blessed `beta_N`, marked **Latest** | every `beta_N`, **pre-release** + rolling `beta-latest` |
| VPS archive | `releases/TOUCH/<beta_N>/` (only blessed lands here) | `releases/BETA/<beta_N>/` |
| VPS channel feed | `stable/` (version.json + bins) | `beta/` (version.json + bins) |
| Flasher (flasher.wadamesh.com) | default | "Beta / testing" toggle |
| On-device update check | stable feed (legacy firmware reads `releases/TOUCH`) | beta feed (Phase 2 setting) |
| LauncherHub (bmorcelli, T-Deck) | existing entry (follows GitHub Latest) | new "WadaMesh (Beta)" entry (Phase 3) |
| Tanmatsu app-store | promote on stable only | (skipped for tests) |
## The linchpin: keeping field devices on stable
Legacy firmware's update check scans `releases/TOUCH/` for the highest `beta_N`. So:
- **Test builds archive under `releases/BETA/`** — invisible to legacy firmware.
- **Promotion copies the blessed build into `releases/TOUCH/`** — legacy devices then see it and show "update available," landing everyone on stable.
Net effect: existing devices quietly settle on **stable (beta_20)** and stop chasing
every beta; beta testers opt in via the flasher Beta toggle (or, later, the on-device
Beta channel).
## Two workflows
### Cut a TEST release (fast, frequent) — from `main`
1. `beta_N` = next number.
2. Build both touch envs with the tag embedded.
3. GitHub: create `beta_N` release **`--prerelease`** with the 7 assets; also refresh the rolling `beta-latest` pre-release.
4. VPS: rsync to `releases/BETA/<beta_N>/` + refresh the `beta/` feed.
5. Flasher Beta toggle now serves it. Skip LauncherHub / Tanmatsu / site. (~minutes)
### Promote to STABLE (deliberate, when proven)
1. `git branch -f stable <beta_N commit>` + push.
2. GitHub: mark that `beta_N` release **Latest** (clear pre-release).
3. VPS: copy `releases/BETA/<beta_N>/` → `releases/TOUCH/<beta_N>/`; refresh `stable/` + `latest/` (flasher stable) feeds.
4. Full fan-out: LauncherHub follows automatically; push the Tanmatsu store; bump the site "what's new."
## Phases
### Phase 1 — channel split, no firmware change (do now)
- [ ] Create + push `stable` branch at beta_20.
- [ ] VPS: stand up `stable/`, `beta/`, `releases/BETA/`; point `latest/` (flasher stable) at beta_20; freeze `releases/TOUCH/` at beta_20.
- [ ] GitHub: ensure beta_20 is **Latest**; future betas → `--prerelease`.
- [ ] Flasher: Stable (default) / Beta toggle + the beta manifest.
- [ ] `release.sh` / `gen-flasher-meta.py`: add `--channel beta|stable` producing the right feed/assets + the rolling `beta-latest`.
- [ ] Rewrite the `wadamesh-release` skill into the two-workflow form.
### Phase 2 — on-device channel selector (ships in a beta, then promoted)
- [ ] Settings → **Update channel: Stable / Beta**, default Stable (persisted).
- [ ] `verchkFetchLatest` reads the `stable/` or `beta/` feed per the setting.
- [ ] Beta devices get the new-beta banner automatically; stable devices never see betas.
### Phase 3 — LauncherHub beta listing (PR to bmorcelli, when wanted)
- [ ] Rolling `beta-latest` already produced in Phase 1.
- [ ] PR `bmorcelli/M5Stack-json-fw`: add a `wadamesh_beta.py` (mirror `bruce_beta.py`, track `beta-latest`) + a `t-deck.json` (Beta) entry.
- [ ] Result: T-Deck Launcher shows **WadaMesh** + **WadaMesh (Beta)**, both auto-synced.
- Until then: T-Deck Launcher beta testers side-load the beta `.bin` manually (it is a T-Deck-only gap; V4 uses the flasher).
## Where current work lands
- The uncommitted post-beta_20 work (auto-advert GUI, message-flash, docs, RAM pass)
plus the hardened **MQTT-privacy** branch → commit to `main` → cut as **beta_21**,
the first TEST release in this model. Community tests it; promote when proven.
- This is exactly the model that handles PR #71: land the reviewed/hardened pieces on
`main`, ship as a beta, promote later.
## Decisions
- **Locked:** `main` + `stable`; keep `beta_N` ids with a Stable/Beta channel label; Phase 1 now, Phase 2 in beta_21, Phase 3 as a fast-follow.
- **Open (reversible):** whether stable later gets friendly `vX.Y` names (needs a rebuild-with-tag per promotion).