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
{{ message }}
Repository navigation
Commit 63fb473
Browse filesBrowse the repository at this point in the historyBrowse files
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>
**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.
17
21
18
22
| Version Component | When Incremented | Guarantee |
19
23
|:---|:---|:---|
20
24
|**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|
22
26
|**PATCH** (0.0.X) | Bug fixes, backward-compatible | No behavior changes, only fixes |
23
27
24
28
### SemVer Guarantees
25
29
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.
27
31
-**TypeScript types** inferred from Zod (`z.infer<typeof Schema>`) follow the same guarantees as their source schemas.
28
32
-**Helper functions** (e.g., `defineStack`, `defineStudioPlugin`) maintain their call signatures within a MAJOR version.
29
33
-**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
58
62
- Code examples are updated to use the replacement
59
63
- CLI tooling may provide automated migration commands
60
64
61
-
### Phase 3: Removal (next MAJOR release)
65
+
### Phase 3: Removal (MINOR release, during the launch window)
62
66
63
67
- Deprecated feature is removed from the schema
64
68
- TypeScript types no longer include the property
65
69
- 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.
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)"]
74
81
```
75
82
76
83
<Callouttype="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.
78
85
</Callout>
79
86
80
87
---
@@ -83,14 +90,16 @@ flowchart TD
83
90
84
91
### What Constitutes a Breaking Change
85
92
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) |
87
96
|:---|:---|:---|
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|
94
103
| Adding a new optional property | No | MINOR |
95
104
| Adding a new enum value | No | MINOR |
96
105
| Widening a type (e.g., `enum` → `string`) | No | MINOR |
@@ -101,10 +110,9 @@ flowchart TD
101
110
### Breaking Change Process
102
111
103
112
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.
- 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
167
175
- Internal modules (prefixed with `_` or in `internal/` directories) are not covered by SemVer guarantees
168
176
169
177
### Runtime Behavior
@@ -196,7 +204,7 @@ MAJOR releases do still happen — 17.0.0 was cut precisely because its breaking
196
204
197
205
### When it stops applying
198
206
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.**
0 commit comments