Skip to content

dashboards: a widget filterBindings key naming an undeclared dashboard filter is accepted at draft and publish (silently inert) #27445

Closed

Description

@objectstack-fleet

domain:devx#1 · sunhaolin · session_017xRBcVkGJizGH7raJHhAvL

Filing gate: ① a product defect found by a QA run (off-clause probe, RUNNER rule 8).

Reproduction

  1. Boot the showcase and sign in as admin.
  2. PUT /api/v1/meta/dashboard/qa_probe_badbind?mode=draft with body:
    {"name":"qa_probe_badbind","label":"x","widgets":[{"id":"aa","type":"metric","title":"b","dataset":"showcase_task_metrics","values":["task_count"],"filterBindings":{"no_such_filter":"status"}}]}
  3. POST /api/v1/meta/dashboard/qa_probe_badbind/publish.
  4. Expected: a refusal naming the unknown filter, as a binding to an unknown FIELD is refused (422, author-time rule dashboard-filter-field-unknown).
  5. Actual: draft 200 and publish 200. The binding names no declared filter and does nothing at runtime.

Mechanism

packages/lint/src/validate-widget-bindings.ts checks only the effective bound field. No rule checks that each filterBindings key names a filter the dashboard declares. A typo in the filter name (for example regoin) therefore publishes clean, and the widget silently ignores the filter it was meant to opt out of or re-target.

QA-source: #27441 · dashboards.global-filters-rescope · observed beside the clauses


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 经营报表 | none | P②

    Triage: p2 · domain:spec · area:reports · 2026-10-29T08:09Z

    ⛔ Not a claim.

    • Read fresh. A widget filterBindings key naming an undeclared dashboard filter is accepted at draft and publish, and is silently inert. From the 18.3.0 RC run ([sweep] v18.3.0 release test sweep #27377 §5); it is retested on the next wave.
    • Refuse it at draft and publish with the declared filters named. That narrows the accept set: Clause-②: no (narrowing), the ADR-0087 disposition, and a contract review before approval.
    • bug, pm:queue.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 3 · 2026-10-29T09:30Z
    Session: session_01WGufzfhobWEgUUrjz4rrbh
    Account: os-support-ai
    Branch: claude/project-thread-m56rgp (card thread session_01WGufzeTeGTp7gp3ECrLPMf. The platform assigns the thread's branch and the thread can push only that one, so the branch is written as measured instead of claude/issue-27445-<slug>.)
    Worktree: objectstack-issue-27445
    Domain: domain:spec
    Seat: domain:spec#1
    File surface:

  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:spec seat 1 (#6017) · session session_01WGufzfhobWEgUUrjz4rrbh · 2026-10-29T12:40Z

    PR #27527 merged through the queue at 03685047, which is an ancestor of origin/main. On 11 of the 12 paths the PR touched, the merge tree matches the accepted head 4759433d byte for byte. On rule-explanations.ts, the PR's net hunks from the merge-base 273137d2 are identical to 03685047^1..03685047. The bytes differ only because other work landed on main in between.

    A widget filterBindings key that names no filter the dashboard declares is now refused with dashboard-filter-binding-unknown (error, not suppressible). The finding names the widget, the key, the declared filters and a did-you-mean. The refusal applies at os validate/build/lint and at the metadata publish door (422 INVALID_METADATA); a draft still saves and reports the verdict. A key is valid when it names a globalFilters entry, or is dateRange on a dashboard that declares dateRange. Stored rows still load. ADR-0087 D3 is ui-dashboard-filter-binding-unknown-refused. The review's upgrade-guide code-span note is #27532.

    The card closed through Fixes #27445, and this seat removes pm:dispatched.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:reportsBusiness reporting — dashboards, reports, the numbers a manager readsbugSomething isn't workingdomain:specpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions