The agent paid
From its own underlying address.
Signet paid a redemption obligation that another party had already paid, because ACTIVE on
Flare does not mean unpaid on XRPL, and every guard Signet had watched the wrong chain.
From its own underlying address.
Which means not yet confirmed on Flare, not unpaid.
36 ledgers later.
Schema V2 requires the boundary's own observation.
Signet had three duplicate-payment guards and all three are real: the registry rejects a repeated action, the coordinator database permits one completion per obligation, and the XRP ledger refuses a consumed sequence. Every one of them prevents Signet paying twice. None can see a payment made by somebody else.
The defect was not a missing check. It was a missing chain.
S021 fires on a payment that has validated. Between another party submitting a
payment and that payment validating, Signet can still observe nothing and authorize. That window cannot be closed by
observation. Closing it needs exclusive signing authority over the underlying account, which is Signet's production
architecture and is not instantiated by this deployment.
No third party lost funds. That is luck about the test setup, not a property of the system.
A FAssets redemption status of ACTIVE does not mean the obligation is unpaid; it means the underlying payment has not yet been confirmed on Flare. Signet paid a live Coston2 obligation that the agent had already paid 36 ledgers earlier. Schema V2 corrects this: the decision now requires the signing boundary's own XRP ledger observation, refuses when a matching validated payment already exists, refuses when the observation is missing, unavailable, insufficiently sourced, contradictory or stale, and binds the observation into the authorization commitment. The incident is replayed against both implementations as a permanent regression test, which also proves no V2 input reproduces the original authorization.
Permanent regression: scripts/lifecycle/incident-44928272.test.mjs, which asserts no
V2 input can reproduce the original authorization. It runs in make verify.