G_CHARGE_ONCE
A customer is charged at most once per order
Current guarantee health
holds
A customer is charged at most once per order3 prerequisites checked · 0 unverified
| Assumption | Health | Evidence |
|---|---|---|
A_REDIS_TTLThe shared Redis cluster keeps dedupe records for the full dedupe window |
holding | 24 <= 48 |
A_RETRY_WINDOWPaylane stops retrying a webhook before our dedupe records expire |
holding | 24 <= 24 |
A_STABLE_EVENT_IDPaylane sends the same event_id on every retry of a webhook |
holding | Current attestation required |
Full graph evidence
{
"assumptions": [
{
"attestations": [],
"id": "A_REDIS_TTL",
"kind": "predicate",
"lhs_fact": "webhook.dedupe_ttl_hours",
"lv": 24,
"op": "\u003c=",
"rhs_fact": "redis.max_ttl_hours",
"rv": 48,
"state": "holding",
"text": "The shared Redis cluster keeps dedupe records for the full dedupe window",
"touched": false
},
{
"attestations": [],
"id": "A_RETRY_WINDOW",
"kind": "predicate",
"lhs_fact": "paylane.retry_window_hours",
"lv": 24,
"op": "\u003c=",
"rhs_fact": "webhook.dedupe_ttl_hours",
"rv": 24,
"state": "holding",
"text": "Paylane stops retrying a webhook before our dedupe records expire",
"touched": false
},
{
"attestations": [
{
"on": 1788307200000,
"person": "p_anika",
"review_by": 1803859200000,
"status": "active"
}
],
"id": "A_STABLE_EVENT_ID",
"kind": "manual",
"lhs_fact": null,
"lv": null,
"op": null,
"rhs_fact": null,
"rv": null,
"state": "holding",
"text": "Paylane sends the same event_id on every retry of a webhook",
"touched": false
}
],
"guarantees": [
{
"chain": [],
"id": "G_CHARGE_ONCE",
"pagerank": 0.00914494507014751,
"prerequisites": [
"A_REDIS_TTL",
"A_RETRY_WINDOW",
"A_STABLE_EVENT_ID"
],
"statement": "A customer is charged at most once per order",
"status": "holds",
"unverified": 0
}
],
"now_ms": 1792353043861,
"sources": [
{
"commit_sha": "local",
"id": "A_REDIS_TTL",
"line": 24,
"path": "adr/ADR-007.md",
"url": null
},
{
"commit_sha": "local",
"id": "A_RETRY_WINDOW",
"line": 21,
"path": "adr/ADR-007.md",
"url": null
},
{
"commit_sha": "local",
"id": "A_STABLE_EVENT_ID",
"line": 27,
"path": "adr/ADR-007.md",
"url": null
},
{
"commit_sha": "local",
"id": "G_CHARGE_ONCE",
"line": 12,
"path": "adr/ADR-012.md",
"url": null
}
]
}Recorded assessments
- PR #9001 · BLOCKEDgraph revision 1
Sources
A_REDIS_TTLadr/ADR-007.md:24 (local checkout)A_RETRY_WINDOWadr/ADR-007.md:21 (local checkout)A_STABLE_EVENT_IDadr/ADR-007.md:27 (local checkout)G_CHARGE_ONCEadr/ADR-012.md:12 (local checkout)- adr/ADR-012.md:12 (local checkout)