You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(lint): the five gating object rules cross the runtime publish gate (#4716) (#9825)
* feat(lint): the five gating object rules cross the runtime publish gate (#4716)
The 2026-08-18 adjudication's narrowed scope: validateFunctionalCompleteness,
validateManagedApiMethods, lintAutonumberFormats, validateRuleCompilability and
validateRuleSchemaFormats gain runtimeTypes: ['object']; the six advisory-tier
object rules stay behind (advisory-volume decision, its own card). The
false-positive budget was exempted on 0 refusals / 75 real object declarations
(authored config-file metadata — a lower bound), with a post-launch overlay-row
replay as the standing audit.
runtime-lazy-deps.test.ts re-pins the boot-path contract as three tiers after
its object leg (PR #9295) fired red on this widening as designed: parsers
never load; ajv never loads at import or on schema-free writes; ajv is
REQUIRED to load, lazily, when an object write carries a json_schema
validation — and the gate must refuse the uncompilable one.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017qYPmkKEsfbWY1yVg83p8F
* test(metadata-protocol): object-write door pins — draft mode key and Zod-required message on the json_schema fixture (#4716)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017qYPmkKEsfbWY1yVg83p8F
* test(runtime): overlay-lock object control declares select options so the 403 stays the sentence under test (#4716)
The five gating object rules now answer at the 422 lint door, which speaks
before the overlay lock (the established #8310 ordering, recorded in this
fixture's own comment). The control body carried an optionless select —
incidental, and now refused by validateFunctionalCompleteness as
field/choice-without-options — so the NOT_OVERRIDABLE control was refused for
the wrong reason. Authoring the options restores the fixture to what it pins.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019yDEhPBC3tcGkW9bkce1HM
---------
Co-authored-by: Claude <noreply@anthropic.com>
feat(lint): the five gating object rules cross the runtime publish gate — `object` writes are now judged by `validateFunctionalCompleteness`, `validateManagedApiMethods`, `lintAutonumberFormats`, `validateRuleCompilability` and `validateRuleSchemaFormats` (#4716)
6
+
7
+
An `active`-state `object` save through `saveMetaItem` (Studio's field editor,
8
+
REST `/meta` item CRUD, an MCP/AI author) is now refused with the existing 422
9
+
`invalid_metadata` envelope when it carries a defect these five rules judge:
10
+
an inert `summary`/`lookup`/`select` shape, a managed-API verb the object's own
11
+
affordances refuse, an autonumber format referencing an unknown field, a
12
+
`format` regex or `json_schema` schema the runtime's own compilers reject, or a
13
+
`json_schema``format` name ajv would silently drop. All five already gated
14
+
`os validate` / `os build` / `os lint`; the runtime door — the only door a
15
+
tenant overlay row has — ran none of them.
16
+
17
+
Scope is deliberately the five **gating** rules only (the #4716 adjudication):
18
+
the six advisory-tier object rules stay off the runtime surface, so a clean
19
+
save's response is byte-identical and no new advisory volume reaches Studio's
20
+
designer. Draft saves are untouched (D1), stored rows keep being served
21
+
(ADR-0087 asymmetry — the gate's differential blames a write only for what it
22
+
adds), and `OS_ALLOW_UNLINTED_METADATA_WRITES=1` still degrades the refusal to
23
+
a loud log for migration windows.
24
+
25
+
Boot-path note: the two schema-judging rules load ajv lazily, only when the
26
+
judged snapshot actually carries a `json_schema` validation — an ordinary
27
+
field edit still loads no compiler, which `runtime-lazy-deps.test.ts` now pins
28
+
as a three-tier contract (parsers never; ajv never without a schema; ajv
0 commit comments