Refund idempotency keyed on webhook event id
Key refund idempotency on the provider webhook event id, not the charge id. A single charge can have several legitimate partial refunds, so charge-id keying blocked valid refunds; event-id keying…
PAPI works inside the AI tool you already build in. You run the cycle by typing commands in your chat; PAPI keeps the plan, the memory, and the map so the project stays coherent. Every step below is a real surface you can see.
Five commands, in order. Type them where you already work.
Storefront — Cycle 12 — Orient
Cycle 12 in flight. Next: Review — 1 build awaiting your verdict.
⚠ task-316 needs your verdict (checkout and customer portal)
⚠ 1 decision waiting on you
Health: 🟢 GREEN (73/100)
Velocity: 17 pts/cycle avg · scope accuracy within 3 pts
Strategy review: on track — next due Cycle 15
Board: 4 in cycle — 1 building, 1 in review, 1 shipped, 1 queued
Next action: Review task-316. Then task-317 (Refund handling) is mid-build.Cycle 12 planned — 4 tasks, 15 pts (sized from last cycle's delivered 14).
1. task-315 Email receipts on payment S · 2pts
Why: unblocks refunds, smallest surface. Do first.
2. task-316 Checkout and customer portal M · 3pts
Why: the revenue path. Highest priority this cycle.
3. task-317 Refund handling M · 3pts
Why: depends on task-316's portal session.
4. task-318 Rate limit the public API S · 2pts
Why: no dependency, safe to trail.
Handoffs written for all 4. Order set by priority and dependencies.Cycle 12 released — v0.12.0
✓ 4 tasks shipped, all reviews accepted
✓ Tagged v0.12.0, notes written, cycle branch merged
✓ Cycle closed
Carried into Cycle 13:
• Delivered 14 pts. Next plan sizes from this, not the estimate.
• 2 issues found mid-build, queued for triage.
• Decision 7 (refund idempotency) held up, confidence raised.
Next: run plan to open Cycle 13.The surfaces that persist beyond any single cycle.
Point your AI tool at PAPI once. The cycle, the memory, and the map follow it into every project.