Repository navigation
AUTH-006I — Hand off profile Edit focus to the full-name input #655
Description
Foundation: released #531, #651/PR #652, and #653/PR #654.
Officer impact: No live workflow change is claimed at issue creation. In reviewed My Account source, a keyboard user whose exact current focused Edit opens the full-name editor will have otherwise-lost focus handed once to the existing Full name input.
Officer documentation: Update SYSTEM_DESIGN.md, IMPLEMENTATION_PLAN.md, SECURITY.md, and the existing My Account Mermaid/text alternative plus one no-terminal source-evidence procedure in docs/officers/EVENTS_SHOP_MEMBERS.md.
Deployment evidence: None at issue creation. Source/test review only. No website publication, Firebase deployment, provider configuration, account/sign-in action, production-data action, or live behavior is authorized or claimed.
Atomic outcome
When the exact connected current Edit button owns focus and its activation opens the profile-name editor, do not leave focus on body or the removed button. Consume one current-generation-only intent and hand otherwise-lost focus to the existing enabled Full name input. Preserve any other connected focus and never retain the intent for a later render.
Current defect
On exact released main 75a4f1ee3b20f61d375ed6d786e67e056a2206ef (tree 6036ac48fd2c28f0cc0c05d5b1be09a7d812783e), the Edit handler clears prior save results and calls setEditing(true). That removes the focused button and inserts the labeled input, but there is no input ref or focus handoff; native removal commonly leaves keyboard focus on body. Existing tests prove editor fields and save behavior but not entry focus. The input already inherits the reviewed global visible-focus rule, so no CSS change is needed.
Invariants and acceptance criteria
- Keep Edit a native current-profile button and Full name a native labeled input with its existing value, description, autocomplete, disabled, and max-length behavior.
- On every Edit activation, clear or replace the new intent. Arm it only when the exact event currentTarget is connected and is
document.activeElement; retain only the opaque current profile generation number. Do not useautoFocus, timeout, animation frame, selection, or new React state. - Reuse the existing context generation. Application, Firestore, identity-service, UID, profile-load, reload, or unmount transitions clear the intent.
- One layout effect consumes the intent before every check. Require the same current profile generation, mounted current ready profile, editor open, not saving, and the exact connected enabled Full name input.
- Leave an already-focused input alone. Restore focus only from no active element,
body, document root, or a disconnected element. Preserve every other connected deliberate focus, including Sign out or the in-Profile verification control. - Focus is one-shot. If the target is missing or disabled, context is obsolete, or another connected target owns focus, consume without moving focus; removing that target or rerendering later must not trigger delayed focus.
- An unfocused or programmatic Edit activation still opens the editor and clears prior save feedback but moves no focus. A focused activation keeps the current name unchanged and places the input before Save and Cancel in keyboard order; the next ordinary Tab reaches Save.
- Add no read, write, validation, request, retry, provider call, log, storage, payload, result copy, or data projection. Preserve AUTH-006F one-attempt/context fences and AUTH-006G/H save success/unconfirmed behavior and exact calls.
Trustworthy RED
On unchanged runtime at the exact base, add one minimal test-only witness: render a made-up current ready profile, focus the connected Edit button, activate it as a keyboard click, and require the existing Full name input to own focus while no extra service call occurs. The old source opens the editor but leaves focus on body or the disconnected Edit origin. Record test-only diff digest and focused output before runtime implementation.
Required GREEN coverage
- Focused keyboard Edit opens the editor, removes Edit, keeps the authoritative current name, and focuses the enabled labeled input.
- The input retains its accessible description, autocomplete, max length, native semantics, and existing global visible-focus rule; no
Account.cssorindex.cssedit. - Body, null, document-root, and disconnected post-removal focus restore to the input; an already-focused input is not focused again.
- Unfocused or programmatic activation opens the editor without moving focus.
- Connected focus outside Profile and on the persistent in-Profile verification control is preserved; after it is removed, a later rerender cannot trigger delayed focus.
- A consumed intent moves focus at most once; same-context rerenders do not repeat it.
- App-only, Firestore-only, identity-service-only, UID-only, profile reload, unavailable-to-same-context generation, and unmount transitions cannot reuse an older intent.
- Entering Edit after AUTH-006G success still clears the old result, uses the reread name, and focuses only from the focused Edit origin.
- No save validation or
updateMyProfilecall occurs on entry; existing load/registration call counts, payloads, Save success, unconfirmed failure, validation, Cancel, Try-profile-again, and sign-out behavior remain unchanged. - Run the named AUTH-006I block, full Account suite, full frontend, repository Node, type-check, scoped ESLint, unchanged lint baseline, diagnostic build, workflow/security checks, and diff-check.
Exact ownership
src/pages/account/Account.tsxsrc/pages/account/Account.test.tsxSYSTEM_DESIGN.mdIMPLEMENTATION_PLAN.mdSECURITY.mddocs/officers/EVENTS_SHOP_MEMBERS.md
Add a separate AUTH-006I design/plan boundary, a separate AUTH-006I/RISK-039 source-ledger row, and one no-terminal backup-officer procedure. Update the existing My Account diagram/text alternative to show focused Edit handing otherwise-lost focus to Full name before Save. Keep #651/#653 historical evidence intact while replacing only their Edit-to-input remains open references where current truth requires it.
src/pages/account/Account.css and src/index.css remain byte-for-byte unchanged; the existing global native-control focus rule supplies visible focus.
Explicit exclusions
- Cancel-to-Edit focus; validation-error association,
aria-invalid, error clearing, or error focus; Try-profile-again settlement focus; save-pending announcement. - Changes to Full name value, copy, label, description, max length, autocomplete, validation, payload, save calls, result truth, AUTH-006F/G/H, or profile recovery.
- Functions, Rules, schemas, indexes, services, packages, workflows, directory runtime/availability/connection, Strava, provider configuration, Firebase deployment, accounts, sign-in, production data, publication, or live action.
- Membership, dues, role, payment, entitlement, roster, photo query, facial recognition, matching, embeddings, similarity, or biometrics.
- Active OAUTH-001A2L — Bound Strava activity/statistics JSON and cancel the unread statistics body #616
functions/strava.js,functions/strava.test.js, and its separate OAUTH-001A2L/RISK-024 SECURITY hunk.
Migration and residual risk
No migration. This same-commit browser focus handoff proves no profile write, persistence, identity ownership beyond existing authentication, deployment, membership, directory eligibility, or live behavior. Cancel, validation, retry-settlement, and pending-announcement outcomes remain separate.
Coordination and claim protocol
#651 and #653 are closed and their claims released. Open PRs are empty and no open issue claims Edit-to-input focus. #504 remains the directory coordinator and #507 retains every connection/release gate. #616 overlaps only the SECURITY file; its two Strava blobs and separately named RISK-024 hunk are immutable, so whichever merges later must controlled-refresh and preserve the earlier named hunk. Creation is not a claim: before editing, post and reread disjointness notices, create a unique worktree and branch from exact current main, assign the issue, post a timestamped exact-six-path claim, and hold it through reviewed merge, audit, closure, and explicit release.
Activity
daliu commentedon Aug 14, 2026
CLAIMED by /root at 2026-08-14T04:51:46Z; branch
codex/issue-655-profile-edit-input-focus; base75a4f1ee3b20f61d375ed6d786e67e056a2206ef; base tree6036ac48fd2c28f0cc0c05d5b1be09a7d812783e; exact paths:src/pages/account/Account.tsx,src/pages/account/Account.test.tsx,SYSTEM_DESIGN.md,IMPLEMENTATION_PLAN.md,SECURITY.md,docs/officers/EVENTS_SHOP_MEMBERS.md. No source or documentation edit preceded this marker. Account.css and index.css are explicitly excluded and remain unchanged. Active #616 Strava files and its separate OAUTH-001A2L/RISK-024 SECURITY hunk are immutable. The claim remains active through reviewed merge, exact-main/provider audit, closure, and explicit release.daliu commentedon Aug 14, 2026
COMPLETE / RELEASED by
/rootat 2026-08-14T05:28:22Z.PR #656 merged as exact main
3265a55cb92df1ebb5401f2647ff81e4ca3af0b8; tree322468cc75a57f7ea392eb9f57a201fb11c4b35ais byte-identical to reviewed candidate tree1ea34dc836c6075e08b8353049c8a5a97fc9d364, with reviewed base75a4f1ee3b20f61d375ed6d786e67e056a2206efas first parent. The exact six-path diff remains SHA-25627106fa69f77a0fcfb86598cfbeb725b03f096194e61f988cdfcdb58a7d43b11.Exact-main CI run
31772914108passed all five jobs. The exact-main Netlify attempt6a7ea6a202ab210008a5bd59is terminalerrorwithpublished_at: null; it did not publish or replace production. The published pointer remains inert #623 deploy6a7e072f8f346b0008510d29, control commit9d5cc8612b4321172370bd949d307e7e4ac0ec7d, and public release-marker SHA-256b74498854585346aa66c0341e29c829245445ce986806c3864cad526b267876f.Directory availability remains literal
falsewith blob295909b0df8dd7c54a0f164f99d4943656aece4b.Account.cssandindex.cssremain unchanged. Active #616 Strava blobs remain2eb48945061ab5ad2a896c6835f308cefd7fe63aandd1792d390bd57608fecab84341a6e5916fcf8196; its separate RISK-024 line remains unchanged.No website publication, Firebase deployment, provider configuration, account/sign-in change, production-data action, or live behavior occurred. The exact six claimed paths are released for later coordinated work.