docs(adr): record the v5.0 project to environment rename in ADR-0006, and land its inbound pointers - #13364
Merged
Merged
Conversation
…lias decision ADR-0006 v4 gains a short section stating what the v5.0 tenancy rename covered, that no alias was kept, and why -- measured on main rather than recalled. The section states its reasons itself instead of quoting the instruction file that points here, which is what made the previous pointer a loop. The three byte-identical v5.0 banners in ADR-0004/0005/0008 move together: repointed at the new section, and the changeset path they named for the breaking-change list is dropped (that file no longer exists -- it was consumed at release, which is why a doc should not cite one as durable evidence). Placed before the two addenda so their 'first addendum' / 'second addendum at the end of this file' cross-references stay true. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EXxTW8mvPBhoHxmyPZ63de
…0006 v4 Both linked ADR-0006 under the bare filename, which holds the Superseded v3. The redirect works, so the link checker was green either way and nothing would ever have gone red. Repointed at the .v4 filename -- the revision that carries the API-surface vocabulary boundary -- with a short parenthetical on each so the historical fact a Builds-on line records is not silently destroyed: these records really were built on v3. No mechanical Builds-on-vs-Superseded rule is added; two instances do not justify a permanent gate. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EXxTW8mvPBhoHxmyPZ63de
…claimed Accepted v2 (three-layer tenancy: Project and Environment as siblings under Organization, joined by sys_deployment) still read 'Accepted (v2)' while v4 also reads Accepted. v4's own Supersedes line already names v2. Verified before changing rather than assumed: nothing in v2's Decision is uniquely live. It keeps sys_project as the physical table, plans a dual sys_project / sys_environment ORM name, and holds the API URLs at /api/v1/cloud/projects with provisionProject on the SDK -- every one of which v4 and the v5.0 rename reverse, and the dual-name plan is exactly the alias posture the rename refused. Unlike v3 this file carries no redirect of any kind, so a reader or a corpus scan keying on 'Status: Accepted' had nothing telling it to go read v4. Status line only; neither v2 nor v3 is deleted -- they are part of the record. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EXxTW8mvPBhoHxmyPZ63de
…r0006-rename-rationale
This was referenced Aug 30, 2026
os-zhuang
approved these changes
Aug 30, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #12747
Fixes #12748
Ruled convoy, one governed PR, per-member commits. Both rulings are the maintainer's 2026-08-29 director-batch adjudications on the two cards; nothing here re-opens them.
Member 1 (#12747) — the rename gets written down
ADR-0006 v4 gains one section,
The v5.0 rename and its no-alias decision, recording what the v5.0projecttoenvironmentrename covered, that no alias was kept, and why. Every factual claim in it was measured on this branch rather than recalled:environments, noprojectsgrouppackages/cli/src/commands/environments/holdslistshowcreateswitchbind;packages/cli/src/commands/projectsdoes not exist/api/v1/cloud/environmentspackages/, non-test sourcesX-Environment-Id, noX-Project-Idpackages/rest/src/rest-server.ts;x-project-idhas zero hitsOS_ENVIRONMENT_ID, noOS_PROJECT_IDpackages/runtime,service-job,cloud-connection;OS_PROJECT_IDhas zero hitsprojecttoenvironmententryThe section states its reasons itself and does not cite the instruction file — that is the ruling's explicit constraint, because the loop it replaces was the record quoting back the very sentence the reader had just followed. Its three reasons are one-word-per-concept, alias-outlives-its-reason, and the pre-launch window, the last grounded in a quotation from this record's own Context rather than invented history.
It also carries a
What this section does not claimparagraph.projectis still correct in the npm/monorepo sense and in domain fixtures modelling a customer's own project object, so the claim is deliberately the narrow, checkable one.The three banners moved together and are still byte-identical after the edit (measured: 1 distinct banner text across ADR-0004/0005/0008, the same property they had before). Each is repointed at the new section, and the changeset path they named for the breaking-change list is dropped —
.changeset/v5-project-to-environment-rename.mdis measurably absent, consumed at release, which is exactly why a durable doc should not have cited it.AGENTS.md has a zero-line diff, as the ruling expected. Its
See ADR-0006becomes true as written because the target now exists; the pointer text needed no change, so the #13059 ceiling precedent was not invoked.Member 2 (#12748) — the two Builds-on links land on the Accepted revision
docs/adr/0007-settings-manifest-and-kv-store.md:5anddocs/adr/0008-metadata-repository-and-change-log.md:8linked ADR-0006 under the bare filename, which holds the Superseded v3. Both now point at.v4, each with the ruled short parenthetical recording that the record was originally built on v3 — so the reader lands on the revision carrying the API-surface boundary without the historical fact being silently destroyed. After the edit, anchored greps find zero bare-filename links left underdocs/adr/.Option 3, a mechanical Builds-on-vs-Superseded rule, is not taken, per the ruling.
The two inspect-only mentions — inspected, neither is a citation
The cards were right to fence these off. Both were read before anything was touched, and neither was changed:
CHANGELOG.md:790,793— entries in a past release's record, stating that the v4 file was added and that v3 was marked superseded. That is release history describing events, not a pointer a reader follows. Retargeting it would falsify the record of what shipped.scripts/check-adr-anchors.mjs:255-256,509— a docblock example illustrating how the script parsesstemandversionout of a filename, and a failure-message hint naming the.vNconvention. The script names the path as an illustration of a filename pattern; it holds no citation to ADR-0006's content. Retargeting it would be a silent behaviour change dressed as a docs fix.Also carried: ADR-0006 v2's Status line
Two files under one ADR number both read
Accepted. This was flagged as an assumption to verify before acting, not as ruled text, so it was verified by reading v2's body rather than inferred from its title. v2's Decision keepssys_projectas the physical table, plans a dualsys_project/sys_environmentORM name, and holds the API URLs at/api/v1/cloud/projectswithprovisionProjecton the SDK. Every one of those is reversed by v4 and by the rename — and the dual-name plan is precisely the alias posture the rename refused. Nothing in it is uniquely live, so its Status is corrected toSuperseded by v4, matching v3's existing spelling.Worth noting why this one mattered: unlike v3, v2 carried no redirect of any kind, so a reader or a corpus scan keying on
Status: Acceptedhad nothing telling it to go read v4.Neither v2 nor v3 is deleted — they are part of the record.
Verification
Gate family re-derived against the actual diff with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack(its first run warned STALE TREE;origin/mainwas merged in and it was re-derived clean). All runs below are atd0c713183, which is this branch's head:check:adr-anchorsOK (52 anchored file(s) … 30457 citation(s) across 3894 file(s) resolve …)node scripts/check-adr-links.mjs579 relative link destination(s) under docs/adr/ resolvecheck:doc-authoring393 files clean — no bare metadata literalscheck:doc-formula-expressions22 record-scoped formula example(s) across 426 files / 1451 TS blocks judged cleancheck:pm-governed-merges206 assertionsself-test passcheck:nul-bytesOK (scanned 7408 text file(s) … no raw ASCII control bytes)Also run green though not derived for this diff:
check:agent-test-spelling,check:docs-audit-scope,check:pm-governed-prose,check:pm-skill-id-lint,check:pm-skill-ratchet,check:required-contexts,node scripts/check-required-contexts.mjs.check:doc-formula-expressionsfirst exited 1 withPREREQUISITE NOT METon two unbuilt workspace packages. That is not a gate failure and is not recorded as one — nothing was measured until@objectstack/formulaand@objectstack/lintwere built, after which it ran and passed.skip-changesetapplies: the diff is entirely withindocs/adr/**, publishes nothing from any package, and AGENTS.md and the anchors script both have a zero diff.One deviation from the suggested route
The suggested placement was immediately after the existing v5.0-boundary addendum. Placing it there would have split #12473's addendum from the #12867 addendum that retires its D1 — a matched pair — and would have falsified two live cross-references inside the file, which name
the second addendum at the end of this fileandthe first addendum. A third addendum appended at the end breaks the first; one inserted between them breaks the ordinals.So the section sits after
## Referencesand before both addenda, and is titled as a plain section rather than an addendum, leaving both ordinals andat the end of this filetrue. It is date-stamped in its first line so it is not misread as part of the 2026-05-20 body, and the logical order now reads: the rename and why, then where it stops, then that boundary's retirement.Governed surface
docs/adr/**— this PR stays draft for the maintainer's hand merge. This seat does not flip it ready, does not queue it, and does not arm auto-merge.Generated by Claude Code