Skip to content

[finding] ObjectGrid's legacy defaultFilters leg still reaches $filter without the toFilterNode hop #4082

Description

@yinlianghui

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:

if (schemaFilter !== undefined) {
  params.$filter = schemaFilter;      // lowered through toFilterNode at the read point
} else if (schema.defaultFilters) {
  // Legacy support
  params.$filter = schema.defaultFilters;   // byte-for-byte, no lowering
}

objectui#4041 converged the declared filter key onto the repo's single lowering hop (toFilterNode, "the last hop before the wire"). The legacy defaultFilters fallback beside it was deliberately left untouched as out of scope for that card — it is a different key, undeclared in the block's inputs, and widening #4041 to it would have been scope creep on a ruled card.

But the hazard toFilterNode exists to close applies to it verbatim. defaultFilters is the MongoDB-style Record< string, any > shape (plugin-list's buildEffectiveFilter names it as exactly that: "its last fallback is table.defaultFilters, declared Record< string, any >"). isFilterAST is false for a plain object, so such a value sent raw is the 400 INVALID_FILTER shape objectui#3431 measured against a real backend. toFilterNode already handles this case — it routes objects through convertFiltersToAST — 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:

  1. No measured producer. defaultFilters is not in object-grid's registered inputs, so an author writing it gets unknown-prop from the save gate (a warning, not a rejection — sdui-parser/src/validate.ts pushes severity: 'warning'). Whether any host injects it onto an object-grid node was not measured.
  2. The sibling path already lowers. Where ObjectView feeds a list, the value goes through buildEffectiveFilter, which does call toFilterNode. 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


Generated by Claude Code

Activity

  1. os-zhuang commented on Aug 10, 2026

    @os-zhuang
    Contributor

    Findings triage: held — finding stays.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. claude commented on Aug 10, 2026

    @claude
    Contributor

    Findings round — held (finding kept), premise re-verified.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  3. os-zhuang commented on Aug 11, 2026

    @os-zhuang
    Contributor

    Findings round — held (finding kept), premise re-verified.

    Re-checked @ objectui origin/main b42558a: the un-lowered legacy leg is live in packages/plugin-grid/src/ObjectGrid.tsx (} else if (schema.defaultFilters) { // Legacy support → params.$filter = schema.defaultFilters, immediately after the lowered declared-filter branch). Held on the card's own standing reasons: no measured producer of defaultFilters in 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

  4. os-zhuang commented on Aug 11, 2026

    @os-zhuang
    Contributor

    Findings triage (re-verify @ origin/main f812de6): HOLD — the legacy leg is intact: packages/plugin-grid/src/ObjectGrid.tsx:655-657 still assigns params.$filter = schema.defaultFilters directly, without the toFilterNode hop the primary path takes. Still dormant-by-usage; converges with the family's eventual $filter normalization sweep. finding stands.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  5. claude commented on Aug 11, 2026

    @claude
    Contributor

    Findings cadence re-check @ origin/main 90e792e: HOLD (finding stays). The legacy leg is still live — packages/plugin-grid/src/ObjectGrid.tsx:655-657 still assigns params.$filter = schema.defaultFilters; with no toFilterNode hop. Dormant until a schema authors defaultFilters; nothing a user hits today.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  6. added theissue type on Aug 17, 2026
  7. os-zhuang commented on Aug 17, 2026

    @os-zhuang
    Contributor

    Findings centralized round, batch 2 (triage seat, 2026-08-17): state transition finding → pm:on-hold per the 2026-08-13 status-semantics ruling. Standing grade unchanged and absorbed: the un-lowered legacy defaultFilters leg is dormant (no measured producer; not in registered inputs; sibling path lowers), and the exit — one-line toFilterNode reuse 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 legacy defaultSort leg (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

  8. os-zhuang commented on Aug 19, 2026

    @os-zhuang
    Contributor

    Hold released → pm:queue (triage seat, session session_014qTKTqjme5Fp5BH9iRmy6t, rider-clause audit): the file-surface leg of the Restart-when fired FIVE times — PRs #5333, #5241, #5192, #5147, #4965 all touched packages/plugin-grid/src/ObjectGrid.tsx after the hold — and the un-lowered leg is still live on origin/main (lines 1109–1114: params.$filter = schema.defaultFilters with no toFilterNode hop). 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

  9. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Aug 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:dispatched

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions