Skip to content

PAY-003A14: reject unusable Dispute-created evidence - #593

Merged
daliu merged 1 commit into
mainfrom
codex/issue-592-dispute-created
Aug 2, 2026
Merged

daliu merged 1 commit into
mainfrom
codex/issue-592-dispute-created

Conversation

@daliu

@daliu daliu commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Closes #592. Child of #106.

Outcome

Supported charge.dispute.created, charge.dispute.updated, and charge.dispute.closed Events now require usable embedded Dispute.created evidence before any target or provider-binding work. Missing or hostile evidence is durably recorded as target-free needs_review:invalid_dispute_created.

Officer impact: None — this server-only evidence gate 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 verified on this PR candidate. Code is not yet merged. The website was not published and runmprc.com was not verified for this change. Firebase was not deployed or read back. Stripe and other outside providers were 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

  • Accept only primitive safe-integer Dispute creation seconds from 0 through 253402300799, inclusive.
  • Preserve replay, outer realm, embedded realm, Event/status lifecycle, claimed metadata version, and outer Event-time precedence.
  • Persist the valid outer Event time as the ledger stripeCreatedAt; never coerce, convert, persist, return, or log rejected embedded evidence.
  • Do not resolve targets/fallbacks, read or write bindings, read or mutate business records, or evaluate money/predecessor state after an invalid embedded time.
  • Keep structurally valid embedded Dispute times later than their outer Event compatible. Dispute/Event chronology is not part of this child.

Changes

  • Add one Dispute-only admission predicate using the existing non-coercing timestamp validator.
  • Give supported synthetic Dispute fixtures a valid default while preserving explicit adversarial overrides.
  • Add 138 focused tests spanning three lifecycles, both business domains, 14 invalid forms, Proxy defense, precedence, routes/fallbacks, binding and business isolation, missing targets, replay, inclusive boundaries, no-chronology behavior, and non-Dispute compatibility.
  • Reconcile only the stale PAY-003A9/A12 negative Dispute compatibility controls.
  • Add the PAY-003A14 source-only design and historical boundary notes.

Verification

Exact base: 38600a13aeaf57fa1c4d5571efa72af09ea983a1
Reviewed head: 3fa9cbcde06c2314b35716bbb47e312dddb0369d
Tree: 3917905e176632739b3e28e5addbee75abbbe2aa
Patch SHA-256: 3baa80a3f1b3e4afb89ec4207e30ba3e2f3f8070b96406b02202d17a03a3e4ad

  • PAY-003A14 focused: 138 passed
  • Full webhook: 960 passed
  • Full Functions: 7,422 passed; 64 skipped
  • Functions lint: passed
  • Frontend: 951 passed
  • Workflow/release/artifact safety: 86 passed
  • SPA navigation: 11 passed
  • Firestore Rules emulator: 418 passed against demo-rules-test
  • Commerce journal emulator: 63 passed against demo-pay002b2-test
  • Frontend lint baseline: passed
  • Direct diagnostic production build: compiled
  • Workflow YAML parse and git diff --check: passed
  • Dependency audit baseline unchanged: root 59 total / 4 production; Functions 8; no critical findings; no dependency changes

Three independent read-only reviews returned GO for runtime/security, adversarial-test, and documentation/provider/officer boundaries. 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 records and bindings are not inspected or repaired.

@netlify

netlify Bot commented Aug 2, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for luminous-fox-7c393f ready!

Name Link
🔨 Latest commit 3fa9cbc
🔍 Latest deploy log https://app.netlify.com/projects/luminous-fox-7c393f/deploys/6a6eae04d87096000879f96d
😎 Deploy Preview https://deploy-preview-593--luminous-fox-7c393f.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@daliu

daliu commented Aug 2, 2026

Copy link
Copy Markdown
Contributor Author

HOSTED REVIEW GO on exact head 3fa9cbcde06c2314b35716bbb47e312dddb0369d

  • Required PR CI run 30729260291: all five jobs passed.
  • Netlify preview 6a6eae04d87096000879f96d: ready, context deploy-preview, exact commit, published_at: null, HTTP 200, and X-Robots-Tag: noindex.
  • Preview URL: https://deploy-preview-593--luminous-fox-7c393f.netlify.app
  • Reviewed tree: 3917905e176632739b3e28e5addbee75abbbe2aa
  • Patch SHA-256: 3baa80a3f1b3e4afb89ec4207e30ba3e2f3f8070b96406b02202d17a03a3e4ad
  • Worktree is clean and the exact remote head matches the reviewed candidate.
  • Three independent read-only reviews and self-review found no remaining issue.

Officer impact: none.
Officer documentation: None — no officer procedure changes.
Deployment evidence: the candidate source and synthetic checks are verified; this preview is non-production and no production website, runmprc.com, Firebase, provider, data, checkout/payment/refund/dispute, or live-behavior claim is made.

@daliu
daliu merged commit 102209d into main Aug 2, 2026
9 checks passed
@daliu
daliu deleted the codex/issue-592-dispute-created branch August 2, 2026 02:43
@daliu

daliu commented Aug 2, 2026

Copy link
Copy Markdown
Contributor Author

FINAL RELEASE AUDIT — GO

PR #593 is merged as exact main 102209dd99b331797f139dde7e209de75ea73a63; tree 3917905e176632739b3e28e5addbee75abbbe2aa and patch SHA-256 3baa80a3f1b3e4afb89ec4207e30ba3e2f3f8070b96406b02202d17a03a3e4ad match the reviewed candidate.

PR CI 30729260291 and post-main CI 30729355134 passed all five jobs. Preview 6a6eae04d87096000879f96d was ready/non-production/noindex. Production attempt 6a6eaec63bf01e0008c85ec4 failed before deployment; the live site remains on source 9ad6837756cdd409d296009fde5082eeeae5c059.

Officer impact: none.
Officer documentation: None — no officer procedure changed.
Deployment evidence: source/test/merge verified; website publication for this release, Firebase deployment/readback, provider configuration/action, production-data change, checkout/payment/refund/dispute activity, and live behavior are all unverified/not performed.

COMPLETE / CLOSED / CLAIM RELEASED.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PAY-003A14 — Reject unusable embedded Dispute-created evidence

1 participant