Repository navigation
MEMBERS-DIRECTORY-001J — Preserve profile-recovery keyboard focus #637
Description
Parent: #504. Connected release remains owned by #507.\n\nOfficer impact: In the preserved future My Account interface, keyboard and screen-reader users will be moved to the available recovery action after a profile-photo or finder-setting failure instead of losing their place. The connected interface remains unavailable on production.\n\nOfficer documentation: Update SYSTEM_DESIGN.md, IMPLEMENTATION_PLAN.md, SECURITY.md, and the optional-directory one-sentence text alternative plus one no-terminal evidence-review procedure in docs/officers/EVENTS_SHOP_MEMBERS.md. The existing data-flow diagram does not change.\n\nDeployment evidence: None at issue creation. This is source-only interface accessibility hardening. memberDirectoryAvailability.ts must remain byte-for-byte false; no Firebase, provider, account, sign-in, production-data, deployment, or live website action is authorized.\n\n## Atomic outcome\n\nKeep keyboard focus on the correct Reload settings recovery action after user-initiated profile-setting failure and each failed reload.\n\n## Defect\n\nThe preserved connected Account branch removes a focused checkbox, Save, or Remove action when a mutation outcome becomes unknown or its authoritative readback fails. The replacement Reload settings button has no focus intent. Choosing Reload then removes that focused button during loading, and a failed read creates another replacement button without restoring focus. Keyboard and screen-reader users can be stranded on the document body precisely while recovery is required.\n\n## Invariants and transitions\n\n- A user-initiated visibility, upload, or removal mutation that enters unknown state focuses the rendered Reload settings button.\n- A resolved mutation whose authoritative readback fails follows the same focus transition.\n- A definitive mutation rejection whose confirming read fails enters generic unavailable and focuses Reload settings.\n- Choosing Reload records one bounded focus intent for that exact same-lifetime load.\n- A failed unknown or generic Reload focuses the replacement Reload settings button.\n- An initial/background profile-load failure does not steal focus from an unrelated control or the document.\n- A successful Reload follows existing ready-state focus behavior and does not focus a removed recovery button.\n- App change, UID change, unmount, or stale earlier completion clears/fences the recovery focus intent and cannot move focus in a new context.\n- Focus never creates a request ID, mutation, automatic retry, draft restoration, data URL, or service call beyond the existing profile read.\n- Existing uncertainty truth, generic failure truth, mutation/read/render/context fences, and photo-draft rules remain unchanged.\n- Availability stays false; the default branch remains inert and zero-context/zero-call.\n- No photo query, facial recognition, matching, embedding, similarity, biometric processing, roster authority, or membership proof.\n\n## Exact ownership\n\n- src/pages/account/MemberDirectoryProfile.tsx\n - only a bounded recovery-focus intent/ref, Reload button ref, and guarded focus handoff.\n- src/pages/account/MemberDirectoryProfile.test.tsx\n - one separately named MEMBERS-DIRECTORY-001J block plus minimum focus assertions in directly affected recovery tests.\n- SYSTEM_DESIGN.md\n - one separately named 001J source-only paragraph.\n- IMPLEMENTATION_PLAN.md\n - one separately named 001J current-source paragraph.\n- SECURITY.md\n - one separately named 001J/RISK-042 row immediately after released 001I; preserve active #616 OAUTH-001A2L/RISK-024 byte-for-byte.\n- docs/officers/EVENTS_SHOP_MEMBERS.md\n - only the optional-directory one-sentence text alternative and one separately named no-terminal 001J source-evidence procedure; no diagram change because data movement/page structure are unchanged.\n\n## Required tests\n\n- Capture trustworthy RED on the old runtime for focus falling to body after user-initiated failure and failed Reload.\n- Ordinary unknown visibility, upload, and remove paths focus Reload settings.\n- Successful mutation plus failed authoritative readback focuses Reload settings.\n- Definitive rejection plus failed confirming read focuses generic Reload settings.\n- Failed and repeated unknown-state Reloads focus each replacement button.\n- Failed generic Reload focuses its replacement button.\n- Initial load failure never steals preexisting outside focus.\n- Successful authoritative Reload does not leave focus on a removed recovery button and preserves existing ready behavior.\n- App and UID changes and unmount make late old failures/reloads focus-inert.\n- Every reload creates zero request IDs and zero visibility/upload/remove calls and restores no draft/data URL.\n- Default unavailable branch remains zero-context, zero-ID, and zero-call.\n- Existing profile, race, accessibility, photo-review, uncertainty, privacy, and mobile tests remain green.\n\n## Explicit exclusions\n\n- CSS/layout, Account wiring/tests, admin finder, client service adapters, inbound WebP validation, or integration harnesses.\n- Functions, Rules, indexes, schemas, repair/backfill, packages, workflows, or release controls.\n- Privacy-notice approval, AUTH-003 capability design, role/MFA changes, or #507 activation.\n- Firebase/provider configuration, deployment, sign-in, accounts, production data, real names/photos, or live connected behavior.\n- Both active #616 Strava files and its separately named SECURITY OAUTH-001A2L/RISK-024 hunk.\n\n## Claim protocol\n\nAssign the issue and post a timestamped CLAIMED marker naming the exact branch and released base before any edit. The claim remains active through reviewed merge, exact-main audit, closure, and explicit release.
Activity
daliu commentedon Aug 13, 2026
CLAIMED by /root at 2026-08-13T22:51:39.007Z on branch codex/issue-637-profile-recovery-focus, exact released base 3d49752.\n\nExact ownership is limited to:\n- src/pages/account/MemberDirectoryProfile.tsx: only a bounded recovery-focus intent/ref, Reload settings button ref, and guarded same-lifetime focus handoff;\n- src/pages/account/MemberDirectoryProfile.test.tsx: one separately named MEMBERS-DIRECTORY-001J block plus minimum focus assertions in directly affected recovery cases;\n- one separately named 001J hunk in SYSTEM_DESIGN.md, IMPLEMENTATION_PLAN.md, and SECURITY.md;\n- only the optional-directory one-sentence text alternative and one separately named no-terminal 001J evidence-review procedure in docs/officers/EVENTS_SHOP_MEMBERS.md; no diagram change.\n\nEverything else is immutable: CSS/layout, Account wiring/tests, admin finder, client services and inbound WebP validation, availability, Functions, Rules, indexes, packages, workflows, release controls, providers, accounts, sign-in, data, deployment/live behavior, #507 gates, and both #616 Strava files plus its OAUTH-001A2L/RISK-024 SECURITY row. No source edit preceded this marker. Claim remains active through reviewed merge, exact-main audit, closure, and explicit release.
daliu commentedon Aug 13, 2026
IMPLEMENTATION / RED-GREEN / REVIEW MARKER — exact six-path candidate on released base
3d49752eef6dc72fb74408b055aea7bd0d691bb9.Trustworthy RED, before the runtime change: the separately named MEMBERS-DIRECTORY-001J block ran 4/11 green and 7/11 red; every required recovery transition left
document.bodyfocused instead of the rendered or replacementReload settingsbutton.GREEN and full evidence on the exact current worktree:
MemberDirectoryProfilesuite: 96/96 passed.--noEmit: passed.git diff --check: passed.8a84508b089ee14f72ecbbe10fa93f717104154adc2ea20dcbf110cbf6855d0e.Three independent reviews are GO with no findings: frontend/accessibility/test quality; security/privacy/race/scope; backup-officer/operations/docs. The focus intent is bounded by component lifetime and exact reload identity; initial/background/stale completions cannot steal focus; successful authoritative reads clear intent; no request ID, mutation, retry, service call, draft byte, or data URL is created/restored by focus.
memberDirectoryAvailability.tsremains byte-identical and literalfalse. The exact six changed paths are the claim. Both active #616 Strava blobs and its RISK-024/OAUTH SECURITY area remain unchanged. Source/tests changed only; nothing is merged or published, runmprc.com remains the inert #623 artifact, and Firebase/providers/accounts/sign-in/data/live connected behavior remain unchanged. Claim remains active through reviewed merge and exact-main release audit.daliu commentedon Aug 13, 2026
CANDIDATE / PR MARKER — PR #638 is open at exact reviewed head
e74a1777b0ae5284b127f2b3331815db94aac2cd, tree2ccf563acd9021876f2c678a33ff797cdf460e23, sole parent and current main3d49752eef6dc72fb74408b055aea7bd0d691bb9.PR: #638
Exact six-path binary diff SHA-256:
8a84508b089ee14f72ecbbe10fa93f717104154adc2ea20dcbf110cbf6855d0e. Three independent pre-push reviews are GO and all local focused/full/release gates are green. Availability remains byte-identicalfalse; #616 protected paths/hunk remain unchanged. Hosted exact-head CI and deploy-preview checks are now pending. Nothing is merged or published; Firebase/providers/accounts/data/live behavior remain unchanged. Claim remains active through merge and exact-main audit.Preserve profile recovery focus (#637) (#638)
daliu commentedon Aug 13, 2026
FINAL RELEASE — COMPLETE/CLOSED; all six #637 claims RELEASED.
PR #638 admin-squash-merged exact reviewed head
e74a1777b0ae5284b127f2b3331815db94aac2cdas exact main7877babc96c78f54d11685b4ffb91496c3bf6945; identical tree2ccf563acd9021876f2c678a33ff797cdf460e23; exact six-path binary diff SHA-2568a84508b089ee14f72ecbbe10fa93f717104154adc2ea20dcbf110cbf6855d0e.Evidence:
31752871883: all five required jobs passed on the exact reviewed head.31753143412: all five required jobs passed on exact main.6a7e4efdbd3c7e000808ad4f: ready on exact head; header/redirect checks passed; preview only.6a7e50062ec3fd0008af79c8: failed/unpublished.9d5cc8612b4321172370bd949d307e7e4ac0ec7d.b74498854585346aa66c0341e29c829245445ce986806c3864cad526b267876f, sourcec2d87d1f69f15e128a0bc9b1b9f915b7c8417aec, tree411aa6ec9a9459f5d923030533ffc7c007fe6908, 62 files/digestd837272a1e5efc1575809e87f532276b38d1a63f1dd79ec1aef0533f6da8afb1.This was source-only interface accessibility hardening.
memberDirectoryAvailability.tsremains byte-identical and literalfalse. No Firebase, Functions, Rules, indexes, provider, account/sign-in, production-data, or connected-live action occurred. Production remains the inert #623 interface preview; #507 still owns connection and release gates. Active #616 paths and SECURITY hunk remain preserved.All six exact #637 path/hunk claims are now free.