Skip to content

MEMBERS-DIRECTORY-001E — Harden the profile and People-finder interface #627

Closed

Description

@daliu

Parent: #504. This is a frontend-only hardening child. It does not satisfy or claim #507.\n\nOfficer impact: The future My Account photo/discoverability controls and guarded People finder will communicate name eligibility, file errors, and completed searches more clearly to keyboard and screen-reader users. The production preview remains disabled and the backend remains NOT AVAILABLE YET.\n\nOfficer documentation: Update SYSTEM_DESIGN.md, IMPLEMENTATION_PLAN.md, SECURITY.md, and the optional-profile/People-finder source-review section of docs/officers/EVENTS_SHOP_MEMBERS.md.\n\nDeployment evidence: None at issue creation. Closure requires reviewed source, focused and full frontend checks, a diagnostic production build, lint-baseline verification, independent privacy/accessibility/backup-officer review, exact-main CI, and explicit proof that the availability constant remains false and Firebase, providers, accounts, sign-in, and production data were unchanged. A merge is not a website publication.\n\n## Atomic outcome\n\nHarden the already-preserved connected frontend before the later protected backend release:\n\n- derive the UI name prerequisite from the same bounded Unicode display-name eligibility contract used by the directory projection, instead of treating every non-empty Profile name as searchable;\n- keep an existing opt-in removable even when the current name is ineligible;\n- give no-photo placeholders image semantics;\n- link photo and validation errors to the control that needs attention without leaking provider details;\n- announce a successful non-empty finder response without exposing a result total;\n- give the search field accurate validation state and descriptions;\n- improve checkbox, input, and narrow-screen interaction geometry;\n- add stale FileReader/account-change and display-name/update coverage using generated synthetic inputs only.\n\n## Exact ownership\n\nRuntime and tests:\n- src/pages/account/Account.tsx — directory display-name prop only.\n- src/pages/account/Account.test.tsx — separately named current-name/child-prop coverage only.\n- src/pages/account/MemberDirectoryProfile.tsx — pure display-name eligibility, control semantics/copy, placeholder semantics, and stale file-read containment only.\n- src/pages/account/MemberDirectoryProfile.test.tsx — separately named eligibility/accessibility/stale-file blocks and minimum expectation updates only.\n- src/pages/account/Account.css — member-directory control/touch/narrow-screen selectors only.\n- src/pages/admin/members/AdminMemberDirectory.tsx — search field semantics, non-counting completion status, and minimum narrow-control classes only.\n- src/pages/admin/members/AdminMemberDirectory.test.tsx — separately named accessibility/completion/narrow-state blocks and minimum expectation updates only.\n\nDocumentation:\n- SYSTEM_DESIGN.md — one separately named source-only frontend-hardening paragraph.\n- IMPLEMENTATION_PLAN.md — one separately named current optional-directory boundary update.\n- SECURITY.md — one separately named source-only privacy/accessibility ledger row; preserve every unrelated risk and #616 hunk.\n- docs/officers/EVENTS_SHOP_MEMBERS.md — one separately named source-review/procedure update inside the existing optional profile-photo and People-finder section.\n\n## Invariants\n\n- src/services/account/memberDirectoryAvailability.ts remains byte-for-byte false.\n- The default Account and admin branches remain inert: no file/name accepted, no request ID, no directory service/context initialization, no read/upload/search/save, and no result cards.\n- AdminGuard remains the route boundary.\n- Search remains explicit-submit name-prefix only with voluntary thumbnails. No photo query, face recognition, image matching, similarity score, embedding, biometric processing, roster inference, export, total, or pagination.\n- No real name/photo/account/data appears in tests or evidence.\n- No Functions, Rules, indexes, services, packages, workflows, release control, provider configuration, or production data changes.\n- Preserve #616 Strava paths and its separately named SECURITY row byte-for-byte.\n- #507 retains privacy approval, scoped authorization, staging, backend-first deployment/readback, availability flip, connected publication, and live proof.\n\n## Acceptance criteria\n\n- [ ] Names that cannot enter the bounded directory projection are described as ineligible and cannot newly opt in through the connected UI.\n- [ ] Existing opt-in remains turn-off-able after a name becomes missing or ineligible.\n- [ ] Profile placeholders expose image semantics and action errors are associated with the relevant control.\n- [ ] Search validation is programmatically tied to the input; non-empty result completion is announced without a count.\n- [ ] Native controls remain keyboard-operable, readable, and contained at 320 pixels in the available test/evidence harness.\n- [ ] A deferred file read cannot submit or render after the app/account identity changes.\n- [ ] Focused and relevant full tests, typecheck/build, lint baseline, and diff checks pass.\n- [ ] Independent privacy/security, frontend/accessibility, and backup-officer reviews return GO.\n- [ ] The pull request reports Officer impact, Officer documentation, and Deployment evidence separately.\n\n## Stop conditions\n\nStop on an availability flip, enabled production-preview control, backend/provider/data mutation, real personal data, a biometric request, an authorization change, an unbounded result, raw error/detail exposure, an exact active claim collision, or any attempt to publish the accumulated main artifact.\n\n## Claim protocol\n\nAssign this issue and post CLAIMED by /root at an exact UTC timestamp with branch name and exact base before editing. The claim remains active through reviewed merge, exact-main CI/deployment audit, closure, and an explicit COMPLETE/CLOSED/CLAIM RELEASED marker.

Activity

  1. added
    priority:P1High-priority follow-up
    type:securitySecurity or privacy boundary
    area:membershipMembership lifecycle and reconciliation
    area:webWeb application and hosting
    area:adminAdministrative workflows
    size:MMedium multi-file issue
    status:readyDependencies complete and ready to claim
    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-13T18:48:49Z on branch codex/issue-627-directory-interface-hardening, exact base d09ddb2.

    Exact ownership is the seven runtime/test paths and four separately named documentation hunks listed in the issue body. The source-controlled availability boundary remains byte-for-byte false. No Functions, Rules, indexes, service contracts, packages, workflows, release control, provider configuration, sign-in, account, or production-data action is authorized.

    This child is disjoint from active #616 and preserves functions/strava.js, functions/strava.test.js, and its separately named SECURITY OAUTH/RISK-024 row byte-for-byte. Parent #504 remains the coordinator; #507 retains all backend/release/privacy-approval/scoped-authorization/staging/availability-flip/live-proof work. Claim remains active until reviewed merge, exact-main CI/deployment audit, closure, and explicit release.

  4. daliu commented on Aug 13, 2026

    @daliu
    ContributorAuthor

    CANDIDATE / PR MARKER — claim remains active.

    PR #628 is open at exact reviewed head 39a283eb143ce9ca3233bbbaf2b1c87a2537420b, tree c4866084f8bc407eb4d42122550b9d4a7f87b120, on exact current main/base d09ddb242cc9ec25578c11c6b8f078d10753abd5. Exact 11-file binary diff SHA-256: 939842fd789894b4569c15feb74c9f35627399c14691067ac5ad02e6347adcef.

    Independent security/privacy, frontend/accessibility/mobile, and backup-officer operations reviews are GO. Full frontend tests pass 18 suites / 1,089 tests; focused directory tests 3 suites / 312 tests; TypeScript, diagnostic build, lint baseline, workflow/navigation 21/21, release workflow 14/14, diff-check, and synthetic 320×900 keyboard/contrast/containment review pass.

    Availability remains byte-identical false. No backend, Rules, index, service, workflow, release-control, Firebase, provider, account/sign-in, production-data, or live action occurred. Production remains inert #623 deploy 6a7e072f8f346b0008510d29; #507 retains connection and release. #616 paths/hunk are preserved byte-for-byte.

    PR: #628

    Claim remains active through exact-head CI, reviewed merge, exact-main CI/deployment audit, closure, and explicit release.

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

    @daliu
    ContributorAuthor

    FINAL RELEASE — COMPLETE/CLOSED/CLAIM RELEASED.

    PR #628 was admin-squash-merged from exact reviewed head 39a283eb143ce9ca3233bbbaf2b1c87a2537420b as exact main 1e8fa00987dd8b7113362135513eb7f20834c080. Reviewed and merged trees are identical: c4866084f8bc407eb4d42122550b9d4a7f87b120. Exact 11-file binary diff SHA-256: 939842fd789894b4569c15feb74c9f35627399c14691067ac5ad02e6347adcef.

    Reviews:

    • independent security/privacy/race/scope: GO
    • independent frontend/accessibility/mobile: GO
    • independent backup-officer/operations, including post-merge exact-tree readback: GO

    Verification:

    • focused directory tests: 3 suites / 312 tests passed
    • full frontend tests: 18 suites / 1,089 tests passed
    • TypeScript, diagnostic production build, lint baseline, diff-check: passed
    • CI workflow + SPA navigation: 21/21 passed
    • release workflow: 14/14 passed
    • synthetic 320×900 containment, explicit contrast, 44px controls, and keyboard flow: passed
    • PR exact-head CI run 31735732252: all five required jobs passed
    • exact-main CI run 31735954838: all five required jobs passed

    Release/deployment audit:

    All 11 #627 path/hunk claims are released. Future work may base on exact released main 1e8fa00987dd8b7113362135513eb7f20834c080 and must preserve active #616.

  7. 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:adminAdministrative workflowsarea:membershipMembership lifecycle and reconciliationarea:privacyPersonal data, consent, minimization, retention, and privacy operationsarea:webWeb application and hostingpriority:P1High-priority follow-upsize:MMedium multi-file issuetype:featureProduct capabilitytype:securitySecurity or privacy boundary

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions