CluPilotCloud/docs
nexxo af9d60469e Write down why a half-finished sync blocked itself for a day
A run on 2026-07-29 23:11 created price_1TygdEC7u8NpJ8pOt3nsoyYw at Stripe and
died before the row was written. 9da1358 then added the tax_treatment metadata
field, so the next sweep sent the same idempotency key with different parameters
and Stripe refused it — for twenty-four hours, and not only for the sweep:
AddonPrices::ensure() also runs inside a customer's module booking.

Two defects, one spec: nothing asks Stripe what it already has, and the key
covers less than the call sends. The spec settles what identity means here
(product, amount, currency, interval — never metadata, which Stripe lets you
edit) and where the key's fingerprint may go (the catalogue calls, never a
refund, where a duplicate costs the customer their money twice).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 10:06:44 +02:00
..
design Write the handoff, and rescue the approved templates into the repo 2026-07-27 20:18:20 +02:00
handoffs Write down what the audits found and what a real run needs 2026-07-30 08:58:59 +02:00
specs docs: Phase D spec — service framing, redesign & CRUD completeness 2026-07-25 14:13:23 +02:00
superpowers Write down why a half-finished sync blocked itself for a day 2026-07-30 10:06:44 +02:00
deployment.md feat(deploy): releases you can pin to, and a version that tells the truth 2026-07-26 15:21:38 +02:00
handoff-plan-catalogue.md docs: handoff for the plan catalogue rebuild 2026-07-26 10:43:17 +02:00
monitoring-uptime-kuma.md fix(monitoring): cap monitoring retries at the run budget; dependency-free liveness probe 2026-07-25 20:19:32 +02:00
wireguard-hub.md docs(wireguard): document the ownership model and config storage 2026-07-25 22:55:14 +02:00