Repository navigation
docs(skill): add versioning policy #692
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,32 @@ | ||
| # Decision: Versioning Policy — No Prerelease Versions on dev/main | ||
|
|
||
| **By:** Flight (Lead) | ||
| **Date:** 2026-03-29 | ||
| **Requested by:** Dina | ||
| **Status:** DECIDED | ||
| **Confidence:** Medium (confirmed by PR #640 incident, PR #116 prerelease leak, CI gate implementation) | ||
|
|
||
| ## Decision | ||
|
|
||
| 1. **All packages use strict semver** (`MAJOR.MINOR.PATCH`). No prerelease suffixes on `dev` or `main`. | ||
| 2. **Prerelease versions are ephemeral.** `bump-build.mjs` creates `-build.N` for local testing only — never committed. | ||
| 3. **SDK and CLI versions must stay in sync.** Divergence silently breaks npm workspace resolution. | ||
| 4. **Surgeon owns version bumps.** Other agents must not modify `version` fields in `package.json` unless fixing a prerelease leak. | ||
| 5. **CI enforcement via `prerelease-version-guard`** blocks PRs with prerelease versions. `skip-version-check` label is Surgeon-only. | ||
|
|
||
| ## Why | ||
|
|
||
| The repo had no documented versioning policy. This caused two incidents: | ||
|
|
||
| - **PR #640:** Prerelease version `0.9.1-build.4` silently broke workspace resolution. The semver range `>=0.9.0` does not match prerelease versions, causing npm to install a stale registry package instead of the local workspace link. Four PRs (#637–#640) patched symptoms before the root cause was found. | ||
| - **PR #116:** Surgeon set versions to `0.9.1-build.1` instead of `0.9.1` on a release branch because there was no guidance on what constitutes a clean release version. | ||
|
|
||
| ## Skill Reference | ||
|
|
||
| Full policy documented in `.squad/skills/versioning-policy/SKILL.md`. | ||
|
|
||
| ## Impact | ||
|
|
||
| - All agents must follow the versioning policy when touching `package.json` | ||
| - Surgeon charter should reference this skill for release procedures | ||
| - CI pipeline enforces the policy via automated gate | ||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,119 @@ | ||||||||||||||||||||||||||||
| --- | ||||||||||||||||||||||||||||
| name: "versioning-policy" | ||||||||||||||||||||||||||||
| description: "Semver versioning rules for Squad SDK and CLI — prevents prerelease version incidents" | ||||||||||||||||||||||||||||
| domain: "release, versioning, npm, CI" | ||||||||||||||||||||||||||||
| confidence: "medium" | ||||||||||||||||||||||||||||
| source: "earned (PR #640 workspace resolution incident, PR #116 prerelease leak, CI gate implementation)" | ||||||||||||||||||||||||||||
| --- | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| ## Context | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| Squad is a monorepo with two publishable npm packages (`@bradygaster/squad-sdk` and `@bradygaster/squad-cli`) managed via npm workspaces. Version mismatches and prerelease leaks have caused production incidents — most notably PR #640, where a `-build.N` prerelease version silently broke workspace dependency resolution. | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| This skill codifies the versioning rules every agent must follow. | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| ## 1. Version Format | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| All packages use **strict semver**: `MAJOR.MINOR.PATCH` | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| - ✅ `0.9.1`, `1.0.0`, `0.10.0` | ||||||||||||||||||||||||||||
| - ❌ `0.9.1-build.4`, `0.9.1-preview.1`, `0.8.6.1-preview` | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| No prerelease suffixes on `dev` or `main` branches — ever. | ||||||||||||||||||||||||||||
|
Comment on lines
+17
to
+22
|
||||||||||||||||||||||||||||
| All packages use **strict semver**: `MAJOR.MINOR.PATCH` | |
| - ✅ `0.9.1`, `1.0.0`, `0.10.0` | |
| - ❌ `0.9.1-build.4`, `0.9.1-preview.1`, `0.8.6.1-preview` | |
| No prerelease suffixes on `dev` or `main` branches — ever. | |
| All packages use **strict semver** in committed `package.json` files on `dev` and `main`: `MAJOR.MINOR.PATCH` | |
| - ✅ Allowed in committed `package.json` on `dev`/`main`: `0.9.1`, `1.0.0`, `0.10.0` | |
| - ⚠️ Valid semver used **only for local testing** (never committed): `0.9.1-build.4` (see §2) | |
| - ❌ Disallowed in committed `package.json` on `dev`/`main`: `0.9.1-preview.1`, `0.8.6.1-preview` | |
| No prerelease suffixes in committed `package.json` files on `dev` or `main` branches — `-build.N` is for local-only testing (see §2). |
Copilot
AI
Mar 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Section 3 states SDK/CLI/root versions MUST always be identical and that divergence breaks workspace resolution. This contradicts the repo’s existing “independent versioning via changesets” guidance (e.g., docs/blog/017-version-alignment.md and docs/src/content/docs/guide/contributing.md) and the fact that the CLI depends on the SDK via a range (>=0.9.0), so simple divergence doesn’t inherently break workspace linking. Suggest clarifying that the real footgun is prerelease versions (e.g., -build.N) not satisfying the dependency range, and either remove the “must be identical” rule or explicitly document it as a new policy (and update the rest of the repo to match).
| Both `@bradygaster/squad-sdk` and `@bradygaster/squad-cli` **MUST have the same version** at all times. The root `package.json` version must also match. | |
| `bump-build.mjs` enforces this by updating all three `package.json` files in lockstep (root + `packages/squad-sdk` + `packages/squad-cli`). | |
| If versions diverge, workspace resolution silently breaks (see §4). | |
| As a **project convention**, `@bradygaster/squad-sdk`, `@bradygaster/squad-cli`, and the root `package.json` version **SHOULD normally be kept aligned** for release tags on `dev` and `main`. This avoids confusion when correlating bugs, logs, and published artifacts. | |
| `bump-build.mjs` helps enforce this convention by updating all three `package.json` files in lockstep (root + `packages/squad-sdk` + `packages/squad-cli`) during local version bumps. | |
| Workspace resolution only breaks when the SDK version does **not** satisfy the CLI’s semver range (typically because the SDK is on a prerelease like `0.9.1-build.4` while the CLI depends on `>=0.9.0`), as explained in §4. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The decision asserts “SDK and CLI versions must stay in sync” and that divergence breaks npm workspace resolution. Current repo docs and changeset configuration describe independent versioning (e.g., docs/blog/017-version-alignment.md and docs/src/content/docs/guide/contributing.md), and the documented workspace incident is about prerelease versions not matching the SDK dependency range, not about version divergence itself. Recommend rewording this bullet to focus on the prerelease-range mismatch (and only claim lockstep versioning if the repo is actually moving to a fixed/linked versioning model).