Last reviewed 2026-09-05Skill version 0.1.0Provisional
Prove that Square captured the card payment and the money moved. An approved payment is an authorisation hold, not a captured payment. This level reads the payment status and the card timeline together.
How does the evidence correlate with this operation?
Strategy
Assurance
Keys
Required
resource_id
strong
payment_id from $action.result.payment.id
yes
idempotency_key
strong
idempotency_key from $operation.id
no
fingerprint
weak
reference_id from $input.reference_id; amount from $input.amount
no
Which evidence does the contract require?
Minimum evidence level E2. An independent channel is required. Minimum channels: 1.
Channel
Level
Independence
Verifier
Description
payment_readback
E2
provider readback
http
Read the payment from the provider. The http verifier returns the parsed object, so a condition path is $observed.payment_readback.payment.status. The card state sits at $observed.payment_readback.payment.card_details.status.
payment_completed_events
E3
provider event
webhook
The payment events of this payment that carry the status COMPLETED. The webhook verifier returns {events, count, latest, earliest, types, duplicates_dropped}. A condition reads $observed.payment_completed_events.count.
payment_created_events
E3
provider event
webhook
The payment.created events for the reference since the operation started. The webhook verifier returns {events, count, latest, earliest, types, duplicates_dropped}. A count above one shows a second charge of the card.
Which conditions must all hold for VERIFIED?
Condition
Meaning
Path
Operator
Expected
Evidence
card_money_captured
Square wrote the capture into two systems. The payment object and the card timeline must both state it, and the payment must be a card payment.
—
all_of
The rows below state the members.
payment_readback
payment_status_completed
The Payment object of Square states the captured state.
$observed.payment_readback.payment.status
eq
COMPLETED
payment_readback
payment_source_is_card
The source of funds is a card. Square populates card_details only there.
$observed.payment_readback.payment.source_type
eq
CARD
payment_readback
card_captured_in_window
The card rail captured the money after the operation started. The timeline dates the capture.
The provider created the payment after the operation started.
$observed.payment_readback.payment.created_at
time_after
$operation.created_at
payment_readback
payment_completed_event
At least one payment event of this payment carries the status COMPLETED. No event type of Square names a completion, so the filter reads the status of the payload.
$observed.payment_completed_events.count
gte
1
payment_completed_events
Which conditions give CONTRADICTED?
Condition
Class
Reason
Path
Operator
Expected
payment_on_wrong_reference
wrong subject
The payment carries a different reference than the intent named.
$observed.payment_readback.payment.reference_id
ne
$input.reference_id
payment_amount_mismatch
wrong amount
The provider charged a different amount than the intent stated.