Uh oh!
There was an error while loading. Please reload this page.
docs(skills): teach the binding data-table actually reads, in all three sites - #5371
Conversation
…hree sites (#5126, #5337) Three published skill guides taught `{ "type": "data-table", "bind": "customers" }` and stated that "the table component calls `useDataScope("customers")` and gets the array". `DataTableRenderer` takes its rows from `data: rawData = EMPTY_ROWS` off the node and contains neither `bind` nor `useDataScope`, so copying the example produced no error and no warning — a header over the "No results found" empty state. Direction inherited from #5125 (merged PR #5338): the only bind-reading table renderer was DELETED under enforce-or-remove rather than promoted, so `data-table` does not gain `bind`; the teaching is what changes. - schema-expressions.md, protocol.md, data-integration.md: the `bind` example is now `list`, which does call `useDataScope`, bound to a string array so it renders visible entries rather than the empty `li` a record array produces. - Each site names the real readers (`list` / `tree-view` plus the `object-*` plugin widgets) and states that `data-table` is not one of them. - The `useDataScope` mechanism sentence, which described a different component, is gone. - schema-expressions.md and data-integration.md keep a `data-table` example, now in its real inline-`data` form. Their `columns` entries are byte-identical to main: the `{ name, label }` spelling is the separate open question on #5120, parked with the maintainer, and this change decides nothing about it. A pin test lifts the blocks out of the real guide files and renders them through the real SchemaRenderer: the taught forms put rows/entries on screen, and the retired `bind` form is measured producing the empty state. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RV6yuVCxymHYE16PL9vQkE
…ge by name `import '@object-ui/components'` from inside that package is a self-import: `tsc -p tsconfig.test.json` refused it (TS2882) and `scripts/check-package-self-import.mjs` guards the same rule. The relative entry registers the same renderers. Also drops the two `any`s the package's lint warns on. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RV6yuVCxymHYE16PL9vQkE
…he reader list is pinned The reader list added in the previous commit named `object-pivot-table` — that is the component file (`ObjectPivotTable.tsx`), not the key it registers. An author copying it would have written a type nothing is registered under. Adds the guard that would have caught it: every `object-*` name the guides list must be registered by exactly one plugin package, and that package must read `schema.bind` through `useDataScope`. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RV6yuVCxymHYE16PL9vQkE
…n data-integration.md `data-integration.md:143` said "Components with `bind: "customers"` will then access `staticData.customers`" with no qualifier — the same over-broad claim this card corrects 40 lines below, in miniature. Names the qualification and points at the section that carries it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RV6yuVCxymHYE16PL9vQkE
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
os-support-ai
commented
Aug 20, 2026
⛔ Maintainer merge required — this PR is deliberately parked greenPM review, round 18 (session It is held as a draft with auto-merge not enabled because Surface verified independently
The pin I ordered held — checked, not taken on trustThe two files this PR edits are the same lines #5120's census fork is parked on with you (whether Measured on the diff: the only Why it is worth your timeThe defect is the shape that is hardest for an AI author to self-check: copying the documented example threw nothing and logged nothing, it rendered a header over "No results found". The dev measured both states through the real It also caught two of its own errors with guards it then pinned: the reader list first said One thing to weigh before merging — filed, not fixed#5372, measured through the real renderer with identical columns in all three legs: the only working route from a provider That does not block this PR — correcting a false teaching is right regardless. But it is the strongest evidence yet that the #5125/#5126 pair left a real gap, and it is the decision input if the closed direction 2 ("make Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#5126
Fixes#5337
The defect
Three published skill guides taught
{ "type": "data-table", "bind": "customers" }, and two of them added a mechanism sentence: "the table component callsuseDataScope("customers")and gets the array."DataTableRenderertakes its rows fromdata: rawData = EMPTY_ROWSoff the node, andpackages/components/src/renderers/complex/data-table.tsxmatches neitherbindnoruseDataScope(grep, zero hits, re-measured on this branch). Copying the example threw nothing and logged nothing — a header over the "No results found" empty state, which is the hardest shape for an AI author to self-check.Measured here through the real
SchemaRenderer, with a provider that really does hold the array:Direction — inherited, not re-opened
#5125 was adjudicated as enforce-or-remove deletion of the only bind-reading table renderer (landed in PR #5338), so
data-tabledoes not gainbindhere: the teaching is what changes. Making it readbindwould widen the authorable key surface that sibling ruling declined to widen; that would be a new Feature card through the decision inbox, and is out of scope here.Site census — measured on
origin/mainbdf8cf76e, and repo-widedata-tableblocksbindskills/objectui/guides/schema-expressions.md:377:377skills/objectui/guides/data-integration.md:185:185skills/objectui/rules/protocol.md:100,:109,:130:130only:130corrected;:100/:109left aloneprotocol.md:100and:109are the "No Schema Property Invention" pair — a violation example spellingfields, and itscolumnscounterpart. Neither carriesbind; both are about the property-invention rule and are correct as they stand.The zeros are counter-probed, not assumed. Grepping each whole file on
origin/mainfor the known-present terms:schema-expressions.mdhas 13bindlines and 3useDataScopelines;protocol.mdhas 5 and 2;data-integration.mdhas 5 and 3. So the extractor does see these files, and "only one block inprotocol.mdbinds" is a reading rather than a silent miss.Widened past the three cards named: across all 307 markdown/MDX files tracked under
content/docs,skills,packages,appsandexamples, exactly 3 fencedjsonblocks paireddata-tablewith abindkey — the three above — and 0 remain on this branch. Counter-probe on the same scan: 8 json blocks carry abindkey on both refs, so the zero is the finding and not a broken matcher. (The first version of that scan made the language tag optional in the fence pattern, mis-paired opening and closing fences, and reported zero onorigin/maintoo. The counter-probe is what caught it.)What changed
bindwithlist, which does calluseDataScope, bound to a string array. Bindinglistto ordinary records renders the right number of empty entries — the sibling traplist从不渲染children,且全仓不存在item/index迭代作用域 —— schema-expressions.md 的「Iteration scopes」整节是空头支票 #4797 recorded — so the example data is node-shaped on purpose.data-tableis not one of them.useDataScopemechanism sentence, which described a different component, is gone.schema-expressions.mdanddata-integration.mdkeep adata-tableexample, now in its real inline-dataform.data-integration.md:143carried the same over-broad claim in miniature ("Components withbind: "customers"will then access ...", unqualified). One clause, same defect class, same file, named here because a fix nobody names is scope creep.The reader list is
listandtree-viewin@object-ui/components, plusobject-grid,object-kanban,object-chart,object-data-table,object-gallery,object-timelineandobject-pivotfrom the plugin packages. That list is itself pinned (below) — the first draft saidobject-pivot-table, which is the component file (ObjectPivotTable.tsx); the key it registers isobject-pivot, and a copied type nothing is registered under is the same class of silent failure.The
columnspin is intactThe
columnsentries inschema-expressions.mdanddata-integration.mdare byte-identical toorigin/main— they do not appear in the diff at all, git matched them as context. Their{ name, label }spelling is the separate open question on #5120, parked atneeds-user-decisionwith the maintainer to be taken with #5350; nothing here decides it, and both examples stay true whichever way it lands. That question is not addressed by this PR and #5120 remains open.One
columnsline did go:protocol.md:130's"columns": [...]placeholder, which left with thedata-tablenode it belonged to. It carried no column-key spelling at all, andprotocol.mdis not one of the two files the #5120 census fork names, so it pre-empts nothing — flagged here rather than buried.Verification — against the renderer, not against a reading of it
New pin:
packages/components/src/__tests__/skill-guide-data-table-binding.test.tsx. It lifts the JSON blocks out of the real guide files at run time and feeds them to the realSchemaRenderer, so it pins the shipped bytes rather than a copy. Three halves: counter-probe (each guide must still carry abindkey in some block, so the "nodata-tablebinds" assertion is a reading), doc-sameness, and behaviour.Build artifacts between the edit and the thing under test: none, on every leg. The root
vitest.config.mtsaliases every workspace package to itssrc/, so@object-ui/reactand the renderers resolve to source; the guides are read from disk at run time. Nodist/sits in the path, so no rebuild is needed for a leg to be honest.All runs from the repo root (
pnpm exec vitest run PATH), per the invocation guard — neverpnpm --filter PKG test.Green on
99d8721a3:Reverse verification, both legs run and both stated. With the three guides reverted to
origin/mainand the test unchanged, the pin goes red: 9 failed / 4 passed, exit 1 — the threeno data-table example is boundcases, theuseDataScopesentence case, both inline-datarender cases, and the threelistcases. Restoring the guides returns 15/15, exit 0. The four that pass under the mutation are the three counter-probes (main teachesbindtoo, correctly, so they must pass) and the empty-state measurement, which is true on both refs — that is the point of it.Second ablation, on the reader-list guard specifically: putting
object-pivot-tableback intoschema-expressions.mdfails it with`object-pivot-table` must be registered by exactly one plugin package: expected [] to have a length of 1. Restored, 15/15.Governed surface — do not merge
skills/**is maintainer-merge-only. This is a draft on purpose: please do not enable auto-merge and do not merge it from a passing seat. It waits for a maintainer.Changeset
.changeset/5126-data-table-bind-teaching.md, empty frontmatter. Nothing published changes: three files underskills/, one new test, and no package source. The empty frontmatter is the gate's explicit exemption, and the only reason a declaration is owed at all is that the new test lives underpackages/components/src/.Generated by Claude Code