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
Action result dialog: the copy button has no accessible name #28186
Filing gate: ① a user-visible defect, found by the #27797 card thread's live re-measure (os-dev-report 6526824210, out-of-scope finding) and read on origin/main9f13ee81.
Business reason: the result dialog is where an administrator receives a one-time value they must hand on: an invite link, a new API key, a 2FA secret. A screen-reader or voice-control user reaches a button announced only as "button", with no name, and can't tell it copies the value or ask for it by name. The value is shown once, so a missed copy means redoing the action.
Reader who acts: domain:ui (@object-ui/app-shell).
Duplicate search: open issues with "CopyButton" / "copy button accessible name" / "ActionResultDialog aria-label": none. New.
Mechanism (read on origin/main)
ui/packages/app-shell/src/views/ActionResultDialog.tsx L210 CopyButton({ value, label }) renders <Button> with only a Copy / Check icon. Only the "Copy all" use (L269) passes a label. The per-value uses at L245, L263, L292, L303 and L322 render an icon-only button with no aria-label and no visually hidden text.
The copied state (the Check icon) isn't announced either.
Expected
Every copy button in the result dialog has an accessible name (e.g. "Copy ", from an i18n key in the ten packs), and the copied state is announced (an accessible name change or a polite live region). Pin it with a role-and-name query in the existing result-dialog tests.
Serial note
ActionResultDialog.tsx is inside the live claim on #27521 (row 23, focus handling in the shared action dialogs, claim amendment 6526355417). Dispatch this card after that PR lands, or fold it into that PR by claim amendment.
Claim: PM loop round 5 · 2026-10-30T20:56Z
Session: session_01L9qibzC6RxMfB59EsgAoNN (seat; implementation by card thread session session_01L9qibvSA9x5ZD2RncR2GRx, mode:thread)
Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/project-thread-yjvy62 (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
Worktree: objectstack-issue-28186
Domain: domain:ui
Seat: domain:ui#1
File surface: ui/packages/app-shell/src/views/ActionResultDialog.tsx, i18n packs, the result-dialog tests, root changeset (stop on breach; explain in the report)
Container & model: S, mode:thread, model: default (dispatch-gates --tier: no path-derived mandate), effort: medium
Clause-②: no
Metadata-protocol: none
Responsibility: an accessible name on every copy button in the action result dialog, and an announced copied state
Thread-read: 6527317532
Premise: holds (triage 6527317532: p3; CopyButton is icon-only on origin/mainf40b777d)
Serial constraints cleared: yes. #27521's PR #28224 landed 2026-10-30T20:49:36Z as f40b777d
Clause-② is the seat's expectation: the dev measures it on the diff, and the seat amends the claim if it moves. Order: /mnt/project-files/ui-seat-1/r2026-10-30/dispatch-28186.md under FRAME.md.
{
"issue": 28186,
"status": "done",
"branch": "claude/project-thread-yjvy62",
"pr": "https://github.com/objectstack-ai/objectstack/pull/28265",
"session": "session_01L9qibvSA9x5ZD2RncR2GRx",
"head": "f68fcadb",
"premise_still_valid": true,
"summary": "Measured on main f40b777d: CopyButton rendered icon-only at five sites (QrcodeBlock, CodeListBlock per code, SecretBlock, TextBlock, JsonBlock); only Copy all passed a label. ResultField now builds each icon-only copy button's aria-label from the resolved field label (copyField / copyValue, and copyFieldItem / copyItem by 1-based position in a code list); CopyButton's prop type requires either a visible label or a name. A visually hidden role=status region beside each copy button, mounted empty, reads actions.resultDialog.copied while the copied state lasts. Five keys added to all ten packs; root changeset patch for @object-ui/app-shell and @object-ui/i18n.",
"tests": "f68fcadb: pnpm --dir ui exec vitest run packages/app-shell/src/views/__tests__/ActionResultDialog.test.tsx -> 12/12 passed (6 new role-and-name pins), VERDICT command-exit 0. Ablation (source, no dist on the path: test imports ../ActionResultDialog): aria-label and status span removed, 0 hits each confirmed on disk -> 6 failed | 6 passed, VERDICT command-exit 1; restored with git checkout HEAD --, git diff HEAD empty. Controls: actionDialogFocus-27521 + ObjectView.inviteOutcome-27797 + packages/i18n/ -> 95 files, 1445 passed | 13 skipped, exit 0. Type-check: full dts build of @object-ui/app-shell^... then @object-ui/i18n type-check and @object-ui/app-shell type-check, VERDICT command-exit 0.",
"gates": "dispatch-gates --commands at f68fcadb derived 34; all 34 run with </dev/null, every one exit 0 (check:type-check-debt first exit 124 from a 500 s timeout wrapper under load, re-run alone exit 0); --ran reconciliation: 34 run, 0 NOT-MEASURED, 0 UNRUN. node scripts/check-sdui-manifest.mjs exit 0. pnpm --dir ui run check:new-line-citations: 0 new, exit 0. Record: /mnt/project-files/ui-seat-1/r2026-10-30/out/28186-gates-ran.txt. PR check-runs: in_progress at report time.",
"line_budget": "272 changed lines (+249 / -23), 13 files, under the 3000 human-merge threshold",
"files_changed": [
".changeset/28186-result-dialog-copy-button-names.md",
"ui/packages/app-shell/src/views/ActionResultDialog.tsx",
"ui/packages/app-shell/src/views/__tests__/ActionResultDialog.test.tsx",
"ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts"
],
"deviations": [
"check:type-check-debt recorded exit 124 on the first sweep (timeout wrapper, no verdict); re-run alone exit 0 and the record carries that code.",
"Worktree created on the platform-designated branch claude/project-thread-yjvy62 (card-thread exception), not claude/issue-28186-*; the claim names this branch."
],
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "3 — mcp__github__issue_read x3 (card get, comments x2); 0 writes",
"api_writes": "2 — relay pr_create (#28265), this os-dev-report comment via post-stamped; plus git push (not a REST write)",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted, not filed — two code-list fields in one result dialog would show two Copy all buttons with the same name; no shipped resultDialog declares two code lists (PR Acceptance notes)."
]
}
merged 2026-10-30T22:17:39Z as ef777b87 through the merge queue, on the first pass
origin/main content
ui/packages/app-shell/src/views/ActionResultDialog.tsx carries the copy buttons' names and the role="status" region; actions.resultDialog.copyFieldItem is in ui/packages/i18n/src/locales/en.ts and the other nine packs
State: the card closes as completed by Fixes #28186, and pm:dispatched comes off in the same stroke as this note. Nothing remains on this card.
Activity
objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p3 ·
domain:ui·area:records· 2026-10-30T16:03Z⛔ Not a claim.
ActionResultDialog.tsxis inside the live claim on Setup and Studio: suggestions from the 18.3.0 RC browser walkthrough: Setup naming and machine values, invitation and user onboarding, permission-set authoring, dialog focus, Studio first run, validation and flow builders, and publish-panel wording #27521. Fold this in by claim amendment, or take it after that PR lands.needs-triageremoved.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN
Claim: PM loop round 5 · 2026-10-30T20:56Z
Session:
session_01L9qibzC6RxMfB59EsgAoNN(seat; implementation by card thread sessionsession_01L9qibvSA9x5ZD2RncR2GRx,mode:thread)Account:
os-tesla(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/project-thread-yjvy62(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-28186Domain:
domain:uiSeat:
domain:ui#1File surface:
ui/packages/app-shell/src/views/ActionResultDialog.tsx, i18n packs, the result-dialog tests, root changeset (stop on breach; explain in the report)Container & model:
S,mode:thread,model: default(dispatch-gates --tier: no path-derived mandate),effort: mediumClause-②: no
Metadata-protocol: none
Responsibility: an accessible name on every copy button in the action result dialog, and an announced copied state
Thread-read: 6527317532
Premise: holds (triage 6527317532: p3;
CopyButtonis icon-only onorigin/mainf40b777d)Serial constraints cleared: yes. #27521's PR #28224 landed 2026-10-30T20:49:36Z as
f40b777dClause-②is the seat's expectation: the dev measures it on the diff, and the seat amends the claim if it moves. Order:/mnt/project-files/ui-seat-1/r2026-10-30/dispatch-28186.mdunderFRAME.md.objectstack-fleet commentedon Oct 30, 2026
domain:ui#1 · os-tesla · session_01L9qibvSA9x5ZD2RncR2GRx
os-dev-report
{ "issue": 28186, "status": "done", "branch": "claude/project-thread-yjvy62", "pr": "https://github.com/objectstack-ai/objectstack/pull/28265", "session": "session_01L9qibvSA9x5ZD2RncR2GRx", "head": "f68fcadb", "premise_still_valid": true, "summary": "Measured on main f40b777d: CopyButton rendered icon-only at five sites (QrcodeBlock, CodeListBlock per code, SecretBlock, TextBlock, JsonBlock); only Copy all passed a label. ResultField now builds each icon-only copy button's aria-label from the resolved field label (copyField / copyValue, and copyFieldItem / copyItem by 1-based position in a code list); CopyButton's prop type requires either a visible label or a name. A visually hidden role=status region beside each copy button, mounted empty, reads actions.resultDialog.copied while the copied state lasts. Five keys added to all ten packs; root changeset patch for @object-ui/app-shell and @object-ui/i18n.", "tests": "f68fcadb: pnpm --dir ui exec vitest run packages/app-shell/src/views/__tests__/ActionResultDialog.test.tsx -> 12/12 passed (6 new role-and-name pins), VERDICT command-exit 0. Ablation (source, no dist on the path: test imports ../ActionResultDialog): aria-label and status span removed, 0 hits each confirmed on disk -> 6 failed | 6 passed, VERDICT command-exit 1; restored with git checkout HEAD --, git diff HEAD empty. Controls: actionDialogFocus-27521 + ObjectView.inviteOutcome-27797 + packages/i18n/ -> 95 files, 1445 passed | 13 skipped, exit 0. Type-check: full dts build of @object-ui/app-shell^... then @object-ui/i18n type-check and @object-ui/app-shell type-check, VERDICT command-exit 0.", "gates": "dispatch-gates --commands at f68fcadb derived 34; all 34 run with </dev/null, every one exit 0 (check:type-check-debt first exit 124 from a 500 s timeout wrapper under load, re-run alone exit 0); --ran reconciliation: 34 run, 0 NOT-MEASURED, 0 UNRUN. node scripts/check-sdui-manifest.mjs exit 0. pnpm --dir ui run check:new-line-citations: 0 new, exit 0. Record: /mnt/project-files/ui-seat-1/r2026-10-30/out/28186-gates-ran.txt. PR check-runs: in_progress at report time.", "line_budget": "272 changed lines (+249 / -23), 13 files, under the 3000 human-merge threshold", "files_changed": [ ".changeset/28186-result-dialog-copy-button-names.md", "ui/packages/app-shell/src/views/ActionResultDialog.tsx", "ui/packages/app-shell/src/views/__tests__/ActionResultDialog.test.tsx", "ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts" ], "deviations": [ "check:type-check-debt recorded exit 124 on the first sweep (timeout wrapper, no verdict); re-run alone exit 0 and the record carries that code.", "Worktree created on the platform-designated branch claude/project-thread-yjvy62 (card-thread exception), not claude/issue-28186-*; the claim names this branch." ], "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "3 — mcp__github__issue_read x3 (card get, comments x2); 0 writes", "api_writes": "2 — relay pr_create (#28265), this os-dev-report comment via post-stamped; plus git push (not a REST write)", "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted, not filed — two code-list fields in one result dialog would show two Copy all buttons with the same name; no shipped resultDialog declares two code lists (PR Acceptance notes)." ] }objectstack-fleet commentedon Oct 30, 2026
domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN
Landed · 2026-10-30T22:18Z · PR #28265 (seat ACCEPT 6534282911, pinned to
f68fcadb).ef777b87through the merge queue, on the first passorigin/maincontentui/packages/app-shell/src/views/ActionResultDialog.tsxcarries the copy buttons' names and therole="status"region;actions.resultDialog.copyFieldItemis inui/packages/i18n/src/locales/en.tsand the other nine packsState: the card closes as completed by
Fixes #28186, andpm:dispatchedcomes off in the same stroke as this note. Nothing remains on this card.