Repository navigation
PAY-003A15: reject impossible Dispute/Event chronology - #595
Conversation
✅ Deploy Preview for luminous-fox-7c393f ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
HOSTED REVIEW GO on exact head
Officer impact: none. |
|
Merge-policy record: the ordinary squash merge was attempted on exact head Three independent read-only reviews returned GO after their findings were corrected. The administrator exemption will be used only for the unavailable approval, not to bypass a failing/pending check, stale base, unresolved finding, or deployment requirement. |
|
FINAL RELEASE AUDIT — GO PR #595 is merged as exact main PR CI Officer impact: none. COMPLETE / CLOSED / CLAIM RELEASED. |
Closes #594. Child of #106.
Outcome
Newly delivered supported
charge.dispute.created,charge.dispute.updated, andcharge.dispute.closedEvents now reject internally contradictory evidence when the embeddedDispute.createdsecond is later than the outerEvent.createdsecond. The fixed result is durable target-freeneeds_review:invalid_dispute_event_chronology; equality and earlier Dispute time remain admitted.Officer impact: None — this server-only evidence comparison changes no officer screen, task, field, permission, approval, topology, incident step, or recovery action.
Officer documentation: None — no officer procedure describes embedded Stripe timestamp admission, and no officer-visible or operational workflow changes.
Deployment evidence: Source and signed synthetic tests are verified on this candidate. Code is not yet merged. The website was not published and
runmprc.comwas not verified for this change. Firebase was not deployed or read back. Stripe or another outside provider was not configured or acted on. No production data changed. No checkout, payment, refund, or dispute activity was performed. Live production behavior was not verified.Invariant and order
Dispute.created <= Event.createdafter both fields pass the existing non-coercing primitive safe-integer and Firestore-range checks.stripeCreatedAt; do not return, log, store, or convert the rejected embedded value.Stripe documents both fields as object-creation Unix seconds and the three lifecycle Events as carrying a Dispute. Stripe does not explicitly guarantee this cross-field inequality; it is a bounded MPRC source-admission inference. Webhook delivery order is explicitly outside this comparison.
Changes
Verification
Exact base:
102209dd99b331797f139dde7e209de75ea73a63Reviewed head:
b4f6b1d67c888d79284b7ac6b1afbe0fde5db406Tree:
d4f64a11bf20696492e0394f55dd74fcc5acbc89Patch SHA-256:
d97cd93c7779245b180865437b9eb789ae1d6c80c896c260ef8f6a0f5d07d1aademo-rules-testdemo-pay002b2-testgit diff --check: passedIndependent final security/runtime, adversarial-test, and provider/officer-documentation reviews returned GO. Self-review found no authorization, App Check, PII/logging, idempotency, replay, impossible-transition, migration, production-fallback, or scope issue.
Compatibility and migration
There is no schema, Rules, index, package, workflow, API, provider-configuration, migration, backfill, or historical reprocessing change. Previously processed ledgers remain authoritative. Existing business records, bindings, dispute fields, and historical ledger rows are not inspected or repaired.