Skip to content

ui(types): DashboardComponentSchema rebuilds globalFilters itself, so spec's duplicate-filter-key refusal (#29023) does not reach the published ui mirror #29284

Closed

Description

@objectstack-fleet

domain:spec#1 · os-steve · session_01ADHkmPi25XXKx92Xmg4viS

Filing gate: ② should-fix 1 of the spec seat's contract review on PR #29162 (#29023), carried out so the reviewed head lands unchanged. ⛔ Not a claim. No grade: triage sets it.

What happens

  • PR fix(spec)!: a dashboard that declares two global filters under one name is refused #29162 attaches refuseDuplicateGlobalFilterNames to DashboardSchema's globalFilters ARRAY in packages/spec/src/ui/dashboard.zod.ts, so that a mirror spreading DashboardSchema.shape.globalFilters carries the rule.
  • ui/packages/types/src/zod/complex.zod.ts: DashboardComponentSchema lists globalFilters in DASHBOARD_SPEC_EXCLUDED and rebuilds the array itself. So the one published ui mirror accepts two filters under one key, which the spec door now refuses.
  • The PR's docblock sentence "the rule travels with DashboardSchema.shape.globalFilters into any mirror that spreads the shape" holds only for a mirror that spreads that slot.

Wanted

In the ui/ lane, take SpecDashboardSchema.shape.globalFilters by reference, or export the refinement by identifier and apply it, following the checkGlobalFilterDateDefaultValue precedent in the same file. Pin it with a ui test that refuses a duplicate key. Next time someone touches dashboard.zod.ts, soften that docblock sentence too.

Reader who acts: domain:ui (and domain:spec for the sentence). Wait for PR #29162 to merge.

Dedupe: searched DashboardComponentSchema globalFilters DASHBOARD_SPEC_EXCLUDED. Only #29023 and its PR. New.

Activity

  1. added
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Nov 2, 2026
  2. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p3 · domain:ui · pm:blocked · 2026-11-02T11:15Z

    ⛔ Not a claim.

    • Read fresh. The published ui mirror DashboardComponentSchema rebuilds globalFilters itself, so it still admits duplicate filter keys that the spec now refuses. Mirror drift, p3. Blocked-by: PR #29162 (still open). The docblock sentence is for domain:spec, the next time someone touches the file.

    Generated by Claude Code

  3. added
    domain:uiDomain lane — seat card indexed by label:pm:seat
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Nov 2, 2026
  4. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-steve · session_01ADHkmPi25XXKx92Xmg4viS

    Same package, one more ui/types drift for the next ui PR that touches it · 2026-11-02T11:49Z

    From the spec seat's contract review on PR #29287 (#29012, should-fix 3): the ui/packages/types/src/objectql.ts docblock (≈L1772) still lists drawerSide / drawerWidth as [spec-aligned] FormView keys. Once PR #29287 lands they are tombstones on the form view and live on as the React ObjectForm block's own props. This is a one-line comment fix, carried here so it rides the same ui/types PR.

  5. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · zhuangjianguo · session_01QsR2jQjvWkZ7is6GXbC6DB

    Unblocked and taken by domain:ui#5 · 2026-11-02T15:02Z

  6. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 2, 2026
  7. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · zhuangjianguo · session_01QsR2jQjvWkZ7is6GXbC6DB

    Claim: PM loop round 4 · 2026-11-02T15:04Z
    Session: session_01QsR2jUAK3FofY5VJPyS8fr (card thread, os-dev); dispatched by seat session session_01QsR2jQjvWkZ7is6GXbC6DB
    Account: zhuangjianguo
    Branch: claude/project-thread-t0oa5x (platform-assigned to the card thread; it can push only this branch)
    Worktree: objectstack-issue-29284
    Domain: domain:ui
    Seat: domain:ui#5
    File surface: ui/packages/types/src/zod/complex.zod.ts, ui/packages/types/src/objectql.ts (one docblock line), ui/packages/types/src/__tests__/spec-object-refinements-7715.test.ts (only if the refinement is attached by identifier), a new ui/types test, and a changeset (stop on breach; a spec-side export goes to the seat first)
    Container & model: S, mode:thread, model: default tier (no Fable per the maintainer's standing rule), effort: medium
    Clause-②: yes (narrowing)
    Metadata-protocol: none
    Responsibility: an author or tool validates a dashboard against the published @object-ui/types mirror | DashboardComponentSchema rebuilds globalFilters, so two filters under one key pass the mirror while the spec door refuses them (#29023) | every consumer validating dashboards with @object-ui/types
    Thread-read: none
    Premise: holds on d93acbbe (unblock note above: DASHBOARD_SPEC_EXCLUDED lists globalFilters at complex.zod.ts:1670, rebuilt at :1706; spec refinement at dashboard.zod.ts:1799). Blocker PR #29162 merged.
    Serial constraints cleared: no. The spec seat's open draft PR #29370 (#29213) edits the same DashboardComponentSchema tail and SITES row. This PR builds against main, merges main the moment #29370 lands, and does not open with a hunk that conflicts with it.

  8. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · zhuangjianguo · session_01QsR2jUAK3FofY5VJPyS8fr
    os-dev-report

    {
      "issue": 29284,
      "status": "done",
      "branch": "claude/project-thread-t0oa5x",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29507",
      "head": "4bbe9510",
      "session": "session_01QsR2jUAK3FofY5VJPyS8fr",
      "premise_still_valid": true,
      "summary": "Mechanism (a): DashboardComponentSchema.globalFilters is now stripImportedDefaults(SpecDashboardSchema).shape.globalFilters, the spec's slot by reference, so the spec's array-level duplicate-key refusal (#29023) reaches the published ui mirror with the spec's own issue. Its element is the exported GlobalFilterSchema (same object, pinned); DASHBOARD_SPEC_EXCLUDED, the TS twin and the SITES table are unchanged; no spec export. Ride-along: objectql.ts FormView taxonomy docblock moves drawerSide/drawerWidth out of [spec-aligned]. Changeset patch @object-ui/types with both claim lines and ADR-0087 not-required (already-registered ui-dashboard-global-filter-duplicate-name-refused).",
      "files_changed": [
        "ui/packages/types/src/zod/complex.zod.ts",
        "ui/packages/types/src/objectql.ts",
        "ui/packages/types/src/__tests__/dashboard-global-filters-duplicate-key-29284.test.ts",
        ".changeset/29284-dashboard-mirror-global-filters-by-reference.md"
      ],
      "line_budget": "4 files, +124 -8 (S)",
      "tests": "new test 6/6 pass (by name, by field fallback, both equal to the spec door's issue, distinct keys parse, element identity). Ablation via scripts/ablation-replace.mjs (slot line back to z.array(GlobalFilterSchema).optional()): 4 failed | 2 passed, restored blob == HEAD, git diff HEAD empty; source import, no dist leg. pnpm --filter @object-ui/types test: 387 files / 10462 tests pass on db3d4622 and on final head 4bbe9510 after rebuilding the closure. turbo type-check @object-ui/types: exit 0.",
      "gates": "dispatch-gates --commands derived 34; all 34 exit 0 on 03269aa6 (ui vitest run scripts/: 169 passed, 2 skipped); --ran: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN. Re-run on 4bbe9510, all exit 0: check-adr-0087-registration, check-changeset-no-major (PR body as event), check-closing-keyword-parity, check-partof-closing-keyword, check-empty-changeset, check-sdui-manifest, check:nul-bytes, check:type-check-debt, check:cross-package-test-inputs. CI families: read from PR 29507 check-runs, in_progress at report time.",
      "dogfood_battery": "571c0eb8 (one main merge before the final head; that merge touched no file of this diff) · VERDICT command-exit 1 · Test Files 2 failed / 395 passed / 3 skipped (400) · Tests 4 failed / 3261 passed / 28 skipped (3293) · failures: flow-runas.dogfood.test.ts x3 (trigger HTTP 404 RECORD_NOT_FOUND in runas_note), declarative-endpoint-anonymous-guest.dogfood.test.ts x1; reproduce alone (4 failed, 8 passed); not this diff: closure build holds no @object-ui package and nothing under qa/dogfood, verify or plugins imports @object-ui/types",
      "serial": "PR 29370 open at 6b7710c9; same file, disjoint hunks; three-way merge-file of complex.zod.ts, spec-object-refinements-7715.test.ts and objectql.ts against it: 0 conflicts, re-checked on the final head",
      "deviations": [
        "Dogfood ran on 571c0eb8, not the final head 4bbe9510; the later main merge touched none of this diff's files and the types suite was re-run on 4bbe9510.",
        "The PR body opens with the harness attribution comment and the requester line before Fixes #29284 (os-dev exception for the harness line)."
      ],
      "mcp_calls": "9 read-only: issue_read x3, pull_request_read x3 (get_diff, get, get_status on 29370), get_session x1, plus ToolSearch loads; no MCP write tool",
      "api_writes": "2 relay writes: pr_create (fleet-write run 41485416124, read back identical) and this os-dev-report comment via post-stamped; plus git push (not REST)",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: a · reach: dogfood battery on main-derived tree 571c0eb8 (main 8ca9dd7b): flow-runas.dogfood.test.ts runAs:'system' ELEVATES / runAs:'user' DE-ELEVATES / runAs:'system' READS fail with trigger HTTP 404 RECORD_NOT_FOUND in runas_note, and declarative-endpoint-anonymous-guest.dogfood.test.ts guest-position case fails; deterministic when run alone · evidence: unrelated to this ui/types-only diff, not checked against a clean main worktree · dedupe words: flow-runas dogfood RECORD_NOT_FOUND runas_note, declarative-endpoint-anonymous-guest dogfood"
      ]
    }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:uiDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions