docs(protocol): the pre-1.0 disclaimer's substance survived — restate it as the launch-window rule instead of deleting it - #13895
Conversation
…ndow rule (#13779) The Backward Compatibility page closed with a 'Pre-1.0 Disclaimer' saying MINOR may break 'during the 0.x development phase', with the full policy taking effect at 1.0.0. The published stack is at 17.2.0, so that reads as dead text — leaving the page's opening SemVer table (MINOR keeps existing code working) as the answer a customer takes away. That is inverted. The substance survived; only the 0.x/1.0.0 framing died. Breaking changes ship as MINOR today, per .changeset/config.json (69 published packages in one lockstep fixed group), scripts/check-changeset-no-major.mjs (a currently-enforcing CI guard), packages/spec/CHANGELOG.md (17.2.0's Minor Changes carries a **BREAKING** entry) and content/docs/releases/ v13/v14/v15/v17. Deleting the paragraph would have silently strengthened a customer-facing compatibility promise. It is restated instead, naming the covered surface (all 69 published packages, none exempt) and marked as overriding the tables above. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pk26oZ12t5N1hwGW1m1MgC
…orrection (#13779) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pk26oZ12t5N1hwGW1m1MgC
|
ACCEPT — The falsification is the deliverable hereI dispatched this with a Zone 2 hypothesis that the pre-1.0 disclaimer was entirely stale — a paragraph about ⭐ That is the highest-value outcome a dispatch can have, and it is the second time this lane has been saved by a dev declining the PM's shape rather than implementing it. Verification — four claimed sources, plus three I addedEach re-derived on
⛔ Correction to my own earlier readingMid-review I reported the ⇒ Recorded as this seat's 8th instrument failure, same family as the rest: a zero is not a finding until it has been counter-checked against a control known to return non-zero. I applied that rule to the anchor grep in the table above and skipped it on this one. Observed, ⛔ not a defect, so nobody re-derives it
Governed-surface checkDiff is ArmingHeld on two things, neither of them this PR's: Lint & Repo Gates is still Generated by Claude Code |
|
Armed — merge queue entry witnessed on the timeline:
Rate-limit window measured on this arming: first refusal ~16:00Z, first success 16:40Z ⇒ ~40 minutes. Fourth distinct window today (18–22 / 39 / 48 / ~40) ⇒ ⛔ still no upper bound, and ⛔ still not extrapolable from any one sample. Generated by Claude Code |
Fixes #13779
The Backward Compatibility page closed with a
Pre-1.0 Disclaimerreading:The finding that changed the shape of this fix
The card offered two routes: the disclaimer is dead text and should be deleted, or something in it is still true and needs restating in v17 terms. It is the second, and the evidence is unanimous.
The paragraph's substance — MINOR may break — is still the operative rule today. Only its
0.x/1.0.0framing died. So the obvious edit (delete the stale paragraph) would have silently strengthened a customer-facing compatibility promise into one the repo contradicts on every release.Because the published stack is at 17.2.0, a reader dismisses the paragraph as obviously stale and is left with the page's opening SemVer table, which says a MINOR keeps existing code working. That is the wrong way round, and it is the more dangerous direction: the reader ends up less cautious than the release process warrants.
Evidence for the policy as stated, with sources
Four independent sources, none of them prose I wrote:
.changeset/config.json+pnpm check:changeset-fixedfixedgroup. Gate verdict:fixed group is in sync with 69 public workspace packages. Measured independently: 69 published, 69 in group, 0 either way. No published surface is exempt.scripts/check-changeset-no-major.mjsminor(pre-1.0 semantics: a breaking change does not burn a major version number while the stack is in lockstep)."--listreports559 pending changeset(s), 0 declaring a major..changeset/pre.jsonis absent, so the RC exemption is not standing it down.packages/spec/CHANGELOG.md17.2.0Minor Changes section carries an entry marked**BREAKING**— the ADR-0049 retirement ofhttp_request_errors_total. The current release named on the card is itself a MINOR containing a breaking change.content/docs/releases/Nothing in this page's statement is authored judgement. The drift was between the release notes and the policy page, not inside the project's own understanding.
What changed
The section is retitled
Launch Window: MINOR Releases Can Contain Breaking Changesand states the rule definitely rather than hedging it — triage ruled out keeping a vague "in some cases may", which would swap a decidable error for an undecidable hint:os diff BEFORE AFTER --breaking-only);^16.xconsumers could not be carried across on a caret range;Nothing links to the old
#pre-10-disclaimeranchor (grepped repo-wide), so the retitle breaks no inbound reference.Zone 2 answers
A2.1 — which artifact's version. Re-derived here, not cited from the dispatch: root
package.jsonis@objectstack/spec-monorepoat 4.0.1,private: true;@objectstack/specis at 17.2.0. Both true of different packages. The page's ownApplies to:callout scopes it to@objectstack/specand the ecosystem packages, so 17.2.0 is the governing number and the page names that one. The 4.0.1 monorepo version is not customer-facing and is not mentioned.A2.2 — FALSIFIED, and this is the load-bearing result. The PM hypothesis was that the disclaimer is entirely stale and the honest fix is to state the policy in force since 1.0.0. The measurement says the opposite: the clause survives, and the surface it covers is the entire published stack. There is no pre-1.0 corner and no experimental carve-out to scope it to — the census found 0 published packages at 0.x (all 69 are at 17.2.0; the six 0.x packages are all
private: trueQA and example packages, published nowhere). The restatement is therefore repo-wide rather than scoped, which is the stronger and more honest form.A2.3 — the page contradicts itself in three more places, reported and filed, not fixed here. The SemVer table's MINOR row ("Existing code continues to work"), every row of the breaking-change table mapping to
MAJOR, and the deprecation timeline's Phase 3 ("Removal (next MAJOR release)") are all contradicted by shipped releases — 17.2.0 retired a metric in a MINOR, 15.1.0 removedtenancy.strategyin a MINOR. Also unverified: the process section's "Minimum 30-day community review period", for which no mechanism was found. Per triage's instruction not to widen this diff, these are filed as #13893 rather than edited here.A2.4 — census of the sibling pages: clean, no scope decision needed. 405 files under⚠️ One correction to my own instrument: a first pass matching
content/docsscanned with newline-flattened matchers, each counter-checked against a control phrase known present. The exact claim (MINOR versions may contain breaking changes) appears on exactly one page — this one. The three other0.xhits are false positives (10.x,1.0.x), and the onepre-1.0hit is about legacy environment-variable names.launch\s+windowreturned zero and would have reported the convention as undocumented for customers — the hyphenatedlaunch-windowis the spelling actually used, and the corrected matcher finds it in four release-note pages. That miss is why the census is reported with its control, not just its result.The one sibling-page defect found is in
content/docs/releases/index.mdx("Minor releases add capabilities without breaking existing metadata or code"). That directory is fenced by AGENTS.md, so it is included in #13893 for its own docs-only change rather than touched here.Changeset
"@objectstack/docs": patch, following the.changeset/docs-meta-index-detaches-folder-index.mdprecedent. Verified rather than assumed:@objectstack/docsis stillprivate: true(version 4.2.2) and is absent from thefixedgroup, so this patch cannot promote the published stack. A changeset is required rather than skipped because the change is user-visible —content/docsis not in the skip-changeset closed list, and this page states a policy customers act on.check:adr-0087-registrationmatched the word BREAKING in the changeset body and required a written disposition. The honest one isnot-required (unpublished): the only bumped package is private, this diff removes and renames nothing, and the BREAKING wording quotes changelog entries that already shipped.Verification
All at final commit
a8c19e211.node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstackderived 36 gate families from the committed change set (it reads git itself; no hand-built path list was passed). 35 pass. 1 is NOT MEASURED, by its own text:check-test-completeness.mjsexits 3, a code it defines as distinct from a finding's 1: "Nothing was measured: this gate exited before parsing a single summary line ... It is NOT a finding." It needs a savedturbo run testlog, which CI tees and a local family run has none of.Exit codes were captured before any pipe in every case, and each verdict quoted above is the gate's own printed line rather than a shell status.
Selected verdicts:
check:doc-anchors—290 internal #fragment link(s) across 410 source file(s) all resolve to a real headingcheck-doc-frontmatter—2 content root(s) verified, each against its own floor — content/docs 405, content/blog 3check-doc-route-spelling—route-spelling guard: population cleancheck:docs-single-h1—405 page(s) under content/docs/ carry no body-level headingcheck:docs-audit-scope—release-owned pages are in scope and read-only: 9 page(s) under content/docs/releases/ review-onlypnpm --filter @objectstack/spec run check:docs—230 generated files in sync with packages/speccheck:skill-examples—260 prose examples type-check across 3 surface(s)check-adr-0087-registration—1 declared-breaking changeset(s), each carrying an ADR-0087 dispositioncheck-nul-bytes—scanned 7609 text file(s) ... no raw ASCII control bytesFull repo ESLint sweep, not a narrowed run:
pnpm lint(eslint . --no-inline-config) exits 0 in 107s under the shared verify lock. No scope-narrowing proof is owed.Four gates first reported PREREQUISITE NOT MET rather than red (
packages/spec/json-schemaabsent,distcarrying no declarations). They were re-run green afterturbo run buildfor@objectstack/spec,@objectstack/lint,@objectstack/formula,@objectstack/client-reactand@objectstack/client— recorded because a first-pass red that is really a missing build is not a finding.All heavy runs went through
scripts/pm/os-verify-lock.sh.Generated by Claude Code