Final step of the stranded-approval story. Depends on both PR #635 (recovery sweep that currently safe-FAILS stranded approved rows) and PR #638 (#636 idempotent commitment creation) merging.
Once both are in: change RecoverStrandedApprovals to re-drive a stranded approved execution instead of failing it, since a re-drive is now double-buy-safe:
Add a regression test: a stranded row is re-driven, and a re-drive that hits an already-existing commitment does NOT create a second one.
Note: #636's body and #632's analysis incorrectly assumed SP has no native idempotency; #638 corrected that. This issue reflects the corrected, safer reality.
Final step of the stranded-approval story. Depends on both PR #635 (recovery sweep that currently safe-FAILS stranded
approvedrows) and PR #638 (#636 idempotent commitment creation) merging.Once both are in: change
RecoverStrandedApprovalsto re-drive a strandedapprovedexecution instead of failing it, since a re-drive is now double-buy-safe:ClientToken(deterministic per feat(purchases): idempotent commitment creation (ClientToken/dedupe) (closes #636) #638) dedupes server-side.tag:cudly-idempotency-token+ active/payment-pending lookup) short-circuits a repeat, fails-loud on lookup error. Residual succeed-then-tag-fail window is irreducible and acceptable for an automated re-drive (the operator still sees the row).Add a regression test: a stranded row is re-driven, and a re-drive that hits an already-existing commitment does NOT create a second one.
Note: #636's body and #632's analysis incorrectly assumed SP has no native idempotency; #638 corrected that. This issue reflects the corrected, safer reality.