Skip to content

MEMBERS-DIRECTORY-001G — Clear People-finder results and distinguish unavailable photos #631

Closed

Description

@daliu

Parent: #504. Connected release remains owned by #507.

Officer impact: In the preserved future People finder, an officer can explicitly clear a completed search and its displayed name/photo cards, and can distinguish a person who supplied no photo from a supplied thumbnail that the browser could not display. This interface source remains disconnected and is not available on production.

Officer documentation: Update SYSTEM_DESIGN.md, IMPLEMENTATION_PLAN.md, SECURITY.md, and the optional-directory diagram, text alternative, and source-review procedure in docs/officers/EVENTS_SHOP_MEMBERS.md.

Deployment evidence: None at issue creation. This is source-only interface hardening. memberDirectoryAvailability.ts must remain byte-for-byte false; no Firebase, provider, account, production-data, or live website action is authorized. Closure must record source/test/merge evidence separately from the unchanged inert #623 production preview.

Atomic outcome

Harden only the preserved connected administrator People-finder interface so completed personal-data results are explicitly disposable from the rendered page and photo fallback copy is truthful.

Invariants and transitions

  • A null photo alone renders No photo with the accessible label No profile photo for .
  • A non-null voluntary thumbnail that fails browser rendering removes the image/data URL from the DOM and renders Photo unavailable with the accessible label Profile photo unavailable for . It must not claim that no photo exists.
  • A later result with a different photo version receives a fresh render attempt; an earlier decode failure must not poison it.
  • After a completed non-empty, empty, validation-failed, or fixed-failure search, Clear search and result cards clears the name field, validation/failure/completion message, headings, cards, names, and images from React state and the DOM, then returns focus to the persistent name input.
  • Clear creates no request ID and makes no directory service call. It does not claim network cancellation, browser-memory erasure, cache removal, audit rollback, or recall of a result already seen or captured.
  • Pending search behavior, explicit-submit normalization, stale application/admin/unmount fencing, fixed errors, result cap/projection, AdminGuard, and no-photo behavior remain unchanged.
  • The source-controlled availability boundary stays false. The default route remains the inert zero-context, zero-request-ID, zero-call preview.
  • Name search plus voluntary thumbnails remains visual comparison only. Do not add photo-as-query, facial recognition, embeddings, similarity, fuzzy name search, biometrics, totals, export, or roster authority.

Exact ownership

  • src/pages/admin/members/AdminMemberDirectory.tsx
    • distinguish absent and browser-unavailable thumbnail fallbacks;
    • add the completed-state Clear action, focus restoration, and minimum state needed for those transitions only.
  • src/pages/admin/members/AdminMemberDirectory.test.tsx
    • one separately named MEMBERS-DIRECTORY-001G block and the minimum expectation updates required by the truthful fallback.
  • src/pages/account/Account.css
    • only scoped People-finder Clear/fallback color, focus, 44-pixel target, and 320-pixel containment rules if required.
  • SYSTEM_DESIGN.md
    • one separately named MEMBERS-DIRECTORY-001G source-only paragraph.
  • IMPLEMENTATION_PLAN.md
    • one separately named MEMBERS-DIRECTORY-001G current-source paragraph.
  • SECURITY.md
  • docs/officers/EVENTS_SHOP_MEMBERS.md
    • only the existing optional-directory diagram/text alternative and one separately named source-review procedure for this change.

Required tests

  • Non-null browser image failure yields the distinct unavailable copy/accessible label and removes the old image/data URL.
  • photo: null still yields the absent-photo copy/accessible label.
  • A later photo version receives a fresh image render.
  • Clear after result cards removes the query, names, images, result heading, and completion state; returns focus; creates no new request ID; and makes no new service call.
  • Clear after an empty result, local validation message, and fixed failure removes the retained query/message without a request.
  • The Clear action is keyboard operable, at least 44 pixels high, explicitly contrasted, and contained/stacked at 320 pixels.
  • The default unavailable branch still obtains no directory context and creates no request ID or service call.
  • Existing race, validation, privacy, and guard tests remain green.

Explicit exclusions

Claim protocol

Assign 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
    priority:P1High-priority follow-up
    type:securitySecurity or privacy boundary
    area:membershipMembership lifecycle and reconciliation
    area:webWeb application and hosting
    area:adminAdministrative workflows
    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-13T20:49:10Z on branch codex/issue-631-directory-clear-results, exact released base 03d197a6b156deaa6760d04d1dd35f587aae85f4.

    Exact ownership is limited to the seven paths and separately named hunks in this issue: src/pages/admin/members/AdminMemberDirectory.tsx, its test, scoped People-finder selectors in src/pages/account/Account.css, and the named 001G current-source/diagram/procedure hunks in SYSTEM_DESIGN.md, IMPLEMENTATION_PLAN.md, SECURITY.md, and docs/officers/EVENTS_SHOP_MEMBERS.md.

    No source edit preceded this marker. memberDirectoryAvailability.ts remains byte-for-byte false; #507 connection/release gates, both #616 Strava files, and its separately named OAUTH-001A2L/RISK-024 SECURITY hunk remain immutable. No Firebase, provider, sign-in, account, production-data, or live action is authorized. The claim remains active through reviewed merge, exact-main audit, closure, and explicit release.

  4. daliu commented on Aug 13, 2026

    @daliu
    ContributorAuthor

    TRUSTWORTHY RED/GREEN — exact base 03d197a6b156deaa6760d04d1dd35f587aae85f4

    RED added only the separately named MEMBERS-DIRECTORY-001G clear-results and thumbnail recovery contract block in AdminMemberDirectory.test.tsx before runtime/style edits. Node 20 focused result: 7 failed / 18 passed. The intended old-source failures were: a failed supplied thumbnail was mislabeled as no photo; no explicit Clear action existed after validation, empty, fixed-failure, result-card, or completed-pending states; and no secondary-button accessibility/layout contract existed.

    GREEN on the exact seven-path candidate:

    • Focused People-finder Jest: 25/25 passed.
    • Full frontend Jest after a clean lockfile install: 18 suites / 1,116 tests passed.
    • TypeScript --noEmit: passed.
    • Frontend lint baseline: 120 files / 113 reviewed legacy errors / 6 reviewed legacy warnings, unchanged.
    • Diagnostic production build: passed.
    • Repository workflow/security/SPA Node suites: 105/105 passed.
    • Release workflow suite: 14/14 passed.
    • git diff --check: passed.
    • Three independent security/privacy, frontend/accessibility/mobile, and backup-officer/operations reviews: GO, no remaining findings.

    Exact uncommitted seven-path binary diff SHA-256: 7dad2d41af360ae97d51cfaef2add30aceacdd0520993dca4493c697bf37a3c6.

    memberDirectoryAvailability.ts remains byte-for-byte false. Both #616 Strava paths and its separately named OAUTH-001A2L/RISK-024 SECURITY hunk are unchanged. No Functions, Rules, indexes, services, packages, workflows, release controls, Firebase, provider configuration, sign-in, account, production data, website publication, or live behavior changed. Production remains the inert #623 preview.

  5. daliu commented on Aug 13, 2026

    @daliu
    ContributorAuthor

    CANDIDATE / PR MARKER — claim remains active

    PR #632 is open at exact reviewed head b1cb1f65ab0793d492d5b042d1c54b7ef712b1a7, tree fdccc159e1ce2c0f9e0d4297dfa4f3b8b5c2ebc7, sole parent and exact released base 03d197a6b156deaa6760d04d1dd35f587aae85f4.

    Exact seven-path binary diff SHA-256: 7dad2d41af360ae97d51cfaef2add30aceacdd0520993dca4493c697bf37a3c6.

    Local focused/full/type/lint/build/workflow/diff gates are green, and three independent reviews are GO with no remaining findings. Hosted exact-head CI and preview checks are now pending. Availability remains byte-for-byte false; #616 paths/hunk remain unchanged; production remains inert #623; no Firebase/provider/sign-in/account/data/live action occurred.

    PR: #632

    The seven claims remain active through exact-head CI, merge, exact-main/deployment audit, closure, and explicit release.

  6. daliu commented on Aug 13, 2026

    @daliu
    ContributorAuthor

    COMPLETE/CLOSED/CLAIM RELEASED.

    PR #632 was admin squash-merged from exact reviewed head b1cb1f65ab0793d492d5b042d1c54b7ef712b1a7 as exact main d5a218a3ceebdfa758067ae7510803c75564c3c0. The reviewed and merged trees are identical at fdccc159e1ce2c0f9e0d4297dfa4f3b8b5c2ebc7; the exact seven-path binary diff SHA-256 is 7dad2d41af360ae97d51cfaef2add30aceacdd0520993dca4493c697bf37a3c6.

    PR CI 31744870804 and exact-main CI 31745206616 passed all five required jobs. Netlify preview 6a7e341eefa31b00075ec5ec is ready and unpublished; the exact-main attempt 6a7e3528d2365e000887798e errored unpublished. The production pointer and public provenance marker remain the verified inert #623 release at deploy 6a7e072f8f346b0008510d29 / control 9d5cc8612b4321172370bd949d307e7e4ac0ec7d; marker SHA-256 remains b74498854585346aa66c0341e29c829245445ce986806c3864cad526b267876f.

    The member-directory availability source remains byte-identical and hard false. No Firebase, Functions, Rules, indexes, provider, account, sign-in, production-data, or connected/live member-directory action occurred. #507 remains the later backend/privacy/authorization/release gate. Active #616 Strava files and its SECURITY OAUTH-001A2L/RISK-024 hunk were preserved byte-for-byte.

    All seven #631 claims are released. The remote feature branch was deleted.

  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:SSmall focused issuetype:featureProduct capabilitytype: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