Skip to content

MEMBERS-DIRECTORY-001I — Preserve uncertain-change truth across failed reloads #635

Description

@daliu

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

Officer impact: In the preserved future My Account interface, a failed Reload after an uncertain profile-photo or finder-setting change will no longer replace the warning with a false assurance that nothing changed. The connected interface remains unavailable on production.

Officer 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.

Deployment evidence: None at issue creation. This is source-only interface truth hardening. memberDirectoryAvailability.ts must remain byte-for-byte false; no Firebase, provider, account, sign-in, production-data, deployment, or live website action is authorized.

Atomic outcome

Preserve uncertain-change truth through failed profile reloads until one authoritative profile read succeeds.

Defect

An ordinary mutation failure or failed post-mutation readback correctly enters the fixed unknown-change state. If the person then chooses Reload settings and that read fails, the shared load effect currently changes the state to generic unavailable. The generic message says No setting was changed, even though the earlier visibility, upload, or removal may have committed.

Invariants and transitions

  • An ordinary visibility/upload/remove failure with unknown outcome enters the existing fixed could not confirm that change warning.
  • A mutation that resolves but whose authoritative readback fails enters the same unknown state.
  • After that uncertainty, each failed Reload settings within the same app and UID lifetime retains the uncertain-change warning. It must not display or imply No setting was changed.
  • Only a successful authoritative profile read clears uncertainty and displays the returned current photo/finder state.
  • Unknown and failed-reload states keep photo/finder mutation controls hidden, keep all prior draft bytes/data URLs discarded, and retain only Reload settings.
  • Reload creates no request ID and performs no visibility/upload/remove mutation or automatic retry.
  • Initial load failure and definitive-rejection readback failure remain generic unavailable states, but the generic load copy must not globally promise that no setting changed.
  • App change, UID change, and unmount reset the component lifetime; an older context's uncertainty or reload completion cannot change the new context.
  • Existing rejection, request-ID, FileReader, render, mutation, focus, and authoritative-readback fences remain unchanged.
  • Availability stays false; the default branch remains inert and zero-context/zero-call.
  • No photo query, facial recognition, matching, embedding, similarity, biometric processing, roster authority, or membership proof.

Exact ownership

  • src/pages/account/MemberDirectoryProfile.tsx
    • distinguish reloads that follow unknown mutation state from ordinary initial/unavailable loads;
    • preserve uncertain truth on failed reload;
    • remove only the misleading global no-change promise from generic load-failure copy.
  • src/pages/account/MemberDirectoryProfile.test.tsx
    • one separately named MEMBERS-DIRECTORY-001I block plus minimum copy expectation updates.
  • SYSTEM_DESIGN.md
    • one separately named 001I source-only paragraph.
  • IMPLEMENTATION_PLAN.md
    • one separately named 001I current-source paragraph.
  • SECURITY.md
  • docs/officers/EVENTS_SHOP_MEMBERS.md
    • only the optional-directory one-sentence text alternative and one separately named no-terminal 001I source-evidence procedure; no diagram change because data movement is unchanged.

Required tests

  • Capture trustworthy RED on the old runtime for a failed Reload replacing unknown truth.
  • Ordinary unknown mutation plus failed and repeated reloads retains the exact unknown warning and never renders No setting was changed.
  • Successful mutation plus failed authoritative readback follows the same failed/repeated reload behavior.
  • An eventual successful Reload clears uncertainty and shows the returned authoritative toggle/photo state.
  • Initial profile-load failure retains generic unavailable recovery without a false no-change promise.
  • Definitive mutation rejection whose confirming readback fails remains generic unavailable, not falsely elevated to known mutation uncertainty.
  • App and UID changes do not inherit the prior context's uncertainty; late old reloads are inert.
  • Every reload creates zero request IDs and zero visibility/upload/remove calls and restores no draft/data URL.
  • Default unavailable branch remains zero-context, zero-ID, and zero-call.
  • Existing profile, race, accessibility, photo-review, focus, privacy, and mobile 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.

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