1.3 KiB
1.3 KiB
Task: Phase 2.4.1 — Atomic Snapshot + Seed Commitment Binding
Assigned to: Antigravity (Implementation Orchestrator)
Priority: CRITICAL (fairness / concurrency)
Date: 2026-08-20
Base SHA: 78151572bd2ae01645d70a0768c6ece517e2cab0
Scope
- Enforce strict single-lock invariant:
createAndLockSnapshotonly transitionsREADY→SNAPSHOT_LOCKED. Any request on already locked/drawn giveaway yields 409 CONFLICT. - Extend
createAndLockSnapshotrepository interface and implementations (MemoryGiveawayRepositoryandPrismaGiveawayRepository) to atomically generateseed, computeseedCommitment = sha256(seed), update DB, and return{ snapshot: ParticipantSnapshotData; seedCommitment: string }. - Eliminate secondary
getByIdread inPOST /api/giveaways/[id]/snapshot. Use returnedseedCommitmentdirectly. - Concurrency regression tests (memory & API):
- Multiple concurrent snapshot requests: exactly 1 succeeds, others get 409.
- Snapshot count strictly 1, seed commitment matches persisted seed.
- Idempotency replay returns cached commitment without generating new seed.
- Post-draw verification
sha256(seedUsed) === seedCommitment.
- Run full gate:
npx prisma generate,npm test,npm run lint,npm run build. - Output report in
agents/antigravity/done/TASK-2026-08-20-seed-precommit-atomicity.md.