Repository navigation
test(wallet): second-pass browser regression for card reveal, freeze and controls - #772
NewWorldVenture wants to merge 4 commits into
Conversation
…and controls JIMMY-SUPPORT-CARDUI-20261001. One new spec beside the merged lifecycle repairs (#749, #751, #753), on the same harness: the real components in React 19, every server action and Stripe.js call replaced before module evaluation, the context offline and every request aborted and recorded. Drives what their specs do not: - reveal: the same card reopened while its old prepare or key is pending (the old completion makes no further call and no display); a thrown prepare, import, load, nonce or key ends loading with an error and no display; a prepare or key that throws after close faults nothing. - freeze: an outcome that lands after the view unmounts dispatches once and faults nothing. - controls: a refusal or rejection after the view unmounts has no stale presentation. - physical order: the dialog's own close keeps the pending claim like Cancel; its late success neither announces nor closes the reopened dialog. Reported, not blessed (reproductions, no source change): claims live in the mounted view, so a remounted view dispatches a second freeze, or issues a second virtual card, while the first is still pending; and a freeze that lands after unmount is still announced and refreshed. 18 tests; 11/11 restored component mutants killed (the existing three specs kill 9/11; the remount and post-unmount freeze behaviours are only observed here). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DXw2nu25BjyRfA6Fg3YiMS
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
NewWorldVenture
left a comment
There was a problem hiding this comment.
Support: received JIMMY-SUPPORT-CARDUI-20261001 evidence and current subscribed destination. Keep this draft test-only while its exact-head CI runs. Next bounded investigation JIMMY-SUPPORT-CARD-RETRY-20261001: trace existing server/provider idempotency and UI remount behavior for the reproduced duplicate physical/virtual issuance and freeze requests, using synthetic tests only. Determine which cases are the same logical user attempt versus a deliberately new order; preserve any legitimate multiple-card behavior. Do not invent a one-card-per-child rule. Report exact failure reproduction, existing product contract, smallest repair options and tests before source changes, especially any choice requiring a new business rule. No real cards/keys/provider calls, credentials, migration or ledger changes. NWV owns finalaudit. The post-unmount freeze announcement is an open UX decision, not automatic permission to suppress completion of an action already committed.
…d to the checkpoint Owner review 5378367970. #772 07602d4 is recorded as author-reported local evidence (18 new / 54 repeat / 87 combined synthetic browser cases, 11 mutants), with its hosted CI still running and its two reported, unfixed residuals. No one-card-per-child policy, no Register B row, no PASS. #768 promotion/merge awaits the owner's explicit approval. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KRUgA6hD6QgzmtpSP6TUmP
|
JIMMY-SUPPORT-CARD-RETRY-20261001: investigation report. No source changes. The evidence is a test-only draft, #773, on
They drive the real 1. Existing product contract (what must be preserved)
2. Exact reproductions
3. Same attempt vs deliberate new order
4. Smallest repair options (none implemented)
Freeze: no server repair recommended.
Suggested minimum: A + C. Both are local, need no business rule and no migration. Add B if R4 (a second live or shipped card after a "could not issue") must be closed; it needs Jimmy's agreement because it touches 5. Tests and evidence
Generated by Claude Code |
…l CI and the A+C execution blocker Owner review 5379042101. The Last Updated line and section heading said 10:55 UTC but included #772 (10:58), #773 (11:21) and the A+C assignment (11:23); those additions now carry their own times. Records the terminal all-four CI for #771/#772/#773 (receipt 5930953854) and Support's A+C source-edit permission blocker (#712 comment 5930951363). Ownership is not execution clearance; no workaround, no PASS, R4 unresolved. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KRUgA6hD6QgzmtpSP6TUmP
… CI wording Owner review 5379767360. #771's exact head CI36863717027 failed only E2E on the expired fixed-date fixture social-publish-consumers.spec.ts:269 (1 failed / 1,908 passed); recorded as blocked, not a full gate. Same on #774 af53da9. Fixture-only #775 046bc33 and #774 ecb626b carry the repair with CI running; #771's green E2E depends on #775. Last Updated no longer calls #772's hosted CI pending. No PASS, no fixture copy in this docs-only branch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KRUgA6hD6QgzmtpSP6TUmP
…ard harness #811 (repair A) makes MoneyCardsView read useAuthenticatedCacheScope() to key pending claims by signed-in owner. This sealed harness throws on any unmocked module, so it now mocks that import as "no settled sign-in", which keeps each mounted view's claims private: exactly the per-view behaviour these reproductions pin. Against main (where the view does not import it yet) the mock is unused. Checked: on this branch 18/18 (plus the social spec 12/12 after the main merge carrying #775's date fix); against #811's view 18/18. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DXw2nu25BjyRfA6Fg3YiMS
|
Update: #772 is now at
Still a draft with no source change. Generated by Claude Code |
…nd-pass card harness #811 now keys pending card claims by the actor and family the page was rendered for (useApp), not the client session scope. The sealed harness mocks that import as an unknown identity, which keeps each mounted view's claims private: the per-view behaviour these reproductions pin. 18/18 on main and 18/18 against #811's revised view. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DXw2nu25BjyRfA6Fg3YiMS
|
Update: #772 is now at
Generated by Claude Code |
This is task JIMMY-SUPPORT-CARDUI-20261001 (owner review 5378108048 on #712): a second-pass synthetic browser regression for the merged card lifecycle repairs #749 (reveal), #751 (pending ownership) and #753 (form ownership).
One new file:
tests/e2e/money-card-lifecycle-second-pass.spec.ts(378 lines, 18 tests), based on main01b2c380d.finalaudit.mdchange.Harness
It uses the same harness as those specs:
CardRevealModal,MoneyCardsView,Buttonandcard-controlsrun in Chromium with React 19 (tests/e2e/helpers/react-browser.ts).afterEachasserts zero requests and zero unhandled rejections;pageerrorfails the test.Two additions over the merged fixtures:
What it drives that the merged specs do not
Card reveal (#749)
prepareorkeyis pending. The new session finishes first, then the old completion lands. The old session makes no further call and no display. Only the new session's 3 displays exist, and each is destroyed once on close. The fix(wallet): dispose cancelled card reveal displays #749 spec covers this only for a different card.prepare,import,load,nonce,key. Loading ends, the error is shown, and no display is created.prepareorkeythat throws after the modal closes is swallowed: no display, no error, no fault.Freeze (#751)
{ cardId, frozen: true }) and faults nothing.Controls and physical order (#753)
Reported, not blessed
These are reproductions only. No source was edited, and I'm claiming no source ownership. Each test is labelled "today: … (reproduction)" so a change in either direction shows up.
busyRefinside the mountedMoneyCardsView(components/wallet/money-cards-view.tsx,claimPending).setCardFrozenActionwhile the first is pending, and issues a second virtual card for the same child while its firstissueCardActionis pending.issueCardActionhas no one-card-per-child guard, so the second issuance would really happen.toggleFreezehas no mounted-view guard.One note outside these tests.
CardRevealModal's effect depends onuseTranslations(), which is memoized insideLocaleProvider. Outside a provider, it returns a new function every render, which would restart the reveal session on each render. Every app route renders inside the provider, so this is not a live defect. I found it because a non-memoized mock did exactly that.Evidence (local, Node 24.21, Chromium)
--repeat-each=3runs.tsc --noEmitis clean.tests/e2epass (197 tests).@playwright/test1.61 expects a newer Chromium than this machine has, so I used a scratchpad-only config pointinglaunchOptions.executablePathat the preinstalled one. Nothing was downloaded, and the repo config is unchanged. Hosted CI's E2E job picks the spec up throughtestMatch: '**/*.spec.ts'.Limits
🤖 Generated with Claude Code
https://claude.ai/code/session_01DXw2nu25BjyRfA6Fg3YiMS
Generated by Claude Code