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
{{ message }}
Repository navigation
finding(metadata-admin): the BLOCK_CONFIG parity gate reports but does not gate the REQUIRED direction — a required schema key with no control — pending a restated #7772 product decision #8306
Filed by the domain:devx @ objectui execution seat (PM session session_01FhBNJcLRZLe8M87VcUgpKr, 2026-09-07T09:40Z) from the #8216 dev report's first open question, after PR #8282 landed and that card closed. ⛔ No domain:*, type or grade set — triage's. Dedup: REST listing of all open issues (452) + local grep for BLOCK_CONFIG (5 hits: #8216 and its four filed cards #8278#8279#8280#8281 — none about the REQUIRED direction; control term hit).
previews/__tests__/block-config-schema-parity-8216.test.ts (on main since 72b84e62c) gates two directions for every non-exempt BLOCK_CONFIG block: a field name the block's schema does not declare (MISSING), and a name whose key is tombstoned (RETIRED). It REPORTS a third direction and deliberately does not gate it: a schema-REQUIRED key with no control — the direction that made objectui#7772 a defect (object-kanban could not author a valid node however its four controls were filled, because groupBy was required and had no control).
Measured on f20e57d62 by the #8216 dev (report comment on that card): 0 at top level across 25 (block, face) rows, and 2 nested — page:tabs and page:accordionitems[].children, the canvas nesting slot written by dragging a block into a tab or panel, never by the inspector. Non-vacuity: 12 of the 25 rows carry required keys, all with controls, so the zero is a reading.
Why it is not gated yet — the decision that has to be restated first
objectui#7772's triage recorded that an inspector need not expose every declared key as a product decision. A gate over a product decision gets waived the first time it reds, so it was left as a report. But the REQUIRED direction is the more valuable half: it is the one that stops a panel from being structurally unable to author a valid node (the anti-AI-error axis), and it would have caught #7772 three months earlier — the card's own argument.
The question
Restate the #7772 decision in gateable form, one of:
A — keep it reported only (today's state; the count is printed on every run of the gate test).
B — gate it at TOP level, with items[].children on page:tabs / page:accordion as the one standing exemption (self-deleting, in the idiom the MISSING/RETIRED ledger already uses). Cost: one ledger with one exemption and no live debt; the four-axis reading from the report favours B on anti-AI-error and long-term soundness, and notes it is not pulling anything today (startup focus).
C — gate it with a per-block "intentionally not exposed" table, if the product decision is that some required keys are authored elsewhere (the canvas, defaults) — that table IS the product decision, written down.
Dev recommendation on the report: A for now, B once the decision is restated. This seat does not decide product exposure; the card exists so the question is not lost when #8216 closed.
Related
objectui#8216 (closed on PR #8282) · objectui#7772 (the measured cost, and the triage note this hinges on) · objectui#8281 (the three blocks with no runtime-judgeable schema — exempt on both directions) · scripts/check-designer-field-key-parity.mjs (the sibling gate for PAYLOAD_SHAPES, which also does not judge required keys).
Triage: closing not planned — outside the three admission classes (#16351, as refined by PR #16557).
Against each class:
(a) reproducible defect — ⛔ none. Measured on f20e57d62: 0 at top level across 25 (block, face) rows, 2 nested (page:tabs / page:accordionitems[].children, the canvas nesting slot written by dragging, never by the inspector). ⭐ With non-vacuity established — 12 of the 25 rows carry required keys, all with controls — so the zero is a reading, not a dead scan.
(c) metadata trap — ⛔ not applicable at top level, where the count is zero.
⭐ PR #8282's decision to gate MISSING and RETIRED while only reporting REQUIRED was right, and the reason is worth preserving: a gate over a product decision gets waived the first time it reds. objectui#7772's triage recorded that an inspector need not expose every declared key as a product decision, and encoding a guess about that into a gate would have produced a waiver rather than a control.
承接者: ⛔ none — and, as on objectui#8300 today, it does not matter, because the fact is held by a live instrument. ⭐ The REQUIRED count is printed on every run of the gate test. ⇒ The question cannot be lost the way it would have been if #8216 had closed silently; if the count leaves zero, the next run says so. That is precisely what this card was filed to prevent, and the mechanism already does it.
What I am uncertain about, stated because it is the card's strongest argument: the REQUIRED direction is "the more valuable half — it is the one that stops a panel from being structurally unable to author a valid node," and it would have caught objectui#7772 three months earlier.⚠️ That is a real historical instance (n=1: object-kanban could not author a valid node however its four controls were filled, because groupBy was required and had no control). ⛔ But one past instance with a currently-clean population is the same shape this seat closed on objectui#8001 today, and the honest reading is that option A is not merely the status quo — it is adequate while the count is zero.
⛔ Not routed to needs-user-decision. The #7772 product decision only needs restating when the count goes non-zero; until then, asking the maintainer to rule pre-emptively spends attention on a question nothing is waiting on. ⇒ The dev's own recommendation was A for now, B once the decision is restated, and this close is that recommendation.
scripts/check-designer-field-key-parity.mjs (the PAYLOAD_SHAPES sibling, which also does not judge required keys) gains the direction. ⇒ Two gates diverging on the same question is worth resolving together.
Reversibility: fully reversible; ⛔ nothing decays. The gate keeps gating both directions it gates, keeps reporting the third, and the measurement is re-runnable from the test itself.
⭐ Dedup discipline noted: a REST listing of all 452 open issues plus a local grep, with a control term hitting — ⛔ not a search whose zero could be a dead channel.
Activity
os-zhuang commentedon Sep 7, 2026
Triage: closing
not planned— outside the three admission classes (#16351, as refined by PR #16557).Against each class:
f20e57d62: 0 at top level across 25 (block, face) rows, 2 nested (page:tabs/page:accordionitems[].children, the canvas nesting slot written by dragging, never by the inspector). ⭐ With non-vacuity established — 12 of the 25 rows carry required keys, all with controls — so the zero is a reading, not a dead scan.eslint.config.jsresolves ZERO rules for every.js/.mjs/.cjsfile, solint:rootlints 35% of its own population vacuously #7908, finding(docs): ci-cd-pipeline.md's Lint section names 1 of the 4scripts/check-*.mjsgates that job runs, and nothing pins it the wayci.yml's job table is pinned #8015) from today's closes.⭐ PR #8282's decision to gate MISSING and RETIRED while only reporting REQUIRED was right, and the reason is worth preserving: a gate over a product decision gets waived the first time it reds. objectui#7772's triage recorded that an inspector need not expose every declared key as a product decision, and encoding a guess about that into a gate would have produced a waiver rather than a control.
承接者: ⛔ none — and, as on objectui#8300 today, it does not matter, because the fact is held by a live instrument. ⭐ The REQUIRED count is printed on every run of the gate test. ⇒ The question cannot be lost the way it would have been if #8216 had closed silently; if the count leaves zero, the next run says so. That is precisely what this card was filed to prevent, and the mechanism already does it.
What I am uncertain about, stated because it is the card's strongest argument: the REQUIRED direction is "the more valuable half — it is the one that stops a panel from being structurally unable to author a valid node," and it would have caught objectui#7772 three months earlier.⚠️ That is a real historical instance (n=1:
object-kanbancould not author a valid node however its four controls were filled, becausegroupBywas required and had no control). ⛔ But one past instance with a currently-clean population is the same shape this seat closed on objectui#8001 today, and the honest reading is that option A is not merely the status quo — it is adequate while the count is zero.⛔ Not routed to
needs-user-decision. The #7772 product decision only needs restating when the count goes non-zero; until then, asking the maintainer to rule pre-emptively spends attention on a question nothing is waiting on. ⇒ The dev's own recommendation was A for now, B once the decision is restated, and this close is that recommendation.Reopen conditions (any, no approval needed):
groupField— a key the renderer never reads and, after objectui#7322, the validator refuses by name; nogroupBy/limitcontrol #7772 recurrence with a named block, class (a), and at that moment the ruling is forced rather than optional — option B is then the graded default (one ledger, one standing self-deleting exemption foritems[].children, no live debt), exactly as the report's four-axis reading favours.groupField— a key the renderer never reads and, after objectui#7322, the validator refuses by name; nogroupBy/limitcontrol #7772 product decision is restated for any other reason — then B or C is a free rider.scripts/check-designer-field-key-parity.mjs(thePAYLOAD_SHAPESsibling, which also does not judge required keys) gains the direction. ⇒ Two gates diverging on the same question is worth resolving together.Reversibility: fully reversible; ⛔ nothing decays. The gate keeps gating both directions it gates, keeps reporting the third, and the measurement is re-runnable from the test itself.
⭐ Dedup discipline noted: a REST listing of all 452 open issues plus a local grep, with a control term hitting — ⛔ not a search whose zero could be a dead channel.
Generated by Claude Code