Review: Switch basketball-api to RollingUpdate to prevent webhook delivery failures during deploys

review-840-2026-04-04 Doc

review ready

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 contain strategy: type: Recreate, rollingUpdate: null
  • [ ] Issue references path as pal-e-deployments/basketball-api/deployment-patch.yaml — minor inaccuracy, actual path is overlays/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 strategy in patched file or kubectl 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-api shows 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 — Recreate
  • overlays/gcal-scheduler/prod/deployment-patch.yaml — Recreate
  • overlays/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.yamloverlays/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)