Uh oh!
There was an error while loading. Please reload this page.
docs(adr): ADR-0126 — the platform customization model for packaged metadata (three regimes, one activation ledger) - #12063
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
os-trump
commented
Aug 25, 2026
Merging on the maintainer's direct instruction. Provenance (who / verbatim / where): the maintainer, in the PM chat session (2026-08-25), after the batch-1 governed-PR review of five PRs including this one was presented in full: 「同意,帮我合并,然后继续」. The hand-merge-by-maintainer rule is satisfied through that explicit delegation; this comment is the audit record for the governed-merges checklist. Checks verified at head Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
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