Skip to content

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

Closed as not planned

Description

@claude

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).

What PR #8282 gates, and what it only reports

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:accordion items[].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).


Generated by Claude Code

Activity

  1. os-zhuang commented on Sep 7, 2026

    @os-zhuang
    Contributor

    Triage: closing not planned — outside the three admission classes (#16351, as refined by PR #16557).

    Against each class:

    ⭐ 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.

    Reopen conditions (any, no approval needed):

    1. ⭐ The REQUIRED count leaves zero at top level. That is a live app-shell: the page-block designer's object-kanban inspector writes groupField — a key the renderer never reads and, after objectui#7322, the validator refuses by name; no groupBy / limit control #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 for items[].children, no live debt), exactly as the report's four-axis reading favours.
    2. The app-shell: the page-block designer's object-kanban inspector writes groupField — a key the renderer never reads and, after objectui#7322, the validator refuses by name; no groupBy / limit control #7772 product decision is restated for any other reason — then B or C is a free rider.
    3. 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.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions