Skip to content

docs(adr): record ADR-0048 Addendum A as accepted - #30833

Merged
os-zhuang merged 2 commits into
mainfrom
claude/project-thread-gor61o
Nov 6, 2026
Merged

os-zhuang merged 2 commits into
mainfrom
claude/project-thread-gor61o

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Elon · project thread

domain:server#4 · os-elon-musk · session_016WV4cwkYtfcduZmfxJhuG3

Fixes #30814

Clause-②: no
Metadata-protocol: none

Claim: 6677779234 (re-posted whole with the branch: 6677846365) · Branch: claude/project-thread-gor61o · Ruling-ref: the card body (maintainer 「同意」, recorded by epic:#3600#1 — correct the record only; the exclusivity gate is not built)

维护者速读

What changes

One file, docs/adr/0048-cross-package-metadata-collision.md, three hunks, no decision text touched:

  1. Line 8, the header Addenda entry — (**Proposed**; …) becomes (**Accepted** 2026-08-08 — maintainer ruling on #1825, [acceptance comment 5226411687], landed by PR #6671; additive to §3.2, supersedes nothing).
  2. Line 370, the addendum's own status line — Status of this addendum: Proposed. becomes Accepted (2026-08-08), naming that the maintainer accepted it as drafted with D2 and D3 rule 2 included, linking the same comment, and recording why the line lagged: PR docs(adr): ADR-0048 addendum — publish-time / marketplace namespace exclusivity contract #6671 merged the same day with the line still reading "Proposed", the comment being the acceptance record of authority until the line caught up. The sentence that follows ("It is additive to §3.2 and supersedes no text above …") is kept verbatim.
  3. End of §A.5 (Activation precondition) — one dated note, Note (2026-11-06, #30814) — where the precondition stands; no decision changes., with the three points the card asks for: Phase A2 stays bound to the precondition and lands before third-party publishing opens; while publishing is first-party only, first-party namespaces are reserved at switch-on by D2 and D4 (the back-fill awards each published namespace to the publisher of its earliest published version, and the reservation is held by that publisher), so no separate official reserved list is needed; Phase A1 is landed (PR feat(spec,cli): carry the package namespace on the publish payload (ADR-0048 addendum Phase A1) #6864 in this repository, objectstack-ai/cloud#1927 on the cloud side).

Why

The addendum was accepted the day it was drafted, but the acceptance comment deliberately left the in-document status flip to "the next docs touch", and no docs touch came for three months. Agents and people reading the ADR concluded the contract was undecided. The maintainer's 「同意」 on #30814 is to correct the record only — not to build the namespace-exclusivity gate now — so this PR changes two status lines and adds one dated note, and nothing else.

Tests

None: a docs-only change to one ADR. No code, schema, generated artifact or published file moves.

Acceptance notes

Verification

Local gates at 9f78f24 (dispatch-gates --commands on this diff, 21 commands; exit codes captured before any pipe)
node scripts/check-adr-links.mjs --self-test :: exit 0
node scripts/check-adr-links.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/ci/plan-test-core-shards.mjs --self-test :: exit 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0
pnpm check:adr-anchors :: exit 0
pnpm check:adr-index :: exit 0
pnpm check:adr-symbol-anchors :: exit 0
pnpm check:ci-filter-parity :: exit 0
pnpm check:closed-ceremony-text :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:doc-authoring :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:gitlink-declared :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:pm-governed-merges :: exit 0
pnpm check:pm-prior-rulings :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:watch-hint-literal :: exit 0

node scripts/pm/dispatch-gates.mjs --ran: 21 derived, 21 run, 0 NOT-MEASURED, 0 UNRUN (exit 0). check:doc-formula-expressions ran after pnpm --filter '@objectstack/lint...' build under os-verify-lock (VERDICT command-exit 0, 96s). check:commit-card-trailers --range origin/main..HEAD: 1 commit, no card relation, no model identifier (exit 0).
CI families outside the derivation (artifact rosters, wide-population families, the type-check lanes) are CI's; this PR's check-runs are their record.

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (not touched)
  • 2. Every name I added uses the casing for its kind. (none added)
  • 3. No formatter ran; pnpm lint passes. (no source file touched)
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset. (publishes nothing: skip-changeset)
  • 6. packages/spec touched: its generated artifacts are regenerated and committed. (not touched)
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English.
  • The Before Submitting list in CONTRIBUTING.md is done.

Generated by Claude Code

The 2026-08-08 addendum (publish-time / marketplace namespace exclusivity)
still read "Proposed" in its header entry and its own status line; the
maintainer accepted it as drafted on 2026-08-08 and PR #6671 landed it with
the line deliberately left for the next docs touch. Both lines now say
Accepted (2026-08-08) and link the acceptance comment of record.

One dated note closes §A.5: Phase A2 stays bound to the activation
precondition; while publishing is first-party only, D2 + D4 reserve the
first-party namespaces at switch-on, so no separate official reserved list is
needed; Phase A1 is landed (#6864, cloud#1927). No decision text changes.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WV4cwkYtfcduZmfxJhuG3
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Nov 6, 2026
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Nov 6, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#4 · os-elon-musk · session_016WV4czvZykUqhYxYXSSDt4

Contract review for card #30814 · governed ADR text (docs/adr/**) · read-only reviewer at the contract-review tier, brief per record-recognisers --brief-template --paths · 2026-11-06T06:09Z

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 9f78f24c9cbfd884dcbe517b7f5988818c83ae9b
Local-runs: none
Scope: docs/adr/0048-cross-package-metadata-collision.md + packages/spec/src/marketplace/package.zod.ts, packages/cli/src/commands/package/publish.ts (the live code the new §A.5 note makes claims about; the ADR's own packages/spec/src/cloud/package.zod.ts path has since moved to marketplace/). Citations read on GitHub: #1825 comment 5226411687, PR #6671, PR #6864, #6760 comment 5228813333. objectstack-ai/cloud#1927 is unreachable from this session and stays unverified.

① Derived judgments

  • File list: one path, docs/adr/0048-cross-package-metadata-collision.md, +19 / −2, three hunks (head lines 8, 370–375, 724–734). The PR base 2038c56e and the local checkout both carry blob 3a84eeea for this file, so the files-API patch IS the net diff against main; the branch holds one commit, 9f78f24c. No second file, no hidden hunk.
  • Governed surface: docs/adr/** is Tier H. The PR is draft, unarmed, unqueued; the dev opened it and stopped, as Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14 and Post-Task ✨ Set up Copilot instructions #2 require. Right.
  • Accept-set change: none. No Zod schema, no packages/**, no generated artifact, no authorable-surface entry, no skill, no workflow, no retired key. Dev's Metadata-protocol: none — right.
  • Public-surface change: none. Dev's Clause-②: no, no arm — right. A (narrowing) or (widening) arm would have been wrong on this diff.
  • Check-runs on 9f78f24c: 46 runs, 26 success, 20 skipped (opt-in and path-filtered lanes), 0 failure, 0 pending. Governed Surface Queue Guard, Check Changeset, Check Documentation Links, Lint · PM dispatch-gates, Lint · docs & code guards, PR-body guards: success. Those conclusions are the gate verdicts; the 21-command local table in the PR body is the dev's reporting and was not re-run here.

② Semver level

  • No changeset in the diff; the skip-changeset label is on the PR (sent on the create, present on read). Correct: docs/adr/** publishes nothing from any released package, so skip-changeset is the only right declaration and a patch changeset would have been malformed.
  • PR body carries line-initial Clause-②: no (no arm) and Metadata-protocol: none; both match a diff that publishes nothing. Check Changeset: success. Right.

③ Boundary flags

open_questions: [] — nothing to answer. The four out-of-scope stale lines, each verified in the head tree:

  1. §A.6 still reads [proposed] Phase A1 (head line 740) although A1 landed on 2026-08-09 by PR feat(spec,cli): carry the package namespace on the publish payload (ADR-0048 addendum Phase A1) #6864 (merged, 8 files: namespace on both publish schemas, CLI read, tests, changeset). Outside the claim's pinned file surface (line 8, line 370, one note under §A.5); escalated in the PR's Acceptance notes. Escalated — but the PR's own note now says "Phase A1 is landed" (head line 731) nine lines above that bullet, an adjacency this PR creates. Carried as ④ should-fix 1; not a FAIL.
  2. The header Addenda line (8) lists only the 2026-08-08 addendum; the 2026-10-08 addendum (head line 780, Accepted) is named in line 3's status but has no header entry. Incomplete, not false; out of scope; escalated. Accepted as escalated.
  3. §A.0 "Publish time has zero namespace surface" is self-dated ("verified against main, 2026-08-08") and superseded by feat(spec,cli): carry the package namespace on the publish payload (ADR-0048 addendum Phase A1) #6864. True as dated, labelled as a measurement; out of scope; escalated. Accepted as escalated.
  4. ADR-0048 addendum Phase A1: namespace travels on the publish payload (PackageSchema / CreatePackageRequestSchema + CLI publish) #6760's claim comment (5228813333) cites "ADR-0048 follow-up: marketplace publish-time namespace registration & exclusivity #1825 comment 5226117769"; that id answers 404 and the real acceptance comment is 5226411687. A GitHub comment, not repository text — nothing in the tree to edit. Accepted as noted.

Dev deviations: (1) objectstack-ai/cloud#1927 could not be read — handled honestly: the PR body says so in both the Acceptance notes and the 维护者速读, cites it exactly as the card body (the maintainer's filing, epic:#3600#1) cites it, and asks the Tier H approver to confirm before merging. This review could not reach that repository either; the claim rests on the card's authority. See ④ should-fix 3 on the ADR wording. (2)–(4) (reviewer request left to the seat; model-free commit trailer pair; PR template mirrored) are procedural and touch no tree content; PR-body guards and the lint lanes are green.

④ Design judgment

docs/adr/0048-cross-package-metadata-collision.md, judged against the code it cites in the live tree and against the scenario it is accepted against: the maintainer's 「同意」 on #30814 to correct the record only and not to build the exclusivity gate.

Holds:

  • Hunks 1 and 2 (lines 8, 370–375): the acceptance record exists and says what the ADR now says. ADR-0048 follow-up: marketplace publish-time namespace registration & exclusivity #1825 comment 5226411687, created 2026-08-08T13:55Z, opens "Maintainer ruling (2026-08-08, via the engine-core PM session): ADR-0048 addendum ACCEPTED as drafted, including the two flagged extensions — D2 ... and D3 rule 2", and states "The in-document status line reads 'Proposed' at merge time; this comment is the acceptance record of authority, and the status-line flip rides the next docs touch". PR docs(adr): ADR-0048 addendum — publish-time / marketplace namespace exclusivity contract #6671 is merged 2026-08-08T14:23Z, one file (this ADR, +396). Every fact in the two status lines — date, 13:55Z, "as drafted", "D2 and D3 rule 2 included", "landed it the same day", "still reading Proposed", "record of authority until the line caught up" — traces to that comment and that PR. Line 8's "additive to §3.2, supersedes nothing" and line 375's "It is additive to §3.2 and supersedes no text above …" are kept verbatim: the status lines move no decision text.
  • §A.5 note, "Phase A2 ... stays bound to this precondition: it lands before third-party publishing opens, and the opening waits for it." A.5 already rules that the check "MUST land before third-party publishing opens. It is an acceptance criterion for opening third-party publishing, not a follow-up to it", quoting 「三方 publisher 开放前必须完成 namespace→publisher 唯一性检查」, and A.6 marks A2 "This is the item bound by §A.5." "The opening waits for it" restates "acceptance criterion for opening"; it adds no decision the addendum does not already contain.
  • §A.5 note, D2 + D4: D4 rule 1 reads "When the registry is switched on, back-fill it ... award the reservation to the publisher of the earliest published version carrying it (first-come)"; D2 reads "The reservation is held by the publisher, not by the package". The note's gloss — "the back-fill awards each published namespace to the publisher of its earliest published version, and the reservation is held by that publisher" — is those two sentences, and D4's own closing paragraph already expects that "at switch-on the corpus is first-party plus internal". The account matches the addendum's D2/D4 text.
  • §A.5 note, "Phase A1 is landed ... carries namespace on the publish payload in this repository, read off the artifact's manifest.namespace": in the live tree packages/spec/src/marketplace/package.zod.ts lines 196–205 put namespace on PackageSchema (regex /^[a-z][a-z0-9_]{1,19}$/, "mirrors manifest.namespace") and line 304 sets namespace: PackageSchema.shape.namespace on CreatePackageRequestSchema; packages/cli/src/commands/package/publish.ts readArtifactNamespace() (line 209) reads artifact?.manifest?.namespace, line 558 refuses a malformed value before any network call, line 619 if (namespace) pkgBody.namespace = namespace sends it. The claim holds against the code.
  • Scenario: no gate was built. NAMESPACE_ALREADY_RESERVED / NAMESPACE_RESERVED_PLATFORM occur nowhere in the tree outside the ADR's own §A.2 pseudo-code, and the diff touches no code. "Correct the record only" is honoured.
  • The note's heading "no decision changes" is true: D1–D6, §A.2–A.4, A.6, A.7 are untouched; the note is a blockquote appended after A.5's prose, and A.5's normative text (the MUST and the quoted ruling) stands intact.

Should-fix (none blocking):

  1. The note's "Phase A1 is landed" (head line 731) now stands nine lines above A.6's "[proposed] Phase A1" (head line 740). The contradiction is new to this PR, not inherited. The fix is a one-word [done] flip of that bullet, by the owning seat on this PR under the approver's word, or as a follow-up card; the record as written stays correct (the note is dated, the bullet is the stale one).
  2. "first-party namespaces are reserved at switch-on by D2 and D4" names the mechanism for reservable namespaces only. The whitelist set base/system/sys is, by D3 rule 1, "never reserved" (no reservation written, none consulted) and is protected by D3 rule 2 (first-party tier only). A reader could take the sentence to say sys receives a D4 reservation, which D3 forbids. The ADR is not contradicted — D3 stands verbatim above, and "no separate official reserved list is needed" remains true because the whitelist is already the install gate's constant — but "(the D3 whitelist aside, which is never reserved and is tier-restricted)" would make the sentence exact. The wording is the card's ask, reproduced; precision, not a decision.
  3. "objectstack-ai/cloud#1927 is its cloud-side half" states as record a relation this repository cannot verify and that A.6 does not define (A.6 and the acceptance comment place A1 "open-side, this repo"). §A.0/§A.2 make an enterprise-side receiver of the payload field implicit, and the card body — the maintainer's filing — names cloud#1927 as part of A1's landing, so the claim is on the card's authority and the note carries #30814 as its citation. Honest in the PR body; in the ADR text "on the cloud side (per ADR-0048 Addendum A still reads Proposed; it was accepted on 2026-08-08 (#1825); record that its exclusivity gate stays bound to A.5 #30814)" would carry the provenance rather than assert the "half". The Tier H approver confirms it before the click, as the PR asks.

No must-fix found.

Implemented-by: claude/project-thread-gor61o
Reviewed-by: session_016WV4czvZykUqhYxYXSSDt4

VERDICT: PASS

The §A.5 note now names the D3 whitelist as the exception to "reserved at
switch-on by D2 and D4" (base/system/sys is never reserved and stays
first-party-tier only), and carries the provenance of the cloud-side
citation instead of asserting the relation. §A.6's Phase A1 bullet flips
from [proposed] to [done], citing PR #6864, so it no longer contradicts the
note nine lines above it. No decision text moves.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WV4cwkYtfcduZmfxJhuG3
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#4 · os-elon-musk · session_016WV4czvZykUqhYxYXSSDt4

Delta re-review for card #30814 over record 6678388633 (PASS on 9f78f24c, three should-fix) · governed ADR text · read-only reviewer at the contract-review tier · 2026-11-06T06:41Z

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 8c6488558366f1566da4a91d1a618c83012939d2
Local-runs: none
Scope: docs/adr/0048-cross-package-metadata-collision.md + packages/spec/src/marketplace/package.zod.ts, packages/cli/src/commands/package/publish.ts (the live code the §A.5 note and the §A.6 Phase A1 bullet make claims about; unchanged since the prior record and not re-read, the prior reading stands). Citations read on GitHub this round: PR #6864 (merge date, file list), #1825 comment 5226411687, card #30814 with every comment (6677266471, 6677779234, 6677846365, 6678001686, 6678359816, 6678764595), the prior record 6678388633, the compare 9f78f24c...8c648855, the PR's files API and raw diff, the check-runs on 8c648855. objectstack-ai/cloud#1927 stays unreachable from this session and unverified.

Delta record over 6678388633 (PASS on 9f78f24c9cbfd884dcbe517b7f5988818c83ae9b). Findings carried forward unchanged are marked as such.

① Derived judgments

  • Delta: the compare is ahead_by 1, behind_by 0, one commit 8c648855 (committed 2026-11-06, "docs(adr): fold the contract review's three should-fixes into ADR-0048", model-free trailer pair), one file, +8 / −7, two hunks: the §A.5 note (head lines 728–735) and the §A.6 Phase A1 bullet (head lines 741–744). No second file, no hidden hunk.
  • Net diff against main: still one path, docs/adr/0048-cross-package-metadata-collision.md, now +22 / −4 in four hunks (head lines 8, 370–375, 724–736, 741–744). Base sha 2038c56e is unchanged; main has moved to ae82d057 but carries the same blob 3a84eeea for this file, and the local checkout carries it too, so the files-API patch IS the net diff. Head blob a679e860 matches the contents API at 8c648855. The branch holds two commits, 9f78f24c then 8c648855.
  • Widened surface: the re-posted claim 6678359816 widens the file surface to "the §A.6 Phase A1 bullet [proposed] → [done] per the contract review's should-fix 1". The delta's two hunks sit inside the widened surface (the note under §A.5, the A1 bullet); nothing outside it moved. ⛔-list intact: no code, no other ADR, no packages/**, no skills/**.
  • Governed surface: docs/adr/** is Tier H. The PR is draft, auto_merge: null, no requested reviewers, zero reviews, unqueued; the dev pushed and stopped, as Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14 and Post-Task ✨ Set up Copilot instructions #2 require. Carried forward: right.
  • Accept-set change: none (carried forward — a prose-only delta). Dev's Metadata-protocol: none — right.
  • Public-surface change: none (carried forward). Dev's Clause-②: no, no arm — right.
  • Check-runs on 8c648855: 41 runs, 25 success, 16 skipped, 0 failure, 0 pending; commit status API pending with zero contexts (nothing reports there). Lint & Repo Gates, TypeScript Type Check, Test Core, Governed Surface Queue Guard, PR-body guards, Check Documentation Links, Lint · PM dispatch-gates, Lint · docs & code guards, Check PR Size: success. Build Core, Lint UI, Type Check UI, Build & E2E UI, Live E2E UI and the UI/dogfood matrices: skipped, path-filtered on a docs-only diff, as on the prior head. One difference from 9f78f24c: Check Changeset is skipped on this head (it was success before); the skip-changeset label is on the PR and a skipped lane is not a red. Those conclusions are the gate verdicts; the 21-command local table in the dev's round-2 addendum (6678764595) is the dev's reporting and was not re-run here.

② Semver level

Carried forward unchanged: no changeset in the diff; skip-changeset label present (labels now documentation, size/s, skip-changeset); docs/adr/** publishes nothing from any released package, so skip-changeset is the only right declaration. PR body still carries line-initial Clause-②: no (no arm) and Metadata-protocol: none; the delta adds nothing that publishes. Right.

③ Boundary flags

open_questions: [] on both dev reports — nothing to answer.

The three should-fix items of the prior record, judged against the new text:

  1. Should-fix 1 — closed as asked. The §A.6 bullet now reads **[done] Phase A1 — carry the namespace to publish.** with "Landed by PR feat(spec,cli): carry the package namespace on the publish payload (ADR-0048 addendum Phase A1) #6864 (2026-08-09)." appended (head lines 741–744); the bullet's description ("namespace on PackageSchema / CreatePackageRequestSchema; objectstack package publish reads it off the artifact manifest. Open-side, this repo. Prerequisite for everything below.") is byte-unchanged. The prior record asked for "a one-word [done] flip of that bullet, by the owning seat on this PR"; it was done under the widened claim 6678359816, which names exactly that bullet. The adjacency contradiction (note at head line 733 "Phase A1 is landed" nine lines above a [proposed] bullet) no longer exists.
  2. Should-fix 2 — closed as asked. The note now reads "reserved at switch-on by D2 and D4 (the D3 whitelist aside, which is never reserved and stays first-party-tier only): the back-fill awards …" (head lines 728–732). The prior record proposed "(the D3 whitelist aside, which is never reserved and is tier-restricted)"; the landed wording is that parenthesis with "tier-restricted" made concrete. Verified against D3 in ④.
  3. Should-fix 3 — closed as asked. "objectstack-ai/cloud#1927 is its cloud-side half" is gone; the note now reads "with its cloud-side receiver in objectstack-ai/cloud#1927 (per ADR-0048 Addendum A still reads Proposed; it was accepted on 2026-08-08 (#1825); record that its exclusivity gate stays bound to A.5 #30814)" (head lines 734–735). The provenance the prior record asked for is carried in the text. Residual, unchanged from the prior record: this session cannot read objectstack-ai/cloud, so whether fix(example-crm): make formula fields compute + allow historical closed deals; bump objectui #1927 is that receiver rests on the card body (the maintainer's filing, epic:chore(release)!: enter RC pre-mode and anchor the train as the v17 major #3600#1); the PR body still asks the Tier H approver to confirm it before the click.

Out-of-scope stale lines, carried forward from the prior record with the first one now resolved:

  • Prior item 1 (§A.6 [proposed] Phase A1): resolved by this delta — see should-fix 1 above.
  • Prior item 2 (header Addenda line 8 lists only the 2026-08-08 addendum, not the 2026-10-08 one): unchanged in the head tree (line 8 still names one addendum); incomplete, not false; out of scope; accepted as escalated — the dev's round-2 addendum lists it again as noted, not filed.
  • Prior item 3 (§A.0 "Publish time has zero namespace surface", self-dated "verified against main, 2026-08-08", head line 412): unchanged; true as dated, labelled as a measurement. The [done] flip at A.6 does not make it worse than the note already did: the ADR now records, in three dated places (A.0 at 2026-08-08, the §A.5 note and the A.6 bullet at 2026-11-06 / 2026-08-09), that the surface was absent on 2026-08-08 and present from 2026-08-09, which is consistent. Accepted as escalated.
  • Prior item 4 (ADR-0048 addendum Phase A1: namespace travels on the publish payload (PackageSchema / CreatePackageRequestSchema + CLI publish) #6760's claim comment cites comment id 5226117769, the real id is 5226411687): a GitHub comment, not repository text; nothing in the tree to edit. Carried forward.

Dev deviations, carried forward: (1) cloud#1927 unreadable, handled honestly in the PR body and now in the ADR text's "(per #30814)"; (2)–(4) procedural, touch no tree content. New this round: none reported; the round-2 addendum states "Still draft, not readied, no reviewers requested", which the PR read confirms.

④ Design judgment

docs/adr/0048-cross-package-metadata-collision.md at 8c648855, judged against the ADR's own decision text and the code it cites, and against the scenario it is accepted against: the maintainer's 「同意」 on #30814 to correct the record only and not to build the exclusivity gate.

Carried forward unchanged (the delta does not touch these lines): hunks 1 and 2 (lines 8, 370–375) trace every fact to #1825 comment 5226411687 (created 2026-08-08, "ADR-0048 addendum ACCEPTED as drafted, including the two flagged extensions — D2 ... and D3 rule 2", "the status-line flip rides the next docs touch") and to PR #6671 (merged 2026-08-08, this file alone, +396); "additive to §3.2, supersedes nothing" and "It is additive to §3.2 and supersedes no text above …" are kept verbatim. The note's A2 sentence restates A.5's own MUST ("acceptance criterion for opening third-party publishing, not a follow-up to it") and A.6's "This is the item bound by §A.5." The D2 + D4 gloss is D4 rule 1 ("back-fill … award the reservation to the publisher of the earliest published version carrying it") and D2 ("The reservation is held by the publisher, not by the package"). The Phase A1 code claim holds against packages/spec/src/marketplace/package.zod.ts (namespace on PackageSchema, re-used on CreatePackageRequestSchema) and packages/cli/src/commands/package/publish.ts (readArtifactNamespace() reads artifact?.manifest?.namespace, refuses a malformed value before any network call, sends it). No gate was built: NAMESPACE_ALREADY_RESERVED / NAMESPACE_RESERVED_PLATFORM occur nowhere outside the ADR's §A.2 pseudo-code, and the diff touches no code.

New text, re-checked against the ADR itself and the live tree:

  • D3 whitelist parenthesis against D3 rule 1 and rule 2. D3 (head lines 487–506) defines the set as base, system, sys — "RESERVED_NAMESPACES ∪ {'sys'}, the identical set isShareableNamespace() already exempts" — and gives two rules. Rule 1: "They are never reserved and never conflict. A publish carrying one of them neither creates a reservation nor consults one". Rule 2: "They are restricted by publisher tier, not by first-come. Only publisher: 'objectstack' (the first-party tier already in PackagePublisherSchema) may publish a package whose namespace is in the whitelist. Anyone else is rejected." The note's "which is never reserved" is rule 1's first clause verbatim; "stays first-party-tier only" is rule 2's "Only … the first-party tier … Anyone else is rejected", with "stays" marking that the note changes nothing. The parenthesis excludes the whitelist from "reserved at switch-on by D2 and D4", which is what rule 1 requires (no reservation is written for it, so the D4 back-fill cannot award one), and it does not reopen the trap D3 names ("conflating the two"): the two properties are stated as two, in rule order. The sentence that follows — "So no separate official reserved list is needed" — remains true on both halves: reservable first-party namespaces are covered by the D4 back-fill, the unreservable platform set by the whitelist constant the install gate already holds. D3's own text is untouched. Exact; no decision moves.
  • "[done] Phase A1 … Landed by PR feat(spec,cli): carry the package namespace on the publish payload (ADR-0048 addendum Phase A1) #6864 (2026-08-09)" against PR feat(spec,cli): carry the package namespace on the publish payload (ADR-0048 addendum Phase A1) #6864. The pulls API answers merged: true, merged_at 2026-08-09, merge commit 4cc4fb7e, title "feat(spec,cli): carry the package namespace on the publish payload (ADR-0048 addendum Phase A1)", eight files: packages/spec/src/cloud/package.zod.ts (+35), packages/spec/src/cloud/template-manifest.zod.ts, packages/cli/src/commands/package/publish.ts (+52), two tests, packages/spec/authorable-surface/cloud.json, content/docs/references/cloud/package.mdx, a changeset. That is the bullet's own description of A1 (namespace on both publish schemas; the CLI reads it off the artifact manifest; open-side, this repo), so [done] is earned under §5's legend ("[done] shipped", line 318, which A.6 adopts by "Status legend as in §5") and the date is the merge date. Holds. The same date and PR number appear in the §A.5 note; the two agree.
  • "cloud-side receiver … (per ADR-0048 Addendum A still reads Proposed; it was accepted on 2026-08-08 (#1825); record that its exclusivity gate stays bound to A.5 #30814)". The ADR already places the consumer of the publish payload outside this repository: "The marketplace review pipeline (enterprise-side, outside this repo)" (head line 424), A.6's A2 "Enterprise-side", and §A.5's "lets the enterprise-side implementation be scheduled". "Receiver" names that role in the ADR's own framing rather than asserting a "half" of A1 that A.6 does not define (A.6 keeps A1 "Open-side, this repo", unchanged). "(per ADR-0048 Addendum A still reads Proposed; it was accepted on 2026-08-08 (#1825); record that its exclusivity gate stays bound to A.5 #30814)" carries the provenance, as asked. Which cloud item fills the role is still unverifiable from here and remains the approver's confirmation — the PR body says so.
  • Does the delta move any decision text or create a new contradiction? D1–D6, §A.0–A.4, A.7 and the two status lines are byte-identical between 9f78f24c and 8c648855 (the compare shows exactly the two hunks above). The note's heading "no decision changes" stays true. A1 is now consistently "landed" in the note and [done] in A.6; A2, A3 remain [proposed], A4 [deferred], the non-goal unchanged, so A.6's "Prerequisite for everything below" still reads correctly with A1 done and the rest open. The sole remaining tension in the file is A.0's dated measurement against A1's landing, which pre-exists this PR, is self-dated, and is carried as escalated above. No new contradiction.
  • Scenario. Still "correct the record only": the delta is 15 prose lines in one ADR, no gate, no schema, no skill, no workflow.

Should-fix: none remaining. Must-fix: none found.

Implemented-by: claude/project-thread-gor61o
Reviewed-by: session_016WV4czvZykUqhYxYXSSDt4

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#4 · os-elon-musk · session_016WV4czvZykUqhYxYXSSDt4

维护者速读

  1. 改了什么:ADR-0048 的 2026-08-08 附录 A(发布期 / 市场命名空间独占)原先仍标「Proposed」,现在两处都改为「Accepted (2026-08-08)」,并引用 ADR-0048 follow-up: marketplace publish-time namespace registration & exclusivity #1825 的接受评论 5226411687 和 PR docs(adr): ADR-0048 addendum — publish-time / marketplace namespace exclusivity contract #6671。§A.6 的 Phase A1 改为 [done](PR feat(spec,cli): carry the package namespace on the publish payload (ADR-0048 addendum Phase A1) #6864)。§A.5 末尾加了一段 2026-11-06 的说明:A2 仍受 A.5 前提约束;只开放第一方发布期间,D2 + D4 在启用时为第一方保留命名空间(D3 白名单除外),所以不需要另建官方保留清单。
  2. 为什么改:ADR-0048 Addendum A still reads Proposed; it was accepted on 2026-08-08 (#1825); record that its exclusivity gate stays bound to A.5 #30814,按你的「同意」只更正记录,不建独占校验。
  3. 风险:极低。只改一个 ADR 文件,+22/−4,没有改任何决定文字,也不涉及代码。
  4. 先看:docs/adr/0048-cross-package-metadata-collision.md 的第 8 行、第 370 行、§A.5 的说明、§A.6 的 A1。
  5. 两分钟验证:打开 ADR-0048 follow-up: marketplace publish-time namespace registration & exclusivity #1825 的评论 5226411687,对照新的状态行。
  6. 需要你做的:Tier H,需要 os-zhuang 或 hotlong 批准。请批准前确认一点:objectstack-ai/cloud#1927 是 A1 的云端接收方。这个仓库车队读不到,依据是卡片原文。批准后由席位落地。

席位意见:ACCEPT(#30814)。

席位核对

Head-sha: 8c6488558366f1566da4a91d1a618c83012939d2 · read 2026-11-06T06:41Z

Item Reading
Shape Draft → main, Fixes #30814, title docs(adr): record ADR-0048 Addendum A as accepted. One file, +22/−4, two commits. Branch claude/project-thread-gor61o (claim 6678359816, surface widened to the §A.6 bullet).
Seat diff read Both status lines say Accepted (2026-08-08) and link #1825 comment 5226411687 (os-zhuang, 2026-08-08, "ADR-0048 addendum ACCEPTED as drafted") and PR #6671 (merged 2026-08-08). "Additive to §3.2, supersedes nothing" is kept verbatim. The §A.5 note restates A.5's own precondition and the D2 + D4 back-fill, with the D3 whitelist aside. The §A.6 A1 bullet is [done] with PR #6864 (merged 2026-08-09). No decision text moved.
Evidence os-dev-report 6678001686 and addendum 6678764595: dispatch-gates --ran 21/21 exit 0 on each head. Contract review PASS 6678388633 on 9f78f24c (three should-fix items), all three folded in at this head. Delta re-review PASS on this head (the comment above).
Gates (check-runs on this head) 41 runs: 25 success, 16 skipped (path-filtered on a docs-only diff), 0 failed. mergeable_state clean.
Accepted deviations objectstack-ai/cloud#1927 is cited "per #30814" because the fleet can't read that repository. The approver confirms it.
Out of scope Three items noted in the PR, not edited: the header Addenda line lacks the 2026-10-08 addendum (incomplete, not false); §A.0's measurement is self-dated to 2026-08-08; #6760's claim cites a wrong comment id (a GitHub comment, not tree text).
Semver skip-changeset (docs/adr publishes nothing). Clause-②: no, Metadata-protocol: none.
Landing GOVERNED, Tier H (check-governed-merges --pr 30833: docs/adr/**), 26 lines. The seat hands it off now: pr_ready (requests the GOVERNED_APPROVERS) and pm:awaiting-merge. After an APPROVED review by os-zhuang or hotlong, the seat lands it with automerge_enable.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review November 6, 2026 06:43
@objectstack-fleet objectstack-fleet Bot added the pm:awaiting-merge PR only: landing waits on the maintainer's own review and merge (SKILL.md 复核 ②); never on an issue label Nov 6, 2026
@os-zhuang
os-zhuang added this pull request to the merge queue Nov 6, 2026
Merged via the queue into main with commit f283226 Nov 6, 2026
47 checks passed
@os-zhuang
os-zhuang deleted the claude/project-thread-gor61o branch November 6, 2026 08:18
@objectstack-fleet objectstack-fleet Bot removed the pm:awaiting-merge PR only: landing waits on the maintainer's own review and merge (SKILL.md 复核 ②); never on an issue label Nov 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ADR-0048 Addendum A still reads Proposed; it was accepted on 2026-08-08 (#1825); record that its exclusivity gate stays bound to A.5

3 participants