Skip to content

MEMBERS-DIRECTORY-001J — Preserve profile-recovery keyboard focus #637

Closed

Description

@daliu

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

  1. added
    bugSomething isn't working
    priority:P1High-priority follow-up
    type:securitySecurity or privacy boundary
    area:membershipMembership lifecycle and reconciliation
    area:webWeb application and hosting
    size:SSmall focused issue
    status:readyDependencies complete and ready to claim
    type:testingTest infrastructure and quality gates
    area:privacyPersonal data, consent, minimization, retention, and privacy operations
    status:in-progressClaimed and actively being implemented
    and removed
    status:readyDependencies complete and ready to claim
    on Aug 13, 2026
  2. self-assigned this
    on Aug 13, 2026
  3. daliu commented on Aug 13, 2026

    @daliu
    ContributorAuthor

    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.

  4. daliu commented on Aug 13, 2026

    @daliu
    ContributorAuthor

    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.body focused instead of the rendered or replacement Reload settings button.

    GREEN and full evidence on the exact current worktree:

    • 001J focused block: 11/11 passed.
    • Full MemberDirectoryProfile suite: 96/96 passed.
    • Full frontend: 18/18 suites, 1,141/1,141 tests passed.
    • TypeScript --noEmit: passed.
    • Frontend lint baseline: 120 files / 113 reviewed legacy errors / 6 reviewed legacy warnings.
    • Diagnostic production build: passed.
    • Workflow/release/security Node suite: 105/105 passed.
    • git diff --check: passed.
    • Exact six-path binary diff SHA-256: 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.ts remains byte-identical and literal false. 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.

  5. daliu commented on Aug 13, 2026

    @daliu
    ContributorAuthor

    CANDIDATE / PR MARKER — PR #638 is open at exact reviewed head e74a1777b0ae5284b127f2b3331815db94aac2cd, tree 2ccf563acd9021876f2c678a33ff797cdf460e23, sole parent and current main 3d49752eef6dc72fb74408b055aea7bd0d691bb9.

    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-identical false; #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.

  6. added a commit that references this issue on Aug 13, 2026
  7. daliu commented on Aug 13, 2026

    @daliu
    ContributorAuthor

    FINAL RELEASE — COMPLETE/CLOSED; all six #637 claims RELEASED.

    PR #638 admin-squash-merged exact reviewed head e74a1777b0ae5284b127f2b3331815db94aac2cd as exact main 7877babc96c78f54d11685b4ffb91496c3bf6945; identical tree 2ccf563acd9021876f2c678a33ff797cdf460e23; exact six-path binary diff SHA-256 8a84508b089ee14f72ecbbe10fa93f717104154adc2ea20dcbf110cbf6855d0e.

    Evidence:

    • PR CI 31752871883: all five required jobs passed on the exact reviewed head.
    • Exact-main CI 31753143412: all five required jobs passed on exact main.
    • Netlify preview 6a7e4efdbd3c7e000808ad4f: ready on exact head; header/redirect checks passed; preview only.
    • Netlify main attempt 6a7e50062ec3fd0008af79c8: failed/unpublished.
    • Netlify still reports the published production control as 9d5cc8612b4321172370bd949d307e7e4ac0ec7d.
    • Public marker is unchanged exact WEB-002C — Publish the bounded inert member-directory interface preview #623 JSON, SHA-256 b74498854585346aa66c0341e29c829245445ce986806c3864cad526b267876f, source c2d87d1f69f15e128a0bc9b1b9f915b7c8417aec, tree 411aa6ec9a9459f5d923030533ffc7c007fe6908, 62 files/digest d837272a1e5efc1575809e87f532276b38d1a63f1dd79ec1aef0533f6da8afb1.
    • GitHub deployment records did not advance.
    • Remote feature branch is deleted.

    This was source-only interface accessibility hardening. memberDirectoryAvailability.ts remains byte-identical and literal false. 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.

  8. removed their assignment
    on Aug 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:membershipMembership lifecycle and reconciliationarea:privacyPersonal data, consent, minimization, retention, and privacy operationsarea:webWeb application and hostingbugSomething isn't workingpriority:P1High-priority follow-upsize:SSmall focused issuetype:reliabilityReliability and recoverytype:securitySecurity or privacy boundarytype:testingTest infrastructure and quality gates

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions