Repository navigation
docs(adr): ADR-0126 — the platform customization model for packaged metadata (three regimes, one activation ledger) - #12063
Merged
Conversation
…etadata Three regimes assigned by what the artifact does (overlay / clone+takeover / extend), one generic data-plane activation ledger (sys_metadata_activation), install-level write authority with the org column reserved, the #6190 and sole-definition-ledger walls restated, and the packaged-flow worked example carrying the 2026-08-25 tentative directions (settled only by this ADR's human merge). Survey posted on the card as the evidence base. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KWRU3s15AJz7PGW7a7wdCh
…ime C simplified to enable/disable + clone, no designation linkage Records the two 2026-08-25 maintainer amendment rulings verbatim in the Deciders block. Ruling 1 moves hook out of the model (package code, no ledger row, no disable switch — the job posture; sibling authoring stays open). Ruling 2 drops replaced_by and cloned_from from the ledger: the schema is (metadata_type, name, package_id, organization_id reserved, active); clone and disable become independent primitives; the subflow guard attaches to disable; the base-moved notice is withdrawn and clone ancestry is recorded as deliberately untracked. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KWRU3s15AJz7PGW7a7wdCh
…isable leg follows the flow legs Records the third 2026-08-25 maintainer ruling verbatim in the Deciders block. action does not follow hook out of the model: internal package plumbing is code-only, customer-facing business behavior is disable + clone. The quote is first-party pull for the disable half, so the action-disable leg (same sys_metadata_activation ledger, same write authority, a consult point at action dispatch, a surface row) is chartered to follow the flow legs; the clone half stays pre-charted. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KWRU3s15AJz7PGW7a7wdCh
9 tasks done
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.
Part of #12049 — the ADR half of the card; the survey half is issue comment 5406807988. #12049 stays open until this ADR is merged and verified on origin/main.
Amended 2026-08-25 (commit
07f4e024) then amended again (commita09d035a) — three maintainer rulings issued after the first draft, all, recorded verbatim and untranslated in the ADR's Deciders block: 「hook 也算代码类吧,我觉得也不需要修改。」 (hook reclassified out of the model — package code, no ledger row, no disable switch, sibling authoring open as today) and 「行为类 能否搞一个启用停用的功能,我不想要可以停用,然后克隆一个。」 (Regime C simplified to two independent primitives — enable/disable + clone-as-sibling — with no designation linkage:replaced_byandcloned_fromdropped from the ledger; the base-moved notice withdrawn; the subflow guard attaches to disable); and 「动作 可能是需要开关的,因为有的 action 我不想启用。」 (action stays Regime C — the disable half has first-party maintainer pull on record and follows the flow legs when the post-merge implementation cards are cut; the clone half stays pre-charted; PM ruling record: #12049 comment 5408117664).What this PR is
One new file:
docs/adr/0126-packaged-metadata-customization-model.md— the platform customization model for packaged metadata, chartered by the maintainer on 2026-08-25 (verbatim in the ADR header). It records:objectExtensions/ ADR-0029 D7 nav contributions). Code-only types stay outside the model,hookjoins them by amendment ruling 1, andactionstays in Regime C by amendment ruling 3 (internal package plumbing → code-only; customer-facing business behavior → disable + clone). Per-type assignment table from the measured survey.sys_metadata_activation: (metadata_type, name, package_id, organization_id nullable-reserved) → active. That is the whole schema — no clone linkage is recorded, matching the landed Studio save of a package-declared permission set forks it into a silent, undiscoverable overlay #11513 posture.sys_metadataremains the sole definition ledger; consult points stay per-runtime.allowOrgOverrideflip on a behavioral type is a stop-and-report), sole-definition-ledger, upgrade-vs-choice separation (base version history and the ledger never meet), and the [finding] spec ships a three-layer metadata-customization protocol (MetadataOverlaySchema, field-level change tracking) with zero consumers — published reference docs describe an unimplemented customization architecture #12057 paper-protocol disposition.execute()seam besideFLOW_DISABLED, retiring the Decide whether POST /api/v1/automation/:name/toggle belongs in the manage_metadata write set — it mutates flow enablement with no authoring capability #10243flowEnabledmap · disable refused while packaged subflow callers reference the target, callers named · Fork D leaning D2 Setup surface showing on/off only — no drift or ancestry surface. Each direction is marked as settled only by this ADR's acceptance — the maintainer's merge is the ruling.sys_permission_set.activeonly; the five overlay types untouched.Governed surface
docs/adr/**— ⛔ this PR stays DRAFT: never ready, never queued, never auto-merged; the maintainer's hand-merge is the review record and the model's acceptance (Prime Directive #14).Evidence
The survey (same card, comment above) is the measured base: 27-type census with the write-door tier partition, the four real mechanisms plus the paper one, per-type table, doc-promise measurements, and spot-checks of #11665's F1/F3/F4/F5 on
origin/main0b048393. Out-of-scope finding filed unassigned: #12057 (finding) — #12057 remains open and is not addressed here.Verification (docs-only diff; all local gates re-run at
a09d035a, after the latest amendment commit)Gate list re-derived by
node scripts/pm/dispatch-gates.mjs(no paths — the script took the changed set from merge-base itself; stderr header namedobjectstack-ai/objectstackata09d035a; same 5 families as the first draft):pnpm check:adr-anchorspnpm check:doc-authoringpnpm --filter @objectstack/lint run check:doc-formula-expressionspnpm check:pm-governed-mergesnode scripts/check-adr-links.mjspnpm check:nul-bytesPushed-file read-back: the remote blob for the ADR on this branch hashes
6ca6dd1d— byte-identical to the local commit.No changeset: docs-only ADR PR,
skip-changesetper the ADR-0124 precedent (PR #9856); label applied via the additive endpoint and read back.Generated by Claude Code
Generated by Claude Code