Review: Switch basketball-api to RollingUpdate to prevent webhook delivery failures during deploys
Verdict: READY
Template Completeness
- [x] Type — Bug
- [x] Lineage — traces to forgejo_admin/basketball-api#343 investigation
- [x] Repo — ldraney/pal-e-deployments (correctly identified)
- [x] What Broke — clear description: Recreate strategy causes 30-60s downtime, Stripe webhooks get connection refused, 6 payments ($780) missed
- [x] Repro Steps — 4 steps, reproducible on any deploy
- [x] Expected Behavior — zero-downtime via RollingUpdate
- [x] Environment — prod/basketball-api, current Recreate, desired RollingUpdate with maxUnavailable:0 maxSurge:1
- [x] Acceptance Criteria — 4 criteria, all testable
- [x] Related — links parent investigation #343 and original symptom #340
- [ ] Test Expectations — no explicit test commands listed (minor, covered by AC4 description)
- [ ] Checklist — no discrete execution steps (acceptable for a 3-line deletion)
Traceability
- [x] story:WS-S18 label — "As a parent, I want to receive a branded email with jersey ordering link so that I can order without bringing cash" — verified in project-westside-basketball user-stories section (Parent stories)
- [x] arch:basketball-api label — basketball-api component
- [ ] arch note MISSING — [SCOPE] Create architecture note arch-basketball-api for component basketball-api (non-blocking)
- [x] Forgejo issue — forgejo_admin/basketball-api#346, open
File Targets
- [x]
overlays/basketball-api/prod/deployment-patch.yaml— verified: lines 6-8 containstrategy: type: Recreate, rollingUpdate: null - [ ] Issue references path as
pal-e-deployments/basketball-api/deployment-patch.yaml— minor inaccuracy, actual path isoverlays/basketball-api/prod/deployment-patch.yaml
Key finding: The base template at
bases/standard/deployment.yaml already defaults to RollingUpdate with maxUnavailable: 0, maxSurge: 1. The basketball-api overlay explicitly overrides this to Recreate. The fix is removing the 3-line strategy override (lines 6-8) from the overlay so the base defaults apply.Repo Placement
Issue is filed on
forgejo_admin/basketball-api but the fix lives in ldraney/pal-e-deployments. Acceptable — the bug manifests in basketball-api behavior and the issue's Repo section correctly identifies ldraney/pal-e-deployments as the target. Single Forgejo issue is sufficient for a one-file change.Dependencies
- [x] No blockers — this is an independent infrastructure change
- [x] Board item #719 (Stripe webhook not syncing payment to order status) — in QA column. Related symptom but independent fix
- [x] Board item #720 (Legacy jersey webhook handler missing payment_status guard) — in backlog. Related but independent scope
Acceptance Criteria
All 4 criteria are verifiable:
- AC1 (strategy changed) —
grep strategyin patched file orkubectl get deploy -o yaml. Testable. - AC2 (maxUnavailable: 0) — inherited from base template, verifiable via
kubectl get deploy basketball-api -n basketball-api -o jsonpath='{.spec.strategy}'. Testable. - AC3 (ArgoCD syncs) —
argocd app get basketball-apishows Synced/Healthy. Testable. - AC4 (zero-downtime verify) — trigger deploy, curl health endpoint during rollout. Requires real-time post-merge testing. Testable but manual.
Blast Radius
WARNING: Three other services also override to
Recreate in their deployment-patch overlays:overlays/mcd-tracker/prod/deployment-patch.yaml— Recreateoverlays/gcal-scheduler/prod/deployment-patch.yaml— Recreateoverlays/pal-e-mail/prod/deployment-patch.yaml— Recreate (archived project, low priority)
All postgres.yaml sidecar deployments also use Recreate, which is correct for stateful database pods — no change needed there. This ticket's blast radius is contained to a single file. Rollback is trivial (re-add 3 lines). Consider follow-up tickets for mcd-tracker and gcal-scheduler if they also need zero-downtime.
Decomposition Assessment
Apply the three-thing limit and five-minute rule:
- 1 file target in 1 repo — well under the 3-file limit
- 4 acceptance criteria — under the 5 threshold
- Estimated agent time: <2 minutes (3-line deletion from a YAML file)
- No independent subtasks to parallelize
No decomposition needed.
Recommendation
[BODY]Fix file path reference in issue body:pal-e-deployments/basketball-api/deployment-patch.yaml→overlays/basketball-api/prod/deployment-patch.yaml[SCOPE]Create architecture note arch-basketball-api for component basketball-api (non-blocking — does not affect this ticket's readiness)