feat: implement the M4 review gate #67
No reviewers
Labels
No labels
area:backend
area:frontend
area:infra
area:ocr
bug
documentation
duplicate
enhancement
good first issue
help wanted
invalid
phase:M1
phase:M2
phase:M3
phase:M4
phase:M5
phase:M6
phase:M7
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
TJC/bill-splitter!67
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/m4-review-gate"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
POST /open: mint the short code before the CAS, delete the image, returnshortCode+joinUrl(#32)GET /codes/{shortCode}resolve (#33)/joincode entry, hub-live Processing screen, non-host holding card (#37)Test plan
dotnet buildclean;BillSplitter.Tests59 passpnpm typecheck,pnpm lint,pnpm test(12) andpnpm buildall greenCloses #30, closes #31, closes #32, closes #33, closes #34, closes #35, closes #36, closes #37, closes #29.
Code review fixes
Ran a review over this branch and pushed fixes for the issues it surfaced (5 commits).
Correctness
money.ts/moneyInput.tsused each currency's ISO fraction digits, while the backend (ReceiptParser.ToMinor) always multiplies by 100. Any non-2-decimal currency a host selects (e.g. JPY, in the seed set) displayed and parsed 100x wrong, and switching currency in the bill sheet silently rescaled every amount. Now fixed at 100 to match the server; also caches oneIntlformatter per currency.OpenAsyncminted and persisted the code beforeSession.Open's state/host guards ran, so a double-tap/retry or wrong-state open left a second key that still resolved to the session for its whole TTL. The mint is now rolled back if the transition throws.POST /openthe transition committed, then a failedstorage.DeleteAsync500'd the request with noSnapshotUpdatedpush - and the retry 409'd, leaving the host stuck on Review though the split was open. Delete is now best-effort (the MinIO lifecycle rule expires the object within a day).warningsandfailureReasonare marked host-only but ride the shared snapshot that joining participants read once the split is open. They're now cleared at the open gate, matching how the receipt image is dropped.UX
Verification
tsc+vitestgreen (added a 429 test).dotnet buildclean, 59 domain unit tests pass. Integration tests need Docker (Testcontainers), unavailable in this environment - not exercised.