Skip to content

test(schema-catalog): seal the two unsealed authored-key pairs (objectui#6810 narrow ratchet) - #7395

Merged
os-project-manager merged 1 commit into
mainfrom
claude/issue-6810-authored-key-narrow-ratchet
Sep 2, 2026
Merged

test(schema-catalog): seal the two unsealed authored-key pairs (objectui#6810 narrow ratchet)#7395
os-project-manager merged 1 commit into
mainfrom
claude/issue-6810-authored-key-narrow-ratchet

Conversation

@os-project-manager

Copy link
Copy Markdown
Collaborator

Fixes #6810

Executes the second ruling on that card (maintainer, 2026-08-30, director seat batch #9, verbatim「同意」, comment 5469403582): a narrow ratchet — seal the key x type pairs this class has already regenerated on, one at a time, in the existing named-pin form — and ⛔ no all-types read-key-set extractor. The first ruling on the card (先清点) was discharged by the measurement dispatch and is superseded.

⛔ Nothing here is a census, a gate, or a shared derivation helper. Each block is a local walker in the shape component-fixture-declared-keys.test.ts already uses for objectui#7072.

The premise check changed the shape of the work

The ruling names five pairs. Measured on origin/main b6e83be6a, three of the five are already sealed at pair scope and are deliberately not restated — duplicating them would create a second source of truth for one fact:

pair already sealed by scope
content x card (#6788) card-demo-content-6788.test.tsx corpus-wide, all 93 card nodes at any depth, DECLARED and READ, both counter-probed
content x scroll-area (#6805) catalog-authored-key-6805-6806.test.tsx corpus-wide per-renderer read set over every node of the type
content x badge (#6806) same file same, plus the #6829 ledger

Those three run green on the base (verified, see below). Two pairs were not sealed, and this PR adds one block for each.

1. select x type (#6902) — was pinned on one fixture, not on the pair

safe-validate-corpus-6318.test.ts:98 asserts options.some((o) => 'type' in o) === false, but against the static import of basic-select.json alone — 3 of the 66 select options in the corpus, i.e. exactly the fixture #6902 repaired. A second select authoring type, in any of the other six categories, is invisible to it. That is the objectui#7072 failure mode named on this same file: a pin covering part of a class while reading as though it covers the class. The #6318 pin keeps its own narrower job and is untouched.

Population measured on b6e83be6a:

select nodes carrying an `options` array   19   (7 categories)
option objects on them                     66
keys authored on those options             label 66 · value 66 · color 8 · visibleWhen 5
authoring `type`                            0

⚠️ The population is a select node's own options array, deliberately not "any object under a key named options" — the looser reading drags in 15 dashboard widget config bags (widgets[].options = { xField, yField, data }), which are not select options at all. A sweep judging those against an option read set would report confidently on the wrong population. This is why the earlier card comment's "115 objects in an options array" and this block's 66 are both correct: they are different populations, and only the narrower one is the pair.

Not a .success probe. SelectOptionSchema is a bare z.object (zod/form.zod.ts:46), so it strips type and reports success — measured on the shipped build: safeParse({ label, value, type }) returns success: true, parsed keys label value. A parse-level probe is structurally incapable of seeing the authored key (the objectui#6157 class-2 shape) and stayed green through all of #6902.

⛔ Also not a full read set over options: color and visibleWhen are declared members the fields-layer select widgets read, so asserting a read set would red on working fixtures — that is the instrument the ruling declined. One key, one type: the pair that regenerated.

2. content x aspect-ratio (#6773) — was sealed at category scope, not pair scope

aspect-ratio-demo-content-6773.test.tsx seals this pair and stays the owner of the render half (it draws every demo and counter-probes the pre-fix empty box). ⛔ None of that is restated. What it does not do is seal the pair as the ruling states it: its read-key whitelist is scoped to e.meta.category === 'components-layout-aspect-ratio'. Measured on b6e83be6a that scope is exact today — all 5 aspect-ratio nodes in the corpus live in that category — but an aspect-ratio minted in any other category would author content unseen, and the ruled unit is the key x type pair, not the category. The new block adds only that: type scope, plus the counter-probe at a position the category-scoped pin structurally cannot reach.

Evidence — both pins driven red on the real corpus, then green

Ablation on the committed tree (implementation committed first, so the restore leg had a real reference), both fixtures mutated back to their pre-fix shapes:

mutation landed on disk:
  select : injected grep=1  blob-differs=YES
  aspect : injected grep=2  children-removed grep=0  blob-differs=YES

RED  Tests  4 failed | 39 passed (43)
  FAIL ... objectui#6902 > no `select` option authors `type`
  FAIL ... objectui#6902 > counter-probe: the same sweep DOES flag `type` put back into a real fixture
  FAIL ... objectui#6773 > no `aspect-ratio` node authors `content`, in ANY category
  FAIL ... objectui#6773 > counter-probe: the sweep flags `content` re-authored, including OUTSIDE the category

Restore proven byte-for-byte, not by exit code — worktree blob equals the HEAD blob for both fixtures (70e7fc8f…, 08807c61…), git diff HEAD empty, git status clean. The mutation script carried a trap … EXIT INT TERM restore with absolute paths.

Green leg, on the final commit 49bedea8:

pnpm --filter @object-ui/example-schema-catalog type-check   exit 0   (tsc --noEmit && tsc -p tsconfig.test.json)
pnpm exec vitest run examples/schema-catalog/test/           exit 0   Test Files 19 passed · Tests 1924 passed
pnpm --filter @object-ui/example-schema-catalog lint         exit 0   (eslint . — 0 errors; 1 pre-existing warning in the generated src/index.ts)
node scripts/check-control-bytes.mjs                         exit 0   scanned 6096 tracked text files
node scripts/check-changeset-presence.mjs                    exit 0

The type-check is not a vacuous pass: tsc -p tsconfig.test.json --listFiles reports the edited file 1 time, so it is genuinely in the program.

Changeset: none owed, and the gate said so rather than me. check-changeset-presence.mjs verdict line: "1 file(s) changed, 0 of them published source of a package the release covers … so no changeset is owed." No skip-changeset label is applied — in this repo that label is read by no workflow and exempts nothing.

Scope

One file, +260 lines, tests only: examples/schema-catalog/test/component-fixture-declared-keys.test.ts. No fixture, no renderer, no production source. Disjoint from the live sibling work on the non-grid plugin views / packages/react / the i18n block.

The census assets stay on #6810 as the ruling's archive (item 3): the 0/707 classifier and the 34 "type x array-key" nested-surface list. If this family regenerates on a new key, that evidence returns to the decision box with the denominator already in hand.

🤖 Generated with Claude Code

https://claude.ai/code/session_01EMrWaQw3XS5DxTHxp4yRyC


Generated by Claude Code

…ui#6810)

The objectui#6810 ruling (maintainer, 2026-08-30, director seat batch #9)
adopted a narrow ratchet: seal the key x type pairs this class has already
regenerated on, one at a time, in the existing named-pin form — and
explicitly do NOT build the all-types read-key-set extractor.

Measured on the base: three of the five ruled pairs are already sealed at
pair scope by dedicated files and are deliberately NOT restated here
(#6788 card, #6805 scroll-area, #6806 badge). The two that were not:

- #6902 `select` x `type` — covered only by a static-import assertion on
  one fixture (safe-validate-corpus-6318.test.ts:98), i.e. 3 of the 66
  select options in the corpus.
- #6773 `content` x `aspect-ratio` — sealed at CATEGORY scope, exact today
  (5/5 nodes) but not scoped to the pair the ruling names.

Both new blocks carry counter-probes, per this file's convention.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EMrWaQw3XS5DxTHxp4yRyC
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants