ADR-012
Payment service skips its own idempotency check
Reasoning paths
- provides redis.max_ttl_hours, webhook.dedupe_ttl_hours
- provides webhook.dedupe_ttl_hours, paylane.retry_window_hours
- provides
- relies_on redis.max_ttl_hours, webhook.dedupe_ttl_hours
- relies_on webhook.dedupe_ttl_hours, paylane.retry_window_hours
- relies_on
Reviewer evidence
Unavailable accountable people: Lena Fischer, Marco Ruiz
- Jun Park7recent authored sources
- Anika Rao2recent authored sources
ADR-012 supersedes ADR-010
Full graph evidence
{
"active_accountable": [],
"candidates": [
{
"evidence": 7,
"person": "p_jun",
"team": "t_payments"
},
{
"evidence": 2,
"person": "p_anika",
"team": "t_payments"
}
],
"decision": {
"decided_at": 1770681600000,
"id": "ADR-012",
"search_text": "ADR-012 Payment service skips its own idempotency check",
"seen_rev": 1,
"status": "accepted",
"title": "Payment service skips its own idempotency check"
},
"names": {
"p_anika": "Anika Rao",
"p_jun": "Jun Park"
},
"paths": [
{
"assumption": "A_REDIS_TTL",
"chain": [
"G_CHARGE_ONCE",
"G_DEDUPE",
"A_REDIS_TTL"
],
"decision": "ADR-012",
"facts": [
"redis.max_ttl_hours",
"webhook.dedupe_ttl_hours"
],
"guarantee": "G_CHARGE_ONCE",
"role": "PROVIDES"
},
{
"assumption": "A_RETRY_WINDOW",
"chain": [
"G_CHARGE_ONCE",
"G_DEDUPE",
"A_RETRY_WINDOW"
],
"decision": "ADR-012",
"facts": [
"webhook.dedupe_ttl_hours",
"paylane.retry_window_hours"
],
"guarantee": "G_CHARGE_ONCE",
"role": "PROVIDES"
},
{
"assumption": "A_STABLE_EVENT_ID",
"chain": [
"G_CHARGE_ONCE",
"G_DEDUPE",
"A_STABLE_EVENT_ID"
],
"decision": "ADR-012",
"facts": [],
"guarantee": "G_CHARGE_ONCE",
"role": "PROVIDES"
},
{
"assumption": "A_REDIS_TTL",
"chain": [
"G_DEDUPE",
"A_REDIS_TTL"
],
"decision": "ADR-012",
"facts": [
"redis.max_ttl_hours",
"webhook.dedupe_ttl_hours"
],
"guarantee": "G_DEDUPE",
"role": "RELIES_ON"
},
{
"assumption": "A_RETRY_WINDOW",
"chain": [
"G_DEDUPE",
"A_RETRY_WINDOW"
],
"decision": "ADR-012",
"facts": [
"webhook.dedupe_ttl_hours",
"paylane.retry_window_hours"
],
"guarantee": "G_DEDUPE",
"role": "RELIES_ON"
},
{
"assumption": "A_STABLE_EVENT_ID",
"chain": [
"G_DEDUPE",
"A_STABLE_EVENT_ID"
],
"decision": "ADR-012",
"facts": [],
"guarantee": "G_DEDUPE",
"role": "RELIES_ON"
}
],
"reviewers": [
"p_jun",
"p_anika"
],
"sources": [
{
"commit_sha": "local",
"id": "ADR-012",
"line": 2,
"path": "adr/ADR-012.md",
"url": null
},
{
"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
},
{
"commit_sha": "local",
"id": "G_DEDUPE",
"line": 12,
"path": "adr/ADR-007.md",
"url": null
},
{
"commit_sha": "local",
"id": "paylane.retry_window_hours",
"line": 4,
"path": "config/partners/paylane.yaml",
"url": null
},
{
"commit_sha": "local",
"id": "redis.max_ttl_hours",
"line": 4,
"path": "config/platform/redis.yaml",
"url": null
},
{
"commit_sha": "local",
"id": "webhook.dedupe_ttl_hours",
"line": 4,
"path": "config/webhookingress.yaml",
"url": null
}
],
"supersession": [
{
"id": "ADR-010",
"newer": "ADR-012"
}
],
"unavailable": [
"p_lena",
"p_marco"
]
}Recorded assessments
- PR #9001 · BLOCKEDgraph revision 1
Sources
ADR-012adr/ADR-012.md:2 (local checkout)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)G_DEDUPEadr/ADR-007.md:12 (local checkout)paylane.retry_window_hoursconfig/partners/paylane.yaml:4 (local checkout)redis.max_ttl_hoursconfig/platform/redis.yaml:4 (local checkout)webhook.dedupe_ttl_hoursconfig/webhookingress.yaml:4 (local checkout)- adr/ADR-012.md:2 (local checkout)