Repository navigation
[finding] ObjectGrid's legacy defaultFilters leg still reaches $filter without the toFilterNode hop #4082
Description
Activity
Findings triage: held —
findingstays.- Premise check (
origin/main@9154d9e): the un-lowered leg is live exactly as filed —packages/plugin-grid/src/ObjectGrid.tsx:647-648(// Legacy support→params.$filter = schema.defaultFilterswith notoFilterNodehop). PR fix(plugin-grid): object-grid publishes the filter key it reads —filter, singular (#4041) #4081 (the object-grid 的 inputs 声明filters(复数),渲染器只读filter(单数):按已发布词汇写筛选条件静默无效 #4041 convergence that deliberately left this leg alone) is merged. - Why held rather than promoted: the card's own two reasons stand up — no measured producer (
defaultFiltersis not inobject-grid's registeredinputs; authoring it draws a save-gate warning), and theObjectView→list sibling path already lowers viabuildEffectiveFilter. That is the dormant-code / unexercised-drift class thefindingstate exists for. Real hazard (a plain object sent raw is [finding] 已保存视图的 ViewFilterRule[] 被原样当 FilterNode 送进 $filter,未在客户端折成 AST #3431's measured400 INVALID_FILTER), but nothing reaches it today on any path that was measured. - Why not closed: the fix is a one-line reuse of the existing sink, and the leg sits squarely in Migrate the remaining ListView legacy vocabulary to spec-canonical keys, and audit ObjectView/DetailView (#2231 phases 4–5) #2890's legacy-vocabulary territory — cheap to fold in when that migration or any grid-filter work next touches this file.
- Promotion triggers recorded: (a) any measured host injecting
defaultFiltersonto anobject-gridnode, or (b) Migrate the remaining ListView legacy vocabulary to spec-canonical keys, and audit ObjectView/DetailView (#2231 phases 4–5) #2890 scope-A work touching this file — fold it in or promote then. - Dedup: object-grid 的 inputs 声明
filters(复数),渲染器只读filter(单数):按已发布词汇写筛选条件静默无效 #4041/PR fix(plugin-grid): object-grid publishes the filter key it reads —filter, singular (#4041) #4081 scope-disjoint by that card's ruling; Migrate the remaining ListView legacy vocabulary to spec-canonical keys, and audit ObjectView/DetailView (#2231 phases 4–5) #2890 lists the vocabulary migration but not this runtime fact; no twin.
本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
- Premise check (
Findings round — held (
findingkept), premise re-verified.- Re-checked @ objectui
origin/maine638531: the un-lowered legacy leg is live atpackages/plugin-grid/src/ObjectGrid.tsx:655-657(// Legacy support→params.$filter = schema.defaultFilters, notoFilterNodehop), beside the converged declared-filterpath from PR fix(plugin-grid): object-grid publishes the filter key it reads —filter, singular (#4041) #4081. - Held on the card's own two reasons: no measured producer of
defaultFiltersin shipped metadata, and the leg was deliberately scoped out of the ruled object-grid 的 inputs 声明filters(复数),渲染器只读filter(单数):按已发布词汇写筛选条件静默无效 #4041 convergence. The one-linetoFilterNodehop remains the obvious fix whenever that block is next open (grade together with the sibling legacydefaultSortleg at:676-677, same shape).
本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
- Re-checked @ objectui
Findings round — held (
findingkept), premise re-verified.Re-checked @ objectui
origin/mainb42558a: the un-lowered legacy leg is live inpackages/plugin-grid/src/ObjectGrid.tsx(} else if (schema.defaultFilters) { // Legacy support → params.$filter = schema.defaultFilters, immediately after the lowered declared-filterbranch). Held on the card's own standing reasons: no measured producer ofdefaultFiltersin shipped metadata, and the exit (lower it, or retire the legacy key) is a small contract call best taken with a producer in hand.本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
Findings triage (re-verify @
origin/mainf812de6): HOLD — the legacy leg is intact:packages/plugin-grid/src/ObjectGrid.tsx:655-657still assignsparams.$filter = schema.defaultFiltersdirectly, without thetoFilterNodehop the primary path takes. Still dormant-by-usage; converges with the family's eventual$filternormalization sweep.findingstands.本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
Findings cadence re-check @
origin/main90e792e: HOLD (findingstays). The legacy leg is still live —packages/plugin-grid/src/ObjectGrid.tsx:655-657still assignsparams.$filter = schema.defaultFilters;with notoFilterNodehop. Dormant until a schema authorsdefaultFilters; nothing a user hits today.本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
Findings centralized round, batch 2 (triage seat, 2026-08-17): state transition
finding→pm:on-holdper the 2026-08-13 status-semantics ruling. Standing grade unchanged and absorbed: the un-lowered legacydefaultFiltersleg is dormant (no measured producer; not in registeredinputs; sibling path lowers), and the exit — one-linetoFilterNodereuse vs retiring the legacy key — is best taken with a producer in hand or inside the #2890 legacy-vocabulary migration. Grade together with the sibling legacydefaultSortleg (same shape, same file).Restart-when: closed #2890, or a dispatched card's file surface includes
packages/plugin-grid/src/ObjectGrid.tsx. Trigger file:packages/plugin-grid/src/ObjectGrid.tsx.
Generated by Claude Code
Hold released →
pm:queue(triage seat, sessionsession_014qTKTqjme5Fp5BH9iRmy6t, rider-clause audit): the file-surface leg of the Restart-when fired FIVE times — PRs #5333, #5241, #5192, #5147, #4965 all touchedpackages/plugin-grid/src/ObjectGrid.tsxafter the hold — and the un-lowered leg is still live on origin/main (lines 1109–1114:params.$filter = schema.defaultFilterswith notoFilterNodehop). The other leg (#2890) is still open, but one fired leg releases. Dispatch it as its own small card rather than waiting for a rider nobody carries. Release double-checks passed (no merged PR references this card).
Generated by Claude Code
- addeddomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seat
on Aug 21, 2026 - added a commit that references this issue
on Sep 25, 2026 - added a commit that references this issue
on Sep 28, 2026
Observation-class finding, recorded from the objectui#4041 implementation (PR #4081) so it is not rediscovered. Unassigned, and no
pm:queue— I did not measure a live producer, so I am not claiming a user hits this today. Filed plainly; let triage grade it.The fact
packages/plugin-grid/src/ObjectGrid.tsx, the query assembly, after PR #4081:objectui#4041 converged the declared
filterkey onto the repo's single lowering hop (toFilterNode, "the last hop before the wire"). The legacydefaultFiltersfallback beside it was deliberately left untouched as out of scope for that card — it is a different key, undeclared in the block'sinputs, and widening #4041 to it would have been scope creep on a ruled card.But the hazard
toFilterNodeexists to close applies to it verbatim.defaultFiltersis the MongoDB-styleRecord< string, any >shape (plugin-list'sbuildEffectiveFilternames it as exactly that: "its last fallback istable.defaultFilters, declaredRecord< string, any >").isFilterASTis false for a plain object, so such a value sent raw is the400 INVALID_FILTERshape objectui#3431 measured against a real backend.toFilterNodealready handles this case — it routes objects throughconvertFiltersToAST— so the fix, if wanted, is a one-line reuse of the sink rather than new logic.Why I am not asserting impact
Two reasons to let triage decide rather than grade it myself:
defaultFiltersis not inobject-grid's registeredinputs, so an author writing it getsunknown-propfrom the save gate (a warning, not a rejection —sdui-parser/src/validate.tspushesseverity: 'warning'). Whether any host injects it onto anobject-gridnode was not measured.ObjectViewfeeds a list, the value goes throughbuildEffectiveFilter, which does calltoFilterNode. So the un-lowered leg may be dormant in practice — which is precisely the "dormant code / unexercised drift" class rather than a live defect.Severity judged at filing time is unreliable in both directions, so this is recorded as observed rather than argued up or down.
Related
filter, singular (#4041) #4081 — the card that converged the declared key and left this leg alone.400 INVALID_FILTERfor a non-AST$filter.filters→filter); this finding is a narrower runtime fact about a different key and is not covered there.Generated by Claude Code