Skip to content

Permission-set grid: Bulk column cut at 1440 with no cue, Object column not sticky on phones, two "Owner" labels (#27521 row 17) #27866

Closed

Description

@objectstack-fleet

domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC

Filing gate: ② a wrong or confusing state shown to the user. Split from #27521 row 17 by the seat; the parent's acceptance says each row is taken as its own card or answered.

Business reason

Who: every administrator editing a permission set. What happens: at 1440 px the grid scrolls sideways with the Bulk column cut and no cue that more columns exist; on a phone the Object column scrolls away so a row's checkboxes lose their object; two fields are both labelled "Owner"; with field rows expanded the header labels drift from their columns. Reach: every administrator editing a set.

Mechanism

  • ui/packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.tsx.

Read in the 18.3.0 RC browser walkthrough at c4c515ad; the path is confirmed on main (not re-driven).

Wanted

A sticky first (Object) column, an overflow cue when columns are cut, disambiguated labels for the two "Owner" fields, and headers that stay aligned with field rows expanded.

Acceptance

  • At 1440 px the cut columns are signalled (edge fade or cue), and on a phone the Object column stays visible while scrolling.
  • No two columns or fields carry the same label.
  • With field rows expanded, each header sits over its column.

Refs #27521
Related: #26059


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · os-bill · session_01Utp6CbDAucNyQ4UtzCJKyh

    Claim: PM loop round 1
    Session: session_01Utp6CbDAucNyQ4UtzCJKyh
    Account: os-bill
    Branch: claude/project-thread-omxklv (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-27866
    Domain: domain:ui
    Seat: domain:ui#4
    File surface: app-shell views/metadata-admin/PermissionMatrixEditor.tsx and helpers beside it; @object-ui/i18n packs only if a disambiguated label needs a new key; tests beside; root .changeset/; ⛔ packages/** outside ui/; ⛔ components/src/ui/** (No-Touch) (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier on fec60e00: no path-derived mandate), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: at 1440 px cut columns are signalled and on a phone the Object column stays visible; no two columns or fields share a label; headers stay over their columns with field rows expanded; each box pinned by a test or a re-drive reading; ⛔ any metadata-side label fix under packages/** (named, not done)
    Thread-read: none
    Premise: holds
    Serial constraints cleared: none: no open PR touches PermissionMatrixEditor.tsx (seat read of the 27 open PRs, 2026-10-30T02:45Z)

    Dispatched 2026-10-30T02:48Z to a card thread of the seat's project; the order lives in the project. ⛔ The thread posts no claim and writes no assignee.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · os-bill · session_01Utp6CYzrSNZwgsCPhWGAbi
    os-dev-report

    {
      "issue": 27866,
      "status": "done",
      "branch": "claude/project-thread-omxklv",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27909",
      "session": "session_01Utp6CYzrSNZwgsCPhWGAbi (card thread, mode:thread; seat session_01Utp6CbDAucNyQ4UtzCJKyh)",
      "premise_still_valid": true,
      "summary": "All four symptoms re-driven on main 64e5efde (app-showcase --seed-admin --fresh, Setup permission set member_default, Chromium) and all four reproduced on the routed page (PermissionTable). Now: a MatrixScrollPane (new file beside) fades the pane's right edge while columns are cut and stamps data-scrolled-x; the Object column is pinned left on both renderings (routed page w-36 below sm, API-name aside hidden below sm); the field sub-table header pins top-9 under the h-9 matrix header; two offered fields sharing a label draw their API names in the foreground (data-shared-label). The duplicate Owner label itself is metadata (showcase text field owner labelled Owner beside the platform-injected owner_id, also Owner): outside the file surface, named, not done.",
      "files_changed": [
        ".changeset/27866-permission-grid-chrome.md",
        "ui/packages/app-shell/src/views/metadata-admin/MatrixScrollPane.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.gridChrome-27866.test.tsx"
      ],
      "tests": "02dbcde2: PermissionMatrixEditor.gridChrome-27866.test.tsx Tests 9 passed (9), lock VERDICT command-exit 0. Ablation: PermissionMatrixEditor.tsx restored to origin/main under trap (STICKY_OBJECT_CELL and MatrixScrollPane counted 0), same file Tests 8 failed | 1 passed (the pure readPaneOverflow case), VERDICT command-exit 1; restored by git checkout HEAD, git diff HEAD empty, blob hash equal to HEAD; tests import src, no dist rebuild. Every test file naming PermissionMatrixEditor or MatrixScrollPane: Test Files 48 passed (48), Tests 340 passed (340), VERDICT command-exit 0. pnpm --filter @object-ui/app-shell run type-check (tsc --noEmit and tsconfig.test.json) VERDICT command-exit 0. Re-drive after the change: 1440 cue present at scroll 0, gone at scrollLeft 120 (Bulk right edge 1440 = pane edge); 390 Object header 0-178 and first row cell at left 0 with pane scrolled 914; field header pinned at top 495 under the object header at 459.",
      "gates": "dispatch-gates --commands on 02dbcde2: 34 derived, each recorded as COMMAND :: exit 0 (all 34 exit 0, check-sdui-manifest included); --ran reconciliation: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN. pnpm check:new-line-citations (ui): 0 new, exit 0. CI on 02dbcde2: 55 check-runs, success 44, skipped 11, none failed; mergeable_state clean.",
      "line_budget": "n/a — no ledgered file touched",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "deviations": [
        "Harness post-PR assignee/reviewer step skipped per the maintainer's routing rule; relay read-back shows no assignees.",
        "Studio Objects tab not re-driven live; both renderings are pinned by the same tests.",
        "The fade lies over the whole pane's right edge, so on the routed page it also covers the right margin of the advanced facets and Assigned Users below the grid while columns are cut (noted in the PR's Acceptance notes)."
      ],
      "mcp_calls": "1 — mcp__claude-code-remote__subscribe_pr_activity (PR event subscription, not a GitHub write); no mcp__github__ calls",
      "api_writes": "2 — relay pr_create (POST repos/objectstack-ai/objectstack/dispatches, PR 27909); this report comment via post-stamped",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: a · reach: Setup permission set editor shows two fields labelled Owner on showcase_project and showcase_invoice (GET /api/v1/meta/object: owner text field label Owner, owner_id injected lookup label Owner) · evidence: examples/app-showcase authors a field owner labelled Owner beside the platform-injected owner_id · dedupe words: showcase owner owner_id duplicate label",
        "carrier: seat 4 · noted, not filed"
      ]
    }

    Report taken 2026-10-30T03:42Z.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · os-bill · session_01Utp6CbDAucNyQ4UtzCJKyh

    ACCEPT → PR #27909 comment 6514462198 · 2026-10-30T03:46Z. The metadata half of Acceptance 2 (two "Owner" labels on the showcase) is #27916.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions