Uh oh!
There was an error while loading. Please reload this page.
docs(adr): ADR-0130 — the release artifact is the co-ownership boundary (one artifact, N packages) - #14151
Merged
Conversation
…ry (one artifact, N packages) Records the decision chartered on #14144 (epic #14122): compile per package, ship one JSON, keep N manifests inside it, register N packages in dependency topological order at load time. Status: Proposed — governed surface, awaiting the maintainer's hand-merge. Part of #14122 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015adLit3ZYASJiXwxKG78Wi
os-zhuang
approved these changes
Sep 1, 2026
os-zhuang
marked this pull request as ready for review
September 1, 2026 09:02
os-zhuang
enabled auto-merge
September 1, 2026 09:02
Uh oh!
There was an error while loading. Please reload this page.
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 freeto 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#14144
Part of #14122 (epic)
Adds
docs/adr/0130-release-artifact-as-co-ownership-boundary.md, Status: Proposed. Prose only — one new file, nothing outsidedocs/adr/**, no implementation code, no schema edits.What it decides
Compile per package, ship one JSON, keep N manifests inside it, register N packages in dependency-topological order at load time. Eight decision letters:
codeandstatus(ADR-0112 envelope) rather than a bare throw.packages: [...];manifestis retained and both shapes are read. Forward compatibility ridesmanifest.engines.protocol. The segmented-loading key position is reserved at schema time, deliberately unimplemented.resolvePluginOrder; no second sorter. The pin is behavioural (extension-before-base installs and the extension is in effect), because a permutation assertion passes on an implementation that computes the order and never uses it.manifestartifacts register bit-identically through the new path, as an automated test rather than a review judgement.⛔ No original text of ADR-0019 or ADR-0048 is edited. The boundary is recorded here by cross-reference, per the additive-addendum convention 0048 itself uses.
Governed surface — this PR stays draft
node scripts/pm/check-governed-merges.mjs --test docs/adr/0130-release-artifact-as-co-ownership-boundary.mdVerdict: GOVERNED. This PR awaits the maintainer: it stays draft, is never flipped ready, never enqueued, and never has auto-merge armed. The hand-merge is itself the acceptance act for the ADR — Status stays
Proposeduntil then.Changeset
skip-changesetlabel applied — no changeset file. The diff publishes nothing from any package: one file,docs/adr/**only.pr-automation.ymlreads the label live rather than from the event payload, and the label is applied additively (POST) with a read-back, per that workflow's own recorded size-labeler race.Verification — all on the final commit
341b9e9Derived family (
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack, 5 families) — all green:pnpm check:adr-anchorsOK (52 anchored file(s) ... 128 decision number(s), each naming one decision or an allowlisted pair; 30918 citation(s) across 3981 file(s) resolve)pnpm check:doc-authoring395 files clean·48 published skill files clean·14317 customer-facing string(s) ... cleanpnpm --filter @objectstack/lint run check:doc-formula-expressionspnpm check:pm-governed-merges243 assertionsself-test passnode scripts/check-adr-links.mjs598 relative link destination(s) under docs/adr/ resolvecheck:doc-formula-expressionsfirst returned exit 3 = PREREQUISITE NOT MET (@objectstack/formulathen@objectstack/lintnot built) — not a finding and not a measurement. Both packages were built and the gate re-run to a real exit 0.Full
Lint & Repo Gatesjob, not just the derived family. The job's 138 steps were harvested fromlint.ymland each runnable one executed locally against this commit: 4 areuses:actions (checkout / setup-node / setup-pnpm / cache), 134 arerun:, and zero carry anif:— so CI runs every one of them on every PR. 132 of the 134 ran green; the 2 not run are pure CI setup with no local meaning (Get pnpm store directory, which writes$GITHUB_ENV, andInstall dependencies/pnpm install --frozen-lockfile, already satisfied in the worktree). That includesESLint(pnpm lint, repo-wide, exit 0 under the shared verify lock) — no narrowing was taken and none is claimed.Exit codes were captured before any pipe (redirect, then
$?); each verdict above quotes the gate's own printed line, never a bare$?.Where the proposal's citations did not survive re-verification
Recorded in the ADR's §7 rather than quietly corrected:
engine.ts:4745is off by one —registerApp(manifest: any)is at:4746(4745 is the closing*/). The claim it supports holds.scripts/check-source-token-ratchet.mjsdoes not exist in this repository — the token ratchet One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 §1.3b cites is a downstream application repo's script. Its measurement is downstream evidence, not a gate here. The platform-side fact (no grouping key on the object document) was verified independently: the onlygroupspelling inpackages/spec/src/data/object.zod.ts:1779is rejection guidance.Every other anchor was found exactly as described:
registry.ts:1456, theinstallPackagegate at:3575/:3583/:3595,getNamespaceOwnersat:1540,unregisterObjectsByPackageat:2679,plugin.ts:405,stack.zod.ts:240/:854/:1759,RESERVED_NAMESPACESatregistry.ts:45withisShareableNamespaceat:1116, and ADR-0048's rename-on-install non-goal in all three recorded places.Open for the maintainer's merge decision
Listed in the ADR's §6: (1) D8's deferral of the owner field — #14122 待决策 ⑤ asked explicitly whether it should land with ADR-0048 addendum D2 instead; (2) whether the ADR-0019 boundary should additionally get a one-line Related entry on 0019 (0019's own text is not rewritten either way); (3) acceptance of D6's "no per-module hot-fix" cost.
Follow-up implementation cards are cut after this record merges, not before — including the Studio package-picker row, which is objectui-side and gets a cross-repo card against that repository linked to the #14122 epic.
Generated by Claude Code
Generated by Claude Code