Skip to content

A disabled action's disabledReason tooltip has no max width: on a phone-width viewport the reason runs off-screen #29954

Closed

Description

@objectstack-fleet

Found by the hotclm app (objectstack-ai/hotclm#195, PR #200) on @objectstack/* 18.3.0.

What happens. A declared action that is disabled shows its authored disabledReason in a tooltip. In the Console record page at a 390px viewport (hotclm contract ICA-2026-0004, signed in as a legal counsel), the greyed 送审 / Send for Approval tooltip renders 727px wide on one line, so it runs off the right edge. The English reason is cut after '…no deviation may'. At 1024px and 1400px it fits.

Seam. ui/packages/app-shell/src/views/DeclaredActionsBar.tsx L737 renders <TooltipContent>{disabledReason}</TooltipContent> with no width bound. The disabled-reason tooltip on the home page (HomePage.tsx) uses max-w-xs and wraps.

Expected. The action-bar tooltip wraps within the viewport like the home page's, so an authored reason (18.3's disabledReason, ActionSchema) is readable on a phone.

Dedupe: no open issue mentions this tooltip or disabledReason wrapping.


Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    pm:queueReady for the PM dispatch loop
    domain:uiDomain lane — seat card indexed by label:pm:seat
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    on Nov 3, 2026
  2. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p3 kept · domain:ui kept · pm:queue kept · 2026-11-03T17:57Z

    ⛔ Not a claim.

    • Read fresh. A disabled action's disabledReason tooltip has no max width, so on a phone-width viewport the reason runs off-screen. Found by the hotclm app on 18.3. Layout only, so p3 kept.

    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 4, 2026
  4. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-justin · session_01QSeKYnE9YNkSZen7sijLA3

    Claim: PM loop round 1
    Session: session_01QSeKYnE9YNkSZen7sijLA3
    Account: os-justin
    Branch: claude/issue-29954-disabled-reason-tooltip-width
    Worktree: objectstack-issue-29954
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: ui/packages/app-shell/src/views/DeclaredActionsBar.tsx (the disabled-reason TooltipContent only), the same-shape record:quick_actions disabled tooltip if it shares the gap, their tests, one root .changeset/ file (stop on breach; explain in the report)
    Container & model: S mechanical, mode:subagent, model: TIER_FLOOR — --tier: "no path-derived mandate"; a one-class layout bound judged by tests, effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: ui/packages/app-shell DeclaredActionsBar.tsx renders the authored reason unbounded | HomePage.tsx's disabled-reason tooltip already wraps with max-w-xs | any reader on a phone-width viewport, hit today by hotclm on 18.3
    Thread-read: 6611551359
    Premise: holds (seat read on origin/main 55337f4c: <TooltipContent>{disabledReason}</TooltipContent> with no width class)
    Serial constraints cleared: none — no open domain:ui pm:dispatched claim names DeclaredActionsBar.tsx (read 2026-11-04T16:04Z)

  5. added a commit that references this issue on Nov 4, 2026
  6. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-justin · session_01QSeKYnE9YNkSZen7sijLA3
    os-dev-report

    {
      "issue": 29954,
      "status": "done",
      "branch": "claude/issue-29954-disabled-reason-tooltip-width",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30161",
      "session": "session_01QSeKYnE9YNkSZen7sijLA3",
      "premise_still_valid": true,
      "summary": "Added max-w-xs to the disabled-reason TooltipContent in DeclaredActionsBar.tsx and, since it had the identical gap, in record-quick-actions.tsx. HomePage.tsx lives at ui/packages/app-shell/src/console/home/HomePage.tsx and its disabled-reason TooltipContent does carry max-w-xs. Local class chosen over changing the shared tooltip primitive (wider blast radius). One pinning case added to each existing disabledReason-26619 test file; root changeset 29954-disabled-reason-tooltip-width.md.",
      "tests": "cd ui && pnpm exec vitest run (DeclaredActionsBar + record-quick-actions disabledReason-26619 files): Test Files 2 passed, Tests 10 passed. Ablation after committing the fix: class removed from both sources, 2 failed / 8 passed; restored with git checkout HEAD, git diff HEAD empty. Run from the ui root because package-level vitest is guarded.",
      "gates": "dispatch-gates --commands derived 35; 34 non-vitest families run, exit 0 each incl. node scripts/check-sdui-manifest.mjs (check-comment-mask-corpus, check-type-check-debt, check-query-options-erasure first hit my 170s cap, re-run longer: exit 0); pnpm --dir ui exec vitest run scripts/ under lock: 170 passed, 2 skipped, exit 0; --ran reconciliation 35 derived / 35 run (after the vitest line was added). Type-check of app-shell and plugin-detail: NOT MEASURED locally (ui dep closure not built, tsc TS2307 on @object-ui/core), left to CI Type Check UI.",
      "dogfood_battery": "n/a - no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "2 - issue_read (get, get_comments); no write tool",
      "api_writes": "2 - git push (3 pushes of the branch) is not counted; relay pr_create via fleet-write dispatch (1 action); os-dev-report comment via post-stamped (1)",
      "line_budget": "n/a - no skills/** touched",
      "deviations": "none beyond: type-check NOT MEASURED locally; three gates exceeded my own 170s loop cap and were re-run to exit 0; ablation restore first tried from the wrong cwd, then restored by hand with git checkout HEAD and verified git diff HEAD empty",
      "files_changed": ["ui/packages/app-shell/src/views/DeclaredActionsBar.tsx", "ui/packages/plugin-detail/src/renderers/record-quick-actions.tsx", "ui/packages/app-shell/src/views/__tests__/DeclaredActionsBar.disabledReason-26619.test.tsx", "ui/packages/plugin-detail/src/renderers/__tests__/record-quick-actions.disabledReason-26619.test.tsx", ".changeset/29954-disabled-reason-tooltip-width.md"],
      "open_questions": [],
      "security_findings": "withheld",
      "out_of_scope_findings": ["class: a (user-visible layout defect, same class) - reach: public door: any Console action rendered by the schema-driven action button/group/menu/icon with a long disabledReason, narrow viewport - evidence: ui/packages/components/src/renderers/action/disabled-reason.tsx renders TooltipContent with no width class - dedupe words: disabled-reason.tsx TooltipContent max-w; carrier: none"]
    }
    
  7. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-justin · session_01QSeKYnE9YNkSZen7sijLA3
    os-dev-report

    {
     "issue": 29954,
     "status": "done",
     "branch": "claude/issue-29954-disabled-reason-tooltip-width",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/30161",
     "session": "session_01QSeKYnE9YNkSZen7sijLA3",
     "premise_still_valid": true,
     "summary": "Rework round 1: added max-w-xs to a third site, the shared DisabledReasonTrigger TooltipContent in ui/packages/components/src/renderers/action/disabled-reason.tsx (action:button/icon/group/menu), on top of DeclaredActionsBar.tsx and record-quick-actions.tsx. One pin added to action-disabled-reason-26619.test.tsx; changeset gains @object-ui/components patch and names the third site; PR body updated via relay. Local class kept over the shared primitive.",
     "tests": "cd ui && pnpm exec vitest run: components action-disabled-reason-26619 27/27 pass; app-shell + plugin-detail disabledReason-26619 10/10 pass. Ablation of disabled-reason.tsx (fix committed first, class removed, grep -c of the class 0): 3 failed, 24 passed; restored with git checkout HEAD, git diff HEAD empty, class count 1. Earlier ablation of the other two sites: 2 failed, 8 passed. Fresh worktree needed OS_SKIP_DTS=1 builds of spec, formula, types, core before vitest would load.",
     "gates": "Head e41976860. dispatch-gates --commands re-derived on the new diff: same 35 families; 34 non-vitest run exit 0 each (incl. check-sdui-manifest) plus pnpm --dir ui exec vitest run scripts/ (170 passed, 2 skipped, exit 0 under lock); --ran reconciliation 35 derived, 35 run, 0 UNRUN. Type-check @object-ui/components: NOT MEASURED (closure not built; tsc 429 TS2307 errors on workspace imports such as @object-ui/i18n); app-shell and plugin-detail type-check also NOT MEASURED; left to CI Type Check UI.",
     "dogfood_battery": "n/a - no `!` in the PR title and no (narrowing) arm",
     "mcp_calls": "3 - issue_read x2, pull_request_read x1; no write tool",
     "api_writes": "relay writes this round: issue_patch of PR 30161 body (fleet-write dispatch, read-back identical) and this comment; total with round 0: pr_create + os-dev-report + issue_patch + os-dev-report",
     "line_budget": "n/a - no skills/** touched",
     "deviations": "Type-check NOT MEASURED locally for all three packages. The relay refused the PR body edit without a signature as first line, so the body now opens with the seat signature line and Fixes #29954 is the second non-empty line (closing keyword still read). First body-rewrite attempt was refused with nothing sent. A heredoc with unescaped backticks briefly executed in the shell while building the body (permission denied, nothing written, git status clean).",
     "files_changed": [
      "ui/packages/app-shell/src/views/DeclaredActionsBar.tsx",
      "ui/packages/plugin-detail/src/renderers/record-quick-actions.tsx",
      "ui/packages/app-shell/src/views/__tests__/DeclaredActionsBar.disabledReason-26619.test.tsx",
      "ui/packages/plugin-detail/src/renderers/__tests__/record-quick-actions.disabledReason-26619.test.tsx",
      ".changeset/29954-disabled-reason-tooltip-width.md",
      "ui/packages/components/src/renderers/action/disabled-reason.tsx",
      "ui/packages/components/src/renderers/action/__tests__/action-disabled-reason-26619.test.tsx"
     ],
     "open_questions": [],
     "security_findings": "withheld",
     "out_of_scope_findings": []
    }
  8. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-justin · session_01QSeKYnE9YNkSZen7sijLA3

    ACCEPT → PR #30161 comment 6638928269 (head e4197686, 2026-11-04T18:39Z).

    Landing refused: the session's auto-mode classifier denied node scripts/pm/fleet-write/dispatch.mjs --repo objectstack-ai/objectstack --actions-file FILE with [{"op":"pr_ready","pull":30161},{"op":"automerge_enable","pull":30161}] (reason given: "judged this action dangerous", no explanation). Per landing-operations B the seat stops, does not re-spell it, and reports to the maintainer. The PR stays draft and ACCEPTed until the maintainer authorizes landing in the seat session.

  9. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-justin · session_01QSeKYnE9YNkSZen7sijLA3

    Landed · 2026-11-05T01:06Z

    Probe Reading
    PR #30161 MERGED via the merge queue, merge commit 6db9198ee
    git grep -c "max-w-xs" origin/main -- ui/packages/app-shell/src/views/DeclaredActionsBar.tsx ui/packages/components/src/renderers/action/disabled-reason.tsx 1 + 1 (the third site, record-quick-actions.tsx, is in the same merge)

    State: card closed completed by Fixes #29954; pm:dispatched removed in this stroke.

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

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:uiDomain lane — seat card indexed by label:pm:seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions