Skip to content

dexdo close refuses the stop path its own status recommends: INTERNAL / internal invariant failed on an incompatible prior ProbeBurned receipt #152

Description

@tbuza

Version: v0.2.0 · mainnet, generation 4.0.36 · x86_64 Linux · seller role

A seller cannot exit a deal whose buyer has stopped consuming. status names dexdo close as the
stop action; close then refuses it, and classifies the refusal as its own internal invariant
failure. Three independent deals, on three different books, fail identically.

What status says to do

$ dexdo --data-dir ~/.dexdo status 894e6f47…::894e6f47…
status … state=streaming active=true funded=true opened=true disputed=false probe_accepted=true
context … model=Qwen3.6-27B
accounting finalized_owed=1 buyer_locked=3.025 deposit=1.025 buyer_bond=2
           tokens_final=1000000 tokens_pending=1000000
           probe_time=1788663478 last_claim_time=1788663673
next=seller_claim_finalize_or_settle_week_or_seller_stop
  stop_action=run `dexdo close` on 'deal-0-894e6f47…-seller', with the seller --note-key to sign
  stop_effect=TokenContract.sellerStop(); buyer may STOP when done

What close does

$ dexdo --data-dir ~/.dexdo --non-interactive close deal-0-fb855871…-seller --json
{"schema":"dexdo.error.v1","operation":"close","code":"INTERNAL",
 "message":"internal invariant failed",
 "cause":"TokenContract fb855871…::fb855871… action seller_stop has incompatible prior ProbeBurned
          receipt message_id=1ec708c38e9203602e8e10b8f398c890359ca15799b9f7dc1bc2947c435be3c5
          created_at=1788599128; refusing before any money POST",
 "retryable":false}

Same failure on all three of our open deals, different books, different buyers, different days:

deal book ProbeBurned receipt created_at
fb855871… Qwen3.8-27B 1788599128
deff9230… gpt-oss-20b 1788590514
894e6f47… Qwen3.6-27B 1788597380

Every one is state=streaming, probe_accepted=true, disputed=false. Nothing unusual happened to
them: each was matched, delivered its probe tick plus one more, and the buyer then went quiet.

withdraw-shell works fine on the same TokenContracts — we withdrew the finalized 1 SHELL from
each while close was refusing — so the deals are reachable, signable and healthy. It is
specifically the seller_stop action that the receipt check rejects.

Why it matters

max_open_deals is 1, so an open deal means no resting ask on that book. A buyer who opens a
deal, consumes two ticks and disappears therefore takes that seller off the market indefinitely,
and the documented way out is refused. Our three busiest gateways have been unable to list for over
a day; the books they serve went from ~365 SHELL of daily volume to two fills.

There is no other seller-side exit: destroy requires the deal to be STOPped, which is what close
was going to do, and recover/reclaim are buyer-signed.

Notes

  • code: INTERNAL and message: internal invariant failed are the client's own classification, so
    this looks like a receipt-compatibility check comparing seller_stop against a stored
    ProbeBurned receipt for the same TokenContract and treating a different action as a conflicting
    replay, rather than a state the operator can fix.
  • close --json must be written as close --json; --json close is rejected. Minor, but the tip
    text (tip: 'close --json' exists) is what pointed the way.
  • If refusing is correct here, status's stop_action should not name a command that cannot run,
    and the error should say what the operator is expected to do instead.

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

    trackedAccepted and assigned a DEXDO- ticket

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions