Uh oh!
There was an error while loading. Please reload this page.
docs(closure-claims): single-source the thresholds claim, bound the block-family one - #6337
Merged
os-warren merged 3 commits intoAug 25, 2026
Merged
Conversation
…e block-family one Applies the 2026-08-25 "bounded or derivable" ruling to the two closure claims left open on objectui#6186 after claim 1 landed as PR #6195. Claim 2 (`thresholds`) was written twice — in the plugin-dashboard page and in the sdui-parser census header — and two copies of one closure claim drift apart independently. The census header is now the canonical statement and the page points at it. Single-sourcing makes the surviving copy load-bearing, so it is also DERIVED: a new gate re-scans every JS/TS file git tracks for an access to a key of that name, with positive and negative controls, and a population that refuses to collapse on an empty walk. Claim 3 (block-schema) was a whole-tree negative that measurement showed to be false as written: `PageSchema.slots` and `PageNodeSchema.template` both have live runtime readers under a different vocabulary. Bounded to the block family's own keys, which is what the page's actual point survives. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012CZgmFFzqA9cX8tBMhvpFe
… access The gate reddened on its own fixture table and diagnostic message the moment it was committed — which is the moment a tracked-files population first contained it. Keeping string literals visible is what lets that leg see `x['thresholds']` at all, but it also makes an access merely quoted inside a string look identical to a real one. `scanSource`'s literal flags settle the difference exactly: in real code the bracket is code and the key is the literal; in a quoted access the bracket is literal too. The leg now requires the bracket itself to be code, and the two shapes this file really writes are pinned as negative controls. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012CZgmFFzqA9cX8tBMhvpFe
The only published-source edit is a comment header in @object-ui/sdui-parser's census module — all 33 changed lines are block-comment lines, no exported symbol or runtime behaviour moves. Empty frontmatter is the form check-changeset-presence names for that case. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012CZgmFFzqA9cX8tBMhvpFe
Contributor
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
os-warren
marked this pull request as ready for review
August 25, 2026 14:12
This was referenced Aug 25, 2026
Uh oh!
There was an error while loading. Please reload this page.
os-warren
deleted the
claude/issue-6186-closure-claims-bounded-or-derivable
branch
August 25, 2026 14:25
This was referenced Aug 25, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#6186
Applies the 2026-08-25 maintainer ruling (batch adjudication close-out, decision 乙/B1, verbatim 「同意」) — bounded or derivable — to the two closure claims left open after claim 1 landed as PR #6195. Claim 1 is untouched here and its presence pin is not weakened.
Closing keyword deliberate. The card's three claims are now all resolved: claim 1 landed and was accepted; claims 2 and 3 are this PR. The ruling's own "Remaining work on this card" section lists exactly those two. The card was moved out of
needs-user-decisionintopm:queueby the ruling, so it is not a decision-box card.Re-anchoring: every cited line number, checked at my base
The card carries a standing warning that all its line numbers have moved once. Measured at
f8c70f4f3:plugin-dashboard.mdx:322dashboard-widget-options.ts:38block-schema.mdx:25Claim 2 — single-sourced, and then derived
The same closure claim was written twice: the census header in
packages/sdui-parser/src/dashboard-widget-options.tsand, in its own words, oncontent/docs/plugins/plugin-dashboard.mdx. Two copies drift apart independently and neither knows when the other stopped being true.The census header is now canonical; the page points at it. The census module is the copy that owns the fact — it is the module that emits the
unconsumed-widget-optionwarning on that basis, and it already had a maintenance test attached. The page is a consumer of the fact, not its owner.And then derived, because single-sourcing is what made it load-bearing. Concentrating the claim into one copy is only an improvement if that copy cannot rot quietly. New gate
scripts/__tests__/unconsumed-widget-option-claim-6186.test.tsre-derives it from source on every test run.dashboard-widget-options-census.test.tsderives the consumed set (leg 2: theDatasetWidget.tsxread set equals the declared set) and tripwires new files reading the bag (leg 4). Neither namesthresholds, and neither is a repo-wide statement. The two files now derive different halves and neither pretends to do the other's job.Scanned population, derived rather than listed
git ls-filesfiltered to the JS/TS family (.ts,.tsx,.mts,.cts,.js,.mjs,.cjs,.jsx) — 3,743 files.node_modules,distand every build output are untracked and so are out by construction;scripts/check-control-bytes.mjsreads the repo the same way.The JS half is in on purpose: the claim is about the whole repository, not about its TypeScript. Scanning only
.tswould make the gate assert less than the prose while looking like it covers it — this card's own defect, one level up.The walk refuses to collapse:
expect(tracked.length, 'the source walk found no JS/TS files at all').toBeGreaterThan(1000). A scan that finds nothing reads exactly like a scan that found nothing wrong.formatandinvertare deliberately NOT scanned this wayTheir claim is bounded, not repo-wide, and the census header now says so per key.
formatis a live key in other vocabularies (measureField(...).formatis how a dataset-bound value is really formatted), so a repo-wide bare scan would red on a true claim — and an assertion that reds on legitimate code gets deleted by the next person who hits it, putting the claim back where it started. Leg 2 of the census test already derives that bound.Claim 3 — bounded, because measurement showed the absolute version is false
block-schema.mdxasserted: "Nothing readsslots,slotContentortemplateat runtime." Measured at base, two of the three keys have live runtime readers under a different vocabulary:packages/plugin-detail/src/synth/buildDefaultPageSchema.ts:821-885readsoptions.slots, thenslots.header/slots.actions/slots.alerts/slots.highlights/slots.tabs—PageSchema.slots, driving slotted record pages.packages/components/src/renderers/layout/page.tsx:397-398readsschema.templateand resolves it throughTEMPLATE_REGISTRY—PageNodeSchema.template, selecting a page layout.Only
slotContenthas genuinely zero runtime readers. The page was already in tension with itself: eight lines below the absolute rider it tells the reader that record pages supportkind: "slotted"with aslotsmap, "wired end to end".Route taken: bounded (ruling option (a)), not derived — and this is the honest primitive rather than the cheap one. A gate could only ever derive the bounded claim, because the absolute one is false; bounding is therefore not a retreat from derivation, it is the thing derivation would have had to encode. A gate over the block family would also have to exempt every legitimate
slots/templatereader in the live vocabulary, which is a maintenance liability that reds on ordinary work.The page's actual point — this family is declarations only; nothing expands a block — survives bounding intact, and the rewrite turns the self-contradiction into content by naming the live vocabulary explicitly.
Controls — the negative half is load-bearing
Directions predicted before each run; mutation proven on disk by anchored counts, never an editor exit code; restore via
git checkout HEAD --plus the explicit path under atrap, proven by an emptygit diff HEADand agit hash-object/HEADblob comparison.No build leg is owed, and this is stated rather than skipped: the subject is read off disk with
fs.readFileSyncand the mask is imported fromscripts/js-comment-mask.mjsas source. Nothing resolves through a packageexportsintodist/, so nodistcould go stale.packages/react/src/hooks/usePerformanceBudget.ts; anchored count 0 → 1. Predicted RED naming the file; observedusePerformanceBudget.ts:316: member access .thresholds,1 failed | 5 passed.alertThresholds,thresholdsCount, an object-literalthresholds:key, athresholds: { lines: 40 }config block, and['format', 'invert', 'thresholds']as string content. Predicted GREEN; observed6 passed (6), exit 0. That file's two pre-existing prose mentions of the word are a bonus control the comment mask handled silently.bag["thresholds"]predicted RED, observed reported as a computed access — re-run after the literal guard below to prove the guard did not blind it. Both legs fire, with correct line numbers.⭐ Two instrument defects the controls caught, both fixed
codeOnlymasks string literals, and a computed access spells its key as a string literal — so the mask blanked the very thing being looked for. The positive control caught it on the first run. That leg now reads comment-masked source, where literals survive.scanSource's literal flags settle the difference precisely: in real code the bracket is code and the key is the literal; in a quoted access the bracket is literal too. The leg now requires the bracket itself to be code, and both shapes this file really writes are pinned as negative controls.Both are recorded in the file's header as measurements rather than as design notes.
Gates — union re-run at
e87969072on a clean treegit status --porcelainempty. Exit codes captured by redirect before any pipe; each quotes the gate's own verdict line. Gate list derived by hand from this repo'spackage.jsonand.github/workflows/— objectui has noscripts/pm/dispatch-gates.mjs.vitest run scripts/__tests__/ packages/sdui-parser/Test Files 87 passed (87)/Tests 2317 passed (2317)check:doc-typesEvery documented component type is registered.check:doc-fencesevery TypeScript block in 223 document(s) is fenced ts/tsx/typescriptdocs:check-linksLinks are valid across 17 scan roots.check:control-bytesOK (scanned 5217 tracked text file(s); skipped 85 binary)type-check:scriptstsclint:root28 problems (0 errors, 28 warnings)— all pre-existing, none in changed filescheck-changeset-presence.mjsEvery one of them has an EMPTY frontmatter — declared as releasing nothing, which is the explicit exemptionChangeset. The gate initially exited 1 naming
@object-ui/sdui-parser. The empty-frontmatter form is what it names for a change that should release nothing, and that is measured rather than asserted: all 33 changed lines in that file are block-comment lines, so no exported symbol, runtime behaviour or emitted diagnostic moves. objectui has noskip-changesetlabel mechanism (#4912 records that nothing reads it), so a real changeset is the declaration form here.Declared narrowing —
check:doc-snippetsnot run locally. Exit 2, with its own verdict: "This is 'I could not run', NOT 'I ran and found errors' (exit 1) ... this run says nothing about whether the documentation compiles." An unbuilt-distprecondition, independent of this diff. The narrowing is measured, not assumed: this diff touches zero fenced blocks — no fence marker is added or removed anywhere in the doc diff, and the fence counts are identical base vs head (plugin-dashboard.mdx18 to 18,block-schema.mdx22 to 22). CI builds and runs it.Out of scope, deliberately
Other prose closure claims exist in this tree (
packages/types/src/zod/complex.zod.ts,MetadataProvider.tsx,useObjectChat.tsand others all say "Nothing reads …"). ⛔ Not filed and not swept: the ruling states conversion is opportunistic only — applied when a page is touched or a claim is load-bearing — and explicitly rules out a blanket sweep. Filing a sweep card would contradict the ruling this PR implements.Generated by Claude Code
Generated by Claude Code