Validation: Dedupe Alice Uwamahoro (#420)

validation-420-2026-04-11 Doc

validation pass

Validation: Dedupe Alice Uwamahoro (basketball-api#420)

Verdict

PASS with known scope gap (migration didn't include registrations table in its dependency guard).

Scope

  • Forgejo issue: basketball-api#420
  • PR merged: #428
  • Board item: #925 on board-westside-basketball
  • Deliverable: alembic migration 042 that deletes player 201 + parent 175 (the stale Alice Uwamahoro submission caused by the Gmail dot-normalization bug tracked in #418)

What was validated in prod

  • Final DB state correctSELECT COUNT(*) FROM players WHERE name = 'Alice Uwamahoro' = 1 (only player 202 remains)
  • Parent row deleted — parent 175 gone from parents table
  • Canonical row preserved — player 202 still has valid parent relationship (parent_id 176)
  • alembic head advanced — version_num = 042
  • Downstream unblocked — Alice successfully received a contract offer via #425 endpoint (player 202)

Known scope gap (why PASS-with-debt, not full PASS)

The migration's dependency guard correctly refused to delete player 201 initially because registration row id 185 referenced it. The guard caught a real FK dependency the migration scope had missed. This caused the new basketball-api pod to CrashLoopBackOff until the registration row was manually removed via direct SQL cleanup:
After the cleanup, migration 042 ran successfully on pod restart (no-op path — idempotent). The pod became stable.

What this means for the hook-level PASS

The migration's defensive guard worked correctly — it refused to corrupt state. The scope gap is that the ticket didn't enumerate registrations (and email_log) as dependencies, so the migration needed manual assistance to complete. The final end-state is what the ticket asked for (one Alice row, one parent row). Marking PASS because the ticket's deliverable is live in prod.
  • basketball-api#418 (email normalization — root cause of the dupe)
  • basketball-api#424 (Marcus batch umbrella — consumer of the deduped Alice)
  • Prior Dev agent rebased this migration from slot 039 → 042 due to migration chain coordination