Skip to content

fix(recovery): keep unknown native outcomes unresolved during recovery #201

Closed

Description

@abruption

What happened

Stability audit finding F02 / P1 (2026-09-27). Priority is an audit recommendation, not a claim of a production incident.

Store.finish() marks a request row done even when its result has status unknown. Recovery inspects the row status without inspecting the stored outcome and classifies it as already_processed.

Isolated reproduction: finish a synthetic request with an unknown native outcome, quarantine the device, then begin recovery. Observed unknown → already_processed, remaining gates [activation], and activation becomes active. No real message or duplicate submission was performed; the demonstrated defect is loss of the uncertainty-review gate.

What you expected

Journal processing completion must remain distinct from confirmed native outcome. Unknown outcomes must remain unresolved until explicit reconciliation; do not imply safe automatic resend.

Environment

  • Baseline: published session-peer v1.0.1, commit 55168c3bea5a49e81916fdead57d3634def6b1d6.
  • Reproduction: isolated source/tag fixtures; no live message/ACK tests or production mutation.
  • Audit environments: macOS arm64, Python 3.14.7; Control tests use Node 22.14.0. Linux evidence is explicitly identified above where applicable.
  • Discovery output: not applicable to this fixture; no real session identifiers or credentials are included.

Source evidence

Acceptance criteria

  • Classify stored result.status and applicable retryAllowed semantics, not just requests.status.
  • Keep done+unknown and pending cases gated until explicit reconciliation.
  • Cover confirmed refused, queued/posted, and malformed/missing outcomes without treating queued/posted as proof of ACK.

Scope and limitations

Related to #118, but this is a newly reproduced recovery boundary, not a request to reopen the entire feature.

Target: v1.0.2 stability work. This issue does not authorize a release or operating-service changes. Offline reproduction establishes the failure mechanism, not attribution of historical #161 incidents.

Checked

  • Searched existing issues for duplicates.
  • Removed credentials, conversation contents, private paths and real device/session identifiers.
  • Used isolated fixtures without weakening inbound permissions.

Activity

  1. added this to the v1.0.2 milestone on Sep 27, 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

    bugSomething isn't working

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions