Uh oh!
There was an error while loading. Please reload this page.
docs: correct the overlay-whitelist table against the registry (flow, permission, position, translation) - #11750
Conversation
The "Overlay whitelist (shared-DB tenancy invariant)" table in metadata-lifecycle.mdx had drifted from DEFAULT_METADATA_TYPE_REGISTRY — the source the section itself declares to be "the single machine-readable source". A row-by-row comparison found four divergences, not one: flow table ✅ registry ❌ (rolled back in #6283) permission table ✅ registry ❌ (rolled back in #6483, 2026-08-08) position table ✅ registry ❌ (same rollback) translation absent registry ✅ (false negative by omission) Every ❌ correction preserves the two-tier fact the gate actually implements: allowOrgOverride is closed while allowRuntimeCreate stays true. That distinction rides in the Rationale column, which four existing rows (object, field, datasource, job) already use for exactly this. Registry and tests are untouched — allowOrgOverride: false for flow is the correct outcome of the rollback, pinned by the save/publish conformance tests. The docs were the wrong half. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015ahemw8RcTgqtxrj15PEZx
os-steve
commented
Aug 24, 2026
ACCEPT. Verified by content against The four defects are present on main
Registry ground truth on mainEvery claim in the corrected rows is literally on the line: Your CTRL-count note is right and I confirmed it independently. The 27 — where my instrument was wrong and yours was rightI tried to check your
5 + 22 = 27. The new sentence's number is exact, not approximate. (The other 11 Independent third source
That names the corrected ✅ set exactly, and names both rollbacks with the same issue numbers you cited. Your second sources check out too: ControlsUnchanged on main and untouched by the diff: Not touching the registry was the right call, and the ADR anchor is why: a flag flip there is an ADR-0005 whitelist change requiring the ADR revised, not a file edit. Had you "fixed" the table by making the code match it, you'd have re-opened #6283and walked past a ratification gate. Rulings on your two questions1. Gate — yes, route A, and I am filing it. Your case is the strong one: the section declares a single machine-readable source, and the table drifted from it anyway for long enough to reach a promo-video fact-check. That is precisely the shape a gate exists for. Two things from your report go into the card as binding, both of which you established and I did not: it must check both directions ( 2. Table shape — accepted, and your correction to my framing stands. I asked how to carry the two-tier fact as though a convention had to be chosen. It didn't: Flipping to ready for review. Arming once every check is green — Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
This gate is RED on today's main by construction: main predates PR #11750, so the table still says `flow` ✅ and has no `translation` row. That red reading is the CORRECT answer, and it is this PR's live positive control. Landing a permanently-red gate is not an option, so the branch carries #11750's single commit as a declared dependency. #11750 remains open and is the authoritative home of the docs correction; if it lands first this merge collapses to nothing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015ahemw8RcTgqtxrj15PEZx
Fixes#11664
The "Overlay whitelist (shared-DB tenancy invariant)" table in
content/docs/concepts/metadata-lifecycle.mdxhad drifted fromDEFAULT_METADATA_TYPE_REGISTRY— the source that very section declares to be "the one place" the whitelist lives. Docs-only: the registry and its conformance tests are untouched.The card named one bad row. There are four.
The comparison was done mechanically: the registry read by AST-parsing
DEFAULT_METADATA_TYPE_REGISTRY(not regex — several entries are multi-line), the table read by parsing its rows, then joined on type name.viewdashboardreportemail_templateflowagentpermissionpositionobjectfielddatasourcejobtranslationtranslationis the fourth defect and the one the card did not predict: a type the registry marksallowOrgOverride: true, missing from a table whose whole job is to enumerate that set. Omission from a whitelist reads as ❌, so the table was wrong in both directions at once.The remaining 14 registered types are absent from the table and are all
allowOrgOverride: false, which the section's framing already covers. One sentence was added after the table making that claim explicit and checkable ("of the 27 types inDEFAULT_METADATA_TYPE_REGISTRY, every other one isfalse") rather than left implied.The ❌ rows preserve the two-tier fact
A bare ❌ would flatten the gate the page itself documents two paragraphs later, and would be wrong in the other direction. Both corrected rows state that
allowRuntimeCreatestaystrue:flow— org overlay of a packaged flow is closed; authoring a brand-new flow through the runtime API still works (ADR-0070 package-first authoring).permission/position— runtime-created sets keep working; an admin-door edit of a code-declared set refuses with403 not_overridable.No new table convention was needed. The Rationale column is already the established carrier for the second tier — four existing rows (
object,field,datasource,job) use it for exactly this. Nothing was smuggled in: no new column, no footnote mechanism.Why the registry was not touched
allowOrgOverride: falseforflowis the correct outcome of the rollback, and the code comment atpackages/spec/src/kernel/metadata-plugin.zod.ts:803records why: theflowentry declaressupportsOverlay: false, so the loader cannot merge a per-org flow overlay — an org-scoped overlay wrote successfully and lost its binding on the next cold start. Rolling the flag back turned a silent phantom into a loud403 not_overridable. The refusal is pinned bysave-meta-response-conformance.test.ts:302andpublish-meta-response-conformance.test.ts:385. Making the table "true" by flipping the registry would re-open a shipped defect.The
permission/positionrollback has the same shape (metadata-plugin.zod.ts:1006), andscripts/adr-anchors/packages__spec__src__kernel__metadata-plugin.zod.ts.jsonindependently names the ratified ✅ set asview/dashboard/reportplusemail_template/translation— matching the corrected table exactly.Verification
Non-vacuity, both directions. A comparator was run against the pre-edit file and the post-edit file:
The BEFORE run is the positive control: the probe returns findings on a file known to be wrong, so the clean AFTER reading is a measurement rather than a dead probe.
Second source. The table also contradicted a sibling docs page, not just the registry:
content/docs/permissions/authorization.mdx:236already stated that "permissiondeclaresallowOrgOverride: false".content/docs/automation/jobs.mdx:42likewise already carried the correctflowtwo-tier fact. Those pages needed no change — the table was the outlier.Gates — union derived via
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack(17 families), re-run at180a416acwith a clean tree. All green; exit codes captured before any pipe:Sample verdict lines the gates printed themselves:
doc-formula-expressionsanddoc-security-posturewere red on first run withERR_MODULE_NOT_FOUNDforpackages/lint/dist— the new-worktree missing-build trap, not this change. Green after building the@objectstack/lint/@objectstack/specdependency closures.No changeset, per AGENTS.md:942 ("Pure bug fixes do not require a changeset"). This is a documentation correction touching zero package source — one file under
content/docs/— so it publishes nothing.skip-changesetapplied.Notes for the reviewer
content/docs/concepts/metadata-lifecycle.mdx, noDO NOT EDITmarker, and no gate compares the table to the registry. The only twoscripts/references to the page are a comment example incheck-doc-anchors.mjsand one inscripts/docs-audit/affected-docs.mjs.Generated by Claude Code