Bug bash: money #1219

Open
opened 2026-10-06 19:01:40 +00:00 by kayg · 16 comments
Owner

AREA: Money Tab. Budgets, accounts, transaction entry/edit/split/transfer, categories and assigning money, month rollover, imports (YNAB/Actual/CSV) including the import wizard review step, reconciliation, per-currency formatting, big budgets (50k transactions). Number correctness is a hard rule: every balance shown must equal a recomputation from raw transactions; add property tests for any numeric bug. Rounding, negative zero, very large and very small amounts, decimal separators per currency. Do not redesign the wizard (owner grill pending); fix bugs only.

Tracking issue for the 2026-10-07 bug bash. Every bug found gets its own issue, linked here.

AREA: Money Tab. Budgets, accounts, transaction entry/edit/split/transfer, categories and assigning money, month rollover, imports (YNAB/Actual/CSV) including the import wizard review step, reconciliation, per-currency formatting, big budgets (50k transactions). Number correctness is a hard rule: every balance shown must equal a recomputation from raw transactions; add property tests for any numeric bug. Rounding, negative zero, very large and very small amounts, decimal separators per currency. Do not redesign the wizard (owner grill pending); fix bugs only. Tracking issue for the 2026-10-07 bug bash. Every bug found gets its own issue, linked here.
Author
Owner

Starting the Money Tab bug bash on job/bash-money, based on ff53d7b8b4da5a21f862d57dcc3496f8c019f647 (origin/dev). I have read CLAUDE.md, CONTEXT.md, and DESIGN §48 and §59. I am now tracing Money's number derivation and high-risk transaction/import paths, then I will reproduce user-visible bugs with the app and file each finding separately.

Starting the Money Tab bug bash on `job/bash-money`, based on `ff53d7b8b4da5a21f862d57dcc3496f8c019f647` (`origin/dev`). I have read `CLAUDE.md`, `CONTEXT.md`, and DESIGN §48 and §59. I am now tracing Money's number derivation and high-risk transaction/import paths, then I will reproduce user-visible bugs with the app and file each finding separately.
Author
Owner

Finding: the Money register returns every matching transaction from GET /api/v1/money/budgets/{id}/transactions, then renders every returned row. The request has no row or byte cap, so the 50k Budget path can send and mount all rows at once. This matches the existing open #688 acceptance gap (DESIGN §59); #688 says #641 owns active account traversal. I am treating it as a reproduced-in-source, already-tracked finding and will not duplicate #688 or change that traversal here. Severity: major for large Budgets; still measuring the real-server impact in this bash.

Finding: the Money register returns every matching transaction from `GET /api/v1/money/budgets/{id}/transactions`, then renders every returned row. The request has no row or byte cap, so the 50k Budget path can send and mount all rows at once. This matches the existing open #688 acceptance gap (DESIGN §59); #688 says #641 owns active account traversal. I am treating it as a reproduced-in-source, already-tracked finding and will not duplicate #688 or change that traversal here. Severity: major for large Budgets; still measuring the real-server impact in this bash.
Author
Owner

Correction to my last update: the BudgetGuide.svelte implementation cited by #1211 is only in the unmerged job/onboard-1141 branch (11b22cfd7 feat(money): guide real budget actions with resume and explicit replay), not this origin/dev base. The guide does not exist in this worktree. I will not add that feature during this bug-only round; #1211 remains the tracking issue for that branch's presentation fix.

Correction to my last update: the `BudgetGuide.svelte` implementation cited by #1211 is only in the unmerged `job/onboard-1141` branch (`11b22cfd7 feat(money): guide real budget actions with resume and explicit replay`), not this `origin/dev` base. The guide does not exist in this worktree. I will not add that feature during this bug-only round; #1211 remains the tracking issue for that branch's presentation fix.
Author
Owner

Found an existing in-scope bug at the import wizard source step: #1206 reports that keyboard selection can leave a tablet re-import on Source, so the file picker never appears. The report gives a production-build reproduction at apps/web/e2e/money-wizard-1140.mjs --inverse-only and records that the issue occurred at this branch's base (ff53d7b8b). I am reproducing it locally before changing code; the account traversal issue #688 remains owned by #641.

Found an existing in-scope bug at the import wizard source step: #1206 reports that keyboard selection can leave a tablet re-import on Source, so the file picker never appears. The report gives a production-build reproduction at `apps/web/e2e/money-wizard-1140.mjs --inverse-only` and records that the issue occurred at this branch's base (`ff53d7b8b`). I am reproducing it locally before changing code; the account traversal issue #688 remains owned by #641.
Author
Owner

Confirmed #1206 in the real production app. bun e2e/money-wizard-1140.mjs --inverse-only failed after the successful Undo, Budget reopen and second import entry: pressing Enter on the YNAB source left the route on data-import-step=source, and the file input was absent until its 90 s timeout. This run failed on dark 390 px at line 477; the retained screenshot is artifacts/wizard-1140/failed-review.png. Light 390 and 820 passed in the same matrix, so the failure is intermittent.

The test was checking rendered Source markup before it checked the root layout's keyboard hydration signal. The existing mobile-focus flow waits for [data-keyboard-proxy] before sending its trusted input. I will add that readiness wait before the existing Enter interaction and keep the current assertion and app behavior.

Confirmed #1206 in the real production app. `bun e2e/money-wizard-1140.mjs --inverse-only` failed after the successful Undo, Budget reopen and second import entry: pressing Enter on the YNAB source left the route on `data-import-step=source`, and the file input was absent until its 90 s timeout. This run failed on dark 390 px at line 477; the retained screenshot is `artifacts/wizard-1140/failed-review.png`. Light 390 and 820 passed in the same matrix, so the failure is intermittent. The test was checking rendered Source markup before it checked the root layout's keyboard hydration signal. The existing mobile-focus flow waits for `[data-keyboard-proxy]` before sending its trusted input. I will add that readiness wait before the existing Enter interaction and keep the current assertion and app behavior.
Author
Owner

The standard Money production E2E stopped at its first enabled empty-state screenshot. It saw SSR text No budget yet at /money and asserted /money/import before the client route effect ran; the actual path was still /money. This is the same browser-hydration readiness class as #1206, not a changed app assertion. I added a wait for the existing [data-keyboard-proxy] mount signal and then for the import URL. I am rerunning the complete flow before committing this separate test correction.

The standard Money production E2E stopped at its first enabled empty-state screenshot. It saw SSR text `No budget yet` at `/money` and asserted `/money/import` before the client route effect ran; the actual path was still `/money`. This is the same browser-hydration readiness class as #1206, not a changed app assertion. I added a wait for the existing `[data-keyboard-proxy]` mount signal and then for the import URL. I am rerunning the complete flow before committing this separate test correction.
Author
Owner

After the first route-readiness correction, money.mjs reached the real CSV review and found another stale test assertion: it expected four aria-label="Totals checked" list items, which do not exist in the current wizard. DESIGN implementation issue #1140 explicitly replaced the inline import form with the review-card wizard and an accessible check summary plus expandable check details. I updated this assertion to verify the current role="status" summary and details disclosure while preserving the sample-row and mismatch assertions. This is a test alignment with #1140, not a wizard redesign.

After the first route-readiness correction, `money.mjs` reached the real CSV review and found another stale test assertion: it expected four `aria-label="Totals checked"` list items, which do not exist in the current wizard. DESIGN implementation issue #1140 explicitly replaced the inline import form with the review-card wizard and an accessible check summary plus expandable check details. I updated this assertion to verify the current `role="status"` summary and details disclosure while preserving the sample-row and mismatch assertions. This is a test alignment with #1140, not a wizard redesign.
Author
Owner

The real money.mjs production flow reached the CSV review at 390 px, then a second CSV preview at 820 px did not reach Review within 30 seconds after Continue. The run stopped in previewCsvImport() before any budget was published. I am capturing its import step and API status next; this is not yet classified as a Money defect or a slow-only result.

The real `money.mjs` production flow reached the CSV review at 390 px, then a second CSV preview at 820 px did not reach Review within 30 seconds after Continue. The run stopped in `previewCsvImport()` before any budget was published. I am capturing its import step and API status next; this is not yet classified as a Money defect or a slow-only result.
Author
Owner

The 820 px timeout was a 429 from POST /api/v1/money/imports/preview. The prior test context clicked Cancel and closed immediately, without awaiting the server's preview deletion; the following test case started while that owner still had an import slot reserved. The route intentionally rejects overlapping imports with 429. I will keep that behavior and make the E2E wait for the preview DELETE acknowledgement and return to /money before closing the context.

The 820 px timeout was a 429 from `POST /api/v1/money/imports/preview`. The prior test context clicked Cancel and closed immediately, without awaiting the server's preview deletion; the following test case started while that owner still had an import slot reserved. The route intentionally rejects overlapping imports with 429. I will keep that behavior and make the E2E wait for the preview DELETE acknowledgement and return to `/money` before closing the context.
Author
Owner

Correction after checking the route sequence: the UI cancel sends DELETE /imports/jobs/{id} first, which stops the worker and releases the ready preview. It then sends DELETE /imports/{id} to handle a publish/cancel race; that second call returns the documented 404 when the job deletion already consumed the preview. The test now waits for both responses (204 then 404) and for navigation before closing the browser context. The first comment described the second DELETE as the release signal; the job DELETE is the operation that releases admission.

Correction after checking the route sequence: the UI cancel sends DELETE `/imports/jobs/{id}` first, which stops the worker and releases the ready preview. It then sends DELETE `/imports/{id}` to handle a publish/cancel race; that second call returns the documented 404 when the job deletion already consumed the preview. The test now waits for both responses (204 then 404) and for navigation before closing the browser context. The first comment described the second DELETE as the release signal; the job DELETE is the operation that releases admission.
Author
Owner

Filed Money issue #1288 for paired CSV import losing the first file when two selections overlap. I reproduced it on the real local production server at 390 px with a delayed header read: the wizard kept Register.csv, asked for Plan.csv again, and left Continue disabled. Evidence: artifacts/money/money-csv-pair-race-light-390.png. The fix is in the MoneyImport file-selection path and its e2e regression check.

Filed Money issue #1288 for paired CSV import losing the first file when two selections overlap. I reproduced it on the real local production server at 390 px with a delayed header read: the wizard kept Register.csv, asked for Plan.csv again, and left Continue disabled. Evidence: `artifacts/money/money-csv-pair-race-light-390.png`. The fix is in the MoneyImport file-selection path and its e2e regression check.
Author
Owner

Fixed Money issue #1288 in commit e62004c5e: queued paired-file header checks preserve both Plan and Register when selections overlap. The production-server e2e reproduced the bug before the fix with a delayed header read and reached the review step after the fix. The broader bun e2e/money.mjs run then stopped at its unchanged exact Markdown-row assertion because the stored transaction includes an empty notes:: "" property. I preserved that expectation per the owner rule; I will report it as an unresolved test/format mismatch.

Fixed Money issue #1288 in commit e62004c5e: queued paired-file header checks preserve both Plan and Register when selections overlap. The production-server e2e reproduced the bug before the fix with a delayed header read and reached the review step after the fix. The broader `bun e2e/money.mjs` run then stopped at its unchanged exact Markdown-row assertion because the stored transaction includes an empty `notes:: ""` property. I preserved that expectation per the owner rule; I will report it as an unresolved test/format mismatch.
Author
Owner

50k worst-case Money probe reproduced #688 on the real local production server: import completed in 86.4 s; the register API returned all 50,000 raw rows in 13.0 s and exact BigInt recomputation passed for working/cleared/uncleared balances; opening the Account page then failed to show its Transactions table within 240 s after its API request returned in 21.6 s. I added these local-only measurements to #688 for its #641 owner. The screenshot and heap sample were not reached because the table did not render.

50k worst-case Money probe reproduced #688 on the real local production server: import completed in 86.4 s; the register API returned all 50,000 raw rows in 13.0 s and exact BigInt recomputation passed for working/cleared/uncleared balances; opening the Account page then failed to show its Transactions table within 240 s after its API request returned in 21.6 s. I added these local-only measurements to #688 for its #641 owner. The screenshot and heap sample were not reached because the table did not render.
Author
Owner

Found a Money import cancellation defect in the real production-browser run and filed it as #1301. With a 502 KB export on throttled online networking, the job-cancel endpoint returned 204 but the import sheet stayed on “Uploading” for 30 seconds. Evidence: artifacts/money/money-import-cancel-state-light-390.png. I am tracing the Money-owned cleanup path before fixing it.

Found a Money import cancellation defect in the real production-browser run and filed it as #1301. With a 502 KB export on throttled online networking, the job-cancel endpoint returned 204 but the import sheet stayed on “Uploading” for 30 seconds. Evidence: `artifacts/money/money-import-cancel-state-light-390.png`. I am tracing the Money-owned cleanup path before fixing it.
Author
Owner

Updated findings from the production E2E round:

  • #1301 (major) Cancel import left the progress sheet open after the server returned 204. Fixed on branch in e8e616072; cancellation now waits for the server operation, then closes promptly while reset cleans staged Files in the background. The focused import-session suite passes.
  • #1307 (minor) New transaction with blank Notes wrote notes:: "". Fixed on branch in 7eaa55bfe; create omits an empty note while edit can still clear one. Component tests pass, and the unchanged real-server Markdown assertion now passes.
  • #1310 (minor, test-only) money.mjs waits for Create Budget, but the accessible button name is Create budget. I left this existing expectation unchanged per the job rule. The real-server E2E passed its Budget, import cancellation, transaction and exact Markdown checks before hitting this locator.

The import cancellation screenshot matrix passed at 390 / 820 / 1440 px in light and dark mode. Existing #688 remains: 50k imported transactions have exact BigInt-recomputed balances, but the account Transactions table did not render within 240 seconds; this is outside Money Tab ownership and is tracked there.

Updated findings from the production E2E round: - #1301 (major) Cancel import left the progress sheet open after the server returned 204. Fixed on branch in `e8e616072`; cancellation now waits for the server operation, then closes promptly while reset cleans staged Files in the background. The focused import-session suite passes. - #1307 (minor) New transaction with blank Notes wrote `notes:: ""`. Fixed on branch in `7eaa55bfe`; create omits an empty note while edit can still clear one. Component tests pass, and the unchanged real-server Markdown assertion now passes. - #1310 (minor, test-only) `money.mjs` waits for `Create Budget`, but the accessible button name is `Create budget`. I left this existing expectation unchanged per the job rule. The real-server E2E passed its Budget, import cancellation, transaction and exact Markdown checks before hitting this locator. The import cancellation screenshot matrix passed at 390 / 820 / 1440 px in light and dark mode. Existing #688 remains: 50k imported transactions have exact BigInt-recomputed balances, but the account Transactions table did not render within 240 seconds; this is outside Money Tab ownership and is tracked there.
Author
Owner

Finished — Money Tab bug bash

Branch: job/bash-money
Base: origin/dev merged in 59fad57a8
Head: cc161522ac29b8a7add9fc833c5dfa6840ed5960

Findings

Issue Symptom Severity Result
#1288 Fast paired CSV selections could discard the first file while its header check was pending. Major Fixed in e62004c5e; queued header checks preserve Plan/Register order.
#1206 A production E2E could send Enter before the wizard's keyboard handlers hydrated after route navigation. Minor Fixed in 4ce3bdcee; the test waits for the root keyboard mount signal and still uses trusted keyboard input.
#1301 Import cancellation got HTTP 204, but the progress sheet stayed open while staged-file cleanup waited. Major Fixed in e8e616072; close after the server acknowledgement and let reset clean staged files in the background.
#1307 Creating a transaction with blank Notes persisted notes:: "". Minor Fixed in 7eaa55bfe; create omits blank Notes while edit still sends an empty value to clear an existing note.
#1310 Money E2E waits for accessible name Create Budget; the current control is Create budget. Minor Filed only; existing test expectation was preserved.
#688 With 50,000 transactions, the account's Transactions table did not render within 240 seconds. Major Existing issue, evidence added for its #641 owner; outside this job's UI ownership.

A duplicate tracker issue #1289 was opened for the same paired-CSV race. #1288 is the canonical fix. Neither issue was closed.

Performance

Local production-server probe with a 50,000-transaction Actual export: import completed in 86.4 s; the register API returned 50,000 raw rows in 13.0 s. BigInt recomputation from those raw rows exactly matched working, cleared and uncleared balances. The Account route's API request took 21.6 s, then its Transactions table remained absent for 240 s. This is recorded on #688. This was a local measurement, not a perf-VM run.

UX gaps closed

  • Paired CSV selection remains usable when the first 4 KiB header read overlaps the second file selection.
  • Cancel returns to Money after server cancellation, even if staged-file cleanup is slow.
  • Blank new transaction notes do not create an empty Markdown property; editing can still clear a note.
  • Captured production cancellation/progress states at 390, 820 and 1440 px, in light and dark themes with macOS platform emulation.

UX gaps left

  • #1310's stale case-sensitive E2E locator still stops the final Money E2E after the Budget, cancellation, transaction and exact Markdown assertions pass.
  • #688's 50k transaction-table render stall remains with its existing owner.
  • Screenshots are in ignored artifacts/money/ and were not attached: fj issue comment has no attachment command, and the local attachment attempt found no usable API token. No credential was displayed.

Decisions not stated in DESIGN

  • Serialize paired-file header detection in change-event order so both selected files are retained.
  • Treat the server cancellation acknowledgement as the close boundary; staged-file cleanup continues through the existing reset path.
  • Omit an empty Notes property only on create. On edit, retain notes: "" so an existing note can be cleared.

Files

  • apps/web/src/lib/components/money/MoneyImport.svelte, apps/web/src/lib/money/import-session.svelte.ts, and import-session tests: paired CSV ordering and cancellation behavior.
  • apps/web/src/lib/components/money/TransactionForm.svelte and TransactionForm.svelte.test.ts: create/edit Notes semantics.
  • apps/web/e2e/money.mjs and money-wizard-1140.mjs: real-app regression coverage, hydration readiness, cancellation states and screenshot matrix.
  • contracts/perf/adoption-1058.json and contracts/perf/exceptions.json: refreshed exact source pins; scripts/perf-lint --check reports no violations and no ratchet change.

Gates and verification

cd apps/web && bun run check — exit 0. Final diagnostic output:

Glass alpha, blur and backdrop-filter roles use packages/ui/src/tokens.css.
Text sizes and UI shape values use shared role tokens.
Keyboard focus rings use the shared focus tokens.
UI transitions and animation options use shared motion tokens or documented exceptions.
Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/bash-money/apps/web
Getting Svelte diagnostics...

/home/kayg/Developer/calternal-wt/bash-money/apps/web/../../packages/ui/src/components/calendar/AttachmentDeck.svelte:1055:3
Warn: Do not use empty rulesets (css)
  }
  .attachment-row:focus {

====================================
svelte-check found 0 errors and 1 warning in 1 file

scripts/perf-lint --check:

perf-lint: PASS; 0 violations; 22548 scoped exceptions

Focused tests passed: import-session.svelte.test.ts (36 tests); TransactionForm.svelte.test.ts (2 tests). bun run build passed and compressed 917 static variants. cargo build -p calternal-server passed; no Rust source changed, so Rust clippy/test gates were not run. cargo clean completed with Removed 8660 files, 7.9GiB total and web build output was deleted.

The full web test suite passed earlier after the origin/dev merge, before the final TransactionForm change. Its recorded summary was:

Test Files  287 passed (287)
     Tests  2035 passed (2035)
  Start at  03:34:11
 Duration  629.63s (transform 29%, import 25%, environment 24%, tests 16%, setup 5%)

The final bun e2e/money.mjs run passed the Budget, import cancellation, transaction and exact Markdown checks, and captured the six viewport/theme cancellation cases. It then exited 1 at the existing #1310 locator (Create Budget vs Create budget). The recorded 50k probe and other bug-bash E2E work used the real local production app. Full bun run test was not repeated after the final small change under the merge-round verification policy.

For the merge round

  • cd apps/web && bun run test — prove the complete web suite passes with the final branch.
  • cd apps/web && bun run test:e2e:money — prove the full real-server Money flow after the #1310 locator issue is resolved; retain the width/theme screenshot matrix.
  • cd apps/web && bun run test:e2e — run the merge-round shell E2E suite.
## Finished — Money Tab bug bash Branch: `job/bash-money` Base: `origin/dev` merged in `59fad57a8` Head: `cc161522ac29b8a7add9fc833c5dfa6840ed5960` ### Findings | Issue | Symptom | Severity | Result | |---|---|---:|---| | #1288 | Fast paired CSV selections could discard the first file while its header check was pending. | Major | Fixed in `e62004c5e`; queued header checks preserve Plan/Register order. | | #1206 | A production E2E could send Enter before the wizard's keyboard handlers hydrated after route navigation. | Minor | Fixed in `4ce3bdcee`; the test waits for the root keyboard mount signal and still uses trusted keyboard input. | | #1301 | Import cancellation got HTTP 204, but the progress sheet stayed open while staged-file cleanup waited. | Major | Fixed in `e8e616072`; close after the server acknowledgement and let reset clean staged files in the background. | | #1307 | Creating a transaction with blank Notes persisted `notes:: ""`. | Minor | Fixed in `7eaa55bfe`; create omits blank Notes while edit still sends an empty value to clear an existing note. | | #1310 | Money E2E waits for accessible name `Create Budget`; the current control is `Create budget`. | Minor | Filed only; existing test expectation was preserved. | | #688 | With 50,000 transactions, the account's Transactions table did not render within 240 seconds. | Major | Existing issue, evidence added for its #641 owner; outside this job's UI ownership. | A duplicate tracker issue #1289 was opened for the same paired-CSV race. #1288 is the canonical fix. Neither issue was closed. ### Performance Local production-server probe with a 50,000-transaction Actual export: import completed in 86.4 s; the register API returned 50,000 raw rows in 13.0 s. BigInt recomputation from those raw rows exactly matched working, cleared and uncleared balances. The Account route's API request took 21.6 s, then its Transactions table remained absent for 240 s. This is recorded on #688. This was a local measurement, not a perf-VM run. ### UX gaps closed - Paired CSV selection remains usable when the first 4 KiB header read overlaps the second file selection. - Cancel returns to Money after server cancellation, even if staged-file cleanup is slow. - Blank new transaction notes do not create an empty Markdown property; editing can still clear a note. - Captured production cancellation/progress states at 390, 820 and 1440 px, in light and dark themes with macOS platform emulation. ### UX gaps left - #1310's stale case-sensitive E2E locator still stops the final Money E2E after the Budget, cancellation, transaction and exact Markdown assertions pass. - #688's 50k transaction-table render stall remains with its existing owner. - Screenshots are in ignored `artifacts/money/` and were not attached: `fj issue comment` has no attachment command, and the local attachment attempt found no usable API token. No credential was displayed. ### Decisions not stated in DESIGN - Serialize paired-file header detection in change-event order so both selected files are retained. - Treat the server cancellation acknowledgement as the close boundary; staged-file cleanup continues through the existing reset path. - Omit an empty Notes property only on create. On edit, retain `notes: ""` so an existing note can be cleared. ### Files - `apps/web/src/lib/components/money/MoneyImport.svelte`, `apps/web/src/lib/money/import-session.svelte.ts`, and import-session tests: paired CSV ordering and cancellation behavior. - `apps/web/src/lib/components/money/TransactionForm.svelte` and `TransactionForm.svelte.test.ts`: create/edit Notes semantics. - `apps/web/e2e/money.mjs` and `money-wizard-1140.mjs`: real-app regression coverage, hydration readiness, cancellation states and screenshot matrix. - `contracts/perf/adoption-1058.json` and `contracts/perf/exceptions.json`: refreshed exact source pins; `scripts/perf-lint --check` reports no violations and no ratchet change. ### Gates and verification `cd apps/web && bun run check` — exit 0. Final diagnostic output: ```text Glass alpha, blur and backdrop-filter roles use packages/ui/src/tokens.css. Text sizes and UI shape values use shared role tokens. Keyboard focus rings use the shared focus tokens. UI transitions and animation options use shared motion tokens or documented exceptions. Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/bash-money/apps/web Getting Svelte diagnostics... /home/kayg/Developer/calternal-wt/bash-money/apps/web/../../packages/ui/src/components/calendar/AttachmentDeck.svelte:1055:3 Warn: Do not use empty rulesets (css) } .attachment-row:focus { ==================================== svelte-check found 0 errors and 1 warning in 1 file ``` `scripts/perf-lint --check`: ```text perf-lint: PASS; 0 violations; 22548 scoped exceptions ``` Focused tests passed: `import-session.svelte.test.ts` (36 tests); `TransactionForm.svelte.test.ts` (2 tests). `bun run build` passed and compressed 917 static variants. `cargo build -p calternal-server` passed; no Rust source changed, so Rust clippy/test gates were not run. `cargo clean` completed with `Removed 8660 files, 7.9GiB total` and web build output was deleted. The full web test suite passed earlier after the origin/dev merge, before the final TransactionForm change. Its recorded summary was: ```text Test Files 287 passed (287) Tests 2035 passed (2035) Start at 03:34:11 Duration 629.63s (transform 29%, import 25%, environment 24%, tests 16%, setup 5%) ``` The final `bun e2e/money.mjs` run passed the Budget, import cancellation, transaction and exact Markdown checks, and captured the six viewport/theme cancellation cases. It then exited 1 at the existing #1310 locator (`Create Budget` vs `Create budget`). The recorded 50k probe and other bug-bash E2E work used the real local production app. Full `bun run test` was not repeated after the final small change under the merge-round verification policy. ### For the merge round - `cd apps/web && bun run test` — prove the complete web suite passes with the final branch. - `cd apps/web && bun run test:e2e:money` — prove the full real-server Money flow after the #1310 locator issue is resolved; retain the width/theme screenshot matrix. - `cd apps/web && bun run test:e2e` — run the merge-round shell E2E suite.
Commenting is not possible because the repository is archived.
No labels
No milestone
No project
No assignees
1 participant
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal-v0#1219
No description provided.