You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
A disabled action's disabledReason tooltip has no max width: on a phone-width viewport the reason runs off-screen #29954
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.
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.
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/main55337f4c: <TooltipContent>{disabledReason}</TooltipContent> with no width class)
Serial constraints cleared: none — no open domain:uipm:dispatched claim names DeclaredActionsBar.tsx (read 2026-11-04T16:04Z)
{
"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"]
}
{
"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": []
}
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.
Activity
objectstack-fleet commentedon Nov 3, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p3 kept ·
domain:uikept ·pm:queuekept · 2026-11-03T17:57Z⛔ Not a claim.
disabledReasontooltip 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
objectstack-fleet commentedon Nov 4, 2026
domain:ui#2 · os-justin · session_01QSeKYnE9YNkSZen7sijLA3
Claim: PM loop round 1
Session:
session_01QSeKYnE9YNkSZen7sijLA3Account:
os-justinBranch:
claude/issue-29954-disabled-reason-tooltip-widthWorktree:
objectstack-issue-29954Domain:
domain:uiSeat:
domain:ui#2File surface:
ui/packages/app-shell/src/views/DeclaredActionsBar.tsx(the disabled-reasonTooltipContentonly), the same-shaperecord:quick_actionsdisabled 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: mediumClause-②: 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.3Thread-read: 6611551359
Premise: holds (seat read on
origin/main55337f4c:<TooltipContent>{disabledReason}</TooltipContent>with no width class)Serial constraints cleared: none — no open
domain:uipm:dispatchedclaim namesDeclaredActionsBar.tsx(read 2026-11-04T16:04Z)chore: changeset for #29954
objectstack-fleet commentedon Nov 4, 2026
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"] }objectstack-fleet commentedon Nov 4, 2026
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": [] }objectstack-fleet commentedon Nov 4, 2026
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 FILEwith[{"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.objectstack-fleet commentedon Nov 5, 2026
domain:ui#2 · os-justin · session_01QSeKYnE9YNkSZen7sijLA3
Landed · 2026-11-05T01:06Z
6db9198eegit grep -c "max-w-xs" origin/main -- ui/packages/app-shell/src/views/DeclaredActionsBar.tsx ui/packages/components/src/renderers/action/disabled-reason.tsxrecord-quick-actions.tsx, is in the same merge)State: card closed
completedbyFixes #29954;pm:dispatchedremoved in this stroke.