Skip to content

Nothing calls latch_ever_funded, so a funded auto-created wallet is still reported disposable #286

Description

@MichaelTaylor3d

Task

autoseed::latch_ever_funded is wired, persistent and idempotent — but nothing calls it. No balance observer exists, so in the shipped build a funded auto-created wallet is still reported disposable.

SPEC.md §16.4 carries an explicit NOT YET SATISFIED block saying exactly this. This ticket closes that block.

Why a SPEC note is not enough on its own

The implementer raised this and is right: a SPEC that documents an unwired contract invites a future reader to implement against the paragraph and miss the caveat. The paragraph reads as a specification of behaviour; the caveat is one block away and easy to skim past.

It is also the pattern this ecosystem hit three separate times on 2026-08-20 — a conformance claim that passes because the thing it governs never occurs (Tier2Bribed has no producer; dig-sex §12 asserted profit-first conformance; this latch). CLAUDE.md now requires a conformance list to distinguish satisfied from vacuously satisfied. This is the tracked half of that requirement.

What the latch is for

ever_funded is monotonic and never clears. Once set, no surface may describe the wallet as disposable, whatever the current balance reads — a balance of zero is not evidence a wallet never mattered.

The wallet in question was created without the user asking, and its recovery phrase has never been shown to anyone. So "disposable" is the most dangerous thing a surface could say about it, and the latch is what stops that being said.

Scope

Call latch_ever_funded from wherever the node first observes a non-zero balance for the wallet. The observation point is the design question worth settling before writing: a wallet-sync callback, a periodic reconcile, or the status read — they differ in how quickly the latch is set after funds arrive, and a gap between "funded" and "latched" is a window where the wrong sentence can still be shown.

Fail toward latching. If it is unclear whether funds were observed, latch. The cost of latching a never-funded wallet is that it stops being called disposable; the cost of the reverse is a user losing money they could not recover.

Context

Evidence

A test that fails without the fix: observe a non-zero balance for an origin: auto wallet, restart, and assert is_disposable() is false. Today it stays true forever.

Delete the NOT YET SATISFIED block in the same unit of work — a stale caveat is worse than none, because the next reader trusts it.

Activity

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

    kind:businessa person can DO something new, or money moves, or a shipped surface stops lying to them

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions