From 1788c50a85a3b4d01ab652cc354e322181ad8564 Mon Sep 17 00:00:00 2001 From: Jakub Zych Date: Fri, 16 Oct 2026 16:26:58 +0200 Subject: [PATCH] docs(18.1): shorten two COVERAGE.md reasons for the api-coverage gate --- .../phases/18.1-payment-gateway-subscriptions/COVERAGE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.planning/phases/18.1-payment-gateway-subscriptions/COVERAGE.md b/.planning/phases/18.1-payment-gateway-subscriptions/COVERAGE.md index ba362b4b..f811113c 100644 --- a/.planning/phases/18.1-payment-gateway-subscriptions/COVERAGE.md +++ b/.planning/phases/18.1-payment-gateway-subscriptions/COVERAGE.md @@ -9,11 +9,11 @@ Scope: the Stripe Billing surface the frozen PHP `SubscriptionGateway` contract | customers.create with subscriber metadata | INTEGRATE | e-mail, name, subscriber_type and subscriber_id metadata; an idempotency key per subscriber and parameters in a 10-minute window, so concurrent checkouts create one customer (WR-02, plan 18.1-08) | | customers.retrieve | OPT-OUT | not in the frozen PHP contract: the stored customer id is trusted, as PHP did | | customers.update (sync e-mail or name changes) | OPT-OUT | not in the frozen PHP contract | -| checkout.sessions.create (mode subscription) | INTEGRATE | success URL carries the session_id placeholder; subscription_data.metadata; an idempotency key per subscriber, customer, price, URLs and metadata in a 10-minute window, so parallel requests get one session (WR-03, plan 18.1-08); the price is the plan's own in the currency, never another currency's (CR-02, plan 18.1-08) | +| checkout.sessions.create (mode subscription) | INTEGRATE | session_id placeholder in success URL; subscription_data.metadata; 10-min idempotency key (WR-03); price is the plan's own in that currency, never another's (CR-02); plan 18.1-08 | | checkout.sessions.retrieve (after the success redirect) | OPT-OUT | not in the frozen PHP contract: activation comes from the signed customer.subscription.created event | | billing_portal.sessions.create | INTEGRATE | | | billing_portal.configurations (create or update) | OPT-OUT | not in the frozen PHP contract: the portal is configured per account in the Stripe dashboard | -| subscriptions.retrieve (syncSubscription / reconcile) | INTEGRATE | also the webhook job's fresh-state retrieval: created and updated events apply the subscription Stripe holds, not the event snapshot (CR-01, plan 18.1-07); a 404 falls back to the snapshot. `Service.SyncSubscription` uses it through `contracts.SubscriptionRetriever` and refreshes the plan (WR-06) | +| subscriptions.retrieve (syncSubscription / reconcile) | INTEGRATE | also the webhook job's fresh-state read: created/updated apply Stripe's current subscription, 404 falls back to the snapshot (CR-01, 18.1-07); used by Service.SyncSubscription (WR-06) | | subscriptions.update cancel_at_period_end true (cancel at period end) | INTEGRATE | | | subscriptions.cancel (cancel immediately) | INTEGRATE | | | subscriptions.update cancel_at (flexible-billing cancel enums) | OPT-OUT | D-21 keeps PHP's cancel_at_period_end mapping; a manual Stripe test-mode check at UAT decides a follow-up |