Repository navigation
MEMBERS-DIRECTORY-001G — Clear People-finder results and distinguish unavailable photos #631
Description
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
nullphoto 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- one separately named MEMBERS-DIRECTORY-001G/RISK-042 source-ledger row immediately after 001F. Preserve active OAUTH-001A2L — Bound Strava activity/statistics JSON and cancel the unread statistics body #616's OAUTH-001A2L/RISK-024 hunk byte-for-byte.
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: nullstill 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
- Account/profile photo controls and
memberDirectoryService. - Functions, Rules, indexes, schemas, repair/backfill, packages, workflows, or release controls.
- Privacy-notice approval, AUTH-003 capability design, role/MFA changes, or MEMBERS-DIRECTORY-001C — Release and verify the opt-in officer photo directory #507 activation work.
- Firebase/provider configuration, deployment, sign-in, accounts, production data, real names/photos, or live behavior.
- Both active OAUTH-001A2L — Bound Strava activity/statistics JSON and cancel the unread statistics body #616 Strava files and its separately named SECURITY OAUTH-001A2L/RISK-024 hunk.
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
daliu commentedon Aug 13, 2026
CLAIMED by
/rootat2026-08-13T20:49:10Zon branchcodex/issue-631-directory-clear-results, exact released base03d197a6b156deaa6760d04d1dd35f587aae85f4.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 insrc/pages/account/Account.css, and the named 001G current-source/diagram/procedure hunks inSYSTEM_DESIGN.md,IMPLEMENTATION_PLAN.md,SECURITY.md, anddocs/officers/EVENTS_SHOP_MEMBERS.md.No source edit preceded this marker.
memberDirectoryAvailability.tsremains byte-for-bytefalse; #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.daliu commentedon Aug 13, 2026
TRUSTWORTHY RED/GREEN — exact base
03d197a6b156deaa6760d04d1dd35f587aae85f4RED added only the separately named
MEMBERS-DIRECTORY-001G clear-results and thumbnail recovery contractblock inAdminMemberDirectory.test.tsxbefore 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:
--noEmit: passed.git diff --check: passed.Exact uncommitted seven-path binary diff SHA-256:
7dad2d41af360ae97d51cfaef2add30aceacdd0520993dca4493c697bf37a3c6.memberDirectoryAvailability.tsremains byte-for-bytefalse. 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.daliu commentedon Aug 13, 2026
CANDIDATE / PR MARKER — claim remains active
PR #632 is open at exact reviewed head
b1cb1f65ab0793d492d5b042d1c54b7ef712b1a7, treefdccc159e1ce2c0f9e0d4297dfa4f3b8b5c2ebc7, sole parent and exact released base03d197a6b156deaa6760d04d1dd35f587aae85f4.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.
Harden People finder result clearing (#631) (#632)
daliu commentedon Aug 13, 2026
COMPLETE/CLOSED/CLAIM RELEASED.
PR #632 was admin squash-merged from exact reviewed head
b1cb1f65ab0793d492d5b042d1c54b7ef712b1a7as exact maind5a218a3ceebdfa758067ae7510803c75564c3c0. The reviewed and merged trees are identical atfdccc159e1ce2c0f9e0d4297dfa4f3b8b5c2ebc7; the exact seven-path binary diff SHA-256 is7dad2d41af360ae97d51cfaef2add30aceacdd0520993dca4493c697bf37a3c6.PR CI
31744870804and exact-main CI31745206616passed all five required jobs. Netlify preview6a7e341eefa31b00075ec5ecis ready and unpublished; the exact-main attempt6a7e3528d2365e000887798eerrored unpublished. The production pointer and public provenance marker remain the verified inert #623 release at deploy6a7e072f8f346b0008510d29/ control9d5cc8612b4321172370bd949d307e7e4ac0ec7d; marker SHA-256 remainsb74498854585346aa66c0341e29c829245445ce986806c3864cad526b267876f.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.