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.
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.
statusnamesdexdo closeas thestop action;
closethen refuses it, and classifies the refusal as its own internal invariantfailure. Three independent deals, on three different books, fail identically.
What
statussays to doWhat
closedoesSame failure on all three of our open deals, different books, different buyers, different days:
fb855871…deff9230…894e6f47…Every one is
state=streaming,probe_accepted=true,disputed=false. Nothing unusual happened tothem: each was matched, delivered its probe tick plus one more, and the buyer then went quiet.
withdraw-shellworks fine on the same TokenContracts — we withdrew the finalized1 SHELLfromeach while
closewas refusing — so the deals are reachable, signable and healthy. It isspecifically the
seller_stopaction that the receipt check rejects.Why it matters
max_open_dealsis 1, so an open deal means no resting ask on that book. A buyer who opens adeal, 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:
destroyrequires the deal to be STOPped, which is whatclosewas going to do, and
recover/reclaimare buyer-signed.Notes
code: INTERNALandmessage: internal invariant failedare the client's own classification, sothis looks like a receipt-compatibility check comparing
seller_stopagainst a storedProbeBurnedreceipt for the same TokenContract and treating a different action as a conflictingreplay, rather than a state the operator can fix.
close --jsonmust be written asclose --json;--json closeis rejected. Minor, but the tiptext (
tip: 'close --json' exists) is what pointed the way.status'sstop_actionshould not name a command that cannot run,and the error should say what the operator is expected to do instead.