CommitAsync now calls WriteAcquireHistory() between the two SaveChanges calls: iterates _ops, skips SpendOps, writes one ViewerAcquireHistoryEntry per GrantOp. Cascade rows get GrantSource.CardCosmeticCascade; wallet currencies zero RewardDetailId; all rows in a single commit share one DateTime.UtcNow timestamp. Closes _source plumbing from Task 5. 5 new tests added (46 total inventory, 0 failures). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
10 KiB
10 KiB