{"pr":"pr:9001","head_sha":"public-demo-v1-S1","graph_rev":1,"now_ms":1792108800000,"verdict":"BLOCKED","reasons":[{"code":"R_BROKEN_T1","ids":["G_CHARGE_ONCE","A_RETRY_WINDOW"],"detail":"G_CHARGE_ONCE is broken via G_CHARGE_ONCE -> G_DEDUPE -> A_RETRY_WINDOW","pre_existing":false},{"code":"R_BROKEN_T1","ids":["G_DEDUPE","A_RETRY_WINDOW"],"detail":"G_DEDUPE is broken via G_DEDUPE -> A_RETRY_WINDOW","pre_existing":false},{"code":"R_BROKEN_T1","ids":["G_LEDGER_CONSISTENT","A_RETRY_WINDOW"],"detail":"G_LEDGER_CONSISTENT is broken via G_LEDGER_CONSISTENT -> G_CHARGE_ONCE -> G_DEDUPE -> A_RETRY_WINDOW","pre_existing":false},{"code":"R_BROKEN_T1","ids":["G_REFUND_MATCH","A_RETRY_WINDOW"],"detail":"G_REFUND_MATCH is broken via G_REFUND_MATCH -> G_CHARGE_ONCE -> G_DEDUPE -> A_RETRY_WINDOW","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"}],"changed_paths":["config/partners/paylane.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":24,"op":"<=","rhs_fact":"redis.max_ttl_hours","rv":48,"attestations":[],"touched":false},{"id":"A_RETRY_WINDOW","kind":"predicate","state":"violated","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":24,"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":"broken","baseline":"holds","chain":["G_CHARGE_ONCE","G_DEDUPE","A_RETRY_WINDOW"],"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":"broken","baseline":"holds","chain":["G_DEDUPE","A_RETRY_WINDOW"],"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":"broken","baseline":"holds","chain":["G_LEDGER_CONSISTENT","G_CHARGE_ONCE","G_DEDUPE","A_RETRY_WINDOW"],"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":"broken","baseline":"holds","chain":["G_REFUND_MATCH","G_CHARGE_ONCE","G_DEDUPE","A_RETRY_WINDOW"],"tier":1,"promised_by":["ADR-015"],"relied_on_by":["ADR-018"],"about":["refundworker"],"exposed_callers":[]}],"decisions":[{"id":"ADR-007","roles":["promises"],"via":["G_DEDUPE"],"active_accountable":["p_anika","p_ravi"],"departed":[],"candidates":[{"person":"p_jun","team":"t_payments","evidence":1},{"person":"p_anika","team":"t_payments","evidence":0}],"reviewers":["p_anika","p_ravi"]},{"id":"ADR-012","roles":["promises","relies_on"],"via":["G_CHARGE_ONCE","G_DEDUPE"],"active_accountable":[],"departed":["p_lena","p_marco"],"candidates":[{"person":"p_jun","team":"t_payments","evidence":7},{"person":"p_anika","team":"t_payments","evidence":2}],"reviewers":["p_jun","p_anika"]},{"id":"ADR-015","roles":["promises","relies_on"],"via":["G_CHARGE_ONCE","G_REFUND_MATCH"],"active_accountable":["p_anika"],"departed":[],"candidates":[{"person":"p_jun","team":"t_payments","evidence":1},{"person":"p_anika","team":"t_payments","evidence":0}],"reviewers":["p_anika"]},{"id":"ADR-018","roles":["promises","relies_on"],"via":["G_CHARGE_ONCE","G_LEDGER_CONSISTENT","G_REFUND_MATCH"],"active_accountable":["p_ravi"],"departed":[],"candidates":[{"person":"p_jun","team":"t_payments","evidence":7},{"person":"p_anika","team":"t_payments","evidence":2}],"reviewers":["p_ravi"]}],"not_affected":[{"decision":"ADR-016","via_guarantee":"G_ACK_FAST","sibling_of":"ADR-007","status":"holds"}],"checked_with_problems":[],"fixes":[],"fix_budget_used":0}