{"pr":"pr:9002","head_sha":"public-demo-v1-S1_FIXED","graph_rev":1,"now_ms":1792108800000,"verdict":"CLEAR_WITHIN_SCOPE","reasons":[{"code":"R_ALL_HOLD","ids":[],"detail":"4 prerequisite assumptions checked; every affected guarantee holds","pre_existing":false}],"changed_facts":[{"fact":"paylane.retry_window_hours","file":"config/partners/paylane.yaml","line":4,"old":24,"new":72,"deleted":false,"controlled_by":"external"},{"fact":"redis.max_ttl_hours","file":"config/platform/redis.yaml","line":4,"old":48,"new":72,"deleted":false,"controlled_by":"us"},{"fact":"webhook.dedupe_ttl_hours","file":"config/webhookingress.yaml","line":4,"old":24,"new":72,"deleted":false,"controlled_by":"us"}],"changed_paths":["config/partners/paylane.yaml","config/platform/redis.yaml","config/webhookingress.yaml"],"model_change":false,"assumptions":[{"id":"A_ACK_BEFORE_TIMEOUT","kind":"predicate","state":"holding","text":"We acknowledge every webhook before Paylane gives up on the delivery","lhs_fact":"webhook.ack_timeout_ms","lv":2000,"op":"<","rhs_fact":"paylane.delivery_timeout_ms","rv":5000,"attestations":[],"touched":false},{"id":"A_REDIS_TTL","kind":"predicate","state":"holding","text":"The shared Redis cluster keeps dedupe records for the full dedupe window","lhs_fact":"webhook.dedupe_ttl_hours","lv":72,"op":"<=","rhs_fact":"redis.max_ttl_hours","rv":72,"attestations":[],"touched":true},{"id":"A_RETRY_WINDOW","kind":"predicate","state":"holding","text":"Paylane stops retrying a webhook before our dedupe records expire","lhs_fact":"paylane.retry_window_hours","lv":72,"op":"<=","rhs_fact":"webhook.dedupe_ttl_hours","rv":72,"attestations":[],"touched":true},{"id":"A_STABLE_EVENT_ID","kind":"manual","state":"holding","text":"Paylane sends the same event_id on every retry of a webhook","lhs_fact":null,"lv":null,"op":null,"rhs_fact":null,"rv":null,"attestations":[{"person":"p_anika","status":"active","on":1788307200000,"review_by":1803859200000}],"touched":false}],"guarantees":[{"id":"G_CHARGE_ONCE","statement":"A customer is charged at most once per order","status":"holds","baseline":"holds","chain":[],"tier":1,"promised_by":["ADR-012"],"relied_on_by":["ADR-018","ADR-015"],"about":["paymentservice"],"exposed_callers":["checkoutservice","frontend","refundworker","webhookingress"]},{"id":"G_DEDUPE","statement":"Each Paylane webhook event is applied at most once","status":"holds","baseline":"holds","chain":[],"tier":1,"promised_by":["ADR-007"],"relied_on_by":["ADR-012"],"about":["webhookingress"],"exposed_callers":[]},{"id":"G_LEDGER_CONSISTENT","statement":"The ledger balances against charges and refunds every night","status":"holds","baseline":"holds","chain":[],"tier":1,"promised_by":["ADR-018"],"relied_on_by":[],"about":["paymentservice"],"exposed_callers":["checkoutservice","frontend","refundworker","webhookingress"]},{"id":"G_REFUND_MATCH","statement":"Refund totals always match what customers were charged","status":"holds","baseline":"holds","chain":[],"tier":1,"promised_by":["ADR-015"],"relied_on_by":["ADR-018"],"about":["refundworker"],"exposed_callers":[]}],"decisions":[],"not_affected":[{"decision":"ADR-016","via_guarantee":"G_ACK_FAST","sibling_of":"ADR-007","status":"holds"}],"checked_with_problems":[],"fixes":[],"fix_budget_used":0}