Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .changeset/closure-claims-bounded-or-derivable.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
---
---

Documentation and gate-only change (objectui#6186). The `thresholds` closure claim
carried by `@object-ui/sdui-parser`'s unconsumed-widget-option census was written
twice — in the census header and in the plugin-dashboard docs page — and is now
single-sourced onto the census header, with a new gate re-deriving it from source
on every test run. The block-schema page's whole-tree negative is bounded to the
block family's own keys.

The only edit to published source is the census module's comment header: no
exported symbol, runtime behaviour or emitted diagnostic changes, so this releases
nothing.
12 changes: 9 additions & 3 deletions content/docs/blocks/block-schema.mdx
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,9 +21,15 @@ whole implementation:
`packages/types/src/index.ts`. They are discriminants of the interfaces below, **not
renderable node types**. Putting one into a `children` array gives you the renderer's
`OBJUI-001` "Unknown component type" panel.
- **Nothing reads `slots`, `slotContent` or `template` at runtime.** There is no block
expander, no block library UI and no block editor in this repository. The keys are
declared and validated, and that is all.
- **Nothing expands a block: `BlockSchema.slots`, `BlockInstanceSchema.slotContent` and
`BlockSchema.template` have no reader.** The population that would hold one is named and
empty — there is no block expander, no block library UI and no block editor. These
interfaces and their Zod validators are the whole implementation. Bounded to the block
family's **own** keys deliberately: the bare words `slots` and `template` are live
vocabulary elsewhere in this repository and *are* read at runtime there —
`PageSchema.slots` drives slotted record pages (`buildDefaultPageSchema` in
`@object-ui/plugin-detail`), and `PageNodeSchema.template` selects a page layout from
`TEMPLATE_REGISTRY` in `@object-ui/components`. Neither goes near `BlockSchema`.

So use these types to **describe** a block (author tooling, a marketplace payload, a
validation step) and do not expect one to render. Looking for slots that work today?
Expand Down
5 changes: 3 additions & 2 deletions content/docs/plugins/plugin-dashboard.mdx
Original file line numberDiff line numberDiff line change
Expand Up@@ -319,8 +319,9 @@ from widget `options`. In particular, on a dataset-bound gauge:

- `options.format` is **not read** — declare the format on the dataset
measure instead;
- `options.thresholds` is **not read** — no renderer in this repository reads
a `thresholds` key;
- `options.thresholds` is **not read** — the census header in
`packages/sdui-parser/src/dashboard-widget-options.ts` is the canonical
statement of that closure claim, and a gate re-derives it on every test run;
- `options.invert` is **not read** — if a measure needs to be displayed as its
complement (e.g. a compliance rate stored as a violation rate), add a
derived measure to the dataset (`derived: { op: 'ratio', … }`) and bind the
Expand Down
33 changes: 28 additions & 5 deletions packages/sdui-parser/src/dashboard-widget-options.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -35,11 +35,34 @@
* legal metadata, so it is in the accepted set even though the dataset-bound
* render path does not currently display it.
*
* Notably NOT consumed anywhere in this repository: `thresholds` (zero read
* sites repo-wide) and `format` — the dataset-bound value is formatted with
* the MEASURE's own metadata (`measureField(...).format`, from the dataset
* definition), not with `options.format`. Both were widely believed to work;
* both draw this warning, which is the point.
* Notably NOT consumed on the path a widget really renders through:
* `thresholds` and `format`. Both were widely believed to work; both draw this
* warning, which is the point. They are NOT the same kind of claim, and since
* the 2026-08-25 maintainer ruling (batch adjudication close-out, decision B1 —
* a closure claim must be BOUNDED or DERIVABLE, and a claim written in two
* places is single-sourced) they are written separately (objectui#6186):
*
* `thresholds` — zero read sites repo-wide. This paragraph is the CANONICAL
* statement of that closure claim. `content/docs/plugins/plugin-dashboard.mdx`
* used to assert it a second time in its own words; two copies of one
* closure claim drift apart independently and neither knows when the other
* stopped being true, so the page now POINTS here rather than restating it.
* Single-sourcing is what makes this copy load-bearing, so it is DERIVED
* rather than trusted:
* `scripts/__tests__/unconsumed-widget-option-claim-6186.test.ts` re-scans
* every JS/TS file git tracks for an access to a key of that name and fails
* if one appears. Land a renderer that reads it and this module goes red in
* the same run.
* `format` — not read ON THE DATASET-BOUND PATH; the value is formatted with
* the MEASURE's own metadata (`measureField(...).format`, from the dataset
* definition), not from the widget's bag. Deliberately a BOUNDED claim and
* not a repo-wide one: `format` is a live key in other vocabularies, so a
* repo-wide scan would red on a TRUE claim — and an assertion that reds on
* legitimate code gets deleted by the next person who hits it, which puts
* the claim back where it started. Leg 2 of
* `__tests__/dashboard-widget-options-census.test.ts` derives exactly this
* bound: the DatasetWidget read set equals the declared set, and neither
* key is in it.
*
* ## Scope — where the warning deliberately does NOT fire
*
Expand Down
Loading
Loading