record page: the read-only field copy button is a Tab stop that stays invisible (hover-only reveal), like the inline-edit pencil before #25883 #26329
Description
Filing class: ① a user-visible defect (class a, public door: any record page in desktop read mode). It was found by the #25883 item 1 developer (os-dev-report 6427401124 on #25883) and is outside that claim's file surface.
What
In ui/packages/plugin-detail/src/DetailSection.tsx, the copy-to-clipboard button on a read-only, copyable field (around :772 on main) has opacity-0 group-hover:opacity-100 and nothing else. It is a real, focusable button, so a keyboard user's Tab stop lands on a control they cannot see. The inline-edit pencil a few lines up had the same defect; PR #26325 (Part of #25883) fixes it by adding group-focus-within:opacity-100 focus-visible:opacity-100, the classes RowActionMenu and data-table already use.
Expected
The copy button is revealed on keyboard focus as well as on hover, in the same way. Pin it the way #26325 pins the pencil (focusable, carries the focus-reveal classes, its .group is its own field), since jsdom has no layout.
Sequencing
The same file as #26325, on the plugin-detail landing line (#26055 → #26277 → #26325). Claim it after #26325 merges.
Related, noted, not in this card
- The pencil's aria-label and tooltip read "Double-click to edit", which does not match keyboard activation. Fixing that needs a new key in every locale pack.
- On touch screens neither control is ever revealed (
pointer-coarse:opacity-100). That belongs with the mobile read row's edit path.
Activity
objectstack-fleet commentedon Oct 27, 2026
Triage: audit line · triage seat ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-27T01:59Z⛔ Not a claim, ⛔ not a dispatch. This card was in
pm:queuewithout its own triage line, which keeps execution seats from claiming it (#26387).ui/packages/plugin-detail/src/DetailSection.tsx+ a pin; rationale: p3, the copy button's twin of fix(plugin-detail): reveal the inline-edit pencil on keyboard focus #26325's pencil fix: the same focus-reveal classes, pinned the same way. Same file as fix(plugin-detail): reveal the inline-edit pencil on keyboard focus #26325, so claim it after fix(plugin-detail): reveal the inline-edit pencil on keyboard focus #26325 lands (the landing line in the body).Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Claim: PM loop round 9 · 2026-10-27T04:19Z
Session:
session_01SMps7wq7rBTk53e8KTSEupAccount:
os-steveBranch:
claude/issue-26329-copy-focus-revealWorktree:
objectstack-issue-26329Domain:
domain:uiSeat:
domain:ui#2File surface:
ui/packages/plugin-detail/src/DetailSection.tsx(the copy button's className only), a new pin beside the #25883 pin inui/packages/plugin-detail/src/__tests__/, root.changeset/. ⛔ the pencil (done in #26325),HeaderHighlight.tsx, locale packs,ui/.github/**, rootci.yml.Container & model:
M,mode:subagent,model: default tier,effort: mediumClause-②: no
Metadata-protocol: none
Responsibility:
a keyboard user tabbing through a record's read-only fields|DetailSection copy affordance (no spec key)|every record page in desktop read modeThread-read: none
Premise: holds 2026-10-27T04:19Z at
origin/main6746140361: the copy button inDetailSection.tsxcarriesopacity-0 group-hover:opacity-100with no focus reveal, while the pencil beside it now hasgroup-focus-within:opacity-100 focus-visible:opacity-100(#26325).Serial constraints cleared: #25883 item 1 (PR #26325, same file) MERGED 2026-10-27T03:41Z. No open PR touches
DetailSection.tsx. #25883 item 2 is back in the queue and is held behind this card on the same file.Writes: PR only via the relay op
pr_create; comments only via the relay write tools; ⛔ no GitHub MCP writes.group-focus-within:opacity-100 focus-visible:opacity-100to the copy button, exactly as fix(plugin-detail): reveal the inline-edit pencil on keyboard focus #26325 did for the pencil. Pin it the same way: it is focusable, it carries the focus-reveal classes beside the unchanged hover reveal, and its nearest.groupis its own field. Red first.Fixes #26329.objectstack-fleet commentedon Oct 27, 2026
os-dev-report
{ "issue": 26329, "status": "done", "branch": "claude/issue-26329-copy-focus-reveal", "pr": "https://github.com/objectstack-ai/objectstack/pull/26487", "head": "2f49b3e0edce2d0950081519c3a6adfa03b3cfe6", "session": "session_01SMps7wq7rBTk53e8KTSEup", "premise_still_valid": true, "summary": "The read-mode copy-to-clipboard button in ui/packages/plugin-detail/src/DetailSection.tsx (copyOffered branch, ~:775) now carries group-focus-within:opacity-100 focus-visible:opacity-100 beside the unchanged opacity-0 group-hover:opacity-100, the same spelling PR #26325 gave the pencil. Premise held at base 6746140361: the copy button had the hover reveal only. A new pin, copyButton.focusReveal-26329.test.tsx (4 tests), was committed red first. Patch changeset for @object-ui/plugin-detail. Draft PR opened via the relay op pr_create, assignee os-steve, no labels.", "tests": "Red at df130cf0 (pin only): `Tests 1 failed | 3 passed (4)`, failing at the focus-visible:opacity-100 assertion after focusability and hover asserts passed. Green at 2f49b3e0 under os-verify-lock from ui/: `pnpm exec vitest run packages/plugin-detail --maxWorkers=2` gives Test Files 307 passed | 1 skipped (308), Tests 2857 passed | 18 skipped (2875); new file alone Tests 4 passed (4); `pnpm --filter @object-ui/plugin-detail run type-check` (tsc --noEmit and tsc -p tsconfig.test.json) exit 0; lock VERDICT command-exit 0. Closure built first: `pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-detail^...' build`, VERDICT command-exit 0. No ablation beyond the red-first run: the diff is a className and the red run is the mutation leg (fix absent).", "gates": "Derived at 2f49b3e0 with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`: 34 commands, all run locally, each exit 0 captured before any pipe, including node scripts/check-sdui-manifest.mjs (+ --self-test), pnpm check:nul-bytes, check:cross-package-test-inputs, check:test-source-alias, check:type-check-coverage, check:type-check-debt (re-measure under the lock, 0 raw tsc errors), `pnpm --dir ui exec vitest run scripts/` (Tests 5097 passed | 2 skipped, under the lock), and the changeset gates. `--ran` with exit codes: 34 derived, 34 run, 0 NOT-MEASURED (a DERIVED zero), 0 UNRUN, exit 0. CI families (lint, type-check lanes, Build and E2E UI): in_progress at report time, not re-run locally.", "dogfood_battery": "n/a — no ! in the PR title and Clause-②: no has no (narrowing) arm", "line_budget": "165 changed lines (+164 / -1) across 3 files, under the 3000 human-merge threshold", "files_changed": [ "ui/packages/plugin-detail/src/DetailSection.tsx", "ui/packages/plugin-detail/src/__tests__/copyButton.focusReveal-26329.test.tsx", ".changeset/26329-copy-button-focus-reveal.md" ], "deviations": [ "The first local commit carried the harness's model-named Co-Authored-By trailer; it was amended to the model-free pair (Claude-Session + Co-authored-by: Claude) before any push, so no landed commit carries it.", "test:repo not run locally: the diff touches no repo-project test and the derived list does not name it; Test Core in CI covers it." ], "mcp_calls": "0", "api_writes": "2 relay strokes: (1) pr_create gives POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos/objectstack-ai/objectstack/issues/26487/assignees, run 40452625752, body read back byte-identical (5637 bytes); (2) this os-dev-report comment gives POST /repos/objectstack-ai/objectstack/issues/26329/comments via post-stamped.mjs. git push (3) not counted as REST writes.", "open_questions": [], "out_of_scope_findings": [ "carrier: #25883 · the pencil tooltip/aria text 'Double-click to edit' does not describe keyboard activation; needs a new key in every locale pack · noted, not filed", "carrier: none (承接者:无) · neither the copy button nor the pencil is revealed on a coarse pointer (no pointer-coarse:opacity-100); belongs with the mobile read row's edit path · Acceptance notes only" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Landed · seat 2 · 2026-10-27T06:23Z
b53322d5, head2f49b3e0(+164/−1, seat record on #26487)origin/maingit merge-base --is-ancestorexit 0)gh-readonly-queue/main/pr-26487-*: none left (consumed)Fixes #26329on #26487Status: the read-only copy button on a record page is revealed on keyboard focus as well as hover, like the inline-edit pencil beside it.
pm:dispatchedremoved.