Money import: step-by-step guided overlay with progress and hand-holding #1120

Open
opened 2026-10-05 07:52:27 +00:00 by kayg · 11 comments
Owner

Owner request (2026-10-05)

"Importing should be way more user friendly with an overlay and going step by step, loading screens, hand-holding."

Today the Money import is a bare inline form (format select, name field, native file input with a grey "Choose File" button, Review import / Cancel) above the budget.

Wanted: a step-by-step import overlay (sheet on phone, centred overlay on desktop) in the calternal.js design system:

  1. Choose where from: large selectable cards for Actual Budget, YNAB (JSON/CSV), with a one-line description each.
  2. How to export: short illustrated instructions for the chosen app (for example, Actual: Settings → Export data → ZIP), with a link that opens the app's help in a new tab.
  3. Pick the file: drag-and-drop zone plus a styled file button (no native grey button); validate the file at once and say clearly if it is the wrong kind.
  4. Name the budget (prefilled from the export).
  5. Review: what will be imported (accounts, categories, months, transactions, date range) and anything skipped, with a clear Import button.
  6. Importing: progress screen with real stages (reading, accounts, categories, transactions, balances) and an estimate; it can be closed and continues in the background with a notification when done.
  7. Done: summary and "Open budget".
    Errors at any step say what happened and what to do; Back works on every step; keyboard and screen reader friendly; reduced motion respected. Reuse the existing server import API (preview, single-use confirmation, progress).
## Owner request (2026-10-05) "Importing should be way more user friendly with an overlay and going step by step, loading screens, hand-holding." Today the Money import is a bare inline form (format select, name field, native file input with a grey "Choose File" button, Review import / Cancel) above the budget. Wanted: a step-by-step import overlay (sheet on phone, centred overlay on desktop) in the calternal.js design system: 1. **Choose where from**: large selectable cards for Actual Budget, YNAB (JSON/CSV), with a one-line description each. 2. **How to export**: short illustrated instructions for the chosen app (for example, Actual: Settings → Export data → ZIP), with a link that opens the app's help in a new tab. 3. **Pick the file**: drag-and-drop zone plus a styled file button (no native grey button); validate the file at once and say clearly if it is the wrong kind. 4. **Name the budget** (prefilled from the export). 5. **Review**: what will be imported (accounts, categories, months, transactions, date range) and anything skipped, with a clear Import button. 6. **Importing**: progress screen with real stages (reading, accounts, categories, transactions, balances) and an estimate; it can be closed and continues in the background with a notification when done. 7. **Done**: summary and "Open budget". Errors at any step say what happened and what to do; Back works on every step; keyboard and screen reader friendly; reduced motion respected. Reuse the existing server import API (preview, single-use confirmation, progress).
Author
Owner

Owner (2026-10-05, screenshot): the current flow shows "Checking export…" and "Receiving import file" with no detail, and it hung when a production restart cut the upload. Requirements for #1120: show upload progress (percent and size), then named server stages with counts ("Reading accounts (12 of 86)", "Categories", "Transactions (8,400 of 21,000)", "Balances") and an estimate. Detect a dropped connection or server restart within a few seconds, say so, and offer Retry/Resume (the upload is resumable through the existing tus uploads). Never sit on a spinner without a reason.

Owner (2026-10-05, screenshot): the current flow shows "Checking export…" and "Receiving import file" with no detail, and it hung when a production restart cut the upload. Requirements for #1120: show upload progress (percent and size), then named server stages with counts ("Reading accounts (12 of 86)", "Categories", "Transactions (8,400 of 21,000)", "Balances") and an estimate. Detect a dropped connection or server restart within a few seconds, say so, and offer Retry/Resume (the upload is resumable through the existing tus uploads). Never sit on a spinner without a reason.
Author
Owner

Owner (2026-10-05, screenshots): (1) the import review should use the shared transparent glass card used in Settings and elsewhere, not a bespoke panel; (2) the review list overflows the card: rows render below the card's bottom edge ("reconciliation lock state", "transaction notes…") and the page overscrolls. The list must scroll inside the overlay with the actions pinned at the bottom.

Owner (2026-10-05, screenshots): (1) the import review should use the shared transparent glass card used in Settings and elsewhere, not a bespoke panel; (2) the review list overflows the card: rows render below the card's bottom edge ("reconciliation lock state", "transaction notes…") and the page overscrolls. The list must scroll inside the overlay with the actions pinned at the bottom.
Author
Owner

Starting #1120 on job/importui-1120, based on origin/dev at 559e05cb9292080684cd65a5c1adcf871c1d0647.

Finding: MoneyImport.svelte still uses the inline form plus ConfirmSheet; it polls aggregate server progress but hides poll failures, shows no upload byte percentage, and has no timeout/retry path. The review content is inside ConfirmSheet, so its scroll and pinned actions do not meet the owner’s reported overflow. I’m tracing the existing upload/progress APIs and shared OverlaySurface before changing this flow.

Starting #1120 on `job/importui-1120`, based on `origin/dev` at `559e05cb9292080684cd65a5c1adcf871c1d0647`. Finding: `MoneyImport.svelte` still uses the inline form plus `ConfirmSheet`; it polls aggregate server progress but hides poll failures, shows no upload byte percentage, and has no timeout/retry path. The review content is inside `ConfirmSheet`, so its scroll and pinned actions do not meet the owner’s reported overflow. I’m tracing the existing upload/progress APIs and shared `OverlaySurface` before changing this flow.
Author
Owner

Owner (2026-10-05): "That is not at all a user-friendly message. We need to display pretty, small glassy cards, animating subtly and drawing (like bklit metrics) with motion as the import is being read."

Reading and review steps: instead of a sentence ("This preview found 86 accounts, 255 categories, 13263 monthly assignments, and 14783 transactions across 63 months") and long lists, show a grid of small glassy metric cards (shared glass card, tokens): Accounts, Categories, Transactions, Months, Assignments, plus checks passed. Each card appears as the server reaches that stage; its number counts up smoothly; a tiny sparkline or bar (transactions per month, balance over time) draws in with the shared spring/ease, in the spirit of polished analytics metric cards. Differences that need attention get their own small card with a plain sentence and a "Details" disclosure. Reduced motion: no count-up or draw-in; values appear at once. Motion never delays content or input (CLAUDE.md Motion and loading).

Owner (2026-10-05): "That is not at all a user-friendly message. We need to display pretty, small glassy cards, animating subtly and drawing (like bklit metrics) with motion as the import is being read." Reading and review steps: instead of a sentence ("This preview found 86 accounts, 255 categories, 13263 monthly assignments, and 14783 transactions across 63 months") and long lists, show a grid of small glassy metric cards (shared glass card, tokens): Accounts, Categories, Transactions, Months, Assignments, plus checks passed. Each card appears as the server reaches that stage; its number counts up smoothly; a tiny sparkline or bar (transactions per month, balance over time) draws in with the shared spring/ease, in the spirit of polished analytics metric cards. Differences that need attention get their own small card with a plain sentence and a "Details" disclosure. Reduced motion: no count-up or draw-in; values appear at once. Motion never delays content or input (CLAUDE.md Motion and loading).
Author
Owner

Finding: the Money preview route accepts the source as one multipart request. The shared Tus queue writes completed files into Home, and the preview route cannot consume a Tus upload ID. The existing Money progress route does expose parser stages and counts, but it has no upload total, estimate, or transaction/balance time series. I will use XHR upload events for byte progress, calculate an estimate only when the observed rate supports one, and make retry keep the selected file while restarting the multipart request. I will not show invented monthly or balance data. Resuming a partially sent import and charting full time series need an additive server contract beyond this UI issue; I will record these gaps in the final report.

Finding: the Money preview route accepts the source as one multipart request. The shared Tus queue writes completed files into Home, and the preview route cannot consume a Tus upload ID. The existing Money progress route does expose parser stages and counts, but it has no upload total, estimate, or transaction/balance time series. I will use XHR upload events for byte progress, calculate an estimate only when the observed rate supports one, and make retry keep the selected file while restarting the multipart request. I will not show invented monthly or balance data. Resuming a partially sent import and charting full time series need an additive server contract beyond this UI issue; I will record these gaps in the final report.
Author
Owner

Continuing #1120 on job/importui-1120. I preserved the pending work from 559e05cb9292080684cd65a5c1adcf871c1d0647, then fetched and fast-forward merged origin/dev at 929a2627f518b5ab946da207c5fc11bbdc9040bb. I’m continuing the guided import UI against the current Money API and the owner’s metric-card, upload-progress, and overlay feedback.

Continuing #1120 on `job/importui-1120`. I preserved the pending work from `559e05cb9292080684cd65a5c1adcf871c1d0647`, then fetched and fast-forward merged `origin/dev` at `929a2627f518b5ab946da207c5fc11bbdc9040bb`. I’m continuing the guided import UI against the current Money API and the owner’s metric-card, upload-progress, and overlay feedback.
Author
Owner

Finding: the current preview exposes counts and only the first 20 rows, so those rows cannot prove the full imported date range for a large export. I’m adding an optional aggregate date range to the existing preview response, calculated from source transaction dates only (excluding inferred opening balances), then showing it in Review. This keeps the same preview and confirmation API; the response addition does not expose extra transaction rows or values.

Finding: the current preview exposes counts and only the first 20 rows, so those rows cannot prove the full imported date range for a large export. I’m adding an optional aggregate date range to the existing preview response, calculated from source transaction dates only (excluding inferred opening balances), then showing it in Review. This keeps the same preview and confirmation API; the response addition does not expose extra transaction rows or values.
Author
Owner

Finding for #1120: bun run check stops before the web checks at the merged origin/dev perf-lint ratchet. The committed files are clean, but contracts/perf/exceptions.json has 21,977 entries while contracts/perf/ratchet.json expects 21,964. Thirteen rules each differ by +1: contract.blaze, contract.blocked-network, contract.dom-bound, contract.model-bound, contract.row-identity, contract.snapshot, coverage.profile, coverage.readiness, io.unresolved-call, render.blaze-adapter, render.bound, render.model_byte_cap, and render.model_row_cap. origin/dev is at 929a2627f5. I am leaving the perf contracts unchanged and running the web typecheck and focused tests separately.

Finding for #1120: `bun run check` stops before the web checks at the merged `origin/dev` perf-lint ratchet. The committed files are clean, but `contracts/perf/exceptions.json` has 21,977 entries while `contracts/perf/ratchet.json` expects 21,964. Thirteen rules each differ by +1: `contract.blaze`, `contract.blocked-network`, `contract.dom-bound`, `contract.model-bound`, `contract.row-identity`, `contract.snapshot`, `coverage.profile`, `coverage.readiness`, `io.unresolved-call`, `render.blaze-adapter`, `render.bound`, `render.model_byte_cap`, and `render.model_row_cap`. `origin/dev` is at 929a2627f518b5ab946da207c5fc11bbdc9040bb. I am leaving the perf contracts unchanged and running the web typecheck and focused tests separately.
Author
Owner

Finding for #1120: the focused display-helper run found that budgetNameFromFile('Plan.csv') returned Plan, which would prefill a CSV export slot as the Budget name. I made export-only names fall back to Imported Budget (YNAB's flow labels the generic suggestion YNAB Budget) and added the Register.csv case. The rerun passed both focused files: 2 files, 7 tests.

Finding for #1120: the focused display-helper run found that `budgetNameFromFile('Plan.csv')` returned `Plan`, which would prefill a CSV export slot as the Budget name. I made export-only names fall back to `Imported Budget` (YNAB's flow labels the generic suggestion `YNAB Budget`) and added the `Register.csv` case. The rerun passed both focused files: 2 files, 7 tests.
Author
Owner

Finding for #1120: the shared Files upload queue already resumes Tus uploads after connection or server interruptions by checking the server offset with HEAD and continuing with PATCH. The Money preview route accepts multipart file bytes, so it cannot consume the Tus upload ID. I am bridging the existing APIs with randomly named hidden Home staging files, validating each generated basename and authenticated Home in the Money route, then moving the staged files to Trash after review or cancellation. The file upload route and its durable Tus behavior remain unchanged.

Finding for #1120: the shared Files upload queue already resumes Tus uploads after connection or server interruptions by checking the server offset with HEAD and continuing with PATCH. The Money preview route accepts multipart file bytes, so it cannot consume the Tus upload ID. I am bridging the existing APIs with randomly named hidden Home staging files, validating each generated basename and authenticated Home in the Money route, then moving the staged files to Trash after review or cancellation. The file upload route and its durable Tus behavior remain unchanged.
Author
Owner

#1120 implementation report — READY FOR MERGE: no

Built

  • A guided Money import overlay for Actual and YNAB, with real parser metric cards, aggregate source date range, named progress phases, byte progress, retry/resume through the shared Tus queue, background completion, and a Done step.
  • Random hidden Tus staging names are resolved only beneath the authenticated Home through calternal-fs; the route keeps byte-based multipart clients working.
  • The import launch query opens the overlay on /money and closing it restores the Money landing state.
  • The merge retains current origin/dev account-type review, notes, reconciliation, and per-account cleared-state behavior. Ambiguous Actual Account types ask for Cash/Card and require a verified second preview.

Files

  • UI/session/API: apps/web/src/lib/components/money/MoneyImport.svelte, MoneyImportDifferences.svelte, MoneyImportMetrics.svelte, apps/web/src/lib/files/UploadToast.svelte, uploads.svelte.ts, uploads.svelte.test.ts, apps/web/src/lib/money/api.ts, api.test.ts, import-session.svelte.ts, import-ui.ts, import-ui.test.ts, apps/web/src/routes/money/+layout.svelte, +page.svelte, and [budget]/[month]/+page.svelte.
  • Server and contract: crates/plugins/money/src/routes.rs, tests.rs, crates/calternal-money/src/import.rs, tests/import.rs, contracts/openapi.json, and packages/api-client/src/generated.ts.
  • Profile: bench/money-import-462.mjs.

Commits

  • df50e5814 Merge origin/dev and preserve resumable Money imports
  • d363a1aa9 Remove stale Money import gap copy
  • abdc16a53 Restore Money import date range response
  • 631a201f4 Enable Money in the import performance profile

Head: 631a201f44fb7d000d8587e1ac40ed00316f537c. No push, deploy, or merge was performed.

Screenshots

  • Account-type review, six Mac-emulated production screenshots at 390/820/1440 px in light/dark: download.
  • Import progress states for Actual, YNAB JSON, and YNAB CSV at all widths/themes: download.

UX gaps closed

  • The source date range is visible with the review metrics, without expanding the bounded transaction sample.
  • Upload percent/size and real parser phases stay visible while the overlay is open. Retry reuses the saved Tus offset; background work keeps its queue notification.
  • Wrong file types get immediate feedback. Closing/canceling removes the staged copy.
  • The Account-type review now uses the current parser contract and a second preview before publish.

UX gaps left

  • The server does not expose monthly transaction or balance series. I did not draw a sparkline from the bounded sample or invent chart data. The requested chart needs a separate aggregate series contract.
  • The local import profile reached its burst phase, then stopped on the existing assertion that all four concurrent previews return 200. The importer intentionally limits pending work and returned 429. I left that expectation unchanged because #1120 does not change concurrency behavior; the script writes its JSON only after every phase, so it produced no measurement file or comparable baseline.

Decisions

  • The date range includes source transaction dates only, not inferred opening-balance dates. It adds only the first and last dates to the preview.
  • Ambiguous Actual Account types use the current Cash/Card choice flow and trigger a second verified preview before import.
  • No sparkline is shown until the server exposes a real bounded series. This follows the no-fake-data rule.
  • Profile measurements were local. docs/perf/baseline.json has no Money import profile yet.

Gates

cargo fmt --check passed with no output (exit code 0).

cargo clippy -p calternal-money --all-targets -- -D warnings, cargo clippy -p calternal-plugin-money --all-targets -- -D warnings, and cargo clippy -p calternal-server --all-targets -- -D warnings passed. Final clippy output:

Finished `dev` profile [unoptimized + debuginfo] target(s) in 8.22s
Finished `dev` profile [unoptimized + debuginfo] target(s) in 40.07s

cargo test -p calternal-money passed: 16 unit, 4 account-kinds, 13 import, 12 property, 1 ready-to-assign, 4 review-984 (one ignored profile), and 2 vector tests; doc tests passed.

The first full cargo test -p calternal-plugin-money run was during conflict resolution and exposed four dropped origin/dev route behaviors. I restored that route behavior. The four affected regression tests, staged-name guard, and date-range preview test then passed individually. The full plugin suite was not repeated under the verify-once policy.

cargo test -p calternal-server ended with:

HTTP startup waited for an upgrade backfill: Elapsed(())
test result: FAILED. 255 passed; 1 failed; 10 ignored; 0 measured; 0 filtered out; finished in 164.74s
error: test failed, to rerun pass `-p calternal-server --bin calternal-server`

This was the live-startup check while the shared host was under concurrent compile load. It needs confirmation in the merge round.

bun run check stopped at the same origin/dev perf-lint ledger/ratchet mismatch already recorded in this issue. Exact output:

perf-lint: INVALID: exception ratchet: contract.blaze: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.blocked-network: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; contract.dom-bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.model-bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.row-identity: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.snapshot: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; coverage.profile: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; coverage.readiness: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; io.unresolved-call: 16191 exceptions exceed the ratchet ceiling 16190; fix the new violation instead; render.blaze-adapter: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.model_byte_cap: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.model_row_cap: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; total: ledger has 21977 exceptions; ratchet total is 21964

Direct svelte-check passed: svelte-check found 0 errors and 4 warnings in 3 files. The four warnings are existing CSS warnings outside this change.

Focused Vitest passed:

 Test Files  4 passed (4)
      Tests  19 passed (19)
   Duration  6.64s

bun run build passed and ended with:

Compressed 891 static variants; saved 20988875 bytes.

The local performance profile’s final attempt ended with:

AssertionError [ERR_ASSERTION]: burst preview returned 429
429 !== 200

Full bun run test, full Money E2E, adversarial matrices, and the full merge-round suites remain for the merge round per policy. cargo clean removed 19,190 files (16.6 GiB), and the web build output was deleted.

#1120 implementation report — READY FOR MERGE: no ## Built - A guided Money import overlay for Actual and YNAB, with real parser metric cards, aggregate source date range, named progress phases, byte progress, retry/resume through the shared Tus queue, background completion, and a Done step. - Random hidden Tus staging names are resolved only beneath the authenticated Home through `calternal-fs`; the route keeps byte-based multipart clients working. - The import launch query opens the overlay on `/money` and closing it restores the Money landing state. - The merge retains current `origin/dev` account-type review, notes, reconciliation, and per-account cleared-state behavior. Ambiguous Actual Account types ask for Cash/Card and require a verified second preview. ## Files - UI/session/API: `apps/web/src/lib/components/money/MoneyImport.svelte`, `MoneyImportDifferences.svelte`, `MoneyImportMetrics.svelte`, `apps/web/src/lib/files/UploadToast.svelte`, `uploads.svelte.ts`, `uploads.svelte.test.ts`, `apps/web/src/lib/money/api.ts`, `api.test.ts`, `import-session.svelte.ts`, `import-ui.ts`, `import-ui.test.ts`, `apps/web/src/routes/money/+layout.svelte`, `+page.svelte`, and `[budget]/[month]/+page.svelte`. - Server and contract: `crates/plugins/money/src/routes.rs`, `tests.rs`, `crates/calternal-money/src/import.rs`, `tests/import.rs`, `contracts/openapi.json`, and `packages/api-client/src/generated.ts`. - Profile: `bench/money-import-462.mjs`. ## Commits - `df50e5814` Merge origin/dev and preserve resumable Money imports - `d363a1aa9` Remove stale Money import gap copy - `abdc16a53` Restore Money import date range response - `631a201f4` Enable Money in the import performance profile Head: `631a201f44fb7d000d8587e1ac40ed00316f537c`. No push, deploy, or merge was performed. ## Screenshots - Account-type review, six Mac-emulated production screenshots at 390/820/1440 px in light/dark: [download](https://git.kayg.org/attachments/16e6ca31-c4f8-47d0-8ba9-3194351f4cc0). - Import progress states for Actual, YNAB JSON, and YNAB CSV at all widths/themes: [download](https://git.kayg.org/attachments/1be8c616-3493-4255-b021-c21ed411df1c). ## UX gaps closed - The source date range is visible with the review metrics, without expanding the bounded transaction sample. - Upload percent/size and real parser phases stay visible while the overlay is open. Retry reuses the saved Tus offset; background work keeps its queue notification. - Wrong file types get immediate feedback. Closing/canceling removes the staged copy. - The Account-type review now uses the current parser contract and a second preview before publish. ## UX gaps left - The server does not expose monthly transaction or balance series. I did not draw a sparkline from the bounded sample or invent chart data. The requested chart needs a separate aggregate series contract. - The local import profile reached its burst phase, then stopped on the existing assertion that all four concurrent previews return 200. The importer intentionally limits pending work and returned 429. I left that expectation unchanged because #1120 does not change concurrency behavior; the script writes its JSON only after every phase, so it produced no measurement file or comparable baseline. ## Decisions - The date range includes source transaction dates only, not inferred opening-balance dates. It adds only the first and last dates to the preview. - Ambiguous Actual Account types use the current Cash/Card choice flow and trigger a second verified preview before import. - No sparkline is shown until the server exposes a real bounded series. This follows the no-fake-data rule. - Profile measurements were local. `docs/perf/baseline.json` has no Money import profile yet. ## Gates `cargo fmt --check` passed with no output (exit code 0). `cargo clippy -p calternal-money --all-targets -- -D warnings`, `cargo clippy -p calternal-plugin-money --all-targets -- -D warnings`, and `cargo clippy -p calternal-server --all-targets -- -D warnings` passed. Final clippy output: ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 8.22s Finished `dev` profile [unoptimized + debuginfo] target(s) in 40.07s ``` `cargo test -p calternal-money` passed: 16 unit, 4 account-kinds, 13 import, 12 property, 1 ready-to-assign, 4 review-984 (one ignored profile), and 2 vector tests; doc tests passed. The first full `cargo test -p calternal-plugin-money` run was during conflict resolution and exposed four dropped `origin/dev` route behaviors. I restored that route behavior. The four affected regression tests, staged-name guard, and date-range preview test then passed individually. The full plugin suite was not repeated under the verify-once policy. `cargo test -p calternal-server` ended with: ```text HTTP startup waited for an upgrade backfill: Elapsed(()) test result: FAILED. 255 passed; 1 failed; 10 ignored; 0 measured; 0 filtered out; finished in 164.74s error: test failed, to rerun pass `-p calternal-server --bin calternal-server` ``` This was the live-startup check while the shared host was under concurrent compile load. It needs confirmation in the merge round. `bun run check` stopped at the same `origin/dev` perf-lint ledger/ratchet mismatch already recorded in this issue. Exact output: ```text perf-lint: INVALID: exception ratchet: contract.blaze: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.blocked-network: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; contract.dom-bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.model-bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.row-identity: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; contract.snapshot: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; coverage.profile: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; coverage.readiness: 356 exceptions exceed the ratchet ceiling 355; fix the new violation instead; io.unresolved-call: 16191 exceptions exceed the ratchet ceiling 16190; fix the new violation instead; render.blaze-adapter: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.bound: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.model_byte_cap: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; render.model_row_cap: 290 exceptions exceed the ratchet ceiling 289; fix the new violation instead; total: ledger has 21977 exceptions; ratchet total is 21964 ``` Direct `svelte-check` passed: `svelte-check found 0 errors and 4 warnings in 3 files`. The four warnings are existing CSS warnings outside this change. Focused Vitest passed: ```text Test Files 4 passed (4) Tests 19 passed (19) Duration 6.64s ``` `bun run build` passed and ended with: ```text Compressed 891 static variants; saved 20988875 bytes. ``` The local performance profile’s final attempt ended with: ```text AssertionError [ERR_ASSERTION]: burst preview returned 429 429 !== 200 ``` Full `bun run test`, full Money E2E, adversarial matrices, and the full merge-round suites remain for the merge round per policy. `cargo clean` removed 19,190 files (16.6 GiB), and the web build output was deleted.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
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#1120
No description provided.