You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Document Flex firmware ex* coordination and add strategy pages.
Align go, validate-release-tags, and release guides with oe-core build-refs
mapping (stack v* to firmware ex* plus integer vN), and publish coordinated
tagging and beta-then-alpha sequencing docs with centered site nav.
Copy file name to clipboardExpand all lines: .cursor/rules/robot-stack.mdc
+10-9Lines changed: 10 additions & 9 deletions
Original file line number
Diff line number
Diff line change
@@ -78,23 +78,24 @@ External tags use a `v` prefix; internal tags use `internal@`.
78
78
| **Flex external** | `chore_release-<version>` when present, else default branch | Highest `chore_release-X.Y.Z` on `opentrons`, fallback latest `v*` tag base |
79
79
| **OT-2 internal / external** | Default branch HEAD (`opentrons-ot2`: `edge`, `buildroot`: `opentrons-develop`) | Calendar semver for app + internal (`YY.M.DNN` internal, `YY.M.N` external app); buildroot external patch bump from latest traditional `v*` tag |
80
80
81
-
Internal tags: `ot3@` / `v*` on **all three** Flex repos (`opentrons`, `oe-core`, `ot3-firmware`) for coordinated releases. OT-2 app and buildroot share `internal@` calendar tags. OT-2 external app uses calendar `vYY.M.N`; buildroot external uses independent traditional `vX.Y.Z`.
81
+
Internal tags: coordinated `ot3@` / `v*` on `opentrons` and `oe-core`. `ot3-firmware` uses the same `ot3@*` internally; external stack `v*` maps to `ex*` on firmware plus integer `vN` on the same commit. OT-2 app and buildroot share `internal@` calendar tags. OT-2 external app uses calendar `vYY.M.N`; buildroot external uses independent traditional `vX.Y.Z`.
82
82
83
83
### Flex semver tagging
84
84
85
-
Flex uses **coordinated tags**: the same tag on `opentrons`, `oe-core`, and `ot3-firmware`. In `just go`, Flex prompts for **Stability: stable/alpha/beta** (legacy `unstable` maps to `alpha`).
85
+
Flex uses **coordinated stack tags**on `opentrons`and `oe-core`. In `just go`, Flex prompts for **Stability: stable/alpha/beta** (legacy `unstable` maps to `alpha`).
| `oe-core` (robot OS) | same coordinated tag as app | same coordinated tag as app |
91
-
| `ot3-firmware` | same coordinated tag as app | same coordinated tag as app |
90
+
| `oe-core` (robot OS) | same stack tag as app | same stack tag as app |
91
+
| `ot3-firmware` | same `ot3@*` as app + integer `vN` | `exX.Y.Z…` (from stack `v*`) + integer `vN` |
92
92
93
93
Tag suggestion rules in `automation/go.py`:
94
94
95
95
- **App (`opentrons`):** base `X.Y.Z` comes from the prompted release version. Stable: `ot3@X.Y.Z` / `vX.Y.Z` if missing, else patch bump. Alpha/beta: increment prerelease `.N` from branch tags.
96
-
- **Robot OS (`oe-core`) and firmware (`ot3-firmware`):** same tag as the app. Retag unchanged commits when a repo did not change.
97
-
- **Before pushing the app tag:** run `just validate-release-tags --tag <app-tag>` to confirm all three local clones have the tag. `oe-core` `build-refs` also requires the matching tag on each repo for tag dispatches (no `:latest:` fallback).
96
+
- **Robot OS (`oe-core`):** same stack tag as the app. Retag unchanged commits when the repo did not change.
97
+
- **Firmware (`ot3-firmware`):** coordination tag is `ot3@*` (internal) or `ex*` mapped from stack `v*` (external). Integer `vN` is globally unique in the firmware repo; suggest a new `vN` only when the release commit does not already have one. Retag-only releases need only the coordination tag.
98
+
- **Before pushing the app tag:** run `just validate-release-tags --tag <app-tag>`. `oe-core` `build-refs` maps external stack tags to `ex*` on firmware ([PR #329](https://github.com/Opentrons/oe-core/pull/329)); missing tags fail (no `:latest:` fallback).
98
99
99
100
**Internal prerelease trains** (Flex only; OT-2 unchanged): on the same `X.Y.Z` base, **beta** (`ot3@X.Y.Z-beta.N`) serves the VM isolation train and **alpha** (`ot3@X.Y.Z-alpha.N`) serves CRS. When both channels need updates in one cycle, ship beta before alpha (beta desktop builds overwrite alpha updater YAML).
Verifies a coordinated Flex release tag exists locally in `opentrons`, `oe-core`, and `ot3-firmware`. Read-only unless `--fetch` (runs `git fetch --tags` in each clone).
264
+
Verifies coordinated Flex release tags locally. Checks stack tags on `opentrons` and `oe-core`, the mapped coordination tag on `ot3-firmware` (`ex*` for external stack `v*`, same `ot3@*` for internal), and an integer `vN` version tag on the same firmware commit. Read-only unless `--fetch` (runs `git fetch --tags` in each clone).
264
265
265
266
| Flag | Purpose |
266
267
|---|---|
267
-
| `--tag` | Release tag to verify (required; e.g. `ot3@8.5.0-beta.0`, `v10.0.0-alpha.0`) |
268
+
| `--tag` | Stack release tag (required; e.g. `ot3@8.5.0-beta.0`, `v10.0.0-alpha.0`) |
268
269
| `--fetch` | Fetch tags from origin before checking |
269
270
270
-
**Exit codes:** `0` if tag present in all three repos; `1` if any missing or fetch fails.
271
+
**Exit codes:** `0` if all checks pass; `1` if any missing or fetch fails.
Copy file name to clipboardExpand all lines: README.md
+24-5Lines changed: 24 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -14,7 +14,7 @@ Prompt Cursor as above and it will walk you through the full release in order, r
14
14
15
15
1.**Plan tags** — runs `just go` to show what needs tags and the tag shape per repo.
16
16
2.**Push tags** — prints `git tag` / `git push` commands for you to run (stack repos first, app last).
17
-
3.**Validate coordinated tags (Flex)** — runs `just validate-release-tags` to confirm the same tag exists in `opentrons`, `oe-core`, and `ot3-firmware` before you push the app tag.
17
+
3.**Validate coordinated tags (Flex)** — runs `just validate-release-tags` to confirm stack tags on `opentrons`/`oe-core`, the mapped `ex*`/`ot3@` coordination tag plus integer `vN` on `ot3-firmware`, before you push the app tag.
18
18
4.**Track builds** — runs `just track-builds` after the app tag is pushed to surface app, kickoff, and robot OS workflow runs.
19
19
5.**Verify builds** — reminds you to wait for CI and spot-check manifests if needed.
20
20
6.**Invalidate CDN** — runs `just invalidate-cloudfront` to print the exact `aws cloudfront create-invalidation` command (distribution and paths) for your tag and channel.
@@ -79,15 +79,34 @@ Push annotated tags in this order. Stack repos first, app monorepo last.
79
79
80
80
### Flex semver (coordinated tags)
81
81
82
-
Flex releases use the **same tag** on `opentrons`, `oe-core`, and `ot3-firmware`. The tag identifies which commit participated in that release, even when a stack repo did not change. Tag-based CI in `oe-core` (`build-refs`) resolves only that exact tag on each repo; missing tags fail instead of falling back to latest or default branch.
82
+
Flex releases use coordinated stack tags on `opentrons` and `oe-core`. `ot3-firmware` uses the same `ot3@*` tag internally; for external releases, semver `v*` stack tags map to `ex*` on firmware (see [oe-core PR #329](https://github.com/Opentrons/oe-core/pull/329)). Do not place semver `v*` coordination tags on `ot3-firmware`: they break cmake `git describe --match=v*`.
83
+
84
+
Every firmware release commit needs a coordination tag (`ot3@*` or `ex*`). Add a new integer **`vN` version tag** only when that commit does not already have one; `vN` must be globally unique across the firmware repo. CI checks out the coordination tag; cmake reads the co-located `vN`.
85
+
86
+
Tag-based CI in `oe-core` (`build-refs`) resolves only the expected tag on each repo; missing tags fail instead of falling back to latest or default branch.
83
87
84
88
In `just go`, Flex uses **stable**, **alpha**, or **beta** stability (legacy `unstable` maps to `alpha`). OT-2 tagging is unchanged.
git tag -a ex9.1.0-alpha.7 -m "Coordinated release marker"
102
+
git push origin v70 ex9.1.0-alpha.7
103
+
104
+
# opentrons / oe-core:
105
+
git tag -a v9.1.0-alpha.7 -m "Coordinated release marker"
106
+
git push origin v9.1.0-alpha.7
107
+
```
108
+
109
+
**Internal firmware example** (stack `ot3@4.0.0-beta.0`): same `ot3@*` on all three repos plus `vN` on firmware.
91
110
92
111
**Internal prerelease trains** (same `X.Y.Z` base, different stability suffix):
93
112
@@ -100,7 +119,7 @@ Pair beta then alpha when both channels need updates in the same cycle: beta des
100
119
101
120
Before pushing the app tag, run `just validate-release-tags --tag <app-tag>`. `go` prints this in the Next steps panel.
102
121
103
-
**Example (June 2026):** recent internal alphas used base `4.0.0` (`ot3@4.0.0-alpha.3` is the latest). The first coordinated internal release on that line is **`ot3@4.0.0-beta.0`** on all three repos.
122
+
**Example (June 2026):** recent internal alphas used base `4.0.0` (`ot3@4.0.0-alpha.3` is the latest). The first coordinated internal release on that line is **`ot3@4.0.0-beta.0`** on opentrons/oe-core, plus **`ot3@4.0.0-beta.0`** and the next **`vN`** on firmware.
104
123
105
124
```bash
106
125
just go --non-interactive --skip-assumptions --path flex --release-type internal --stability beta --version v4.0.0
0 commit comments