Premise

Kestrel Platform fictional company

Company Brain

Consequences, connected.

Every affected guarantee was evaluated on all of its prerequisites.

PR #pr:9002 Graph revision 1 Head public-demo-v1-S1_FIXED Assessment JSON

Verdict CLEAR_WITHIN_SCOPE

Why this verdict

What changed

FactMainProposedControl
paylane.retry_window_hoursconfig/partners/paylane.yaml:4 24 72 external
redis.max_ttl_hoursconfig/platform/redis.yaml:4 48 72 us
webhook.dedupe_ttl_hoursconfig/webhookingress.yaml:4 24 72 us

How far it reaches

flowchart LR
  G_CHARGE_ONCE -. "relies on" .-> ADR_015["ADR-015"]
  G_CHARGE_ONCE -. "relies on" .-> ADR_018["ADR-018"]
  G_CHARGE_ONCE -. promises .-> ADR_012["ADR-012"]
  G_DEDUPE -. "relies on" .-> ADR_012["ADR-012"]
  G_DEDUPE -. promises .-> ADR_007["ADR-007"]
  G_LEDGER_CONSISTENT -. promises .-> ADR_018["ADR-018"]
  G_REFUND_MATCH -. "relies on" .-> ADR_018["ADR-018"]
  G_REFUND_MATCH -. promises .-> ADR_015["ADR-015"]
  classDef broken fill:#2a0f1a,stroke:#ff6b8b,color:#ffd3dd
  classDef unknown fill:#2a2310,stroke:#ffd27a,color:#fff0cc
  classDef holds fill:#0d2620,stroke:#7cf0c8,color:#d8fff2
Fig. 1. Each broken path fires from the changed assumption up to the decisions that promise or rely on it.
Dependency graph text
flowchart LR
  G_CHARGE_ONCE -. "relies on" .-> ADR_015["ADR-015"]
  G_CHARGE_ONCE -. "relies on" .-> ADR_018["ADR-018"]
  G_CHARGE_ONCE -. promises .-> ADR_012["ADR-012"]
  G_DEDUPE -. "relies on" .-> ADR_012["ADR-012"]
  G_DEDUPE -. promises .-> ADR_007["ADR-007"]
  G_LEDGER_CONSISTENT -. promises .-> ADR_018["ADR-018"]
  G_REFUND_MATCH -. "relies on" .-> ADR_018["ADR-018"]
  G_REFUND_MATCH -. promises .-> ADR_015["ADR-015"]
GuaranteeStatus / baselineTierPromised byRelied on byExposed callers
G_CHARGE_ONCE holdsMain: holds 1 ADR-012 ADR-018, ADR-015 checkoutservice, frontend, refundworker, webhookingress
G_DEDUPE holdsMain: holds 1 ADR-007 ADR-012
G_LEDGER_CONSISTENT holdsMain: holds 1 ADR-018 checkoutservice, frontend, refundworker, webhookingress
G_REFUND_MATCH holdsMain: holds 1 ADR-015 ADR-018

Checked and not affected

holds

ADR-016 relies on G_ACK_FAST, also provided by ADR-007. Its full prerequisite set still holds.

Who should review

Remedies that survive verification

Only complete remedies may open a fix PR. Partial and rejected alternatives remain visible.

No verified remedy available for this assessment.

Assumption evidence

AssumptionStatePredicate / attestation
A_ACK_BEFORE_TIMEOUTWe acknowledge every webhook before Paylane gives up on the delivery holding 2000 < 5000webhook.ack_timeout_ms / paylane.delivery_timeout_ms
A_REDIS_TTLThe shared Redis cluster keeps dedupe records for the full dedupe window holding 72 <= 72webhook.dedupe_ttl_hours / redis.max_ttl_hours
A_RETRY_WINDOWPaylane stops retrying a webhook before our dedupe records expire holding 72 <= 72paylane.retry_window_hours / webhook.dedupe_ttl_hours
A_STABLE_EVENT_IDPaylane sends the same event_id on every retry of a webhook holding

Anika Rao · activeAttested: 2026-09-02 00:00 UTC
Review by: 2027-03-01 00:00 UTC

The lexical gap

Fulltext search

Fulltext for dedupe | max | paylane | redis | retry | ttl | webhook | window finds ADR-005, ADR-007, ADR-010, ADR-011, ADR-016.

Guarantee graph

The guarantee graph additionally reaches no additional decisions, whose decision bodies do not mention those terms.

Source citations