Skip to content

docs(validating-metadata): the four-door table understates the object runtime door after #4716 — and one row bundles four rule ids across the wall #9836

Description

@os-elon

Split out of the #4716 review (PR #9825) rather than ridden along with it. #9825 is a 697-line code PR; this is a docs-only edit on a page every rule-crossing PR touches, and one of its three rows needs an editorial split rather than a cell edit.

The falsification

content/docs/deployment/validating-metadata.mdx documents "the one gate, four doors": os validate / os build / os lint / the runtime publish door (saveMetaItem, since #4463). Its table's fourth column carries one superscript per metadata type a rule inspects — ✓ᵒ is object — and the page states its own authority rule in as many words:

that rule's own runtimeTypes in AUTHORING_RULES is the authority — the set has grown a type at a time (#4463 shipped P1 as flow and four rule families, #7220 moved the whole views[] visibility-predicate family across in one edit, #7529 put widget-binding integrity on dashboard, #8307#8310 walked the ADR-0090 security-posture block across seed, then permission and book, then object), so read the rule rather than assuming a save of some other type reaches storage unjudged.

#4716 crosses five gating rules onto the object runtime door. Measured against origin/main at 278280586, those five land in exactly three rows, all of which read in the runtime publish column:

linerowrules it coversafter #4716
:392Zod-valid but functionally inert declarations — a summary with no operations (ADR-0078), a managed object advertising an API method its affordances refuse (#7521)validateFunctionalCompleteness, validateManagedApiMethods✓ᵒ
:411Declared enforcement that cannot run — sharing-rule conditions (#4698), row-level-security predicates (#4983), a validation rule's regex / JSON Schema (#4762) and its format names (#5178)validateRuleCompilability, validateRuleSchemaFormatssee below — not a cell edit
:413Autonumber {field} interpolationlintAutonumberFormats✓ᵒ

Non-vacuity control for that reading: the page already uses in two other rows (✓ᵈᵛᵒᵖᶠ on the ordering-comparands row, ✓ˢᵖᵉᵇᵒ on the security-posture row). So the in these three is a positive claim about the object door, not an artifact of a page that never tracks object.

The row that is not a cell edit

:411 bundles four rule ids that now sit on opposite sides of the wall:

Writing ✓ᵒ on the merged row would claim the runtime door judges an RLS predicate on an object write, which it does not. Writing keeps the current falsehood. Under the page's own stated convention the row has to be split so each side reads truthfully.

The page already works through exactly this problem one paragraph down, for the security vocabulary freeze:

That last move is also why the vocabulary freeze is a row of its own. It was split out of the security-posture rule on the day the rest of that block crossed, because it judges collections the per-write snapshot does not carry: one rule id has to sit on ONE side of the wall, so it stayed behind whole rather than crossing for some of the collections it judges and not others.

Follow that precedent — the split here is by rule id, not by collection, but the principle the paragraph states is the governing one. Whichever way the split is drawn, say so in prose so the next crossing does not have to re-derive it.

Also in scope

  • Append #4716 to the crossing-history clause quoted above, in the same shape as its siblings (what crossed, onto which type).
  • Re-read the -reasons paragraph against the new state. Its four enumerated reasons for a should still each be true of at least one remaining cell; the sharing-rule / RLS example it uses for "snapshot-safe and simply have not been rolled out to a type yet" survives [P2] 运行时授权门扩到 object 写入 + 全量 runtime-safe 规则快照(#4463 P1 之后) #4716 untouched, but check the others rather than assuming.

Out of scope

Verification the card expects

Derive the table's fourth column from the built registry, not by reading source line numbers or trusting this issue's table — the same discipline #9825 used to re-derive its premises. For each of the three rows, state the rule ids it covers and each id's runtimeTypes as the registry reports them post-#9825, and show the reading is non-vacuous (a rule you expect to be absent from the object door reads absent).

Blocked-by: #4716 — the doc can only be corrected to a state that has actually landed. Do not start until PR #9825 is MERGED, and re-derive the registry on the merged ref: what the object door contains is exactly what this card is describing, so inheriting a pre-merge reading would defeat the purpose.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions