Skip to content

Commit 63fb473

Browse files
baozhoutaoclaude
andauthored
docs(protocol): state the launch-window MINOR rule where readers meet it first (#14211)
The Backward Compatibility page and the releases Versioning policy both told customers that a breaking change takes a MAJOR. The repo's operative rule is the launch-window convention: all 69 published `@objectstack/*` packages sit in one Changesets `fixed` group and a breaking change ships as a MINOR, enforced by `scripts/check-changeset-no-major.mjs`. - protocol page: hoist the governing rule above the SemVer table so it is the first thing a reader meets, correct the MINOR row, the breaking-change table's Version Impact column, the process ending, and deprecation Phase 3 (plus its diagram and summary callout), and align the existing Launch Window section's authority sentence with the now-corrected tables. - delete the "Minimum 30-day community review period" claim: the only occurrence of "review period" in the repo is the claim itself. - releases/index.mdx: the Minor sentence said releases add capabilities "without breaking existing metadata or code"; it now states the override and cites the shipped 17.2.0 / 15.1.0 removals. Claude-Session: https://claude.ai/code/session_01WLJQhde67SeTccsmnBVarV Co-authored-by: Claude <noreply@anthropic.com>
1 parent e621291 commit 63fb473

2 files changed

Lines changed: 52 additions & 24 deletions

File tree

‎content/docs/protocol/backward-compatibility.mdx‎

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,21 @@ ObjectStack follows strict backward compatibility guarantees to ensure predictab
1313

1414
## Versioning Strategy
1515

16-
ObjectStack follows [Semantic Versioning 2.0.0](https://semver.org/) (`MAJOR.MINOR.PATCH`):
16+
<Callout type="warn">
17+
**While the launch window is open, a breaking change ships as a MINOR release — not a MAJOR one.** Every published `@objectstack/*` package versions in lockstep, so the version number alone is not an upgrade-safety signal. This rule is in force today and overrides the MAJOR/MINOR mapping in the tables below wherever they disagree; read [Launch Window](#launch-window-minor-releases-can-contain-breaking-changes) at the end of this page before you plan an upgrade.
18+
</Callout>
19+
20+
ObjectStack follows [Semantic Versioning 2.0.0](https://semver.org/) (`MAJOR.MINOR.PATCH`). The table below describes what each component means; the launch-window rule above governs which component a breaking change actually lands in today.
1721

1822
| Version Component | When Incremented | Guarantee |
1923
|:---|:---|:---|
2024
| **MAJOR** (X.0.0) | Incompatible API changes | May contain breaking changes |
21-
| **MINOR** (0.X.0) | New features, backward-compatible | Existing code continues to work |
25+
| **MINOR** (0.X.0) | New features — and, during the launch window, breaking changes | Existing code may require migration; the [release notes](/docs/releases) lead with what broke |
2226
| **PATCH** (0.0.X) | Bug fixes, backward-compatible | No behavior changes, only fixes |
2327

2428
### SemVer Guarantees
2529

26-
- **Zod schemas** are part of the public API surface. Adding optional properties is a MINOR change; removing or renaming properties is a MAJOR change.
30+
- **Zod schemas** are part of the public API surface. Adding optional properties is a MINOR change; removing or renaming properties is a breaking change, which during the launch window also ships in a MINOR release.
2731
- **TypeScript types** inferred from Zod (`z.infer<typeof Schema>`) follow the same guarantees as their source schemas.
2832
- **Helper functions** (e.g., `defineStack`, `defineStudioPlugin`) maintain their call signatures within a MAJOR version.
2933
- **Input formats** — `defineStack()` accepts both array and map (Record) format for all named metadata collections. Both formats are guaranteed stable within a MAJOR version.
@@ -58,23 +62,26 @@ When a feature, schema property, or API is deprecated, ObjectStack follows a str
5862
- Code examples are updated to use the replacement
5963
- CLI tooling may provide automated migration commands
6064

61-
### Phase 3: Removal (next MAJOR release)
65+
### Phase 3: Removal (MINOR release, during the launch window)
6266

6367
- Deprecated feature is removed from the schema
6468
- TypeScript types no longer include the property
6569
- Runtime code no longer supports the feature
70+
- The removal is called out in the [release notes](/docs/releases) and marked `**BREAKING**` in the changeset
71+
72+
Shipped examples: `17.2.0` retired `http_request_errors_total` and `sys_position.permissions` under [ADR-0049](https://github.com/objectstack-ai/objectstack/blob/main/docs/adr/0049-no-unenforced-security-properties.md) enforce-or-remove, and `15.1.0` removed `tenancy.strategy` and `tenancy.crossTenantAccess` — all three in **Minor Changes** sections.
6673

6774
### Timeline Summary
6875

6976
```mermaid
7077
flowchart TD
7178
A["v3.2.0 — feature deprecated (warning emitted)"] --> B["v3.3.0 — migration period continues"]
7279
B --> C["v3.4.0 — migration continues (minimum 2 minor releases)"]
73-
C --> D["v4.0.0 — feature removed (earliest possible removal)"]
80+
C --> D["v3.5.0 — feature removed (earliest possible removal, MINOR)"]
7481
```
7582

7683
<Callout type="warn">
77-
**Minimum guarantee:** Deprecated features survive for at least **2 MINOR releases** before they can be removed in the next MAJOR version.
84+
**Minimum guarantee:** Deprecated features survive for at least **2 MINOR releases** before they can be removed. During the launch window the removal itself lands in a MINOR release, so a MINOR bump is where you should expect a removal to arrive.
7885
</Callout>
7986

8087
---
@@ -83,14 +90,16 @@ flowchart TD
8390

8491
### What Constitutes a Breaking Change
8592

86-
| Change Type | Breaking? | Version Impact |
93+
Read the **Breaking?** column, not the version number: during the launch window every row below — breaking or not — ships in a MINOR or PATCH release, so the bump size does not tell you whether you have work to do.
94+
95+
| Change Type | Breaking? | Version Impact (launch window) |
8796
|:---|:---|:---|
88-
| Removing a schema property | **Yes** | MAJOR |
89-
| Renaming a schema property | **Yes** | MAJOR |
90-
| Changing a property from optional to required | **Yes** | MAJOR |
91-
| Narrowing a type (e.g., `string` → `enum`) | **Yes** | MAJOR |
92-
| Removing an enum value | **Yes** | MAJOR |
93-
| Changing default values | **Yes** | MAJOR |
97+
| Removing a schema property | **Yes** | MINOR |
98+
| Renaming a schema property | **Yes** | MINOR |
99+
| Changing a property from optional to required | **Yes** | MINOR |
100+
| Narrowing a type (e.g., `string` → `enum`) | **Yes** | MINOR |
101+
| Removing an enum value | **Yes** | MINOR |
102+
| Changing default values | **Yes** | MINOR |
94103
| Adding a new optional property | No | MINOR |
95104
| Adding a new enum value | No | MINOR |
96105
| Widening a type (e.g., `enum` → `string`) | No | MINOR |
@@ -101,10 +110,9 @@ flowchart TD
101110
### Breaking Change Process
102111

103112
1. **RFC (Request for Comments)** — Breaking changes are proposed as GitHub issues with the `breaking-change` label.
104-
2. **Review Period** — Minimum 30-day community review period.
105-
3. **Deprecation** — The old behavior is deprecated in a MINOR release (see timeline above).
106-
4. **Migration Guide** — A detailed migration guide is published before the MAJOR release.
107-
5. **Release** — Breaking change ships in the next MAJOR version.
113+
2. **Deprecation** — The old behavior is deprecated in a MINOR release (see timeline above).
114+
3. **Migration Guide** — A detailed migration guide is published before the removal lands, in the release notes for the version that carries it.
115+
4. **Release** — During the launch window the breaking change ships in the next **MINOR** version, carrying a changeset entry marked `**BREAKING**`. `scripts/check-changeset-no-major.mjs` fails any pull request that declares a `major` bump, because under lockstep one `major` would promote all 69 published packages.
108116

109117
---
110118

@@ -163,7 +171,7 @@ The `@objectstack/spec` package provides additional stability guarantees:
163171
### Export Stability
164172

165173
- All public exports are listed in the package's `index.ts` barrel files
166-
- Removing an export is always a MAJOR change
174+
- Removing an export is always a breaking change; during the launch window it ships in a MINOR release
167175
- Internal modules (prefixed with `_` or in `internal/` directories) are not covered by SemVer guarantees
168176

169177
### Runtime Behavior
@@ -196,7 +204,7 @@ MAJOR releases do still happen — 17.0.0 was cut precisely because its breaking
196204

197205
### When it stops applying
198206

199-
The versioning tables and deprecation timeline above describe the policy in its settled form; they take full effect when the launch window closes and a breaking change once again requires a MAJOR. Until then, **this section is the operative rule wherever the two disagree.**
207+
The tables and deprecation timeline above now state this rule directly, so the page no longer contradicts itself. Classic SemVer — where a breaking change once again requires a MAJOR — is the settled form the project returns to once the launch window closes; the condition that closes the window is tracked separately and is deliberately not stated here. Until it closes, **this section is the operative rule wherever any part of this page disagrees.**
200208

201209
---
202210

‎content/docs/releases/index.mdx‎

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,28 @@ These pages are curated summaries. For exhaustive, per-package detail:
4444

4545
## Versioning policy
4646

47-
ObjectStack follows [Semantic Versioning](https://semver.org). A **major**
48-
release may remove or change schemas in `@objectstack/spec`, public APIs, CLI
49-
flags, or environment variables — always with a migration path documented in
50-
the release notes. **Minor** releases add capabilities without breaking
51-
existing metadata or code. **Patch** releases fix bugs.
47+
ObjectStack follows [Semantic Versioning](https://semver.org), with one
48+
override that is in force today: **while the launch window is open, a breaking
49+
change ships as a minor release.** All `@objectstack/*` packages version in
50+
lockstep, so a single major bump would promote the whole platform; instead a
51+
breaking change lands in a **minor** alongside a changeset entry marked
52+
`**BREAKING**`, and `scripts/check-changeset-no-major.mjs` fails any pull
53+
request that declares a major bump.
54+
55+
What that means when you read a version number:
56+
57+
- A **major** release may remove or change schemas in `@objectstack/spec`,
58+
public APIs, CLI flags, or environment variables — always with a migration
59+
path documented in the release notes.
60+
- A **minor** release adds capabilities, and **may also remove or change those
61+
same surfaces**. `17.2.0` retired `http_request_errors_total` and
62+
`sys_position.permissions`; `15.1.0` removed `tenancy.strategy` and
63+
`tenancy.crossTenantAccess` — all in minor releases. As the v17 notes put it,
64+
17.1.0 and 17.2.0 are minors by version number, not by blast radius.
65+
- A **patch** release fixes bugs.
66+
67+
⚠️ **The version number is not the upgrade-safety signal.** Read the release
68+
note for the version you are moving to — each one leads with breaking changes
69+
and migration steps — and see
70+
[Backward Compatibility](/docs/protocol/backward-compatibility#launch-window-minor-releases-can-contain-breaking-changes)
71+
for the full policy.

0 commit comments

Comments
 (0)