Uh oh!
There was an error while loading. Please reload this page.
fix(showcase): my-work grid authors filter, the key object-grid reads - #7764
Merged
Conversation
…ds (#7750) The personal work queue authored the plural `filters:` on its `object-grid`. objectui's renderer reads only `schema.filter` (`plugin-grid/src/ObjectGrid.tsx`, lowered through `toFilterNode`) and the legacy `schema.defaultFilters`; `schema.filters` has zero read points on any ref. The declared personal scope was therefore accepted at authoring time and dropped before the wire — no `$filter` parameter at all, and the queue listed every row. objectui#4041 (`9154d9e`) retired the plural from the block's published vocabulary, so `filter` is now the declared, pinned and lowered spelling. That commit is an ancestor of this repo's `.objectui-sha` pin `6314e87f2` (merge_base == `9154d9e`, behind_by 0). Not an authorization bypass: the unfiltered read is still RLS-constrained, so the caller only ever saw rows they may see. The defect is that a declared personal-scope filter silently never applied. Pins added to the existing `my-work-visibility.test.ts` (no new test file, so no TEST_DEBT drift): the grid authors `filter`, carries neither dropped spelling, and still scopes to `{current_user_id}`. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BaTeBCjaoTDmDWFVmSY2jL
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
…reason (#7750) The shared assertion message called both `filters` and `defaultFilters` "dropped before the wire". That is true of `filters` and FALSE of `defaultFilters`: `ObjectGrid.tsx` reads it and lowers it to `params.$filter`, so it is the legacy path object-grid still honors, not a dead key. Left as written, a future author debugging a filter bug would read the message and conclude the legacy key is inert — the same defect this card fixes, a spelling whose real behavior differs from what the surrounding text implies, reproduced in the artifact whose job is to prevent it. Both keys stay pinned absent; only the justification changes. `filters` because nothing reads it, `defaultFilters` because this page authors the current key rather than the superseded one. Split the shared string into a per-key table and reworded the `it` so "dropped" attaches only to `filters`. Text only — no assertion's truth value changed, and the page fix is untouched. Both messages verified by authoring each key in turn and reading the failure. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BaTeBCjaoTDmDWFVmSY2jL
os-zhuang
marked this pull request as ready for review
August 11, 2026 14:36
os-zhuang
enabled auto-merge
August 11, 2026 14:36
Uh oh!
There was an error while loading. Please reload this page.
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#7750
What changed
One word in
examples/app-showcase/src/ui/pages/my-work.page.ts: the personal work queue'sobject-gridauthored the pluralfilters:, and now authorsfilter:— the key the block both publishes and reads.objectui's renderer reads only
schema.filter(plugin-grid/src/ObjectGrid.tsx:472, lowered throughtoFilterNode) and the legacyschema.defaultFilters(line 655-657).schema.filtershas zero read points. So the declared personal scope was accepted at authoring time and then dropped before the wire — no$filterparameter at all, and the queue listed every row.Carried verbatim from the card so nobody over-escalates it:
That second, general half — a typo'd key accepted without complaint — is #7751 and is deliberately not touched here. No validation was added to the block schema.
Premise verification
Confirmed against
origin/main(8f1851e) before implementing:Line 52 still read
filters:. ✅The card's "exactly once in the whole showcase" claim is imprecise, and the correction is worth recording.
filtersappears at three other authored sites, and all three are legitimate declared plural keys on different surfaces — so the card is correctly scoped, but not for the reason it gives:ui/apps/index.ts:81-83—ObjectNavItem.filters, declared plural inpackages/spec/src/ui/app.zod.ts:421.ui/pages/renewals-pipeline.page.ts:110,141— react-tier< ListView filters={…} />, declared plural inpackages/spec/src/ui/react-blocks.ts:217.Read as "exactly one
object-gridblock authors the plural", the claim holds and this PR is correctly one line. Read literally, it does not. The underlying reason the typo was easy to make is that the vocabulary genuinely splits by tier —ListView.filtersplural in react,ObjectNavItem.filtersplural in nav,object-grid.filtersingular in SDUI — which is context for A typo'd key inside a page component'spropertiesis accepted in silence — the props bag is a passthrough record and the SDUI props gate has no schema to dispatch forobject-*blocks #7751, not something fixed here.The three sibling
object-metrictiles on this same page already spellfiltersingular (lines 39-41), which is why the grid was the only site that drifted.Verification bound — stated honestly
End-to-end verification was not performed, and could not be here.
packages/console/dist/is gitignored and absent from a fresh clone — this worktree vendors no console at all. Producing one meanspnpm objectui:refresh, i.e. rebuilding the vendored console, which this card explicitly prohibits as a way to manufacture an end-to-end claim.packages/console/distis built from a pin two days behind.objectui-sha— QA runs measure a console the repo no longer pins #7752. Until that lands, no run in this repo can show$filteron the wire.What was checkable, and was checked — the card asked for the pin ancestry, so it was measured rather than assumed:
.objectui-sha=6314e87f2d49b1ff3b158c296f1b2a52d14dff68.9154d9e) is an ancestor of it —GET /repos/objectstack-ai/objectui/compare/9154d9e...6314e87f2returnsstatus: ahead,behind_by: 0,merge_base == 9154d9e90f9c. The card's claim holds.plugin-grid/src/index.tsx:117declares{ name: 'filter', type: 'array', label: 'Filter' },ObjectGrid.tsx:472readsschema.filter, andschema.filtershas 0 occurrences in the file.So the fix lands on the declared, pinned and lowered path — but the proof that it reaches
$filterlives in objectui's own pin (gridFilterInputSpelling.test.tsx), not in anything runnable here.Tests
Added to the existing
examples/app-showcase/test/my-work-visibility.test.tsrather than a new file, deliberately: a new test file can drift a package'sTEST_DEBTor thequery-options-erasurecount. Three pins — the grid authorsfilter; it authors neither non-canonical spelling (filters,defaultFilters); and it still scopes to{current_user_id}.Each of those two keys is absent for a DIFFERENT reason, and the test says so per key (corrected in
61022c2after PM review caught the first version sharing one message across both):filtersis dead — zero read points in the renderer, so it is accepted at authoring time and dropped before the wire. That is this defect.defaultFiltersis alive —ObjectGrid.tsxreads it and lowers it toparams.$filter. It is the legacy pathobject-gridstill honors, pinned absent because this page authors the current key, not because the legacy one is inert.Calling both "dropped" would have reproduced this very defect one level up — a spelling whose real behavior differs from what the surrounding text implies — inside the artifact whose job is to prevent it. Both messages were verified by authoring each key in turn and reading the actual failure text.
The pins assert the authored key against the spelling objectui declares, which is the whole of what is checkable inside this repo. They do not claim to prove
$filterreaches the wire, and say so in the file.Reverse verification, direction predicted before running (ordinary "Red" — the assertions read the authored key directly, so no
??-chain inversion applies): reverting the page toorigin/mainturned all three new pins red, each naming the real defect, while the four pre-existing tests stayed green.The per-key messages were each proven separately by authoring that key on the page and reading the failure:
Fix restored, tree clean, suite green again.
Gates run locally
example-showcasetestexample-showcasetypecheck (tsc --noEmit)'@objectstack/example-showcase^...', suffix = upstream deps)check:type-check-debtcan be loweredlines are pre-existing surplus, untouched.check:query-options-erasure8f1851e, no files addedcheck:nul-bytesOne eslint finding on the test file (
58:3 Definition for rule '@typescript-eslint/no-implied-eval' was not found) is pre-existing and not mine: byte-identical output on the unmodifiedorigin/maincopy of the same file, and line 58 sits above every line this PR adds.Changeset
None —
skip-changesetinstead.@objectstack/example-showcaseisprivate: trueand absent from thefixedgroup in.changeset/config.json, so a showcase-only change releases nothing. Same call #7568 made earlier today on the same package.Generated by Claude Code
Generated by Claude Code