Bulk writes are slow: 5,000 Files and 2,000 Money transactions do not settle in 180 s #1393

Closed
opened 2026-10-07 18:18:35 +00:00 by kayg · 58 comments
Owner

Finding (interaction audit #1369)

On a fresh Instance, the audit fixture could not create 5,000 Files or 2,000 Money transactions within 180 s (bounded concurrency 8, through the public API): Files did not settle (0 indexed), Money did not settle (0 counted). 1,000 Tasks took 73 s and 1,000 Notes 55 s; 500 Photos 121 s. The numbers came from the perf VM. Full audit: https://git.kayg.org/kayg/calternal/src/branch/job/instaudit-1369/docs/perf/2026-10-07-1369-interaction-audit.md

This is a User-visible throughput problem (imports, bulk upload, a client syncing a folder), not only a test problem.

Required

Measure write throughput per item type through the real API on the perf VM: Files upload (small files), Money transaction create, Task create, Note create, Photo upload, at concurrency 1 and 8. Profile the slowest (per-request fsync, index transaction per item, projection rebuild, lock contention) and fix the top cause for Files and Money. Target: 5,000 small files and 2,000 transactions settle (visible in the UI and Search) in under 60 s on the perf VM, without weakening durability (DESIGN §2 data safety). Report before/after tables.

## Finding (interaction audit #1369) On a fresh Instance, the audit fixture could not create 5,000 Files or 2,000 Money transactions within 180 s (bounded concurrency 8, through the public API): Files did not settle (0 indexed), Money did not settle (0 counted). 1,000 Tasks took 73 s and 1,000 Notes 55 s; 500 Photos 121 s. The numbers came from the perf VM. Full audit: https://git.kayg.org/kayg/calternal/src/branch/job/instaudit-1369/docs/perf/2026-10-07-1369-interaction-audit.md This is a User-visible throughput problem (imports, bulk upload, a client syncing a folder), not only a test problem. ## Required Measure write throughput per item type through the real API on the perf VM: Files upload (small files), Money transaction create, Task create, Note create, Photo upload, at concurrency 1 and 8. Profile the slowest (per-request fsync, index transaction per item, projection rebuild, lock contention) and fix the top cause for Files and Money. Target: 5,000 small files and 2,000 transactions settle (visible in the UI and Search) in under 60 s on the perf VM, without weakening durability (DESIGN §2 data safety). Report before/after tables.
Author
Owner

Started #1393 on job/bulkwrite-1393, base/head 0419170fe456b58614befcb12d9c9d255118f1c0. Read CLAUDE.md, CONTEXT.md, DESIGN §§2, 48, 59 and audit #1369. Will measure real API writes at concurrency 1 and 8, preserve file sync and authority durability, and check Money balance equivalence. No push or deployment.

Started #1393 on `job/bulkwrite-1393`, base/head `0419170fe456b58614befcb12d9c9d255118f1c0`. Read CLAUDE.md, CONTEXT.md, DESIGN §§2, 48, 59 and audit #1369. Will measure real API writes at concurrency 1 and 8, preserve file sync and authority durability, and check Money balance equivalence. No push or deployment.
Author
Owner

Static write-path finding (#1393): files::index::record_impl called refresh_sidecar_pairs after each item. That reads every sibling and begins a writer transaction even when no pair changes. The new path checks four candidate names with the path primary key, plus prior identity links with the Sidecar parent index; full reconciliation is retained. A regression also covers a Sidecar uploaded before its parent and ambiguous parent stems.

Money create_transaction projected the proposed Budget and then reloaded/projected it for the reply, and view_of rendered the full Account register to return one row. The change reuses the checked projection and shared single-row renderer. Concurrent non-agent creates share a bounded month save, while each intermediate proposal keeps its existing exact validation. Agent writes retain their calling task for Undo attribution. Generated balance equivalence tests are added. No sync policy or filesystem durability call is removed. Perf VM is currently held by another job; measurement has not started.

Static write-path finding (#1393): `files::index::record_impl` called `refresh_sidecar_pairs` after each item. That reads every sibling and begins a writer transaction even when no pair changes. The new path checks four candidate names with the path primary key, plus prior identity links with the Sidecar parent index; full reconciliation is retained. A regression also covers a Sidecar uploaded before its parent and ambiguous parent stems. Money `create_transaction` projected the proposed Budget and then reloaded/projected it for the reply, and `view_of` rendered the full Account register to return one row. The change reuses the checked projection and shared single-row renderer. Concurrent non-agent creates share a bounded month save, while each intermediate proposal keeps its existing exact validation. Agent writes retain their calling task for Undo attribution. Generated balance equivalence tests are added. No sync policy or filesystem durability call is removed. Perf VM is currently held by another job; measurement has not started.
Author
Owner

Files slice committed as 803772ca1. Focused production-route tests (verbatim):

test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 259 filtered out; finished in 109.54s

Focused API Vitest files (verbatim):

 Test Files  2 passed (2)
      Tests  27 passed (27)

Money batching, exact balance properties and an intermediate-overflow regression are implemented. Initial Money crate tests are running. The perf VM lock is held by another job. This is progress evidence, not a final throughput claim.

Files slice committed as `803772ca1`. Focused production-route tests (verbatim): ``` test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 259 filtered out; finished in 109.54s ``` Focused API Vitest files (verbatim): ``` Test Files 2 passed (2) Tests 27 passed (27) ``` Money batching, exact balance properties and an intermediate-overflow regression are implemented. Initial Money crate tests are running. The perf VM lock is held by another job. This is progress evidence, not a final throughput claim.
Author
Owner

Progress at dacb1930f717a4d478aa2380668b7da3f2007048 (merged origin/dev once; no push).

Money batches adjacent creates for the same Budget and month, up to 32 requests after a 2 ms collection interval. The existing synced compare-and-swap save is unchanged. Every intermediate projection is checked before the final save, and no success or event precedes that save. Agent writes retain their task-local Undo scope.

Initial Money crate result (verbatim):

test result: ok. 126 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 575.84s

This includes 24 property cases comparing full Account and month models between individual and concurrent writes, invalid neighbours, and intermediate overflow. Final gates for the merged source are running.

Concurrency review found that an ordinary parent can miss a Sidecar inserted between its first candidate query and its Index write. A second bounded candidate check after that write now preserves pairing; the concurrent sibling regression is being checked. This does not remove or defer filesystem durability.

The perf VM lock is held by another calternal job. Paired five-sample measurements are queued through perf-run; no throughput claim yet. The first average phase labels its after binary c1300457f; the full-size phase will use the merged, corrected source and will record its actual SHA.

Progress at `dacb1930f717a4d478aa2380668b7da3f2007048` (merged `origin/dev` once; no push). Money batches adjacent creates for the same Budget and month, up to 32 requests after a 2 ms collection interval. The existing synced compare-and-swap save is unchanged. Every intermediate projection is checked before the final save, and no success or event precedes that save. Agent writes retain their task-local Undo scope. Initial Money crate result (verbatim): ``` test result: ok. 126 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 575.84s ``` This includes 24 property cases comparing full Account and month models between individual and concurrent writes, invalid neighbours, and intermediate overflow. Final gates for the merged source are running. Concurrency review found that an ordinary parent can miss a Sidecar inserted between its first candidate query and its Index write. A second bounded candidate check after that write now preserves pairing; the concurrent sibling regression is being checked. This does not remove or defer filesystem durability. The perf VM lock is held by another calternal job. Paired five-sample measurements are queued through `perf-run`; no throughput claim yet. The first average phase labels its after binary `c1300457f`; the full-size phase will use the merged, corrected source and will record its actual SHA.
Author
Owner

Five paired samples per row now exist for 100 small Files and 100 Money creates on the perf VM, under perf-run. Before: shared release ef0aa12b1; after: release source c1300457f. Variants were interleaved within each sample. These are average-size measurements, not the final 5,000/2,000-item target.

Type Concurrency Before write p50 / p95 After write p50 / p95
Files, 100 1 8.09 / 8.20 s 8.01 / 8.58 s
Files, 100 8 7.24 / 7.58 s 7.51 / 7.66 s
Money, 100 1 5.35 / 5.59 s 5.60 / 5.70 s
Money, 100 8 5.33 / 5.35 s 0.91 / 0.97 s

Money at concurrency 8 used 15 saves per 100 creates in every after sample. Median server CPU over writes and the Search wait fell from 5,770 ms to 2,300 ms; median peak RSS was 169.1 MiB before and 176.1 MiB after. Stage tracing measured durable saves at about 50 ms p50, while 100-row batch preparation was about 4–5 ms p50. The existing fsync and durable publication path is unchanged.

The 100-file rows do not prove a throughput fix for Files. The Sidecar query removes folder-wide work as the folder grows, but the small-case write pipeline remains the limiting cost. The full-size run will include Files stage tracing; the 60 s target is not claimed.

Post-merge clippy for Files, Money and server passed (verbatim):

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 16m 03s

Web check passed; focused Files/Money Vitest output (verbatim):

 Test Files  2 passed (2)
      Tests  27 passed (27)
   Start at  02:25:24
   Duration  108.00s (transform 85%, import 8%, environment 6%, tests 1%)

Full per-crate Rust tests and the merged release build are still running. Branch head: 966c7ea36.

Five paired samples per row now exist for 100 small Files and 100 Money creates on the perf VM, under `perf-run`. Before: shared release `ef0aa12b1`; after: release source `c1300457f`. Variants were interleaved within each sample. These are average-size measurements, not the final 5,000/2,000-item target. | Type | Concurrency | Before write p50 / p95 | After write p50 / p95 | |---|---:|---:|---:| | Files, 100 | 1 | 8.09 / 8.20 s | 8.01 / 8.58 s | | Files, 100 | 8 | 7.24 / 7.58 s | 7.51 / 7.66 s | | Money, 100 | 1 | 5.35 / 5.59 s | 5.60 / 5.70 s | | Money, 100 | 8 | 5.33 / 5.35 s | 0.91 / 0.97 s | Money at concurrency 8 used 15 saves per 100 creates in every after sample. Median server CPU over writes and the Search wait fell from 5,770 ms to 2,300 ms; median peak RSS was 169.1 MiB before and 176.1 MiB after. Stage tracing measured durable saves at about 50 ms p50, while 100-row batch preparation was about 4–5 ms p50. The existing fsync and durable publication path is unchanged. The 100-file rows do not prove a throughput fix for Files. The Sidecar query removes folder-wide work as the folder grows, but the small-case write pipeline remains the limiting cost. The full-size run will include Files stage tracing; the 60 s target is not claimed. Post-merge clippy for Files, Money and server passed (verbatim): ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 16m 03s ``` Web check passed; focused Files/Money Vitest output (verbatim): ``` Test Files 2 passed (2) Tests 27 passed (27) Start at 02:25:24 Duration 108.00s (transform 85%, import 8%, environment 6%, tests 1%) ``` Full per-crate Rust tests and the merged release build are still running. Branch head: `966c7ea36`.
Author
Owner

HEAD c51aa915a. The first full-size perf-VM round retained all ten failed samples. Both versions refused a Money create with HTTP 409 after 14.5–15.9 seconds. The before version completed 256–273 rows; the batched version completed 978–1090 rows. No retry hid a refused write.

The Notes managed-date migration (#1148) walks all Home Markdown and adds absent date keys. New Money month files lacked those keys. Its independent write can change the month between Money projection and compare-and-swap. The compare-and-swap correctly refuses that race.

The fix adds absent managed date keys to a new month before its first durable publication, with the existing Notes core writer. Budget.md and Accounts.md keep their current creation format. Existing sources and Undo replacements retain their exact bytes. The old exact-Markdown test stays unchanged. A new regression requires the date backfill to be a byte-for-byte no-op on a newly created month. Full-size paired measurements will run on this fix; the failed round remains in the report.

HEAD c51aa915a. The first full-size perf-VM round retained all ten failed samples. Both versions refused a Money create with HTTP 409 after 14.5–15.9 seconds. The before version completed 256–273 rows; the batched version completed 978–1090 rows. No retry hid a refused write. The Notes managed-date migration (#1148) walks all Home Markdown and adds absent date keys. New Money month files lacked those keys. Its independent write can change the month between Money projection and compare-and-swap. The compare-and-swap correctly refuses that race. The fix adds absent managed date keys to a new month before its first durable publication, with the existing Notes core writer. Budget.md and Accounts.md keep their current creation format. Existing sources and Undo replacements retain their exact bytes. The old exact-Markdown test stays unchanged. A new regression requires the date backfill to be a byte-for-byte no-op on a newly created month. Full-size paired measurements will run on this fix; the failed round remains in the report.
Author
Owner

HEAD 2580699b49 commits the new-month managed-date fix. The existing exact-Markdown test is unchanged and passes.

cargo clippy -p calternal-plugin-money --all-targets -- -D warnings:

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

cargo test -p calternal-plugin-money -- --test-threads=4:

test result: ok. 128 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 294.01s
test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 34.43s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

The first 5,000-file baseline timed out after 180 s with 1,899 acknowledgements. Its median synced final source write was 45 ms, staging was 30 ms, and the upload-create/finish stages include serialized namespace waits. The after samples are still running. This evidence does not support calling the 60 s Files target complete.

HEAD 2580699b493b40417986bfb2fee4994a203cf062 commits the new-month managed-date fix. The existing exact-Markdown test is unchanged and passes. `cargo clippy -p calternal-plugin-money --all-targets -- -D warnings`: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 24.74s ``` `cargo test -p calternal-plugin-money -- --test-threads=4`: ``` test result: ok. 128 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 294.01s test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 34.43s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` The first 5,000-file baseline timed out after 180 s with 1,899 acknowledgements. Its median synced final source write was 45 ms, staging was 30 ms, and the upload-create/finish stages include serialized namespace waits. The after samples are still running. This evidence does not support calling the 60 s Files target complete.
Author
Owner

HEAD 959e4f25c3. All branch gates pass on the final Rust code. The full-size Files phase is finishing; fixed-release Money measurements are queued. This is not a claim that either full-size target has passed.

cargo fmt --check: exit 0, no output.

Files clippy:

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

Money clippy:

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

Server clippy:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 3m 17s

Files tests:

test result: ok. 267 passed; 0 failed; 4 ignored; 0 measured; 0 filtered out; finished in 267.85s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

Money tests:

test result: ok. 128 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 294.01s
test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 34.43s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

Server tests:

test result: ok. 272 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 398.57s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 81.30s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.54s

Web check:

perf-lint: PASS; 0 violations; 22541 scoped exceptions
svelte-check found 0 errors and 4 warnings in 2 files

Focused Vitest (src/lib/files/api.test.ts, src/lib/money/api.test.ts, --maxWorkers=2):

 Test Files  2 passed (2)
      Tests  27 passed (27)
   Start at  02:25:24
   Duration  108.00s (transform 85%, import 8%, environment 6%, tests 1%)

Focused Money API probe, on fixed release 2580699b4:

Money API probe: anonymous access, cursed IDs and months, hostile payees and amounts, malformed/oversized JSON and multipart imports, owner-bound single-use import confirmation, bounded preview bursts, bad budget names a 40-request write storm and a 48-request mixed create burst passed
HEAD 959e4f25c37a83e2d3554236be2090a5c30790d4. All branch gates pass on the final Rust code. The full-size Files phase is finishing; fixed-release Money measurements are queued. This is not a claim that either full-size target has passed. `cargo fmt --check`: exit 0, no output. Files clippy: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 40.32s ``` Money clippy: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 24.74s ``` Server clippy: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 3m 17s ``` Files tests: ``` test result: ok. 267 passed; 0 failed; 4 ignored; 0 measured; 0 filtered out; finished in 267.85s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Money tests: ``` test result: ok. 128 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 294.01s test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 34.43s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Server tests: ``` test result: ok. 272 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 398.57s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 81.30s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.54s ``` Web check: ``` perf-lint: PASS; 0 violations; 22541 scoped exceptions svelte-check found 0 errors and 4 warnings in 2 files ``` Focused Vitest (`src/lib/files/api.test.ts`, `src/lib/money/api.test.ts`, `--maxWorkers=2`): ``` Test Files 2 passed (2) Tests 27 passed (27) Start at 02:25:24 Duration 108.00s (transform 85%, import 8%, environment 6%, tests 1%) ``` Focused Money API probe, on fixed release 2580699b4: ``` Money API probe: anonymous access, cursed IDs and months, hostile payees and amounts, malformed/oversized JSON and multipart imports, owner-bound single-use import confirmation, bounded preview bursts, bad budget names a 40-request write storm and a 48-request mixed create burst passed ```
Author
Owner

HEAD 38a08b464. The full-size root-disk rounds are complete, with five interleaved before/after samples per case. Raw rows are retained in docs/perf/2026-10-08-1393-bulk-writes.jsonl, and the full tables are in docs/perf/2026-10-08-1393-bulk-writes.md.

Case Before After
2,000 Money creates, 8 workers 0/5 complete; HTTP 409 at 14.6–15.0 s, 174–267 acknowledged 5/5 complete; writes p50/p95 42.30/48.57 s; all Search 44.96/50.87 s; real UI row 48.45/54.25 s
5,000 Files, 8 workers 0/5 complete at 180 s; median acknowledged 1,899 (range 1,761–2,155) 0/5 complete at 180 s; median acknowledged 1,987 (range 1,552–2,297)

Money meets the under-60-second root-disk target in every sample. Each sample verifies unique row IDs, exact Account/cleared/uncleared balances and Category Activity. The date migration does not cause a refused month write on the fixed release.

Files does not meet the target. Its median Index/change-feed stage falls from 5.434 ms to 1.263 ms (about 77%) and median server CPU from 56.37 s to 41.59 s (about 26%) in these failed runs. The final synced source-write stage remains 46.145/50.125 ms before/after, with a further staging sync and namespace waits. A durable batch publication primitive in calternal-fs is needed to fix that remaining source-writer cost. This branch keeps its writer behavior and durability guarantees unchanged.

Full-size HDD measurements are running under perf-run and the existing 8 ms/200 IOPS emulation. Their rows will be included in the final report. No before/after completed-batch ratio is claimed when the before run failed.

HEAD 38a08b464. The full-size root-disk rounds are complete, with five interleaved before/after samples per case. Raw rows are retained in docs/perf/2026-10-08-1393-bulk-writes.jsonl, and the full tables are in docs/perf/2026-10-08-1393-bulk-writes.md. | Case | Before | After | |---|---|---| | 2,000 Money creates, 8 workers | 0/5 complete; HTTP 409 at 14.6–15.0 s, 174–267 acknowledged | 5/5 complete; writes p50/p95 42.30/48.57 s; all Search 44.96/50.87 s; real UI row 48.45/54.25 s | | 5,000 Files, 8 workers | 0/5 complete at 180 s; median acknowledged 1,899 (range 1,761–2,155) | 0/5 complete at 180 s; median acknowledged 1,987 (range 1,552–2,297) | Money meets the under-60-second root-disk target in every sample. Each sample verifies unique row IDs, exact Account/cleared/uncleared balances and Category Activity. The date migration does not cause a refused month write on the fixed release. Files does not meet the target. Its median Index/change-feed stage falls from 5.434 ms to 1.263 ms (about 77%) and median server CPU from 56.37 s to 41.59 s (about 26%) in these failed runs. The final synced source-write stage remains 46.145/50.125 ms before/after, with a further staging sync and namespace waits. A durable batch publication primitive in calternal-fs is needed to fix that remaining source-writer cost. This branch keeps its writer behavior and durability guarantees unchanged. Full-size HDD measurements are running under perf-run and the existing 8 ms/200 IOPS emulation. Their rows will be included in the final report. No before/after completed-batch ratio is claimed when the before run failed.
Author
Owner

Partial resolution of #1393. Head 67a59b7f12, branch job/bulkwrite-1393. The worktree is clean. The branch merged origin/dev d395b6e25 once before final gates.

Built

  • Money: per-User FIFO, 64 admission slots, a 2 ms collection interval and at most 32 compatible creates per durable save. Every intermediate proposal, balance and overspend crossing is checked. Invalid neighbours do not alter valid rows. Save failures reject all valid proposals. Replies and events follow the existing synced compare-and-swap. Agent creates retain task-local Undo. Mutation replies reuse the single-row renderer.
  • Money migration fix: new months receive absent managed dates before publication, so the Notes date backfill does not race their writes. Budget.md, Accounts.md, existing source bytes and Undo replacements keep their format. The old exact-Markdown expectation is unchanged. Property tests compare complete Account and two monthly rollover models between sequential and concurrent creates; focused regressions cover invalid neighbours and intermediate overflow.
  • Files: ordinary records use bounded candidate/prior-identity probes through the existing indexes. Full Sidecar ambiguity checks remain for real Sidecar changes. A second probe covers concurrent arrival; the regression checks the Index directly. No filesystem writer or sync policy was changed.
  • A real-API profile with all five item types at concurrency 1/8, five interleaved samples per row, full-size Files/Money, exact Money number checks, all-item Search and real production UI rows. All 150 raw rows, including failures, are retained. Exact live performance pins were refreshed; three obsolete exceptions were removed and both relevant ratchets lowered.

Results

Case Before After
100 Money, 8 workers Write p50/p95 5.33/5.35 s 0.91/0.97 s; 15 durable saves per sample
2,000 Money, root disk 0/5 complete; HTTP 409 5/5 complete; writes 42.30/48.57 s, all Search 44.96/50.87 s, real UI 48.45/54.25 s
5,000 Files, root disk 0/5 complete at 180 s; median 1,899 acknowledged 0/5 complete; median 1,987; Index median stage 5.434→1.263 ms and CPU 56.37→41.59 s
5,000 Files, HDD 0/5 complete; median 114 acknowledged 0/5 complete; median 113
2,000 Money, HDD 0/5 complete; HTTP 409, 17–18 acknowledged 0/5 complete; deadline, 1,119–1,331 acknowledged; no migration conflict

Money meets the fresh-Instance root-disk 60 s target in every sample, with exact balances and unique IDs verified. Files does not. Neither full-size case completes on the emulated HDD. All measurements ran under perf-run on the perf VM; load averages are retained. No build ran there. No failed-before completed-batch ratio is claimed.

Full report: docs/perf/2026-10-08-1393-bulk-writes.md. Raw rows: docs/perf/2026-10-08-1393-bulk-writes.jsonl. These sit beside docs/perf/baseline.json, which has no matching bulk-write profile. Notes batch-tail review is filed as #1426; request p95 stayed stable, so this is not an automatic route-p95 violation or a proven code cause.

Files

  • crates/plugins/files/src/index.rs and lib.rs
  • crates/plugins/money/src/routes.rs, store.rs, views.rs and tests.rs
  • bench/bulk-write-1393.mjs
  • tests/adversarial/money_api.mjs
  • contracts/perf/registry.json, exceptions.json, adoption-1058.json and ratchet.json
  • docs/perf/2026-10-08-1393-bulk-writes.md and .jsonl

Gates (verbatim summary output)

cargo fmt --check: exit 0, no output.

Files clippy:

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

Money clippy:

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

Server clippy:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 3m 17s

Files tests:

test result: ok. 267 passed; 0 failed; 4 ignored; 0 measured; 0 filtered out; finished in 267.85s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

Money tests:

test result: ok. 128 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 294.01s
test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 34.43s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

Server tests:

test result: ok. 272 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 398.57s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 81.30s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.54s

Web check:

perf-lint: PASS; 0 violations; 22541 scoped exceptions
svelte-check found 0 errors and 4 warnings in 2 files

Focused Vitest (src/lib/files/api.test.ts, src/lib/money/api.test.ts, --maxWorkers=2):

 Test Files  2 passed (2)
      Tests  27 passed (27)
   Start at  02:25:24
   Duration  108.00s (transform 85%, import 8%, environment 6%, tests 1%)

Focused Money API probe, on fixed release 2580699b4:

Money API probe: anonymous access, cursed IDs and months, hostile payees and amounts, malformed/oversized JSON and multipart imports, owner-bound single-use import confirmation, bounded preview bursts, bad budget names a 40-request write storm and a 48-request mixed create burst passed

Known gaps

The Files target remains unmet. Its final source write is still serialized and synced per item, with a further staging sync and namespace waits. A durable batch publication primitive and a wider upload/Index plan are needed in calternal-fs. That would change another crate's writer behavior/design and is not implemented here. The HDD Money target also remains unmet; median durable batch time is about 998 ms. All failed runs remain in the report.

Legacy Money months without managed dates can still receive the one-time migration and correctly refuse a concurrent edit with 409. Genuine source changes are never overwritten. Four existing Web CSS warnings remain; checks have zero errors and the performance guard has zero violations.

Decisions

DESIGN does not prescribe collection/admission sizes: chose 2 ms, 32 items per batch and 64 accepted creates per User. These bound work and let other operations take the lock between saves. Agent creates use one-item batches. New-month date values use UTC second precision and only absent keys; existing source metadata and Undo bytes stay intact. No dependency or migration was added.

Expected cost: ordinary Files records use two bounded Index probes per item, each with up to four candidate paths and a prior-identity probe. Money source saves cost O(ceil(items/batch size)); validation of growing source text still costs O(items squared). The report measures the requested realistic sizes rather than dropping safety checks to improve timing.

UX gaps closed / left

Closed: concurrent Money create save cost, full-register rendering for one response, and the new-month migration collision. Existing Files and Money production views are used for real-row checks; no visible control was added or restyled.
Left: full Files settlement and both full-size HDD completion targets. Timed-out runs do not prove all-item UI/Search settlement.

For the merge round

  • cd apps/web && bun run test — full Web contracts and unit suite.
  • cd apps/web && bun e2e/smoke/run.mjs — production browser flow matrix.
  • cd apps/web && bun run test:e2e:files — complete Files flow.
  • cd apps/web && bun run test:e2e:money — complete Money flow and Undo.
  • bash tests/adversarial/run.sh — combined User isolation, authorization and hostile-input matrices.

These full suites are deferred by the verification policy; crate gates, focused Vitest and the Money API regression probe ran here.

Cleanup: cargo clean removed 29972 files, 19.6GiB total. Local apps/web/build was removed. Review artifacts remain ignored; no screenshots, videos or binaries were committed. No push, deploy, integration merge or issue close was performed.

Partial resolution of #1393. Head 67a59b7f1228b0fcc004d6be7e595c022597cdc5, branch job/bulkwrite-1393. The worktree is clean. The branch merged origin/dev d395b6e25 once before final gates. ## Built - Money: per-User FIFO, 64 admission slots, a 2 ms collection interval and at most 32 compatible creates per durable save. Every intermediate proposal, balance and overspend crossing is checked. Invalid neighbours do not alter valid rows. Save failures reject all valid proposals. Replies and events follow the existing synced compare-and-swap. Agent creates retain task-local Undo. Mutation replies reuse the single-row renderer. - Money migration fix: new months receive absent managed dates before publication, so the Notes date backfill does not race their writes. Budget.md, Accounts.md, existing source bytes and Undo replacements keep their format. The old exact-Markdown expectation is unchanged. Property tests compare complete Account and two monthly rollover models between sequential and concurrent creates; focused regressions cover invalid neighbours and intermediate overflow. - Files: ordinary records use bounded candidate/prior-identity probes through the existing indexes. Full Sidecar ambiguity checks remain for real Sidecar changes. A second probe covers concurrent arrival; the regression checks the Index directly. No filesystem writer or sync policy was changed. - A real-API profile with all five item types at concurrency 1/8, five interleaved samples per row, full-size Files/Money, exact Money number checks, all-item Search and real production UI rows. All 150 raw rows, including failures, are retained. Exact live performance pins were refreshed; three obsolete exceptions were removed and both relevant ratchets lowered. ## Results | Case | Before | After | |---|---|---| | 100 Money, 8 workers | Write p50/p95 5.33/5.35 s | 0.91/0.97 s; 15 durable saves per sample | | 2,000 Money, root disk | 0/5 complete; HTTP 409 | 5/5 complete; writes 42.30/48.57 s, all Search 44.96/50.87 s, real UI 48.45/54.25 s | | 5,000 Files, root disk | 0/5 complete at 180 s; median 1,899 acknowledged | 0/5 complete; median 1,987; Index median stage 5.434→1.263 ms and CPU 56.37→41.59 s | | 5,000 Files, HDD | 0/5 complete; median 114 acknowledged | 0/5 complete; median 113 | | 2,000 Money, HDD | 0/5 complete; HTTP 409, 17–18 acknowledged | 0/5 complete; deadline, 1,119–1,331 acknowledged; no migration conflict | Money meets the fresh-Instance root-disk 60 s target in every sample, with exact balances and unique IDs verified. Files does not. Neither full-size case completes on the emulated HDD. All measurements ran under perf-run on the perf VM; load averages are retained. No build ran there. No failed-before completed-batch ratio is claimed. Full report: docs/perf/2026-10-08-1393-bulk-writes.md. Raw rows: docs/perf/2026-10-08-1393-bulk-writes.jsonl. These sit beside docs/perf/baseline.json, which has no matching bulk-write profile. Notes batch-tail review is filed as #1426; request p95 stayed stable, so this is not an automatic route-p95 violation or a proven code cause. ## Files - crates/plugins/files/src/index.rs and lib.rs - crates/plugins/money/src/routes.rs, store.rs, views.rs and tests.rs - bench/bulk-write-1393.mjs - tests/adversarial/money_api.mjs - contracts/perf/registry.json, exceptions.json, adoption-1058.json and ratchet.json - docs/perf/2026-10-08-1393-bulk-writes.md and .jsonl ## Gates (verbatim summary output) `cargo fmt --check`: exit 0, no output. Files clippy: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 40.32s ``` Money clippy: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 24.74s ``` Server clippy: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 3m 17s ``` Files tests: ``` test result: ok. 267 passed; 0 failed; 4 ignored; 0 measured; 0 filtered out; finished in 267.85s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Money tests: ``` test result: ok. 128 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 294.01s test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 34.43s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Server tests: ``` test result: ok. 272 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 398.57s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 81.30s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.54s ``` Web check: ``` perf-lint: PASS; 0 violations; 22541 scoped exceptions svelte-check found 0 errors and 4 warnings in 2 files ``` Focused Vitest (`src/lib/files/api.test.ts`, `src/lib/money/api.test.ts`, `--maxWorkers=2`): ``` Test Files 2 passed (2) Tests 27 passed (27) Start at 02:25:24 Duration 108.00s (transform 85%, import 8%, environment 6%, tests 1%) ``` Focused Money API probe, on fixed release 2580699b4: ``` Money API probe: anonymous access, cursed IDs and months, hostile payees and amounts, malformed/oversized JSON and multipart imports, owner-bound single-use import confirmation, bounded preview bursts, bad budget names a 40-request write storm and a 48-request mixed create burst passed ``` ## Known gaps The Files target remains unmet. Its final source write is still serialized and synced per item, with a further staging sync and namespace waits. A durable batch publication primitive and a wider upload/Index plan are needed in calternal-fs. That would change another crate's writer behavior/design and is not implemented here. The HDD Money target also remains unmet; median durable batch time is about 998 ms. All failed runs remain in the report. Legacy Money months without managed dates can still receive the one-time migration and correctly refuse a concurrent edit with 409. Genuine source changes are never overwritten. Four existing Web CSS warnings remain; checks have zero errors and the performance guard has zero violations. ## Decisions DESIGN does not prescribe collection/admission sizes: chose 2 ms, 32 items per batch and 64 accepted creates per User. These bound work and let other operations take the lock between saves. Agent creates use one-item batches. New-month date values use UTC second precision and only absent keys; existing source metadata and Undo bytes stay intact. No dependency or migration was added. Expected cost: ordinary Files records use two bounded Index probes per item, each with up to four candidate paths and a prior-identity probe. Money source saves cost O(ceil(items/batch size)); validation of growing source text still costs O(items squared). The report measures the requested realistic sizes rather than dropping safety checks to improve timing. ## UX gaps closed / left Closed: concurrent Money create save cost, full-register rendering for one response, and the new-month migration collision. Existing Files and Money production views are used for real-row checks; no visible control was added or restyled. Left: full Files settlement and both full-size HDD completion targets. Timed-out runs do not prove all-item UI/Search settlement. ## For the merge round - cd apps/web && bun run test — full Web contracts and unit suite. - cd apps/web && bun e2e/smoke/run.mjs — production browser flow matrix. - cd apps/web && bun run test:e2e:files — complete Files flow. - cd apps/web && bun run test:e2e:money — complete Money flow and Undo. - bash tests/adversarial/run.sh — combined User isolation, authorization and hostile-input matrices. These full suites are deferred by the verification policy; crate gates, focused Vitest and the Money API regression probe ran here. Cleanup: cargo clean removed 29972 files, 19.6GiB total. Local apps/web/build was removed. Review artifacts remain ignored; no screenshots, videos or binaries were committed. No push, deploy, integration merge or issue close was performed.
Author
Owner

Related measurement from audit #1374, branch head 95223dde0194a91a9b7783f4e814e1943e3384ce, on the perf VM with the shared release server from d395b6e25:

POST /api/v1/files/move moving a folder with 1,000 children returned 204 and became visible in 831.21 ms (single sample; p50/p95/max all 831.21 ms), above the 500 ms visibility target. Undo returned 204 and became visible in 280.84 ms. The route is crates/plugins/files/src/lib.rs::move_paths into transfer. The full audit will include its query-plan evidence and load average. This is recorded under the existing bulk-write work rather than as a duplicate issue.

Related measurement from audit #1374, branch head `95223dde0194a91a9b7783f4e814e1943e3384ce`, on the perf VM with the shared release server from `d395b6e25`: `POST /api/v1/files/move` moving a folder with 1,000 children returned 204 and became visible in 831.21 ms (single sample; p50/p95/max all 831.21 ms), above the 500 ms visibility target. Undo returned 204 and became visible in 280.84 ms. The route is `crates/plugins/files/src/lib.rs::move_paths` into `transfer`. The full audit will include its query-plan evidence and load average. This is recorded under the existing bulk-write work rather than as a duplicate issue.
Author
Owner

Further #1374 bulk evidence, branch head ace13fe6c (the active audit loaded runner revision 199f444d):

  • Re-tagging 100 Files through 100 PUT /api/v1/tags/items requests returned HTTP 200 × 100 and became visible in 23,715.12 ms, against the 500 ms target.
  • Deleting 1,000 Files through two sequential 500-Item POST /api/v1/files/trash requests received no HTTP response (client status 0 × 2) after 240,018.44 ms. No successful visibility time was available. Restore, re-Trash and Empty Trash were skipped because the 1,000-Item Trash fixture did not settle.

These are single-operation samples. The delete call path is crates/plugins/files/src/lib.rs::trash; the re-tag path is crates/calternal-tags/src/lib.rs::assign_tags. The hide/unhide rows in the active audit are invalid: that process sent owner paths to an endpoint that accepts shared Items. The runner fixture was corrected in the current branch, but the active process loaded the earlier code. This comment records the bulk-write evidence under #1393; it does not claim that the timeout has the same Index-pool cause as #1383.

Further #1374 bulk evidence, branch head `ace13fe6c` (the active audit loaded runner revision `199f444d`): - Re-tagging 100 Files through 100 `PUT /api/v1/tags/items` requests returned HTTP 200 × 100 and became visible in 23,715.12 ms, against the 500 ms target. - Deleting 1,000 Files through two sequential 500-Item `POST /api/v1/files/trash` requests received no HTTP response (client status 0 × 2) after 240,018.44 ms. No successful visibility time was available. Restore, re-Trash and Empty Trash were skipped because the 1,000-Item Trash fixture did not settle. These are single-operation samples. The delete call path is `crates/plugins/files/src/lib.rs::trash`; the re-tag path is `crates/calternal-tags/src/lib.rs::assign_tags`. The hide/unhide rows in the active audit are invalid: that process sent owner paths to an endpoint that accepts shared Items. The runner fixture was corrected in the current branch, but the active process loaded the earlier code. This comment records the bulk-write evidence under #1393; it does not claim that the timeout has the same Index-pool cause as #1383.
Author
Owner

Further #1374 bulk evidence, branch head bd078a3c3, on the perf VM with the shared release server from d395b6e25:

Completing 1,000 Tasks through 1,000 POST /api/v1/notes/tasks/tick requests at concurrency 8 had no visible completed state by 600,021.10 ms. The lower-bound row was written while the client action was still pending; this is not a completion time or p95. The route is crates/plugins/notes/src/tasks_api.rs::tick; each request takes the User lock, reads and replaces the Markdown source, then calls tasks_store::index_source. This adds Task completion to the existing bulk-write investigation. I am not filing a duplicate issue.

Further #1374 bulk evidence, branch head `bd078a3c3`, on the perf VM with the shared release server from `d395b6e25`: Completing 1,000 Tasks through 1,000 `POST /api/v1/notes/tasks/tick` requests at concurrency 8 had no visible completed state by 600,021.10 ms. The lower-bound row was written while the client action was still pending; this is not a completion time or p95. The route is `crates/plugins/notes/src/tasks_api.rs::tick`; each request takes the User lock, reads and replaces the Markdown source, then calls `tasks_store::index_source`. This adds Task completion to the existing bulk-write investigation. I am not filing a duplicate issue.
Author
Owner

Rerun result (2026-10-08, perf VM): completing 1,000 Tasks through POST /api/v1/notes/tasks/tick took 1,347,186.57 ms to become visible (target 500 ms). All 1,000 requests returned HTTP 200; acknowledgement took 1,346,624.18 ms; 497,000 response bytes; 1,000 rows touched. The state was not visible at the 600,021.10 ms observer checkpoint, then became visible before the action returned. Cause: crates/plugins/notes/src/tasks_api.rs::tick updates one source Task per request under the User lock. The 50 ms /auth/me probe had 26,837 samples (p95 36.64 ms; 24,197 returned 429), so its p95 is not a clean successful-request distribution. The audit CSV records the per-operation checkpoints.

Rerun result (2026-10-08, perf VM): completing 1,000 Tasks through `POST /api/v1/notes/tasks/tick` took 1,347,186.57 ms to become visible (target 500 ms). All 1,000 requests returned HTTP 200; acknowledgement took 1,346,624.18 ms; 497,000 response bytes; 1,000 rows touched. The state was not visible at the 600,021.10 ms observer checkpoint, then became visible before the action returned. Cause: `crates/plugins/notes/src/tasks_api.rs::tick` updates one source Task per request under the User lock. The 50 ms `/auth/me` probe had 26,837 samples (p95 36.64 ms; 24,197 returned 429), so its p95 is not a clean successful-request distribution. The audit CSV records the per-operation checkpoints.
Author
Owner

Additional result from the same perf-VM audit: the 1,000-request Task Undo batch acknowledged after 323,326.81 ms, with 166 HTTP 200 and 834 HTTP 500 responses. Only 166 rows were touched; the full undone state was not visible by 600,374.06 ms. This is a server-error finding in crates/plugins/notes/src/tasks_api.rs::tick, not only a slow-write result. Per-request error bodies were not retained, so a separate issue (#1446) records the unresolved 5xx reproduction. The immediately preceding completion batch returned 1,000 HTTP 200 and became visible after 1,347,186.57 ms.

Additional result from the same perf-VM audit: the 1,000-request Task Undo batch acknowledged after 323,326.81 ms, with 166 HTTP 200 and 834 HTTP 500 responses. Only 166 rows were touched; the full undone state was not visible by 600,374.06 ms. This is a server-error finding in `crates/plugins/notes/src/tasks_api.rs::tick`, not only a slow-write result. Per-request error bodies were not retained, so a separate issue (#1446) records the unresolved 5xx reproduction. The immediately preceding completion batch returned 1,000 HTTP 200 and became visible after 1,347,186.57 ms.
Author
Owner

Independent read-only bulkrev review started on job/bulkwrite-1393 at 67a59b7f12, comparing d395b6e25. I will test Money numerical equivalence and batch crash/restart behavior, plus Files Sidecar identity races. No tracked edits or ref changes. Evidence will be in artifacts/bulkrev-findings.md; I will not read the author report or issue perf notes.

Independent read-only bulkrev review started on job/bulkwrite-1393 at 67a59b7f1228b0fcc004d6be7e595c022597cdc5, comparing d395b6e25. I will test Money numerical equivalence and batch crash/restart behavior, plus Files Sidecar identity races. No tracked edits or ref changes. Evidence will be in artifacts/bulkrev-findings.md; I will not read the author report or issue perf notes.
Author
Owner

Independent bulkrev control finding: d395b6e25 returned 409 (the file changed; reload and try again) on a valid serial transaction create during disposable fixture construction. The review's generated Account/month-model checks passed on reduced control fixtures in Europe/Berlin, Asia/Kolkata and America/Los_Angeles. The head binary is still building; these are baseline observations, not head approval.

Contract finding from the diff and control run: mixed valid/invalid independent create requests have per-request validation. Valid neighbours commit and the invalid request is rejected, on the baseline too. This differs from a literal all-or-nothing interpretation of the review brief. I will check atomic publication of the accepted proposals and report the distinction explicitly.

Independent bulkrev control finding: d395b6e25 returned 409 (`the file changed; reload and try again`) on a valid serial transaction create during disposable fixture construction. The review's generated Account/month-model checks passed on reduced control fixtures in Europe/Berlin, Asia/Kolkata and America/Los_Angeles. The head binary is still building; these are baseline observations, not head approval. Contract finding from the diff and control run: mixed valid/invalid independent create requests have per-request validation. Valid neighbours commit and the invalid request is rejected, on the baseline too. This differs from a literal all-or-nothing interpretation of the review brief. I will check atomic publication of the accepted proposals and report the distinction explicitly.
Author
Owner

Continuing #1393 on job/bulkwrite-1393, base/head 67a59b7f12. Reading independent number evidence and checking baseline d395b6e25. Scope: canonical same-date Money posting order and bounded assignment CAS retries, with existing number tests preserved and generated full-model regressions.

Continuing #1393 on job/bulkwrite-1393, base/head 67a59b7f1228b0fcc004d6be7e595c022597cdc5. Reading independent number evidence and checking baseline d395b6e25. Scope: canonical same-date Money posting order and bounded assignment CAS retries, with existing number tests preserved and generated full-model regressions.
Author
Owner

Baseline attribution: the calculator at d395b6e25 and 67a59b7f1 has the same blob f05e8ac338. Replayed the review's seed-1 40 postings in input order and its recorded burst order through that calculator: unequal full models, including October payment reserve 18571 versus 21143 (synthetic minor units). This is inherited file-order sensitivity, not duplicate or lost batch arithmetic.

Decisions for #1393: canonical ascending order is calendar date, posting phase (non-positive ordinary postings, transfers, positive ordinary postings), Category ID, Account ID, exact source minor amount, currency, child posting fields, transaction ID. Posting fields precede random API IDs; labels/notes do not affect order. Purchases precede payments and refunds follow payments. The same order governs reserve funding and FIFO payment/refund moves. Source files remain lossless. Historical oracle vectors that depended on file FIFO must change under this explicitly requested behavior; all vector inputs and number tests are retained, with Python independently generating expected models.

Assignments retain the existing per-User exclusive Money writer lock and rebuild from latest source bytes after a CAS conflict, for at most four attempts. Successful retries preserve unrelated Assignments and unknown metadata. Exhaustion remains a conflict, with no partial write.

Baseline attribution: the calculator at d395b6e25 and 67a59b7f1 has the same blob f05e8ac3382ce70169c57369a3851fbb5a914d61. Replayed the review's seed-1 40 postings in input order and its recorded burst order through that calculator: unequal full models, including October payment reserve 18571 versus 21143 (synthetic minor units). This is inherited file-order sensitivity, not duplicate or lost batch arithmetic. Decisions for #1393: canonical ascending order is calendar date, posting phase (non-positive ordinary postings, transfers, positive ordinary postings), Category ID, Account ID, exact source minor amount, currency, child posting fields, transaction ID. Posting fields precede random API IDs; labels/notes do not affect order. Purchases precede payments and refunds follow payments. The same order governs reserve funding and FIFO payment/refund moves. Source files remain lossless. Historical oracle vectors that depended on file FIFO must change under this explicitly requested behavior; all vector inputs and number tests are retained, with Python independently generating expected models. Assignments retain the existing per-User exclusive Money writer lock and rebuild from latest source bytes after a CAS conflict, for at most four attempts. Successful retries preserve unrelated Assignments and unknown metadata. Exhaustion remains a conflict, with no partial write.
Author
Owner

Exact baseline attribution completed: the reference calculator read from d395b6e25, with the independent review's exact 40-row seed, opening rows, Assignments and recorded burst file order, reproduces October Card payment Available 18571 (input order) versus 21143 (burst file order), and final Card debt not covered 33340 versus 30768. All numbers are synthetic minor units. The current calculator and projection at the starting head have the same source blobs as d395b6e25. With the canonical order, the independent Python reference returns 18571 and 33340 for both orders, and every month field matches. Evidence: artifacts/bulkfix-baseline-exact.py and artifacts/bulkfix-baseline-exact.log.

All 625 original recorded vector inputs remain. Eleven outputs from the same-day payment/refund FIFO case change under #1393's explicit replacement of file ordering. No Rust assertion, status expectation or historical vector input is removed or weakened. The Python oracle suite passes 100 tests. Rust clippy for both Money crates passed; Rust route tests are now running after the first dependency build.

Exact baseline attribution completed: the reference calculator read from d395b6e25, with the independent review's exact 40-row seed, opening rows, Assignments and recorded burst file order, reproduces October Card payment Available 18571 (input order) versus 21143 (burst file order), and final Card debt not covered 33340 versus 30768. All numbers are synthetic minor units. The current calculator and projection at the starting head have the same source blobs as d395b6e25. With the canonical order, the independent Python reference returns 18571 and 33340 for both orders, and every month field matches. Evidence: artifacts/bulkfix-baseline-exact.py and artifacts/bulkfix-baseline-exact.log. All 625 original recorded vector inputs remain. Eleven outputs from the same-day payment/refund FIFO case change under #1393's explicit replacement of file ordering. No Rust assertion, status expectation or historical vector input is removed or weakened. The Python oracle suite passes 100 tests. Rust clippy for both Money crates passed; Rust route tests are now running after the first dependency build.
Author
Owner

#1393 Money correctness continuation

Final head: f3b57c58a0063f9e0aacad45671ef27b07a5c855 on job/bulkwrite-1393. The Money corrections are ready for merge; the original Files/HDD throughput scope remains partial. No push, deploy or issue closure.

Built

  • Canonical same-date posting order for all Card reserve, refund and payment calculations. The exact baseline replay reproduces 18571/33340 in input order and 21143/30768 in recorded burst order (synthetic minor units). Both orders now give 18571/33340 and identical complete models.
  • Bounded Assignment CAS retries from the latest Budget bytes. Real stale-source and injected-conflict tests preserve another Assignment and unknown metadata; exhausted retries leave bytes unchanged.
  • Generated core and real-TCP model comparisons across serial, shuffled, eight-client and burst arrival, months, time zones and DST days. Per-request validation and atomic valid batch publication remain unchanged.

Files

  • crates/calternal-money/src/{budget,ledger}.rs, tests/{properties,review_984}.rs, tests/properties.proptest-regressions.
  • crates/plugins/money/src/{routes,store,tests}.rs, proptest-regressions/tests.txt.
  • docs/DESIGN.md §48, docs/perf/2026-10-08-1393-money-number-fixes.md, bench/money-pair-review-984.sh.
  • spikes/money-format/budget_math.py, spikes/money-markdown/test_money_adversarial.py, contracts/vectors/money/money.v1.json.

Decisions

The canonical key is date, phase, Category ID, Account ID, exact source amount, currency, child posting fields, then transaction ID. Non-positive ordinary rows precede transfers; positive ordinary rows follow transfers. Posting fields precede generated IDs so recreated equivalent sets also agree. Source bytes keep their written order. This explicitly replaces the old same-date file-order decision. All 625 original vector inputs remain; eleven expected outputs change under this rule, independently computed by the Python oracle. No Rust assertion or divergence rule was weakened.

Assignment saves make at most four attempts under the existing Money writer lock. They reload and validate exact targets on each conflict. Persistent conflicts still return 409 with no write. No new dependencies or UI controls.

UX gaps closed

Arrival order no longer changes Card numbers. Transient metadata conflicts no longer refuse otherwise valid Assignment targets. No UI change requires screenshots.

Known gaps

The previous Files/emulated-HDD #1393 throughput target remains incomplete; see docs/perf/2026-10-08-1393-bulk-writes.md. This continuation fixes the two Money findings, not that publication primitive. Four continuous external source conflicts still return 409 without losing data.

Expected replay cost: n transaction references × sort O(n log n) and posting work, no added per-row IO. Assignment writes have at most four loads/validations/CAS attempts. Locked perf-VM debug diagnostic (five samples, each two full replays): 2,000 rows p50 41.627 ms / p95 46.318 ms; 100,000 rows p50 2341.024 ms / p95 2996.602 ms. Process user/system CPU 41.26/0.50 s, peak RSS 279944 KiB. No matching entry in docs/perf/baseline.json; these are not release or throughput claims. No builds ran on the VM.

For the merge round

  • cargo clippy -p calternal-server --all-targets -- -D warnings and cargo test -p calternal-server -- --test-threads=4: combined server integration.
  • node tests/adversarial/money_api.mjs: full-server authentication, malformed and oversized payloads, mixed valid/invalid batch isolation.
  • MONEY_REVIEW_MODES=canonical MONEY_REVIEW_BIN=<release-review_984-binary> bash bench/money-pair-review-984.sh, through perf-run calternal on the perf VM: release timings and reversed-row equality.
  • Full e2e, release and Mac interop remain merge-round work under the verification policy. No UI change needs Mac rendering evidence.

Verification notes

Merged fetched origin/dev at af202e151 once. The new TCP property initially exceeded the old 10-second check deadline; there was no model mismatch. The saved seed and eight cases passed with the new property's 60-second deadline in 1192.18 s. Existing checks retain their 10-second deadline. Final gate results follow below. Raw gate logs remain in ignored artifacts/bulkfix-final-*.log. All changed doc comments were re-read.

Final gates

Code head: dd43c951c362bff5f342de0ee2669a49d19fd8cf. The one fetch and
merge used origin/dev at af202e151. All required commands exited zero.
cargo fmt --check produced no output. The final plugin library suite took
1481.47 seconds. It includes the generated TCP property.

cargo clippy -p calternal-money -p calternal-plugin-money --all-targets -- -D warnings:

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

cargo test -p calternal-money -- --test-threads=4:

test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s
test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s
test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 12.75s
test result: ok. 14 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.11s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 3.93s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.44s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

cargo test -p calternal-plugin-money -- --test-threads=4:

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 132 filtered out; finished in 48.20s
test result: ok. 131 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 1481.47s
test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 10.87s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

cd apps/web && bun run check:

svelte-check found 0 errors and 4 warnings in 2 files

cd apps/web && bun run test --maxWorkers=2:

Ran 140 tests in 0.139s
OK
 8 pass
 0 fail
Ran 8 tests across 1 file. [964.00ms]
 Test Files  297 passed (297)
      Tests  2120 passed (2120)
   Duration  529.32s (transform 27%, environment 27%, import 22%, tests 18%, setup 6%)

Cleanup

cargo clean output:

     Removed 6200 files, 2.4GiB total

Removed apps/web/build. The worktree is clean.

# #1393 Money correctness continuation Final head: `f3b57c58a0063f9e0aacad45671ef27b07a5c855` on `job/bulkwrite-1393`. The Money corrections are ready for merge; the original Files/HDD throughput scope remains partial. No push, deploy or issue closure. ## Built - Canonical same-date posting order for all Card reserve, refund and payment calculations. The exact baseline replay reproduces 18571/33340 in input order and 21143/30768 in recorded burst order (synthetic minor units). Both orders now give 18571/33340 and identical complete models. - Bounded Assignment CAS retries from the latest Budget bytes. Real stale-source and injected-conflict tests preserve another Assignment and unknown metadata; exhausted retries leave bytes unchanged. - Generated core and real-TCP model comparisons across serial, shuffled, eight-client and burst arrival, months, time zones and DST days. Per-request validation and atomic valid batch publication remain unchanged. ## Files - `crates/calternal-money/src/{budget,ledger}.rs`, `tests/{properties,review_984}.rs`, `tests/properties.proptest-regressions`. - `crates/plugins/money/src/{routes,store,tests}.rs`, `proptest-regressions/tests.txt`. - `docs/DESIGN.md` §48, `docs/perf/2026-10-08-1393-money-number-fixes.md`, `bench/money-pair-review-984.sh`. - `spikes/money-format/budget_math.py`, `spikes/money-markdown/test_money_adversarial.py`, `contracts/vectors/money/money.v1.json`. ## Decisions The canonical key is date, phase, Category ID, Account ID, exact source amount, currency, child posting fields, then transaction ID. Non-positive ordinary rows precede transfers; positive ordinary rows follow transfers. Posting fields precede generated IDs so recreated equivalent sets also agree. Source bytes keep their written order. This explicitly replaces the old same-date file-order decision. All 625 original vector inputs remain; eleven expected outputs change under this rule, independently computed by the Python oracle. No Rust assertion or divergence rule was weakened. Assignment saves make at most four attempts under the existing Money writer lock. They reload and validate exact targets on each conflict. Persistent conflicts still return 409 with no write. No new dependencies or UI controls. ## UX gaps closed Arrival order no longer changes Card numbers. Transient metadata conflicts no longer refuse otherwise valid Assignment targets. No UI change requires screenshots. ## Known gaps The previous Files/emulated-HDD #1393 throughput target remains incomplete; see `docs/perf/2026-10-08-1393-bulk-writes.md`. This continuation fixes the two Money findings, not that publication primitive. Four continuous external source conflicts still return 409 without losing data. Expected replay cost: n transaction references × sort O(n log n) and posting work, no added per-row IO. Assignment writes have at most four loads/validations/CAS attempts. Locked perf-VM debug diagnostic (five samples, each two full replays): 2,000 rows p50 41.627 ms / p95 46.318 ms; 100,000 rows p50 2341.024 ms / p95 2996.602 ms. Process user/system CPU 41.26/0.50 s, peak RSS 279944 KiB. No matching entry in `docs/perf/baseline.json`; these are not release or throughput claims. No builds ran on the VM. ## For the merge round - `cargo clippy -p calternal-server --all-targets -- -D warnings` and `cargo test -p calternal-server -- --test-threads=4`: combined server integration. - `node tests/adversarial/money_api.mjs`: full-server authentication, malformed and oversized payloads, mixed valid/invalid batch isolation. - `MONEY_REVIEW_MODES=canonical MONEY_REVIEW_BIN=<release-review_984-binary> bash bench/money-pair-review-984.sh`, through `perf-run calternal` on the perf VM: release timings and reversed-row equality. - Full e2e, release and Mac interop remain merge-round work under the verification policy. No UI change needs Mac rendering evidence. ## Verification notes Merged fetched `origin/dev` at `af202e151` once. The new TCP property initially exceeded the old 10-second check deadline; there was no model mismatch. The saved seed and eight cases passed with the new property's 60-second deadline in 1192.18 s. Existing checks retain their 10-second deadline. Final gate results follow below. Raw gate logs remain in ignored `artifacts/bulkfix-final-*.log`. All changed doc comments were re-read. ## Final gates Code head: `dd43c951c362bff5f342de0ee2669a49d19fd8cf`. The one fetch and merge used `origin/dev` at `af202e151`. All required commands exited zero. `cargo fmt --check` produced no output. The final plugin library suite took 1481.47 seconds. It includes the generated TCP property. `cargo clippy -p calternal-money -p calternal-plugin-money --all-targets -- -D warnings`: ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 18.83s ``` `cargo test -p calternal-money -- --test-threads=4`: ```text test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 12.75s test result: ok. 14 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.11s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 3.93s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.44s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` `cargo test -p calternal-plugin-money -- --test-threads=4`: ```text test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 132 filtered out; finished in 48.20s test result: ok. 131 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 1481.47s test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 10.87s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` `cd apps/web && bun run check`: ```text svelte-check found 0 errors and 4 warnings in 2 files ``` `cd apps/web && bun run test --maxWorkers=2`: ```text Ran 140 tests in 0.139s OK 8 pass 0 fail Ran 8 tests across 1 file. [964.00ms] Test Files 297 passed (297) Tests 2120 passed (2120) Duration 529.32s (transform 27%, environment 27%, import 22%, tests 18%, setup 6%) ``` ## Cleanup `cargo clean` output: ```text Removed 6200 files, 2.4GiB total ``` Removed `apps/web/build`. The worktree is clean.
Author
Owner

Independent bulkrev2 number review started on job/bulkwrite-1393.
Head: f3b57c58a0.
The review will inspect the diff and source, without the author's report or result files. Product code will not change. Scratch checks will cover all 11 vector changes, same-date order, Assignment races and totals.

Independent bulkrev2 number review started on job/bulkwrite-1393. Head: f3b57c58a0063f9e0aacad45671ef27b07a5c855. The review will inspect the diff and source, without the author's report or result files. Product code will not change. Scratch checks will cover all 11 vector changes, same-date order, Assignment races and totals.
Author
Owner

Independent bulkrev2 review: a blocking totals counterexample remains at f3b57c58a.

Synthetic cents: cash income 20,000; assign 10,000 each to Groceries and Dining. Card Groceries purchase -10,000 on March 28; Dining purchase -10,000 on March 29. March 31 cash-to-Card payment 10,000 and Groceries refund +10,000. Card balance ends at 0 and cash at 10,000. The calculator returns Groceries Available 10,000 plus payment Available 10,000, Ready to Assign 0. The extra 10,000 persists into April. Expected payment Available is 0. The scratch regression uses the production core. Changing only the refund date to March 30 produces the correct total.

All 11 new vector reserves match the current §48 canonical Category-ID FIFO formula. Their old values follow the former file-order FIFO rule. This does not cover refunds of purchases already consumed by a payment.

Full findings and independent scratch evidence are in artifacts/bulkrev2-findings.md. Assignment race checks and requested gates are in progress. Product code is unchanged.

Independent bulkrev2 review: a blocking totals counterexample remains at f3b57c58a. Synthetic cents: cash income 20,000; assign 10,000 each to Groceries and Dining. Card Groceries purchase -10,000 on March 28; Dining purchase -10,000 on March 29. March 31 cash-to-Card payment 10,000 and Groceries refund +10,000. Card balance ends at 0 and cash at 10,000. The calculator returns Groceries Available 10,000 plus payment Available 10,000, Ready to Assign 0. The extra 10,000 persists into April. Expected payment Available is 0. The scratch regression uses the production core. Changing only the refund date to March 30 produces the correct total. All 11 new vector reserves match the current §48 canonical Category-ID FIFO formula. Their old values follow the former file-order FIFO rule. This does not cover refunds of purchases already consumed by a payment. Full findings and independent scratch evidence are in artifacts/bulkrev2-findings.md. Assignment race checks and requested gates are in progress. Product code is unchanged.
Author
Owner

Independent bulkrev2 follow-up:

The refund counterexample is now cross-checked against the actual origin/dev budget calculator (af202e151), compiled as a scratch module. The same source bytes put the March 31 refund before the March 31 payment. OLD: reserve 0, total Available 10,000 in March and April. NEW: reserve 10,000, total Available 20,000. Cash is 10,000 and Card is 0 in both. This is a demonstrated regression of a previously correct source order.

A separate medium boundary finding: M=9,007,199,254,740,991 synthetic cents. Income and Groceries Assignment M-1; same-day Checking Groceries -M, a Checking Split +1 with Groceries -1 and Dining +2, Checking Groceries +M refund, Card Dining -1. File order expense/split/refund/card rejects as outside exact range; expense/refund/split/card succeeds with Checking M, Card -1, Groceries Available M-2, Dining Available 1, reserve 1, Ready to Assign 0. The unsorted cash pre-pass overflows before cancellation. This is a supported-bound acceptance inconsistency, not stored corruption.

The 256 fixed-seed histories have identical complete month snapshots under Europe/Berlin, America/New_York and Pacific/Kiritimati. Review base: af202e1514. Required origin/dev merge reported Already up to date. First review-only commit: 4695540c3. Product code remains unchanged.

Independent bulkrev2 follow-up: The refund counterexample is now cross-checked against the actual origin/dev budget calculator (af202e151), compiled as a scratch module. The same source bytes put the March 31 refund before the March 31 payment. OLD: reserve 0, total Available 10,000 in March and April. NEW: reserve 10,000, total Available 20,000. Cash is 10,000 and Card is 0 in both. This is a demonstrated regression of a previously correct source order. A separate medium boundary finding: M=9,007,199,254,740,991 synthetic cents. Income and Groceries Assignment M-1; same-day Checking Groceries -M, a Checking Split +1 with Groceries -1 and Dining +2, Checking Groceries +M refund, Card Dining -1. File order expense/split/refund/card rejects as outside exact range; expense/refund/split/card succeeds with Checking M, Card -1, Groceries Available M-2, Dining Available 1, reserve 1, Ready to Assign 0. The unsorted cash pre-pass overflows before cancellation. This is a supported-bound acceptance inconsistency, not stored corruption. The 256 fixed-seed histories have identical complete month snapshots under Europe/Berlin, America/New_York and Pacific/Kiritimati. Review base: af202e1514955ddf0f8b4b3d2503c780d807ed84. Required origin/dev merge reported Already up to date. First review-only commit: 4695540c3. Product code remains unchanged.
Author
Owner

Final independent bulkrev2 report. Head: c8d278b00b

Independent bulkrev2 review of #1393

Reviewed head f3b57c58a0. Did not read author reports or result files. All amounts below are synthetic fixture cents.

Changed reference vectors: manual calculations

Each fixture assigns S = 1,000,000,000,000 cents to Food and to Dining. Let A be the Food purchase and full Food refund, B the Dining purchase, and P the payment. Canonical order is Dining purchase, Food purchase, payment, Food refund.

After the purchases the reserve is A+B. The payment first consumes min(B,P) from Dining and then min(A,max(P-B,0)) from Food. The full Food refund releases all remaining unpaid Food reserve. Thus the new reserve is max(B-P,0). Food Available is S, Dining Available is S-B, payment Available is the reserve, and Ready to Assign is -2S. Cash is -P, Card is P-B, Savings is 0. Uncovered debt is 0. These equations check every output number, not only the changed field.

Vector A B P Unpaid Food released OLD reserve NEW reserve = max(B-P,0) Verdict
07b33aa56ff97a67 13222722 108 13222755 75 75 0 NEW right; OLD excess reserve
08d823459b4f7555 1 1 1 1 1 0 NEW right; OLD excess reserve
10dad10f207e3966 13222722 1 13222722 1 1 0 NEW right; OLD excess reserve
217b597cc7b1b339 109170509 1000000000 110838733 109170509 998331776 889161267 NEW right; OLD excess reserve
3c10364db1d4cd46 109170509 1 109170509 1 1 0 NEW right; OLD excess reserve
405bf72849418ee7 28500 1 28500 1 1 0 NEW right; OLD excess reserve
5cd63c6abac2f757 103816 1 103816 1 1 0 NEW right; OLD excess reserve
70887b8579a61566 5789 1035233 55551 5789 985471 979682 NEW right; OLD excess reserve
aa06a27413c2238d 103816 454 103879 391 391 0 NEW right; OLD excess reserve
de05e2804212ba0e 5789 1 5789 1 1 0 NEW right; OLD excess reserve
f161754b530689ba 28500 8319 31192 5627 5627 0 NEW right; OLD excess reserve

The old outputs use Food-first file-order FIFO. They follow the old tie rule, but leave excess reserve after the full Food refund. For these fully funded fixtures, category Available plus Ready to Assign must equal cash plus any positive Card balance. The new reserve max(B-P,0) meets that equation; the old reserve exceeds it by OLD minus NEW. Thus all 11 NEW outputs are right and the OLD outputs are wrong under the envelope conservation rule as well as current FIFO. This is a visible tie-policy change that fixes these 11 fixtures, not a general fix for paid-purchase refunds. Labels and memos cannot change the new result; stable Category IDs can.

Totals equation

Severity: specification mismatch, not a merge blocker by itself. Input: cash income 10,000; assign 10,000 to Groceries; card purchase 10,000. Expected under the requested literal equation: category Available + Ready to Assign = signed on-budget balances. Actual: lhs 10,000 (payment reserve), rhs 0 (cash 10,000 + card -10,000). The funded-card invariant compares lhs with cash balances, excluding negative Card debt. Unfunded current-month credit deficits also need an explicit correction; imported Ready to Assign adjustments are another exception. A universal signed-account equation would contradict §48's payment-reserve model.

B1: paid-purchase refund duplicates Category money (BLOCK)

Severity: blocking number corruption. Source: budget.rs Card refund restores the full expense amount and releases only unpaid reserve. Canonical payment-before-refund does not make this safe when the payment already consumed the refunded purchase.

Inputs (synthetic cents): cash income 20,000 on March 1; assign Groceries 10,000 and Dining 10,000. Card Groceries purchase -10,000 on March 28, Dining purchase -10,000 on March 29. March 31 payment from cash to Card 10,000; March 31 Card Groceries refund +10,000. The older Groceries purchase is paid first.

Expected: cash 10,000, Card 0, total real money 10,000. Groceries Available 10,000 after refund; Dining Available 0; payment reserve 0. Ready to Assign 0. April carries only 10,000.

Actual: cash 10,000, Card 0, Groceries Available 10,000, Dining Available 0, payment reserve 10,000, Ready to Assign 0. March and April both show 20,000 Available against 10,000 cash. refund_payment_calendar_choice_is_visible_next_month reproduces this. Moving only the refund date to March 30 gives reserve 0 and correct totals. This counterexample works with zero Card debt, so the signed-account invariant caveat does not explain it.

The same-day phase is a visible policy choice: a refund credited before the payment on March 31 is still applied after it. No instant or time zone is available to recover intraday chronology. Calendar-date-only inputs need deterministic handling that also preserves total money. Existing unpaid-reserve-only refund rules leave this case unresolved. The policy does not shift transaction activity into another month, but the excess reserve rolls into April.

B1 baseline comparison: the same-day scratch writes the refund before the payment. The old stable date sort keeps that order, releases the unpaid Groceries reserve first, then consumes Dining reserve: correct 10,000 total Available. The new phase sort moves the payment before that refund and returns 20,000. Thus the new policy makes this previously correct source order wrong. The underlying paid-refund defect also exists in the old version when the payment is written before the refund.

N2: boundary acceptance still depends on same-date file order

Severity: medium; rejected input at an extreme supported value, no stored corruption. This alone does not block under the owner's odd-input rule, but the requested order-independence check fails at the bound.

Let M = 9,007,199,254,740,991 cents, the supported bound (not i64::MAX). March 1 income M-1 in Checking; assign Groceries M-1. All remaining rows are March 29: a Checking Groceries expense -M; a Checking Split parent +1 with Groceries -1 and Dining +2; a Checking Groceries refund +M; a Card Dining purchase -1.

Expected: both file orders return the same valid model. Canonical order keeps every posting value and total within the bound. Checking M, Card -1, Groceries Available M-2, Dining Available 1, payment Available 1, Ready to Assign 0.

Actual: expense, split, refund, card returns amount is outside the exact range; expense, refund, split, card returns the expected model. The unsorted monthly cash-activity pre-pass sums Groceries -M then -1 before +M and rejects. Sorting only the later posting pass does not fix acceptance. Reproduced by boundary_shuffle_reports_acceptance_difference.

The first exploratory boundary fixture failed in both orders due to canonical intermediate overflow. It was discarded as evidence. The mixed-sign split fixture above has one valid replay and one rejected replay.

Generated histories and time zones

The seeded property uses 256 histories, at most 60 rows each, four months per history, six posting forms (ordinary Card purchases/refunds, Card payments, cash transfers, Card splits, cash spending), and US/EU DST and month-edge dates: March 8, March 29, March 31, April 1, October 25 and November 1. It compares the original and shuffled complete month models with an explicitly sorted §48 baseline. Seed: 1393.

Berlin, New York and Kiritimati process time zones each passed all five scratch probes. The 256 complete-history snapshot digests and totals checks were identical across all three runs. Dates remain calendar dates. Each run checked all 1,024 generated month totals: 964 failed the literal signed-account equation and 716 differed from cash totals. These generated histories include underfunded payments, credit overspending and refunds, so those counts are observations, not 716 proven defects. The zero-debt, fully funded B1 fixture isolates a real conservation defect without those exceptions. A fully funded purchase-only fixture proves the requested signed-account equation cannot hold even in a correct Card model.

i64::MIN, i64::MAX and the two values just beyond ±MAX_EXACT are rejected both by the numeric constructor and by Markdown projection/replay. Supported ±MAX_EXACT round-trip exactly; N2 covers acceptance at the supported boundary.

The scratch probes record known failures as observations and return success when the witness is reproduced. Green probe results do not resolve B1 or N2.

Full totals for all 11 vector calculations

All amounts are synthetic cents. Savings and uncovered debt are 0 in each row. Food activity is 0; Dining activity is -B; payment activity is -P. Other marker Categories have 0 Available. Food and Dining each have Assignment 1,000,000,000,000; payment Assignment is 0. The payment Available appears in the reserve table above.

Vector Food Available Dining Available Ready to Assign Cash balance Card balance
07b33aa56ff97a67 1000000000000 999999999892 -2000000000000 -13222755 13222647
08d823459b4f7555 1000000000000 999999999999 -2000000000000 -1 0
10dad10f207e3966 1000000000000 999999999999 -2000000000000 -13222722 13222721
217b597cc7b1b339 1000000000000 999000000000 -2000000000000 -110838733 -889161267
3c10364db1d4cd46 1000000000000 999999999999 -2000000000000 -109170509 109170508
405bf72849418ee7 1000000000000 999999999999 -2000000000000 -28500 28499
5cd63c6abac2f757 1000000000000 999999999999 -2000000000000 -103816 103815
70887b8579a61566 1000000000000 999998964767 -2000000000000 -55551 -979682
aa06a27413c2238d 1000000000000 999999999546 -2000000000000 -103879 103425
de05e2804212ba0e 1000000000000 999999999999 -2000000000000 -5789 5788
f161754b530689ba 1000000000000 999999991681 -2000000000000 -31192 22873

Dynamic baseline proof: the scratch compiles the origin/dev budget module, with its imports pointed at the current codec/ledger (the ledger diff only adds ordering derives). For the refund-before-payment fixture, OLD reserve/total Available is 0/10,000; NEW is 10,000/20,000, in both March and April. Cash 10,000, Card 0. See artifacts/bulkrev2-baseline.log.

Assignment retry checks

Two and five requests start behind a barrier and use the production Assignment handler, real calternal-fs conditional writes and one shared Money writer handle. Each case also injects three initial conflicts before a successful fourth attempt. The saved October Assignment rows are checked against the final month model. September's seeded data stays in the file.

Requests Targets Successful requests Final Assigned sum October rows Result
2 neighbouring Categories 2 2,003 2 Every absolute target survives
2 same Category 2 1,001 1 One target from the final serial write
5 neighbouring Categories 5 5,015 5 Every absolute target survives
5 same Category 5 1,004 1 One target from the final serial write

Same-Category Assignments are absolute PUT targets, not increments. The final target is checked against the successful response with the largest revision; request start order does not define the winner. The sums above are the observed winners, not a required scheduling order. No target is added twice and no neighbour is lost.

Four injected source conflicts return exactly HTTP 409. Budget.md bytes and report revision stay unchanged. A queued fifth non-conflicting write is left for the next request, which successfully saves 1,234. The existing real stale-source retry test also runs in the requested full package gate; that check preserves another Category and unknown frontmatter.

Built and files

This review adds test probes and a report. It does not change product code, dependencies, lockfiles or existing test expectations. The author report and result files were not read.

  • crates/calternal-money/tests/review_bulkrev2/core.rs: seeded order property, raw monthly sums, supported-bound witness and paid-refund witness.
  • crates/calternal-money/tests/properties.rs: test-only module link and module comment. The probes reuse the existing fixture builders.
  • crates/plugins/money/src/review_bulkrev2.rs: two/five Assignment writers and exact four-conflict rejection.
  • crates/plugins/money/src/tests.rs: test-only module link and module comment. The probes reuse the real route fixtures and fault injector.
  • tests/money/bulkrev2-review.md: this independent report.

Reviewed product head: f3b57c58a0. Base: af202e1514. The required fetch and merge of origin/dev reported Already up to date. Test head: a1a2d6b290. The final issue comment gives the report commit SHA.

Known gaps

B1 remains in product code and blocks this review. N2 remains as a medium boundary-input inconsistency. Product fixes are outside this read-mostly job. The two defect witnesses intentionally record current results; they are review evidence, not assertions that the incorrect numbers are desired behavior.

The requested gate passed. Six pre-existing ignored tests remain unchanged: four performance/growth profiles and two isolated child tests. The parents execute the child checks. No web code changed, so no web build or UI screenshots were required. No web build output was created. No performance profile was added for this review-only work.

Initial exploratory checks did not supply valid evidence: one boundary fixture rejected in both orders; a probe used unwrap_err on a success type without Debug; and a queued Cargo invocation retained a scratch file name after it moved. The fixture, probe and test layout were corrected. The completed final gates below use the final source layout. No existing expectation was changed.

Decisions

No product design decision was made. Same-Category Assignment calls were reviewed as absolute PUT targets, as the API declares; serial application means the final committed target wins, not the sum of targets. The largest successful response revision identifies that final write. Seed 1393 makes the three time-zone runs comparable. The literal signed-account equation was checked and reported, without changing the payment-reserve rules to force it to hold.

Verification

Environment for Cargo commands: CARGO_PROFILE_DEV_DEBUG=line-tables-only, CARGO_INCREMENTAL=0, CARGO_BUILD_JOBS=4, TMPDIR set to this worktree's target/tmp. CARGO_TARGET_DIR was left at its preset value.

cargo fmt --check: exit 0, no output.

cargo clippy -p calternal-money --all-targets -- -D warnings: exit 0. Final output line, verbatim:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 11m 22s

cargo clippy -p calternal-plugin-money --all-targets -- -D warnings: exit 0. Final output line, verbatim:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 5m 30s

cargo test -p calternal-money -p calternal-plugin-money -- --test-threads=4: exit 0. Complete output, verbatim:

    Blocking waiting for file lock on build directory
sccache: warning: The server looks like it shut down unexpectedly, compiling locally instead
sccache: warning: The server looks like it shut down unexpectedly, compiling locally instead
sccache: warning: The server looks like it shut down unexpectedly, compiling locally instead
sccache: warning: The server looks like it shut down unexpectedly, compiling locally instead
   Compiling calternal-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-money)
    Finished `test` profile [unoptimized + debuginfo] target(s) in 5m 14s
     Running unittests src/lib.rs (/home/kayg/build/targets/bulkrev2/debug/deps/calternal_money-5ad27f9b5c008064)

running 16 tests
test codec::tests::empty_payee_is_refused_by_the_writer ... ok
test codec::tests::property_edit_changes_one_value ... ok
test codec::tests::transaction_round_trip_with_punctuation_in_labels_and_payee ... ok
test codec::tests::round_trip_keeps_bom_crlf_and_unknown_bytes ... ok
test edit::tests::cleared_tag_toggles_without_touching_other_tags ... ok
test edit::tests::crlf_file_keeps_crlf_on_insert ... ok
test codec::tests::malformed_dated_rows_fail_instead_of_vanishing ... ok
test codec::tests::checked_parse_stops_after_a_bounded_line_batch ... ok
test edit::tests::unicode_payee_tag_boundaries_match_shared_vectors ... ok
test units::tests::exact_range_is_enforced_on_parse_and_arithmetic ... ok
test units::tests::format_uses_explicit_sign_and_exact_scale ... ok
test units::independent_number_review::signed_edges_and_long_zero_padding_keep_exact_minor_units ... ok
test units::tests::scale_table_has_all_165_codes_with_unique_entries ... ok
test units::tests::parse_matches_the_oracle_examples ... ok
test edit::tests::new_budget_projects_with_no_accounts ... ok
test edit::tests::assign_inserts_updates_and_removes_rows ... ok

test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s

     Running tests/account_kinds.rs (/home/kayg/build/targets/bulkrev2/debug/deps/account_kinds-40f136ace82559dd)

running 4 tests
test account_projection_rejects_legacy_and_unknown_kinds ... ok
test categorized_debit_loan_transfers_post_one_budget_leg ... ok
test off_budget_balance_marker_does_not_change_budget_money ... ok
test imported_account_kinds_project_without_losing_identity ... ok

test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s

     Running tests/import.rs (/home/kayg/build/targets/bulkrev2/debug/deps/import-32258f8fda96f336)

running 13 tests
test duplicate_source_ids_are_rejected_and_duplicate_names_are_kept ... ok
test import_render_is_exact_and_byte_stable ... ok
test import_render_reports_progress_and_propagates_cancel ... ok
test import_replay_matches_full_ledger_month_by_month ... ok
test import_keeps_same_day_source_order_for_credit_payments_and_refunds ... ok
test production_v1_metadata_upgrade_keeps_balances ... ok
test import_stream_renderer_matches_full_rendered_files ... ok
test recheck_half_minor_units_negative_zero_and_nineteen_digits ... ok
test budget_replay_stops_at_a_bounded_transaction_checkpoint ... ok
test imported_ready_to_assign_matches_independent_month_oracle ... ok
test recheck_same_day_payment_and_refund_keep_source_fifo ... ok
test random_imports_conserve_source_balances_and_markdown ... ok
test recheck_random_multicurrency_ledgers_match_all_monthly_totals ... ok

test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 12.54s

     Running tests/properties.rs (/home/kayg/build/targets/bulkrev2/debug/deps/properties-9ff9e71a800dacb8)

running 19 tests
test bill_coverage_never_clamps_the_bill ... ok
test bulkrev2::i64_extremes_are_rejected_and_safe_bound_is_exact ... ok
test bulkrev2::literal_account_sum_and_funded_card_conservation ... ok
test bulkrev2::refund_payment_calendar_choice_is_visible_next_month ... ok
test bulkrev2::boundary_shuffle_reports_acceptance_difference ... ok
test any_text_that_parses_serializes_to_the_same_bytes ... ok
test decimal_text_round_trips_for_every_scale ... ok
test assign_then_unassign_is_the_identity ... ok
test fully_funded_card_spending_conserves_cash ... ok
test money_code_never_uses_floating_point ... ok
test paired_write_replay_matches_independent_calculations ... ok
test cash_ledgers_conserve_money_every_month ... ok
test reviewed_burst_order_matches_input_order ... ok
test mixed_cash_credit_deficit_rolls_only_its_cash_part ... ok
test split_legs_post_exactly_the_parent ... ok
test transaction_rows_round_trip_byte_for_byte ... ok
test partial_payment_then_category_refunds_conserve_cash_across_months ... ok
test same_date_card_postings_are_a_function_of_the_set ... ok
test bulkrev2::same_day_shuffles_cover_splits_transfers_and_month_edges ... ok

test result: ok. 19 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.54s

     Running tests/ready_to_assign_adjustment.rs (/home/kayg/build/targets/bulkrev2/debug/deps/ready_to_assign_adjustment-0e1c5c7276d14077)

running 1 test
test ready_to_assign_adjustment_changes_only_the_budget_pool ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s

     Running tests/review_984.rs (/home/kayg/build/targets/bulkrev2/debug/deps/review_984-dc85183370c2f07a)

running 5 tests
test review_pair_performance_profile ... ignored, performance measurements belong to the merge round on the perf VM
test review_pair_rejects_bad_months_and_amounts_without_rounding ... ok
test review_split_remainders_and_tracking_transfers_are_exact ... ok
test review_mixed_pair_matches_independent_replays ... ok
test review_large_ledger_pair_keeps_exact_totals ... ok

test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 4.19s

     Running tests/vectors.rs (/home/kayg/build/targets/bulkrev2/debug/deps/vectors-b0e2a54af0711cc9)

running 2 tests
test rust_matches_random_oracle_ledgers_without_divergences ... ok
test rust_port_matches_every_recorded_oracle_vector ... ok

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.42s

     Running unittests src/lib.rs (/home/kayg/build/targets/bulkrev2/debug/deps/calternal_plugin_money-3d165b6d3890a332)

running 135 tests
test import::import_review_tests::actual_cc_label_requires_missing_type_confirmation ... ok
test import::import_review_tests::actual_orphan_split_children_are_rejected ... ok
test import::import_review_tests::actual_stream_memory_guard_child ... ignored, invoked as an isolated child by actual_stream_keeps_a_large_history_bounded
test import::import_review_tests::actual_transfer_legs_cannot_cross_months ... ok
test import::import_review_tests::import_control_reports_progress_and_stops_cancelled_work ... ok
test import::import_review_tests::actual_account_checks_use_raw_monthly_source_rows ... ok
test import::import_review_tests::actual_cents_conversion_never_rounds ... ok

running 1 test
test import::import_review_tests::ynab_transfer_pairing_handles_many_duplicate_legs ... ok
test import_fidelity_1130::independent_split_and_transfer_numbers_check ... ok
test routes::durable::admission_tests::cancelled_receiver_cannot_acknowledge_a_durable_job ... ok
test routes::durable::checkpoint_tests::progress_wait_keeps_parser_writer_release_polled ... ok
test import_fidelity_1130::actual_rows_round_trip ... ok
test routes::import_cleanup_tests::dropped_preview_worker_retains_admission_until_exit ... ok
test routes::import_cleanup_tests::idle_imports_are_reclaimed_by_expiry_cleanup ... ok
test routes::import_cleanup_tests::staged_import_files_keep_ranges_and_release_private_storage ... ok
test routes::import_staged_path_tests::staged_import_name_cannot_select_another_path_or_slot ... ok
test routes::durable::admission_tests::live_publication_honors_operational_queue_cancellation ... ok
test routes::replay_reuse_tests::crossings_cover_source_ranges_relative_to_today ... ok
test routes::replay_reuse_tests::crossings_reuse_checked_current_totals_even_with_future_months ... ok
test routes::replay_reuse_tests::assignment_retry_rebuilds_from_latest_source_bytes ... ok
test routes::review_1140::cancel_wins_before_publication_lock ... ok
test routes::review_1140::cancel_does_not_rewrite_published_result ... ok
test routes::durable::money_import_undo_mutation ... ok
test routes::review_1140::review1140_cancel_after_rename_before_receipt_keeps_publication ... ok
test routes::review_1140::review1140_all_formats_replay_exact_balances ... ok
test routes::review_1140::review1140_operational_cancel_before_replacement_returns_no_receipt ... ok
test routes::review_1140::review1140_discard_after_confirmation_failure_releases_admission ... ok
test routes::review_1140::review1140_tcp_malformed_inputs_leave_worker_usable ... ok
test routes::review_1140::review1140_staged_size_limits_fail_without_publishing ... ok
test store::parsed_cache_tests::global_budget_and_folder_pruning_release_stale_entries ... ok
test store::parsed_cache_tests::parse_charge_accounts_for_line_structures ... ok
test store::parsed_cache_tests::user_cache_evicts_old_parse_entries_and_shares_hot_documents ... ok
test routes::review_1140::review1140_terminal_receipts_do_not_block_new_imports ... ok
test tests::a_broken_file_is_reported_not_hidden ... ok
test tests::a_new_user_sees_the_real_empty_state ... ok
test tests::a_journal_for_a_completed_move_changes_nothing ... ok
test routes::review_1140::review1140_replacement_receipt_recovery_does_not_adopt_later_edits ... ok
test tests::active_money_handle_survives_other_users_cache_pressure ... ok
test tests::actual_duplicate_names_import_by_id_without_sharing_a_payment_category ... ok
test tests::actual_export_archive_imports_exact_rows_from_private_scratch ... ok
test tests::a_read_waits_for_a_write_in_progress ... ok
test tests::api_account_numbers_equal_core_replay ... ok
test tests::a_split_row_written_by_hand_is_read_but_not_edited ... ok
test tests::assignments_retry_source_conflicts_without_losing_neighbours ... ok
test tests::backdated_create_emits_current_month_overspend_crossing ... ok
test tests::budget_flow_writes_exact_markdown_and_derives_available ... ok
test tests::bulk_write_invalid_neighbours_do_not_change_valid_rows ... ok
test tests::bulk_write_month_does_not_need_note_date_backfill ... ok
test tests::cancel_racing_confirm_has_one_consistent_outcome ... ok
test tests::cancelling_imports_leaves_no_budget_and_releases_slots ... ok
test tests::bulk_write_rejects_intermediate_overflow ... ok
test tests::concurrent_store_edits_keep_exactly_one_winner ... ok
test tests::csv_import_keeps_progress_and_cancel_responsive ... ok
test tests::delete_transaction_emits_current_month_overspend_crossing ... ok
test import::import_review_tests::actual_stream_keeps_a_large_history_bounded has been running for over 60 seconds
test import::import_review_tests::actual_stream_memory_guard_child has been running for over 60 seconds
test tests::denied_preview_access_keeps_the_owners_pending_import ... ok
test import::import_review_tests::actual_stream_memory_guard_child ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 134 filtered out; finished in 69.81s

test import::import_review_tests::actual_stream_keeps_a_large_history_bounded ... ok
test tests::durable_import_tests::operation_exit_child ... ignored, child of operation_recovery_survives_process_exit_at_every_phase
test tests::bulk_write_balances_equal_one_by_one has been running for over 60 seconds
test tests::durable_import_tests::operation_recovery_survives_process_exit_at_every_phase ... ok
test tests::durable_import_tests::publication_and_inverse_authority_use_full_commits ... ok
test tests::durable_import_tests::generated_import_confirm_replay_and_undo_preserve_minor_units ... ok
test tests::durable_import_tests::receipt_reads_are_bounded_and_old_receipts_are_addressable ... ok
test tests::durable_import_tests::queued_import_and_undo_survive_restarts ... ok
test tests::durable_import_tests::replay_preserves_a_live_ready_preview ... ok
test tests::durable_import_tests::running_jobs_do_not_expire_and_cancelled_jobs_do_not_restart ... ok
test tests::card_models_ignore_arrival_batch_and_timezone has been running for over 60 seconds
test tests::durable_import_tests::undo_receipt_replay_never_removes_a_restored_import ... ok
test tests::durable_import_tests::undo_refuses_a_predecessor_restored_before_the_inverse ... ok
test tests::durable_import_tests::undo_refuses_every_later_budget_edit_after_restart ... ok
test tests::durable_import_tests::undo_restarts_before_and_after_the_filesystem_inverse ... ok
test tests::failed_cross_month_move_never_counts_the_row_twice ... ok
test tests::far_month_assignment_cannot_make_the_budget_unreadable ... ok
test tests::gap_month_assignments_and_opening_card_debt_do_not_create_cash ... ok
test tests::historical_overspend_does_not_emit_current_month_event ... ok
test tests::hostile_inputs_are_rejected_without_writing ... ok
test tests::idle_import_receive_releases_admission_and_cancel_stops_read ... ok
test tests::import_fidelity_review_requires_account_kind_and_keeps_notes ... ok
test tests::import_file_limits_match_the_money_reader ... ok
test tests::import_preview_is_owner_bound_and_confirmation_publishes_once ... ok
test tests::import_preview_reads_only_generated_staged_upload_names ... ok
test tests::durable_import_tests::replacement_restarts_at_every_durable_phase ... ok
test tests::memo_and_tags_split_the_payee_without_losing_text ... ok
test tests::money_is_on_for_the_instance_and_off_for_a_new_user ... ok
test tests::inferred_opening_balance_needs_explicit_confirmation ... ok
test tests::month_revision_increases_after_each_assignment ... ok
test tests::move_money_keeps_ready_to_assign_and_card_gets_payment_category ... ok
test tests::multiple_assignment_rows_set_one_exact_total ... ok
test tests::other_users_and_sessions_without_data_scope_see_nothing ... ok
test tests::overflowing_category_sum_is_rejected_before_assignment_write ... ok
test tests::overflowing_cleared_subset_is_rejected_before_transaction_write ... ok
test tests::overflowing_derived_balance_is_rejected_before_the_write ... ok
test tests::overspending_reports_ynab_states ... ok
test tests::plugin_code_never_uses_floating_point ... ok
test tests::parsed_money_cache_shares_documents_and_prunes_removed_months ... ok
test tests::recheck_metadata_files_use_the_reader_size_cap ... ok
test tests::recheck_local_server_number_and_lifecycle_contract ... ok
test tests::recheck_source_checks_owner_and_opening_balance_confirmation ... ok
test tests::review_1130::review1130_cancel_after_partial_preparation ... ok
test tests::recheck_random_preview_cancellation_leaves_no_files ... ok
test tests::review_1130::review1130_legacy_home_needs_no_metadata_rewrite ... ok
test tests::review_1130::review1130_notes_are_inert ... ok
test tests::review_1130::review1130_long_imported_note_allows_amount_edit_without_loss ... ok
test tests::review_1130::review1130_reconciled_closed_balances ... ok
test tests::review_1130::review1130_split_and_closed_transfer_have_one_posting ... ok
test tests::review_984::review3_first_future_transaction_keeps_current_event_month ... ok
test tests::review_1130::review1130_tcp_locks_reimport_and_cancel ... ok
test tests::review_984::review3_future_only_edit_and_delete_keep_current_event_month ... ok
test tests::review_984::review3_outside_current_range_writes_emit_no_overspend ... ok
test tests::review_984::review_category_edit_emits_for_old_category_only ... ok
test tests::review_984::review_concurrent_assign_revisions_match_final_report ... ok
test tests::review_984::review_cross_month_refund_move_emits_current_crossing ... ok
test tests::review_984::review_file_replacement_advances_month_revision ... ok
test tests::review_984::review_exact_zero_healing_recrossing_and_delete ... ok
test tests::review_984::review_split_and_tracking_transfer_writes_are_rejected_without_events ... ok
test tests::review_984::review_user_zone_month_and_year_edges ... ok
test tests::review_984::review_source_generation_tracks_all_files_and_restoration ... ok
test tests::review_bulkrev2::four_conflicts_return_409_without_writing ... ok
test tests::same_handle_settles_a_failed_move_before_the_next_request ... ok
test tests::simultaneous_import_confirmations_have_one_winner ... ok
test tests::review_bulkrev2::two_and_five_assignment_races_match_serial_targets ... ok
test tests::source_total_mismatch_cannot_be_confirmed ... ok
test tests::transaction_identity_preview_is_atomic_and_reimport_changes_nothing ... ok
test tests::transaction_logged_event_has_the_documented_create_payload ... ok
test tests::slow_15mb_import_receive_completes_with_progress ... ok
test tests::transfer_register_view_exposes_linked_category ... ok
test tests::transfer_cleared_edits_are_per_account ... ok
test tests::wizard_background_job_recovers_preview_after_response_is_dropped ... ok
test tests::wizard_background_job_retains_safe_failure ... ok
test tests::wizard_starter_categories_validate_before_create_and_do_not_change_totals ... ok
test tests::ynab_conflicting_accounts_and_payees_are_not_silently_discarded ... ok
test tests::ynab_csv_import_keeps_exact_month_and_register_amounts ... ok
test tests::ynab_duplicate_category_ids_are_merged_only_when_identical ... ok
test tests::ynab_plan_json_import_keeps_exact_milliunits ... ok
test tests::ynab_public_demo_imports_duplicate_category_names_by_id ... ok
test tests::update_transaction_emits_current_month_overspend_crossing ... ok
test tests::bulk_write_balances_equal_one_by_one ... ok
test tests::card_models_ignore_arrival_batch_and_timezone ... ok

test result: ok. 133 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 1151.67s

     Running tests/import_review.rs (/home/kayg/build/targets/bulkrev2/debug/deps/import_review-6a0b9e5006b57cbf)

running 32 tests
test corrupt_actual_database_is_a_private_error ... ok
test csv_bom_mixed_endings_and_decimal_comma_are_exact ... ok
test csv_transaction_ids_merge_or_reject_before_totals ... ok
test identity_csv_transfer_growth_curve ... ignored, run with MONEY_IDENT_CSV_ROWS for 10k/100k/1M transfer profiling
test csv_amount_edges_never_round_group_or_overflow ... ok
test recheck_actual_stream_growth_curve ... ignored, run with MONEY_RECHECK_ARCHIVE and MONEY_RECHECK_ROWS for profiling
test recheck_conflicting_transaction_ids_are_rejected ... ok
test recheck_csv_transfer_growth_curve ... ignored, run with MONEY_RECHECK_TRANSFERS for the bounded CSV growth probe
test recheck_e2e_csv_has_four_checks_and_keeps_every_minor_unit ... ok
test recheck_identical_transaction_ids_do_not_double_money ... ok
test recheck_reconciled_negative_zero_and_exact_source_scales ... ok
test split_identity_cannot_reuse_a_top_level_id ... ok
test split_identity_concrete_valid_totals ... ok
test split_identity_includes_parent_deleted_and_transfer_fields ... ok
test csv_pairing_accepts_cancellation_during_its_loop ... ok
test split_identity_rejects_an_inconsistent_embedded_parent ... ok
test split_identity_review_cases_reject ... ok
test transaction_identity_checks_fields_and_keeps_distinct_ids ... ok
test split_identity_merges_before_totals ... ok
test transfer_legs_prefer_a_same_month_mate ... ok
test transfer_month_identity_rejects_in_both_adapters ... ok
test transaction_identity_preserves_exact_units ... ok
test transfer_month_review_cases_reject ... ok
test unmatched_transfer_legs_keep_the_source_register ... ok
test ynab_account_check_rejects_a_wrong_normalization ... ok
test ynab_csv_preserves_exact_minor_units ... ok
test csv_pairing_keeps_exact_account_legs ... ok
test ynab_negative_zero_amount_is_zero ... ok
test ynab_unrepresentable_milliunits_are_rejected ... ok
test transfer_month_pairing_keeps_dates_and_exact_pair_priority ... ok
test ynab_json_keeps_exact_split_and_transfer_postings ... ok
test raw_ynab_registers_match_a_raw_row_oracle ... ok

test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 12.71s

   Doc-tests calternal_money

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

   Doc-tests calternal_plugin_money

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

Focused Assignment output and all 1,024 generated month sums are kept in artifacts/bulkrev2-assignment-final.log and artifacts/bulkrev2-month-totals.jsonl. Time-zone snapshot evidence is in artifacts/bulkrev2-core-{berlin,new-york,kiritimati}.log. The dynamic OLD/NEW comparison is in artifacts/bulkrev2-baseline.log. Review artifacts are not committed.

BLOCK — B1: paid-purchase refunds duplicate payment reserve and carry excess Available into the next month.

Final independent bulkrev2 report. Head: c8d278b00b845a905efca659b49463323e2ad0e1 # Independent bulkrev2 review of #1393 Reviewed head f3b57c58a0063f9e0aacad45671ef27b07a5c855. Did not read author reports or result files. All amounts below are synthetic fixture cents. ## Changed reference vectors: manual calculations Each fixture assigns S = 1,000,000,000,000 cents to Food and to Dining. Let A be the Food purchase and full Food refund, B the Dining purchase, and P the payment. Canonical order is Dining purchase, Food purchase, payment, Food refund. After the purchases the reserve is A+B. The payment first consumes min(B,P) from Dining and then min(A,max(P-B,0)) from Food. The full Food refund releases all remaining unpaid Food reserve. Thus the new reserve is max(B-P,0). Food Available is S, Dining Available is S-B, payment Available is the reserve, and Ready to Assign is -2S. Cash is -P, Card is P-B, Savings is 0. Uncovered debt is 0. These equations check every output number, not only the changed field. | Vector | A | B | P | Unpaid Food released | OLD reserve | NEW reserve = max(B-P,0) | Verdict | | --- | ---: | ---: | ---: | ---: | ---: | ---: | --- | | 07b33aa56ff97a67 | 13222722 | 108 | 13222755 | 75 | 75 | 0 | NEW right; OLD excess reserve | | 08d823459b4f7555 | 1 | 1 | 1 | 1 | 1 | 0 | NEW right; OLD excess reserve | | 10dad10f207e3966 | 13222722 | 1 | 13222722 | 1 | 1 | 0 | NEW right; OLD excess reserve | | 217b597cc7b1b339 | 109170509 | 1000000000 | 110838733 | 109170509 | 998331776 | 889161267 | NEW right; OLD excess reserve | | 3c10364db1d4cd46 | 109170509 | 1 | 109170509 | 1 | 1 | 0 | NEW right; OLD excess reserve | | 405bf72849418ee7 | 28500 | 1 | 28500 | 1 | 1 | 0 | NEW right; OLD excess reserve | | 5cd63c6abac2f757 | 103816 | 1 | 103816 | 1 | 1 | 0 | NEW right; OLD excess reserve | | 70887b8579a61566 | 5789 | 1035233 | 55551 | 5789 | 985471 | 979682 | NEW right; OLD excess reserve | | aa06a27413c2238d | 103816 | 454 | 103879 | 391 | 391 | 0 | NEW right; OLD excess reserve | | de05e2804212ba0e | 5789 | 1 | 5789 | 1 | 1 | 0 | NEW right; OLD excess reserve | | f161754b530689ba | 28500 | 8319 | 31192 | 5627 | 5627 | 0 | NEW right; OLD excess reserve | The old outputs use Food-first file-order FIFO. They follow the old tie rule, but leave excess reserve after the full Food refund. For these fully funded fixtures, category Available plus Ready to Assign must equal cash plus any positive Card balance. The new reserve max(B-P,0) meets that equation; the old reserve exceeds it by OLD minus NEW. Thus all 11 NEW outputs are right and the OLD outputs are wrong under the envelope conservation rule as well as current FIFO. This is a visible tie-policy change that fixes these 11 fixtures, not a general fix for paid-purchase refunds. Labels and memos cannot change the new result; stable Category IDs can. ## Totals equation Severity: specification mismatch, not a merge blocker by itself. Input: cash income 10,000; assign 10,000 to Groceries; card purchase 10,000. Expected under the requested literal equation: category Available + Ready to Assign = signed on-budget balances. Actual: lhs 10,000 (payment reserve), rhs 0 (cash 10,000 + card -10,000). The funded-card invariant compares lhs with cash balances, excluding negative Card debt. Unfunded current-month credit deficits also need an explicit correction; imported Ready to Assign adjustments are another exception. A universal signed-account equation would contradict §48's payment-reserve model. ## B1: paid-purchase refund duplicates Category money (BLOCK) Severity: blocking number corruption. Source: `budget.rs` Card refund restores the full expense amount and releases only unpaid reserve. Canonical payment-before-refund does not make this safe when the payment already consumed the refunded purchase. Inputs (synthetic cents): cash income 20,000 on March 1; assign Groceries 10,000 and Dining 10,000. Card Groceries purchase -10,000 on March 28, Dining purchase -10,000 on March 29. March 31 payment from cash to Card 10,000; March 31 Card Groceries refund +10,000. The older Groceries purchase is paid first. Expected: cash 10,000, Card 0, total real money 10,000. Groceries Available 10,000 after refund; Dining Available 0; payment reserve 0. Ready to Assign 0. April carries only 10,000. Actual: cash 10,000, Card 0, Groceries Available 10,000, Dining Available 0, payment reserve 10,000, Ready to Assign 0. March and April both show 20,000 Available against 10,000 cash. `refund_payment_calendar_choice_is_visible_next_month` reproduces this. Moving only the refund date to March 30 gives reserve 0 and correct totals. This counterexample works with zero Card debt, so the signed-account invariant caveat does not explain it. The same-day phase is a visible policy choice: a refund credited before the payment on March 31 is still applied after it. No instant or time zone is available to recover intraday chronology. Calendar-date-only inputs need deterministic handling that also preserves total money. Existing unpaid-reserve-only refund rules leave this case unresolved. The policy does not shift transaction activity into another month, but the excess reserve rolls into April. B1 baseline comparison: the same-day scratch writes the refund before the payment. The old stable date sort keeps that order, releases the unpaid Groceries reserve first, then consumes Dining reserve: correct 10,000 total Available. The new phase sort moves the payment before that refund and returns 20,000. Thus the new policy makes this previously correct source order wrong. The underlying paid-refund defect also exists in the old version when the payment is written before the refund. ## N2: boundary acceptance still depends on same-date file order Severity: medium; rejected input at an extreme supported value, no stored corruption. This alone does not block under the owner's odd-input rule, but the requested order-independence check fails at the bound. Let M = 9,007,199,254,740,991 cents, the supported bound (not i64::MAX). March 1 income M-1 in Checking; assign Groceries M-1. All remaining rows are March 29: a Checking Groceries expense -M; a Checking Split parent +1 with Groceries -1 and Dining +2; a Checking Groceries refund +M; a Card Dining purchase -1. Expected: both file orders return the same valid model. Canonical order keeps every posting value and total within the bound. Checking M, Card -1, Groceries Available M-2, Dining Available 1, payment Available 1, Ready to Assign 0. Actual: expense, split, refund, card returns `amount is outside the exact range`; expense, refund, split, card returns the expected model. The unsorted monthly cash-activity pre-pass sums Groceries -M then -1 before +M and rejects. Sorting only the later posting pass does not fix acceptance. Reproduced by `boundary_shuffle_reports_acceptance_difference`. The first exploratory boundary fixture failed in both orders due to canonical intermediate overflow. It was discarded as evidence. The mixed-sign split fixture above has one valid replay and one rejected replay. ## Generated histories and time zones The seeded property uses 256 histories, at most 60 rows each, four months per history, six posting forms (ordinary Card purchases/refunds, Card payments, cash transfers, Card splits, cash spending), and US/EU DST and month-edge dates: March 8, March 29, March 31, April 1, October 25 and November 1. It compares the original and shuffled complete month models with an explicitly sorted §48 baseline. Seed: 1393. Berlin, New York and Kiritimati process time zones each passed all five scratch probes. The 256 complete-history snapshot digests and totals checks were identical across all three runs. Dates remain calendar dates. Each run checked all 1,024 generated month totals: 964 failed the literal signed-account equation and 716 differed from cash totals. These generated histories include underfunded payments, credit overspending and refunds, so those counts are observations, not 716 proven defects. The zero-debt, fully funded B1 fixture isolates a real conservation defect without those exceptions. A fully funded purchase-only fixture proves the requested signed-account equation cannot hold even in a correct Card model. i64::MIN, i64::MAX and the two values just beyond ±MAX_EXACT are rejected both by the numeric constructor and by Markdown projection/replay. Supported ±MAX_EXACT round-trip exactly; N2 covers acceptance at the supported boundary. The scratch probes record known failures as observations and return success when the witness is reproduced. Green probe results do not resolve B1 or N2. ## Full totals for all 11 vector calculations All amounts are synthetic cents. Savings and uncovered debt are 0 in each row. Food activity is 0; Dining activity is -B; payment activity is -P. Other marker Categories have 0 Available. Food and Dining each have Assignment 1,000,000,000,000; payment Assignment is 0. The payment Available appears in the reserve table above. | Vector | Food Available | Dining Available | Ready to Assign | Cash balance | Card balance | | --- | ---: | ---: | ---: | ---: | ---: | | 07b33aa56ff97a67 | 1000000000000 | 999999999892 | -2000000000000 | -13222755 | 13222647 | | 08d823459b4f7555 | 1000000000000 | 999999999999 | -2000000000000 | -1 | 0 | | 10dad10f207e3966 | 1000000000000 | 999999999999 | -2000000000000 | -13222722 | 13222721 | | 217b597cc7b1b339 | 1000000000000 | 999000000000 | -2000000000000 | -110838733 | -889161267 | | 3c10364db1d4cd46 | 1000000000000 | 999999999999 | -2000000000000 | -109170509 | 109170508 | | 405bf72849418ee7 | 1000000000000 | 999999999999 | -2000000000000 | -28500 | 28499 | | 5cd63c6abac2f757 | 1000000000000 | 999999999999 | -2000000000000 | -103816 | 103815 | | 70887b8579a61566 | 1000000000000 | 999998964767 | -2000000000000 | -55551 | -979682 | | aa06a27413c2238d | 1000000000000 | 999999999546 | -2000000000000 | -103879 | 103425 | | de05e2804212ba0e | 1000000000000 | 999999999999 | -2000000000000 | -5789 | 5788 | | f161754b530689ba | 1000000000000 | 999999991681 | -2000000000000 | -31192 | 22873 | Dynamic baseline proof: the scratch compiles the origin/dev budget module, with its imports pointed at the current codec/ledger (the ledger diff only adds ordering derives). For the refund-before-payment fixture, OLD reserve/total Available is 0/10,000; NEW is 10,000/20,000, in both March and April. Cash 10,000, Card 0. See artifacts/bulkrev2-baseline.log. ## Assignment retry checks Two and five requests start behind a barrier and use the production Assignment handler, real calternal-fs conditional writes and one shared Money writer handle. Each case also injects three initial conflicts before a successful fourth attempt. The saved October Assignment rows are checked against the final month model. September's seeded data stays in the file. | Requests | Targets | Successful requests | Final Assigned sum | October rows | Result | | --- | --- | ---: | ---: | ---: | --- | | 2 | neighbouring Categories | 2 | 2,003 | 2 | Every absolute target survives | | 2 | same Category | 2 | 1,001 | 1 | One target from the final serial write | | 5 | neighbouring Categories | 5 | 5,015 | 5 | Every absolute target survives | | 5 | same Category | 5 | 1,004 | 1 | One target from the final serial write | Same-Category Assignments are absolute PUT targets, not increments. The final target is checked against the successful response with the largest revision; request start order does not define the winner. The sums above are the observed winners, not a required scheduling order. No target is added twice and no neighbour is lost. Four injected source conflicts return exactly HTTP 409. Budget.md bytes and report revision stay unchanged. A queued fifth non-conflicting write is left for the next request, which successfully saves 1,234. The existing real stale-source retry test also runs in the requested full package gate; that check preserves another Category and unknown frontmatter. ## Built and files This review adds test probes and a report. It does not change product code, dependencies, lockfiles or existing test expectations. The author report and result files were not read. - `crates/calternal-money/tests/review_bulkrev2/core.rs`: seeded order property, raw monthly sums, supported-bound witness and paid-refund witness. - `crates/calternal-money/tests/properties.rs`: test-only module link and module comment. The probes reuse the existing fixture builders. - `crates/plugins/money/src/review_bulkrev2.rs`: two/five Assignment writers and exact four-conflict rejection. - `crates/plugins/money/src/tests.rs`: test-only module link and module comment. The probes reuse the real route fixtures and fault injector. - `tests/money/bulkrev2-review.md`: this independent report. Reviewed product head: f3b57c58a0063f9e0aacad45671ef27b07a5c855. Base: af202e1514955ddf0f8b4b3d2503c780d807ed84. The required fetch and merge of origin/dev reported `Already up to date.` Test head: a1a2d6b29065bf03f986b021a5db55af7a2b6c1d. The final issue comment gives the report commit SHA. ## Known gaps B1 remains in product code and blocks this review. N2 remains as a medium boundary-input inconsistency. Product fixes are outside this read-mostly job. The two defect witnesses intentionally record current results; they are review evidence, not assertions that the incorrect numbers are desired behavior. The requested gate passed. Six pre-existing ignored tests remain unchanged: four performance/growth profiles and two isolated child tests. The parents execute the child checks. No web code changed, so no web build or UI screenshots were required. No web build output was created. No performance profile was added for this review-only work. Initial exploratory checks did not supply valid evidence: one boundary fixture rejected in both orders; a probe used unwrap_err on a success type without Debug; and a queued Cargo invocation retained a scratch file name after it moved. The fixture, probe and test layout were corrected. The completed final gates below use the final source layout. No existing expectation was changed. ## Decisions No product design decision was made. Same-Category Assignment calls were reviewed as absolute PUT targets, as the API declares; serial application means the final committed target wins, not the sum of targets. The largest successful response revision identifies that final write. Seed 1393 makes the three time-zone runs comparable. The literal signed-account equation was checked and reported, without changing the payment-reserve rules to force it to hold. ## Verification Environment for Cargo commands: CARGO_PROFILE_DEV_DEBUG=line-tables-only, CARGO_INCREMENTAL=0, CARGO_BUILD_JOBS=4, TMPDIR set to this worktree's target/tmp. CARGO_TARGET_DIR was left at its preset value. `cargo fmt --check`: exit 0, no output. `cargo clippy -p calternal-money --all-targets -- -D warnings`: exit 0. Final output line, verbatim: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 11m 22s ``` `cargo clippy -p calternal-plugin-money --all-targets -- -D warnings`: exit 0. Final output line, verbatim: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 5m 30s ``` `cargo test -p calternal-money -p calternal-plugin-money -- --test-threads=4`: exit 0. Complete output, verbatim: ```text Blocking waiting for file lock on build directory sccache: warning: The server looks like it shut down unexpectedly, compiling locally instead sccache: warning: The server looks like it shut down unexpectedly, compiling locally instead sccache: warning: The server looks like it shut down unexpectedly, compiling locally instead sccache: warning: The server looks like it shut down unexpectedly, compiling locally instead Compiling calternal-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-money) Finished `test` profile [unoptimized + debuginfo] target(s) in 5m 14s Running unittests src/lib.rs (/home/kayg/build/targets/bulkrev2/debug/deps/calternal_money-5ad27f9b5c008064) running 16 tests test codec::tests::empty_payee_is_refused_by_the_writer ... ok test codec::tests::property_edit_changes_one_value ... ok test codec::tests::transaction_round_trip_with_punctuation_in_labels_and_payee ... ok test codec::tests::round_trip_keeps_bom_crlf_and_unknown_bytes ... ok test edit::tests::cleared_tag_toggles_without_touching_other_tags ... ok test edit::tests::crlf_file_keeps_crlf_on_insert ... ok test codec::tests::malformed_dated_rows_fail_instead_of_vanishing ... ok test codec::tests::checked_parse_stops_after_a_bounded_line_batch ... ok test edit::tests::unicode_payee_tag_boundaries_match_shared_vectors ... ok test units::tests::exact_range_is_enforced_on_parse_and_arithmetic ... ok test units::tests::format_uses_explicit_sign_and_exact_scale ... ok test units::independent_number_review::signed_edges_and_long_zero_padding_keep_exact_minor_units ... ok test units::tests::scale_table_has_all_165_codes_with_unique_entries ... ok test units::tests::parse_matches_the_oracle_examples ... ok test edit::tests::new_budget_projects_with_no_accounts ... ok test edit::tests::assign_inserts_updates_and_removes_rows ... ok test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s Running tests/account_kinds.rs (/home/kayg/build/targets/bulkrev2/debug/deps/account_kinds-40f136ace82559dd) running 4 tests test account_projection_rejects_legacy_and_unknown_kinds ... ok test categorized_debit_loan_transfers_post_one_budget_leg ... ok test off_budget_balance_marker_does_not_change_budget_money ... ok test imported_account_kinds_project_without_losing_identity ... ok test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s Running tests/import.rs (/home/kayg/build/targets/bulkrev2/debug/deps/import-32258f8fda96f336) running 13 tests test duplicate_source_ids_are_rejected_and_duplicate_names_are_kept ... ok test import_render_is_exact_and_byte_stable ... ok test import_render_reports_progress_and_propagates_cancel ... ok test import_replay_matches_full_ledger_month_by_month ... ok test import_keeps_same_day_source_order_for_credit_payments_and_refunds ... ok test production_v1_metadata_upgrade_keeps_balances ... ok test import_stream_renderer_matches_full_rendered_files ... ok test recheck_half_minor_units_negative_zero_and_nineteen_digits ... ok test budget_replay_stops_at_a_bounded_transaction_checkpoint ... ok test imported_ready_to_assign_matches_independent_month_oracle ... ok test recheck_same_day_payment_and_refund_keep_source_fifo ... ok test random_imports_conserve_source_balances_and_markdown ... ok test recheck_random_multicurrency_ledgers_match_all_monthly_totals ... ok test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 12.54s Running tests/properties.rs (/home/kayg/build/targets/bulkrev2/debug/deps/properties-9ff9e71a800dacb8) running 19 tests test bill_coverage_never_clamps_the_bill ... ok test bulkrev2::i64_extremes_are_rejected_and_safe_bound_is_exact ... ok test bulkrev2::literal_account_sum_and_funded_card_conservation ... ok test bulkrev2::refund_payment_calendar_choice_is_visible_next_month ... ok test bulkrev2::boundary_shuffle_reports_acceptance_difference ... ok test any_text_that_parses_serializes_to_the_same_bytes ... ok test decimal_text_round_trips_for_every_scale ... ok test assign_then_unassign_is_the_identity ... ok test fully_funded_card_spending_conserves_cash ... ok test money_code_never_uses_floating_point ... ok test paired_write_replay_matches_independent_calculations ... ok test cash_ledgers_conserve_money_every_month ... ok test reviewed_burst_order_matches_input_order ... ok test mixed_cash_credit_deficit_rolls_only_its_cash_part ... ok test split_legs_post_exactly_the_parent ... ok test transaction_rows_round_trip_byte_for_byte ... ok test partial_payment_then_category_refunds_conserve_cash_across_months ... ok test same_date_card_postings_are_a_function_of_the_set ... ok test bulkrev2::same_day_shuffles_cover_splits_transfers_and_month_edges ... ok test result: ok. 19 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.54s Running tests/ready_to_assign_adjustment.rs (/home/kayg/build/targets/bulkrev2/debug/deps/ready_to_assign_adjustment-0e1c5c7276d14077) running 1 test test ready_to_assign_adjustment_changes_only_the_budget_pool ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s Running tests/review_984.rs (/home/kayg/build/targets/bulkrev2/debug/deps/review_984-dc85183370c2f07a) running 5 tests test review_pair_performance_profile ... ignored, performance measurements belong to the merge round on the perf VM test review_pair_rejects_bad_months_and_amounts_without_rounding ... ok test review_split_remainders_and_tracking_transfers_are_exact ... ok test review_mixed_pair_matches_independent_replays ... ok test review_large_ledger_pair_keeps_exact_totals ... ok test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 4.19s Running tests/vectors.rs (/home/kayg/build/targets/bulkrev2/debug/deps/vectors-b0e2a54af0711cc9) running 2 tests test rust_matches_random_oracle_ledgers_without_divergences ... ok test rust_port_matches_every_recorded_oracle_vector ... ok test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.42s Running unittests src/lib.rs (/home/kayg/build/targets/bulkrev2/debug/deps/calternal_plugin_money-3d165b6d3890a332) running 135 tests test import::import_review_tests::actual_cc_label_requires_missing_type_confirmation ... ok test import::import_review_tests::actual_orphan_split_children_are_rejected ... ok test import::import_review_tests::actual_stream_memory_guard_child ... ignored, invoked as an isolated child by actual_stream_keeps_a_large_history_bounded test import::import_review_tests::actual_transfer_legs_cannot_cross_months ... ok test import::import_review_tests::import_control_reports_progress_and_stops_cancelled_work ... ok test import::import_review_tests::actual_account_checks_use_raw_monthly_source_rows ... ok test import::import_review_tests::actual_cents_conversion_never_rounds ... ok running 1 test test import::import_review_tests::ynab_transfer_pairing_handles_many_duplicate_legs ... ok test import_fidelity_1130::independent_split_and_transfer_numbers_check ... ok test routes::durable::admission_tests::cancelled_receiver_cannot_acknowledge_a_durable_job ... ok test routes::durable::checkpoint_tests::progress_wait_keeps_parser_writer_release_polled ... ok test import_fidelity_1130::actual_rows_round_trip ... ok test routes::import_cleanup_tests::dropped_preview_worker_retains_admission_until_exit ... ok test routes::import_cleanup_tests::idle_imports_are_reclaimed_by_expiry_cleanup ... ok test routes::import_cleanup_tests::staged_import_files_keep_ranges_and_release_private_storage ... ok test routes::import_staged_path_tests::staged_import_name_cannot_select_another_path_or_slot ... ok test routes::durable::admission_tests::live_publication_honors_operational_queue_cancellation ... ok test routes::replay_reuse_tests::crossings_cover_source_ranges_relative_to_today ... ok test routes::replay_reuse_tests::crossings_reuse_checked_current_totals_even_with_future_months ... ok test routes::replay_reuse_tests::assignment_retry_rebuilds_from_latest_source_bytes ... ok test routes::review_1140::cancel_wins_before_publication_lock ... ok test routes::review_1140::cancel_does_not_rewrite_published_result ... ok test routes::durable::money_import_undo_mutation ... ok test routes::review_1140::review1140_cancel_after_rename_before_receipt_keeps_publication ... ok test routes::review_1140::review1140_all_formats_replay_exact_balances ... ok test routes::review_1140::review1140_operational_cancel_before_replacement_returns_no_receipt ... ok test routes::review_1140::review1140_discard_after_confirmation_failure_releases_admission ... ok test routes::review_1140::review1140_tcp_malformed_inputs_leave_worker_usable ... ok test routes::review_1140::review1140_staged_size_limits_fail_without_publishing ... ok test store::parsed_cache_tests::global_budget_and_folder_pruning_release_stale_entries ... ok test store::parsed_cache_tests::parse_charge_accounts_for_line_structures ... ok test store::parsed_cache_tests::user_cache_evicts_old_parse_entries_and_shares_hot_documents ... ok test routes::review_1140::review1140_terminal_receipts_do_not_block_new_imports ... ok test tests::a_broken_file_is_reported_not_hidden ... ok test tests::a_new_user_sees_the_real_empty_state ... ok test tests::a_journal_for_a_completed_move_changes_nothing ... ok test routes::review_1140::review1140_replacement_receipt_recovery_does_not_adopt_later_edits ... ok test tests::active_money_handle_survives_other_users_cache_pressure ... ok test tests::actual_duplicate_names_import_by_id_without_sharing_a_payment_category ... ok test tests::actual_export_archive_imports_exact_rows_from_private_scratch ... ok test tests::a_read_waits_for_a_write_in_progress ... ok test tests::api_account_numbers_equal_core_replay ... ok test tests::a_split_row_written_by_hand_is_read_but_not_edited ... ok test tests::assignments_retry_source_conflicts_without_losing_neighbours ... ok test tests::backdated_create_emits_current_month_overspend_crossing ... ok test tests::budget_flow_writes_exact_markdown_and_derives_available ... ok test tests::bulk_write_invalid_neighbours_do_not_change_valid_rows ... ok test tests::bulk_write_month_does_not_need_note_date_backfill ... ok test tests::cancel_racing_confirm_has_one_consistent_outcome ... ok test tests::cancelling_imports_leaves_no_budget_and_releases_slots ... ok test tests::bulk_write_rejects_intermediate_overflow ... ok test tests::concurrent_store_edits_keep_exactly_one_winner ... ok test tests::csv_import_keeps_progress_and_cancel_responsive ... ok test tests::delete_transaction_emits_current_month_overspend_crossing ... ok test import::import_review_tests::actual_stream_keeps_a_large_history_bounded has been running for over 60 seconds test import::import_review_tests::actual_stream_memory_guard_child has been running for over 60 seconds test tests::denied_preview_access_keeps_the_owners_pending_import ... ok test import::import_review_tests::actual_stream_memory_guard_child ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 134 filtered out; finished in 69.81s test import::import_review_tests::actual_stream_keeps_a_large_history_bounded ... ok test tests::durable_import_tests::operation_exit_child ... ignored, child of operation_recovery_survives_process_exit_at_every_phase test tests::bulk_write_balances_equal_one_by_one has been running for over 60 seconds test tests::durable_import_tests::operation_recovery_survives_process_exit_at_every_phase ... ok test tests::durable_import_tests::publication_and_inverse_authority_use_full_commits ... ok test tests::durable_import_tests::generated_import_confirm_replay_and_undo_preserve_minor_units ... ok test tests::durable_import_tests::receipt_reads_are_bounded_and_old_receipts_are_addressable ... ok test tests::durable_import_tests::queued_import_and_undo_survive_restarts ... ok test tests::durable_import_tests::replay_preserves_a_live_ready_preview ... ok test tests::durable_import_tests::running_jobs_do_not_expire_and_cancelled_jobs_do_not_restart ... ok test tests::card_models_ignore_arrival_batch_and_timezone has been running for over 60 seconds test tests::durable_import_tests::undo_receipt_replay_never_removes_a_restored_import ... ok test tests::durable_import_tests::undo_refuses_a_predecessor_restored_before_the_inverse ... ok test tests::durable_import_tests::undo_refuses_every_later_budget_edit_after_restart ... ok test tests::durable_import_tests::undo_restarts_before_and_after_the_filesystem_inverse ... ok test tests::failed_cross_month_move_never_counts_the_row_twice ... ok test tests::far_month_assignment_cannot_make_the_budget_unreadable ... ok test tests::gap_month_assignments_and_opening_card_debt_do_not_create_cash ... ok test tests::historical_overspend_does_not_emit_current_month_event ... ok test tests::hostile_inputs_are_rejected_without_writing ... ok test tests::idle_import_receive_releases_admission_and_cancel_stops_read ... ok test tests::import_fidelity_review_requires_account_kind_and_keeps_notes ... ok test tests::import_file_limits_match_the_money_reader ... ok test tests::import_preview_is_owner_bound_and_confirmation_publishes_once ... ok test tests::import_preview_reads_only_generated_staged_upload_names ... ok test tests::durable_import_tests::replacement_restarts_at_every_durable_phase ... ok test tests::memo_and_tags_split_the_payee_without_losing_text ... ok test tests::money_is_on_for_the_instance_and_off_for_a_new_user ... ok test tests::inferred_opening_balance_needs_explicit_confirmation ... ok test tests::month_revision_increases_after_each_assignment ... ok test tests::move_money_keeps_ready_to_assign_and_card_gets_payment_category ... ok test tests::multiple_assignment_rows_set_one_exact_total ... ok test tests::other_users_and_sessions_without_data_scope_see_nothing ... ok test tests::overflowing_category_sum_is_rejected_before_assignment_write ... ok test tests::overflowing_cleared_subset_is_rejected_before_transaction_write ... ok test tests::overflowing_derived_balance_is_rejected_before_the_write ... ok test tests::overspending_reports_ynab_states ... ok test tests::plugin_code_never_uses_floating_point ... ok test tests::parsed_money_cache_shares_documents_and_prunes_removed_months ... ok test tests::recheck_metadata_files_use_the_reader_size_cap ... ok test tests::recheck_local_server_number_and_lifecycle_contract ... ok test tests::recheck_source_checks_owner_and_opening_balance_confirmation ... ok test tests::review_1130::review1130_cancel_after_partial_preparation ... ok test tests::recheck_random_preview_cancellation_leaves_no_files ... ok test tests::review_1130::review1130_legacy_home_needs_no_metadata_rewrite ... ok test tests::review_1130::review1130_notes_are_inert ... ok test tests::review_1130::review1130_long_imported_note_allows_amount_edit_without_loss ... ok test tests::review_1130::review1130_reconciled_closed_balances ... ok test tests::review_1130::review1130_split_and_closed_transfer_have_one_posting ... ok test tests::review_984::review3_first_future_transaction_keeps_current_event_month ... ok test tests::review_1130::review1130_tcp_locks_reimport_and_cancel ... ok test tests::review_984::review3_future_only_edit_and_delete_keep_current_event_month ... ok test tests::review_984::review3_outside_current_range_writes_emit_no_overspend ... ok test tests::review_984::review_category_edit_emits_for_old_category_only ... ok test tests::review_984::review_concurrent_assign_revisions_match_final_report ... ok test tests::review_984::review_cross_month_refund_move_emits_current_crossing ... ok test tests::review_984::review_file_replacement_advances_month_revision ... ok test tests::review_984::review_exact_zero_healing_recrossing_and_delete ... ok test tests::review_984::review_split_and_tracking_transfer_writes_are_rejected_without_events ... ok test tests::review_984::review_user_zone_month_and_year_edges ... ok test tests::review_984::review_source_generation_tracks_all_files_and_restoration ... ok test tests::review_bulkrev2::four_conflicts_return_409_without_writing ... ok test tests::same_handle_settles_a_failed_move_before_the_next_request ... ok test tests::simultaneous_import_confirmations_have_one_winner ... ok test tests::review_bulkrev2::two_and_five_assignment_races_match_serial_targets ... ok test tests::source_total_mismatch_cannot_be_confirmed ... ok test tests::transaction_identity_preview_is_atomic_and_reimport_changes_nothing ... ok test tests::transaction_logged_event_has_the_documented_create_payload ... ok test tests::slow_15mb_import_receive_completes_with_progress ... ok test tests::transfer_register_view_exposes_linked_category ... ok test tests::transfer_cleared_edits_are_per_account ... ok test tests::wizard_background_job_recovers_preview_after_response_is_dropped ... ok test tests::wizard_background_job_retains_safe_failure ... ok test tests::wizard_starter_categories_validate_before_create_and_do_not_change_totals ... ok test tests::ynab_conflicting_accounts_and_payees_are_not_silently_discarded ... ok test tests::ynab_csv_import_keeps_exact_month_and_register_amounts ... ok test tests::ynab_duplicate_category_ids_are_merged_only_when_identical ... ok test tests::ynab_plan_json_import_keeps_exact_milliunits ... ok test tests::ynab_public_demo_imports_duplicate_category_names_by_id ... ok test tests::update_transaction_emits_current_month_overspend_crossing ... ok test tests::bulk_write_balances_equal_one_by_one ... ok test tests::card_models_ignore_arrival_batch_and_timezone ... ok test result: ok. 133 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 1151.67s Running tests/import_review.rs (/home/kayg/build/targets/bulkrev2/debug/deps/import_review-6a0b9e5006b57cbf) running 32 tests test corrupt_actual_database_is_a_private_error ... ok test csv_bom_mixed_endings_and_decimal_comma_are_exact ... ok test csv_transaction_ids_merge_or_reject_before_totals ... ok test identity_csv_transfer_growth_curve ... ignored, run with MONEY_IDENT_CSV_ROWS for 10k/100k/1M transfer profiling test csv_amount_edges_never_round_group_or_overflow ... ok test recheck_actual_stream_growth_curve ... ignored, run with MONEY_RECHECK_ARCHIVE and MONEY_RECHECK_ROWS for profiling test recheck_conflicting_transaction_ids_are_rejected ... ok test recheck_csv_transfer_growth_curve ... ignored, run with MONEY_RECHECK_TRANSFERS for the bounded CSV growth probe test recheck_e2e_csv_has_four_checks_and_keeps_every_minor_unit ... ok test recheck_identical_transaction_ids_do_not_double_money ... ok test recheck_reconciled_negative_zero_and_exact_source_scales ... ok test split_identity_cannot_reuse_a_top_level_id ... ok test split_identity_concrete_valid_totals ... ok test split_identity_includes_parent_deleted_and_transfer_fields ... ok test csv_pairing_accepts_cancellation_during_its_loop ... ok test split_identity_rejects_an_inconsistent_embedded_parent ... ok test split_identity_review_cases_reject ... ok test transaction_identity_checks_fields_and_keeps_distinct_ids ... ok test split_identity_merges_before_totals ... ok test transfer_legs_prefer_a_same_month_mate ... ok test transfer_month_identity_rejects_in_both_adapters ... ok test transaction_identity_preserves_exact_units ... ok test transfer_month_review_cases_reject ... ok test unmatched_transfer_legs_keep_the_source_register ... ok test ynab_account_check_rejects_a_wrong_normalization ... ok test ynab_csv_preserves_exact_minor_units ... ok test csv_pairing_keeps_exact_account_legs ... ok test ynab_negative_zero_amount_is_zero ... ok test ynab_unrepresentable_milliunits_are_rejected ... ok test transfer_month_pairing_keeps_dates_and_exact_pair_priority ... ok test ynab_json_keeps_exact_split_and_transfer_postings ... ok test raw_ynab_registers_match_a_raw_row_oracle ... ok test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 12.71s Doc-tests calternal_money running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests calternal_plugin_money running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Focused Assignment output and all 1,024 generated month sums are kept in artifacts/bulkrev2-assignment-final.log and artifacts/bulkrev2-month-totals.jsonl. Time-zone snapshot evidence is in artifacts/bulkrev2-core-{berlin,new-york,kiritimati}.log. The dynamic OLD/NEW comparison is in artifacts/bulkrev2-baseline.log. Review artifacts are not committed. BLOCK — B1: paid-purchase refunds duplicate payment reserve and carry excess Available into the next month.
Author
Owner

bulkfix2 started on job/bulkwrite-1393, base c8d278b00b. Scope: correct paid Card refunds (B1), canonical bound acceptance (N2), and add shuffle/conservation regressions. All amounts used are synthetic test fixtures.

bulkfix2 started on job/bulkwrite-1393, base c8d278b00b845a905efca659b49463323e2ad0e1. Scope: correct paid Card refunds (B1), canonical bound acceptance (N2), and add shuffle/conservation regressions. All amounts used are synthetic test fixtures.
Author
Owner

bulkfix2 finding: replaying origin/dev's budget module confirms payment-first B1 leaves reserve 10,000 and total Available 20,000 in both March and April; refund-first leaves reserve 0 and Available 10,000. Evidence: artifacts/origin-dev-b1.log. Fixed replay now produces reserve 0 and Available 10,000 for both orders. N2 now uses canonical order in both the pre-pass and posting pass. The new 256-case funded shuffle property checks conservation in every March/April/May model, including paid and unpaid refunds, splits and transfers.

All 11 reviewed vectors remain unchanged and pass. One additional legacy vector (9f1c6b453f4864f3) encoded duplicate reserve after an oversized refund clears the Card balance; its Python assertion and recorded output are updated for the explicitly requested new refund behavior. Decision: refund releases its own unpaid reserve first, then other funded reserve on the same Card, capped at positive reserve. DESIGN §48 records this rule and the fully funded conservation equation, including its deficit/reconciliation limits. Core tests and clippy pass; final merged gates remain.

bulkfix2 finding: replaying origin/dev's budget module confirms payment-first B1 leaves reserve 10,000 and total Available 20,000 in both March and April; refund-first leaves reserve 0 and Available 10,000. Evidence: artifacts/origin-dev-b1.log. Fixed replay now produces reserve 0 and Available 10,000 for both orders. N2 now uses canonical order in both the pre-pass and posting pass. The new 256-case funded shuffle property checks conservation in every March/April/May model, including paid and unpaid refunds, splits and transfers. All 11 reviewed vectors remain unchanged and pass. One additional legacy vector (9f1c6b453f4864f3) encoded duplicate reserve after an oversized refund clears the Card balance; its Python assertion and recorded output are updated for the explicitly requested new refund behavior. Decision: refund releases its own unpaid reserve first, then other funded reserve on the same Card, capped at positive reserve. DESIGN §48 records this rule and the fully funded conservation equation, including its deficit/reconciliation limits. Core tests and clippy pass; final merged gates remain.
Author
Owner

bulkfix2 follow-up: refunds must also be capped by debt before the inflow. If a refund crosses zero Card balance, its excess is positive Card money; releasing reserve for that excess would remove real money from a manually overfunded payment Category. Extended the property with payment assignments and added a split-refund regression that crosses zero between child legs. Split children use a bounded integer balance cursor while the parent Account balance still posts once. The Python oracle has the same rule. No new dependencies or routes. Final clippy completed successfully; final combined crate tests are building.

bulkfix2 follow-up: refunds must also be capped by debt before the inflow. If a refund crosses zero Card balance, its excess is positive Card money; releasing reserve for that excess would remove real money from a manually overfunded payment Category. Extended the property with payment assignments and added a split-refund regression that crosses zero between child legs. Split children use a bounded integer balance cursor while the parent Account balance still posts once. The Python oracle has the same rule. No new dependencies or routes. Final clippy completed successfully; final combined crate tests are building.
Author
Owner

bulkfix2 (#1393)

Head: 3e5fe2ae1c
Base: c8d278b00b
Branch: job/bulkwrite-1393
Merged origin/dev once before final gates (b93a497e7). No push, deployment or merge into dev/main.

Built

  • B1: a categorized Card refund restores its Category and releases reserve even when a payment already covered its purchase. Release its own unpaid purchases first, then other funded purchases on that Card. Cap the release by positive reserve and prior debt. Keep positive Card credit and payment overfunding as real budget money. Split refunds use each child's prior balance; the parent Account balance posts once.
  • N2: one canonical sort now feeds both the cash-activity pre-pass and the posting pass. Both boundary permutations return the expected valid model.
  • Converted both review witnesses to correct-result assertions. Added a 256-case shuffle/conservation property with paid and unpaid refunds, purchases, splits, payments, transfers, payment overfunding and three months. Retained the broader 256-case shuffle property and added a split refund crossing zero Card balance.
  • Added an independent numeric check for all 11 reviewed vectors. Their recorded outputs remain unchanged.
  • Updated the Python oracle and one legacy vector (9f1c6b453f4864f3). That old expectation kept duplicate reserve when an oversized refund cleared the Card balance. This is the refund behavior the brief explicitly changes; no unrelated expectation changed.

Origin/dev comparison

The frozen origin/dev budget module returns reserve 10,000 and total Available 20,000 for payment-first B1, in both March and April. Refund-first returns reserve 0 and Available 10,000. The fixed code returns the correct complete model for both file orders and for the earlier refund date. All amounts are synthetic fixture cents. Evidence: artifacts/origin-dev-b1.log.

Files changed by bulkfix2

  • crates/calternal-money/src/budget.rs
  • crates/calternal-money/tests/properties.rs
  • crates/calternal-money/tests/review_bulkrev2/core.rs
  • crates/calternal-money/tests/vectors.rs
  • docs/DESIGN.md (§48)
  • spikes/money-format/budget_math.py
  • spikes/money-markdown/test_money_adversarial.py
  • contracts/vectors/money/money.v1.json

Decisions

For fully funded expense histories, without import reconciliation adjustments:
expense Category Available + payment Category Available + Ready to Assign = Cash balances + positive Card balances, at every month end. Payment reserves are already in Category Available; do not count them twice. Negative Card balances are debt, not budget money. Current-month credit deficits and imported Ready to Assign adjustments need separate corrections. DESIGN §48 and the property comment now state this domain and equation. Existing cash-only and mixed-deficit conservation tests remain unchanged.

Refund queue choice: release the refunded Category's unpaid reserve first, then consume the Card's oldest other funded purchases. Cap debt per split child, so crossing zero cannot consume payment overfunding.

Expected cost

For T month rows and L child legs: one O(T log T) canonical sort, then two O(T + L) passes and amortized queue consumption. The existing sort is reused; no extra sort, file scan, DB query or IO is added. This number-fix job did not run a performance measurement, per the current verification policy. The existing #1393 profile remains available for the merge round.

Known gaps

No identified B1/N2 gap remains. The funded conservation property does not claim a universal signed-account equation for unfunded credit or source reconciliation adjustments. No UI code changed; screenshots and UX-control review do not apply.

For the merge round

  • CALTERNAL_SERVER_BIN=<merged prebuilt binary> bun tests/adversarial/money_api.mjs: verify real-server Money input rejection, write isolation and exact balances on the combined branch.
  • When performance is measured, use the existing bench/bulk-write-1393.mjs through perf-run calternal <job> <minutes> -- ..., with Money, 2,000 rows, concurrency 1/8 and five samples. Compare with docs/perf/2026-10-08-1393-bulk-writes.md. Build here and copy the binary; do not build on the perf VM.
  • Full web/e2e/adversarial matrices, release/deployment and Mac checks remain with the merge round under the verification policy.

Gate environment

CARGO_PROFILE_DEV_DEBUG=line-tables-only
CARGO_INCREMENTAL=0
CARGO_BUILD_JOBS=4
TMPDIR=/target/tmp
CARGO_TARGET_DIR retained as preset.

Status: READY FOR MERGE. All requested Rust gates passed.

Gate output (verbatim)

cargo fmt --check: exit 0, no output.

cargo clippy -p calternal-money -p calternal-plugin-money --all-targets -- -D warnings

    Checking calternal-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-money)
    Checking calternal-plugin-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/plugins/money)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 27.76s

cargo test -p calternal-money -p calternal-plugin-money -- --test-threads=4

    Blocking waiting for file lock on package cache
    Blocking waiting for file lock on build directory
   Compiling memchr v2.8.3
   Compiling once_cell v1.21.4
   Compiling futures-core v0.3.34
   Compiling serde_core v1.0.229
   Compiling pin-project-lite v0.2.17
   Compiling jobserver v0.1.35
   Compiling log v0.4.34
   Compiling bytes v1.12.1
   Compiling cc v1.4.7
   Compiling zerofrom v0.1.8
   Compiling stable_deref_trait v1.2.1
   Compiling serde v1.0.229
   Compiling socket2 v0.6.5
   Compiling yoke v0.8.3
   Compiling zerovec v0.11.8
   Compiling equivalent v1.0.2
   Compiling num-traits v0.2.19
   Compiling litemap v0.8.3
   Compiling hashbrown v0.17.1
   Compiling tinystr v0.8.4
   Compiling rand_core v0.10.1
   Compiling writeable v0.6.4
   Compiling potential_utf v0.1.6
   Compiling getrandom v0.4.3
   Compiling zerotrie v0.2.5
   Compiling icu_locale_core v2.3.0
   Compiling utf8_iter v1.0.4
   Compiling tracing-core v0.1.36
   Compiling futures-io v0.3.34
   Compiling icu_collections v2.3.0
   Compiling futures-task v0.3.34
   Compiling scopeguard v1.2.0
   Compiling typenum v1.20.1
   Compiling icu_provider v2.3.1
   Compiling tracing v0.1.44
   Compiling icu_normalizer_data v2.3.0
   Compiling mio v1.2.3
   Compiling errno v0.3.14
   Compiling percent-encoding v2.3.2
   Compiling futures-sink v0.3.34
   Compiling lock_api v0.4.14
   Compiling signal-hook-registry v1.4.8
   Compiling icu_properties_data v2.3.0
   Compiling serde_json v1.0.151
   Compiling smallvec v1.16.1
   Compiling tokio v1.53.1
   Compiling icu_properties v2.3.0
   Compiling indexmap v2.14.2
   Compiling iana-time-zone v0.1.65
   Compiling slab v0.4.12
   Compiling chrono v0.4.45
   Compiling form_urlencoded v1.2.2
   Compiling futures-util v0.3.34
   Compiling cmake v0.1.58
   Compiling http v1.5.0
   Compiling aws-lc-sys v0.45.0
   Compiling siphasher v1.0.3
   Compiling generic-array v0.14.9
   Compiling spin v0.9.9
   Compiling hybrid-array v0.4.15
   Compiling aho-corasick v1.1.5
   Compiling allocator-api2 v0.2.21
   Compiling foldhash v0.2.0
   Compiling base64 v0.22.1
   Compiling cpufeatures v0.2.17
   Compiling regex-automata v0.4.18
   Compiling hashbrown v0.16.1
   Compiling crossbeam-utils v0.8.23
   Compiling icu_normalizer v2.3.0
   Compiling zeroize v1.9.0
   Compiling crc-catalog v2.5.0
   Compiling parking v2.2.1
   Compiling tempfile v3.27.0
   Compiling event-listener v5.4.2
   Compiling crc v3.4.0
   Compiling regex v1.13.1
   Compiling idna_adapter v1.2.2
   Compiling hashlink v0.11.1
   Compiling crossbeam-queue v0.3.14
   Compiling crypto-common v0.1.6
   Compiling block-buffer v0.10.4
   Compiling http-body v1.1.0
   Compiling parking_lot_core v0.9.12
   Compiling futures-channel v0.3.34
   Compiling simd-adler32 v0.3.10
   Compiling rusty-fork v0.3.1
   Compiling parking_lot v0.12.5
   Compiling digest v0.10.7
   Compiling idna v1.1.0
   Compiling rustls-pki-types v1.15.1
   Compiling crypto-common v0.2.2
   Compiling libsqlite3-sys v0.37.0
   Compiling tower-service v0.3.3
   Compiling cpufeatures v0.3.1
   Compiling proptest v1.11.0
   Compiling tokio-stream v0.1.19
   Compiling either v1.18.0
   Compiling url v2.5.8
   Compiling sha2 v0.10.9
   Compiling futures-intrusive v0.5.0
   Compiling httparse v1.10.1
   Compiling calternal-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-money)
   Compiling tokio-util v0.7.19
   Compiling adler2 v2.0.1
   Compiling try-lock v0.2.5
   Compiling atomic-waker v1.1.2
   Compiling untrusted v0.9.0
   Compiling sqlx-core v0.9.0
   Compiling want v0.3.1
   Compiling h2 v0.4.19
   Compiling atoi v2.0.0
   Compiling crc32fast v1.5.2
   Compiling thiserror v2.0.21
   Compiling futures-executor v0.3.34
   Compiling flume v0.12.0
   Compiling inout v0.2.2
   Compiling phf_shared v0.11.3
   Compiling blake3 v1.8.7
   Compiling sync_wrapper v1.0.2
   Compiling subtle v2.6.1
   Compiling httpdate v1.0.3
   Compiling tower-layer v0.3.3
   Compiling ryu v1.0.23
   Compiling cmov v0.5.4
   Compiling ipnet v2.12.2
   Compiling hyper v1.11.1
   Compiling ctutils v0.4.2
   Compiling phf_generator v0.11.3
   Compiling sqlx-sqlite v0.9.0
   Compiling miniz_oxide v0.9.1
   Compiling aws-lc-rs v1.18.1
   Compiling rustls v0.23.45
   Compiling block-buffer v0.12.1
   Compiling phf_shared v0.12.1
   Compiling zlib-rs v0.6.8
   Compiling arrayvec v0.7.8
   Compiling constant_time_eq v0.4.2
   Compiling rustls-webpki v0.103.15
   Compiling flate2 v1.1.10
   Compiling sqlx-macros-core v0.9.0
   Compiling phf v0.12.1
   Compiling cipher v0.5.2
   Compiling multiversion v0.9.0
   Compiling hyper-util v0.1.20
   Compiling universal-hash v0.6.1
   Compiling phf_macros v0.11.3
   Compiling tower v0.5.3
   Compiling http-body-util v0.1.5
   Compiling openssl-probe v0.2.1
   Compiling core_detect v1.0.0
   Compiling simdutf8 v0.1.5
   Compiling mime v0.3.17
   Compiling rustls-native-certs v0.8.4
   Compiling encoding_rs v0.8.41
   Compiling phf v0.11.3
   Compiling tokio-rustls v0.26.6
   Compiling poly1305 v0.9.1
   Compiling chacha20 v0.10.2
   Compiling sqlx-macros v0.9.0
   Compiling chrono-tz v0.10.4
   Compiling inotify-sys v0.1.8
   Compiling aead v0.6.1
   Compiling miniz_oxide v0.8.9
   Compiling fdeflate v0.3.7
   Compiling color_quant v1.1.0
   Compiling same-file v1.0.6
   Compiling quick-error v2.0.1
   Compiling weezl v0.1.12
   Compiling winnow v0.7.15
   Compiling calternal-path v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-path)
   Compiling zune-core v0.5.3
   Compiling pxfm v0.1.30
   Compiling byteorder-lite v0.1.0
   Compiling cron v0.17.0
   Compiling image-webp v0.2.4
   Compiling zune-jpeg v0.5.15
   Compiling gif v0.14.2
   Compiling png v0.18.1
   Compiling moxcms v0.8.1
   Compiling walkdir v2.5.0
   Compiling utoipa v6.0.0
   Compiling chacha20poly1305 v0.11.0
   Compiling sqlx v0.9.0
   Compiling inotify v0.11.5
   Compiling multer v3.1.0
   Compiling hyper-rustls v0.27.10
   Compiling axum-core v0.5.6
   Compiling unicode-joining-type v1.0.0
   Compiling rustls-platform-verifier v0.7.0
   Compiling tower-http v0.6.11
   Compiling serde_urlencoded v0.7.1
   Compiling uuid v1.26.1
sccache: warning: The server looks like it shut down unexpectedly, compiling locally instead
sccache: warning: The server looks like it shut down unexpectedly, compiling locally instead
sccache: warning: The server looks like it shut down unexpectedly, compiling locally instead
sccache: warning: The server looks like it shut down unexpectedly, compiling locally instead
   Compiling notify-types v2.1.0
   Compiling serde_path_to_error v0.1.20
   Compiling unicase v2.9.0
   Compiling matchit v0.8.4
   Compiling bytemuck v1.25.2
   Compiling bumpalo v3.20.3
   Compiling base64 v0.23.1
   Compiling unsafe-libyaml v0.2.11
   Compiling unicode-properties v0.1.4
   Compiling unicode-casefold v0.2.0
   Compiling calternal-fs v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-fs)
   Compiling reqwest v0.13.5
   Compiling serde_yaml v0.9.34+deprecated
   Compiling zopfli v0.8.3
   Compiling image v0.25.10
   Compiling axum v0.8.9
   Compiling pulldown-cmark v0.13.4
   Compiling notify v8.2.0
   Compiling calternal-db v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-db)
   Compiling calternal-api v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-api)
   Compiling linkme v0.3.37
   Compiling quick-xml v0.42.0
   Compiling csv-core v0.1.13
   Compiling calternal-notes-core v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-notes-core)
   Compiling zip v5.1.1
   Compiling calternal-plugin v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-plugin)
   Compiling csv v1.4.0
   Compiling calternal-plugin-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/plugins/money)
    Finished `test` profile [unoptimized + debuginfo] target(s) in 11m 50s
     Running unittests src/lib.rs (/home/kayg/build/targets/bulkfix2/debug/deps/calternal_money-5ad27f9b5c008064)

running 16 tests
test codec::tests::empty_payee_is_refused_by_the_writer ... ok
test codec::tests::malformed_dated_rows_fail_instead_of_vanishing ... ok
test codec::tests::transaction_round_trip_with_punctuation_in_labels_and_payee ... ok
test codec::tests::round_trip_keeps_bom_crlf_and_unknown_bytes ... ok
test codec::tests::property_edit_changes_one_value ... ok
test edit::tests::cleared_tag_toggles_without_touching_other_tags ... ok
test edit::tests::crlf_file_keeps_crlf_on_insert ... ok
test edit::tests::unicode_payee_tag_boundaries_match_shared_vectors ... ok
test codec::tests::checked_parse_stops_after_a_bounded_line_batch ... ok
test units::tests::exact_range_is_enforced_on_parse_and_arithmetic ... ok
test units::tests::format_uses_explicit_sign_and_exact_scale ... ok
test units::tests::parse_matches_the_oracle_examples ... ok
test units::tests::scale_table_has_all_165_codes_with_unique_entries ... ok
test units::independent_number_review::signed_edges_and_long_zero_padding_keep_exact_minor_units ... ok
test edit::tests::new_budget_projects_with_no_accounts ... ok
test edit::tests::assign_inserts_updates_and_removes_rows ... ok

test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.09s

     Running tests/account_kinds.rs (/home/kayg/build/targets/bulkfix2/debug/deps/account_kinds-40f136ace82559dd)

running 4 tests
test account_projection_rejects_legacy_and_unknown_kinds ... ok
test off_budget_balance_marker_does_not_change_budget_money ... ok
test imported_account_kinds_project_without_losing_identity ... ok
test categorized_debit_loan_transfers_post_one_budget_leg ... ok

test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s

     Running tests/import.rs (/home/kayg/build/targets/bulkfix2/debug/deps/import-32258f8fda96f336)

running 13 tests
test import_render_is_exact_and_byte_stable ... ok
test duplicate_source_ids_are_rejected_and_duplicate_names_are_kept ... ok
test import_replay_matches_full_ledger_month_by_month ... ok
test import_keeps_same_day_source_order_for_credit_payments_and_refunds ... ok
test import_render_reports_progress_and_propagates_cancel ... ok
test import_stream_renderer_matches_full_rendered_files ... ok
test production_v1_metadata_upgrade_keeps_balances ... ok
test recheck_half_minor_units_negative_zero_and_nineteen_digits ... ok
test budget_replay_stops_at_a_bounded_transaction_checkpoint ... ok
test imported_ready_to_assign_matches_independent_month_oracle ... ok
test recheck_same_day_payment_and_refund_keep_source_fifo ... ok
test random_imports_conserve_source_balances_and_markdown ... ok
test recheck_random_multicurrency_ledgers_match_all_monthly_totals ... ok

test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 16.40s

     Running tests/properties.rs (/home/kayg/build/targets/bulkfix2/debug/deps/properties-9ff9e71a800dacb8)

running 21 tests
test bill_coverage_never_clamps_the_bill ... ok
test bulkrev2::boundary_shuffle_reports_acceptance_difference ... ok
test bulkrev2::i64_extremes_are_rejected_and_safe_bound_is_exact ... ok
test bulkrev2::literal_account_sum_and_funded_card_conservation ... ok
test bulkrev2::refund_payment_calendar_choice_is_visible_next_month ... ok
test any_text_that_parses_serializes_to_the_same_bytes ... ok
test bulkrev2::split_refund_keeps_payment_overfunding_when_card_becomes_positive ... ok
test assign_then_unassign_is_the_identity ... ok
test decimal_text_round_trips_for_every_scale ... ok
test cash_ledgers_conserve_money_every_month ... ok
test fully_funded_card_spending_conserves_cash ... ok
test money_code_never_uses_floating_point ... ok
test mixed_cash_credit_deficit_rolls_only_its_cash_part ... ok
test paired_write_replay_matches_independent_calculations ... ok
test reviewed_burst_order_matches_input_order ... ok
test partial_payment_then_category_refunds_conserve_cash_across_months ... ok
test split_legs_post_exactly_the_parent ... ok
test bulkrev2::funded_shuffles_conserve_real_money_every_month ... ok
test transaction_rows_round_trip_byte_for_byte ... ok
test same_date_card_postings_are_a_function_of_the_set ... ok
test bulkrev2::same_day_shuffles_cover_splits_transfers_and_month_edges ... ok

test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 10.14s

     Running tests/ready_to_assign_adjustment.rs (/home/kayg/build/targets/bulkfix2/debug/deps/ready_to_assign_adjustment-0e1c5c7276d14077)

running 1 test
test ready_to_assign_adjustment_changes_only_the_budget_pool ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s

     Running tests/review_984.rs (/home/kayg/build/targets/bulkfix2/debug/deps/review_984-dc85183370c2f07a)

running 5 tests
test review_pair_performance_profile ... ignored, performance measurements belong to the merge round on the perf VM
test review_pair_rejects_bad_months_and_amounts_without_rounding ... ok
test review_split_remainders_and_tracking_transfers_are_exact ... ok
test review_mixed_pair_matches_independent_replays ... ok
test review_large_ledger_pair_keeps_exact_totals ... ok

test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 4.13s

     Running tests/vectors.rs (/home/kayg/build/targets/bulkfix2/debug/deps/vectors-b0e2a54af0711cc9)

running 3 tests
test rust_matches_random_oracle_ledgers_without_divergences ... ok
test reviewed_eleven_refund_vectors_keep_their_exact_numbers ... ok
test rust_port_matches_every_recorded_oracle_vector ... ok

test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.72s

     Running unittests src/lib.rs (/home/kayg/build/targets/bulkfix2/debug/deps/calternal_plugin_money-3d165b6d3890a332)

running 135 tests
test import::import_review_tests::actual_cents_conversion_never_rounds ... ok
test import::import_review_tests::actual_cc_label_requires_missing_type_confirmation ... ok
test import::import_review_tests::actual_orphan_split_children_are_rejected ... ok
test import::import_review_tests::actual_stream_memory_guard_child ... ignored, invoked as an isolated child by actual_stream_keeps_a_large_history_bounded
test import::import_review_tests::actual_account_checks_use_raw_monthly_source_rows ... ok
test import::import_review_tests::import_control_reports_progress_and_stops_cancelled_work ... ok
test import::import_review_tests::actual_transfer_legs_cannot_cross_months ... ok

running 1 test
test import::import_review_tests::ynab_transfer_pairing_handles_many_duplicate_legs ... ok
test import_fidelity_1130::independent_split_and_transfer_numbers_check ... ok
test routes::durable::admission_tests::cancelled_receiver_cannot_acknowledge_a_durable_job ... ok
test routes::durable::checkpoint_tests::progress_wait_keeps_parser_writer_release_polled ... ok
test routes::durable::admission_tests::live_publication_honors_operational_queue_cancellation ... ok
test routes::import_cleanup_tests::dropped_preview_worker_retains_admission_until_exit ... ok
test routes::import_cleanup_tests::idle_imports_are_reclaimed_by_expiry_cleanup ... ok
test routes::import_cleanup_tests::staged_import_files_keep_ranges_and_release_private_storage ... ok
test routes::import_staged_path_tests::staged_import_name_cannot_select_another_path_or_slot ... ok
test routes::replay_reuse_tests::assignment_retry_rebuilds_from_latest_source_bytes ... ok
test import_fidelity_1130::actual_rows_round_trip ... ok
test routes::replay_reuse_tests::crossings_reuse_checked_current_totals_even_with_future_months ... ok
test routes::replay_reuse_tests::crossings_cover_source_ranges_relative_to_today ... ok
test routes::review_1140::cancel_wins_before_publication_lock ... ok
test routes::review_1140::cancel_does_not_rewrite_published_result ... ok
test routes::durable::money_import_undo_mutation ... ok
test routes::review_1140::review1140_cancel_after_rename_before_receipt_keeps_publication ... ok
test routes::review_1140::review1140_all_formats_replay_exact_balances ... ok
test routes::review_1140::review1140_discard_after_confirmation_failure_releases_admission ... ok
test routes::review_1140::review1140_operational_cancel_before_replacement_returns_no_receipt ... ok
test routes::review_1140::review1140_staged_size_limits_fail_without_publishing ... ok
test routes::review_1140::review1140_terminal_receipts_do_not_block_new_imports ... ok
test store::parsed_cache_tests::global_budget_and_folder_pruning_release_stale_entries ... ok
test store::parsed_cache_tests::parse_charge_accounts_for_line_structures ... ok
test store::parsed_cache_tests::user_cache_evicts_old_parse_entries_and_shares_hot_documents ... ok
test routes::review_1140::review1140_tcp_malformed_inputs_leave_worker_usable ... ok
test tests::a_broken_file_is_reported_not_hidden ... ok
test tests::a_new_user_sees_the_real_empty_state ... ok
test tests::a_journal_for_a_completed_move_changes_nothing ... ok
test tests::a_read_waits_for_a_write_in_progress ... ok
test tests::active_money_handle_survives_other_users_cache_pressure ... ok
test tests::actual_duplicate_names_import_by_id_without_sharing_a_payment_category ... ok
test tests::actual_export_archive_imports_exact_rows_from_private_scratch ... ok
test tests::a_split_row_written_by_hand_is_read_but_not_edited ... ok
test tests::api_account_numbers_equal_core_replay ... ok
test routes::review_1140::review1140_replacement_receipt_recovery_does_not_adopt_later_edits ... ok
test tests::assignments_retry_source_conflicts_without_losing_neighbours ... ok
test tests::backdated_create_emits_current_month_overspend_crossing ... ok
test tests::budget_flow_writes_exact_markdown_and_derives_available ... ok
test tests::bulk_write_invalid_neighbours_do_not_change_valid_rows ... ok
test tests::bulk_write_month_does_not_need_note_date_backfill ... ok
test tests::cancel_racing_confirm_has_one_consistent_outcome ... ok
test tests::cancelling_imports_leaves_no_budget_and_releases_slots ... ok
test tests::bulk_write_rejects_intermediate_overflow ... ok
test tests::concurrent_store_edits_keep_exactly_one_winner ... ok
test tests::csv_import_keeps_progress_and_cancel_responsive ... ok
test tests::delete_transaction_emits_current_month_overspend_crossing ... ok
test import::import_review_tests::actual_stream_keeps_a_large_history_bounded has been running for over 60 seconds
test import::import_review_tests::actual_stream_memory_guard_child has been running for over 60 seconds
test tests::denied_preview_access_keeps_the_owners_pending_import ... ok
test import::import_review_tests::actual_stream_memory_guard_child ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 134 filtered out; finished in 106.67s

test import::import_review_tests::actual_stream_keeps_a_large_history_bounded ... ok
test tests::durable_import_tests::operation_exit_child ... ignored, child of operation_recovery_survives_process_exit_at_every_phase
test tests::bulk_write_balances_equal_one_by_one has been running for over 60 seconds
test tests::card_models_ignore_arrival_batch_and_timezone has been running for over 60 seconds
test tests::durable_import_tests::generated_import_confirm_replay_and_undo_preserve_minor_units has been running for over 60 seconds
test tests::durable_import_tests::generated_import_confirm_replay_and_undo_preserve_minor_units ... ok
test tests::durable_import_tests::operation_recovery_survives_process_exit_at_every_phase has been running for over 60 seconds
test tests::durable_import_tests::publication_and_inverse_authority_use_full_commits ... ok
test tests::durable_import_tests::queued_import_and_undo_survive_restarts ... ok
test tests::durable_import_tests::receipt_reads_are_bounded_and_old_receipts_are_addressable ... ok
test tests::durable_import_tests::operation_recovery_survives_process_exit_at_every_phase ... ok
test tests::durable_import_tests::replay_preserves_a_live_ready_preview ... ok
test tests::durable_import_tests::running_jobs_do_not_expire_and_cancelled_jobs_do_not_restart ... ok
test tests::durable_import_tests::undo_receipt_replay_never_removes_a_restored_import ... ok
test tests::durable_import_tests::undo_refuses_a_predecessor_restored_before_the_inverse ... ok
test tests::durable_import_tests::undo_refuses_every_later_budget_edit_after_restart ... ok
test tests::durable_import_tests::undo_restarts_before_and_after_the_filesystem_inverse ... ok
test tests::failed_cross_month_move_never_counts_the_row_twice ... ok
test tests::durable_import_tests::replacement_restarts_at_every_durable_phase has been running for over 60 seconds
test tests::far_month_assignment_cannot_make_the_budget_unreadable ... ok
test tests::gap_month_assignments_and_opening_card_debt_do_not_create_cash ... ok
test tests::historical_overspend_does_not_emit_current_month_event ... ok
test tests::hostile_inputs_are_rejected_without_writing ... ok
test tests::idle_import_receive_releases_admission_and_cancel_stops_read ... ok
test tests::durable_import_tests::replacement_restarts_at_every_durable_phase ... ok
test tests::import_file_limits_match_the_money_reader ... ok
test tests::import_fidelity_review_requires_account_kind_and_keeps_notes ... ok
test tests::import_preview_is_owner_bound_and_confirmation_publishes_once ... ok
test tests::import_preview_reads_only_generated_staged_upload_names ... ok
test tests::memo_and_tags_split_the_payee_without_losing_text ... ok
test tests::money_is_on_for_the_instance_and_off_for_a_new_user ... ok
test tests::inferred_opening_balance_needs_explicit_confirmation ... ok
test tests::month_revision_increases_after_each_assignment ... ok
test tests::move_money_keeps_ready_to_assign_and_card_gets_payment_category ... ok
test tests::multiple_assignment_rows_set_one_exact_total ... ok
test tests::other_users_and_sessions_without_data_scope_see_nothing ... ok
test tests::overflowing_category_sum_is_rejected_before_assignment_write ... ok
test tests::overflowing_cleared_subset_is_rejected_before_transaction_write ... ok
test tests::overflowing_derived_balance_is_rejected_before_the_write ... ok
test tests::overspending_reports_ynab_states ... ok
test tests::plugin_code_never_uses_floating_point ... ok
test tests::parsed_money_cache_shares_documents_and_prunes_removed_months ... ok
test tests::recheck_metadata_files_use_the_reader_size_cap ... ok
test tests::recheck_local_server_number_and_lifecycle_contract ... ok
test tests::recheck_source_checks_owner_and_opening_balance_confirmation ... ok
test tests::review_1130::review1130_cancel_after_partial_preparation ... ok
test tests::review_1130::review1130_legacy_home_needs_no_metadata_rewrite ... ok
test tests::recheck_random_preview_cancellation_leaves_no_files ... ok
test tests::review_1130::review1130_notes_are_inert ... ok
test tests::review_1130::review1130_long_imported_note_allows_amount_edit_without_loss ... ok
test tests::review_1130::review1130_split_and_closed_transfer_have_one_posting ... ok
test tests::review_1130::review1130_reconciled_closed_balances ... ok
test tests::review_1130::review1130_tcp_locks_reimport_and_cancel ... ok
test tests::review_984::review3_first_future_transaction_keeps_current_event_month ... ok
test tests::review_984::review3_future_only_edit_and_delete_keep_current_event_month ... ok
test tests::review_984::review3_outside_current_range_writes_emit_no_overspend ... ok
test tests::review_984::review_category_edit_emits_for_old_category_only ... ok
test tests::review_984::review_concurrent_assign_revisions_match_final_report ... ok
test tests::review_984::review_cross_month_refund_move_emits_current_crossing ... ok
test tests::review_984::review_file_replacement_advances_month_revision ... ok
test tests::review_984::review_exact_zero_healing_recrossing_and_delete ... ok
test tests::review_984::review_split_and_tracking_transfer_writes_are_rejected_without_events ... ok
test tests::review_984::review_user_zone_month_and_year_edges ... ok
test tests::review_984::review_source_generation_tracks_all_files_and_restoration ... ok
test tests::review_bulkrev2::four_conflicts_return_409_without_writing ... ok
test tests::same_handle_settles_a_failed_move_before_the_next_request ... ok
test tests::simultaneous_import_confirmations_have_one_winner ... ok
test tests::review_bulkrev2::two_and_five_assignment_races_match_serial_targets ... ok
test tests::source_total_mismatch_cannot_be_confirmed ... ok
test tests::transaction_identity_preview_is_atomic_and_reimport_changes_nothing ... ok
test tests::transaction_logged_event_has_the_documented_create_payload ... ok
test tests::bulk_write_balances_equal_one_by_one ... ok
test tests::transfer_register_view_exposes_linked_category ... ok
test tests::transfer_cleared_edits_are_per_account ... ok
test tests::slow_15mb_import_receive_completes_with_progress ... ok
test tests::wizard_background_job_retains_safe_failure ... ok
test tests::update_transaction_emits_current_month_overspend_crossing ... ok
test tests::ynab_conflicting_accounts_and_payees_are_not_silently_discarded ... ok
test tests::ynab_csv_import_keeps_exact_month_and_register_amounts ... ok
test tests::ynab_duplicate_category_ids_are_merged_only_when_identical ... ok
test tests::ynab_plan_json_import_keeps_exact_milliunits ... ok
test tests::wizard_background_job_recovers_preview_after_response_is_dropped ... ok
test tests::ynab_public_demo_imports_duplicate_category_names_by_id ... ok
test tests::wizard_starter_categories_validate_before_create_and_do_not_change_totals ... ok
test tests::card_models_ignore_arrival_batch_and_timezone ... ok

test result: ok. 133 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 1775.80s

     Running tests/import_review.rs (/home/kayg/build/targets/bulkfix2/debug/deps/import_review-6a0b9e5006b57cbf)

running 32 tests
test csv_bom_mixed_endings_and_decimal_comma_are_exact ... ok
test corrupt_actual_database_is_a_private_error ... ok
test csv_transaction_ids_merge_or_reject_before_totals ... ok
test identity_csv_transfer_growth_curve ... ignored, run with MONEY_IDENT_CSV_ROWS for 10k/100k/1M transfer profiling
test csv_amount_edges_never_round_group_or_overflow ... ok
test recheck_actual_stream_growth_curve ... ignored, run with MONEY_RECHECK_ARCHIVE and MONEY_RECHECK_ROWS for profiling
test recheck_conflicting_transaction_ids_are_rejected ... ok
test recheck_csv_transfer_growth_curve ... ignored, run with MONEY_RECHECK_TRANSFERS for the bounded CSV growth probe
test recheck_e2e_csv_has_four_checks_and_keeps_every_minor_unit ... ok
test recheck_identical_transaction_ids_do_not_double_money ... ok
test recheck_reconciled_negative_zero_and_exact_source_scales ... ok
test split_identity_cannot_reuse_a_top_level_id ... ok
test split_identity_concrete_valid_totals ... ok
test split_identity_includes_parent_deleted_and_transfer_fields ... ok
test csv_pairing_accepts_cancellation_during_its_loop ... ok
test split_identity_rejects_an_inconsistent_embedded_parent ... ok
test split_identity_review_cases_reject ... ok
test transaction_identity_checks_fields_and_keeps_distinct_ids ... ok
test split_identity_merges_before_totals ... ok
test transaction_identity_preserves_exact_units ... ok
test transfer_legs_prefer_a_same_month_mate ... ok
test transfer_month_identity_rejects_in_both_adapters ... ok
test transfer_month_review_cases_reject ... ok
test unmatched_transfer_legs_keep_the_source_register ... ok
test ynab_account_check_rejects_a_wrong_normalization ... ok
test csv_pairing_keeps_exact_account_legs ... ok
test ynab_csv_preserves_exact_minor_units ... ok
test ynab_negative_zero_amount_is_zero ... ok
test ynab_unrepresentable_milliunits_are_rejected ... ok
test transfer_month_pairing_keeps_dates_and_exact_pair_priority ... ok
test ynab_json_keeps_exact_split_and_transfer_postings ... ok
test raw_ynab_registers_match_a_raw_row_oracle ... ok

test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 11.70s

   Doc-tests calternal_money

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

   Doc-tests calternal_plugin_money

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

Focused Python refund/split oracle tests

.......                                                                  [100%]
7 passed, 47 deselected in 8.58s

Cleanup: cargo clean completed; worktree web build outputs and test temporary files were removed. Build symlinks were unlinked without following their targets. Git status is clean.

     Removed 6256 files, 2.5GiB total

Head 3e5fe2ae1c; B1 FIXED; N2 FIXED.

bulkfix2 (#1393) Head: 3e5fe2ae1c82f69ee26c8f9d56000db7b9cd26db Base: c8d278b00b845a905efca659b49463323e2ad0e1 Branch: job/bulkwrite-1393 Merged origin/dev once before final gates (b93a497e7). No push, deployment or merge into dev/main. Built - B1: a categorized Card refund restores its Category and releases reserve even when a payment already covered its purchase. Release its own unpaid purchases first, then other funded purchases on that Card. Cap the release by positive reserve and prior debt. Keep positive Card credit and payment overfunding as real budget money. Split refunds use each child's prior balance; the parent Account balance posts once. - N2: one canonical sort now feeds both the cash-activity pre-pass and the posting pass. Both boundary permutations return the expected valid model. - Converted both review witnesses to correct-result assertions. Added a 256-case shuffle/conservation property with paid and unpaid refunds, purchases, splits, payments, transfers, payment overfunding and three months. Retained the broader 256-case shuffle property and added a split refund crossing zero Card balance. - Added an independent numeric check for all 11 reviewed vectors. Their recorded outputs remain unchanged. - Updated the Python oracle and one legacy vector (9f1c6b453f4864f3). That old expectation kept duplicate reserve when an oversized refund cleared the Card balance. This is the refund behavior the brief explicitly changes; no unrelated expectation changed. Origin/dev comparison The frozen origin/dev budget module returns reserve 10,000 and total Available 20,000 for payment-first B1, in both March and April. Refund-first returns reserve 0 and Available 10,000. The fixed code returns the correct complete model for both file orders and for the earlier refund date. All amounts are synthetic fixture cents. Evidence: artifacts/origin-dev-b1.log. Files changed by bulkfix2 - crates/calternal-money/src/budget.rs - crates/calternal-money/tests/properties.rs - crates/calternal-money/tests/review_bulkrev2/core.rs - crates/calternal-money/tests/vectors.rs - docs/DESIGN.md (§48) - spikes/money-format/budget_math.py - spikes/money-markdown/test_money_adversarial.py - contracts/vectors/money/money.v1.json Decisions For fully funded expense histories, without import reconciliation adjustments: expense Category Available + payment Category Available + Ready to Assign = Cash balances + positive Card balances, at every month end. Payment reserves are already in Category Available; do not count them twice. Negative Card balances are debt, not budget money. Current-month credit deficits and imported Ready to Assign adjustments need separate corrections. DESIGN §48 and the property comment now state this domain and equation. Existing cash-only and mixed-deficit conservation tests remain unchanged. Refund queue choice: release the refunded Category's unpaid reserve first, then consume the Card's oldest other funded purchases. Cap debt per split child, so crossing zero cannot consume payment overfunding. Expected cost For T month rows and L child legs: one O(T log T) canonical sort, then two O(T + L) passes and amortized queue consumption. The existing sort is reused; no extra sort, file scan, DB query or IO is added. This number-fix job did not run a performance measurement, per the current verification policy. The existing #1393 profile remains available for the merge round. Known gaps No identified B1/N2 gap remains. The funded conservation property does not claim a universal signed-account equation for unfunded credit or source reconciliation adjustments. No UI code changed; screenshots and UX-control review do not apply. For the merge round - `CALTERNAL_SERVER_BIN=<merged prebuilt binary> bun tests/adversarial/money_api.mjs`: verify real-server Money input rejection, write isolation and exact balances on the combined branch. - When performance is measured, use the existing `bench/bulk-write-1393.mjs` through `perf-run calternal <job> <minutes> -- ...`, with Money, 2,000 rows, concurrency 1/8 and five samples. Compare with docs/perf/2026-10-08-1393-bulk-writes.md. Build here and copy the binary; do not build on the perf VM. - Full web/e2e/adversarial matrices, release/deployment and Mac checks remain with the merge round under the verification policy. Gate environment CARGO_PROFILE_DEV_DEBUG=line-tables-only CARGO_INCREMENTAL=0 CARGO_BUILD_JOBS=4 TMPDIR=<worktree>/target/tmp CARGO_TARGET_DIR retained as preset. Status: READY FOR MERGE. All requested Rust gates passed. Gate output (verbatim) `cargo fmt --check`: exit 0, no output. `cargo clippy -p calternal-money -p calternal-plugin-money --all-targets -- -D warnings` ```text Checking calternal-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-money) Checking calternal-plugin-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/plugins/money) Finished `dev` profile [unoptimized + debuginfo] target(s) in 27.76s ``` `cargo test -p calternal-money -p calternal-plugin-money -- --test-threads=4` ```text Blocking waiting for file lock on package cache Blocking waiting for file lock on build directory Compiling memchr v2.8.3 Compiling once_cell v1.21.4 Compiling futures-core v0.3.34 Compiling serde_core v1.0.229 Compiling pin-project-lite v0.2.17 Compiling jobserver v0.1.35 Compiling log v0.4.34 Compiling bytes v1.12.1 Compiling cc v1.4.7 Compiling zerofrom v0.1.8 Compiling stable_deref_trait v1.2.1 Compiling serde v1.0.229 Compiling socket2 v0.6.5 Compiling yoke v0.8.3 Compiling zerovec v0.11.8 Compiling equivalent v1.0.2 Compiling num-traits v0.2.19 Compiling litemap v0.8.3 Compiling hashbrown v0.17.1 Compiling tinystr v0.8.4 Compiling rand_core v0.10.1 Compiling writeable v0.6.4 Compiling potential_utf v0.1.6 Compiling getrandom v0.4.3 Compiling zerotrie v0.2.5 Compiling icu_locale_core v2.3.0 Compiling utf8_iter v1.0.4 Compiling tracing-core v0.1.36 Compiling futures-io v0.3.34 Compiling icu_collections v2.3.0 Compiling futures-task v0.3.34 Compiling scopeguard v1.2.0 Compiling typenum v1.20.1 Compiling icu_provider v2.3.1 Compiling tracing v0.1.44 Compiling icu_normalizer_data v2.3.0 Compiling mio v1.2.3 Compiling errno v0.3.14 Compiling percent-encoding v2.3.2 Compiling futures-sink v0.3.34 Compiling lock_api v0.4.14 Compiling signal-hook-registry v1.4.8 Compiling icu_properties_data v2.3.0 Compiling serde_json v1.0.151 Compiling smallvec v1.16.1 Compiling tokio v1.53.1 Compiling icu_properties v2.3.0 Compiling indexmap v2.14.2 Compiling iana-time-zone v0.1.65 Compiling slab v0.4.12 Compiling chrono v0.4.45 Compiling form_urlencoded v1.2.2 Compiling futures-util v0.3.34 Compiling cmake v0.1.58 Compiling http v1.5.0 Compiling aws-lc-sys v0.45.0 Compiling siphasher v1.0.3 Compiling generic-array v0.14.9 Compiling spin v0.9.9 Compiling hybrid-array v0.4.15 Compiling aho-corasick v1.1.5 Compiling allocator-api2 v0.2.21 Compiling foldhash v0.2.0 Compiling base64 v0.22.1 Compiling cpufeatures v0.2.17 Compiling regex-automata v0.4.18 Compiling hashbrown v0.16.1 Compiling crossbeam-utils v0.8.23 Compiling icu_normalizer v2.3.0 Compiling zeroize v1.9.0 Compiling crc-catalog v2.5.0 Compiling parking v2.2.1 Compiling tempfile v3.27.0 Compiling event-listener v5.4.2 Compiling crc v3.4.0 Compiling regex v1.13.1 Compiling idna_adapter v1.2.2 Compiling hashlink v0.11.1 Compiling crossbeam-queue v0.3.14 Compiling crypto-common v0.1.6 Compiling block-buffer v0.10.4 Compiling http-body v1.1.0 Compiling parking_lot_core v0.9.12 Compiling futures-channel v0.3.34 Compiling simd-adler32 v0.3.10 Compiling rusty-fork v0.3.1 Compiling parking_lot v0.12.5 Compiling digest v0.10.7 Compiling idna v1.1.0 Compiling rustls-pki-types v1.15.1 Compiling crypto-common v0.2.2 Compiling libsqlite3-sys v0.37.0 Compiling tower-service v0.3.3 Compiling cpufeatures v0.3.1 Compiling proptest v1.11.0 Compiling tokio-stream v0.1.19 Compiling either v1.18.0 Compiling url v2.5.8 Compiling sha2 v0.10.9 Compiling futures-intrusive v0.5.0 Compiling httparse v1.10.1 Compiling calternal-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-money) Compiling tokio-util v0.7.19 Compiling adler2 v2.0.1 Compiling try-lock v0.2.5 Compiling atomic-waker v1.1.2 Compiling untrusted v0.9.0 Compiling sqlx-core v0.9.0 Compiling want v0.3.1 Compiling h2 v0.4.19 Compiling atoi v2.0.0 Compiling crc32fast v1.5.2 Compiling thiserror v2.0.21 Compiling futures-executor v0.3.34 Compiling flume v0.12.0 Compiling inout v0.2.2 Compiling phf_shared v0.11.3 Compiling blake3 v1.8.7 Compiling sync_wrapper v1.0.2 Compiling subtle v2.6.1 Compiling httpdate v1.0.3 Compiling tower-layer v0.3.3 Compiling ryu v1.0.23 Compiling cmov v0.5.4 Compiling ipnet v2.12.2 Compiling hyper v1.11.1 Compiling ctutils v0.4.2 Compiling phf_generator v0.11.3 Compiling sqlx-sqlite v0.9.0 Compiling miniz_oxide v0.9.1 Compiling aws-lc-rs v1.18.1 Compiling rustls v0.23.45 Compiling block-buffer v0.12.1 Compiling phf_shared v0.12.1 Compiling zlib-rs v0.6.8 Compiling arrayvec v0.7.8 Compiling constant_time_eq v0.4.2 Compiling rustls-webpki v0.103.15 Compiling flate2 v1.1.10 Compiling sqlx-macros-core v0.9.0 Compiling phf v0.12.1 Compiling cipher v0.5.2 Compiling multiversion v0.9.0 Compiling hyper-util v0.1.20 Compiling universal-hash v0.6.1 Compiling phf_macros v0.11.3 Compiling tower v0.5.3 Compiling http-body-util v0.1.5 Compiling openssl-probe v0.2.1 Compiling core_detect v1.0.0 Compiling simdutf8 v0.1.5 Compiling mime v0.3.17 Compiling rustls-native-certs v0.8.4 Compiling encoding_rs v0.8.41 Compiling phf v0.11.3 Compiling tokio-rustls v0.26.6 Compiling poly1305 v0.9.1 Compiling chacha20 v0.10.2 Compiling sqlx-macros v0.9.0 Compiling chrono-tz v0.10.4 Compiling inotify-sys v0.1.8 Compiling aead v0.6.1 Compiling miniz_oxide v0.8.9 Compiling fdeflate v0.3.7 Compiling color_quant v1.1.0 Compiling same-file v1.0.6 Compiling quick-error v2.0.1 Compiling weezl v0.1.12 Compiling winnow v0.7.15 Compiling calternal-path v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-path) Compiling zune-core v0.5.3 Compiling pxfm v0.1.30 Compiling byteorder-lite v0.1.0 Compiling cron v0.17.0 Compiling image-webp v0.2.4 Compiling zune-jpeg v0.5.15 Compiling gif v0.14.2 Compiling png v0.18.1 Compiling moxcms v0.8.1 Compiling walkdir v2.5.0 Compiling utoipa v6.0.0 Compiling chacha20poly1305 v0.11.0 Compiling sqlx v0.9.0 Compiling inotify v0.11.5 Compiling multer v3.1.0 Compiling hyper-rustls v0.27.10 Compiling axum-core v0.5.6 Compiling unicode-joining-type v1.0.0 Compiling rustls-platform-verifier v0.7.0 Compiling tower-http v0.6.11 Compiling serde_urlencoded v0.7.1 Compiling uuid v1.26.1 sccache: warning: The server looks like it shut down unexpectedly, compiling locally instead sccache: warning: The server looks like it shut down unexpectedly, compiling locally instead sccache: warning: The server looks like it shut down unexpectedly, compiling locally instead sccache: warning: The server looks like it shut down unexpectedly, compiling locally instead Compiling notify-types v2.1.0 Compiling serde_path_to_error v0.1.20 Compiling unicase v2.9.0 Compiling matchit v0.8.4 Compiling bytemuck v1.25.2 Compiling bumpalo v3.20.3 Compiling base64 v0.23.1 Compiling unsafe-libyaml v0.2.11 Compiling unicode-properties v0.1.4 Compiling unicode-casefold v0.2.0 Compiling calternal-fs v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-fs) Compiling reqwest v0.13.5 Compiling serde_yaml v0.9.34+deprecated Compiling zopfli v0.8.3 Compiling image v0.25.10 Compiling axum v0.8.9 Compiling pulldown-cmark v0.13.4 Compiling notify v8.2.0 Compiling calternal-db v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-db) Compiling calternal-api v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-api) Compiling linkme v0.3.37 Compiling quick-xml v0.42.0 Compiling csv-core v0.1.13 Compiling calternal-notes-core v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-notes-core) Compiling zip v5.1.1 Compiling calternal-plugin v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-plugin) Compiling csv v1.4.0 Compiling calternal-plugin-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/plugins/money) Finished `test` profile [unoptimized + debuginfo] target(s) in 11m 50s Running unittests src/lib.rs (/home/kayg/build/targets/bulkfix2/debug/deps/calternal_money-5ad27f9b5c008064) running 16 tests test codec::tests::empty_payee_is_refused_by_the_writer ... ok test codec::tests::malformed_dated_rows_fail_instead_of_vanishing ... ok test codec::tests::transaction_round_trip_with_punctuation_in_labels_and_payee ... ok test codec::tests::round_trip_keeps_bom_crlf_and_unknown_bytes ... ok test codec::tests::property_edit_changes_one_value ... ok test edit::tests::cleared_tag_toggles_without_touching_other_tags ... ok test edit::tests::crlf_file_keeps_crlf_on_insert ... ok test edit::tests::unicode_payee_tag_boundaries_match_shared_vectors ... ok test codec::tests::checked_parse_stops_after_a_bounded_line_batch ... ok test units::tests::exact_range_is_enforced_on_parse_and_arithmetic ... ok test units::tests::format_uses_explicit_sign_and_exact_scale ... ok test units::tests::parse_matches_the_oracle_examples ... ok test units::tests::scale_table_has_all_165_codes_with_unique_entries ... ok test units::independent_number_review::signed_edges_and_long_zero_padding_keep_exact_minor_units ... ok test edit::tests::new_budget_projects_with_no_accounts ... ok test edit::tests::assign_inserts_updates_and_removes_rows ... ok test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.09s Running tests/account_kinds.rs (/home/kayg/build/targets/bulkfix2/debug/deps/account_kinds-40f136ace82559dd) running 4 tests test account_projection_rejects_legacy_and_unknown_kinds ... ok test off_budget_balance_marker_does_not_change_budget_money ... ok test imported_account_kinds_project_without_losing_identity ... ok test categorized_debit_loan_transfers_post_one_budget_leg ... ok test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s Running tests/import.rs (/home/kayg/build/targets/bulkfix2/debug/deps/import-32258f8fda96f336) running 13 tests test import_render_is_exact_and_byte_stable ... ok test duplicate_source_ids_are_rejected_and_duplicate_names_are_kept ... ok test import_replay_matches_full_ledger_month_by_month ... ok test import_keeps_same_day_source_order_for_credit_payments_and_refunds ... ok test import_render_reports_progress_and_propagates_cancel ... ok test import_stream_renderer_matches_full_rendered_files ... ok test production_v1_metadata_upgrade_keeps_balances ... ok test recheck_half_minor_units_negative_zero_and_nineteen_digits ... ok test budget_replay_stops_at_a_bounded_transaction_checkpoint ... ok test imported_ready_to_assign_matches_independent_month_oracle ... ok test recheck_same_day_payment_and_refund_keep_source_fifo ... ok test random_imports_conserve_source_balances_and_markdown ... ok test recheck_random_multicurrency_ledgers_match_all_monthly_totals ... ok test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 16.40s Running tests/properties.rs (/home/kayg/build/targets/bulkfix2/debug/deps/properties-9ff9e71a800dacb8) running 21 tests test bill_coverage_never_clamps_the_bill ... ok test bulkrev2::boundary_shuffle_reports_acceptance_difference ... ok test bulkrev2::i64_extremes_are_rejected_and_safe_bound_is_exact ... ok test bulkrev2::literal_account_sum_and_funded_card_conservation ... ok test bulkrev2::refund_payment_calendar_choice_is_visible_next_month ... ok test any_text_that_parses_serializes_to_the_same_bytes ... ok test bulkrev2::split_refund_keeps_payment_overfunding_when_card_becomes_positive ... ok test assign_then_unassign_is_the_identity ... ok test decimal_text_round_trips_for_every_scale ... ok test cash_ledgers_conserve_money_every_month ... ok test fully_funded_card_spending_conserves_cash ... ok test money_code_never_uses_floating_point ... ok test mixed_cash_credit_deficit_rolls_only_its_cash_part ... ok test paired_write_replay_matches_independent_calculations ... ok test reviewed_burst_order_matches_input_order ... ok test partial_payment_then_category_refunds_conserve_cash_across_months ... ok test split_legs_post_exactly_the_parent ... ok test bulkrev2::funded_shuffles_conserve_real_money_every_month ... ok test transaction_rows_round_trip_byte_for_byte ... ok test same_date_card_postings_are_a_function_of_the_set ... ok test bulkrev2::same_day_shuffles_cover_splits_transfers_and_month_edges ... ok test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 10.14s Running tests/ready_to_assign_adjustment.rs (/home/kayg/build/targets/bulkfix2/debug/deps/ready_to_assign_adjustment-0e1c5c7276d14077) running 1 test test ready_to_assign_adjustment_changes_only_the_budget_pool ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s Running tests/review_984.rs (/home/kayg/build/targets/bulkfix2/debug/deps/review_984-dc85183370c2f07a) running 5 tests test review_pair_performance_profile ... ignored, performance measurements belong to the merge round on the perf VM test review_pair_rejects_bad_months_and_amounts_without_rounding ... ok test review_split_remainders_and_tracking_transfers_are_exact ... ok test review_mixed_pair_matches_independent_replays ... ok test review_large_ledger_pair_keeps_exact_totals ... ok test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 4.13s Running tests/vectors.rs (/home/kayg/build/targets/bulkfix2/debug/deps/vectors-b0e2a54af0711cc9) running 3 tests test rust_matches_random_oracle_ledgers_without_divergences ... ok test reviewed_eleven_refund_vectors_keep_their_exact_numbers ... ok test rust_port_matches_every_recorded_oracle_vector ... ok test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.72s Running unittests src/lib.rs (/home/kayg/build/targets/bulkfix2/debug/deps/calternal_plugin_money-3d165b6d3890a332) running 135 tests test import::import_review_tests::actual_cents_conversion_never_rounds ... ok test import::import_review_tests::actual_cc_label_requires_missing_type_confirmation ... ok test import::import_review_tests::actual_orphan_split_children_are_rejected ... ok test import::import_review_tests::actual_stream_memory_guard_child ... ignored, invoked as an isolated child by actual_stream_keeps_a_large_history_bounded test import::import_review_tests::actual_account_checks_use_raw_monthly_source_rows ... ok test import::import_review_tests::import_control_reports_progress_and_stops_cancelled_work ... ok test import::import_review_tests::actual_transfer_legs_cannot_cross_months ... ok running 1 test test import::import_review_tests::ynab_transfer_pairing_handles_many_duplicate_legs ... ok test import_fidelity_1130::independent_split_and_transfer_numbers_check ... ok test routes::durable::admission_tests::cancelled_receiver_cannot_acknowledge_a_durable_job ... ok test routes::durable::checkpoint_tests::progress_wait_keeps_parser_writer_release_polled ... ok test routes::durable::admission_tests::live_publication_honors_operational_queue_cancellation ... ok test routes::import_cleanup_tests::dropped_preview_worker_retains_admission_until_exit ... ok test routes::import_cleanup_tests::idle_imports_are_reclaimed_by_expiry_cleanup ... ok test routes::import_cleanup_tests::staged_import_files_keep_ranges_and_release_private_storage ... ok test routes::import_staged_path_tests::staged_import_name_cannot_select_another_path_or_slot ... ok test routes::replay_reuse_tests::assignment_retry_rebuilds_from_latest_source_bytes ... ok test import_fidelity_1130::actual_rows_round_trip ... ok test routes::replay_reuse_tests::crossings_reuse_checked_current_totals_even_with_future_months ... ok test routes::replay_reuse_tests::crossings_cover_source_ranges_relative_to_today ... ok test routes::review_1140::cancel_wins_before_publication_lock ... ok test routes::review_1140::cancel_does_not_rewrite_published_result ... ok test routes::durable::money_import_undo_mutation ... ok test routes::review_1140::review1140_cancel_after_rename_before_receipt_keeps_publication ... ok test routes::review_1140::review1140_all_formats_replay_exact_balances ... ok test routes::review_1140::review1140_discard_after_confirmation_failure_releases_admission ... ok test routes::review_1140::review1140_operational_cancel_before_replacement_returns_no_receipt ... ok test routes::review_1140::review1140_staged_size_limits_fail_without_publishing ... ok test routes::review_1140::review1140_terminal_receipts_do_not_block_new_imports ... ok test store::parsed_cache_tests::global_budget_and_folder_pruning_release_stale_entries ... ok test store::parsed_cache_tests::parse_charge_accounts_for_line_structures ... ok test store::parsed_cache_tests::user_cache_evicts_old_parse_entries_and_shares_hot_documents ... ok test routes::review_1140::review1140_tcp_malformed_inputs_leave_worker_usable ... ok test tests::a_broken_file_is_reported_not_hidden ... ok test tests::a_new_user_sees_the_real_empty_state ... ok test tests::a_journal_for_a_completed_move_changes_nothing ... ok test tests::a_read_waits_for_a_write_in_progress ... ok test tests::active_money_handle_survives_other_users_cache_pressure ... ok test tests::actual_duplicate_names_import_by_id_without_sharing_a_payment_category ... ok test tests::actual_export_archive_imports_exact_rows_from_private_scratch ... ok test tests::a_split_row_written_by_hand_is_read_but_not_edited ... ok test tests::api_account_numbers_equal_core_replay ... ok test routes::review_1140::review1140_replacement_receipt_recovery_does_not_adopt_later_edits ... ok test tests::assignments_retry_source_conflicts_without_losing_neighbours ... ok test tests::backdated_create_emits_current_month_overspend_crossing ... ok test tests::budget_flow_writes_exact_markdown_and_derives_available ... ok test tests::bulk_write_invalid_neighbours_do_not_change_valid_rows ... ok test tests::bulk_write_month_does_not_need_note_date_backfill ... ok test tests::cancel_racing_confirm_has_one_consistent_outcome ... ok test tests::cancelling_imports_leaves_no_budget_and_releases_slots ... ok test tests::bulk_write_rejects_intermediate_overflow ... ok test tests::concurrent_store_edits_keep_exactly_one_winner ... ok test tests::csv_import_keeps_progress_and_cancel_responsive ... ok test tests::delete_transaction_emits_current_month_overspend_crossing ... ok test import::import_review_tests::actual_stream_keeps_a_large_history_bounded has been running for over 60 seconds test import::import_review_tests::actual_stream_memory_guard_child has been running for over 60 seconds test tests::denied_preview_access_keeps_the_owners_pending_import ... ok test import::import_review_tests::actual_stream_memory_guard_child ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 134 filtered out; finished in 106.67s test import::import_review_tests::actual_stream_keeps_a_large_history_bounded ... ok test tests::durable_import_tests::operation_exit_child ... ignored, child of operation_recovery_survives_process_exit_at_every_phase test tests::bulk_write_balances_equal_one_by_one has been running for over 60 seconds test tests::card_models_ignore_arrival_batch_and_timezone has been running for over 60 seconds test tests::durable_import_tests::generated_import_confirm_replay_and_undo_preserve_minor_units has been running for over 60 seconds test tests::durable_import_tests::generated_import_confirm_replay_and_undo_preserve_minor_units ... ok test tests::durable_import_tests::operation_recovery_survives_process_exit_at_every_phase has been running for over 60 seconds test tests::durable_import_tests::publication_and_inverse_authority_use_full_commits ... ok test tests::durable_import_tests::queued_import_and_undo_survive_restarts ... ok test tests::durable_import_tests::receipt_reads_are_bounded_and_old_receipts_are_addressable ... ok test tests::durable_import_tests::operation_recovery_survives_process_exit_at_every_phase ... ok test tests::durable_import_tests::replay_preserves_a_live_ready_preview ... ok test tests::durable_import_tests::running_jobs_do_not_expire_and_cancelled_jobs_do_not_restart ... ok test tests::durable_import_tests::undo_receipt_replay_never_removes_a_restored_import ... ok test tests::durable_import_tests::undo_refuses_a_predecessor_restored_before_the_inverse ... ok test tests::durable_import_tests::undo_refuses_every_later_budget_edit_after_restart ... ok test tests::durable_import_tests::undo_restarts_before_and_after_the_filesystem_inverse ... ok test tests::failed_cross_month_move_never_counts_the_row_twice ... ok test tests::durable_import_tests::replacement_restarts_at_every_durable_phase has been running for over 60 seconds test tests::far_month_assignment_cannot_make_the_budget_unreadable ... ok test tests::gap_month_assignments_and_opening_card_debt_do_not_create_cash ... ok test tests::historical_overspend_does_not_emit_current_month_event ... ok test tests::hostile_inputs_are_rejected_without_writing ... ok test tests::idle_import_receive_releases_admission_and_cancel_stops_read ... ok test tests::durable_import_tests::replacement_restarts_at_every_durable_phase ... ok test tests::import_file_limits_match_the_money_reader ... ok test tests::import_fidelity_review_requires_account_kind_and_keeps_notes ... ok test tests::import_preview_is_owner_bound_and_confirmation_publishes_once ... ok test tests::import_preview_reads_only_generated_staged_upload_names ... ok test tests::memo_and_tags_split_the_payee_without_losing_text ... ok test tests::money_is_on_for_the_instance_and_off_for_a_new_user ... ok test tests::inferred_opening_balance_needs_explicit_confirmation ... ok test tests::month_revision_increases_after_each_assignment ... ok test tests::move_money_keeps_ready_to_assign_and_card_gets_payment_category ... ok test tests::multiple_assignment_rows_set_one_exact_total ... ok test tests::other_users_and_sessions_without_data_scope_see_nothing ... ok test tests::overflowing_category_sum_is_rejected_before_assignment_write ... ok test tests::overflowing_cleared_subset_is_rejected_before_transaction_write ... ok test tests::overflowing_derived_balance_is_rejected_before_the_write ... ok test tests::overspending_reports_ynab_states ... ok test tests::plugin_code_never_uses_floating_point ... ok test tests::parsed_money_cache_shares_documents_and_prunes_removed_months ... ok test tests::recheck_metadata_files_use_the_reader_size_cap ... ok test tests::recheck_local_server_number_and_lifecycle_contract ... ok test tests::recheck_source_checks_owner_and_opening_balance_confirmation ... ok test tests::review_1130::review1130_cancel_after_partial_preparation ... ok test tests::review_1130::review1130_legacy_home_needs_no_metadata_rewrite ... ok test tests::recheck_random_preview_cancellation_leaves_no_files ... ok test tests::review_1130::review1130_notes_are_inert ... ok test tests::review_1130::review1130_long_imported_note_allows_amount_edit_without_loss ... ok test tests::review_1130::review1130_split_and_closed_transfer_have_one_posting ... ok test tests::review_1130::review1130_reconciled_closed_balances ... ok test tests::review_1130::review1130_tcp_locks_reimport_and_cancel ... ok test tests::review_984::review3_first_future_transaction_keeps_current_event_month ... ok test tests::review_984::review3_future_only_edit_and_delete_keep_current_event_month ... ok test tests::review_984::review3_outside_current_range_writes_emit_no_overspend ... ok test tests::review_984::review_category_edit_emits_for_old_category_only ... ok test tests::review_984::review_concurrent_assign_revisions_match_final_report ... ok test tests::review_984::review_cross_month_refund_move_emits_current_crossing ... ok test tests::review_984::review_file_replacement_advances_month_revision ... ok test tests::review_984::review_exact_zero_healing_recrossing_and_delete ... ok test tests::review_984::review_split_and_tracking_transfer_writes_are_rejected_without_events ... ok test tests::review_984::review_user_zone_month_and_year_edges ... ok test tests::review_984::review_source_generation_tracks_all_files_and_restoration ... ok test tests::review_bulkrev2::four_conflicts_return_409_without_writing ... ok test tests::same_handle_settles_a_failed_move_before_the_next_request ... ok test tests::simultaneous_import_confirmations_have_one_winner ... ok test tests::review_bulkrev2::two_and_five_assignment_races_match_serial_targets ... ok test tests::source_total_mismatch_cannot_be_confirmed ... ok test tests::transaction_identity_preview_is_atomic_and_reimport_changes_nothing ... ok test tests::transaction_logged_event_has_the_documented_create_payload ... ok test tests::bulk_write_balances_equal_one_by_one ... ok test tests::transfer_register_view_exposes_linked_category ... ok test tests::transfer_cleared_edits_are_per_account ... ok test tests::slow_15mb_import_receive_completes_with_progress ... ok test tests::wizard_background_job_retains_safe_failure ... ok test tests::update_transaction_emits_current_month_overspend_crossing ... ok test tests::ynab_conflicting_accounts_and_payees_are_not_silently_discarded ... ok test tests::ynab_csv_import_keeps_exact_month_and_register_amounts ... ok test tests::ynab_duplicate_category_ids_are_merged_only_when_identical ... ok test tests::ynab_plan_json_import_keeps_exact_milliunits ... ok test tests::wizard_background_job_recovers_preview_after_response_is_dropped ... ok test tests::ynab_public_demo_imports_duplicate_category_names_by_id ... ok test tests::wizard_starter_categories_validate_before_create_and_do_not_change_totals ... ok test tests::card_models_ignore_arrival_batch_and_timezone ... ok test result: ok. 133 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 1775.80s Running tests/import_review.rs (/home/kayg/build/targets/bulkfix2/debug/deps/import_review-6a0b9e5006b57cbf) running 32 tests test csv_bom_mixed_endings_and_decimal_comma_are_exact ... ok test corrupt_actual_database_is_a_private_error ... ok test csv_transaction_ids_merge_or_reject_before_totals ... ok test identity_csv_transfer_growth_curve ... ignored, run with MONEY_IDENT_CSV_ROWS for 10k/100k/1M transfer profiling test csv_amount_edges_never_round_group_or_overflow ... ok test recheck_actual_stream_growth_curve ... ignored, run with MONEY_RECHECK_ARCHIVE and MONEY_RECHECK_ROWS for profiling test recheck_conflicting_transaction_ids_are_rejected ... ok test recheck_csv_transfer_growth_curve ... ignored, run with MONEY_RECHECK_TRANSFERS for the bounded CSV growth probe test recheck_e2e_csv_has_four_checks_and_keeps_every_minor_unit ... ok test recheck_identical_transaction_ids_do_not_double_money ... ok test recheck_reconciled_negative_zero_and_exact_source_scales ... ok test split_identity_cannot_reuse_a_top_level_id ... ok test split_identity_concrete_valid_totals ... ok test split_identity_includes_parent_deleted_and_transfer_fields ... ok test csv_pairing_accepts_cancellation_during_its_loop ... ok test split_identity_rejects_an_inconsistent_embedded_parent ... ok test split_identity_review_cases_reject ... ok test transaction_identity_checks_fields_and_keeps_distinct_ids ... ok test split_identity_merges_before_totals ... ok test transaction_identity_preserves_exact_units ... ok test transfer_legs_prefer_a_same_month_mate ... ok test transfer_month_identity_rejects_in_both_adapters ... ok test transfer_month_review_cases_reject ... ok test unmatched_transfer_legs_keep_the_source_register ... ok test ynab_account_check_rejects_a_wrong_normalization ... ok test csv_pairing_keeps_exact_account_legs ... ok test ynab_csv_preserves_exact_minor_units ... ok test ynab_negative_zero_amount_is_zero ... ok test ynab_unrepresentable_milliunits_are_rejected ... ok test transfer_month_pairing_keeps_dates_and_exact_pair_priority ... ok test ynab_json_keeps_exact_split_and_transfer_postings ... ok test raw_ynab_registers_match_a_raw_row_oracle ... ok test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 11.70s Doc-tests calternal_money running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests calternal_plugin_money running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` `Focused Python refund/split oracle tests` ```text ....... [100%] 7 passed, 47 deselected in 8.58s ``` Cleanup: cargo clean completed; worktree web build outputs and test temporary files were removed. Build symlinks were unlinked without following their targets. Git status is clean. ```text Removed 6256 files, 2.5GiB total ``` Head 3e5fe2ae1c82f69ee26c8f9d56000db7b9cd26db; B1 FIXED; N2 FIXED.
Author
Owner

Independent number review bulkrev3 started on job/bulkwrite-1393, reviewed head/base 3e5fe2ae1c. Product code will stay unchanged. Author report and result files will not be read. Tests will cover B1/N2 permutations, underfunded and cross-month refunds, mixed cash deficits, two Cards, split returns, hidden/missing Categories, generated histories and the eleven reference vectors. Findings are recorded in artifacts/bulkrev3-findings.md.

Independent number review bulkrev3 started on job/bulkwrite-1393, reviewed head/base 3e5fe2ae1c82f69ee26c8f9d56000db7b9cd26db. Product code will stay unchanged. Author report and result files will not be read. Tests will cover B1/N2 permutations, underfunded and cross-month refunds, mixed cash deficits, two Cards, split returns, hidden/missing Categories, generated histories and the eleven reference vectors. Findings are recorded in artifacts/bulkrev3-findings.md.
Author
Owner

Independent bulkrev3 findings — #1393

Reviewed product head: 3e5fe2ae1c.
All amounts are synthetic fixture cents. Product code is unchanged. Author report and result files were not read.

Previous witnesses

B1: both same-date permutations return 10,000 total Available plus Ready to Assign, against 10,000 real money, in March and April. Reserve is 0. Correct.
N2: all 24 permutations accepted with Cash MAX_EXACT, Card -1, Groceries Available MAX_EXACT-2, Dining 1, reserve 1 and Ready to Assign 0. Correct.

R3-1 — underfunded partial refund removes money (BLOCK)

March 1 Cash income 200; Food Assignment 50. March 10 Card Food purchase -100; March 20 Card Food refund +50.
After the purchase Food is -50 and payment reserve is 50. The refund cancels the unfunded half of the purchase. Expected after refund: Food 0, reserve 50, Ready to Assign 150; Cash 200, Card -50. Total allocations 200. Actual: Food 0, reserve 0, Ready to Assign 150; allocations 150 against real 200. Missing 50 persists in April and May.
DESIGN §48: credit overspending becomes debt; it does not spend real Cash. Here the returned debt was not funded. Releasing 50 Cash reserve while only healing negative credit Available removes money. The new unconditional refund release follows the new refund paragraph literally but conflicts with envelope conservation. The specification also needs to distinguish restoration of a current credit deficit from restoration of spendable Available.

R3-2 — later-month refund of unfunded debt creates money (BLOCK)

March 1 Cash income 200; no Assignment. March 10 Card Food purchase -100. March end Food -100, reserve 0, Ready to Assign 200. Credit deficit resets without reducing Ready to Assign under DESIGN §48. April 1 Card Food refund +100.
Expected April: Cash 200, Card 0, Food 0, reserve 0, Ready to Assign 200; total 200. No real money enters: only unfunded debt is cancelled. Actual: Food 100, reserve 0, Ready to Assign 200; total 300 against real 200. Excess 100 carries into May.

R3-3 — mixed cash/Card refund loses cash deficit on rollover (BLOCK)

March 1 Cash income 200; Food Assignment 50. March 10 Cash Food spend -100; March 11 Card Food purchase -100; March 20 Card Food refund +100.
Expected March: Cash 100, Card 0, Food -50, reserve 0, Ready to Assign 150. April must deduct the cash deficit: Food 0 and Ready to Assign 100; total 100.
Actual March matches the expected totals. April resets Food to 0 but keeps Ready to Assign 150; excess 50 persists in May. The monthly mixed pool includes the Card refund, treats the final cash deficit as credit and skips the Ready to Assign deduction. This contradicts DESIGN §48's cash-overspending rollover rule.

R3-4 — two-Card transfer into positive credit omits real money (BLOCK)

March 1 Cash income 200. March 11 general transfer 100 from zero-balance Card to zero-balance Other Card.
Accounts are Cash 200, Card -100, Other +100. DESIGN §48 states positive Card balances are real budget money. Expected total allocations 300 (the additional 100 must get a Category or Ready to Assign). Actual total remains 200 in March, April and May. The general-transfer rule says Category totals are unchanged; preserving that rule requires a Ready to Assign correction when a transfer crosses the Card credit boundary. No such correction occurs.
A transfer of existing debt between Cards preserves total money but leaves the reserve attached to the old Card, as the literal general-transfer rule specifies. This distribution is not counted as another conservation blocker.

Evidence

crates/calternal-money/tests/review_bulkrev3.rs: independent public codec/project/replay probes. artifacts/bulkrev3-probes.log: exact replay outputs. Probe tests collect incorrect outcomes without asserting that those outcomes are desired behavior.

# Independent bulkrev3 findings — #1393 Reviewed product head: 3e5fe2ae1c82f69ee26c8f9d56000db7b9cd26db. All amounts are synthetic fixture cents. Product code is unchanged. Author report and result files were not read. ## Previous witnesses B1: both same-date permutations return 10,000 total Available plus Ready to Assign, against 10,000 real money, in March and April. Reserve is 0. Correct. N2: all 24 permutations accepted with Cash MAX_EXACT, Card -1, Groceries Available MAX_EXACT-2, Dining 1, reserve 1 and Ready to Assign 0. Correct. ## R3-1 — underfunded partial refund removes money (BLOCK) March 1 Cash income 200; Food Assignment 50. March 10 Card Food purchase -100; March 20 Card Food refund +50. After the purchase Food is -50 and payment reserve is 50. The refund cancels the unfunded half of the purchase. Expected after refund: Food 0, reserve 50, Ready to Assign 150; Cash 200, Card -50. Total allocations 200. Actual: Food 0, reserve 0, Ready to Assign 150; allocations 150 against real 200. Missing 50 persists in April and May. DESIGN §48: credit overspending becomes debt; it does not spend real Cash. Here the returned debt was not funded. Releasing 50 Cash reserve while only healing negative credit Available removes money. The new unconditional refund release follows the new refund paragraph literally but conflicts with envelope conservation. The specification also needs to distinguish restoration of a current credit deficit from restoration of spendable Available. ## R3-2 — later-month refund of unfunded debt creates money (BLOCK) March 1 Cash income 200; no Assignment. March 10 Card Food purchase -100. March end Food -100, reserve 0, Ready to Assign 200. Credit deficit resets without reducing Ready to Assign under DESIGN §48. April 1 Card Food refund +100. Expected April: Cash 200, Card 0, Food 0, reserve 0, Ready to Assign 200; total 200. No real money enters: only unfunded debt is cancelled. Actual: Food 100, reserve 0, Ready to Assign 200; total 300 against real 200. Excess 100 carries into May. ## R3-3 — mixed cash/Card refund loses cash deficit on rollover (BLOCK) March 1 Cash income 200; Food Assignment 50. March 10 Cash Food spend -100; March 11 Card Food purchase -100; March 20 Card Food refund +100. Expected March: Cash 100, Card 0, Food -50, reserve 0, Ready to Assign 150. April must deduct the cash deficit: Food 0 and Ready to Assign 100; total 100. Actual March matches the expected totals. April resets Food to 0 but keeps Ready to Assign 150; excess 50 persists in May. The monthly mixed pool includes the Card refund, treats the final cash deficit as credit and skips the Ready to Assign deduction. This contradicts DESIGN §48's cash-overspending rollover rule. ## R3-4 — two-Card transfer into positive credit omits real money (BLOCK) March 1 Cash income 200. March 11 general transfer 100 from zero-balance Card to zero-balance Other Card. Accounts are Cash 200, Card -100, Other +100. DESIGN §48 states positive Card balances are real budget money. Expected total allocations 300 (the additional 100 must get a Category or Ready to Assign). Actual total remains 200 in March, April and May. The general-transfer rule says Category totals are unchanged; preserving that rule requires a Ready to Assign correction when a transfer crosses the Card credit boundary. No such correction occurs. A transfer of existing debt between Cards preserves total money but leaves the reserve attached to the old Card, as the literal general-transfer rule specifies. This distribution is not counted as another conservation blocker. ## Evidence `crates/calternal-money/tests/review_bulkrev3.rs`: independent public codec/project/replay probes. `artifacts/bulkrev3-probes.log`: exact replay outputs. Probe tests collect incorrect outcomes without asserting that those outcomes are desired behavior.
Author
Owner

Independent bulkrev3 findings — #1393

Reviewed product head: 3e5fe2ae1c.
All amounts are synthetic fixture cents. Product code is unchanged. Author report and result files were not read.

Previous witnesses

B1: both same-date permutations return 10,000 total Available plus Ready to Assign, against 10,000 real money, in March and April. Reserve is 0. Correct.
N2: all 24 permutations accepted with Cash MAX_EXACT, Card -1, Groceries Available MAX_EXACT-2, Dining 1, reserve 1 and Ready to Assign 0. Correct.

R3-1 — underfunded partial refund removes money (BLOCK)

March 1 Cash income 200; Food Assignment 50. March 10 Card Food purchase -100; March 20 Card Food refund +50.
After the purchase Food is -50 and payment reserve is 50. The refund cancels the unfunded half of the purchase. Expected after refund: Food 0, reserve 50, Ready to Assign 150; Cash 200, Card -50. Total allocations 200. Actual: Food 0, reserve 0, Ready to Assign 150; allocations 150 against real 200. Missing 50 persists in April and May.
DESIGN §48: credit overspending becomes debt; it does not spend real Cash. Here the returned debt was not funded. Releasing 50 Cash reserve while only healing negative credit Available removes money. The new unconditional refund release follows the new refund paragraph literally but conflicts with envelope conservation. The specification also needs to distinguish restoration of a current credit deficit from restoration of spendable Available.

R3-2 — later-month refund of unfunded debt creates money (BLOCK)

March 1 Cash income 200; no Assignment. March 10 Card Food purchase -100. March end Food -100, reserve 0, Ready to Assign 200. Credit deficit resets without reducing Ready to Assign under DESIGN §48. April 1 Card Food refund +100.
Expected April: Cash 200, Card 0, Food 0, reserve 0, Ready to Assign 200; total 200. No real money enters: only unfunded debt is cancelled. Actual: Food 100, reserve 0, Ready to Assign 200; total 300 against real 200. Excess 100 carries into May.

R3-3 — mixed cash/Card refund loses cash deficit on rollover (BLOCK)

March 1 Cash income 200; Food Assignment 50. March 10 Cash Food spend -100; March 11 Card Food purchase -100; March 20 Card Food refund +100.
Expected March: Cash 100, Card 0, Food -50, reserve 0, Ready to Assign 150. April must deduct the cash deficit: Food 0 and Ready to Assign 100; total 100.
Actual March matches the expected totals. April resets Food to 0 but keeps Ready to Assign 150; excess 50 persists in May. The monthly mixed pool includes the Card refund, treats the final cash deficit as credit and skips the Ready to Assign deduction. This contradicts DESIGN §48's cash-overspending rollover rule.

R3-4 — two-Card transfer into positive credit omits real money (BLOCK)

March 1 Cash income 200. March 11 general transfer 100 from zero-balance Card to zero-balance Other Card.
Accounts are Cash 200, Card -100, Other +100. DESIGN §48 states positive Card balances are real budget money. Expected total allocations 300 (the additional 100 must get a Category or Ready to Assign). Actual total remains 200 in March, April and May. The general-transfer rule says Category totals are unchanged; preserving that rule requires a Ready to Assign correction when a transfer crosses the Card credit boundary. No such correction occurs.
A transfer of existing debt between Cards preserves total money but leaves the reserve attached to the old Card, as the literal general-transfer rule specifies. This distribution is not counted as another conservation blocker.

Evidence

crates/calternal-money/tests/review_bulkrev3.rs: independent public codec/project/replay probes. artifacts/bulkrev3-probes.log: exact replay outputs. Probe tests collect incorrect outcomes without asserting that those outcomes are desired behavior.

Eleven reference vectors

Independent integer/Decimal calculations from the input rows match every stored output field in all eleven vectors, including Category activity, Assignment, Available, funding state, Account balances, Card debt, reserve, uncovered debt and Ready to Assign. All use reserve=max(Dining purchase-payment,0), Food Available=S, Dining Available=S-B and Ready to Assign=-2S. See artifacts/bulkrev3-vectors.log. Production equality is also checked in the requested vectors gate.

Generated histories (first pass)

Seed 139303, 256 histories, six months per history (three active months followed by three separate empty rollover months), up to 60 rows. Two Cards, underfunded Assignments, purchases, refunds, payments, cash spends, split purchases/refunds and Card transfers. Every full-model same-date shuffle comparison passed. Raw account-leg sums match production balances. Of 768 empty-month allocation checks, 102 equal real budget money, 127 exceed it, and 539 fall short; delta ranges from -2783 to +929. These broad cases include overpayments and positive Card balances. The isolated witnesses above establish defects without treating every random discrepancy as a separate blocker.

R3-5 — spending positive Card credit creates reserve (BLOCK)

March 1 Cash income 200. March 10 categorized Card Food refund +50 with no prior debt; March 11 Card Food purchase -50. The refund creates real positive Card credit and Food Available 50. The purchase spends that credit, so expected final Cash 200, Card 0, Food 0, reserve 0, Ready to Assign 200; total 200. Actual reserve is 50, with Ready to Assign 200 and Food 0; total 250. Excess 50 persists in April and May. The purchase path funds a payment reserve even when the Card credit already paid for the purchase. This is another positive-credit boundary missed by the fully-funded property.

Final independent probe: 4 passed, 0 failed; its per-month raw account-sum check now covers all 1,536 monthly models (rather than final balances only). Same generated allocation counts as the first pass. The standalone probe used already-built test dependencies while the full Cargo gate was compiling. An initial direct compilation selected incompatible Serde feature builds; this diagnostic was corrected by selecting the matching previously-built dependencies. The final Cargo gate remains the authoritative build/test verification.

# Independent bulkrev3 findings — #1393 Reviewed product head: 3e5fe2ae1c82f69ee26c8f9d56000db7b9cd26db. All amounts are synthetic fixture cents. Product code is unchanged. Author report and result files were not read. ## Previous witnesses B1: both same-date permutations return 10,000 total Available plus Ready to Assign, against 10,000 real money, in March and April. Reserve is 0. Correct. N2: all 24 permutations accepted with Cash MAX_EXACT, Card -1, Groceries Available MAX_EXACT-2, Dining 1, reserve 1 and Ready to Assign 0. Correct. ## R3-1 — underfunded partial refund removes money (BLOCK) March 1 Cash income 200; Food Assignment 50. March 10 Card Food purchase -100; March 20 Card Food refund +50. After the purchase Food is -50 and payment reserve is 50. The refund cancels the unfunded half of the purchase. Expected after refund: Food 0, reserve 50, Ready to Assign 150; Cash 200, Card -50. Total allocations 200. Actual: Food 0, reserve 0, Ready to Assign 150; allocations 150 against real 200. Missing 50 persists in April and May. DESIGN §48: credit overspending becomes debt; it does not spend real Cash. Here the returned debt was not funded. Releasing 50 Cash reserve while only healing negative credit Available removes money. The new unconditional refund release follows the new refund paragraph literally but conflicts with envelope conservation. The specification also needs to distinguish restoration of a current credit deficit from restoration of spendable Available. ## R3-2 — later-month refund of unfunded debt creates money (BLOCK) March 1 Cash income 200; no Assignment. March 10 Card Food purchase -100. March end Food -100, reserve 0, Ready to Assign 200. Credit deficit resets without reducing Ready to Assign under DESIGN §48. April 1 Card Food refund +100. Expected April: Cash 200, Card 0, Food 0, reserve 0, Ready to Assign 200; total 200. No real money enters: only unfunded debt is cancelled. Actual: Food 100, reserve 0, Ready to Assign 200; total 300 against real 200. Excess 100 carries into May. ## R3-3 — mixed cash/Card refund loses cash deficit on rollover (BLOCK) March 1 Cash income 200; Food Assignment 50. March 10 Cash Food spend -100; March 11 Card Food purchase -100; March 20 Card Food refund +100. Expected March: Cash 100, Card 0, Food -50, reserve 0, Ready to Assign 150. April must deduct the cash deficit: Food 0 and Ready to Assign 100; total 100. Actual March matches the expected totals. April resets Food to 0 but keeps Ready to Assign 150; excess 50 persists in May. The monthly mixed pool includes the Card refund, treats the final cash deficit as credit and skips the Ready to Assign deduction. This contradicts DESIGN §48's cash-overspending rollover rule. ## R3-4 — two-Card transfer into positive credit omits real money (BLOCK) March 1 Cash income 200. March 11 general transfer 100 from zero-balance Card to zero-balance Other Card. Accounts are Cash 200, Card -100, Other +100. DESIGN §48 states positive Card balances are real budget money. Expected total allocations 300 (the additional 100 must get a Category or Ready to Assign). Actual total remains 200 in March, April and May. The general-transfer rule says Category totals are unchanged; preserving that rule requires a Ready to Assign correction when a transfer crosses the Card credit boundary. No such correction occurs. A transfer of existing debt between Cards preserves total money but leaves the reserve attached to the old Card, as the literal general-transfer rule specifies. This distribution is not counted as another conservation blocker. ## Evidence `crates/calternal-money/tests/review_bulkrev3.rs`: independent public codec/project/replay probes. `artifacts/bulkrev3-probes.log`: exact replay outputs. Probe tests collect incorrect outcomes without asserting that those outcomes are desired behavior. ## Eleven reference vectors Independent integer/Decimal calculations from the input rows match every stored output field in all eleven vectors, including Category activity, Assignment, Available, funding state, Account balances, Card debt, reserve, uncovered debt and Ready to Assign. All use reserve=max(Dining purchase-payment,0), Food Available=S, Dining Available=S-B and Ready to Assign=-2S. See artifacts/bulkrev3-vectors.log. Production equality is also checked in the requested vectors gate. ## Generated histories (first pass) Seed 139303, 256 histories, six months per history (three active months followed by three separate empty rollover months), up to 60 rows. Two Cards, underfunded Assignments, purchases, refunds, payments, cash spends, split purchases/refunds and Card transfers. Every full-model same-date shuffle comparison passed. Raw account-leg sums match production balances. Of 768 empty-month allocation checks, 102 equal real budget money, 127 exceed it, and 539 fall short; delta ranges from -2783 to +929. These broad cases include overpayments and positive Card balances. The isolated witnesses above establish defects without treating every random discrepancy as a separate blocker. ## R3-5 — spending positive Card credit creates reserve (BLOCK) March 1 Cash income 200. March 10 categorized Card Food refund +50 with no prior debt; March 11 Card Food purchase -50. The refund creates real positive Card credit and Food Available 50. The purchase spends that credit, so expected final Cash 200, Card 0, Food 0, reserve 0, Ready to Assign 200; total 200. Actual reserve is 50, with Ready to Assign 200 and Food 0; total 250. Excess 50 persists in April and May. The purchase path funds a payment reserve even when the Card credit already paid for the purchase. This is another positive-credit boundary missed by the fully-funded property. Final independent probe: 4 passed, 0 failed; its per-month raw account-sum check now covers all 1,536 monthly models (rather than final balances only). Same generated allocation counts as the first pass. The standalone probe used already-built test dependencies while the full Cargo gate was compiling. An initial direct compilation selected incompatible Serde feature builds; this diagnostic was corrected by selecting the matching previously-built dependencies. The final Cargo gate remains the authoritative build/test verification.
Author
Owner

Final independent review head: bafe854ce8fcef89d3f498a9e2f2ed2ea763e95a.

Independent Money number review — bulkrev3, #1393

BLOCK: R3-1, R3-2, R3-3, R3-4 and R3-5. They remove or duplicate budget money.
The previous B1 and N2 cases now pass. All eleven changed reference vectors
remain correct.

Reviewed product head: 3e5fe2ae1c82f69ee26c8f9d56000db7b9cd26db.
Branch: job/bulkwrite-1393. The required fetch and merge of origin/dev
reported Already up to date. The author report and result files were not
read. The previous review was read for its B1 and N2 inputs and independent
vector equations. All values in this report are synthetic fixture cents.

Method and invariant

The probes use the public Markdown codec, projection and replay. Exact
integer input values go through the existing Minor formatter and Assignment
editor. No product code, dependencies, lockfiles or existing test expectations
changed. No web code changed.

DESIGN §48 defines the envelope method: Assignments move
money from Ready to Assign to a Category; funded Card spending moves money to
the payment Category; a payment spends its reserve; cash overspending reduces
next month's Ready to Assign; credit overspending becomes uncovered debt.
Positive Card balances are real budget money. Negative Card balances are debt.
Hidden Categories retain their history and count in totals.

The universal account invariant is exact balance conservation: at each month
end, each Account balance equals its opening balance plus all its ordinary
legs and transfer legs through that month. Transfers sum to zero. This holds
regardless of Category funding. The generated test checks all 1,536 month
models against independent raw input sums.

For allocation conservation, define L as signed Category Available plus Ready
to Assign. Define M as Cash balances plus the positive part of each Card
balance. Import reconciliation adjustments must be added to M when present;
these fixtures have none. At a transaction-free next month after rollover,
there is no new unfunded credit deficit. The strongest allocation invariant
for these Cash/Card histories is L = M. It must hold for underfunded
histories too: virtual credit deficits have reset and cash deficits have
reduced Ready to Assign. No debt is counted as negative budget money and no
payment reserve is counted twice. This test avoids the incorrect comparison
with the signed sum of all Account balances. At a month with current credit
overspending, L needs a credit-deficit correction; that temporary discrepancy
alone is not a defect.

Same-date shuffle independence holds for both acceptance and the complete
MonthTotals model. It is independent of money conservation: a model can be
consistently wrong in every file order.

Previous cases and reference vectors

B1 uses the previous amounts, dates and posting types: Cash income 20,000; Food and Dining
Assignments 10,000 each; older Food purchase -10,000; Dining purchase -10,000;
same-date payment 10,000 and Food refund 10,000. Both same-date permutations
return Food 10,000, Dining 0, reserve 0, Ready to Assign 0, Cash 10,000 and
Card 0. March and April each contain exactly 10,000 real and allocated money.

N2 uses the exact previous values and Category IDs. M is MAX_EXACT,
9,007,199,254,740,991. Opening income and Food Assignment are M-1; the four
same-date rows are Cash Food -M, a Cash Split parent +1 with Food -1 and Dining
+2, Cash Food +M, and Card Dining -1. All 24 permutations are accepted and
return Cash M, Card -1, Food M-2, Dining 1, reserve 1 and Ready to Assign 0.

For each of the eleven vectors, S is the Food and Dining Assignment,
1,000,000,000,000. A is the Food purchase and full refund, B the Dining
purchase, P the payment. Dining precedes Food in canonical order. The final
reserve is max(B-P,0); Food Available is S; Dining Available is S-B; Ready to
Assign is -2S; Cash is -P; Card is P-B; Savings and uncovered debt are 0.
Food activity is 0, Dining activity is -B, and payment activity is -P.
The independent calculation checked every stored output field, including
funding state, empty targets and marker Categories, not just the reserve.
Production replay equality is checked by the crate's vectors gate.

Vector A B P Correct reserve
07b33aa56ff97a67 13222722 108 13222755 0
08d823459b4f7555 1 1 1 0
10dad10f207e3966 13222722 1 13222722 0
217b597cc7b1b339 109170509 1000000000 110838733 889161267
3c10364db1d4cd46 109170509 1 109170509 0
405bf72849418ee7 28500 1 28500 0
5cd63c6abac2f757 103816 1 103816 0
70887b8579a61566 5789 1035233 55551 979682
aa06a27413c2238d 103816 454 103879 0
de05e2804212ba0e 5789 1 5789 0
f161754b530689ba 28500 8319 31192 0

Blocking cases

Every case starts with March 1 Cash income 200. No import adjustment is used.
Unless stated otherwise, other Categories and the second Card have zero
balances. The evidence also replays empty following months.

R3-1: a partial refund of an underfunded purchase removes money. Food
Assignment 50; March 10 Card Food purchase -100; March 20 Card Food refund
+50. Before the refund Food is -50 and reserve is 50. The refund cancels the
unfunded half of the purchase. Expected Food 0, reserve 50, Ready to Assign
150, Cash 200 and Card -50: allocations 200. Actual Food 0, reserve 0 and
Ready to Assign 150: allocations 150. The missing 50 persists in April and
May. The refund releases real reserve while it only heals a virtual credit
deficit. The new refund paragraph, applied literally, conflicts with the
envelope rule here; both code and specification need this distinction.

R3-2: a later-month refund of unfunded debt creates money. No Assignment;
March 10 Card Food purchase -100; April 1 Card Food refund +100. March Food
-100 is a virtual credit deficit and resets without reducing Ready to Assign.
Expected April Food 0, reserve 0 and Ready to Assign 200, Cash 200 and Card 0:
allocations 200. Actual Food 100 and Ready to Assign 200: allocations 300.
Excess 100 persists in May. Cancelling unfunded debt did not bring money into
an Account or release any funded reserve.

R3-3: a mixed cash/Card refund loses the cash deficit at rollover. Food
Assignment 50; March 10 Cash Food spend -100; March 11 Card Food purchase -100;
March 20 Card Food refund +100. March correctly ends with Cash 100, Card 0,
Food -50, reserve 0 and Ready to Assign 150. §48 requires the cash deficit to
reduce April Ready to Assign to 100 as Food resets to 0. Actual April and May
Ready to Assign remain 150: excess 50. The mixed monthly pool includes the
Card refund and classifies the remaining cash deficit as credit.

R3-4: a two-Card transfer into positive credit omits budget money. No
Assignment; March 11 general transfer 100 from the zero-balance Card to the
zero-balance Other Card. Cash is 200, Card -100 and Other +100. Under §48's
explicit positive-Card rule, real budget money is 300. Allocations remain 200
in March, April and May: missing 100. The general-transfer rule keeps Category
totals unchanged, so a Ready to Assign correction is required to satisfy both
rules when a Card transfer crosses zero. The code applies neither correction.
The owner should confirm how these two §48 rules combine; this review applies
the stated positive-Card definition consistently.

R3-5: spending positive Card credit creates a payment reserve. No
Assignment; March 10 Card Food refund +50 with no prior debt; March 11 Card
Food purchase -50. The refund creates Food Available 50 and positive Card
credit 50. The purchase spends that credit. Expected final Cash 200, Card 0,
Food 0, reserve 0 and Ready to Assign 200: allocations 200. Actual reserve 50:
allocations 250. Excess 50 persists in April and May. No debt remains for this
reserve to pay. This funded purchase is a further counterexample to an
unqualified fully-funded conservation claim when positive Card credit exists.

Other requested cases

Case Correct result from §48 Comparison
Cash overspending Assignment 50, Cash spend 100: March Food -50, Ready to Assign 150 and Cash 100. April Food 0 and Ready to Assign 100. Matches.
Refund larger than remaining debt Assignment 100, Card purchase 100, refund 150: Food 150, reserve 0, Ready to Assign 100, Cash 200 and Card +50; total 250. Matches.
Funded later-month refund Assignment 100, March Card purchase 100, April refund 100: April Food 100, reserve 0, Ready to Assign 100, Cash 200 and Card 0; total 200. Matches.
Partly funded later-month refund Assignment 50, March Card purchase 100, April refund 50: under the stated refund policy April Food 50, reserve 0, Ready to Assign 150, Cash 200 and Card -50; total 200. Matches that policy and conserves totals. The unfunded full-return case fails as R3-2.
Refund after full payment Assignment 100, purchase 100, payment 100, refund 100: Food 100, reserve 0, Ready to Assign 100, Cash 100 and Card +100; total 200. Matches.
Partial payment then refund Food and Dining Assignments 100 each, purchases 100 each, payment 50, Food refund 100: Food 100, Dining 0, reserve 50, Ready to Assign 0, Cash 150 and Card -50; total 150. Matches.
Split refunds across Categories Assignments and purchases 100 each, payment 150, refund split Food 100 and Dining 100: Food 100, Dining 100, reserve 0, Ready to Assign 0, Cash 50 and Card +150; total 200. Matches; only the first 50 of the split reduces prior debt.
Transfer existing debt between Cards Assignment 100, Card purchase 100, transfer 100 from Other to Card: Cash 200, Card 0, Other -100, original reserve 100 and Ready to Assign 100; total 200. Conserves totals. Under the literal general-transfer rule, the reserve stays with the original Card and Other is uncovered; the User must move the Assignment.
Hidden Category refund A hidden Food Category with purchase 100 and refund 100 retains all history and produces the same complete model as the visible Category. Matches.
Deleted/missing Category refund §48 prohibits history deletion. A missing referenced identity must fail validation rather than omit its activity. Projection rejects unknown category block id: food; no totals are returned. No deletion route was changed or tested.

Generated histories

Seed 139303; 256 histories; up to 60 rows each; six months per history.
January, March and May contain activity; the following empty months check
rollover. Each history includes zero or small Assignments and draws from Card
purchases/refunds, payments, Cash spending, split Card purchases/refunds,
second-Card purchases and two-Card transfers. Broad accepted inputs include
payments larger than debt and positive Card balances.

All 256 complete-model shuffle comparisons pass. All 1,536 monthly raw Account
balance checks pass. Of 768 empty-month allocation checks, 102 satisfy L=M,
127 have excess allocations and 539 have missing allocations. The delta is
between -2,783 and +929. These counts are not separate defect diagnoses. The
five small cases above establish the blockers without relying on a correction
for current-month credit overspending.

Built, files and known gaps

This review adds four independent Rust review probes and this report:

  • crates/calternal-money/tests/review_bulkrev3.rs.
  • tests/money/bulkrev3-review.md.

Findings were appended during the review in
artifacts/bulkrev3-findings.md. Probe outputs, vector calculations and gate
logs remain in artifacts/; they are not committed. Product code is unchanged.
The five blocking cases are not fixed because this job is read-mostly.
Probe tests collect discrepancies as evidence; green probe results do not
approve the incorrect numbers. Existing expectations remain unchanged.
No new UI, route or background job was built, so no UI screenshots or new
performance profile applies. No secrets were displayed.

Decisions

No product design was changed. The review uses §48's Cash-plus-positive-Card
rule, rather than signed net Accounts, for real budget money. Empty next months
remove the current-credit-deficit ambiguity without excluding underfunded
histories. Missing Category identities are reviewed as invalid source files;
history deletion is forbidden. R3-1 and R3-4 expose specification combinations
that the owner must clarify; they do not justify changing product rules in a
review job.

Verification

Cargo used CARGO_PROFILE_DEV_DEBUG=line-tables-only, CARGO_INCREMENTAL=0,
CARGO_BUILD_JOBS=4 and TMPDIR=/target/tmp. The preset CARGO_TARGET_DIR
was not changed. No crate/package version was introduced or changed.

Review test head: 8ca3a9f95. The final issue comment records the report commit SHA.

cargo fmt --check: exit 0, no output.

cargo clippy -p calternal-money --all-targets -- -D warnings: exit 0.
Output, verbatim:

    Checking calternal-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-money)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 2.03s

cargo test -p calternal-money --test review_bulkrev3 -- --nocapture --test-threads=4: exit 0. Final result, verbatim:

test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.02s

cargo test -p calternal-money -p calternal-plugin-money -- --test-threads=4: exit 0. Complete output, verbatim:

   Compiling proc-macro2 v1.0.107
   Compiling quote v1.0.47
   Compiling memchr v2.8.3
   Compiling serde_core v1.0.229
   Compiling once_cell v1.21.4
   Compiling futures-core v0.3.34
   Compiling serde v1.0.229
   Compiling pin-project-lite v0.2.17
   Compiling jobserver v0.1.35
   Compiling find-msvc-tools v0.1.13
   Compiling shlex v2.0.1
   Compiling log v0.4.34
   Compiling bytes v1.12.1
   Compiling syn v3.0.6
   Compiling cc v1.4.7
   Compiling stable_deref_trait v1.2.1
   Compiling serde_json v1.0.151
   Compiling num-traits v0.2.19
   Compiling pkg-config v0.3.34
   Compiling version_check v0.9.5
   Compiling syn v2.0.119
   Compiling socket2 v0.6.5
   Compiling equivalent v1.0.2
   Compiling getrandom v0.4.3
   Compiling rand_core v0.10.1
   Compiling writeable v0.6.4
   Compiling hashbrown v0.17.1
   Compiling litemap v0.8.3
   Compiling utf8_iter v1.0.4
   Compiling icu_normalizer_data v2.3.0
   Compiling serde_derive v1.0.229
   Compiling synstructure v0.14.0
   Compiling zerovec-derive v0.11.6
   Compiling zerofrom-derive v0.1.8
   Compiling yoke-derive v0.8.4
   Compiling displaydoc v0.2.7
   Compiling tracing-attributes v0.1.31
   Compiling zerofrom v0.1.8
   Compiling generic-array v0.14.9
   Compiling yoke v0.8.3
   Compiling tracing-core v0.1.36
   Compiling futures-task v0.3.34
   Compiling zerovec v0.11.8
   Compiling zerotrie v0.2.5
   Compiling typenum v1.20.1
   Compiling scopeguard v1.2.0
   Compiling futures-io v0.3.34
   Compiling icu_properties_data v2.3.0
   Compiling tinystr v0.8.4
   Compiling potential_utf v0.1.6
   Compiling tracing v0.1.44
   Compiling icu_locale_core v2.3.0
   Compiling icu_collections v2.3.0
   Compiling mio v1.2.3
   Compiling errno v0.3.14
   Compiling percent-encoding v2.3.2
   Compiling futures-sink v0.3.34
   Compiling icu_provider v2.3.1
   Compiling signal-hook-registry v1.4.8
   Compiling lock_api v0.4.14
   Compiling tokio-macros v2.7.2
   Compiling smallvec v1.16.1
   Compiling iana-time-zone v0.1.65
   Compiling indexmap v2.14.2
   Compiling icu_properties v2.3.0
   Compiling chrono v0.4.45
   Compiling tokio v1.53.1
   Compiling parking_lot_core v0.9.12
   Compiling slab v0.4.12
   Compiling form_urlencoded v1.2.2
   Compiling futures-macro v0.3.34
   Compiling cmake v0.1.58
   Compiling fs_extra v1.3.0
   Compiling futures-util v0.3.34
   Compiling vcpkg v0.2.15
   Compiling dunce v1.0.5
   Compiling aws-lc-sys v0.45.0
   Compiling thiserror-impl v2.0.21
   Compiling http v1.5.0
   Compiling aho-corasick v1.1.5
   Compiling crossbeam-utils v0.8.23
   Compiling siphasher v1.0.3
   Compiling regex-automata v0.4.18
   Compiling spin v0.9.9
   Compiling hybrid-array v0.4.15
   Compiling foldhash v0.2.0
   Compiling cpufeatures v0.2.17
   Compiling allocator-api2 v0.2.21
   Compiling base64 v0.22.1
   Compiling hashbrown v0.16.1
   Compiling tempfile v3.27.0
   Compiling regex v1.13.1
   Compiling icu_normalizer v2.3.0
   Compiling rustversion v1.0.23
   Compiling zeroize v1.9.0
   Compiling aws-lc-rs v1.18.1
   Compiling parking v2.2.1
   Compiling crc-catalog v2.5.0
   Compiling event-listener v5.4.2
   Compiling crc v3.4.0
   Compiling rusty-fork v0.3.1
   Compiling idna_adapter v1.2.2
   Compiling crossbeam-queue v0.3.14
   Compiling hashlink v0.11.1
   Compiling crypto-common v0.1.6
   Compiling block-buffer v0.10.4
   Compiling http-body v1.1.0
   Compiling futures-channel v0.3.34
   Compiling thiserror v2.0.21
   Compiling simd-adler32 v0.3.10
   Compiling httparse v1.10.1
   Compiling proptest v1.11.0
   Compiling parking_lot v0.12.5
   Compiling digest v0.10.7
   Compiling idna v1.1.0
   Compiling rustls-pki-types v1.15.1
   Compiling calternal-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-money)
   Compiling crypto-common v0.2.2
   Compiling libsqlite3-sys v0.37.0
   Compiling cpufeatures v0.3.1
   Compiling tower-service v0.3.3
   Compiling crc32fast v1.5.2
   Compiling either v1.18.0
   Compiling url v2.5.8
   Compiling tokio-stream v0.1.19
   Compiling sha2 v0.10.9
   Compiling futures-intrusive v0.5.0
   Compiling tokio-util v0.7.19
   Compiling untrusted v0.9.0
   Compiling atomic-waker v1.1.2
   Compiling rand_core v0.6.4
   Compiling try-lock v0.2.5
   Compiling adler2 v2.0.1
   Compiling rustls v0.23.45
   Compiling want v0.3.1
   Compiling rand v0.8.8
   Compiling sqlx-core v0.9.0
   Compiling h2 v0.4.19
   Compiling atoi v2.0.0
   Compiling futures-executor v0.3.34
   Compiling flume v0.12.0
   Compiling inout v0.2.2
   Compiling phf_shared v0.11.3
   Compiling blake3 v1.8.7
   Compiling sync_wrapper v1.0.2
   Compiling subtle v2.6.1
   Compiling cmov v0.5.4
   Compiling ryu v1.0.23
   Compiling ipnet v2.12.2
   Compiling httpdate v1.0.3
   Compiling tower-layer v0.3.3
   Compiling rustls-webpki v0.103.15
   Compiling ctutils v0.4.2
   Compiling hyper v1.11.1
   Compiling phf_generator v0.11.3
   Compiling sqlx-sqlite v0.9.0
   Compiling miniz_oxide v0.9.1
   Compiling encoding_rs v0.8.41
   Compiling multiversion-macros v0.9.0
   Compiling block-buffer v0.12.1
   Compiling phf_shared v0.12.1
   Compiling arrayvec v0.7.8
   Compiling chrono-tz v0.10.4
   Compiling heck v0.5.0
   Compiling dotenvy v0.15.7
   Compiling inotify-sys v0.1.8
   Compiling zlib-rs v0.6.8
   Compiling hex v0.4.3
   Compiling constant_time_eq v0.4.2
   Compiling sqlx-macros-core v0.9.0
   Compiling phf v0.12.1
   Compiling cipher v0.5.2
   Compiling multiversion v0.9.0
   Compiling hyper-util v0.1.20
   Compiling phf_macros v0.11.3
   Compiling flate2 v1.1.10
   Compiling universal-hash v0.6.1
   Compiling tower v0.5.3
   Compiling http-body-util v0.1.5
   Compiling multer v3.1.0
   Compiling core_detect v1.0.0
   Compiling mime v0.3.17
   Compiling linkme-impl v0.3.37
   Compiling unicode-joining-type v1.0.0
   Compiling multiversion_no_op v1.0.0
   Compiling openssl-probe v0.2.1
   Compiling simdutf8 v0.1.5
   Compiling phf v0.11.3
   Compiling rustls-native-certs v0.8.4
   Compiling poly1305 v0.9.1
   Compiling sqlx-macros v0.9.0
   Compiling chacha20 v0.10.2
   Compiling tokio-rustls v0.26.6
   Compiling aead v0.6.1
   Compiling miniz_oxide v0.8.9
   Compiling fdeflate v0.3.7
   Compiling utoipa-gen v6.0.1
   Compiling winnow v0.7.15
   Compiling quick-error v2.0.1
   Compiling same-file v1.0.6
   Compiling linkme v0.3.37
   Compiling pxfm v0.1.30
   Compiling byteorder-lite v0.1.0
   Compiling color_quant v1.1.0
   Compiling weezl v0.1.12
   Compiling pulldown-cmark v0.13.4
   Compiling calternal-path v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-path)
   Compiling zune-core v0.5.3
   Compiling gif v0.14.2
   Compiling zune-jpeg v0.5.15
   Compiling utoipa v6.0.0
   Compiling moxcms v0.8.1
   Compiling image-webp v0.2.4
   Compiling cron v0.17.0
   Compiling walkdir v2.5.0
   Compiling png v0.18.1
   Compiling sqlx v0.9.0
   Compiling chacha20poly1305 v0.11.0
   Compiling hyper-rustls v0.27.10
   Compiling inotify v0.11.5
   Compiling rustls-platform-verifier v0.7.0
   Compiling axum-core v0.5.6
   Compiling tower-http v0.6.11
   Compiling serde_urlencoded v0.7.1
   Compiling uuid v1.26.1
   Compiling notify-types v2.1.0
   Compiling serde_path_to_error v0.1.20
   Compiling bytemuck v1.25.2
   Compiling bumpalo v3.20.3
   Compiling unsafe-libyaml v0.2.11
   Compiling matchit v0.8.4
   Compiling base64 v0.23.1
   Compiling unicase v2.9.0
   Compiling unicode-properties v0.1.4
   Compiling unicode-casefold v0.2.0
   Compiling reqwest v0.13.5
   Compiling serde_yaml v0.9.34+deprecated
   Compiling calternal-fs v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-fs)
   Compiling axum v0.8.9
   Compiling zopfli v0.8.3
   Compiling image v0.25.10
   Compiling notify v8.2.0
   Compiling calternal-db v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-db)
   Compiling calternal-api v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-api)
   Compiling quick-xml v0.42.0
   Compiling csv-core v0.1.13
   Compiling csv v1.4.0
   Compiling calternal-plugin v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-plugin)
   Compiling zip v5.1.1
   Compiling calternal-notes-core v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-notes-core)
   Compiling calternal-plugin-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/plugins/money)
    Finished `test` profile [unoptimized + debuginfo] target(s) in 4m 12s
     Running unittests src/lib.rs (/home/kayg/build/targets/bulkrev3/debug/deps/calternal_money-5ad27f9b5c008064)

running 16 tests
test codec::tests::empty_payee_is_refused_by_the_writer ... ok
test codec::tests::malformed_dated_rows_fail_instead_of_vanishing ... ok
test codec::tests::property_edit_changes_one_value ... ok
test codec::tests::transaction_round_trip_with_punctuation_in_labels_and_payee ... ok
test codec::tests::round_trip_keeps_bom_crlf_and_unknown_bytes ... ok
test edit::tests::crlf_file_keeps_crlf_on_insert ... ok
test edit::tests::cleared_tag_toggles_without_touching_other_tags ... ok
test codec::tests::checked_parse_stops_after_a_bounded_line_batch ... ok
test edit::tests::unicode_payee_tag_boundaries_match_shared_vectors ... ok
test units::tests::exact_range_is_enforced_on_parse_and_arithmetic ... ok
test units::tests::format_uses_explicit_sign_and_exact_scale ... ok
test units::tests::parse_matches_the_oracle_examples ... ok
test edit::tests::new_budget_projects_with_no_accounts ... ok
test edit::tests::assign_inserts_updates_and_removes_rows ... ok
test units::independent_number_review::signed_edges_and_long_zero_padding_keep_exact_minor_units ... ok
test units::tests::scale_table_has_all_165_codes_with_unique_entries ... ok

test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s

     Running tests/account_kinds.rs (/home/kayg/build/targets/bulkrev3/debug/deps/account_kinds-40f136ace82559dd)

running 4 tests
test account_projection_rejects_legacy_and_unknown_kinds ... ok
test off_budget_balance_marker_does_not_change_budget_money ... ok
test imported_account_kinds_project_without_losing_identity ... ok
test categorized_debit_loan_transfers_post_one_budget_leg ... ok

test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s

     Running tests/import.rs (/home/kayg/build/targets/bulkrev3/debug/deps/import-32258f8fda96f336)

running 13 tests
test duplicate_source_ids_are_rejected_and_duplicate_names_are_kept ... ok
test import_render_is_exact_and_byte_stable ... ok
test import_replay_matches_full_ledger_month_by_month ... ok
test import_keeps_same_day_source_order_for_credit_payments_and_refunds ... ok
test import_stream_renderer_matches_full_rendered_files ... ok
test import_render_reports_progress_and_propagates_cancel ... ok
test production_v1_metadata_upgrade_keeps_balances ... ok
test recheck_half_minor_units_negative_zero_and_nineteen_digits ... ok
test imported_ready_to_assign_matches_independent_month_oracle ... ok
test budget_replay_stops_at_a_bounded_transaction_checkpoint ... ok
test recheck_same_day_payment_and_refund_keep_source_fifo ... ok
test random_imports_conserve_source_balances_and_markdown ... ok
test recheck_random_multicurrency_ledgers_match_all_monthly_totals ... ok

test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 13.19s

     Running tests/properties.rs (/home/kayg/build/targets/bulkrev3/debug/deps/properties-9ff9e71a800dacb8)

running 21 tests
test bill_coverage_never_clamps_the_bill ... ok
test bulkrev2::boundary_shuffle_reports_acceptance_difference ... ok
test bulkrev2::i64_extremes_are_rejected_and_safe_bound_is_exact ... ok
test bulkrev2::literal_account_sum_and_funded_card_conservation ... ok
test bulkrev2::refund_payment_calendar_choice_is_visible_next_month ... ok
test any_text_that_parses_serializes_to_the_same_bytes ... ok
test bulkrev2::split_refund_keeps_payment_overfunding_when_card_becomes_positive ... ok
test assign_then_unassign_is_the_identity ... ok
test decimal_text_round_trips_for_every_scale ... ok
test cash_ledgers_conserve_money_every_month ... ok
test fully_funded_card_spending_conserves_cash ... ok
test money_code_never_uses_floating_point ... ok
test mixed_cash_credit_deficit_rolls_only_its_cash_part ... ok
test paired_write_replay_matches_independent_calculations ... ok
test reviewed_burst_order_matches_input_order ... ok
test partial_payment_then_category_refunds_conserve_cash_across_months ... ok
test split_legs_post_exactly_the_parent ... ok
test transaction_rows_round_trip_byte_for_byte ... ok
test same_date_card_postings_are_a_function_of_the_set ... ok
test bulkrev2::funded_shuffles_conserve_real_money_every_month ... ok
test bulkrev2::same_day_shuffles_cover_splits_transfers_and_month_edges ... ok

test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 8.16s

     Running tests/ready_to_assign_adjustment.rs (/home/kayg/build/targets/bulkrev3/debug/deps/ready_to_assign_adjustment-0e1c5c7276d14077)

running 1 test
test ready_to_assign_adjustment_changes_only_the_budget_pool ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s

     Running tests/review_984.rs (/home/kayg/build/targets/bulkrev3/debug/deps/review_984-dc85183370c2f07a)

running 5 tests
test review_pair_performance_profile ... ignored, performance measurements belong to the merge round on the perf VM
test review_pair_rejects_bad_months_and_amounts_without_rounding ... ok
test review_split_remainders_and_tracking_transfers_are_exact ... ok
test review_mixed_pair_matches_independent_replays ... ok
test review_large_ledger_pair_keeps_exact_totals ... ok

test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 4.99s

     Running tests/review_bulkrev3.rs (/home/kayg/build/targets/bulkrev3/debug/deps/review_bulkrev3-cbfa6724c48c7f18)

running 4 tests
test hidden_and_missing_categories ... ok
test envelope_edge_cases ... ok
test previous_witnesses_all_orders ... ok
test generated_underfunded_rollovers ... ok

test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.52s

     Running tests/vectors.rs (/home/kayg/build/targets/bulkrev3/debug/deps/vectors-b0e2a54af0711cc9)

running 3 tests
test rust_matches_random_oracle_ledgers_without_divergences ... ok
test reviewed_eleven_refund_vectors_keep_their_exact_numbers ... ok
test rust_port_matches_every_recorded_oracle_vector ... ok

test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.56s

     Running unittests src/lib.rs (/home/kayg/build/targets/bulkrev3/debug/deps/calternal_plugin_money-3d165b6d3890a332)

running 135 tests
test import::import_review_tests::actual_cents_conversion_never_rounds ... ok
test import::import_review_tests::actual_cc_label_requires_missing_type_confirmation ... ok
test import::import_review_tests::actual_stream_memory_guard_child ... ignored, invoked as an isolated child by actual_stream_keeps_a_large_history_bounded
test import::import_review_tests::actual_orphan_split_children_are_rejected ... ok
test import::import_review_tests::import_control_reports_progress_and_stops_cancelled_work ... ok
test import::import_review_tests::actual_account_checks_use_raw_monthly_source_rows ... ok
test import::import_review_tests::actual_transfer_legs_cannot_cross_months ... ok

running 1 test
test import::import_review_tests::ynab_transfer_pairing_handles_many_duplicate_legs ... ok
test import_fidelity_1130::independent_split_and_transfer_numbers_check ... ok
test routes::durable::admission_tests::cancelled_receiver_cannot_acknowledge_a_durable_job ... ok
test routes::durable::checkpoint_tests::progress_wait_keeps_parser_writer_release_polled ... ok
test import_fidelity_1130::actual_rows_round_trip ... ok
test routes::import_cleanup_tests::dropped_preview_worker_retains_admission_until_exit ... ok
test routes::import_cleanup_tests::idle_imports_are_reclaimed_by_expiry_cleanup ... ok
test routes::import_cleanup_tests::staged_import_files_keep_ranges_and_release_private_storage ... ok
test routes::import_staged_path_tests::staged_import_name_cannot_select_another_path_or_slot ... ok
test import::import_review_tests::actual_stream_memory_guard_child ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 134 filtered out; finished in 58.25s

test import::import_review_tests::actual_stream_keeps_a_large_history_bounded ... ok
test routes::replay_reuse_tests::crossings_cover_source_ranges_relative_to_today ... ok
test routes::replay_reuse_tests::crossings_reuse_checked_current_totals_even_with_future_months ... ok
test routes::durable::admission_tests::live_publication_honors_operational_queue_cancellation has been running for over 60 seconds
test routes::replay_reuse_tests::assignment_retry_rebuilds_from_latest_source_bytes ... ok
test routes::review_1140::cancel_wins_before_publication_lock ... ok
test routes::durable::money_import_undo_mutation has been running for over 60 seconds
test routes::durable::admission_tests::live_publication_honors_operational_queue_cancellation ... ok
test routes::review_1140::cancel_does_not_rewrite_published_result ... ok
test routes::review_1140::review1140_cancel_after_rename_before_receipt_keeps_publication ... ok
test routes::review_1140::review1140_discard_after_confirmation_failure_releases_admission ... ok
test routes::review_1140::review1140_all_formats_replay_exact_balances ... ok
test routes::durable::money_import_undo_mutation ... ok
test routes::review_1140::review1140_staged_size_limits_fail_without_publishing ... ok
test routes::review_1140::review1140_operational_cancel_before_replacement_returns_no_receipt ... ok
test store::parsed_cache_tests::global_budget_and_folder_pruning_release_stale_entries ... ok
test store::parsed_cache_tests::parse_charge_accounts_for_line_structures ... ok
test store::parsed_cache_tests::user_cache_evicts_old_parse_entries_and_shares_hot_documents ... ok
test routes::review_1140::review1140_terminal_receipts_do_not_block_new_imports ... ok
test routes::review_1140::review1140_tcp_malformed_inputs_leave_worker_usable ... ok
test tests::a_new_user_sees_the_real_empty_state ... ok
test tests::a_broken_file_is_reported_not_hidden ... ok
test tests::a_journal_for_a_completed_move_changes_nothing ... ok
test tests::active_money_handle_survives_other_users_cache_pressure ... ok
test tests::actual_duplicate_names_import_by_id_without_sharing_a_payment_category ... ok
test tests::actual_export_archive_imports_exact_rows_from_private_scratch ... ok
test tests::a_read_waits_for_a_write_in_progress ... ok
test tests::api_account_numbers_equal_core_replay ... ok
test tests::a_split_row_written_by_hand_is_read_but_not_edited ... ok
test routes::review_1140::review1140_replacement_receipt_recovery_does_not_adopt_later_edits ... ok
test tests::assignments_retry_source_conflicts_without_losing_neighbours ... ok
test tests::backdated_create_emits_current_month_overspend_crossing ... ok
test tests::bulk_write_invalid_neighbours_do_not_change_valid_rows ... ok
test tests::budget_flow_writes_exact_markdown_and_derives_available ... ok
test tests::cancel_racing_confirm_has_one_consistent_outcome ... ok
test tests::cancelling_imports_leaves_no_budget_and_releases_slots ... ok
test tests::bulk_write_month_does_not_need_note_date_backfill ... ok
test tests::bulk_write_rejects_intermediate_overflow ... ok
test tests::csv_import_keeps_progress_and_cancel_responsive ... ok
test tests::concurrent_store_edits_keep_exactly_one_winner ... ok
test tests::denied_preview_access_keeps_the_owners_pending_import ... ok
test tests::delete_transaction_emits_current_month_overspend_crossing ... ok
test tests::durable_import_tests::operation_exit_child ... ignored, child of operation_recovery_survives_process_exit_at_every_phase
test tests::bulk_write_balances_equal_one_by_one has been running for over 60 seconds
test tests::card_models_ignore_arrival_batch_and_timezone has been running for over 60 seconds
test tests::durable_import_tests::generated_import_confirm_replay_and_undo_preserve_minor_units has been running for over 60 seconds
test tests::durable_import_tests::operation_recovery_survives_process_exit_at_every_phase has been running for over 60 seconds
test tests::durable_import_tests::operation_recovery_survives_process_exit_at_every_phase ... ok
test tests::durable_import_tests::publication_and_inverse_authority_use_full_commits ... ok
test tests::durable_import_tests::queued_import_and_undo_survive_restarts ... ok
test tests::durable_import_tests::receipt_reads_are_bounded_and_old_receipts_are_addressable ... ok
test tests::durable_import_tests::generated_import_confirm_replay_and_undo_preserve_minor_units ... ok
test tests::durable_import_tests::replay_preserves_a_live_ready_preview ... ok
test tests::durable_import_tests::running_jobs_do_not_expire_and_cancelled_jobs_do_not_restart ... ok
test tests::durable_import_tests::undo_receipt_replay_never_removes_a_restored_import ... ok
test tests::durable_import_tests::undo_refuses_a_predecessor_restored_before_the_inverse ... ok
test tests::durable_import_tests::replacement_restarts_at_every_durable_phase has been running for over 60 seconds
test tests::durable_import_tests::undo_refuses_every_later_budget_edit_after_restart ... ok
test tests::durable_import_tests::undo_restarts_before_and_after_the_filesystem_inverse ... ok
test tests::failed_cross_month_move_never_counts_the_row_twice ... ok
test tests::far_month_assignment_cannot_make_the_budget_unreadable ... ok
test tests::gap_month_assignments_and_opening_card_debt_do_not_create_cash ... ok
test tests::historical_overspend_does_not_emit_current_month_event ... ok
test tests::hostile_inputs_are_rejected_without_writing ... ok
test tests::durable_import_tests::replacement_restarts_at_every_durable_phase ... ok
test tests::import_fidelity_review_requires_account_kind_and_keeps_notes ... ok
test tests::import_file_limits_match_the_money_reader ... ok
test tests::import_preview_is_owner_bound_and_confirmation_publishes_once ... ok
test tests::import_preview_reads_only_generated_staged_upload_names ... ok
test tests::idle_import_receive_releases_admission_and_cancel_stops_read ... ok
test tests::memo_and_tags_split_the_payee_without_losing_text ... ok
test tests::money_is_on_for_the_instance_and_off_for_a_new_user ... ok
test tests::inferred_opening_balance_needs_explicit_confirmation ... ok
test tests::month_revision_increases_after_each_assignment ... ok
test tests::move_money_keeps_ready_to_assign_and_card_gets_payment_category ... ok
test tests::multiple_assignment_rows_set_one_exact_total ... ok
test tests::other_users_and_sessions_without_data_scope_see_nothing ... ok
test tests::overflowing_category_sum_is_rejected_before_assignment_write ... ok
test tests::overflowing_cleared_subset_is_rejected_before_transaction_write ... ok
test tests::overflowing_derived_balance_is_rejected_before_the_write ... ok
test tests::overspending_reports_ynab_states ... ok
test tests::plugin_code_never_uses_floating_point ... ok
test tests::parsed_money_cache_shares_documents_and_prunes_removed_months ... ok
test tests::recheck_metadata_files_use_the_reader_size_cap ... ok
test tests::recheck_local_server_number_and_lifecycle_contract ... ok
test tests::recheck_source_checks_owner_and_opening_balance_confirmation ... ok
test tests::review_1130::review1130_cancel_after_partial_preparation ... ok
test tests::recheck_random_preview_cancellation_leaves_no_files ... ok
test tests::review_1130::review1130_legacy_home_needs_no_metadata_rewrite ... ok
test tests::review_1130::review1130_notes_are_inert ... ok
test tests::review_1130::review1130_long_imported_note_allows_amount_edit_without_loss ... ok
test tests::review_1130::review1130_reconciled_closed_balances ... ok
test tests::review_1130::review1130_split_and_closed_transfer_have_one_posting ... ok
test tests::review_984::review3_first_future_transaction_keeps_current_event_month ... ok
test tests::review_1130::review1130_tcp_locks_reimport_and_cancel ... ok
test tests::review_984::review3_future_only_edit_and_delete_keep_current_event_month ... ok
test tests::review_984::review3_outside_current_range_writes_emit_no_overspend ... ok
test tests::review_984::review_category_edit_emits_for_old_category_only ... ok
test tests::review_984::review_concurrent_assign_revisions_match_final_report ... ok
test tests::review_984::review_cross_month_refund_move_emits_current_crossing ... ok
test tests::review_984::review_file_replacement_advances_month_revision ... ok
test tests::review_984::review_exact_zero_healing_recrossing_and_delete ... ok
test tests::review_984::review_split_and_tracking_transfer_writes_are_rejected_without_events ... ok
test tests::review_984::review_user_zone_month_and_year_edges ... ok
test tests::review_984::review_source_generation_tracks_all_files_and_restoration ... ok
test tests::review_bulkrev2::four_conflicts_return_409_without_writing ... ok
test tests::same_handle_settles_a_failed_move_before_the_next_request ... ok
test tests::simultaneous_import_confirmations_have_one_winner ... ok
test tests::review_bulkrev2::two_and_five_assignment_races_match_serial_targets ... ok
test tests::source_total_mismatch_cannot_be_confirmed ... ok
test tests::transaction_identity_preview_is_atomic_and_reimport_changes_nothing ... ok
test tests::transaction_logged_event_has_the_documented_create_payload ... ok
test tests::transfer_cleared_edits_are_per_account ... ok
test tests::transfer_register_view_exposes_linked_category ... ok
test tests::update_transaction_emits_current_month_overspend_crossing ... ok
test tests::wizard_background_job_recovers_preview_after_response_is_dropped ... ok
test tests::wizard_background_job_retains_safe_failure ... ok
test tests::wizard_starter_categories_validate_before_create_and_do_not_change_totals ... ok
test tests::ynab_conflicting_accounts_and_payees_are_not_silently_discarded ... ok
test tests::ynab_csv_import_keeps_exact_month_and_register_amounts ... ok
test tests::ynab_duplicate_category_ids_are_merged_only_when_identical ... ok
test tests::ynab_plan_json_import_keeps_exact_milliunits ... ok
test tests::ynab_public_demo_imports_duplicate_category_names_by_id ... ok
test tests::slow_15mb_import_receive_completes_with_progress ... ok
test tests::bulk_write_balances_equal_one_by_one ... ok
test tests::card_models_ignore_arrival_batch_and_timezone ... ok

test result: ok. 133 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 1305.17s

     Running tests/import_review.rs (/home/kayg/build/targets/bulkrev3/debug/deps/import_review-6a0b9e5006b57cbf)

running 32 tests
test csv_bom_mixed_endings_and_decimal_comma_are_exact ... ok
test csv_amount_edges_never_round_group_or_overflow ... ok
test csv_transaction_ids_merge_or_reject_before_totals ... ok
test identity_csv_transfer_growth_curve ... ignored, run with MONEY_IDENT_CSV_ROWS for 10k/100k/1M transfer profiling
test corrupt_actual_database_is_a_private_error ... ok
test recheck_actual_stream_growth_curve ... ignored, run with MONEY_RECHECK_ARCHIVE and MONEY_RECHECK_ROWS for profiling
test recheck_conflicting_transaction_ids_are_rejected ... ok
test recheck_csv_transfer_growth_curve ... ignored, run with MONEY_RECHECK_TRANSFERS for the bounded CSV growth probe
test recheck_e2e_csv_has_four_checks_and_keeps_every_minor_unit ... ok
test recheck_identical_transaction_ids_do_not_double_money ... ok
test recheck_reconciled_negative_zero_and_exact_source_scales ... ok
test split_identity_cannot_reuse_a_top_level_id ... ok
test split_identity_concrete_valid_totals ... ok
test split_identity_includes_parent_deleted_and_transfer_fields ... ok
test csv_pairing_accepts_cancellation_during_its_loop ... ok
test split_identity_rejects_an_inconsistent_embedded_parent ... ok
test split_identity_review_cases_reject ... ok
test transaction_identity_checks_fields_and_keeps_distinct_ids ... ok
test transaction_identity_preserves_exact_units ... ok
test transfer_legs_prefer_a_same_month_mate ... ok
test transfer_month_identity_rejects_in_both_adapters ... ok
test split_identity_merges_before_totals ... ok
test transfer_month_review_cases_reject ... ok
test unmatched_transfer_legs_keep_the_source_register ... ok
test ynab_account_check_rejects_a_wrong_normalization ... ok
test ynab_csv_preserves_exact_minor_units ... ok
test transfer_month_pairing_keeps_dates_and_exact_pair_priority ... ok
test ynab_negative_zero_amount_is_zero ... ok
test ynab_unrepresentable_milliunits_are_rejected ... ok
test ynab_json_keeps_exact_split_and_transfer_postings ... ok
test csv_pairing_keeps_exact_account_legs ... ok
test raw_ynab_registers_match_a_raw_row_oracle ... ok

test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 9.75s

   Doc-tests calternal_money

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

   Doc-tests calternal_plugin_money

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

Six existing ignored tests remain unchanged. Four are performance/growth profiles. The other two are child checks executed by their parents. No suite was restarted.

cargo clean: exit 0. Output, verbatim:

     Removed 3740 files, 2.0GiB total

The temporary standalone probe binary was deleted. No web build output was created. The source doc comments were read again before this report.

BLOCK — R3-1 underfunded partial refunds remove money; R3-2 later-month unfunded refunds duplicate money; R3-3 mixed cash/Card refunds lose the cash deficit at rollover; R3-4 transfers into positive Card credit omit budget money; R3-5 spending positive Card credit creates payment reserve.

Final independent review head: `bafe854ce8fcef89d3f498a9e2f2ed2ea763e95a`. # Independent Money number review — bulkrev3, #1393 BLOCK: R3-1, R3-2, R3-3, R3-4 and R3-5. They remove or duplicate budget money. The previous B1 and N2 cases now pass. All eleven changed reference vectors remain correct. Reviewed product head: `3e5fe2ae1c82f69ee26c8f9d56000db7b9cd26db`. Branch: `job/bulkwrite-1393`. The required fetch and merge of `origin/dev` reported `Already up to date.` The author report and result files were not read. The previous review was read for its B1 and N2 inputs and independent vector equations. All values in this report are synthetic fixture cents. ## Method and invariant The probes use the public Markdown codec, projection and replay. Exact integer input values go through the existing Minor formatter and Assignment editor. No product code, dependencies, lockfiles or existing test expectations changed. No web code changed. [DESIGN §48](../../docs/DESIGN.md) defines the envelope method: Assignments move money from Ready to Assign to a Category; funded Card spending moves money to the payment Category; a payment spends its reserve; cash overspending reduces next month's Ready to Assign; credit overspending becomes uncovered debt. Positive Card balances are real budget money. Negative Card balances are debt. Hidden Categories retain their history and count in totals. The universal account invariant is exact balance conservation: at each month end, each Account balance equals its opening balance plus all its ordinary legs and transfer legs through that month. Transfers sum to zero. This holds regardless of Category funding. The generated test checks all 1,536 month models against independent raw input sums. For allocation conservation, define L as signed Category Available plus Ready to Assign. Define M as Cash balances plus the positive part of each Card balance. Import reconciliation adjustments must be added to M when present; these fixtures have none. At a transaction-free next month after rollover, there is no new unfunded credit deficit. The strongest allocation invariant for these Cash/Card histories is **L = M**. It must hold for underfunded histories too: virtual credit deficits have reset and cash deficits have reduced Ready to Assign. No debt is counted as negative budget money and no payment reserve is counted twice. This test avoids the incorrect comparison with the signed sum of all Account balances. At a month with current credit overspending, L needs a credit-deficit correction; that temporary discrepancy alone is not a defect. Same-date shuffle independence holds for both acceptance and the complete MonthTotals model. It is independent of money conservation: a model can be consistently wrong in every file order. ## Previous cases and reference vectors B1 uses the previous amounts, dates and posting types: Cash income 20,000; Food and Dining Assignments 10,000 each; older Food purchase -10,000; Dining purchase -10,000; same-date payment 10,000 and Food refund 10,000. Both same-date permutations return Food 10,000, Dining 0, reserve 0, Ready to Assign 0, Cash 10,000 and Card 0. March and April each contain exactly 10,000 real and allocated money. N2 uses the exact previous values and Category IDs. M is MAX_EXACT, 9,007,199,254,740,991. Opening income and Food Assignment are M-1; the four same-date rows are Cash Food -M, a Cash Split parent +1 with Food -1 and Dining +2, Cash Food +M, and Card Dining -1. All 24 permutations are accepted and return Cash M, Card -1, Food M-2, Dining 1, reserve 1 and Ready to Assign 0. For each of the eleven vectors, S is the Food and Dining Assignment, 1,000,000,000,000. A is the Food purchase and full refund, B the Dining purchase, P the payment. Dining precedes Food in canonical order. The final reserve is max(B-P,0); Food Available is S; Dining Available is S-B; Ready to Assign is -2S; Cash is -P; Card is P-B; Savings and uncovered debt are 0. Food activity is 0, Dining activity is -B, and payment activity is -P. The independent calculation checked every stored output field, including funding state, empty targets and marker Categories, not just the reserve. Production replay equality is checked by the crate's vectors gate. | Vector | A | B | P | Correct reserve | | --- | ---: | ---: | ---: | ---: | | 07b33aa56ff97a67 | 13222722 | 108 | 13222755 | 0 | | 08d823459b4f7555 | 1 | 1 | 1 | 0 | | 10dad10f207e3966 | 13222722 | 1 | 13222722 | 0 | | 217b597cc7b1b339 | 109170509 | 1000000000 | 110838733 | 889161267 | | 3c10364db1d4cd46 | 109170509 | 1 | 109170509 | 0 | | 405bf72849418ee7 | 28500 | 1 | 28500 | 0 | | 5cd63c6abac2f757 | 103816 | 1 | 103816 | 0 | | 70887b8579a61566 | 5789 | 1035233 | 55551 | 979682 | | aa06a27413c2238d | 103816 | 454 | 103879 | 0 | | de05e2804212ba0e | 5789 | 1 | 5789 | 0 | | f161754b530689ba | 28500 | 8319 | 31192 | 0 | ## Blocking cases Every case starts with March 1 Cash income 200. No import adjustment is used. Unless stated otherwise, other Categories and the second Card have zero balances. The evidence also replays empty following months. **R3-1: a partial refund of an underfunded purchase removes money.** Food Assignment 50; March 10 Card Food purchase -100; March 20 Card Food refund +50. Before the refund Food is -50 and reserve is 50. The refund cancels the unfunded half of the purchase. Expected Food 0, reserve 50, Ready to Assign 150, Cash 200 and Card -50: allocations 200. Actual Food 0, reserve 0 and Ready to Assign 150: allocations 150. The missing 50 persists in April and May. The refund releases real reserve while it only heals a virtual credit deficit. The new refund paragraph, applied literally, conflicts with the envelope rule here; both code and specification need this distinction. **R3-2: a later-month refund of unfunded debt creates money.** No Assignment; March 10 Card Food purchase -100; April 1 Card Food refund +100. March Food -100 is a virtual credit deficit and resets without reducing Ready to Assign. Expected April Food 0, reserve 0 and Ready to Assign 200, Cash 200 and Card 0: allocations 200. Actual Food 100 and Ready to Assign 200: allocations 300. Excess 100 persists in May. Cancelling unfunded debt did not bring money into an Account or release any funded reserve. **R3-3: a mixed cash/Card refund loses the cash deficit at rollover.** Food Assignment 50; March 10 Cash Food spend -100; March 11 Card Food purchase -100; March 20 Card Food refund +100. March correctly ends with Cash 100, Card 0, Food -50, reserve 0 and Ready to Assign 150. §48 requires the cash deficit to reduce April Ready to Assign to 100 as Food resets to 0. Actual April and May Ready to Assign remain 150: excess 50. The mixed monthly pool includes the Card refund and classifies the remaining cash deficit as credit. **R3-4: a two-Card transfer into positive credit omits budget money.** No Assignment; March 11 general transfer 100 from the zero-balance Card to the zero-balance Other Card. Cash is 200, Card -100 and Other +100. Under §48's explicit positive-Card rule, real budget money is 300. Allocations remain 200 in March, April and May: missing 100. The general-transfer rule keeps Category totals unchanged, so a Ready to Assign correction is required to satisfy both rules when a Card transfer crosses zero. The code applies neither correction. The owner should confirm how these two §48 rules combine; this review applies the stated positive-Card definition consistently. **R3-5: spending positive Card credit creates a payment reserve.** No Assignment; March 10 Card Food refund +50 with no prior debt; March 11 Card Food purchase -50. The refund creates Food Available 50 and positive Card credit 50. The purchase spends that credit. Expected final Cash 200, Card 0, Food 0, reserve 0 and Ready to Assign 200: allocations 200. Actual reserve 50: allocations 250. Excess 50 persists in April and May. No debt remains for this reserve to pay. This funded purchase is a further counterexample to an unqualified fully-funded conservation claim when positive Card credit exists. ## Other requested cases | Case | Correct result from §48 | Comparison | | --- | --- | --- | | Cash overspending | Assignment 50, Cash spend 100: March Food -50, Ready to Assign 150 and Cash 100. April Food 0 and Ready to Assign 100. | Matches. | | Refund larger than remaining debt | Assignment 100, Card purchase 100, refund 150: Food 150, reserve 0, Ready to Assign 100, Cash 200 and Card +50; total 250. | Matches. | | Funded later-month refund | Assignment 100, March Card purchase 100, April refund 100: April Food 100, reserve 0, Ready to Assign 100, Cash 200 and Card 0; total 200. | Matches. | | Partly funded later-month refund | Assignment 50, March Card purchase 100, April refund 50: under the stated refund policy April Food 50, reserve 0, Ready to Assign 150, Cash 200 and Card -50; total 200. | Matches that policy and conserves totals. The unfunded full-return case fails as R3-2. | | Refund after full payment | Assignment 100, purchase 100, payment 100, refund 100: Food 100, reserve 0, Ready to Assign 100, Cash 100 and Card +100; total 200. | Matches. | | Partial payment then refund | Food and Dining Assignments 100 each, purchases 100 each, payment 50, Food refund 100: Food 100, Dining 0, reserve 50, Ready to Assign 0, Cash 150 and Card -50; total 150. | Matches. | | Split refunds across Categories | Assignments and purchases 100 each, payment 150, refund split Food 100 and Dining 100: Food 100, Dining 100, reserve 0, Ready to Assign 0, Cash 50 and Card +150; total 200. | Matches; only the first 50 of the split reduces prior debt. | | Transfer existing debt between Cards | Assignment 100, Card purchase 100, transfer 100 from Other to Card: Cash 200, Card 0, Other -100, original reserve 100 and Ready to Assign 100; total 200. | Conserves totals. Under the literal general-transfer rule, the reserve stays with the original Card and Other is uncovered; the User must move the Assignment. | | Hidden Category refund | A hidden Food Category with purchase 100 and refund 100 retains all history and produces the same complete model as the visible Category. | Matches. | | Deleted/missing Category refund | §48 prohibits history deletion. A missing referenced identity must fail validation rather than omit its activity. | Projection rejects `unknown category block id: food`; no totals are returned. No deletion route was changed or tested. | ## Generated histories Seed 139303; 256 histories; up to 60 rows each; six months per history. January, March and May contain activity; the following empty months check rollover. Each history includes zero or small Assignments and draws from Card purchases/refunds, payments, Cash spending, split Card purchases/refunds, second-Card purchases and two-Card transfers. Broad accepted inputs include payments larger than debt and positive Card balances. All 256 complete-model shuffle comparisons pass. All 1,536 monthly raw Account balance checks pass. Of 768 empty-month allocation checks, 102 satisfy L=M, 127 have excess allocations and 539 have missing allocations. The delta is between -2,783 and +929. These counts are not separate defect diagnoses. The five small cases above establish the blockers without relying on a correction for current-month credit overspending. ## Built, files and known gaps This review adds four independent Rust review probes and this report: - `crates/calternal-money/tests/review_bulkrev3.rs`. - `tests/money/bulkrev3-review.md`. Findings were appended during the review in `artifacts/bulkrev3-findings.md`. Probe outputs, vector calculations and gate logs remain in `artifacts/`; they are not committed. Product code is unchanged. The five blocking cases are not fixed because this job is read-mostly. Probe tests collect discrepancies as evidence; green probe results do not approve the incorrect numbers. Existing expectations remain unchanged. No new UI, route or background job was built, so no UI screenshots or new performance profile applies. No secrets were displayed. ## Decisions No product design was changed. The review uses §48's Cash-plus-positive-Card rule, rather than signed net Accounts, for real budget money. Empty next months remove the current-credit-deficit ambiguity without excluding underfunded histories. Missing Category identities are reviewed as invalid source files; history deletion is forbidden. R3-1 and R3-4 expose specification combinations that the owner must clarify; they do not justify changing product rules in a review job. ## Verification Cargo used CARGO_PROFILE_DEV_DEBUG=line-tables-only, CARGO_INCREMENTAL=0, CARGO_BUILD_JOBS=4 and TMPDIR=<worktree>/target/tmp. The preset CARGO_TARGET_DIR was not changed. No crate/package version was introduced or changed. Review test head: `8ca3a9f95`. The final issue comment records the report commit SHA. `cargo fmt --check`: exit 0, no output. `cargo clippy -p calternal-money --all-targets -- -D warnings`: exit 0. Output, verbatim: ```text Checking calternal-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-money) Finished `dev` profile [unoptimized + debuginfo] target(s) in 2.03s ``` `cargo test -p calternal-money --test review_bulkrev3 -- --nocapture --test-threads=4`: exit 0. Final result, verbatim: ```text test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.02s ``` `cargo test -p calternal-money -p calternal-plugin-money -- --test-threads=4`: exit 0. Complete output, verbatim: ```text Compiling proc-macro2 v1.0.107 Compiling quote v1.0.47 Compiling memchr v2.8.3 Compiling serde_core v1.0.229 Compiling once_cell v1.21.4 Compiling futures-core v0.3.34 Compiling serde v1.0.229 Compiling pin-project-lite v0.2.17 Compiling jobserver v0.1.35 Compiling find-msvc-tools v0.1.13 Compiling shlex v2.0.1 Compiling log v0.4.34 Compiling bytes v1.12.1 Compiling syn v3.0.6 Compiling cc v1.4.7 Compiling stable_deref_trait v1.2.1 Compiling serde_json v1.0.151 Compiling num-traits v0.2.19 Compiling pkg-config v0.3.34 Compiling version_check v0.9.5 Compiling syn v2.0.119 Compiling socket2 v0.6.5 Compiling equivalent v1.0.2 Compiling getrandom v0.4.3 Compiling rand_core v0.10.1 Compiling writeable v0.6.4 Compiling hashbrown v0.17.1 Compiling litemap v0.8.3 Compiling utf8_iter v1.0.4 Compiling icu_normalizer_data v2.3.0 Compiling serde_derive v1.0.229 Compiling synstructure v0.14.0 Compiling zerovec-derive v0.11.6 Compiling zerofrom-derive v0.1.8 Compiling yoke-derive v0.8.4 Compiling displaydoc v0.2.7 Compiling tracing-attributes v0.1.31 Compiling zerofrom v0.1.8 Compiling generic-array v0.14.9 Compiling yoke v0.8.3 Compiling tracing-core v0.1.36 Compiling futures-task v0.3.34 Compiling zerovec v0.11.8 Compiling zerotrie v0.2.5 Compiling typenum v1.20.1 Compiling scopeguard v1.2.0 Compiling futures-io v0.3.34 Compiling icu_properties_data v2.3.0 Compiling tinystr v0.8.4 Compiling potential_utf v0.1.6 Compiling tracing v0.1.44 Compiling icu_locale_core v2.3.0 Compiling icu_collections v2.3.0 Compiling mio v1.2.3 Compiling errno v0.3.14 Compiling percent-encoding v2.3.2 Compiling futures-sink v0.3.34 Compiling icu_provider v2.3.1 Compiling signal-hook-registry v1.4.8 Compiling lock_api v0.4.14 Compiling tokio-macros v2.7.2 Compiling smallvec v1.16.1 Compiling iana-time-zone v0.1.65 Compiling indexmap v2.14.2 Compiling icu_properties v2.3.0 Compiling chrono v0.4.45 Compiling tokio v1.53.1 Compiling parking_lot_core v0.9.12 Compiling slab v0.4.12 Compiling form_urlencoded v1.2.2 Compiling futures-macro v0.3.34 Compiling cmake v0.1.58 Compiling fs_extra v1.3.0 Compiling futures-util v0.3.34 Compiling vcpkg v0.2.15 Compiling dunce v1.0.5 Compiling aws-lc-sys v0.45.0 Compiling thiserror-impl v2.0.21 Compiling http v1.5.0 Compiling aho-corasick v1.1.5 Compiling crossbeam-utils v0.8.23 Compiling siphasher v1.0.3 Compiling regex-automata v0.4.18 Compiling spin v0.9.9 Compiling hybrid-array v0.4.15 Compiling foldhash v0.2.0 Compiling cpufeatures v0.2.17 Compiling allocator-api2 v0.2.21 Compiling base64 v0.22.1 Compiling hashbrown v0.16.1 Compiling tempfile v3.27.0 Compiling regex v1.13.1 Compiling icu_normalizer v2.3.0 Compiling rustversion v1.0.23 Compiling zeroize v1.9.0 Compiling aws-lc-rs v1.18.1 Compiling parking v2.2.1 Compiling crc-catalog v2.5.0 Compiling event-listener v5.4.2 Compiling crc v3.4.0 Compiling rusty-fork v0.3.1 Compiling idna_adapter v1.2.2 Compiling crossbeam-queue v0.3.14 Compiling hashlink v0.11.1 Compiling crypto-common v0.1.6 Compiling block-buffer v0.10.4 Compiling http-body v1.1.0 Compiling futures-channel v0.3.34 Compiling thiserror v2.0.21 Compiling simd-adler32 v0.3.10 Compiling httparse v1.10.1 Compiling proptest v1.11.0 Compiling parking_lot v0.12.5 Compiling digest v0.10.7 Compiling idna v1.1.0 Compiling rustls-pki-types v1.15.1 Compiling calternal-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-money) Compiling crypto-common v0.2.2 Compiling libsqlite3-sys v0.37.0 Compiling cpufeatures v0.3.1 Compiling tower-service v0.3.3 Compiling crc32fast v1.5.2 Compiling either v1.18.0 Compiling url v2.5.8 Compiling tokio-stream v0.1.19 Compiling sha2 v0.10.9 Compiling futures-intrusive v0.5.0 Compiling tokio-util v0.7.19 Compiling untrusted v0.9.0 Compiling atomic-waker v1.1.2 Compiling rand_core v0.6.4 Compiling try-lock v0.2.5 Compiling adler2 v2.0.1 Compiling rustls v0.23.45 Compiling want v0.3.1 Compiling rand v0.8.8 Compiling sqlx-core v0.9.0 Compiling h2 v0.4.19 Compiling atoi v2.0.0 Compiling futures-executor v0.3.34 Compiling flume v0.12.0 Compiling inout v0.2.2 Compiling phf_shared v0.11.3 Compiling blake3 v1.8.7 Compiling sync_wrapper v1.0.2 Compiling subtle v2.6.1 Compiling cmov v0.5.4 Compiling ryu v1.0.23 Compiling ipnet v2.12.2 Compiling httpdate v1.0.3 Compiling tower-layer v0.3.3 Compiling rustls-webpki v0.103.15 Compiling ctutils v0.4.2 Compiling hyper v1.11.1 Compiling phf_generator v0.11.3 Compiling sqlx-sqlite v0.9.0 Compiling miniz_oxide v0.9.1 Compiling encoding_rs v0.8.41 Compiling multiversion-macros v0.9.0 Compiling block-buffer v0.12.1 Compiling phf_shared v0.12.1 Compiling arrayvec v0.7.8 Compiling chrono-tz v0.10.4 Compiling heck v0.5.0 Compiling dotenvy v0.15.7 Compiling inotify-sys v0.1.8 Compiling zlib-rs v0.6.8 Compiling hex v0.4.3 Compiling constant_time_eq v0.4.2 Compiling sqlx-macros-core v0.9.0 Compiling phf v0.12.1 Compiling cipher v0.5.2 Compiling multiversion v0.9.0 Compiling hyper-util v0.1.20 Compiling phf_macros v0.11.3 Compiling flate2 v1.1.10 Compiling universal-hash v0.6.1 Compiling tower v0.5.3 Compiling http-body-util v0.1.5 Compiling multer v3.1.0 Compiling core_detect v1.0.0 Compiling mime v0.3.17 Compiling linkme-impl v0.3.37 Compiling unicode-joining-type v1.0.0 Compiling multiversion_no_op v1.0.0 Compiling openssl-probe v0.2.1 Compiling simdutf8 v0.1.5 Compiling phf v0.11.3 Compiling rustls-native-certs v0.8.4 Compiling poly1305 v0.9.1 Compiling sqlx-macros v0.9.0 Compiling chacha20 v0.10.2 Compiling tokio-rustls v0.26.6 Compiling aead v0.6.1 Compiling miniz_oxide v0.8.9 Compiling fdeflate v0.3.7 Compiling utoipa-gen v6.0.1 Compiling winnow v0.7.15 Compiling quick-error v2.0.1 Compiling same-file v1.0.6 Compiling linkme v0.3.37 Compiling pxfm v0.1.30 Compiling byteorder-lite v0.1.0 Compiling color_quant v1.1.0 Compiling weezl v0.1.12 Compiling pulldown-cmark v0.13.4 Compiling calternal-path v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-path) Compiling zune-core v0.5.3 Compiling gif v0.14.2 Compiling zune-jpeg v0.5.15 Compiling utoipa v6.0.0 Compiling moxcms v0.8.1 Compiling image-webp v0.2.4 Compiling cron v0.17.0 Compiling walkdir v2.5.0 Compiling png v0.18.1 Compiling sqlx v0.9.0 Compiling chacha20poly1305 v0.11.0 Compiling hyper-rustls v0.27.10 Compiling inotify v0.11.5 Compiling rustls-platform-verifier v0.7.0 Compiling axum-core v0.5.6 Compiling tower-http v0.6.11 Compiling serde_urlencoded v0.7.1 Compiling uuid v1.26.1 Compiling notify-types v2.1.0 Compiling serde_path_to_error v0.1.20 Compiling bytemuck v1.25.2 Compiling bumpalo v3.20.3 Compiling unsafe-libyaml v0.2.11 Compiling matchit v0.8.4 Compiling base64 v0.23.1 Compiling unicase v2.9.0 Compiling unicode-properties v0.1.4 Compiling unicode-casefold v0.2.0 Compiling reqwest v0.13.5 Compiling serde_yaml v0.9.34+deprecated Compiling calternal-fs v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-fs) Compiling axum v0.8.9 Compiling zopfli v0.8.3 Compiling image v0.25.10 Compiling notify v8.2.0 Compiling calternal-db v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-db) Compiling calternal-api v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-api) Compiling quick-xml v0.42.0 Compiling csv-core v0.1.13 Compiling csv v1.4.0 Compiling calternal-plugin v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-plugin) Compiling zip v5.1.1 Compiling calternal-notes-core v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-notes-core) Compiling calternal-plugin-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/plugins/money) Finished `test` profile [unoptimized + debuginfo] target(s) in 4m 12s Running unittests src/lib.rs (/home/kayg/build/targets/bulkrev3/debug/deps/calternal_money-5ad27f9b5c008064) running 16 tests test codec::tests::empty_payee_is_refused_by_the_writer ... ok test codec::tests::malformed_dated_rows_fail_instead_of_vanishing ... ok test codec::tests::property_edit_changes_one_value ... ok test codec::tests::transaction_round_trip_with_punctuation_in_labels_and_payee ... ok test codec::tests::round_trip_keeps_bom_crlf_and_unknown_bytes ... ok test edit::tests::crlf_file_keeps_crlf_on_insert ... ok test edit::tests::cleared_tag_toggles_without_touching_other_tags ... ok test codec::tests::checked_parse_stops_after_a_bounded_line_batch ... ok test edit::tests::unicode_payee_tag_boundaries_match_shared_vectors ... ok test units::tests::exact_range_is_enforced_on_parse_and_arithmetic ... ok test units::tests::format_uses_explicit_sign_and_exact_scale ... ok test units::tests::parse_matches_the_oracle_examples ... ok test edit::tests::new_budget_projects_with_no_accounts ... ok test edit::tests::assign_inserts_updates_and_removes_rows ... ok test units::independent_number_review::signed_edges_and_long_zero_padding_keep_exact_minor_units ... ok test units::tests::scale_table_has_all_165_codes_with_unique_entries ... ok test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s Running tests/account_kinds.rs (/home/kayg/build/targets/bulkrev3/debug/deps/account_kinds-40f136ace82559dd) running 4 tests test account_projection_rejects_legacy_and_unknown_kinds ... ok test off_budget_balance_marker_does_not_change_budget_money ... ok test imported_account_kinds_project_without_losing_identity ... ok test categorized_debit_loan_transfers_post_one_budget_leg ... ok test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s Running tests/import.rs (/home/kayg/build/targets/bulkrev3/debug/deps/import-32258f8fda96f336) running 13 tests test duplicate_source_ids_are_rejected_and_duplicate_names_are_kept ... ok test import_render_is_exact_and_byte_stable ... ok test import_replay_matches_full_ledger_month_by_month ... ok test import_keeps_same_day_source_order_for_credit_payments_and_refunds ... ok test import_stream_renderer_matches_full_rendered_files ... ok test import_render_reports_progress_and_propagates_cancel ... ok test production_v1_metadata_upgrade_keeps_balances ... ok test recheck_half_minor_units_negative_zero_and_nineteen_digits ... ok test imported_ready_to_assign_matches_independent_month_oracle ... ok test budget_replay_stops_at_a_bounded_transaction_checkpoint ... ok test recheck_same_day_payment_and_refund_keep_source_fifo ... ok test random_imports_conserve_source_balances_and_markdown ... ok test recheck_random_multicurrency_ledgers_match_all_monthly_totals ... ok test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 13.19s Running tests/properties.rs (/home/kayg/build/targets/bulkrev3/debug/deps/properties-9ff9e71a800dacb8) running 21 tests test bill_coverage_never_clamps_the_bill ... ok test bulkrev2::boundary_shuffle_reports_acceptance_difference ... ok test bulkrev2::i64_extremes_are_rejected_and_safe_bound_is_exact ... ok test bulkrev2::literal_account_sum_and_funded_card_conservation ... ok test bulkrev2::refund_payment_calendar_choice_is_visible_next_month ... ok test any_text_that_parses_serializes_to_the_same_bytes ... ok test bulkrev2::split_refund_keeps_payment_overfunding_when_card_becomes_positive ... ok test assign_then_unassign_is_the_identity ... ok test decimal_text_round_trips_for_every_scale ... ok test cash_ledgers_conserve_money_every_month ... ok test fully_funded_card_spending_conserves_cash ... ok test money_code_never_uses_floating_point ... ok test mixed_cash_credit_deficit_rolls_only_its_cash_part ... ok test paired_write_replay_matches_independent_calculations ... ok test reviewed_burst_order_matches_input_order ... ok test partial_payment_then_category_refunds_conserve_cash_across_months ... ok test split_legs_post_exactly_the_parent ... ok test transaction_rows_round_trip_byte_for_byte ... ok test same_date_card_postings_are_a_function_of_the_set ... ok test bulkrev2::funded_shuffles_conserve_real_money_every_month ... ok test bulkrev2::same_day_shuffles_cover_splits_transfers_and_month_edges ... ok test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 8.16s Running tests/ready_to_assign_adjustment.rs (/home/kayg/build/targets/bulkrev3/debug/deps/ready_to_assign_adjustment-0e1c5c7276d14077) running 1 test test ready_to_assign_adjustment_changes_only_the_budget_pool ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s Running tests/review_984.rs (/home/kayg/build/targets/bulkrev3/debug/deps/review_984-dc85183370c2f07a) running 5 tests test review_pair_performance_profile ... ignored, performance measurements belong to the merge round on the perf VM test review_pair_rejects_bad_months_and_amounts_without_rounding ... ok test review_split_remainders_and_tracking_transfers_are_exact ... ok test review_mixed_pair_matches_independent_replays ... ok test review_large_ledger_pair_keeps_exact_totals ... ok test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 4.99s Running tests/review_bulkrev3.rs (/home/kayg/build/targets/bulkrev3/debug/deps/review_bulkrev3-cbfa6724c48c7f18) running 4 tests test hidden_and_missing_categories ... ok test envelope_edge_cases ... ok test previous_witnesses_all_orders ... ok test generated_underfunded_rollovers ... ok test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.52s Running tests/vectors.rs (/home/kayg/build/targets/bulkrev3/debug/deps/vectors-b0e2a54af0711cc9) running 3 tests test rust_matches_random_oracle_ledgers_without_divergences ... ok test reviewed_eleven_refund_vectors_keep_their_exact_numbers ... ok test rust_port_matches_every_recorded_oracle_vector ... ok test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.56s Running unittests src/lib.rs (/home/kayg/build/targets/bulkrev3/debug/deps/calternal_plugin_money-3d165b6d3890a332) running 135 tests test import::import_review_tests::actual_cents_conversion_never_rounds ... ok test import::import_review_tests::actual_cc_label_requires_missing_type_confirmation ... ok test import::import_review_tests::actual_stream_memory_guard_child ... ignored, invoked as an isolated child by actual_stream_keeps_a_large_history_bounded test import::import_review_tests::actual_orphan_split_children_are_rejected ... ok test import::import_review_tests::import_control_reports_progress_and_stops_cancelled_work ... ok test import::import_review_tests::actual_account_checks_use_raw_monthly_source_rows ... ok test import::import_review_tests::actual_transfer_legs_cannot_cross_months ... ok running 1 test test import::import_review_tests::ynab_transfer_pairing_handles_many_duplicate_legs ... ok test import_fidelity_1130::independent_split_and_transfer_numbers_check ... ok test routes::durable::admission_tests::cancelled_receiver_cannot_acknowledge_a_durable_job ... ok test routes::durable::checkpoint_tests::progress_wait_keeps_parser_writer_release_polled ... ok test import_fidelity_1130::actual_rows_round_trip ... ok test routes::import_cleanup_tests::dropped_preview_worker_retains_admission_until_exit ... ok test routes::import_cleanup_tests::idle_imports_are_reclaimed_by_expiry_cleanup ... ok test routes::import_cleanup_tests::staged_import_files_keep_ranges_and_release_private_storage ... ok test routes::import_staged_path_tests::staged_import_name_cannot_select_another_path_or_slot ... ok test import::import_review_tests::actual_stream_memory_guard_child ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 134 filtered out; finished in 58.25s test import::import_review_tests::actual_stream_keeps_a_large_history_bounded ... ok test routes::replay_reuse_tests::crossings_cover_source_ranges_relative_to_today ... ok test routes::replay_reuse_tests::crossings_reuse_checked_current_totals_even_with_future_months ... ok test routes::durable::admission_tests::live_publication_honors_operational_queue_cancellation has been running for over 60 seconds test routes::replay_reuse_tests::assignment_retry_rebuilds_from_latest_source_bytes ... ok test routes::review_1140::cancel_wins_before_publication_lock ... ok test routes::durable::money_import_undo_mutation has been running for over 60 seconds test routes::durable::admission_tests::live_publication_honors_operational_queue_cancellation ... ok test routes::review_1140::cancel_does_not_rewrite_published_result ... ok test routes::review_1140::review1140_cancel_after_rename_before_receipt_keeps_publication ... ok test routes::review_1140::review1140_discard_after_confirmation_failure_releases_admission ... ok test routes::review_1140::review1140_all_formats_replay_exact_balances ... ok test routes::durable::money_import_undo_mutation ... ok test routes::review_1140::review1140_staged_size_limits_fail_without_publishing ... ok test routes::review_1140::review1140_operational_cancel_before_replacement_returns_no_receipt ... ok test store::parsed_cache_tests::global_budget_and_folder_pruning_release_stale_entries ... ok test store::parsed_cache_tests::parse_charge_accounts_for_line_structures ... ok test store::parsed_cache_tests::user_cache_evicts_old_parse_entries_and_shares_hot_documents ... ok test routes::review_1140::review1140_terminal_receipts_do_not_block_new_imports ... ok test routes::review_1140::review1140_tcp_malformed_inputs_leave_worker_usable ... ok test tests::a_new_user_sees_the_real_empty_state ... ok test tests::a_broken_file_is_reported_not_hidden ... ok test tests::a_journal_for_a_completed_move_changes_nothing ... ok test tests::active_money_handle_survives_other_users_cache_pressure ... ok test tests::actual_duplicate_names_import_by_id_without_sharing_a_payment_category ... ok test tests::actual_export_archive_imports_exact_rows_from_private_scratch ... ok test tests::a_read_waits_for_a_write_in_progress ... ok test tests::api_account_numbers_equal_core_replay ... ok test tests::a_split_row_written_by_hand_is_read_but_not_edited ... ok test routes::review_1140::review1140_replacement_receipt_recovery_does_not_adopt_later_edits ... ok test tests::assignments_retry_source_conflicts_without_losing_neighbours ... ok test tests::backdated_create_emits_current_month_overspend_crossing ... ok test tests::bulk_write_invalid_neighbours_do_not_change_valid_rows ... ok test tests::budget_flow_writes_exact_markdown_and_derives_available ... ok test tests::cancel_racing_confirm_has_one_consistent_outcome ... ok test tests::cancelling_imports_leaves_no_budget_and_releases_slots ... ok test tests::bulk_write_month_does_not_need_note_date_backfill ... ok test tests::bulk_write_rejects_intermediate_overflow ... ok test tests::csv_import_keeps_progress_and_cancel_responsive ... ok test tests::concurrent_store_edits_keep_exactly_one_winner ... ok test tests::denied_preview_access_keeps_the_owners_pending_import ... ok test tests::delete_transaction_emits_current_month_overspend_crossing ... ok test tests::durable_import_tests::operation_exit_child ... ignored, child of operation_recovery_survives_process_exit_at_every_phase test tests::bulk_write_balances_equal_one_by_one has been running for over 60 seconds test tests::card_models_ignore_arrival_batch_and_timezone has been running for over 60 seconds test tests::durable_import_tests::generated_import_confirm_replay_and_undo_preserve_minor_units has been running for over 60 seconds test tests::durable_import_tests::operation_recovery_survives_process_exit_at_every_phase has been running for over 60 seconds test tests::durable_import_tests::operation_recovery_survives_process_exit_at_every_phase ... ok test tests::durable_import_tests::publication_and_inverse_authority_use_full_commits ... ok test tests::durable_import_tests::queued_import_and_undo_survive_restarts ... ok test tests::durable_import_tests::receipt_reads_are_bounded_and_old_receipts_are_addressable ... ok test tests::durable_import_tests::generated_import_confirm_replay_and_undo_preserve_minor_units ... ok test tests::durable_import_tests::replay_preserves_a_live_ready_preview ... ok test tests::durable_import_tests::running_jobs_do_not_expire_and_cancelled_jobs_do_not_restart ... ok test tests::durable_import_tests::undo_receipt_replay_never_removes_a_restored_import ... ok test tests::durable_import_tests::undo_refuses_a_predecessor_restored_before_the_inverse ... ok test tests::durable_import_tests::replacement_restarts_at_every_durable_phase has been running for over 60 seconds test tests::durable_import_tests::undo_refuses_every_later_budget_edit_after_restart ... ok test tests::durable_import_tests::undo_restarts_before_and_after_the_filesystem_inverse ... ok test tests::failed_cross_month_move_never_counts_the_row_twice ... ok test tests::far_month_assignment_cannot_make_the_budget_unreadable ... ok test tests::gap_month_assignments_and_opening_card_debt_do_not_create_cash ... ok test tests::historical_overspend_does_not_emit_current_month_event ... ok test tests::hostile_inputs_are_rejected_without_writing ... ok test tests::durable_import_tests::replacement_restarts_at_every_durable_phase ... ok test tests::import_fidelity_review_requires_account_kind_and_keeps_notes ... ok test tests::import_file_limits_match_the_money_reader ... ok test tests::import_preview_is_owner_bound_and_confirmation_publishes_once ... ok test tests::import_preview_reads_only_generated_staged_upload_names ... ok test tests::idle_import_receive_releases_admission_and_cancel_stops_read ... ok test tests::memo_and_tags_split_the_payee_without_losing_text ... ok test tests::money_is_on_for_the_instance_and_off_for_a_new_user ... ok test tests::inferred_opening_balance_needs_explicit_confirmation ... ok test tests::month_revision_increases_after_each_assignment ... ok test tests::move_money_keeps_ready_to_assign_and_card_gets_payment_category ... ok test tests::multiple_assignment_rows_set_one_exact_total ... ok test tests::other_users_and_sessions_without_data_scope_see_nothing ... ok test tests::overflowing_category_sum_is_rejected_before_assignment_write ... ok test tests::overflowing_cleared_subset_is_rejected_before_transaction_write ... ok test tests::overflowing_derived_balance_is_rejected_before_the_write ... ok test tests::overspending_reports_ynab_states ... ok test tests::plugin_code_never_uses_floating_point ... ok test tests::parsed_money_cache_shares_documents_and_prunes_removed_months ... ok test tests::recheck_metadata_files_use_the_reader_size_cap ... ok test tests::recheck_local_server_number_and_lifecycle_contract ... ok test tests::recheck_source_checks_owner_and_opening_balance_confirmation ... ok test tests::review_1130::review1130_cancel_after_partial_preparation ... ok test tests::recheck_random_preview_cancellation_leaves_no_files ... ok test tests::review_1130::review1130_legacy_home_needs_no_metadata_rewrite ... ok test tests::review_1130::review1130_notes_are_inert ... ok test tests::review_1130::review1130_long_imported_note_allows_amount_edit_without_loss ... ok test tests::review_1130::review1130_reconciled_closed_balances ... ok test tests::review_1130::review1130_split_and_closed_transfer_have_one_posting ... ok test tests::review_984::review3_first_future_transaction_keeps_current_event_month ... ok test tests::review_1130::review1130_tcp_locks_reimport_and_cancel ... ok test tests::review_984::review3_future_only_edit_and_delete_keep_current_event_month ... ok test tests::review_984::review3_outside_current_range_writes_emit_no_overspend ... ok test tests::review_984::review_category_edit_emits_for_old_category_only ... ok test tests::review_984::review_concurrent_assign_revisions_match_final_report ... ok test tests::review_984::review_cross_month_refund_move_emits_current_crossing ... ok test tests::review_984::review_file_replacement_advances_month_revision ... ok test tests::review_984::review_exact_zero_healing_recrossing_and_delete ... ok test tests::review_984::review_split_and_tracking_transfer_writes_are_rejected_without_events ... ok test tests::review_984::review_user_zone_month_and_year_edges ... ok test tests::review_984::review_source_generation_tracks_all_files_and_restoration ... ok test tests::review_bulkrev2::four_conflicts_return_409_without_writing ... ok test tests::same_handle_settles_a_failed_move_before_the_next_request ... ok test tests::simultaneous_import_confirmations_have_one_winner ... ok test tests::review_bulkrev2::two_and_five_assignment_races_match_serial_targets ... ok test tests::source_total_mismatch_cannot_be_confirmed ... ok test tests::transaction_identity_preview_is_atomic_and_reimport_changes_nothing ... ok test tests::transaction_logged_event_has_the_documented_create_payload ... ok test tests::transfer_cleared_edits_are_per_account ... ok test tests::transfer_register_view_exposes_linked_category ... ok test tests::update_transaction_emits_current_month_overspend_crossing ... ok test tests::wizard_background_job_recovers_preview_after_response_is_dropped ... ok test tests::wizard_background_job_retains_safe_failure ... ok test tests::wizard_starter_categories_validate_before_create_and_do_not_change_totals ... ok test tests::ynab_conflicting_accounts_and_payees_are_not_silently_discarded ... ok test tests::ynab_csv_import_keeps_exact_month_and_register_amounts ... ok test tests::ynab_duplicate_category_ids_are_merged_only_when_identical ... ok test tests::ynab_plan_json_import_keeps_exact_milliunits ... ok test tests::ynab_public_demo_imports_duplicate_category_names_by_id ... ok test tests::slow_15mb_import_receive_completes_with_progress ... ok test tests::bulk_write_balances_equal_one_by_one ... ok test tests::card_models_ignore_arrival_batch_and_timezone ... ok test result: ok. 133 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 1305.17s Running tests/import_review.rs (/home/kayg/build/targets/bulkrev3/debug/deps/import_review-6a0b9e5006b57cbf) running 32 tests test csv_bom_mixed_endings_and_decimal_comma_are_exact ... ok test csv_amount_edges_never_round_group_or_overflow ... ok test csv_transaction_ids_merge_or_reject_before_totals ... ok test identity_csv_transfer_growth_curve ... ignored, run with MONEY_IDENT_CSV_ROWS for 10k/100k/1M transfer profiling test corrupt_actual_database_is_a_private_error ... ok test recheck_actual_stream_growth_curve ... ignored, run with MONEY_RECHECK_ARCHIVE and MONEY_RECHECK_ROWS for profiling test recheck_conflicting_transaction_ids_are_rejected ... ok test recheck_csv_transfer_growth_curve ... ignored, run with MONEY_RECHECK_TRANSFERS for the bounded CSV growth probe test recheck_e2e_csv_has_four_checks_and_keeps_every_minor_unit ... ok test recheck_identical_transaction_ids_do_not_double_money ... ok test recheck_reconciled_negative_zero_and_exact_source_scales ... ok test split_identity_cannot_reuse_a_top_level_id ... ok test split_identity_concrete_valid_totals ... ok test split_identity_includes_parent_deleted_and_transfer_fields ... ok test csv_pairing_accepts_cancellation_during_its_loop ... ok test split_identity_rejects_an_inconsistent_embedded_parent ... ok test split_identity_review_cases_reject ... ok test transaction_identity_checks_fields_and_keeps_distinct_ids ... ok test transaction_identity_preserves_exact_units ... ok test transfer_legs_prefer_a_same_month_mate ... ok test transfer_month_identity_rejects_in_both_adapters ... ok test split_identity_merges_before_totals ... ok test transfer_month_review_cases_reject ... ok test unmatched_transfer_legs_keep_the_source_register ... ok test ynab_account_check_rejects_a_wrong_normalization ... ok test ynab_csv_preserves_exact_minor_units ... ok test transfer_month_pairing_keeps_dates_and_exact_pair_priority ... ok test ynab_negative_zero_amount_is_zero ... ok test ynab_unrepresentable_milliunits_are_rejected ... ok test ynab_json_keeps_exact_split_and_transfer_postings ... ok test csv_pairing_keeps_exact_account_legs ... ok test raw_ynab_registers_match_a_raw_row_oracle ... ok test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 9.75s Doc-tests calternal_money running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests calternal_plugin_money running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Six existing ignored tests remain unchanged. Four are performance/growth profiles. The other two are child checks executed by their parents. No suite was restarted. `cargo clean`: exit 0. Output, verbatim: ```text Removed 3740 files, 2.0GiB total ``` The temporary standalone probe binary was deleted. No web build output was created. The source doc comments were read again before this report. BLOCK — R3-1 underfunded partial refunds remove money; R3-2 later-month unfunded refunds duplicate money; R3-3 mixed cash/Card refunds lose the cash deficit at rollover; R3-4 transfers into positive Card credit omit budget money; R3-5 spending positive Card credit creates payment reserve.
Author
Owner

bulkfix3 started on job/bulkwrite-1393, head bafe854ce8fcef89d3f498a9e2f2ed2ea763e95a. Step 0 runs the independent R3 Markdown inputs against detached origin/dev at cc1af3c12 in target/tmp/devcheck. No product code has changed. Cargo uses the preset target directory and four build jobs.

bulkfix3 started on `job/bulkwrite-1393`, head `bafe854ce8fcef89d3f498a9e2f2ed2ea763e95a`. Step 0 runs the independent R3 Markdown inputs against detached `origin/dev` at `cc1af3c12` in `target/tmp/devcheck`. No product code has changed. Cargo uses the preset target directory and four build jobs.
Author
Owner

bulkfix3 Step 0 — before product changes

Branch job/bulkwrite-1393, initial head bafe854ce8fcef89d3f498a9e2f2ed2ea763e95a. Tested detached origin/dev at cc1af3c12b68ad26c8403adde1be39c096b9ddea. Copied the independent review_bulkrev3.rs into that checkout and ran cargo test --manifest-path target/tmp/devcheck/Cargo.toml -p calternal-money --test review_bulkrev3 envelope_edge_cases -- --nocapture. All inputs used the public codec, projection and calculator. Values below are synthetic test minor units.

Witness origin/dev evidence Classification
R3-1 March–May allocations 150, real 200; reserve 0 instead of 50 PRE-EXISTING
R3-2 April–May allocations 300, real 200; Food 100 instead of 0 PRE-EXISTING
R3-3 April–May allocations 150, real 100; Ready to Assign 150 instead of 100 PRE-EXISTING
R3-4 March–May allocations 200, real 300; Ready to Assign omits 100 positive Card credit PRE-EXISTING
R3-5 March–May allocations 250, real 200; reserve 50 instead of 0 PRE-EXISTING

All five reproduce on dev and on the reviewed branch. None was introduced by this branch. Full baseline output remains in artifacts/dev-r3.log. All five will be fixed, including the §48 refund and transfer distinctions needed for conservation.

## bulkfix3 Step 0 — before product changes Branch `job/bulkwrite-1393`, initial head `bafe854ce8fcef89d3f498a9e2f2ed2ea763e95a`. Tested detached `origin/dev` at `cc1af3c12b68ad26c8403adde1be39c096b9ddea`. Copied the independent `review_bulkrev3.rs` into that checkout and ran `cargo test --manifest-path target/tmp/devcheck/Cargo.toml -p calternal-money --test review_bulkrev3 envelope_edge_cases -- --nocapture`. All inputs used the public codec, projection and calculator. Values below are synthetic test minor units. | Witness | origin/dev evidence | Classification | | --- | --- | --- | | R3-1 | March–May allocations 150, real 200; reserve 0 instead of 50 | PRE-EXISTING | | R3-2 | April–May allocations 300, real 200; Food 100 instead of 0 | PRE-EXISTING | | R3-3 | April–May allocations 150, real 100; Ready to Assign 150 instead of 100 | PRE-EXISTING | | R3-4 | March–May allocations 200, real 300; Ready to Assign omits 100 positive Card credit | PRE-EXISTING | | R3-5 | March–May allocations 250, real 200; reserve 50 instead of 0 | PRE-EXISTING | All five reproduce on dev and on the reviewed branch. None was introduced by this branch. Full baseline output remains in `artifacts/dev-r3.log`. All five will be fixed, including the §48 refund and transfer distinctions needed for conservation.
Author
Owner

bulkfix3 arithmetic finding

The initial focused R3 run passes all four tests, including all five corrected witnesses, B1 (2 permutations), N2 (24 permutations), and seed 139303 with 256 histories / 1,536 Account models / 768 post-rollover conservation checks. Output: test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.88s.

The defect source is the same in dev: refunds restore their full amount and release reserve even when they only cancel unfunded debt; the mixed cash pool counts every Card inflow as cash funding; positive Card spending moves money into reserve as if it created debt; transfers lack a positive-credit budget correction.

Decisions in §48: current-month unfunded refunds heal virtual deficits first; retired unfunded debt refunds add no Available except funded reserve release and new positive credit; positive Card credit spending uses cash-like money; general zero-crossing transfers add the change in Cash plus positive Cards to Ready to Assign. Payment transfers keep their payment Category move and put the remaining real-money change in Ready to Assign. Conservation is L + U = M during the month and L = M after rollover, with cumulative import Ready to Assign adjustments added to M. Payment Categories are included once in L.

The property is being extended to random dates, both Card transfer directions, Cash refunds and later Assignments. Full touched-crate gates are in progress. No API, dependency or UI changes.

## bulkfix3 arithmetic finding The initial focused R3 run passes all four tests, including all five corrected witnesses, B1 (2 permutations), N2 (24 permutations), and seed 139303 with 256 histories / 1,536 Account models / 768 post-rollover conservation checks. Output: `test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.88s`. The defect source is the same in dev: refunds restore their full amount and release reserve even when they only cancel unfunded debt; the mixed cash pool counts every Card inflow as cash funding; positive Card spending moves money into reserve as if it created debt; transfers lack a positive-credit budget correction. Decisions in §48: current-month unfunded refunds heal virtual deficits first; retired unfunded debt refunds add no Available except funded reserve release and new positive credit; positive Card credit spending uses cash-like money; general zero-crossing transfers add the change in Cash plus positive Cards to Ready to Assign. Payment transfers keep their payment Category move and put the remaining real-money change in Ready to Assign. Conservation is `L + U = M` during the month and `L = M` after rollover, with cumulative import Ready to Assign adjustments added to M. Payment Categories are included once in L. The property is being extended to random dates, both Card transfer directions, Cash refunds and later Assignments. Full touched-crate gates are in progress. No API, dependency or UI changes.
Author
Owner

bulkfix3 existing expectation review

The 11 independently reviewed refund vectors pass unchanged. The R3 policy changes also affect two pre-existing source records and two numeric pins in the 40-row shuffle witness. No input, status code or shuffle assertion changed. No divergence exemption was added.

  • properties.rs, 40-row witness: March Card refunds 9,472 cancel older unfunded debt, yielding no new Category money. March Food = 15,000 + 432 - 1,768 - 2,813 = 10,851. April Food = 10,851 + 6,775 - 9,046 + 2,572 = 11,152 and reserve = 9,046 - 2,572 = 6,474. October cash activity = -22,049, so cash-first Card funding = 11,152 + 15,000 - 22,049 = 4,103. Its refund 7,133 heals current unfunded spending without reserve release. Reserve = 6,474 + 4,103 = 10,577 (old pin 18,571). Raw final debt is 51,911, so uncovered = 41,334 (old pin 33,340). The test comment carries this calculation.
  • Vector 901a5dc38f13b647: February refunds cancel retired unfunded debt (R3-2). No Assignment or positive reserve exists. Fees Available = -15,151; tax = -(2,727 + 182 + 400) = -3,309; retail and reserve = 0. Raw debt 366,524 is fully uncovered. Category Activity remains the full source amounts.
  • Vector e6d77a36b9ded73d: payment 20,000 against Amex debt 9,853 creates positive credit 10,147. Ready to Assign must retain this money: 590,000 + 10,147 = 600,147. Other values remain unchanged. This is the positive-Card-credit transfer rule (R3-4).

These are explicit behavior changes required by the R3 fixes, rather than weakening tests to pass. A new focused test reviewed_r3_vectors_assert_retired_debt_and_positive_credit checks the two source records against the hand calculations. All unrelated labels and stored expectations are retained.

## bulkfix3 existing expectation review The 11 independently reviewed refund vectors pass unchanged. The R3 policy changes also affect two pre-existing source records and two numeric pins in the 40-row shuffle witness. No input, status code or shuffle assertion changed. No divergence exemption was added. - `properties.rs`, 40-row witness: March Card refunds 9,472 cancel older unfunded debt, yielding no new Category money. March Food = 15,000 + 432 - 1,768 - 2,813 = 10,851. April Food = 10,851 + 6,775 - 9,046 + 2,572 = 11,152 and reserve = 9,046 - 2,572 = 6,474. October cash activity = -22,049, so cash-first Card funding = 11,152 + 15,000 - 22,049 = 4,103. Its refund 7,133 heals current unfunded spending without reserve release. Reserve = 6,474 + 4,103 = 10,577 (old pin 18,571). Raw final debt is 51,911, so uncovered = 41,334 (old pin 33,340). The test comment carries this calculation. - Vector `901a5dc38f13b647`: February refunds cancel retired unfunded debt (R3-2). No Assignment or positive reserve exists. Fees Available = -15,151; tax = -(2,727 + 182 + 400) = -3,309; retail and reserve = 0. Raw debt 366,524 is fully uncovered. Category Activity remains the full source amounts. - Vector `e6d77a36b9ded73d`: payment 20,000 against Amex debt 9,853 creates positive credit 10,147. Ready to Assign must retain this money: 590,000 + 10,147 = 600,147. Other values remain unchanged. This is the positive-Card-credit transfer rule (R3-4). These are explicit behavior changes required by the R3 fixes, rather than weakening tests to pass. A new focused test `reviewed_r3_vectors_assert_retired_debt_and_positive_credit` checks the two source records against the hand calculations. All unrelated labels and stored expectations are retained.
Author
Owner

bulkfix3 progress: main conservation fix committed as 9d8bd5fb73914265bf9127f6a7cf537880aab6b2; Tracking rollover guard committed as 1e3e418ba. The guard preserves the prior off-budget deficit reset and has a two-month regression, tracking_deficit_rollover_does_not_reduce_ready_to_assign, which passes. No existing Tracking expectation changed.

Final fetch and merge of origin/dev (cc1af3c12) reported Already up to date. Both requested crates passed Clippy:

    Checking calternal-plugin-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/plugins/money)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 5m 53s

The combined test gate is compiling the plugin test profile. The Money-only full suite, all five R3 assertions, B1/N2, all 625 stored records, the unchanged 11-vector check and the expanded conservation property already passed before the final two-crate gate.

bulkfix3 progress: main conservation fix committed as `9d8bd5fb73914265bf9127f6a7cf537880aab6b2`; Tracking rollover guard committed as `1e3e418ba`. The guard preserves the prior off-budget deficit reset and has a two-month regression, `tracking_deficit_rollover_does_not_reduce_ready_to_assign`, which passes. No existing Tracking expectation changed. Final fetch and merge of origin/dev (cc1af3c12) reported `Already up to date.` Both requested crates passed Clippy: ```text Checking calternal-plugin-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/plugins/money) Finished `dev` profile [unoptimized + debuginfo] target(s) in 5m 53s ``` The combined test gate is compiling the plugin test profile. The Money-only full suite, all five R3 assertions, B1/N2, all 625 stored records, the unchanged 11-vector check and the expanded conservation property already passed before the final two-crate gate.
Author
Owner

Money conservation fixes — bulkfix3, #1393

Fix R3-1 through R3-5 in the shared full-Ledger and streamed-import replay.
All amounts in review evidence are synthetic fixture minor units.

Baseline

Step 0 ran the five independent Markdown inputs against detached origin/dev
cc1af3c12b68ad26c8403adde1be39c096b9ddea before product changes. All five
are PRE-EXISTING. The table was posted on #1393 before editing.

Case dev discrepancy Result
R3-1 Allocations 150 vs real 200 after the partial refund FIXED: retain reserve 50
R3-2 Allocations 300 vs real 200 after the later refund FIXED: Available stays 0
R3-3 April Ready to Assign 150 instead of 100 FIXED: deduct cash deficit 50
R3-4 Allocations 200 vs real 300 after two-Card transfer FIXED: Ready to Assign includes credit 100
R3-5 Allocations 250 vs real 200 after credit spending FIXED: no payment reserve

Built and files

  • crates/calternal-money/src/budget.rs: track current virtual deficits by
    Card and Category. Refunds heal those deficits before releasing reserve.
    Retired unfunded debt refunds do not create Available. Positive Card credit
    is spent directly. On-budget transfers account for zero crossings. Rollover
    deducts only cash deficits and keeps the existing Tracking contract.
  • crates/calternal-money/tests/review_bulkrev3.rs: turn all five witnesses
    into exact correct-result assertions. One seeded general property,
    random_histories_conserve_money_after_every_rollover, checks 256 histories,
    1,536 Account models, 768 post-rollover allocation sums and complete-model
    shuffle independence. Random histories include underfunding, overspending,
    later refunds, positive credit, both Card transfer directions, splits, Cash
    refunds, later Assignments and payments to both Cards.
  • crates/calternal-money/tests/properties.rs: keep the 40-row shuffle
    witness and update only its two R3-dependent amount pins, with a hand
    calculation in its doc comment.
  • crates/calternal-money/tests/vectors.rs and
    contracts/vectors/money/money.v1.json: correct two other records affected
    by the explicit R3 rules and assert their hand-computed results. All 11
    previously reviewed refund vectors remain unchanged.
  • crates/calternal-money/tests/account_kinds.rs: guard the existing Tracking
    deficit rollover rule with a two-month replay.
  • docs/DESIGN.md §48: state the exact refund, positive-credit, transfer and
    conservation rules.

Decisions

§48 was incomplete for the R3 cases. Current-month unfunded refunds heal
virtual deficits without releasing funded money. Canceling retired unfunded
debt adds no Available, except for funded reserve released or new positive
credit. Positive Card credit spending uses real budget money. General
on-budget transfers leave Categories unchanged and put their real-money
change in Ready to Assign. Payment transfers keep their payment Category
move and put the remaining real-money change in Ready to Assign.

For these Cash-income and on-budget expense/refund/payment/transfer histories,
let L be Ready to Assign plus all signed Category Available, including payment
Categories once. Let M be Cash balances plus positive Card balances. Let U be
remaining current-month unfunded Card spending. Before rollover, L + U = M.
After rollover, L = M. Add cumulative import reconciliation adjustments to M
when present. Tracking import rules remain unchanged.

Expected replay cost is the existing O(T log T) canonical sort plus bounded
passes over rows, Categories and touched Card/Category pairs. The new deficit
state uses O(K) memory for K touched pairs and resets each month. A transfer
reads only its two Accounts. No new per-request Home scan, IO, dependency,
route, background job or UI operation was added. No benchmark or UI evidence
is required by the current verification policy for this correctness slice.

Expectation changes

No input, status code, blanket divergence exemption or shuffle assertion
changed. Two amount pins and two stored records changed because this issue
explicitly changes their refund or positive-credit behavior:

  • The 40-row reserve is 10,577, not 18,571; uncovered debt is 41,334, not 33,340.
    March carry is 10,851; April carry is 11,152 with reserve 6,474; October
    cash-first funding is 4,103. Its refund heals virtual credit spending.
    Reserve = 6,474 + 4,103; uncovered = raw debt 51,911 minus that reserve.
  • 901a5dc38f13b647: later reversals cancel retired unfunded debt. February
    reserve and retail Available stay zero; Fees are -15,151 and Tax is -3,309.
    Raw debt 366,524 is fully uncovered.
  • e6d77a36b9ded73d: payment 20,000 against debt 9,853 creates credit 10,147.
    Ready to Assign = 590,000 + 10,147 = 600,147. Other fields stay unchanged.

The calculations are stated in tests and in the issue comment.

Known gaps and merge round

No requested R3 gap remains. Existing ignored performance/child tests stay
ignored; their counts are quoted in the gate output. No API or web code changed.
The full real-server adversarial matrix, release/staging checks and the
original throughput work stay with the merge round under the current verification policy.
Use the merged server and matching web build. For the merge round:
bun tests/adversarial/money_api.mjs must confirm the
real API still enforces authorization, exact amounts and durable batch
isolation with the corrected replay. tests/adversarial/run.sh covers the
full cross-User and protocol matrix. This job runs the focused regressions
and the finite seeded conservation campaign instead. No push, deploy or
promotion was made. The origin/dev merge reported Already up to date.

Verification

Cargo used CARGO_PROFILE_DEV_DEBUG=line-tables-only, CARGO_INCREMENTAL=0,
CARGO_BUILD_JOBS=4 and TMPDIR=/target/tmp. The preset CARGO_TARGET_DIR
was not changed. No dependency version changed. Build output is cleaned at
job end. Module and function comments were read before the final report.

The main fix is 9d8bd5fb73914265bf9127f6a7cf537880aab6b2. The Tracking
regression is 1e3e418ba19494f67ce7882d3df8f545491a60ed. The final report
commit also clarifies doc comments for positive Card credit spending; it
changes no Rust test or implementation body.

The final combined gates passed. B1, N2, all 625 stored cases, the unchanged
11-vector check, raw Account checks and both core and real-TCP API shuffle
checks pass. The API property covers serial, shuffled, eight-client and burst
writes in three client zones. Six existing ignored tests remain ignored.

cargo fmt --check: exit 0; no output.

cargo clippy -p calternal-money -p calternal-plugin-money --all-targets -- -D warnings:
exit 0. Complete output, verbatim:

   Compiling proc-macro2 v1.0.107
   Compiling quote v1.0.47
   Compiling libc v0.2.189
   Compiling serde_core v1.0.229
    Checking memchr v2.8.3
   Compiling serde v1.0.229
   Compiling jobserver v0.1.35
    Checking once_cell v1.21.4
   Compiling find-msvc-tools v0.1.13
   Compiling shlex v2.0.1
   Compiling pkg-config v0.3.34
    Checking pin-project-lite v0.2.17
   Compiling cc v1.4.7
   Compiling version_check v0.9.5
    Checking log v0.4.34
   Compiling serde_json v1.0.151
   Compiling num-traits v0.2.19
    Checking futures-core v0.3.34
   Compiling getrandom v0.4.3
    Checking bytes v1.12.1
   Compiling syn v3.0.6
   Compiling syn v2.0.119
   Compiling icu_normalizer_data v2.3.0
   Compiling icu_properties_data v2.3.0
    Checking rand_core v0.10.1
   Compiling generic-array v0.14.9
    Checking typenum v1.20.1
   Compiling synstructure v0.14.0
   Compiling zerovec-derive v0.11.6
   Compiling serde_derive v1.0.229
   Compiling displaydoc v0.2.7
   Compiling tracing-attributes v0.1.31
   Compiling zerofrom-derive v0.1.8
   Compiling yoke-derive v0.8.4
   Compiling stable_deref_trait v1.2.1
   Compiling zerofrom v0.1.8
    Checking mio v1.2.3
    Checking errno v0.3.14
   Compiling yoke v0.8.3
    Checking equivalent v1.0.2
    Checking futures-sink v0.3.34
    Checking signal-hook-registry v1.4.8
   Compiling tokio-macros v2.7.2
    Checking socket2 v0.6.5
    Checking smallvec v1.16.1
    Checking zerovec v0.11.8
    Checking tokio v1.53.1
    Checking hashbrown v0.17.1
    Checking tracing-core v0.1.36
    Checking slab v0.4.12
    Checking indexmap v2.14.2
   Compiling parking_lot_core v0.9.12
    Checking iana-time-zone v0.1.65
    Checking tracing v0.1.44
   Compiling tinystr v0.8.4
    Checking chrono v0.4.45
   Compiling futures-macro v0.3.34
    Checking percent-encoding v2.3.2
   Compiling writeable v0.6.4
    Checking litemap v0.8.3
    Checking futures-io v0.3.34
    Checking futures-task v0.3.34
   Compiling crossbeam-utils v0.8.23
   Compiling potential_utf v0.1.6
   Compiling icu_locale_core v2.3.0
    Checking futures-util v0.3.34
    Checking zerotrie v0.2.5
   Compiling cmake v0.1.58
   Compiling fs_extra v1.3.0
   Compiling vcpkg v0.2.15
    Checking utf8_iter v1.0.4
    Checking scopeguard v1.2.0
   Compiling dunce v1.0.5
    Checking icu_collections v2.3.0
   Compiling icu_provider v2.3.1
   Compiling aws-lc-sys v0.45.0
   Compiling thiserror-impl v2.0.21
    Checking http v1.5.0
    Checking lock_api v0.4.14
    Checking hybrid-array v0.4.15
    Checking aho-corasick v1.1.5
    Checking base64 v0.22.1
   Compiling cfg-if v1.0.5
    Checking regex-automata v0.4.18
   Compiling icu_properties v2.3.0
   Compiling icu_normalizer v2.3.0
    Checking form_urlencoded v1.2.2
    Checking zeroize v1.9.0
   Compiling aws-lc-rs v1.18.1
   Compiling rustversion v1.0.23
    Checking tempfile v3.27.0
    Checking idna_adapter v1.2.2
    Checking regex v1.13.1
   Compiling crypto-common v0.1.6
   Compiling block-buffer v0.10.4
    Checking http-body v1.1.0
    Checking futures-channel v0.3.34
   Compiling foldhash v0.2.0
    Checking simd-adler32 v0.3.10
   Compiling allocator-api2 v0.2.21
   Compiling httparse v1.10.1
    Checking siphasher v1.0.3
   Compiling thiserror v2.0.21
   Compiling hashbrown v0.16.1
    Checking rusty-fork v0.3.1
   Compiling digest v0.10.7
   Compiling parking_lot v0.12.5
   Compiling idna v1.1.0
    Checking rustls-pki-types v1.15.1
    Checking crypto-common v0.2.2
   Compiling libsqlite3-sys v0.37.0
   Compiling zmij v1.0.23
   Compiling itoa v1.0.18
    Checking cpufeatures v0.3.1
   Compiling crc32fast v1.5.2
   Compiling parking v2.2.1
    Checking tower-service v0.3.3
   Compiling crc-catalog v2.5.0
   Compiling cpufeatures v0.2.17
   Compiling event-listener v5.4.2
   Compiling crc v3.4.0
   Compiling sha2 v0.10.9
   Compiling crossbeam-queue v0.3.14
    Checking proptest v1.11.0
   Compiling either v1.18.0
   Compiling tokio-stream v0.1.19
    Checking url v2.5.8
   Compiling futures-intrusive v0.5.0
   Compiling hashlink v0.11.1
    Checking calternal-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-money)
   Compiling spin v0.9.9
    Checking tokio-util v0.7.19
    Checking untrusted v0.9.0
   Compiling rustls v0.23.45
    Checking adler2 v2.0.1
    Checking try-lock v0.2.5
    Checking atomic-waker v1.1.2
   Compiling rand_core v0.6.4
   Compiling sqlx-core v0.9.0
   Compiling phf_shared v0.11.3
   Compiling rand v0.8.8
    Checking h2 v0.4.19
    Checking want v0.3.1
    Checking rustls-webpki v0.103.15
   Compiling flume v0.12.0
   Compiling atoi v2.0.0
   Compiling futures-executor v0.3.34
    Checking inout v0.2.2
    Checking sync_wrapper v1.0.2
   Compiling blake3 v1.8.7
    Checking httpdate v1.0.3
    Checking cmov v0.5.4
    Checking subtle v2.6.1
    Checking tower-layer v0.3.3
    Checking ipnet v2.12.2
    Checking ryu v1.0.23
    Checking ctutils v0.4.2
    Checking hyper v1.11.1
   Compiling sqlx-sqlite v0.9.0
   Compiling phf_generator v0.11.3
    Checking miniz_oxide v0.9.1
   Compiling multiversion-macros v0.9.0
   Compiling encoding_rs v0.8.41
    Checking phf_shared v0.12.1
    Checking block-buffer v0.12.1
   Compiling hex v0.4.3
   Compiling inotify-sys v0.1.8
    Checking constant_time_eq v0.4.2
    Checking arrayvec v0.7.8
   Compiling chrono-tz v0.10.4
   Compiling dotenvy v0.15.7
   Compiling heck v0.5.0
    Checking zlib-rs v0.6.8
   Compiling sqlx-macros-core v0.9.0
    Checking flate2 v1.1.10
    Checking cipher v0.5.2
    Checking phf v0.12.1
    Checking multiversion v0.9.0
   Compiling phf_macros v0.11.3
    Checking hyper-util v0.1.20
    Checking universal-hash v0.6.1
    Checking tower v0.5.3
    Checking http-body-util v0.1.5
   Compiling multer v3.1.0
    Checking openssl-probe v0.2.1
    Checking mime v0.3.17
    Checking core_detect v1.0.0
   Compiling linkme-impl v0.3.37
    Checking simdutf8 v0.1.5
   Compiling multiversion_no_op v1.0.0
   Compiling unicode-joining-type v1.0.0
    Checking rustls-native-certs v0.8.4
    Checking phf v0.11.3
    Checking poly1305 v0.9.1
    Checking chacha20 v0.10.2
   Compiling sqlx-macros v0.9.0
    Checking tokio-rustls v0.26.6
    Checking aead v0.6.1
    Checking miniz_oxide v0.8.9
    Checking fdeflate v0.3.7
   Compiling utoipa-gen v6.0.1
    Checking color_quant v1.1.0
    Checking quick-error v2.0.1
    Checking zune-core v0.5.3
    Checking calternal-path v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-path)
   Compiling linkme v0.3.37
    Checking weezl v0.1.12
    Checking winnow v0.7.15
    Checking byteorder-lite v0.1.0
   Compiling pulldown-cmark v0.13.4
    Checking same-file v1.0.6
    Checking pxfm v0.1.30
    Checking cron v0.17.0
    Checking image-webp v0.2.4
    Checking walkdir v2.5.0
    Checking gif v0.14.2
    Checking utoipa v6.0.0
    Checking moxcms v0.8.1
    Checking zune-jpeg v0.5.15
    Checking png v0.18.1
    Checking chacha20poly1305 v0.11.0
    Checking hyper-rustls v0.27.10
    Checking inotify v0.11.5
    Checking sqlx v0.9.0
    Checking rustls-platform-verifier v0.7.0
    Checking axum-core v0.5.6
    Checking tower-http v0.6.11
    Checking serde_urlencoded v0.7.1
    Checking uuid v1.26.1
    Checking notify-types v2.1.0
    Checking serde_path_to_error v0.1.20
    Checking unicode-casefold v0.2.0
    Checking unsafe-libyaml v0.2.11
    Checking bumpalo v3.20.3
    Checking unicase v2.9.0
    Checking bytemuck v1.25.2
    Checking base64 v0.23.1
    Checking unicode-properties v0.1.4
    Checking matchit v0.8.4
    Checking image v0.25.10
    Checking reqwest v0.13.5
    Checking calternal-fs v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-fs)
    Checking axum v0.8.9
    Checking zopfli v0.8.3
    Checking serde_yaml v0.9.34+deprecated
    Checking notify v8.2.0
    Checking calternal-db v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-db)
    Checking calternal-api v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-api)
    Checking quick-xml v0.42.0
    Checking csv-core v0.1.13
    Checking zip v5.1.1
    Checking calternal-plugin v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-plugin)
    Checking calternal-notes-core v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-notes-core)
    Checking csv v1.4.0
    Checking calternal-plugin-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/plugins/money)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 5m 53s

cargo test -p calternal-money -p calternal-plugin-money -- --test-threads=4:
exit 0. Complete output, verbatim:

    Blocking waiting for file lock on build directory
   Compiling memchr v2.8.3
   Compiling once_cell v1.21.4
   Compiling futures-core v0.3.34
   Compiling serde_core v1.0.229
   Compiling pin-project-lite v0.2.17
   Compiling jobserver v0.1.35
   Compiling log v0.4.34
   Compiling bytes v1.12.1
   Compiling zerofrom v0.1.8
   Compiling stable_deref_trait v1.2.1
   Compiling cc v1.4.7
   Compiling serde v1.0.229
   Compiling socket2 v0.6.5
   Compiling yoke v0.8.3
   Compiling equivalent v1.0.2
   Compiling num-traits v0.2.19
   Compiling rand_core v0.10.1
   Compiling zerovec v0.11.8
   Compiling writeable v0.6.4
   Compiling getrandom v0.4.3
   Compiling litemap v0.8.3
   Compiling hashbrown v0.17.1
   Compiling tinystr v0.8.4
   Compiling potential_utf v0.1.6
   Compiling zerotrie v0.2.5
   Compiling utf8_iter v1.0.4
   Compiling icu_locale_core v2.3.0
   Compiling tracing-core v0.1.36
   Compiling scopeguard v1.2.0
   Compiling icu_collections v2.3.0
   Compiling icu_provider v2.3.1
   Compiling typenum v1.20.1
   Compiling futures-task v0.3.34
   Compiling futures-io v0.3.34
   Compiling tracing v0.1.44
   Compiling icu_normalizer_data v2.3.0
   Compiling serde_json v1.0.151
   Compiling mio v1.2.3
   Compiling errno v0.3.14
   Compiling futures-sink v0.3.34
   Compiling percent-encoding v2.3.2
   Compiling icu_properties_data v2.3.0
   Compiling signal-hook-registry v1.4.8
   Compiling lock_api v0.4.14
   Compiling smallvec v1.16.1
   Compiling icu_properties v2.3.0
   Compiling tokio v1.53.1
   Compiling iana-time-zone v0.1.65
   Compiling indexmap v2.14.2
   Compiling slab v0.4.12
   Compiling chrono v0.4.45
   Compiling form_urlencoded v1.2.2
   Compiling cmake v0.1.58
   Compiling futures-util v0.3.34
   Compiling http v1.5.0
   Compiling aho-corasick v1.1.5
   Compiling aws-lc-sys v0.45.0
   Compiling siphasher v1.0.3
   Compiling generic-array v0.14.9
   Compiling spin v0.9.9
   Compiling hybrid-array v0.4.15
   Compiling regex-automata v0.4.18
   Compiling allocator-api2 v0.2.21
   Compiling base64 v0.22.1
   Compiling cpufeatures v0.2.17
   Compiling foldhash v0.2.0
   Compiling tempfile v3.27.0
   Compiling regex v1.13.1
   Compiling hashbrown v0.16.1
   Compiling crossbeam-utils v0.8.23
   Compiling icu_normalizer v2.3.0
   Compiling parking v2.2.1
   Compiling zeroize v1.9.0
   Compiling crc-catalog v2.5.0
   Compiling rusty-fork v0.3.1
   Compiling idna_adapter v1.2.2
   Compiling crc v3.4.0
   Compiling event-listener v5.4.2
   Compiling crossbeam-queue v0.3.14
   Compiling hashlink v0.11.1
   Compiling block-buffer v0.10.4
   Compiling crypto-common v0.1.6
   Compiling http-body v1.1.0
   Compiling parking_lot_core v0.9.12
   Compiling futures-channel v0.3.34
   Compiling simd-adler32 v0.3.10
   Compiling aws-lc-rs v1.18.1
   Compiling proptest v1.11.0
   Compiling parking_lot v0.12.5
   Compiling digest v0.10.7
   Compiling idna v1.1.0
   Compiling rustls-pki-types v1.15.1
   Compiling calternal-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-money)
   Compiling crypto-common v0.2.2
   Compiling libsqlite3-sys v0.37.0
   Compiling cpufeatures v0.3.1
   Compiling tower-service v0.3.3
   Compiling either v1.18.0
   Compiling url v2.5.8
   Compiling sha2 v0.10.9
   Compiling futures-intrusive v0.5.0
   Compiling tokio-stream v0.1.19
   Compiling httparse v1.10.1
   Compiling tokio-util v0.7.19
   Compiling atomic-waker v1.1.2
   Compiling untrusted v0.9.0
   Compiling adler2 v2.0.1
   Compiling try-lock v0.2.5
   Compiling sqlx-core v0.9.0
   Compiling rustls-webpki v0.103.15
   Compiling h2 v0.4.19
   Compiling want v0.3.1
   Compiling rustls v0.23.45
   Compiling atoi v2.0.0
   Compiling crc32fast v1.5.2
   Compiling thiserror v2.0.21
   Compiling futures-executor v0.3.34
   Compiling flume v0.12.0
   Compiling inout v0.2.2
   Compiling phf_shared v0.11.3
   Compiling blake3 v1.8.7
   Compiling sync_wrapper v1.0.2
   Compiling httpdate v1.0.3
   Compiling ipnet v2.12.2
   Compiling tower-layer v0.3.3
   Compiling cmov v0.5.4
   Compiling subtle v2.6.1
   Compiling ryu v1.0.23
   Compiling hyper v1.11.1
   Compiling ctutils v0.4.2
   Compiling phf_generator v0.11.3
   Compiling sqlx-sqlite v0.9.0
   Compiling miniz_oxide v0.9.1
   Compiling block-buffer v0.12.1
   Compiling phf_shared v0.12.1
   Compiling constant_time_eq v0.4.2
   Compiling arrayvec v0.7.8
   Compiling zlib-rs v0.6.8
   Compiling sqlx-macros-core v0.9.0
   Compiling flate2 v1.1.10
   Compiling phf v0.12.1
   Compiling cipher v0.5.2
   Compiling multiversion v0.9.0
   Compiling phf_macros v0.11.3
   Compiling hyper-util v0.1.20
   Compiling universal-hash v0.6.1
   Compiling tower v0.5.3
   Compiling http-body-util v0.1.5
   Compiling core_detect v1.0.0
   Compiling openssl-probe v0.2.1
   Compiling mime v0.3.17
   Compiling simdutf8 v0.1.5
   Compiling rustls-native-certs v0.8.4
   Compiling phf v0.11.3
   Compiling encoding_rs v0.8.41
   Compiling poly1305 v0.9.1
   Compiling chacha20 v0.10.2
   Compiling chrono-tz v0.10.4
   Compiling inotify-sys v0.1.8
   Compiling sqlx-macros v0.9.0
   Compiling tokio-rustls v0.26.6
   Compiling aead v0.6.1
   Compiling miniz_oxide v0.8.9
   Compiling fdeflate v0.3.7
   Compiling zune-core v0.5.3
   Compiling weezl v0.1.12
   Compiling calternal-path v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-path)
   Compiling color_quant v1.1.0
   Compiling pxfm v0.1.30
   Compiling winnow v0.7.15
   Compiling quick-error v2.0.1
   Compiling same-file v1.0.6
   Compiling byteorder-lite v0.1.0
   Compiling cron v0.17.0
   Compiling moxcms v0.8.1
   Compiling walkdir v2.5.0
   Compiling image-webp v0.2.4
   Compiling gif v0.14.2
   Compiling zune-jpeg v0.5.15
   Compiling png v0.18.1
   Compiling utoipa v6.0.0
   Compiling chacha20poly1305 v0.11.0
   Compiling hyper-rustls v0.27.10
   Compiling inotify v0.11.5
   Compiling sqlx v0.9.0
   Compiling multer v3.1.0
   Compiling rustls-platform-verifier v0.7.0
   Compiling axum-core v0.5.6
   Compiling unicode-joining-type v1.0.0
   Compiling tower-http v0.6.11
   Compiling serde_urlencoded v0.7.1
   Compiling uuid v1.26.1
   Compiling notify-types v2.1.0
   Compiling serde_path_to_error v0.1.20
   Compiling unicode-properties v0.1.4
   Compiling base64 v0.23.1
   Compiling matchit v0.8.4
   Compiling bumpalo v3.20.3
   Compiling unicode-casefold v0.2.0
   Compiling bytemuck v1.25.2
   Compiling unsafe-libyaml v0.2.11
   Compiling unicase v2.9.0
   Compiling calternal-fs v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-fs)
   Compiling image v0.25.10
   Compiling pulldown-cmark v0.13.4
   Compiling serde_yaml v0.9.34+deprecated
   Compiling zopfli v0.8.3
   Compiling axum v0.8.9
   Compiling reqwest v0.13.5
   Compiling notify v8.2.0
   Compiling calternal-db v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-db)
   Compiling linkme v0.3.37
   Compiling calternal-api v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-api)
   Compiling quick-xml v0.42.0
   Compiling csv-core v0.1.13
   Compiling zip v5.1.1
   Compiling calternal-notes-core v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-notes-core)
   Compiling calternal-plugin v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-plugin)
   Compiling csv v1.4.0
   Compiling calternal-plugin-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/plugins/money)
    Finished `test` profile [unoptimized + debuginfo] target(s) in 6m 20s
     Running unittests src/lib.rs (/home/kayg/build/targets/bulkfix3/debug/deps/calternal_money-5ad27f9b5c008064)

running 16 tests
test codec::tests::empty_payee_is_refused_by_the_writer ... ok
test codec::tests::property_edit_changes_one_value ... ok
test codec::tests::round_trip_keeps_bom_crlf_and_unknown_bytes ... ok
test codec::tests::malformed_dated_rows_fail_instead_of_vanishing ... ok
test codec::tests::transaction_round_trip_with_punctuation_in_labels_and_payee ... ok
test edit::tests::cleared_tag_toggles_without_touching_other_tags ... ok
test edit::tests::crlf_file_keeps_crlf_on_insert ... ok
test edit::tests::unicode_payee_tag_boundaries_match_shared_vectors ... ok
test codec::tests::checked_parse_stops_after_a_bounded_line_batch ... ok
test units::tests::exact_range_is_enforced_on_parse_and_arithmetic ... ok
test units::tests::format_uses_explicit_sign_and_exact_scale ... ok
test units::tests::parse_matches_the_oracle_examples ... ok
test units::tests::scale_table_has_all_165_codes_with_unique_entries ... ok
test units::independent_number_review::signed_edges_and_long_zero_padding_keep_exact_minor_units ... ok
test edit::tests::new_budget_projects_with_no_accounts ... ok
test edit::tests::assign_inserts_updates_and_removes_rows ... ok

test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s

     Running tests/account_kinds.rs (/home/kayg/build/targets/bulkfix3/debug/deps/account_kinds-40f136ace82559dd)

running 5 tests
test account_projection_rejects_legacy_and_unknown_kinds ... ok
test imported_account_kinds_project_without_losing_identity ... ok
test off_budget_balance_marker_does_not_change_budget_money ... ok
test tracking_deficit_rollover_does_not_reduce_ready_to_assign ... ok
test categorized_debit_loan_transfers_post_one_budget_leg ... ok

test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s

     Running tests/import.rs (/home/kayg/build/targets/bulkfix3/debug/deps/import-32258f8fda96f336)

running 13 tests
test duplicate_source_ids_are_rejected_and_duplicate_names_are_kept ... ok
test import_render_is_exact_and_byte_stable ... ok
test import_keeps_same_day_source_order_for_credit_payments_and_refunds ... ok
test import_render_reports_progress_and_propagates_cancel ... ok
test import_stream_renderer_matches_full_rendered_files ... ok
test import_replay_matches_full_ledger_month_by_month ... ok
test production_v1_metadata_upgrade_keeps_balances ... ok
test recheck_half_minor_units_negative_zero_and_nineteen_digits ... ok
test budget_replay_stops_at_a_bounded_transaction_checkpoint ... ok
test imported_ready_to_assign_matches_independent_month_oracle ... ok
test recheck_same_day_payment_and_refund_keep_source_fifo ... ok
test random_imports_conserve_source_balances_and_markdown ... ok
test recheck_random_multicurrency_ledgers_match_all_monthly_totals ... ok

test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 9.99s

     Running tests/properties.rs (/home/kayg/build/targets/bulkfix3/debug/deps/properties-9ff9e71a800dacb8)

running 21 tests
test bill_coverage_never_clamps_the_bill ... ok
test bulkrev2::boundary_shuffle_reports_acceptance_difference ... ok
test bulkrev2::i64_extremes_are_rejected_and_safe_bound_is_exact ... ok
test bulkrev2::literal_account_sum_and_funded_card_conservation ... ok
test bulkrev2::refund_payment_calendar_choice_is_visible_next_month ... ok
test any_text_that_parses_serializes_to_the_same_bytes ... ok
test bulkrev2::split_refund_keeps_payment_overfunding_when_card_becomes_positive ... ok
test assign_then_unassign_is_the_identity ... ok
test decimal_text_round_trips_for_every_scale ... ok
test fully_funded_card_spending_conserves_cash ... ok
test cash_ledgers_conserve_money_every_month ... ok
test money_code_never_uses_floating_point ... ok
test paired_write_replay_matches_independent_calculations ... ok
test mixed_cash_credit_deficit_rolls_only_its_cash_part ... ok
test reviewed_burst_order_matches_input_order ... ok
test partial_payment_then_category_refunds_conserve_cash_across_months ... ok
test split_legs_post_exactly_the_parent ... ok
test transaction_rows_round_trip_byte_for_byte ... ok
test same_date_card_postings_are_a_function_of_the_set ... ok
test bulkrev2::funded_shuffles_conserve_real_money_every_month ... ok
test bulkrev2::same_day_shuffles_cover_splits_transfers_and_month_edges ... ok

test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.93s

     Running tests/ready_to_assign_adjustment.rs (/home/kayg/build/targets/bulkfix3/debug/deps/ready_to_assign_adjustment-0e1c5c7276d14077)

running 1 test
test ready_to_assign_adjustment_changes_only_the_budget_pool ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s

     Running tests/review_984.rs (/home/kayg/build/targets/bulkfix3/debug/deps/review_984-dc85183370c2f07a)

running 5 tests
test review_pair_performance_profile ... ignored, performance measurements belong to the merge round on the perf VM
test review_pair_rejects_bad_months_and_amounts_without_rounding ... ok
test review_split_remainders_and_tracking_transfers_are_exact ... ok
test review_mixed_pair_matches_independent_replays ... ok
test review_large_ledger_pair_keeps_exact_totals ... ok

test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 3.30s

     Running tests/review_bulkrev3.rs (/home/kayg/build/targets/bulkfix3/debug/deps/review_bulkrev3-cbfa6724c48c7f18)

running 4 tests
test hidden_and_missing_categories ... ok
test envelope_edge_cases ... ok
test previous_witnesses_all_orders ... ok
test random_histories_conserve_money_after_every_rollover ... ok

test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.68s

     Running tests/vectors.rs (/home/kayg/build/targets/bulkfix3/debug/deps/vectors-b0e2a54af0711cc9)

running 4 tests
test rust_matches_random_oracle_ledgers_without_divergences ... ok
test reviewed_eleven_refund_vectors_keep_their_exact_numbers ... ok
test reviewed_r3_vectors_assert_retired_debt_and_positive_credit ... ok
test rust_port_matches_every_recorded_oracle_vector ... ok

test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.42s

     Running unittests src/lib.rs (/home/kayg/build/targets/bulkfix3/debug/deps/calternal_plugin_money-3d165b6d3890a332)

running 135 tests
test import::import_review_tests::actual_cents_conversion_never_rounds ... ok
test import::import_review_tests::actual_cc_label_requires_missing_type_confirmation ... ok
test import::import_review_tests::actual_orphan_split_children_are_rejected ... ok
test import::import_review_tests::actual_stream_memory_guard_child ... ignored, invoked as an isolated child by actual_stream_keeps_a_large_history_bounded
test import::import_review_tests::import_control_reports_progress_and_stops_cancelled_work ... ok
test import::import_review_tests::actual_account_checks_use_raw_monthly_source_rows ... ok
test import::import_review_tests::actual_transfer_legs_cannot_cross_months ... ok

running 1 test
test import::import_review_tests::ynab_transfer_pairing_handles_many_duplicate_legs ... ok
test import_fidelity_1130::independent_split_and_transfer_numbers_check ... ok
test routes::durable::admission_tests::cancelled_receiver_cannot_acknowledge_a_durable_job ... ok
test routes::durable::checkpoint_tests::progress_wait_keeps_parser_writer_release_polled ... ok
test import_fidelity_1130::actual_rows_round_trip ... ok
test routes::import_cleanup_tests::dropped_preview_worker_retains_admission_until_exit ... ok
test routes::import_cleanup_tests::idle_imports_are_reclaimed_by_expiry_cleanup ... ok
test routes::import_cleanup_tests::staged_import_files_keep_ranges_and_release_private_storage ... ok
test routes::import_staged_path_tests::staged_import_name_cannot_select_another_path_or_slot ... ok
test routes::durable::admission_tests::live_publication_honors_operational_queue_cancellation ... ok
test routes::replay_reuse_tests::assignment_retry_rebuilds_from_latest_source_bytes ... ok
test routes::replay_reuse_tests::crossings_reuse_checked_current_totals_even_with_future_months ... ok
test routes::replay_reuse_tests::crossings_cover_source_ranges_relative_to_today ... ok
test routes::review_1140::cancel_wins_before_publication_lock ... ok
test routes::review_1140::cancel_does_not_rewrite_published_result ... ok
test routes::durable::money_import_undo_mutation ... ok
test routes::review_1140::review1140_cancel_after_rename_before_receipt_keeps_publication ... ok
test routes::review_1140::review1140_all_formats_replay_exact_balances ... ok
test routes::review_1140::review1140_operational_cancel_before_replacement_returns_no_receipt ... ok
test routes::review_1140::review1140_discard_after_confirmation_failure_releases_admission ... ok
test routes::review_1140::review1140_tcp_malformed_inputs_leave_worker_usable ... ok
test routes::review_1140::review1140_staged_size_limits_fail_without_publishing ... ok
test store::parsed_cache_tests::global_budget_and_folder_pruning_release_stale_entries ... ok
test store::parsed_cache_tests::parse_charge_accounts_for_line_structures ... ok
test store::parsed_cache_tests::user_cache_evicts_old_parse_entries_and_shares_hot_documents ... ok
test routes::review_1140::review1140_terminal_receipts_do_not_block_new_imports ... ok
test tests::a_broken_file_is_reported_not_hidden ... ok
test tests::a_new_user_sees_the_real_empty_state ... ok
test tests::a_journal_for_a_completed_move_changes_nothing ... ok
test routes::review_1140::review1140_replacement_receipt_recovery_does_not_adopt_later_edits ... ok
test tests::active_money_handle_survives_other_users_cache_pressure ... ok
test tests::actual_duplicate_names_import_by_id_without_sharing_a_payment_category ... ok
test tests::actual_export_archive_imports_exact_rows_from_private_scratch ... ok
test tests::a_read_waits_for_a_write_in_progress ... ok
test tests::api_account_numbers_equal_core_replay ... ok
test tests::a_split_row_written_by_hand_is_read_but_not_edited ... ok
test tests::assignments_retry_source_conflicts_without_losing_neighbours ... ok
test tests::backdated_create_emits_current_month_overspend_crossing ... ok
test tests::budget_flow_writes_exact_markdown_and_derives_available ... ok
test tests::bulk_write_invalid_neighbours_do_not_change_valid_rows ... ok
test tests::bulk_write_month_does_not_need_note_date_backfill ... ok
test tests::cancel_racing_confirm_has_one_consistent_outcome ... ok
test tests::cancelling_imports_leaves_no_budget_and_releases_slots ... ok
test tests::bulk_write_rejects_intermediate_overflow ... ok
test tests::concurrent_store_edits_keep_exactly_one_winner ... ok
test tests::csv_import_keeps_progress_and_cancel_responsive ... ok
test tests::delete_transaction_emits_current_month_overspend_crossing ... ok
test tests::denied_preview_access_keeps_the_owners_pending_import ... ok
test import::import_review_tests::actual_stream_memory_guard_child ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 134 filtered out; finished in 42.41s

test import::import_review_tests::actual_stream_keeps_a_large_history_bounded ... ok
test tests::durable_import_tests::operation_exit_child ... ignored, child of operation_recovery_survives_process_exit_at_every_phase
test tests::durable_import_tests::generated_import_confirm_replay_and_undo_preserve_minor_units ... ok
test tests::durable_import_tests::operation_recovery_survives_process_exit_at_every_phase ... ok
test tests::bulk_write_balances_equal_one_by_one has been running for over 60 seconds
test tests::durable_import_tests::publication_and_inverse_authority_use_full_commits ... ok
test tests::durable_import_tests::receipt_reads_are_bounded_and_old_receipts_are_addressable ... ok
test tests::card_models_ignore_arrival_batch_and_timezone has been running for over 60 seconds
test tests::durable_import_tests::queued_import_and_undo_survive_restarts ... ok
test tests::durable_import_tests::replay_preserves_a_live_ready_preview ... ok
test tests::durable_import_tests::running_jobs_do_not_expire_and_cancelled_jobs_do_not_restart ... ok
test tests::durable_import_tests::undo_receipt_replay_never_removes_a_restored_import ... ok
test tests::durable_import_tests::undo_refuses_a_predecessor_restored_before_the_inverse ... ok
test tests::durable_import_tests::undo_refuses_every_later_budget_edit_after_restart ... ok
test tests::durable_import_tests::undo_restarts_before_and_after_the_filesystem_inverse ... ok
test tests::failed_cross_month_move_never_counts_the_row_twice ... ok
test tests::far_month_assignment_cannot_make_the_budget_unreadable ... ok
test tests::gap_month_assignments_and_opening_card_debt_do_not_create_cash ... ok
test tests::historical_overspend_does_not_emit_current_month_event ... ok
test tests::hostile_inputs_are_rejected_without_writing ... ok
test tests::durable_import_tests::replacement_restarts_at_every_durable_phase ... ok
test tests::import_fidelity_review_requires_account_kind_and_keeps_notes ... ok
test tests::import_file_limits_match_the_money_reader ... ok
test tests::idle_import_receive_releases_admission_and_cancel_stops_read ... ok
test tests::import_preview_is_owner_bound_and_confirmation_publishes_once ... ok
test tests::import_preview_reads_only_generated_staged_upload_names ... ok
test tests::memo_and_tags_split_the_payee_without_losing_text ... ok
test tests::money_is_on_for_the_instance_and_off_for_a_new_user ... ok
test tests::inferred_opening_balance_needs_explicit_confirmation ... ok
test tests::month_revision_increases_after_each_assignment ... ok
test tests::move_money_keeps_ready_to_assign_and_card_gets_payment_category ... ok
test tests::multiple_assignment_rows_set_one_exact_total ... ok
test tests::other_users_and_sessions_without_data_scope_see_nothing ... ok
test tests::overflowing_category_sum_is_rejected_before_assignment_write ... ok
test tests::overflowing_cleared_subset_is_rejected_before_transaction_write ... ok
test tests::overflowing_derived_balance_is_rejected_before_the_write ... ok
test tests::overspending_reports_ynab_states ... ok
test tests::plugin_code_never_uses_floating_point ... ok
test tests::parsed_money_cache_shares_documents_and_prunes_removed_months ... ok
test tests::recheck_metadata_files_use_the_reader_size_cap ... ok
test tests::recheck_local_server_number_and_lifecycle_contract ... ok
test tests::recheck_source_checks_owner_and_opening_balance_confirmation ... ok
test tests::review_1130::review1130_cancel_after_partial_preparation ... ok
test tests::recheck_random_preview_cancellation_leaves_no_files ... ok
test tests::review_1130::review1130_legacy_home_needs_no_metadata_rewrite ... ok
test tests::review_1130::review1130_notes_are_inert ... ok
test tests::review_1130::review1130_long_imported_note_allows_amount_edit_without_loss ... ok
test tests::review_1130::review1130_reconciled_closed_balances ... ok
test tests::review_1130::review1130_split_and_closed_transfer_have_one_posting ... ok
test tests::review_1130::review1130_tcp_locks_reimport_and_cancel ... ok
test tests::review_984::review3_first_future_transaction_keeps_current_event_month ... ok
test tests::review_984::review3_future_only_edit_and_delete_keep_current_event_month ... ok
test tests::review_984::review3_outside_current_range_writes_emit_no_overspend ... ok
test tests::review_984::review_category_edit_emits_for_old_category_only ... ok
test tests::review_984::review_concurrent_assign_revisions_match_final_report ... ok
test tests::review_984::review_cross_month_refund_move_emits_current_crossing ... ok
test tests::review_984::review_file_replacement_advances_month_revision ... ok
test tests::review_984::review_exact_zero_healing_recrossing_and_delete ... ok
test tests::review_984::review_split_and_tracking_transfer_writes_are_rejected_without_events ... ok
test tests::review_984::review_user_zone_month_and_year_edges ... ok
test tests::review_984::review_source_generation_tracks_all_files_and_restoration ... ok
test tests::review_bulkrev2::four_conflicts_return_409_without_writing ... ok
test tests::same_handle_settles_a_failed_move_before_the_next_request ... ok
test tests::simultaneous_import_confirmations_have_one_winner ... ok
test tests::review_bulkrev2::two_and_five_assignment_races_match_serial_targets ... ok
test tests::source_total_mismatch_cannot_be_confirmed ... ok
test tests::transaction_identity_preview_is_atomic_and_reimport_changes_nothing ... ok
test tests::transaction_logged_event_has_the_documented_create_payload ... ok
test tests::transfer_cleared_edits_are_per_account ... ok
test tests::transfer_register_view_exposes_linked_category ... ok
test tests::slow_15mb_import_receive_completes_with_progress ... ok
test tests::wizard_background_job_recovers_preview_after_response_is_dropped ... ok
test tests::wizard_background_job_retains_safe_failure ... ok
test tests::wizard_starter_categories_validate_before_create_and_do_not_change_totals ... ok
test tests::ynab_conflicting_accounts_and_payees_are_not_silently_discarded ... ok
test tests::ynab_csv_import_keeps_exact_month_and_register_amounts ... ok
test tests::ynab_duplicate_category_ids_are_merged_only_when_identical ... ok
test tests::ynab_plan_json_import_keeps_exact_milliunits ... ok
test tests::ynab_public_demo_imports_duplicate_category_names_by_id ... ok
test tests::update_transaction_emits_current_month_overspend_crossing ... ok
test tests::bulk_write_balances_equal_one_by_one ... ok
test tests::card_models_ignore_arrival_batch_and_timezone ... ok

test result: ok. 133 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 984.23s

     Running tests/import_review.rs (/home/kayg/build/targets/bulkfix3/debug/deps/import_review-6a0b9e5006b57cbf)

running 32 tests
test csv_bom_mixed_endings_and_decimal_comma_are_exact ... ok
test csv_amount_edges_never_round_group_or_overflow ... ok
test csv_transaction_ids_merge_or_reject_before_totals ... ok
test identity_csv_transfer_growth_curve ... ignored, run with MONEY_IDENT_CSV_ROWS for 10k/100k/1M transfer profiling
test corrupt_actual_database_is_a_private_error ... ok
test recheck_actual_stream_growth_curve ... ignored, run with MONEY_RECHECK_ARCHIVE and MONEY_RECHECK_ROWS for profiling
test recheck_conflicting_transaction_ids_are_rejected ... ok
test recheck_csv_transfer_growth_curve ... ignored, run with MONEY_RECHECK_TRANSFERS for the bounded CSV growth probe
test recheck_e2e_csv_has_four_checks_and_keeps_every_minor_unit ... ok
test recheck_identical_transaction_ids_do_not_double_money ... ok
test recheck_reconciled_negative_zero_and_exact_source_scales ... ok
test split_identity_cannot_reuse_a_top_level_id ... ok
test split_identity_concrete_valid_totals ... ok
test split_identity_includes_parent_deleted_and_transfer_fields ... ok
test csv_pairing_accepts_cancellation_during_its_loop ... ok
test split_identity_rejects_an_inconsistent_embedded_parent ... ok
test split_identity_review_cases_reject ... ok
test transaction_identity_checks_fields_and_keeps_distinct_ids ... ok
test transaction_identity_preserves_exact_units ... ok
test split_identity_merges_before_totals ... ok
test transfer_legs_prefer_a_same_month_mate ... ok
test transfer_month_identity_rejects_in_both_adapters ... ok
test transfer_month_review_cases_reject ... ok
test unmatched_transfer_legs_keep_the_source_register ... ok
test ynab_account_check_rejects_a_wrong_normalization ... ok
test ynab_csv_preserves_exact_minor_units ... ok
test transfer_month_pairing_keeps_dates_and_exact_pair_priority ... ok
test ynab_negative_zero_amount_is_zero ... ok
test ynab_unrepresentable_milliunits_are_rejected ... ok
test ynab_json_keeps_exact_split_and_transfer_postings ... ok
test csv_pairing_keeps_exact_account_legs ... ok
test raw_ynab_registers_match_a_raw_row_oracle ... ok

test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 9.01s

   Doc-tests calternal_money

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

   Doc-tests calternal_plugin_money

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

cargo clean: exit 0. Output, verbatim:

     Removed 6275 files, 2.6GiB total

The scratch origin/dev checkout was removed. Both apps/web/build and
apps/web/.svelte-kit/output are absent. Text logs stay in ignored
artifacts/; no screenshots, videos or build output were committed.

Final head: f39bf92bf3; R3-1 FIXED; R3-2 FIXED; R3-3 FIXED; R3-4 FIXED; R3-5 FIXED; property: random_histories_conserve_money_after_every_rollover

# Money conservation fixes — bulkfix3, #1393 Fix R3-1 through R3-5 in the shared full-Ledger and streamed-import replay. All amounts in review evidence are synthetic fixture minor units. ## Baseline Step 0 ran the five independent Markdown inputs against detached origin/dev `cc1af3c12b68ad26c8403adde1be39c096b9ddea` before product changes. All five are PRE-EXISTING. The table was posted on #1393 before editing. | Case | dev discrepancy | Result | | --- | --- | --- | | R3-1 | Allocations 150 vs real 200 after the partial refund | FIXED: retain reserve 50 | | R3-2 | Allocations 300 vs real 200 after the later refund | FIXED: Available stays 0 | | R3-3 | April Ready to Assign 150 instead of 100 | FIXED: deduct cash deficit 50 | | R3-4 | Allocations 200 vs real 300 after two-Card transfer | FIXED: Ready to Assign includes credit 100 | | R3-5 | Allocations 250 vs real 200 after credit spending | FIXED: no payment reserve | ## Built and files - `crates/calternal-money/src/budget.rs`: track current virtual deficits by Card and Category. Refunds heal those deficits before releasing reserve. Retired unfunded debt refunds do not create Available. Positive Card credit is spent directly. On-budget transfers account for zero crossings. Rollover deducts only cash deficits and keeps the existing Tracking contract. - `crates/calternal-money/tests/review_bulkrev3.rs`: turn all five witnesses into exact correct-result assertions. One seeded general property, `random_histories_conserve_money_after_every_rollover`, checks 256 histories, 1,536 Account models, 768 post-rollover allocation sums and complete-model shuffle independence. Random histories include underfunding, overspending, later refunds, positive credit, both Card transfer directions, splits, Cash refunds, later Assignments and payments to both Cards. - `crates/calternal-money/tests/properties.rs`: keep the 40-row shuffle witness and update only its two R3-dependent amount pins, with a hand calculation in its doc comment. - `crates/calternal-money/tests/vectors.rs` and `contracts/vectors/money/money.v1.json`: correct two other records affected by the explicit R3 rules and assert their hand-computed results. All 11 previously reviewed refund vectors remain unchanged. - `crates/calternal-money/tests/account_kinds.rs`: guard the existing Tracking deficit rollover rule with a two-month replay. - `docs/DESIGN.md` §48: state the exact refund, positive-credit, transfer and conservation rules. ## Decisions §48 was incomplete for the R3 cases. Current-month unfunded refunds heal virtual deficits without releasing funded money. Canceling retired unfunded debt adds no Available, except for funded reserve released or new positive credit. Positive Card credit spending uses real budget money. General on-budget transfers leave Categories unchanged and put their real-money change in Ready to Assign. Payment transfers keep their payment Category move and put the remaining real-money change in Ready to Assign. For these Cash-income and on-budget expense/refund/payment/transfer histories, let L be Ready to Assign plus all signed Category Available, including payment Categories once. Let M be Cash balances plus positive Card balances. Let U be remaining current-month unfunded Card spending. Before rollover, L + U = M. After rollover, L = M. Add cumulative import reconciliation adjustments to M when present. Tracking import rules remain unchanged. Expected replay cost is the existing O(T log T) canonical sort plus bounded passes over rows, Categories and touched Card/Category pairs. The new deficit state uses O(K) memory for K touched pairs and resets each month. A transfer reads only its two Accounts. No new per-request Home scan, IO, dependency, route, background job or UI operation was added. No benchmark or UI evidence is required by the current verification policy for this correctness slice. ## Expectation changes No input, status code, blanket divergence exemption or shuffle assertion changed. Two amount pins and two stored records changed because this issue explicitly changes their refund or positive-credit behavior: - The 40-row reserve is 10,577, not 18,571; uncovered debt is 41,334, not 33,340. March carry is 10,851; April carry is 11,152 with reserve 6,474; October cash-first funding is 4,103. Its refund heals virtual credit spending. Reserve = 6,474 + 4,103; uncovered = raw debt 51,911 minus that reserve. - `901a5dc38f13b647`: later reversals cancel retired unfunded debt. February reserve and retail Available stay zero; Fees are -15,151 and Tax is -3,309. Raw debt 366,524 is fully uncovered. - `e6d77a36b9ded73d`: payment 20,000 against debt 9,853 creates credit 10,147. Ready to Assign = 590,000 + 10,147 = 600,147. Other fields stay unchanged. The calculations are stated in tests and in the issue comment. ## Known gaps and merge round No requested R3 gap remains. Existing ignored performance/child tests stay ignored; their counts are quoted in the gate output. No API or web code changed. The full real-server adversarial matrix, release/staging checks and the original throughput work stay with the merge round under the current verification policy. Use the merged server and matching web build. For the merge round: `bun tests/adversarial/money_api.mjs` must confirm the real API still enforces authorization, exact amounts and durable batch isolation with the corrected replay. `tests/adversarial/run.sh` covers the full cross-User and protocol matrix. This job runs the focused regressions and the finite seeded conservation campaign instead. No push, deploy or promotion was made. The origin/dev merge reported `Already up to date.` ## Verification Cargo used CARGO_PROFILE_DEV_DEBUG=line-tables-only, CARGO_INCREMENTAL=0, CARGO_BUILD_JOBS=4 and TMPDIR=<worktree>/target/tmp. The preset CARGO_TARGET_DIR was not changed. No dependency version changed. Build output is cleaned at job end. Module and function comments were read before the final report. The main fix is `9d8bd5fb73914265bf9127f6a7cf537880aab6b2`. The Tracking regression is `1e3e418ba19494f67ce7882d3df8f545491a60ed`. The final report commit also clarifies doc comments for positive Card credit spending; it changes no Rust test or implementation body. The final combined gates passed. B1, N2, all 625 stored cases, the unchanged 11-vector check, raw Account checks and both core and real-TCP API shuffle checks pass. The API property covers serial, shuffled, eight-client and burst writes in three client zones. Six existing ignored tests remain ignored. `cargo fmt --check`: exit 0; no output. `cargo clippy -p calternal-money -p calternal-plugin-money --all-targets -- -D warnings`: exit 0. Complete output, verbatim: ```text Compiling proc-macro2 v1.0.107 Compiling quote v1.0.47 Compiling libc v0.2.189 Compiling serde_core v1.0.229 Checking memchr v2.8.3 Compiling serde v1.0.229 Compiling jobserver v0.1.35 Checking once_cell v1.21.4 Compiling find-msvc-tools v0.1.13 Compiling shlex v2.0.1 Compiling pkg-config v0.3.34 Checking pin-project-lite v0.2.17 Compiling cc v1.4.7 Compiling version_check v0.9.5 Checking log v0.4.34 Compiling serde_json v1.0.151 Compiling num-traits v0.2.19 Checking futures-core v0.3.34 Compiling getrandom v0.4.3 Checking bytes v1.12.1 Compiling syn v3.0.6 Compiling syn v2.0.119 Compiling icu_normalizer_data v2.3.0 Compiling icu_properties_data v2.3.0 Checking rand_core v0.10.1 Compiling generic-array v0.14.9 Checking typenum v1.20.1 Compiling synstructure v0.14.0 Compiling zerovec-derive v0.11.6 Compiling serde_derive v1.0.229 Compiling displaydoc v0.2.7 Compiling tracing-attributes v0.1.31 Compiling zerofrom-derive v0.1.8 Compiling yoke-derive v0.8.4 Compiling stable_deref_trait v1.2.1 Compiling zerofrom v0.1.8 Checking mio v1.2.3 Checking errno v0.3.14 Compiling yoke v0.8.3 Checking equivalent v1.0.2 Checking futures-sink v0.3.34 Checking signal-hook-registry v1.4.8 Compiling tokio-macros v2.7.2 Checking socket2 v0.6.5 Checking smallvec v1.16.1 Checking zerovec v0.11.8 Checking tokio v1.53.1 Checking hashbrown v0.17.1 Checking tracing-core v0.1.36 Checking slab v0.4.12 Checking indexmap v2.14.2 Compiling parking_lot_core v0.9.12 Checking iana-time-zone v0.1.65 Checking tracing v0.1.44 Compiling tinystr v0.8.4 Checking chrono v0.4.45 Compiling futures-macro v0.3.34 Checking percent-encoding v2.3.2 Compiling writeable v0.6.4 Checking litemap v0.8.3 Checking futures-io v0.3.34 Checking futures-task v0.3.34 Compiling crossbeam-utils v0.8.23 Compiling potential_utf v0.1.6 Compiling icu_locale_core v2.3.0 Checking futures-util v0.3.34 Checking zerotrie v0.2.5 Compiling cmake v0.1.58 Compiling fs_extra v1.3.0 Compiling vcpkg v0.2.15 Checking utf8_iter v1.0.4 Checking scopeguard v1.2.0 Compiling dunce v1.0.5 Checking icu_collections v2.3.0 Compiling icu_provider v2.3.1 Compiling aws-lc-sys v0.45.0 Compiling thiserror-impl v2.0.21 Checking http v1.5.0 Checking lock_api v0.4.14 Checking hybrid-array v0.4.15 Checking aho-corasick v1.1.5 Checking base64 v0.22.1 Compiling cfg-if v1.0.5 Checking regex-automata v0.4.18 Compiling icu_properties v2.3.0 Compiling icu_normalizer v2.3.0 Checking form_urlencoded v1.2.2 Checking zeroize v1.9.0 Compiling aws-lc-rs v1.18.1 Compiling rustversion v1.0.23 Checking tempfile v3.27.0 Checking idna_adapter v1.2.2 Checking regex v1.13.1 Compiling crypto-common v0.1.6 Compiling block-buffer v0.10.4 Checking http-body v1.1.0 Checking futures-channel v0.3.34 Compiling foldhash v0.2.0 Checking simd-adler32 v0.3.10 Compiling allocator-api2 v0.2.21 Compiling httparse v1.10.1 Checking siphasher v1.0.3 Compiling thiserror v2.0.21 Compiling hashbrown v0.16.1 Checking rusty-fork v0.3.1 Compiling digest v0.10.7 Compiling parking_lot v0.12.5 Compiling idna v1.1.0 Checking rustls-pki-types v1.15.1 Checking crypto-common v0.2.2 Compiling libsqlite3-sys v0.37.0 Compiling zmij v1.0.23 Compiling itoa v1.0.18 Checking cpufeatures v0.3.1 Compiling crc32fast v1.5.2 Compiling parking v2.2.1 Checking tower-service v0.3.3 Compiling crc-catalog v2.5.0 Compiling cpufeatures v0.2.17 Compiling event-listener v5.4.2 Compiling crc v3.4.0 Compiling sha2 v0.10.9 Compiling crossbeam-queue v0.3.14 Checking proptest v1.11.0 Compiling either v1.18.0 Compiling tokio-stream v0.1.19 Checking url v2.5.8 Compiling futures-intrusive v0.5.0 Compiling hashlink v0.11.1 Checking calternal-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-money) Compiling spin v0.9.9 Checking tokio-util v0.7.19 Checking untrusted v0.9.0 Compiling rustls v0.23.45 Checking adler2 v2.0.1 Checking try-lock v0.2.5 Checking atomic-waker v1.1.2 Compiling rand_core v0.6.4 Compiling sqlx-core v0.9.0 Compiling phf_shared v0.11.3 Compiling rand v0.8.8 Checking h2 v0.4.19 Checking want v0.3.1 Checking rustls-webpki v0.103.15 Compiling flume v0.12.0 Compiling atoi v2.0.0 Compiling futures-executor v0.3.34 Checking inout v0.2.2 Checking sync_wrapper v1.0.2 Compiling blake3 v1.8.7 Checking httpdate v1.0.3 Checking cmov v0.5.4 Checking subtle v2.6.1 Checking tower-layer v0.3.3 Checking ipnet v2.12.2 Checking ryu v1.0.23 Checking ctutils v0.4.2 Checking hyper v1.11.1 Compiling sqlx-sqlite v0.9.0 Compiling phf_generator v0.11.3 Checking miniz_oxide v0.9.1 Compiling multiversion-macros v0.9.0 Compiling encoding_rs v0.8.41 Checking phf_shared v0.12.1 Checking block-buffer v0.12.1 Compiling hex v0.4.3 Compiling inotify-sys v0.1.8 Checking constant_time_eq v0.4.2 Checking arrayvec v0.7.8 Compiling chrono-tz v0.10.4 Compiling dotenvy v0.15.7 Compiling heck v0.5.0 Checking zlib-rs v0.6.8 Compiling sqlx-macros-core v0.9.0 Checking flate2 v1.1.10 Checking cipher v0.5.2 Checking phf v0.12.1 Checking multiversion v0.9.0 Compiling phf_macros v0.11.3 Checking hyper-util v0.1.20 Checking universal-hash v0.6.1 Checking tower v0.5.3 Checking http-body-util v0.1.5 Compiling multer v3.1.0 Checking openssl-probe v0.2.1 Checking mime v0.3.17 Checking core_detect v1.0.0 Compiling linkme-impl v0.3.37 Checking simdutf8 v0.1.5 Compiling multiversion_no_op v1.0.0 Compiling unicode-joining-type v1.0.0 Checking rustls-native-certs v0.8.4 Checking phf v0.11.3 Checking poly1305 v0.9.1 Checking chacha20 v0.10.2 Compiling sqlx-macros v0.9.0 Checking tokio-rustls v0.26.6 Checking aead v0.6.1 Checking miniz_oxide v0.8.9 Checking fdeflate v0.3.7 Compiling utoipa-gen v6.0.1 Checking color_quant v1.1.0 Checking quick-error v2.0.1 Checking zune-core v0.5.3 Checking calternal-path v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-path) Compiling linkme v0.3.37 Checking weezl v0.1.12 Checking winnow v0.7.15 Checking byteorder-lite v0.1.0 Compiling pulldown-cmark v0.13.4 Checking same-file v1.0.6 Checking pxfm v0.1.30 Checking cron v0.17.0 Checking image-webp v0.2.4 Checking walkdir v2.5.0 Checking gif v0.14.2 Checking utoipa v6.0.0 Checking moxcms v0.8.1 Checking zune-jpeg v0.5.15 Checking png v0.18.1 Checking chacha20poly1305 v0.11.0 Checking hyper-rustls v0.27.10 Checking inotify v0.11.5 Checking sqlx v0.9.0 Checking rustls-platform-verifier v0.7.0 Checking axum-core v0.5.6 Checking tower-http v0.6.11 Checking serde_urlencoded v0.7.1 Checking uuid v1.26.1 Checking notify-types v2.1.0 Checking serde_path_to_error v0.1.20 Checking unicode-casefold v0.2.0 Checking unsafe-libyaml v0.2.11 Checking bumpalo v3.20.3 Checking unicase v2.9.0 Checking bytemuck v1.25.2 Checking base64 v0.23.1 Checking unicode-properties v0.1.4 Checking matchit v0.8.4 Checking image v0.25.10 Checking reqwest v0.13.5 Checking calternal-fs v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-fs) Checking axum v0.8.9 Checking zopfli v0.8.3 Checking serde_yaml v0.9.34+deprecated Checking notify v8.2.0 Checking calternal-db v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-db) Checking calternal-api v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-api) Checking quick-xml v0.42.0 Checking csv-core v0.1.13 Checking zip v5.1.1 Checking calternal-plugin v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-plugin) Checking calternal-notes-core v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-notes-core) Checking csv v1.4.0 Checking calternal-plugin-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/plugins/money) Finished `dev` profile [unoptimized + debuginfo] target(s) in 5m 53s ``` `cargo test -p calternal-money -p calternal-plugin-money -- --test-threads=4`: exit 0. Complete output, verbatim: ```text Blocking waiting for file lock on build directory Compiling memchr v2.8.3 Compiling once_cell v1.21.4 Compiling futures-core v0.3.34 Compiling serde_core v1.0.229 Compiling pin-project-lite v0.2.17 Compiling jobserver v0.1.35 Compiling log v0.4.34 Compiling bytes v1.12.1 Compiling zerofrom v0.1.8 Compiling stable_deref_trait v1.2.1 Compiling cc v1.4.7 Compiling serde v1.0.229 Compiling socket2 v0.6.5 Compiling yoke v0.8.3 Compiling equivalent v1.0.2 Compiling num-traits v0.2.19 Compiling rand_core v0.10.1 Compiling zerovec v0.11.8 Compiling writeable v0.6.4 Compiling getrandom v0.4.3 Compiling litemap v0.8.3 Compiling hashbrown v0.17.1 Compiling tinystr v0.8.4 Compiling potential_utf v0.1.6 Compiling zerotrie v0.2.5 Compiling utf8_iter v1.0.4 Compiling icu_locale_core v2.3.0 Compiling tracing-core v0.1.36 Compiling scopeguard v1.2.0 Compiling icu_collections v2.3.0 Compiling icu_provider v2.3.1 Compiling typenum v1.20.1 Compiling futures-task v0.3.34 Compiling futures-io v0.3.34 Compiling tracing v0.1.44 Compiling icu_normalizer_data v2.3.0 Compiling serde_json v1.0.151 Compiling mio v1.2.3 Compiling errno v0.3.14 Compiling futures-sink v0.3.34 Compiling percent-encoding v2.3.2 Compiling icu_properties_data v2.3.0 Compiling signal-hook-registry v1.4.8 Compiling lock_api v0.4.14 Compiling smallvec v1.16.1 Compiling icu_properties v2.3.0 Compiling tokio v1.53.1 Compiling iana-time-zone v0.1.65 Compiling indexmap v2.14.2 Compiling slab v0.4.12 Compiling chrono v0.4.45 Compiling form_urlencoded v1.2.2 Compiling cmake v0.1.58 Compiling futures-util v0.3.34 Compiling http v1.5.0 Compiling aho-corasick v1.1.5 Compiling aws-lc-sys v0.45.0 Compiling siphasher v1.0.3 Compiling generic-array v0.14.9 Compiling spin v0.9.9 Compiling hybrid-array v0.4.15 Compiling regex-automata v0.4.18 Compiling allocator-api2 v0.2.21 Compiling base64 v0.22.1 Compiling cpufeatures v0.2.17 Compiling foldhash v0.2.0 Compiling tempfile v3.27.0 Compiling regex v1.13.1 Compiling hashbrown v0.16.1 Compiling crossbeam-utils v0.8.23 Compiling icu_normalizer v2.3.0 Compiling parking v2.2.1 Compiling zeroize v1.9.0 Compiling crc-catalog v2.5.0 Compiling rusty-fork v0.3.1 Compiling idna_adapter v1.2.2 Compiling crc v3.4.0 Compiling event-listener v5.4.2 Compiling crossbeam-queue v0.3.14 Compiling hashlink v0.11.1 Compiling block-buffer v0.10.4 Compiling crypto-common v0.1.6 Compiling http-body v1.1.0 Compiling parking_lot_core v0.9.12 Compiling futures-channel v0.3.34 Compiling simd-adler32 v0.3.10 Compiling aws-lc-rs v1.18.1 Compiling proptest v1.11.0 Compiling parking_lot v0.12.5 Compiling digest v0.10.7 Compiling idna v1.1.0 Compiling rustls-pki-types v1.15.1 Compiling calternal-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-money) Compiling crypto-common v0.2.2 Compiling libsqlite3-sys v0.37.0 Compiling cpufeatures v0.3.1 Compiling tower-service v0.3.3 Compiling either v1.18.0 Compiling url v2.5.8 Compiling sha2 v0.10.9 Compiling futures-intrusive v0.5.0 Compiling tokio-stream v0.1.19 Compiling httparse v1.10.1 Compiling tokio-util v0.7.19 Compiling atomic-waker v1.1.2 Compiling untrusted v0.9.0 Compiling adler2 v2.0.1 Compiling try-lock v0.2.5 Compiling sqlx-core v0.9.0 Compiling rustls-webpki v0.103.15 Compiling h2 v0.4.19 Compiling want v0.3.1 Compiling rustls v0.23.45 Compiling atoi v2.0.0 Compiling crc32fast v1.5.2 Compiling thiserror v2.0.21 Compiling futures-executor v0.3.34 Compiling flume v0.12.0 Compiling inout v0.2.2 Compiling phf_shared v0.11.3 Compiling blake3 v1.8.7 Compiling sync_wrapper v1.0.2 Compiling httpdate v1.0.3 Compiling ipnet v2.12.2 Compiling tower-layer v0.3.3 Compiling cmov v0.5.4 Compiling subtle v2.6.1 Compiling ryu v1.0.23 Compiling hyper v1.11.1 Compiling ctutils v0.4.2 Compiling phf_generator v0.11.3 Compiling sqlx-sqlite v0.9.0 Compiling miniz_oxide v0.9.1 Compiling block-buffer v0.12.1 Compiling phf_shared v0.12.1 Compiling constant_time_eq v0.4.2 Compiling arrayvec v0.7.8 Compiling zlib-rs v0.6.8 Compiling sqlx-macros-core v0.9.0 Compiling flate2 v1.1.10 Compiling phf v0.12.1 Compiling cipher v0.5.2 Compiling multiversion v0.9.0 Compiling phf_macros v0.11.3 Compiling hyper-util v0.1.20 Compiling universal-hash v0.6.1 Compiling tower v0.5.3 Compiling http-body-util v0.1.5 Compiling core_detect v1.0.0 Compiling openssl-probe v0.2.1 Compiling mime v0.3.17 Compiling simdutf8 v0.1.5 Compiling rustls-native-certs v0.8.4 Compiling phf v0.11.3 Compiling encoding_rs v0.8.41 Compiling poly1305 v0.9.1 Compiling chacha20 v0.10.2 Compiling chrono-tz v0.10.4 Compiling inotify-sys v0.1.8 Compiling sqlx-macros v0.9.0 Compiling tokio-rustls v0.26.6 Compiling aead v0.6.1 Compiling miniz_oxide v0.8.9 Compiling fdeflate v0.3.7 Compiling zune-core v0.5.3 Compiling weezl v0.1.12 Compiling calternal-path v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-path) Compiling color_quant v1.1.0 Compiling pxfm v0.1.30 Compiling winnow v0.7.15 Compiling quick-error v2.0.1 Compiling same-file v1.0.6 Compiling byteorder-lite v0.1.0 Compiling cron v0.17.0 Compiling moxcms v0.8.1 Compiling walkdir v2.5.0 Compiling image-webp v0.2.4 Compiling gif v0.14.2 Compiling zune-jpeg v0.5.15 Compiling png v0.18.1 Compiling utoipa v6.0.0 Compiling chacha20poly1305 v0.11.0 Compiling hyper-rustls v0.27.10 Compiling inotify v0.11.5 Compiling sqlx v0.9.0 Compiling multer v3.1.0 Compiling rustls-platform-verifier v0.7.0 Compiling axum-core v0.5.6 Compiling unicode-joining-type v1.0.0 Compiling tower-http v0.6.11 Compiling serde_urlencoded v0.7.1 Compiling uuid v1.26.1 Compiling notify-types v2.1.0 Compiling serde_path_to_error v0.1.20 Compiling unicode-properties v0.1.4 Compiling base64 v0.23.1 Compiling matchit v0.8.4 Compiling bumpalo v3.20.3 Compiling unicode-casefold v0.2.0 Compiling bytemuck v1.25.2 Compiling unsafe-libyaml v0.2.11 Compiling unicase v2.9.0 Compiling calternal-fs v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-fs) Compiling image v0.25.10 Compiling pulldown-cmark v0.13.4 Compiling serde_yaml v0.9.34+deprecated Compiling zopfli v0.8.3 Compiling axum v0.8.9 Compiling reqwest v0.13.5 Compiling notify v8.2.0 Compiling calternal-db v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-db) Compiling linkme v0.3.37 Compiling calternal-api v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-api) Compiling quick-xml v0.42.0 Compiling csv-core v0.1.13 Compiling zip v5.1.1 Compiling calternal-notes-core v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-notes-core) Compiling calternal-plugin v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-plugin) Compiling csv v1.4.0 Compiling calternal-plugin-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/plugins/money) Finished `test` profile [unoptimized + debuginfo] target(s) in 6m 20s Running unittests src/lib.rs (/home/kayg/build/targets/bulkfix3/debug/deps/calternal_money-5ad27f9b5c008064) running 16 tests test codec::tests::empty_payee_is_refused_by_the_writer ... ok test codec::tests::property_edit_changes_one_value ... ok test codec::tests::round_trip_keeps_bom_crlf_and_unknown_bytes ... ok test codec::tests::malformed_dated_rows_fail_instead_of_vanishing ... ok test codec::tests::transaction_round_trip_with_punctuation_in_labels_and_payee ... ok test edit::tests::cleared_tag_toggles_without_touching_other_tags ... ok test edit::tests::crlf_file_keeps_crlf_on_insert ... ok test edit::tests::unicode_payee_tag_boundaries_match_shared_vectors ... ok test codec::tests::checked_parse_stops_after_a_bounded_line_batch ... ok test units::tests::exact_range_is_enforced_on_parse_and_arithmetic ... ok test units::tests::format_uses_explicit_sign_and_exact_scale ... ok test units::tests::parse_matches_the_oracle_examples ... ok test units::tests::scale_table_has_all_165_codes_with_unique_entries ... ok test units::independent_number_review::signed_edges_and_long_zero_padding_keep_exact_minor_units ... ok test edit::tests::new_budget_projects_with_no_accounts ... ok test edit::tests::assign_inserts_updates_and_removes_rows ... ok test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s Running tests/account_kinds.rs (/home/kayg/build/targets/bulkfix3/debug/deps/account_kinds-40f136ace82559dd) running 5 tests test account_projection_rejects_legacy_and_unknown_kinds ... ok test imported_account_kinds_project_without_losing_identity ... ok test off_budget_balance_marker_does_not_change_budget_money ... ok test tracking_deficit_rollover_does_not_reduce_ready_to_assign ... ok test categorized_debit_loan_transfers_post_one_budget_leg ... ok test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s Running tests/import.rs (/home/kayg/build/targets/bulkfix3/debug/deps/import-32258f8fda96f336) running 13 tests test duplicate_source_ids_are_rejected_and_duplicate_names_are_kept ... ok test import_render_is_exact_and_byte_stable ... ok test import_keeps_same_day_source_order_for_credit_payments_and_refunds ... ok test import_render_reports_progress_and_propagates_cancel ... ok test import_stream_renderer_matches_full_rendered_files ... ok test import_replay_matches_full_ledger_month_by_month ... ok test production_v1_metadata_upgrade_keeps_balances ... ok test recheck_half_minor_units_negative_zero_and_nineteen_digits ... ok test budget_replay_stops_at_a_bounded_transaction_checkpoint ... ok test imported_ready_to_assign_matches_independent_month_oracle ... ok test recheck_same_day_payment_and_refund_keep_source_fifo ... ok test random_imports_conserve_source_balances_and_markdown ... ok test recheck_random_multicurrency_ledgers_match_all_monthly_totals ... ok test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 9.99s Running tests/properties.rs (/home/kayg/build/targets/bulkfix3/debug/deps/properties-9ff9e71a800dacb8) running 21 tests test bill_coverage_never_clamps_the_bill ... ok test bulkrev2::boundary_shuffle_reports_acceptance_difference ... ok test bulkrev2::i64_extremes_are_rejected_and_safe_bound_is_exact ... ok test bulkrev2::literal_account_sum_and_funded_card_conservation ... ok test bulkrev2::refund_payment_calendar_choice_is_visible_next_month ... ok test any_text_that_parses_serializes_to_the_same_bytes ... ok test bulkrev2::split_refund_keeps_payment_overfunding_when_card_becomes_positive ... ok test assign_then_unassign_is_the_identity ... ok test decimal_text_round_trips_for_every_scale ... ok test fully_funded_card_spending_conserves_cash ... ok test cash_ledgers_conserve_money_every_month ... ok test money_code_never_uses_floating_point ... ok test paired_write_replay_matches_independent_calculations ... ok test mixed_cash_credit_deficit_rolls_only_its_cash_part ... ok test reviewed_burst_order_matches_input_order ... ok test partial_payment_then_category_refunds_conserve_cash_across_months ... ok test split_legs_post_exactly_the_parent ... ok test transaction_rows_round_trip_byte_for_byte ... ok test same_date_card_postings_are_a_function_of_the_set ... ok test bulkrev2::funded_shuffles_conserve_real_money_every_month ... ok test bulkrev2::same_day_shuffles_cover_splits_transfers_and_month_edges ... ok test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.93s Running tests/ready_to_assign_adjustment.rs (/home/kayg/build/targets/bulkfix3/debug/deps/ready_to_assign_adjustment-0e1c5c7276d14077) running 1 test test ready_to_assign_adjustment_changes_only_the_budget_pool ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s Running tests/review_984.rs (/home/kayg/build/targets/bulkfix3/debug/deps/review_984-dc85183370c2f07a) running 5 tests test review_pair_performance_profile ... ignored, performance measurements belong to the merge round on the perf VM test review_pair_rejects_bad_months_and_amounts_without_rounding ... ok test review_split_remainders_and_tracking_transfers_are_exact ... ok test review_mixed_pair_matches_independent_replays ... ok test review_large_ledger_pair_keeps_exact_totals ... ok test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 3.30s Running tests/review_bulkrev3.rs (/home/kayg/build/targets/bulkfix3/debug/deps/review_bulkrev3-cbfa6724c48c7f18) running 4 tests test hidden_and_missing_categories ... ok test envelope_edge_cases ... ok test previous_witnesses_all_orders ... ok test random_histories_conserve_money_after_every_rollover ... ok test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.68s Running tests/vectors.rs (/home/kayg/build/targets/bulkfix3/debug/deps/vectors-b0e2a54af0711cc9) running 4 tests test rust_matches_random_oracle_ledgers_without_divergences ... ok test reviewed_eleven_refund_vectors_keep_their_exact_numbers ... ok test reviewed_r3_vectors_assert_retired_debt_and_positive_credit ... ok test rust_port_matches_every_recorded_oracle_vector ... ok test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.42s Running unittests src/lib.rs (/home/kayg/build/targets/bulkfix3/debug/deps/calternal_plugin_money-3d165b6d3890a332) running 135 tests test import::import_review_tests::actual_cents_conversion_never_rounds ... ok test import::import_review_tests::actual_cc_label_requires_missing_type_confirmation ... ok test import::import_review_tests::actual_orphan_split_children_are_rejected ... ok test import::import_review_tests::actual_stream_memory_guard_child ... ignored, invoked as an isolated child by actual_stream_keeps_a_large_history_bounded test import::import_review_tests::import_control_reports_progress_and_stops_cancelled_work ... ok test import::import_review_tests::actual_account_checks_use_raw_monthly_source_rows ... ok test import::import_review_tests::actual_transfer_legs_cannot_cross_months ... ok running 1 test test import::import_review_tests::ynab_transfer_pairing_handles_many_duplicate_legs ... ok test import_fidelity_1130::independent_split_and_transfer_numbers_check ... ok test routes::durable::admission_tests::cancelled_receiver_cannot_acknowledge_a_durable_job ... ok test routes::durable::checkpoint_tests::progress_wait_keeps_parser_writer_release_polled ... ok test import_fidelity_1130::actual_rows_round_trip ... ok test routes::import_cleanup_tests::dropped_preview_worker_retains_admission_until_exit ... ok test routes::import_cleanup_tests::idle_imports_are_reclaimed_by_expiry_cleanup ... ok test routes::import_cleanup_tests::staged_import_files_keep_ranges_and_release_private_storage ... ok test routes::import_staged_path_tests::staged_import_name_cannot_select_another_path_or_slot ... ok test routes::durable::admission_tests::live_publication_honors_operational_queue_cancellation ... ok test routes::replay_reuse_tests::assignment_retry_rebuilds_from_latest_source_bytes ... ok test routes::replay_reuse_tests::crossings_reuse_checked_current_totals_even_with_future_months ... ok test routes::replay_reuse_tests::crossings_cover_source_ranges_relative_to_today ... ok test routes::review_1140::cancel_wins_before_publication_lock ... ok test routes::review_1140::cancel_does_not_rewrite_published_result ... ok test routes::durable::money_import_undo_mutation ... ok test routes::review_1140::review1140_cancel_after_rename_before_receipt_keeps_publication ... ok test routes::review_1140::review1140_all_formats_replay_exact_balances ... ok test routes::review_1140::review1140_operational_cancel_before_replacement_returns_no_receipt ... ok test routes::review_1140::review1140_discard_after_confirmation_failure_releases_admission ... ok test routes::review_1140::review1140_tcp_malformed_inputs_leave_worker_usable ... ok test routes::review_1140::review1140_staged_size_limits_fail_without_publishing ... ok test store::parsed_cache_tests::global_budget_and_folder_pruning_release_stale_entries ... ok test store::parsed_cache_tests::parse_charge_accounts_for_line_structures ... ok test store::parsed_cache_tests::user_cache_evicts_old_parse_entries_and_shares_hot_documents ... ok test routes::review_1140::review1140_terminal_receipts_do_not_block_new_imports ... ok test tests::a_broken_file_is_reported_not_hidden ... ok test tests::a_new_user_sees_the_real_empty_state ... ok test tests::a_journal_for_a_completed_move_changes_nothing ... ok test routes::review_1140::review1140_replacement_receipt_recovery_does_not_adopt_later_edits ... ok test tests::active_money_handle_survives_other_users_cache_pressure ... ok test tests::actual_duplicate_names_import_by_id_without_sharing_a_payment_category ... ok test tests::actual_export_archive_imports_exact_rows_from_private_scratch ... ok test tests::a_read_waits_for_a_write_in_progress ... ok test tests::api_account_numbers_equal_core_replay ... ok test tests::a_split_row_written_by_hand_is_read_but_not_edited ... ok test tests::assignments_retry_source_conflicts_without_losing_neighbours ... ok test tests::backdated_create_emits_current_month_overspend_crossing ... ok test tests::budget_flow_writes_exact_markdown_and_derives_available ... ok test tests::bulk_write_invalid_neighbours_do_not_change_valid_rows ... ok test tests::bulk_write_month_does_not_need_note_date_backfill ... ok test tests::cancel_racing_confirm_has_one_consistent_outcome ... ok test tests::cancelling_imports_leaves_no_budget_and_releases_slots ... ok test tests::bulk_write_rejects_intermediate_overflow ... ok test tests::concurrent_store_edits_keep_exactly_one_winner ... ok test tests::csv_import_keeps_progress_and_cancel_responsive ... ok test tests::delete_transaction_emits_current_month_overspend_crossing ... ok test tests::denied_preview_access_keeps_the_owners_pending_import ... ok test import::import_review_tests::actual_stream_memory_guard_child ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 134 filtered out; finished in 42.41s test import::import_review_tests::actual_stream_keeps_a_large_history_bounded ... ok test tests::durable_import_tests::operation_exit_child ... ignored, child of operation_recovery_survives_process_exit_at_every_phase test tests::durable_import_tests::generated_import_confirm_replay_and_undo_preserve_minor_units ... ok test tests::durable_import_tests::operation_recovery_survives_process_exit_at_every_phase ... ok test tests::bulk_write_balances_equal_one_by_one has been running for over 60 seconds test tests::durable_import_tests::publication_and_inverse_authority_use_full_commits ... ok test tests::durable_import_tests::receipt_reads_are_bounded_and_old_receipts_are_addressable ... ok test tests::card_models_ignore_arrival_batch_and_timezone has been running for over 60 seconds test tests::durable_import_tests::queued_import_and_undo_survive_restarts ... ok test tests::durable_import_tests::replay_preserves_a_live_ready_preview ... ok test tests::durable_import_tests::running_jobs_do_not_expire_and_cancelled_jobs_do_not_restart ... ok test tests::durable_import_tests::undo_receipt_replay_never_removes_a_restored_import ... ok test tests::durable_import_tests::undo_refuses_a_predecessor_restored_before_the_inverse ... ok test tests::durable_import_tests::undo_refuses_every_later_budget_edit_after_restart ... ok test tests::durable_import_tests::undo_restarts_before_and_after_the_filesystem_inverse ... ok test tests::failed_cross_month_move_never_counts_the_row_twice ... ok test tests::far_month_assignment_cannot_make_the_budget_unreadable ... ok test tests::gap_month_assignments_and_opening_card_debt_do_not_create_cash ... ok test tests::historical_overspend_does_not_emit_current_month_event ... ok test tests::hostile_inputs_are_rejected_without_writing ... ok test tests::durable_import_tests::replacement_restarts_at_every_durable_phase ... ok test tests::import_fidelity_review_requires_account_kind_and_keeps_notes ... ok test tests::import_file_limits_match_the_money_reader ... ok test tests::idle_import_receive_releases_admission_and_cancel_stops_read ... ok test tests::import_preview_is_owner_bound_and_confirmation_publishes_once ... ok test tests::import_preview_reads_only_generated_staged_upload_names ... ok test tests::memo_and_tags_split_the_payee_without_losing_text ... ok test tests::money_is_on_for_the_instance_and_off_for_a_new_user ... ok test tests::inferred_opening_balance_needs_explicit_confirmation ... ok test tests::month_revision_increases_after_each_assignment ... ok test tests::move_money_keeps_ready_to_assign_and_card_gets_payment_category ... ok test tests::multiple_assignment_rows_set_one_exact_total ... ok test tests::other_users_and_sessions_without_data_scope_see_nothing ... ok test tests::overflowing_category_sum_is_rejected_before_assignment_write ... ok test tests::overflowing_cleared_subset_is_rejected_before_transaction_write ... ok test tests::overflowing_derived_balance_is_rejected_before_the_write ... ok test tests::overspending_reports_ynab_states ... ok test tests::plugin_code_never_uses_floating_point ... ok test tests::parsed_money_cache_shares_documents_and_prunes_removed_months ... ok test tests::recheck_metadata_files_use_the_reader_size_cap ... ok test tests::recheck_local_server_number_and_lifecycle_contract ... ok test tests::recheck_source_checks_owner_and_opening_balance_confirmation ... ok test tests::review_1130::review1130_cancel_after_partial_preparation ... ok test tests::recheck_random_preview_cancellation_leaves_no_files ... ok test tests::review_1130::review1130_legacy_home_needs_no_metadata_rewrite ... ok test tests::review_1130::review1130_notes_are_inert ... ok test tests::review_1130::review1130_long_imported_note_allows_amount_edit_without_loss ... ok test tests::review_1130::review1130_reconciled_closed_balances ... ok test tests::review_1130::review1130_split_and_closed_transfer_have_one_posting ... ok test tests::review_1130::review1130_tcp_locks_reimport_and_cancel ... ok test tests::review_984::review3_first_future_transaction_keeps_current_event_month ... ok test tests::review_984::review3_future_only_edit_and_delete_keep_current_event_month ... ok test tests::review_984::review3_outside_current_range_writes_emit_no_overspend ... ok test tests::review_984::review_category_edit_emits_for_old_category_only ... ok test tests::review_984::review_concurrent_assign_revisions_match_final_report ... ok test tests::review_984::review_cross_month_refund_move_emits_current_crossing ... ok test tests::review_984::review_file_replacement_advances_month_revision ... ok test tests::review_984::review_exact_zero_healing_recrossing_and_delete ... ok test tests::review_984::review_split_and_tracking_transfer_writes_are_rejected_without_events ... ok test tests::review_984::review_user_zone_month_and_year_edges ... ok test tests::review_984::review_source_generation_tracks_all_files_and_restoration ... ok test tests::review_bulkrev2::four_conflicts_return_409_without_writing ... ok test tests::same_handle_settles_a_failed_move_before_the_next_request ... ok test tests::simultaneous_import_confirmations_have_one_winner ... ok test tests::review_bulkrev2::two_and_five_assignment_races_match_serial_targets ... ok test tests::source_total_mismatch_cannot_be_confirmed ... ok test tests::transaction_identity_preview_is_atomic_and_reimport_changes_nothing ... ok test tests::transaction_logged_event_has_the_documented_create_payload ... ok test tests::transfer_cleared_edits_are_per_account ... ok test tests::transfer_register_view_exposes_linked_category ... ok test tests::slow_15mb_import_receive_completes_with_progress ... ok test tests::wizard_background_job_recovers_preview_after_response_is_dropped ... ok test tests::wizard_background_job_retains_safe_failure ... ok test tests::wizard_starter_categories_validate_before_create_and_do_not_change_totals ... ok test tests::ynab_conflicting_accounts_and_payees_are_not_silently_discarded ... ok test tests::ynab_csv_import_keeps_exact_month_and_register_amounts ... ok test tests::ynab_duplicate_category_ids_are_merged_only_when_identical ... ok test tests::ynab_plan_json_import_keeps_exact_milliunits ... ok test tests::ynab_public_demo_imports_duplicate_category_names_by_id ... ok test tests::update_transaction_emits_current_month_overspend_crossing ... ok test tests::bulk_write_balances_equal_one_by_one ... ok test tests::card_models_ignore_arrival_batch_and_timezone ... ok test result: ok. 133 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 984.23s Running tests/import_review.rs (/home/kayg/build/targets/bulkfix3/debug/deps/import_review-6a0b9e5006b57cbf) running 32 tests test csv_bom_mixed_endings_and_decimal_comma_are_exact ... ok test csv_amount_edges_never_round_group_or_overflow ... ok test csv_transaction_ids_merge_or_reject_before_totals ... ok test identity_csv_transfer_growth_curve ... ignored, run with MONEY_IDENT_CSV_ROWS for 10k/100k/1M transfer profiling test corrupt_actual_database_is_a_private_error ... ok test recheck_actual_stream_growth_curve ... ignored, run with MONEY_RECHECK_ARCHIVE and MONEY_RECHECK_ROWS for profiling test recheck_conflicting_transaction_ids_are_rejected ... ok test recheck_csv_transfer_growth_curve ... ignored, run with MONEY_RECHECK_TRANSFERS for the bounded CSV growth probe test recheck_e2e_csv_has_four_checks_and_keeps_every_minor_unit ... ok test recheck_identical_transaction_ids_do_not_double_money ... ok test recheck_reconciled_negative_zero_and_exact_source_scales ... ok test split_identity_cannot_reuse_a_top_level_id ... ok test split_identity_concrete_valid_totals ... ok test split_identity_includes_parent_deleted_and_transfer_fields ... ok test csv_pairing_accepts_cancellation_during_its_loop ... ok test split_identity_rejects_an_inconsistent_embedded_parent ... ok test split_identity_review_cases_reject ... ok test transaction_identity_checks_fields_and_keeps_distinct_ids ... ok test transaction_identity_preserves_exact_units ... ok test split_identity_merges_before_totals ... ok test transfer_legs_prefer_a_same_month_mate ... ok test transfer_month_identity_rejects_in_both_adapters ... ok test transfer_month_review_cases_reject ... ok test unmatched_transfer_legs_keep_the_source_register ... ok test ynab_account_check_rejects_a_wrong_normalization ... ok test ynab_csv_preserves_exact_minor_units ... ok test transfer_month_pairing_keeps_dates_and_exact_pair_priority ... ok test ynab_negative_zero_amount_is_zero ... ok test ynab_unrepresentable_milliunits_are_rejected ... ok test ynab_json_keeps_exact_split_and_transfer_postings ... ok test csv_pairing_keeps_exact_account_legs ... ok test raw_ynab_registers_match_a_raw_row_oracle ... ok test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 9.01s Doc-tests calternal_money running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests calternal_plugin_money running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` `cargo clean`: exit 0. Output, verbatim: ```text Removed 6275 files, 2.6GiB total ``` The scratch origin/dev checkout was removed. Both `apps/web/build` and `apps/web/.svelte-kit/output` are absent. Text logs stay in ignored `artifacts/`; no screenshots, videos or build output were committed. Final head: f39bf92bf37a7538c97f6ed2fd593af388e7e482; R3-1 FIXED; R3-2 FIXED; R3-3 FIXED; R3-4 FIXED; R3-5 FIXED; property: random_histories_conserve_money_after_every_rollover
Author
Owner

Independent Money correctness review round 4 started. Branch job/bulkwrite-1393; base/reviewed head f39bf92bf3. Read binding docs, DESIGN §48, issue body and prior independent reviews; author reports and result files excluded. Product code stays unchanged. Testing raw-account balance conservation, corrected Category conservation, same-date shuffles, four changed pins/records, and wider randomized histories.

Independent Money correctness review round 4 started. Branch job/bulkwrite-1393; base/reviewed head f39bf92bf37a7538c97f6ed2fd593af388e7e482. Read binding docs, DESIGN §48, issue body and prior independent reviews; author reports and result files excluded. Product code stays unchanged. Testing raw-account balance conservation, corrected Category conservation, same-date shuffles, four changed pins/records, and wider randomized histories.
Author
Owner

Independent bulkrev4 review: BLOCK on two accepted-file conservation gaps.

R4-1 — Positive Card opening credit disappears (BLOCK)

Smallest input: no Assignments; one Opening balances row, Card +1 cent on 2026-01-01; empty February. The Opening balances Category has kind:: balance. §48 defines positive Card balances as real money. Correct: Card +1, Ready to Assign +1, all Available 0, L = M = 1 in both months. Actual: Card +1, Ready to Assign 0, all Available 0, L = 0 and M = 1. The one cent remains absent after rollover. Replay::post handles Balance only for Cash, and ignores positive Card credit. This is accepted through the Markdown codec/projection, with a linked valid payment Category. It is an adjacent pre-existing gap, not a demonstrated regression in the R3 fix.

R4-2 — Card without a payment Category removes funded money (BLOCK)

Smallest funded witness: Cash income +1; Food Assignment +1; Card Food purchase -1; empty next month. Omit the optional Card payment category:: property. Core projection accepts the Card. Correct: either reject this metadata before replay or retain the 1 real cent in a payment Category. Actual: Cash 1, Card -1, Food 0, Ready to Assign 0, no Card reserve. L = 0 and M = 1, also after rollover. Replay::post computes funded = 1 and U = 0, but only adds funded to Available inside Some(payment Category). Thus money disappears. This accepted metadata is not sampled by either generator. This is an adjacent pre-existing gap, not a demonstrated regression in the R3 fix.

Wider histories — first result

Seed 139304, 512 histories: two Cards; both Card transfer directions; 20 posting forms; four consecutive active months; same-date shuffle; mixed-sign Card and Cash splits; repeated Category children; real visibility:: hidden; arbitrary debt-relative refunds; expense and payment Assignments. Raw Account sums, full shuffled models, and all 2,048 empty-prefix rollovers passed. The earlier round 3 hidden probe uses hidden:: true, which is an opaque property, not the real visibility:: hidden field. The new probe asserts the parsed visibility before comparing totals. Missing Category identities reject.

Independent bulkrev4 review: BLOCK on two accepted-file conservation gaps. ## R4-1 — Positive Card opening credit disappears (BLOCK) Smallest input: no Assignments; one Opening balances row, Card +1 cent on 2026-01-01; empty February. The Opening balances Category has kind:: balance. §48 defines positive Card balances as real money. Correct: Card +1, Ready to Assign +1, all Available 0, L = M = 1 in both months. Actual: Card +1, Ready to Assign 0, all Available 0, L = 0 and M = 1. The one cent remains absent after rollover. Replay::post handles Balance only for Cash, and ignores positive Card credit. This is accepted through the Markdown codec/projection, with a linked valid payment Category. It is an adjacent pre-existing gap, not a demonstrated regression in the R3 fix. ## R4-2 — Card without a payment Category removes funded money (BLOCK) Smallest funded witness: Cash income +1; Food Assignment +1; Card Food purchase -1; empty next month. Omit the optional Card payment category:: property. Core projection accepts the Card. Correct: either reject this metadata before replay or retain the 1 real cent in a payment Category. Actual: Cash 1, Card -1, Food 0, Ready to Assign 0, no Card reserve. L = 0 and M = 1, also after rollover. Replay::post computes funded = 1 and U = 0, but only adds funded to Available inside Some(payment Category). Thus money disappears. This accepted metadata is not sampled by either generator. This is an adjacent pre-existing gap, not a demonstrated regression in the R3 fix. ## Wider histories — first result Seed 139304, 512 histories: two Cards; both Card transfer directions; 20 posting forms; four consecutive active months; same-date shuffle; mixed-sign Card and Cash splits; repeated Category children; real visibility:: hidden; arbitrary debt-relative refunds; expense and payment Assignments. Raw Account sums, full shuffled models, and all 2,048 empty-prefix rollovers passed. The earlier round 3 hidden probe uses hidden:: true, which is an opaque property, not the real visibility:: hidden field. The new probe asserts the parsed visibility before comparing totals. Missing Category identities reject.
Author
Owner

Independent bulkrev4 progress, head 86a16b87d6. Product head remains f39bf92bf3.

Evidence: 512 wider histories passed 2,560 month models and 2,048 prefix rollovers, complete shuffle equality, raw Account sums and active-month L <= M. Thirteen explicit envelope edge cases passed full hand-computed fields. All eleven original vector outputs passed the independent integer script; pins 10,577 and 41,334 and revised vector records 901a5dc38f13b647 / e6d77a36b9ded73d are correct. The Money core gate passed, including B1 2/2 and N2 24/24 permutations. Plugin gate remains in its Card model test; bulk_write_balances_equal_one_by_one has passed.

R4-1 and R4-2 remain BLOCK: accepted positive Card opening credit and accepted unlinked Card purchases each lose one cent in their smallest witness. Both generated initialization/metadata extensions shrink to n = 1. No product code or old test expectation changed. Independent probe/numeric-check slices are committed. Final report will include both complete gate outputs verbatim.

Independent bulkrev4 progress, head 86a16b87d60725175842363c29112c91d7f05103. Product head remains f39bf92bf37a7538c97f6ed2fd593af388e7e482. Evidence: 512 wider histories passed 2,560 month models and 2,048 prefix rollovers, complete shuffle equality, raw Account sums and active-month L <= M. Thirteen explicit envelope edge cases passed full hand-computed fields. All eleven original vector outputs passed the independent integer script; pins 10,577 and 41,334 and revised vector records 901a5dc38f13b647 / e6d77a36b9ded73d are correct. The Money core gate passed, including B1 2/2 and N2 24/24 permutations. Plugin gate remains in its Card model test; bulk_write_balances_equal_one_by_one has passed. R4-1 and R4-2 remain BLOCK: accepted positive Card opening credit and accepted unlinked Card purchases each lose one cent in their smallest witness. Both generated initialization/metadata extensions shrink to n = 1. No product code or old test expectation changed. Independent probe/numeric-check slices are committed. Final report will include both complete gate outputs verbatim.
Author
Owner

Independent bulkrev4 final report. Head 82087a0163a30f66a9bd190ad2e67db412f760c7. Reviewed product head f39bf92bf37a7538c97f6ed2fd593af388e7e482. Verdict: BLOCK R4-1, R4-2.

Independent Money number review — bulkrev4, #1393

BLOCK: R4-1 and R4-2. Both accepted inputs remove real budget money.

Reviewed product head: f39bf92bf37a7538c97f6ed2fd593af388e7e482.
Branch: job/bulkwrite-1393. Required fetch/merge of origin/dev: Already up to date. The author reports and result files were not read. Only prior independent reviews were used. All amounts are synthetic test cents. No product code, dependency, lockfile or existing expectation changed. The probe/evidence commit is 86a16b87d60725175842363c29112c91d7f05103; the final issue comment identifies the report commit.

Built and files

  • tests/money/bulkrev4-probe.rs: standalone exact-number probes, 512 wider generated histories, 13 hand-computed edge cases, bounds, real hidden visibility and two known-failing shrink properties.
  • tests/money/bulkrev4-probe.sh: compile and run the probe against crate-gate artifacts. Run after the Money gate. Known failures need --ignored.
  • tests/money/bulkrev4-numbers.py: independent integer checks of every stored field in the eleven original vectors, both burst pins and both revised vector records.
  • tests/money/bulkrev4-review.md: this review and verbatim gate evidence.
  • artifacts/bulkrev4-findings.md: findings appended during the review. It stays gitignored.

Invariant and scope

DESIGN §48 defines M as Cash balances plus positive Card balances. L is Ready to Assign plus all signed Category Available, including payment Categories once. U is current-month unfunded Card spending that refunds or real Category inflows have not canceled. For Cash income and the on-budget expense, refund, payment and transfer forms under review, L + U = M. Add cumulative import Ready to Assign adjustments to M when present. At rollover U resets. Only the cash part of a negative Available reduces Ready to Assign. With no new transactions, L = M, even after underfunded histories. Negative Card balances are debt, not negative budget money.

Each Account also equals the exact raw sum of its ordinary and transfer legs through each month. These checks do not use derived reserves to predict Account balances. Full same-date models and acceptance must be independent of file order.

The widened generator checks raw Account sums and L <= M at every month, plus exact L = M after every prefix rollover. The hand cases also check L + U = M with independently known U. U is private replay state, so the random probe does not independently assert its exact current-month value. That is a test limit, not a claim that arbitrary current-month differences are defects.

BLOCK R4-1: positive Card opening credit disappears

Minimal accepted input: one active Card with a valid payment Category; no Assignments; one Opening balances row +0.01 USD on January 1; empty February. The Category has kind:: balance.

Correct under §48: Card +1; Ready to Assign +1; all Available 0. L = M = 1 in January and February. Actual: Card +1; Ready to Assign 0; all Available 0. L = 0, M = 1. The loss survives rollover. The create_account route accepts a positive Card opening_balance, creates its payment Category and writes this Opening balances row. Thus the route source permits the same failing input. This reachability statement is an inference from source, not a separate live HTTP probe.

Replay::post returns from the Balance branch without crediting positive Card balances. The property generated_opening_credit_conserves shrank to n = 1. This is an adjacent pre-existing gap. This review does not claim the R3 patch introduced it. It still meets the requested BLOCK rule: accepted input loses real budget money.

Minimal funded input: Cash income +1; Food Assignment +1; Card Food purchase -1; empty February. Omit the Card's optional payment category:: property. The public codec/projection accepts that metadata.

Correct: reject the unusable Card metadata before calculating, or retain the real cent in its payment Category. Actual: Cash 1; Card -1; Food 0; Ready to Assign 0; no Card reserve. L = 0, M = 1 in both months.

Replay::post computes one funded cent and no virtual deficit, but adds reserve only when a payment Category exists. The cent is removed from Food without a destination. generated_unlinked_card_conserves shrank to n = 1. This is also an adjacent pre-existing gap, not a demonstrated regression of the R3 patch.

Previous B1, N2 and changed numbers

B1 passes both same-date permutations. Cash income 20,000; Food and Dining Assignments 10,000 each; Food purchase -10,000 on March 28; Dining -10,000 on March 29; payment 10,000 and Food refund 10,000 on March 31. Correct final Food 10,000; Dining 0; reserve 0; Ready to Assign 0; Cash 10,000; Card 0. March and April each allocate exactly 10,000.

N2 passes all 24 same-date permutations. Let E = MAX_EXACT = 9,007,199,254,740,991. Cash opening income and Food Assignment are E-1. Same-date Cash Food -E; Cash split parent +1 with Food -1 and Dining +2; Cash Food +E; Card Dining -1. Correct Cash E; Card -1; Food E-2; Dining 1; reserve 1; Ready to Assign 0. Canonical pre-pass order accepts all orders.

Both changed burst pins are correct. March Card refunds = 361 + 1,648 + 7,463 = 9,472 cancel old debt. March Food = 15,000 + 432 - 1,768 - 2,813 = 10,851. April Food = 10,851 + 6,775 - 9,046 + 2,572 = 11,152; reserve = 9,046 - 2,572 = 6,474. October Cash activity = -22,049, leaving 11,152 + 15,000 - 22,049 = 4,103 for Card funding. Card purchases total 19,230. The 7,133 refund cancels current virtual deficit and does not release reserve. Correct reserve = 6,474 + 4,103 = 10,577. November raw debt = 51,911; correct uncovered = 51,911 - 10,577 = 41,334.

Changed record 901a5dc38f13b647 is correct. February returns 50,505 retail, 1,768 fees and 318 tax reduce retired unfunded debt. No positive reserve exists. February Available: retail 0; fees -15,151; tax -(2,727 + 182 + 400) = -3,309; interest -(1,010 + 2,222) = -3,232; payment 0. Raw debt and uncovered are 366,524. Correct reserve is 0.

Changed record e6d77a36b9ded73d is correct. Cash openings and income = 1,150,500; Assignments = 560,500; Amex purchases = 9,853; payment = 20,000; new positive credit = 10,147. Correct Ready to Assign = 1,150,500 - 560,500 + 10,147 = 600,147.

All eleven earlier reference vectors remain correct, including every stored output field. S = 1,000,000,000,000 is assigned to both Food and Dining. A is Food purchase/full refund, B is Dining purchase, P is payment. Canonical order puts Dining before Food. Reserve = max(B-P,0); Food = S; Dining = S-B; Ready to Assign = -2S; Cash = -P; Card = P-B; Savings and uncovered are 0. Food activity = 0; Dining activity = -B; payment activity = -P. The Python check derives these numbers from input fields and constructs the full output. The Rust vectors gate independently checks production replay equality.

Vector A B P Correct reserve
07b33aa56ff97a67 13222722 108 13222755 0
08d823459b4f7555 1 1 1 0
10dad10f207e3966 13222722 1 13222722 0
217b597cc7b1b339 109170509 1000000000 110838733 889161267
3c10364db1d4cd46 109170509 1 109170509 0
405bf72849418ee7 28500 1 28500 0
5cd63c6abac2f757 103816 1 103816 0
70887b8579a61566 5789 1035233 55551 979682
aa06a27413c2238d 103816 454 103879 0
de05e2804212ba0e 5789 1 5789 0
f161754b530689ba 28500 8319 31192 0

Requested envelope cases

Each case starts with Cash income 200. Unless stated otherwise, Dining and the Other Card stay at zero. All rows below match production in March, April and May.

Case Correct §48 result Comparison
Underfunded Card purchase and partial refund Food Assignment 50, buy 100, refund 50: Food 0, reserve 50, Ready to Assign 150, Cash 200, Card -50. Refund cancels U first. Matches.
Overspent Cash Category Food Assignment 50, Cash spend 100: March Food -50 and Ready to Assign 150; April Food 0 and Ready to Assign 100; Cash 100. Matches.
Mixed Cash and Card deficit Food Assignment 50, Cash spend 100, Card buy 100, Card refund 100: March Food -50, reserve 0, Ready to Assign 150, Cash 100, Card 0; April Ready to Assign 100. Matches.
Refund above debt Food Assignment 100, Card buy 100, refund 150: Food 150, reserve 0, Ready to Assign 100, Cash 200, Card +50. L = M = 250. Matches.
Unfunded refund in later month No Assignment, March Card buy 100, April refund 100: March Food -100, U 100; April Food 0, reserve 0, Ready to Assign 200, Card 0. Matches.
Partly funded refund in later month Food Assignment 50, March buy 100, April refund 50: March Food -50, reserve 50; April Food 50, reserve 0, Ready to Assign 150, Card -50. Matches.
Funded refund in later month Food Assignment 100, March buy 100, April refund 100: April Food 100, reserve 0, Ready to Assign 100, Cash 200, Card 0. Matches.
Refund after full payment Food Assignment 100, buy 100, pay 100, refund 100: Food 100, reserve 0, Ready to Assign 100, Cash 100, Card +100. Matches.
Partial payment then refund Food and Dining Assignments 100 each; buy 100 in each; pay 50; Food refund 100: Food 100, Dining 0, reserve 50, Ready to Assign 0, Cash 150, Card -50. Matches.
Split refunds Same Assignments/purchases; pay 150; split refund Food 100 and Dining 100: Food 100, Dining 100, reserve 0, Ready to Assign 0, Cash 50, Card +150. Only the first 50 reduces debt. Matches.
Transfer debt between Cards Food Assignment 100, Card buy 100, general transfer 100 from Other to Card: original reserve 100, Other reserve 0, Ready to Assign 100, Cash 200, Card 0, Other -100. Categories do not move. Matches.
Transfer into positive Card credit General transfer 100 from zero Card to zero Other: Ready to Assign 300, Cash 200, Card -100, Other +100; Categories unchanged. Matches.
Spend positive Card credit No Assignment; Card refund 50 then buy 50: Food 0, reserve 0, Ready to Assign 200, Card 0. Matches.
Return to hidden Category Actual visibility:: hidden parses as hidden and retains the same totals as visible. Matches.
Return to deleted identity Remove the linked Category identity; projection rejects the dangling reference. Rejects; no accepted wrong totals.

Generator coverage

The existing seed-139303 property has two Cards, both Card transfer directions, refunds unconstrained by debt, later refunds, Cash refunds, Card splits and three active months. It inserts an empty month after every active month. It does not exercise consecutive active months, mixed-sign splits, Cash splits, repeated children, real hidden visibility, payment Assignments, opening Card credit or a missing payment link. The earlier hidden check uses opaque hidden:: true; the new probe verifies actual parsed visibility:: hidden.

The new seed-139304 property ran 512 histories with up to 64 random rows, four consecutive active months, two Cards, 20 posting forms, Cash and Card purchases/refunds, split purchases/refunds, mixed-sign Cash/Card splits, repeated Category children, both Card transfer directions, overpayments, arbitrary debt-relative refunds, hidden Categories and positive/negative expense/payment Assignments. It checked 2,560 month models, 2,048 prefix rollovers, raw Account sums and complete shuffled models. All passed in the linked-Card, zero-opening-balance domain. No generated money excess or loss was found in that domain.

Separate initialization/metadata extensions found R4-1 and R4-2. Both shrink to one cent. The failures survive rollover. They are outside the passing property's fixed metadata.

Exact bounds: i64::MIN, i64::MAX and values just outside ±MAX_EXACT reject. Supported ±MAX_EXACT round-trip and conserve in Cash histories. N2 checks acceptance at the supported bound in every same-date order. A zero-parent Card split with an internal cursor of 2 * MAX_EXACT also conserves. This is not exhaustive testing near every intermediate bound.

Decisions, known gaps and merge round

No product design decision was made. This review applies §48's positive-Card and allocation equations to every accepted input. The design does not state how a Card without a payment link must behave. R4-2 therefore accepts either an early validation error or correct reserve accounting as a remedy; silently losing money is not a valid result.

Known gaps: R4-1 and R4-2 remain unfixed because this job forbids product changes. The probes use the real codec/projection/replay, not new HTTP checks. Random U is not exposed, so exact current-month U is checked only in the hand cases. Tracking transfers, Card income, import reconciliation and every integer intermediate are not covered by the new random property. Existing gates cover their existing contracts; this review makes no new universal claim for them. No UI, performance route or background job was changed; no screenshots or new bench profile were needed. No dependencies were added.

For the merge round: do not merge until both accepted-file conservation gaps have a fix or an explicit owner disposition. Turn the two standalone shrink properties into normal regressions with the fixes. Rerun tests/money/bulkrev4-probe.sh --ignored --nocapture --test-threads=1 after the Money crate gate; both must conserve or reject unusable metadata. No requested correctness scenario was deferred.

Gates and cleanup

Both required crates were tested once, separately, with CARGO_BUILD_JOBS=4, CARGO_PROFILE_DEV_DEBUG=line-tables-only, CARGO_INCREMENTAL=0 and TMPDIR=<worktree>/target/tmp. The configured CARGO_TARGET_DIR was not changed. calternal-money: 68 passed, 1 ignored. calternal-plugin-money: 162 passed, 5 ignored, plus the parent-invoked child check. Existing ignored tests were not changed. No suite was restarted. No crate code changed, so no new crate clippy gate was needed. cargo fmt --check: exit 0, no output. The standalone Rust probe was formatted with rustfmt. Shell syntax was checked and the independent Python arithmetic script ran successfully.

Gate output below is verbatim. These green existing gates do not cover the two accepted-input defects.

cargo test -p calternal-money

    Blocking waiting for file lock on build directory
   Compiling calternal-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-money)
    Finished `test` profile [unoptimized + debuginfo] target(s) in 2m 33s
     Running unittests src/lib.rs (/home/kayg/build/targets/bulkrev4/debug/deps/calternal_money-8e1c5faea8a31672)

running 16 tests
test edit::tests::cleared_tag_toggles_without_touching_other_tags ... ok
test units::tests::exact_range_is_enforced_on_parse_and_arithmetic ... ok
test units::tests::format_uses_explicit_sign_and_exact_scale ... ok
test codec::tests::empty_payee_is_refused_by_the_writer ... ok
test units::tests::parse_matches_the_oracle_examples ... ok
test units::tests::scale_table_has_all_165_codes_with_unique_entries ... ok
test edit::tests::unicode_payee_tag_boundaries_match_shared_vectors ... ok
test codec::tests::transaction_round_trip_with_punctuation_in_labels_and_payee ... ok
test codec::tests::malformed_dated_rows_fail_instead_of_vanishing ... ok
test codec::tests::round_trip_keeps_bom_crlf_and_unknown_bytes ... ok
test codec::tests::property_edit_changes_one_value ... ok
test edit::tests::crlf_file_keeps_crlf_on_insert ... ok
test units::independent_number_review::signed_edges_and_long_zero_padding_keep_exact_minor_units ... ok
test edit::tests::new_budget_projects_with_no_accounts ... ok
test edit::tests::assign_inserts_updates_and_removes_rows ... ok
test codec::tests::checked_parse_stops_after_a_bounded_line_batch ... ok

test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

     Running tests/account_kinds.rs (/home/kayg/build/targets/bulkrev4/debug/deps/account_kinds-00e7b51263e77447)

running 5 tests
test account_projection_rejects_legacy_and_unknown_kinds ... ok
test imported_account_kinds_project_without_losing_identity ... ok
test tracking_deficit_rollover_does_not_reduce_ready_to_assign ... ok
test off_budget_balance_marker_does_not_change_budget_money ... ok
test categorized_debit_loan_transfers_post_one_budget_leg ... ok

test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s

     Running tests/import.rs (/home/kayg/build/targets/bulkrev4/debug/deps/import-c98cac474afc94ca)

running 13 tests
test recheck_half_minor_units_negative_zero_and_nineteen_digits ... ok
test duplicate_source_ids_are_rejected_and_duplicate_names_are_kept ... ok
test import_stream_renderer_matches_full_rendered_files ... ok
test import_keeps_same_day_source_order_for_credit_payments_and_refunds ... ok
test production_v1_metadata_upgrade_keeps_balances ... ok
test import_render_is_exact_and_byte_stable ... ok
test import_render_reports_progress_and_propagates_cancel ... ok
test import_replay_matches_full_ledger_month_by_month ... ok
test budget_replay_stops_at_a_bounded_transaction_checkpoint ... ok
test imported_ready_to_assign_matches_independent_month_oracle ... ok
test recheck_same_day_payment_and_refund_keep_source_fifo ... ok
test random_imports_conserve_source_balances_and_markdown ... ok
test recheck_random_multicurrency_ledgers_match_all_monthly_totals ... ok

test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 9.11s

     Running tests/properties.rs (/home/kayg/build/targets/bulkrev4/debug/deps/properties-1c9f06dab7df6a6f)

running 21 tests
test bulkrev2::literal_account_sum_and_funded_card_conservation ... ok
test bulkrev2::split_refund_keeps_payment_overfunding_when_card_becomes_positive ... ok
test bulkrev2::boundary_shuffle_reports_acceptance_difference ... ok
test bulkrev2::refund_payment_calendar_choice_is_visible_next_month ... ok
test money_code_never_uses_floating_point ... ok
test bill_coverage_never_clamps_the_bill ... ok
test reviewed_burst_order_matches_input_order ... ok
test bulkrev2::i64_extremes_are_rejected_and_safe_bound_is_exact ... ok
test any_text_that_parses_serializes_to_the_same_bytes ... ok
test decimal_text_round_trips_for_every_scale ... ok
test transaction_rows_round_trip_byte_for_byte ... ok
test split_legs_post_exactly_the_parent ... ok
test paired_write_replay_matches_independent_calculations ... ok
test partial_payment_then_category_refunds_conserve_cash_across_months ... ok
test mixed_cash_credit_deficit_rolls_only_its_cash_part ... ok
test assign_then_unassign_is_the_identity ... ok
test cash_ledgers_conserve_money_every_month ... ok
test same_date_card_postings_are_a_function_of_the_set ... ok
test fully_funded_card_spending_conserves_cash ... ok
test bulkrev2::funded_shuffles_conserve_real_money_every_month ... ok
test bulkrev2::same_day_shuffles_cover_splits_transfers_and_month_edges ... ok

test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.31s

     Running tests/ready_to_assign_adjustment.rs (/home/kayg/build/targets/bulkrev4/debug/deps/ready_to_assign_adjustment-55e8528f73b12e49)

running 1 test
test ready_to_assign_adjustment_changes_only_the_budget_pool ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s

     Running tests/review_984.rs (/home/kayg/build/targets/bulkrev4/debug/deps/review_984-155e2c131b561571)

running 5 tests
test review_pair_performance_profile ... ignored, performance measurements belong to the merge round on the perf VM
test review_pair_rejects_bad_months_and_amounts_without_rounding ... ok
test review_split_remainders_and_tracking_transfers_are_exact ... ok
test review_mixed_pair_matches_independent_replays ... ok
test review_large_ledger_pair_keeps_exact_totals ... ok

test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 2.86s

     Running tests/review_bulkrev3.rs (/home/kayg/build/targets/bulkrev4/debug/deps/review_bulkrev3-97fae80e3ad4b8d3)

running 4 tests
test hidden_and_missing_categories ... ok
test envelope_edge_cases ... ok
test previous_witnesses_all_orders ... ok
test random_histories_conserve_money_after_every_rollover ... ok

test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.19s

     Running tests/vectors.rs (/home/kayg/build/targets/bulkrev4/debug/deps/vectors-6a9e51ba3117ddc1)

running 4 tests
test rust_matches_random_oracle_ledgers_without_divergences ... ok
test reviewed_eleven_refund_vectors_keep_their_exact_numbers ... ok
test reviewed_r3_vectors_assert_retired_debt_and_positive_credit ... ok
test rust_port_matches_every_recorded_oracle_vector ... ok

test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.52s

   Doc-tests calternal_money

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

cargo test -p calternal-plugin-money

    Blocking waiting for file lock on build directory
   Compiling proc-macro2 v1.0.107
   Compiling quote v1.0.47
   Compiling memchr v2.8.3
   Compiling futures-core v0.3.34
   Compiling pin-project-lite v0.2.17
   Compiling jobserver v0.1.35
   Compiling shlex v2.0.1
   Compiling find-msvc-tools v0.1.13
   Compiling serde_core v1.0.229
   Compiling log v0.4.34
   Compiling bytes v1.12.1
   Compiling cc v1.4.7
   Compiling once_cell v1.21.4
   Compiling stable_deref_trait v1.2.1
   Compiling version_check v0.9.5
   Compiling syn v3.0.6
   Compiling pkg-config v0.3.34
   Compiling serde v1.0.229
   Compiling syn v2.0.119
   Compiling socket2 v0.6.5
   Compiling equivalent v1.0.2
   Compiling synstructure v0.14.0
   Compiling zerovec-derive v0.11.6
   Compiling displaydoc v0.2.7
   Compiling serde_derive v1.0.229
   Compiling hashbrown v0.17.1
   Compiling litemap v0.8.3
   Compiling zerofrom-derive v0.1.8
   Compiling yoke-derive v0.8.4
   Compiling zerofrom v0.1.8
   Compiling writeable v0.6.4
   Compiling utf8_iter v1.0.4
   Compiling icu_normalizer_data v2.3.0
   Compiling tracing-attributes v0.1.31
   Compiling generic-array v0.14.9
   Compiling tracing-core v0.1.36
   Compiling yoke v0.8.3
   Compiling typenum v1.20.1
   Compiling futures-io v0.3.34
   Compiling zerovec v0.11.8
   Compiling zerotrie v0.2.5
   Compiling icu_properties_data v2.3.0
   Compiling futures-task v0.3.34
   Compiling scopeguard v1.2.0
   Compiling tinystr v0.8.4
   Compiling potential_utf v0.1.6
   Compiling tracing v0.1.44
   Compiling icu_locale_core v2.3.0
   Compiling icu_collections v2.3.0
   Compiling mio v1.2.3
   Compiling errno v0.3.14
   Compiling futures-sink v0.3.34
   Compiling icu_provider v2.3.1
   Compiling percent-encoding v2.3.2
   Compiling signal-hook-registry v1.4.8
   Compiling lock_api v0.4.14
   Compiling tokio-macros v2.7.2
   Compiling smallvec v1.16.1
   Compiling tokio v1.53.1
   Compiling icu_properties v2.3.0
   Compiling serde_json v1.0.151
   Compiling indexmap v2.14.2
   Compiling num-traits v0.2.19
   Compiling parking_lot_core v0.9.12
   Compiling slab v0.4.12
   Compiling form_urlencoded v1.2.2
   Compiling getrandom v0.4.3
   Compiling futures-macro v0.3.34
   Compiling rand_core v0.10.1
   Compiling futures-util v0.3.34
   Compiling cmake v0.1.58
   Compiling dunce v1.0.5
   Compiling fs_extra v1.3.0
   Compiling vcpkg v0.2.15
   Compiling thiserror-impl v2.0.21
   Compiling http v1.5.0
   Compiling siphasher v1.0.3
   Compiling aws-lc-sys v0.45.0
   Compiling crossbeam-utils v0.8.23
   Compiling spin v0.9.9
   Compiling hybrid-array v0.4.15
   Compiling foldhash v0.2.0
   Compiling cpufeatures v0.2.17
   Compiling allocator-api2 v0.2.21
   Compiling base64 v0.22.1
   Compiling hashbrown v0.16.1
   Compiling icu_normalizer v2.3.0
   Compiling parking v2.2.1
   Compiling rustversion v1.0.23
   Compiling zeroize v1.9.0
   Compiling aws-lc-rs v1.18.1
   Compiling crc-catalog v2.5.0
   Compiling event-listener v5.4.2
   Compiling idna_adapter v1.2.2
   Compiling crc v3.4.0
   Compiling crossbeam-queue v0.3.14
   Compiling hashlink v0.11.1
   Compiling crypto-common v0.1.6
   Compiling block-buffer v0.10.4
   Compiling http-body v1.1.0
   Compiling futures-channel v0.3.34
   Compiling simd-adler32 v0.3.10
   Compiling thiserror v2.0.21
   Compiling httparse v1.10.1
   Compiling parking_lot v0.12.5
   Compiling digest v0.10.7
   Compiling idna v1.1.0
   Compiling rustls-pki-types v1.15.1
   Compiling crypto-common v0.2.2
   Compiling libsqlite3-sys v0.37.0
   Compiling cpufeatures v0.3.1
   Compiling crc32fast v1.5.2
   Compiling iana-time-zone v0.1.65
   Compiling tower-service v0.3.3
   Compiling either v1.18.0
   Compiling chrono v0.4.45
   Compiling url v2.5.8
   Compiling tokio-stream v0.1.19
   Compiling sha2 v0.10.9
   Compiling futures-intrusive v0.5.0
   Compiling tokio-util v0.7.19
   Compiling rustls v0.23.45
   Compiling atomic-waker v1.1.2
   Compiling adler2 v2.0.1
   Compiling try-lock v0.2.5
   Compiling rand_core v0.6.4
   Compiling untrusted v0.9.0
   Compiling sqlx-core v0.9.0
   Compiling want v0.3.1
   Compiling rand v0.8.8
   Compiling rustls-webpki v0.103.15
   Compiling h2 v0.4.19
   Compiling atoi v2.0.0
   Compiling futures-executor v0.3.34
   Compiling flume v0.12.0
   Compiling inout v0.2.2
   Compiling phf_shared v0.11.3
   Compiling blake3 v1.8.7
   Compiling sync_wrapper v1.0.2
   Compiling tower-layer v0.3.3
   Compiling subtle v2.6.1
   Compiling httpdate v1.0.3
   Compiling ryu v1.0.23
   Compiling cmov v0.5.4
   Compiling ipnet v2.12.2
   Compiling hyper v1.11.1
   Compiling ctutils v0.4.2
   Compiling phf_generator v0.11.3
   Compiling sqlx-sqlite v0.9.0
   Compiling miniz_oxide v0.9.1
   Compiling encoding_rs v0.8.41
   Compiling multiversion-macros v0.9.0
   Compiling block-buffer v0.12.1
   Compiling phf_shared v0.12.1
   Compiling heck v0.5.0
   Compiling chrono-tz v0.10.4
   Compiling dotenvy v0.15.7
   Compiling arrayvec v0.7.8
   Compiling hex v0.4.3
   Compiling inotify-sys v0.1.8
   Compiling zlib-rs v0.6.8
   Compiling constant_time_eq v0.4.2
   Compiling sqlx-macros-core v0.9.0
   Compiling flate2 v1.1.10
   Compiling phf v0.12.1
   Compiling cipher v0.5.2
   Compiling multiversion v0.9.0
   Compiling phf_macros v0.11.3
   Compiling universal-hash v0.6.1
   Compiling hyper-util v0.1.20
   Compiling tower v0.5.3
   Compiling http-body-util v0.1.5
   Compiling multer v3.1.0
   Compiling linkme-impl v0.3.37
   Compiling openssl-probe v0.2.1
   Compiling mime v0.3.17
   Compiling core_detect v1.0.0
   Compiling unicode-joining-type v1.0.0
   Compiling simdutf8 v0.1.5
   Compiling multiversion_no_op v1.0.0
   Compiling rustls-native-certs v0.8.4
   Compiling phf v0.11.3
   Compiling poly1305 v0.9.1
   Compiling chacha20 v0.10.2
   Compiling sqlx-macros v0.9.0
   Compiling tokio-rustls v0.26.6
   Compiling aead v0.6.1
   Compiling miniz_oxide v0.8.9
   Compiling fdeflate v0.3.7
   Compiling utoipa-gen v6.0.1
   Compiling aho-corasick v1.1.5
   Compiling linkme v0.3.37
   Compiling pulldown-cmark v0.13.4
   Compiling calternal-path v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-path)
   Compiling zune-core v0.5.3
   Compiling winnow v0.7.15
   Compiling quick-error v2.0.1
   Compiling pxfm v0.1.30
   Compiling byteorder-lite v0.1.0
   Compiling same-file v1.0.6
   Compiling color_quant v1.1.0
   Compiling weezl v0.1.12
   Compiling walkdir v2.5.0
   Compiling moxcms v0.8.1
   Compiling image-webp v0.2.4
   Compiling gif v0.14.2
   Compiling cron v0.17.0
   Compiling zune-jpeg v0.5.15
   Compiling utoipa v6.0.0
   Compiling regex-automata v0.4.18
   Compiling png v0.18.1
   Compiling chacha20poly1305 v0.11.0
   Compiling hyper-rustls v0.27.10
   Compiling inotify v0.11.5
   Compiling sqlx v0.9.0
   Compiling rustls-platform-verifier v0.7.0
   Compiling axum-core v0.5.6
   Compiling tower-http v0.6.11
   Compiling serde_urlencoded v0.7.1
   Compiling uuid v1.26.1
   Compiling notify-types v2.1.0
   Compiling serde_path_to_error v0.1.20
   Compiling base64 v0.23.1
   Compiling unicode-properties v0.1.4
   Compiling matchit v0.8.4
   Compiling unsafe-libyaml v0.2.11
   Compiling bytemuck v1.25.2
   Compiling unicase v2.9.0
   Compiling bumpalo v3.20.3
   Compiling unicode-casefold v0.2.0
   Compiling image v0.25.10
   Compiling zopfli v0.8.3
   Compiling calternal-fs v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-fs)
   Compiling serde_yaml v0.9.34+deprecated
   Compiling axum v0.8.9
   Compiling reqwest v0.13.5
   Compiling tempfile v3.27.0
   Compiling notify v8.2.0
   Compiling calternal-db v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-db)
   Compiling regex v1.13.1
   Compiling calternal-api v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-api)
   Compiling csv-core v0.1.13
   Compiling quick-xml v0.42.0
   Compiling rusty-fork v0.3.1
   Compiling csv v1.4.0
   Compiling calternal-plugin v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-plugin)
   Compiling calternal-notes-core v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-notes-core)
   Compiling calternal-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-money)
   Compiling zip v5.1.1
   Compiling proptest v1.11.0
   Compiling calternal-plugin-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/plugins/money)
    Finished `test` profile [unoptimized + debuginfo] target(s) in 5m 44s
     Running unittests src/lib.rs (/home/kayg/build/targets/bulkrev4/debug/deps/calternal_plugin_money-3d165b6d3890a332)

running 135 tests
test import::import_review_tests::actual_stream_memory_guard_child ... ignored, invoked as an isolated child by actual_stream_keeps_a_large_history_bounded
test import::import_review_tests::actual_cents_conversion_never_rounds ... ok
test import::import_review_tests::actual_cc_label_requires_missing_type_confirmation ... ok
test import::import_review_tests::actual_orphan_split_children_are_rejected ... ok
test import::import_review_tests::actual_transfer_legs_cannot_cross_months ... ok
test import::import_review_tests::actual_account_checks_use_raw_monthly_source_rows ... ok
test import::import_review_tests::import_control_reports_progress_and_stops_cancelled_work ... ok

running 1 test
test routes::import_cleanup_tests::dropped_preview_worker_retains_admission_until_exit ... ok
test routes::import_staged_path_tests::staged_import_name_cannot_select_another_path_or_slot ... ok
test routes::import_cleanup_tests::staged_import_files_keep_ranges_and_release_private_storage ... ok
test routes::replay_reuse_tests::crossings_reuse_checked_current_totals_even_with_future_months ... ok
test import::import_review_tests::ynab_transfer_pairing_handles_many_duplicate_legs ... ok
test import_fidelity_1130::independent_split_and_transfer_numbers_check ... ok
test routes::import_cleanup_tests::idle_imports_are_reclaimed_by_expiry_cleanup ... ok
test routes::durable::checkpoint_tests::progress_wait_keeps_parser_writer_release_polled ... ok
test routes::durable::admission_tests::cancelled_receiver_cannot_acknowledge_a_durable_job ... ok
test routes::review_1140::cancel_wins_before_publication_lock ... ok
test routes::replay_reuse_tests::assignment_retry_rebuilds_from_latest_source_bytes ... ok
test routes::replay_reuse_tests::crossings_cover_source_ranges_relative_to_today ... ok
test routes::review_1140::cancel_does_not_rewrite_published_result ... ok
test routes::review_1140::review1140_operational_cancel_before_replacement_returns_no_receipt ... ok
test store::parsed_cache_tests::global_budget_and_folder_pruning_release_stale_entries ... ok
test store::parsed_cache_tests::parse_charge_accounts_for_line_structures ... ok
test store::parsed_cache_tests::user_cache_evicts_old_parse_entries_and_shares_hot_documents ... ok
test routes::review_1140::review1140_staged_size_limits_fail_without_publishing ... ok
test routes::review_1140::review1140_tcp_malformed_inputs_leave_worker_usable ... ok
test routes::review_1140::review1140_terminal_receipts_do_not_block_new_imports ... ok
test routes::review_1140::review1140_cancel_after_rename_before_receipt_keeps_publication ... ok
test tests::a_new_user_sees_the_real_empty_state ... ok
test tests::active_money_handle_survives_other_users_cache_pressure ... ok
test tests::actual_duplicate_names_import_by_id_without_sharing_a_payment_category ... ok
test tests::actual_export_archive_imports_exact_rows_from_private_scratch ... ok
test routes::review_1140::review1140_discard_after_confirmation_failure_releases_admission ... ok
test import_fidelity_1130::actual_rows_round_trip ... ok
test tests::a_broken_file_is_reported_not_hidden ... ok
test tests::a_read_waits_for_a_write_in_progress ... ok
test tests::api_account_numbers_equal_core_replay ... ok
test routes::durable::admission_tests::live_publication_honors_operational_queue_cancellation ... ok
test tests::a_split_row_written_by_hand_is_read_but_not_edited ... ok
test tests::a_journal_for_a_completed_move_changes_nothing ... ok
test tests::cancel_racing_confirm_has_one_consistent_outcome ... ok
test tests::assignments_retry_source_conflicts_without_losing_neighbours ... ok
test tests::cancelling_imports_leaves_no_budget_and_releases_slots ... ok
test routes::review_1140::review1140_all_formats_replay_exact_balances ... ok
test tests::csv_import_keeps_progress_and_cancel_responsive ... ok
test tests::backdated_create_emits_current_month_overspend_crossing ... ok
test tests::bulk_write_month_does_not_need_note_date_backfill ... ok
test tests::bulk_write_invalid_neighbours_do_not_change_valid_rows ... ok
test tests::durable_import_tests::operation_exit_child ... ignored, child of operation_recovery_survives_process_exit_at_every_phase
test tests::bulk_write_rejects_intermediate_overflow ... ok
test tests::concurrent_store_edits_keep_exactly_one_winner ... ok
test tests::budget_flow_writes_exact_markdown_and_derives_available ... ok
test tests::denied_preview_access_keeps_the_owners_pending_import ... ok
test routes::review_1140::review1140_replacement_receipt_recovery_does_not_adopt_later_edits ... ok
test tests::durable_import_tests::receipt_reads_are_bounded_and_old_receipts_are_addressable ... ok
test tests::delete_transaction_emits_current_month_overspend_crossing ... ok
test tests::durable_import_tests::replay_preserves_a_live_ready_preview ... ok
test tests::durable_import_tests::running_jobs_do_not_expire_and_cancelled_jobs_do_not_restart ... ok
test tests::durable_import_tests::publication_and_inverse_authority_use_full_commits ... ok
test tests::durable_import_tests::queued_import_and_undo_survive_restarts ... ok
test routes::durable::money_import_undo_mutation ... ok
test tests::durable_import_tests::undo_receipt_replay_never_removes_a_restored_import ... ok
test tests::durable_import_tests::undo_refuses_a_predecessor_restored_before_the_inverse ... ok
test tests::far_month_assignment_cannot_make_the_budget_unreadable ... ok
test tests::failed_cross_month_move_never_counts_the_row_twice ... ok
test tests::durable_import_tests::undo_restarts_before_and_after_the_filesystem_inverse ... ok
test tests::gap_month_assignments_and_opening_card_debt_do_not_create_cash ... ok
test tests::import_file_limits_match_the_money_reader ... ok
test tests::historical_overspend_does_not_emit_current_month_event ... ok
test tests::hostile_inputs_are_rejected_without_writing ... ok
test tests::import_preview_is_owner_bound_and_confirmation_publishes_once ... ok
test tests::memo_and_tags_split_the_payee_without_losing_text ... ok
test tests::money_is_on_for_the_instance_and_off_for_a_new_user ... ok
test tests::import_preview_reads_only_generated_staged_upload_names ... ok
test tests::inferred_opening_balance_needs_explicit_confirmation ... ok
test tests::import_fidelity_review_requires_account_kind_and_keeps_notes ... ok
test tests::month_revision_increases_after_each_assignment ... ok
test tests::other_users_and_sessions_without_data_scope_see_nothing ... ok
test tests::multiple_assignment_rows_set_one_exact_total ... ok
test tests::move_money_keeps_ready_to_assign_and_card_gets_payment_category ... ok
test tests::overflowing_category_sum_is_rejected_before_assignment_write ... ok
test tests::overflowing_cleared_subset_is_rejected_before_transaction_write ... ok
test tests::plugin_code_never_uses_floating_point ... ok
test tests::overflowing_derived_balance_is_rejected_before_the_write ... ok
test tests::recheck_metadata_files_use_the_reader_size_cap ... ok
test tests::overspending_reports_ynab_states ... ok
test tests::durable_import_tests::undo_refuses_every_later_budget_edit_after_restart ... ok
test tests::review_1130::review1130_cancel_after_partial_preparation ... ok
test tests::recheck_local_server_number_and_lifecycle_contract ... ok
test tests::parsed_money_cache_shares_documents_and_prunes_removed_months ... ok
test tests::review_1130::review1130_notes_are_inert ... ok
test tests::recheck_source_checks_owner_and_opening_balance_confirmation ... ok
test tests::review_1130::review1130_legacy_home_needs_no_metadata_rewrite ... ok
test tests::recheck_random_preview_cancellation_leaves_no_files ... ok
test tests::review_1130::review1130_long_imported_note_allows_amount_edit_without_loss ... ok
test tests::review_984::review3_first_future_transaction_keeps_current_event_month ... ok
test tests::review_1130::review1130_split_and_closed_transfer_have_one_posting ... ok
test tests::review_1130::review1130_tcp_locks_reimport_and_cancel ... ok
test tests::review_984::review3_future_only_edit_and_delete_keep_current_event_month ... ok
test tests::review_1130::review1130_reconciled_closed_balances ... ok
test tests::review_984::review_concurrent_assign_revisions_match_final_report ... ok
test tests::review_984::review_category_edit_emits_for_old_category_only ... ok
test tests::review_984::review3_outside_current_range_writes_emit_no_overspend ... ok
test tests::review_984::review_cross_month_refund_move_emits_current_crossing ... ok
test tests::review_984::review_user_zone_month_and_year_edges ... ok
test tests::review_984::review_file_replacement_advances_month_revision ... ok
test tests::review_984::review_exact_zero_healing_recrossing_and_delete ... ok
test tests::review_bulkrev2::four_conflicts_return_409_without_writing ... ok
test tests::idle_import_receive_releases_admission_and_cancel_stops_read ... ok
test tests::review_984::review_split_and_tracking_transfer_writes_are_rejected_without_events ... ok
test tests::source_total_mismatch_cannot_be_confirmed ... ok
test tests::simultaneous_import_confirmations_have_one_winner ... ok
test tests::review_984::review_source_generation_tracks_all_files_and_restoration ... ok
test tests::transaction_identity_preview_is_atomic_and_reimport_changes_nothing ... ok
test tests::transfer_register_view_exposes_linked_category ... ok
test tests::same_handle_settles_a_failed_move_before_the_next_request ... ok
test tests::wizard_background_job_recovers_preview_after_response_is_dropped ... ok
test tests::transaction_logged_event_has_the_documented_create_payload ... ok
test tests::wizard_background_job_retains_safe_failure ... ok
test tests::ynab_conflicting_accounts_and_payees_are_not_silently_discarded ... ok
test tests::ynab_csv_import_keeps_exact_month_and_register_amounts ... ok
test tests::ynab_duplicate_category_ids_are_merged_only_when_identical ... ok
test tests::ynab_plan_json_import_keeps_exact_milliunits ... ok
test tests::ynab_public_demo_imports_duplicate_category_names_by_id ... ok
test tests::wizard_starter_categories_validate_before_create_and_do_not_change_totals ... ok
test tests::transfer_cleared_edits_are_per_account ... ok
test tests::update_transaction_emits_current_month_overspend_crossing ... ok
test tests::durable_import_tests::operation_recovery_survives_process_exit_at_every_phase ... ok
test tests::review_bulkrev2::two_and_five_assignment_races_match_serial_targets ... ok
test import::import_review_tests::actual_stream_memory_guard_child ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 134 filtered out; finished in 40.24s

test import::import_review_tests::actual_stream_keeps_a_large_history_bounded ... ok
test tests::durable_import_tests::generated_import_confirm_replay_and_undo_preserve_minor_units ... ok
test tests::slow_15mb_import_receive_completes_with_progress ... ok
test tests::durable_import_tests::replacement_restarts_at_every_durable_phase ... ok
test tests::bulk_write_balances_equal_one_by_one has been running for over 60 seconds
test tests::card_models_ignore_arrival_batch_and_timezone has been running for over 60 seconds
test tests::bulk_write_balances_equal_one_by_one ... ok
test tests::card_models_ignore_arrival_batch_and_timezone ... ok

test result: ok. 133 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 606.52s

     Running tests/import_review.rs (/home/kayg/build/targets/bulkrev4/debug/deps/import_review-6a0b9e5006b57cbf)

running 32 tests
test identity_csv_transfer_growth_curve ... ignored, run with MONEY_IDENT_CSV_ROWS for 10k/100k/1M transfer profiling
test recheck_actual_stream_growth_curve ... ignored, run with MONEY_RECHECK_ARCHIVE and MONEY_RECHECK_ROWS for profiling
test recheck_csv_transfer_growth_curve ... ignored, run with MONEY_RECHECK_TRANSFERS for the bounded CSV growth probe
test recheck_conflicting_transaction_ids_are_rejected ... ok
test csv_transaction_ids_merge_or_reject_before_totals ... ok
test split_identity_cannot_reuse_a_top_level_id ... ok
test split_identity_includes_parent_deleted_and_transfer_fields ... ok
test split_identity_rejects_an_inconsistent_embedded_parent ... ok
test split_identity_review_cases_reject ... ok
test transaction_identity_checks_fields_and_keeps_distinct_ids ... ok
test csv_amount_edges_never_round_group_or_overflow ... ok
test recheck_identical_transaction_ids_do_not_double_money ... ok
test corrupt_actual_database_is_a_private_error ... ok
test transfer_legs_prefer_a_same_month_mate ... ok
test csv_bom_mixed_endings_and_decimal_comma_are_exact ... ok
test recheck_e2e_csv_has_four_checks_and_keeps_every_minor_unit ... ok
test transfer_month_review_cases_reject ... ok
test recheck_reconciled_negative_zero_and_exact_source_scales ... ok
test ynab_account_check_rejects_a_wrong_normalization ... ok
test split_identity_concrete_valid_totals ... ok
test ynab_negative_zero_amount_is_zero ... ok
test unmatched_transfer_legs_keep_the_source_register ... ok
test ynab_unrepresentable_milliunits_are_rejected ... ok
test transfer_month_identity_rejects_in_both_adapters ... ok
test csv_pairing_accepts_cancellation_during_its_loop ... ok
test ynab_json_keeps_exact_split_and_transfer_postings ... ok
test transaction_identity_preserves_exact_units ... ok
test ynab_csv_preserves_exact_minor_units ... ok
test split_identity_merges_before_totals ... ok
test transfer_month_pairing_keeps_dates_and_exact_pair_priority ... ok
test csv_pairing_keeps_exact_account_legs ... ok
test raw_ynab_registers_match_a_raw_row_oracle ... ok

test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 7.85s

   Doc-tests calternal_plugin_money

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

python3 tests/money/bulkrev4-numbers.py

07b33aa56ff97a67: A=13222722 B=108 P=13222755 reserve=0; every stored field correct
08d823459b4f7555: A=1 B=1 P=1 reserve=0; every stored field correct
10dad10f207e3966: A=13222722 B=1 P=13222722 reserve=0; every stored field correct
217b597cc7b1b339: A=109170509 B=1000000000 P=110838733 reserve=889161267; every stored field correct
3c10364db1d4cd46: A=109170509 B=1 P=109170509 reserve=0; every stored field correct
405bf72849418ee7: A=28500 B=1 P=28500 reserve=0; every stored field correct
5cd63c6abac2f757: A=103816 B=1 P=103816 reserve=0; every stored field correct
70887b8579a61566: A=5789 B=1035233 P=55551 reserve=979682; every stored field correct
aa06a27413c2238d: A=103816 B=454 P=103879 reserve=0; every stored field correct
de05e2804212ba0e: A=5789 B=1 P=5789 reserve=0; every stored field correct
f161754b530689ba: A=28500 B=8319 P=31192 reserve=0; every stored field correct
Burst pins: reserve=6474+4103=10577; uncovered=51911-10577=41334
901a5dc38f13b647: February Available fees=-15151 tax=-3309 interest=-3232 retail=payment=0; reserve=0; raw/uncovered debt=366524
e6d77a36b9ded73d: RTA=1150500-560500+(20000-9853)=600147
PASS: 11 complete vectors, both changed burst pins and both changed vector records

tests/money/bulkrev4-probe.sh --nocapture --test-threads=1


running 6 tests
test exact_bounds_and_hidden_categories ... Real visibility:: hidden preserves totals; deleted Category reference rejects; exact bounds pass
ok
test generated_opening_credit_conserves ... ignored, known BLOCK R4-1; run explicitly to shrink the accepted input
test generated_unlinked_card_conserves ... ignored, known BLOCK R4-2; run explicitly to shrink the accepted input
test hand_checked_envelope_edges ... CASE underfunded month=2026-03 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=0 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=0
CASE underfunded month=2026-04 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=0 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=0
CASE underfunded month=2026-05 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=0 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=0
CASE unfunded_later month=2026-03 allocation=100 real=200 delta=-100 cash=200 card=-100 other=0 food=-100 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=100
CASE unfunded_later month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0
CASE unfunded_later month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0
CASE part_funded_later month=2026-03 allocation=150 real=200 delta=-50 cash=200 card=-100 other=0 food=-50 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=50
CASE part_funded_later month=2026-04 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=50
CASE part_funded_later month=2026-05 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=50
CASE cash_overspend month=2026-03 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=-50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=0
CASE cash_overspend month=2026-04 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE cash_overspend month=2026-05 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE mixed_cash_credit month=2026-03 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=-50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=0
CASE mixed_cash_credit month=2026-04 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE mixed_cash_credit month=2026-05 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE refund_above_debt month=2026-03 allocation=250 real=250 delta=0 cash=200 card=50 other=0 food=150 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE refund_above_debt month=2026-04 allocation=250 real=250 delta=0 cash=200 card=50 other=0 food=150 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE refund_above_debt month=2026-05 allocation=250 real=250 delta=0 cash=200 card=50 other=0 food=150 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE funded_later month=2026-03 allocation=200 real=200 delta=0 cash=200 card=-100 other=0 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0
CASE funded_later month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE funded_later month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE fully_paid month=2026-03 allocation=200 real=200 delta=0 cash=100 card=100 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE fully_paid month=2026-04 allocation=200 real=200 delta=0 cash=100 card=100 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE fully_paid month=2026-05 allocation=200 real=200 delta=0 cash=100 card=100 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE partial_payment month=2026-03 allocation=150 real=150 delta=0 cash=150 card=-50 other=0 food=100 dining=0 reserve=50 other_reserve=0 rta=0 uncovered=0
CASE partial_payment month=2026-04 allocation=150 real=150 delta=0 cash=150 card=-50 other=0 food=100 dining=0 reserve=50 other_reserve=0 rta=0 uncovered=0
CASE partial_payment month=2026-05 allocation=150 real=150 delta=0 cash=150 card=-50 other=0 food=100 dining=0 reserve=50 other_reserve=0 rta=0 uncovered=0
CASE split_refund month=2026-03 allocation=200 real=200 delta=0 cash=50 card=150 other=0 food=100 dining=100 reserve=0 other_reserve=0 rta=0 uncovered=0
CASE split_refund month=2026-04 allocation=200 real=200 delta=0 cash=50 card=150 other=0 food=100 dining=100 reserve=0 other_reserve=0 rta=0 uncovered=0
CASE split_refund month=2026-05 allocation=200 real=200 delta=0 cash=50 card=150 other=0 food=100 dining=100 reserve=0 other_reserve=0 rta=0 uncovered=0
CASE debt_transfer month=2026-03 allocation=200 real=200 delta=0 cash=200 card=0 other=-100 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0
CASE debt_transfer month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=-100 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0
CASE debt_transfer month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=-100 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0
CASE credit_spending month=2026-03 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0
CASE credit_spending month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0
CASE credit_spending month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0
CASE credit_transfer month=2026-03 allocation=300 real=300 delta=0 cash=200 card=-100 other=100 food=0 dining=0 reserve=0 other_reserve=0 rta=300 uncovered=100
CASE credit_transfer month=2026-04 allocation=300 real=300 delta=0 cash=200 card=-100 other=100 food=0 dining=0 reserve=0 other_reserve=0 rta=300 uncovered=100
CASE credit_transfer month=2026-05 allocation=300 real=300 delta=0 cash=200 card=-100 other=100 food=0 dining=0 reserve=0 other_reserve=0 rta=300 uncovered=100
ok
test opening_credit_and_missing_payment_observations ... CASE positive_card_opening month=2026-01 allocation=0 real=1 delta=-1 cash=0 card=1 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=0 uncovered=0
CASE positive_card_opening month=2026-02 allocation=0 real=1 delta=-1 cash=0 card=1 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=0 uncovered=0
CASE unlinked_card month=2026-01 L=0 M=1 rta=0 food=0 cash=1 card=-1
CASE unlinked_card month=2026-02 L=0 M=1 rta=0 food=0 cash=1 card=-1
ok
test wider_histories ... ok

test result: ok. 4 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 17.10s

artifacts/bulkrev4-probe --ignored --nocapture --test-threads=1 (exit 101, expected BLOCK witnesses)


running 2 tests
test generated_opening_credit_conserves ... 
thread 'generated_opening_credit_conserves' (278672) panicked at tests/money/bulkrev4-probe.rs:294:1:
Test failed: assertion failed: `(left == right)` 
  left: `0`,
 right: `1` at tests/money/bulkrev4-probe.rs:303.
minimal failing input: n = 1
	successes: 0
	local rejects: 0
	global rejects: 0

note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
FAILED
test generated_unlinked_card_conserves ... 
thread 'generated_unlinked_card_conserves' (278675) panicked at tests/money/bulkrev4-probe.rs:294:1:
Test failed: assertion failed: `(left == right)` 
  left: `0`,
 right: `1` at tests/money/bulkrev4-probe.rs:313.
minimal failing input: n = 1
	successes: 0
	local rejects: 0
	global rejects: 0

FAILED

failures:

failures:
    generated_opening_credit_conserves
    generated_unlinked_card_conserves

test result: FAILED. 0 passed; 2 failed; 0 ignored; 0 measured; 4 filtered out; finished in 0.06s

cargo clean

     Removed 3459 files, 2.0GiB total

No web output was created. The standalone probe binary was deleted. All changed module and function comments were read again before this report. No secrets were displayed. No push, deployment or merge into dev was performed.

BLOCK — R4-1 positive Card opening credit disappears; R4-2 accepted unlinked Card purchases remove funded money.

Independent bulkrev4 final report. Head `82087a0163a30f66a9bd190ad2e67db412f760c7`. Reviewed product head `f39bf92bf37a7538c97f6ed2fd593af388e7e482`. Verdict: **BLOCK R4-1, R4-2**. # Independent Money number review — bulkrev4, #1393 BLOCK: R4-1 and R4-2. Both accepted inputs remove real budget money. Reviewed product head: `f39bf92bf37a7538c97f6ed2fd593af388e7e482`. Branch: `job/bulkwrite-1393`. Required fetch/merge of `origin/dev`: `Already up to date.` The author reports and result files were not read. Only prior independent reviews were used. All amounts are synthetic test cents. No product code, dependency, lockfile or existing expectation changed. The probe/evidence commit is `86a16b87d60725175842363c29112c91d7f05103`; the final issue comment identifies the report commit. ## Built and files - `tests/money/bulkrev4-probe.rs`: standalone exact-number probes, 512 wider generated histories, 13 hand-computed edge cases, bounds, real hidden visibility and two known-failing shrink properties. - `tests/money/bulkrev4-probe.sh`: compile and run the probe against crate-gate artifacts. Run after the Money gate. Known failures need `--ignored`. - `tests/money/bulkrev4-numbers.py`: independent integer checks of every stored field in the eleven original vectors, both burst pins and both revised vector records. - `tests/money/bulkrev4-review.md`: this review and verbatim gate evidence. - `artifacts/bulkrev4-findings.md`: findings appended during the review. It stays gitignored. ## Invariant and scope [DESIGN §48](../../docs/DESIGN.md) defines M as Cash balances plus positive Card balances. L is Ready to Assign plus all signed Category Available, including payment Categories once. U is current-month unfunded Card spending that refunds or real Category inflows have not canceled. For Cash income and the on-budget expense, refund, payment and transfer forms under review, **L + U = M**. Add cumulative import Ready to Assign adjustments to M when present. At rollover U resets. Only the cash part of a negative Available reduces Ready to Assign. With no new transactions, **L = M**, even after underfunded histories. Negative Card balances are debt, not negative budget money. Each Account also equals the exact raw sum of its ordinary and transfer legs through each month. These checks do not use derived reserves to predict Account balances. Full same-date models and acceptance must be independent of file order. The widened generator checks raw Account sums and `L <= M` at every month, plus exact `L = M` after every prefix rollover. The hand cases also check `L + U = M` with independently known U. U is private replay state, so the random probe does not independently assert its exact current-month value. That is a test limit, not a claim that arbitrary current-month differences are defects. ## BLOCK R4-1: positive Card opening credit disappears Minimal accepted input: one active Card with a valid payment Category; no Assignments; one Opening balances row `+0.01 USD` on January 1; empty February. The Category has `kind:: balance`. Correct under §48: Card +1; Ready to Assign +1; all Available 0. L = M = 1 in January and February. Actual: Card +1; Ready to Assign 0; all Available 0. L = 0, M = 1. The loss survives rollover. The `create_account` route accepts a positive Card `opening_balance`, creates its payment Category and writes this Opening balances row. Thus the route source permits the same failing input. This reachability statement is an inference from source, not a separate live HTTP probe. `Replay::post` returns from the Balance branch without crediting positive Card balances. The property `generated_opening_credit_conserves` shrank to `n = 1`. This is an adjacent pre-existing gap. This review does not claim the R3 patch introduced it. It still meets the requested BLOCK rule: accepted input loses real budget money. ## BLOCK R4-2: missing payment link removes funded money Minimal funded input: Cash income +1; Food Assignment +1; Card Food purchase -1; empty February. Omit the Card's optional `payment category::` property. The public codec/projection accepts that metadata. Correct: reject the unusable Card metadata before calculating, or retain the real cent in its payment Category. Actual: Cash 1; Card -1; Food 0; Ready to Assign 0; no Card reserve. L = 0, M = 1 in both months. `Replay::post` computes one funded cent and no virtual deficit, but adds reserve only when a payment Category exists. The cent is removed from Food without a destination. `generated_unlinked_card_conserves` shrank to `n = 1`. This is also an adjacent pre-existing gap, not a demonstrated regression of the R3 patch. ## Previous B1, N2 and changed numbers B1 passes both same-date permutations. Cash income 20,000; Food and Dining Assignments 10,000 each; Food purchase -10,000 on March 28; Dining -10,000 on March 29; payment 10,000 and Food refund 10,000 on March 31. Correct final Food 10,000; Dining 0; reserve 0; Ready to Assign 0; Cash 10,000; Card 0. March and April each allocate exactly 10,000. N2 passes all 24 same-date permutations. Let E = MAX_EXACT = 9,007,199,254,740,991. Cash opening income and Food Assignment are E-1. Same-date Cash Food -E; Cash split parent +1 with Food -1 and Dining +2; Cash Food +E; Card Dining -1. Correct Cash E; Card -1; Food E-2; Dining 1; reserve 1; Ready to Assign 0. Canonical pre-pass order accepts all orders. Both changed burst pins are correct. March Card refunds = 361 + 1,648 + 7,463 = 9,472 cancel old debt. March Food = 15,000 + 432 - 1,768 - 2,813 = 10,851. April Food = 10,851 + 6,775 - 9,046 + 2,572 = 11,152; reserve = 9,046 - 2,572 = 6,474. October Cash activity = -22,049, leaving 11,152 + 15,000 - 22,049 = 4,103 for Card funding. Card purchases total 19,230. The 7,133 refund cancels current virtual deficit and does not release reserve. Correct reserve = 6,474 + 4,103 = **10,577**. November raw debt = 51,911; correct uncovered = 51,911 - 10,577 = **41,334**. Changed record `901a5dc38f13b647` is correct. February returns 50,505 retail, 1,768 fees and 318 tax reduce retired unfunded debt. No positive reserve exists. February Available: retail 0; fees -15,151; tax -(2,727 + 182 + 400) = -3,309; interest -(1,010 + 2,222) = -3,232; payment 0. Raw debt and uncovered are 366,524. Correct reserve is 0. Changed record `e6d77a36b9ded73d` is correct. Cash openings and income = 1,150,500; Assignments = 560,500; Amex purchases = 9,853; payment = 20,000; new positive credit = 10,147. Correct Ready to Assign = 1,150,500 - 560,500 + 10,147 = **600,147**. All eleven earlier reference vectors remain correct, including every stored output field. S = 1,000,000,000,000 is assigned to both Food and Dining. A is Food purchase/full refund, B is Dining purchase, P is payment. Canonical order puts Dining before Food. Reserve = max(B-P,0); Food = S; Dining = S-B; Ready to Assign = -2S; Cash = -P; Card = P-B; Savings and uncovered are 0. Food activity = 0; Dining activity = -B; payment activity = -P. The Python check derives these numbers from input fields and constructs the full output. The Rust vectors gate independently checks production replay equality. | Vector | A | B | P | Correct reserve | | --- | ---: | ---: | ---: | ---: | | 07b33aa56ff97a67 | 13222722 | 108 | 13222755 | 0 | | 08d823459b4f7555 | 1 | 1 | 1 | 0 | | 10dad10f207e3966 | 13222722 | 1 | 13222722 | 0 | | 217b597cc7b1b339 | 109170509 | 1000000000 | 110838733 | 889161267 | | 3c10364db1d4cd46 | 109170509 | 1 | 109170509 | 0 | | 405bf72849418ee7 | 28500 | 1 | 28500 | 0 | | 5cd63c6abac2f757 | 103816 | 1 | 103816 | 0 | | 70887b8579a61566 | 5789 | 1035233 | 55551 | 979682 | | aa06a27413c2238d | 103816 | 454 | 103879 | 0 | | de05e2804212ba0e | 5789 | 1 | 5789 | 0 | | f161754b530689ba | 28500 | 8319 | 31192 | 0 | ## Requested envelope cases Each case starts with Cash income 200. Unless stated otherwise, Dining and the Other Card stay at zero. All rows below match production in March, April and May. | Case | Correct §48 result | Comparison | | --- | --- | --- | | Underfunded Card purchase and partial refund | Food Assignment 50, buy 100, refund 50: Food 0, reserve 50, Ready to Assign 150, Cash 200, Card -50. Refund cancels U first. | Matches. | | Overspent Cash Category | Food Assignment 50, Cash spend 100: March Food -50 and Ready to Assign 150; April Food 0 and Ready to Assign 100; Cash 100. | Matches. | | Mixed Cash and Card deficit | Food Assignment 50, Cash spend 100, Card buy 100, Card refund 100: March Food -50, reserve 0, Ready to Assign 150, Cash 100, Card 0; April Ready to Assign 100. | Matches. | | Refund above debt | Food Assignment 100, Card buy 100, refund 150: Food 150, reserve 0, Ready to Assign 100, Cash 200, Card +50. L = M = 250. | Matches. | | Unfunded refund in later month | No Assignment, March Card buy 100, April refund 100: March Food -100, U 100; April Food 0, reserve 0, Ready to Assign 200, Card 0. | Matches. | | Partly funded refund in later month | Food Assignment 50, March buy 100, April refund 50: March Food -50, reserve 50; April Food 50, reserve 0, Ready to Assign 150, Card -50. | Matches. | | Funded refund in later month | Food Assignment 100, March buy 100, April refund 100: April Food 100, reserve 0, Ready to Assign 100, Cash 200, Card 0. | Matches. | | Refund after full payment | Food Assignment 100, buy 100, pay 100, refund 100: Food 100, reserve 0, Ready to Assign 100, Cash 100, Card +100. | Matches. | | Partial payment then refund | Food and Dining Assignments 100 each; buy 100 in each; pay 50; Food refund 100: Food 100, Dining 0, reserve 50, Ready to Assign 0, Cash 150, Card -50. | Matches. | | Split refunds | Same Assignments/purchases; pay 150; split refund Food 100 and Dining 100: Food 100, Dining 100, reserve 0, Ready to Assign 0, Cash 50, Card +150. Only the first 50 reduces debt. | Matches. | | Transfer debt between Cards | Food Assignment 100, Card buy 100, general transfer 100 from Other to Card: original reserve 100, Other reserve 0, Ready to Assign 100, Cash 200, Card 0, Other -100. Categories do not move. | Matches. | | Transfer into positive Card credit | General transfer 100 from zero Card to zero Other: Ready to Assign 300, Cash 200, Card -100, Other +100; Categories unchanged. | Matches. | | Spend positive Card credit | No Assignment; Card refund 50 then buy 50: Food 0, reserve 0, Ready to Assign 200, Card 0. | Matches. | | Return to hidden Category | Actual `visibility:: hidden` parses as hidden and retains the same totals as visible. | Matches. | | Return to deleted identity | Remove the linked Category identity; projection rejects the dangling reference. | Rejects; no accepted wrong totals. | ## Generator coverage The existing seed-139303 property has two Cards, both Card transfer directions, refunds unconstrained by debt, later refunds, Cash refunds, Card splits and three active months. It inserts an empty month after every active month. It does not exercise consecutive active months, mixed-sign splits, Cash splits, repeated children, real hidden visibility, payment Assignments, opening Card credit or a missing payment link. The earlier hidden check uses opaque `hidden:: true`; the new probe verifies actual parsed `visibility:: hidden`. The new seed-139304 property ran **512 histories** with up to 64 random rows, **four consecutive active months**, two Cards, 20 posting forms, Cash and Card purchases/refunds, split purchases/refunds, mixed-sign Cash/Card splits, repeated Category children, both Card transfer directions, overpayments, arbitrary debt-relative refunds, hidden Categories and positive/negative expense/payment Assignments. It checked **2,560 month models**, **2,048 prefix rollovers**, raw Account sums and complete shuffled models. All passed in the linked-Card, zero-opening-balance domain. No generated money excess or loss was found in that domain. Separate initialization/metadata extensions found R4-1 and R4-2. Both shrink to one cent. The failures survive rollover. They are outside the passing property's fixed metadata. Exact bounds: i64::MIN, i64::MAX and values just outside ±MAX_EXACT reject. Supported ±MAX_EXACT round-trip and conserve in Cash histories. N2 checks acceptance at the supported bound in every same-date order. A zero-parent Card split with an internal cursor of 2 * MAX_EXACT also conserves. This is not exhaustive testing near every intermediate bound. ## Decisions, known gaps and merge round No product design decision was made. This review applies §48's positive-Card and allocation equations to every accepted input. The design does not state how a Card without a payment link must behave. R4-2 therefore accepts either an early validation error or correct reserve accounting as a remedy; silently losing money is not a valid result. Known gaps: R4-1 and R4-2 remain unfixed because this job forbids product changes. The probes use the real codec/projection/replay, not new HTTP checks. Random U is not exposed, so exact current-month U is checked only in the hand cases. Tracking transfers, Card income, import reconciliation and every integer intermediate are not covered by the new random property. Existing gates cover their existing contracts; this review makes no new universal claim for them. No UI, performance route or background job was changed; no screenshots or new bench profile were needed. No dependencies were added. For the merge round: do not merge until both accepted-file conservation gaps have a fix or an explicit owner disposition. Turn the two standalone shrink properties into normal regressions with the fixes. Rerun `tests/money/bulkrev4-probe.sh --ignored --nocapture --test-threads=1` after the Money crate gate; both must conserve or reject unusable metadata. No requested correctness scenario was deferred. ## Gates and cleanup Both required crates were tested once, separately, with `CARGO_BUILD_JOBS=4`, `CARGO_PROFILE_DEV_DEBUG=line-tables-only`, `CARGO_INCREMENTAL=0` and `TMPDIR=<worktree>/target/tmp`. The configured CARGO_TARGET_DIR was not changed. `calternal-money`: 68 passed, 1 ignored. `calternal-plugin-money`: 162 passed, 5 ignored, plus the parent-invoked child check. Existing ignored tests were not changed. No suite was restarted. No crate code changed, so no new crate clippy gate was needed. `cargo fmt --check`: exit 0, no output. The standalone Rust probe was formatted with rustfmt. Shell syntax was checked and the independent Python arithmetic script ran successfully. Gate output below is verbatim. These green existing gates do not cover the two accepted-input defects. ### `cargo test -p calternal-money` ```text Blocking waiting for file lock on build directory Compiling calternal-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-money) Finished `test` profile [unoptimized + debuginfo] target(s) in 2m 33s Running unittests src/lib.rs (/home/kayg/build/targets/bulkrev4/debug/deps/calternal_money-8e1c5faea8a31672) running 16 tests test edit::tests::cleared_tag_toggles_without_touching_other_tags ... ok test units::tests::exact_range_is_enforced_on_parse_and_arithmetic ... ok test units::tests::format_uses_explicit_sign_and_exact_scale ... ok test codec::tests::empty_payee_is_refused_by_the_writer ... ok test units::tests::parse_matches_the_oracle_examples ... ok test units::tests::scale_table_has_all_165_codes_with_unique_entries ... ok test edit::tests::unicode_payee_tag_boundaries_match_shared_vectors ... ok test codec::tests::transaction_round_trip_with_punctuation_in_labels_and_payee ... ok test codec::tests::malformed_dated_rows_fail_instead_of_vanishing ... ok test codec::tests::round_trip_keeps_bom_crlf_and_unknown_bytes ... ok test codec::tests::property_edit_changes_one_value ... ok test edit::tests::crlf_file_keeps_crlf_on_insert ... ok test units::independent_number_review::signed_edges_and_long_zero_padding_keep_exact_minor_units ... ok test edit::tests::new_budget_projects_with_no_accounts ... ok test edit::tests::assign_inserts_updates_and_removes_rows ... ok test codec::tests::checked_parse_stops_after_a_bounded_line_batch ... ok test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s Running tests/account_kinds.rs (/home/kayg/build/targets/bulkrev4/debug/deps/account_kinds-00e7b51263e77447) running 5 tests test account_projection_rejects_legacy_and_unknown_kinds ... ok test imported_account_kinds_project_without_losing_identity ... ok test tracking_deficit_rollover_does_not_reduce_ready_to_assign ... ok test off_budget_balance_marker_does_not_change_budget_money ... ok test categorized_debit_loan_transfers_post_one_budget_leg ... ok test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s Running tests/import.rs (/home/kayg/build/targets/bulkrev4/debug/deps/import-c98cac474afc94ca) running 13 tests test recheck_half_minor_units_negative_zero_and_nineteen_digits ... ok test duplicate_source_ids_are_rejected_and_duplicate_names_are_kept ... ok test import_stream_renderer_matches_full_rendered_files ... ok test import_keeps_same_day_source_order_for_credit_payments_and_refunds ... ok test production_v1_metadata_upgrade_keeps_balances ... ok test import_render_is_exact_and_byte_stable ... ok test import_render_reports_progress_and_propagates_cancel ... ok test import_replay_matches_full_ledger_month_by_month ... ok test budget_replay_stops_at_a_bounded_transaction_checkpoint ... ok test imported_ready_to_assign_matches_independent_month_oracle ... ok test recheck_same_day_payment_and_refund_keep_source_fifo ... ok test random_imports_conserve_source_balances_and_markdown ... ok test recheck_random_multicurrency_ledgers_match_all_monthly_totals ... ok test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 9.11s Running tests/properties.rs (/home/kayg/build/targets/bulkrev4/debug/deps/properties-1c9f06dab7df6a6f) running 21 tests test bulkrev2::literal_account_sum_and_funded_card_conservation ... ok test bulkrev2::split_refund_keeps_payment_overfunding_when_card_becomes_positive ... ok test bulkrev2::boundary_shuffle_reports_acceptance_difference ... ok test bulkrev2::refund_payment_calendar_choice_is_visible_next_month ... ok test money_code_never_uses_floating_point ... ok test bill_coverage_never_clamps_the_bill ... ok test reviewed_burst_order_matches_input_order ... ok test bulkrev2::i64_extremes_are_rejected_and_safe_bound_is_exact ... ok test any_text_that_parses_serializes_to_the_same_bytes ... ok test decimal_text_round_trips_for_every_scale ... ok test transaction_rows_round_trip_byte_for_byte ... ok test split_legs_post_exactly_the_parent ... ok test paired_write_replay_matches_independent_calculations ... ok test partial_payment_then_category_refunds_conserve_cash_across_months ... ok test mixed_cash_credit_deficit_rolls_only_its_cash_part ... ok test assign_then_unassign_is_the_identity ... ok test cash_ledgers_conserve_money_every_month ... ok test same_date_card_postings_are_a_function_of_the_set ... ok test fully_funded_card_spending_conserves_cash ... ok test bulkrev2::funded_shuffles_conserve_real_money_every_month ... ok test bulkrev2::same_day_shuffles_cover_splits_transfers_and_month_edges ... ok test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.31s Running tests/ready_to_assign_adjustment.rs (/home/kayg/build/targets/bulkrev4/debug/deps/ready_to_assign_adjustment-55e8528f73b12e49) running 1 test test ready_to_assign_adjustment_changes_only_the_budget_pool ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s Running tests/review_984.rs (/home/kayg/build/targets/bulkrev4/debug/deps/review_984-155e2c131b561571) running 5 tests test review_pair_performance_profile ... ignored, performance measurements belong to the merge round on the perf VM test review_pair_rejects_bad_months_and_amounts_without_rounding ... ok test review_split_remainders_and_tracking_transfers_are_exact ... ok test review_mixed_pair_matches_independent_replays ... ok test review_large_ledger_pair_keeps_exact_totals ... ok test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 2.86s Running tests/review_bulkrev3.rs (/home/kayg/build/targets/bulkrev4/debug/deps/review_bulkrev3-97fae80e3ad4b8d3) running 4 tests test hidden_and_missing_categories ... ok test envelope_edge_cases ... ok test previous_witnesses_all_orders ... ok test random_histories_conserve_money_after_every_rollover ... ok test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.19s Running tests/vectors.rs (/home/kayg/build/targets/bulkrev4/debug/deps/vectors-6a9e51ba3117ddc1) running 4 tests test rust_matches_random_oracle_ledgers_without_divergences ... ok test reviewed_eleven_refund_vectors_keep_their_exact_numbers ... ok test reviewed_r3_vectors_assert_retired_debt_and_positive_credit ... ok test rust_port_matches_every_recorded_oracle_vector ... ok test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.52s Doc-tests calternal_money running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` ### `cargo test -p calternal-plugin-money` ```text Blocking waiting for file lock on build directory Compiling proc-macro2 v1.0.107 Compiling quote v1.0.47 Compiling memchr v2.8.3 Compiling futures-core v0.3.34 Compiling pin-project-lite v0.2.17 Compiling jobserver v0.1.35 Compiling shlex v2.0.1 Compiling find-msvc-tools v0.1.13 Compiling serde_core v1.0.229 Compiling log v0.4.34 Compiling bytes v1.12.1 Compiling cc v1.4.7 Compiling once_cell v1.21.4 Compiling stable_deref_trait v1.2.1 Compiling version_check v0.9.5 Compiling syn v3.0.6 Compiling pkg-config v0.3.34 Compiling serde v1.0.229 Compiling syn v2.0.119 Compiling socket2 v0.6.5 Compiling equivalent v1.0.2 Compiling synstructure v0.14.0 Compiling zerovec-derive v0.11.6 Compiling displaydoc v0.2.7 Compiling serde_derive v1.0.229 Compiling hashbrown v0.17.1 Compiling litemap v0.8.3 Compiling zerofrom-derive v0.1.8 Compiling yoke-derive v0.8.4 Compiling zerofrom v0.1.8 Compiling writeable v0.6.4 Compiling utf8_iter v1.0.4 Compiling icu_normalizer_data v2.3.0 Compiling tracing-attributes v0.1.31 Compiling generic-array v0.14.9 Compiling tracing-core v0.1.36 Compiling yoke v0.8.3 Compiling typenum v1.20.1 Compiling futures-io v0.3.34 Compiling zerovec v0.11.8 Compiling zerotrie v0.2.5 Compiling icu_properties_data v2.3.0 Compiling futures-task v0.3.34 Compiling scopeguard v1.2.0 Compiling tinystr v0.8.4 Compiling potential_utf v0.1.6 Compiling tracing v0.1.44 Compiling icu_locale_core v2.3.0 Compiling icu_collections v2.3.0 Compiling mio v1.2.3 Compiling errno v0.3.14 Compiling futures-sink v0.3.34 Compiling icu_provider v2.3.1 Compiling percent-encoding v2.3.2 Compiling signal-hook-registry v1.4.8 Compiling lock_api v0.4.14 Compiling tokio-macros v2.7.2 Compiling smallvec v1.16.1 Compiling tokio v1.53.1 Compiling icu_properties v2.3.0 Compiling serde_json v1.0.151 Compiling indexmap v2.14.2 Compiling num-traits v0.2.19 Compiling parking_lot_core v0.9.12 Compiling slab v0.4.12 Compiling form_urlencoded v1.2.2 Compiling getrandom v0.4.3 Compiling futures-macro v0.3.34 Compiling rand_core v0.10.1 Compiling futures-util v0.3.34 Compiling cmake v0.1.58 Compiling dunce v1.0.5 Compiling fs_extra v1.3.0 Compiling vcpkg v0.2.15 Compiling thiserror-impl v2.0.21 Compiling http v1.5.0 Compiling siphasher v1.0.3 Compiling aws-lc-sys v0.45.0 Compiling crossbeam-utils v0.8.23 Compiling spin v0.9.9 Compiling hybrid-array v0.4.15 Compiling foldhash v0.2.0 Compiling cpufeatures v0.2.17 Compiling allocator-api2 v0.2.21 Compiling base64 v0.22.1 Compiling hashbrown v0.16.1 Compiling icu_normalizer v2.3.0 Compiling parking v2.2.1 Compiling rustversion v1.0.23 Compiling zeroize v1.9.0 Compiling aws-lc-rs v1.18.1 Compiling crc-catalog v2.5.0 Compiling event-listener v5.4.2 Compiling idna_adapter v1.2.2 Compiling crc v3.4.0 Compiling crossbeam-queue v0.3.14 Compiling hashlink v0.11.1 Compiling crypto-common v0.1.6 Compiling block-buffer v0.10.4 Compiling http-body v1.1.0 Compiling futures-channel v0.3.34 Compiling simd-adler32 v0.3.10 Compiling thiserror v2.0.21 Compiling httparse v1.10.1 Compiling parking_lot v0.12.5 Compiling digest v0.10.7 Compiling idna v1.1.0 Compiling rustls-pki-types v1.15.1 Compiling crypto-common v0.2.2 Compiling libsqlite3-sys v0.37.0 Compiling cpufeatures v0.3.1 Compiling crc32fast v1.5.2 Compiling iana-time-zone v0.1.65 Compiling tower-service v0.3.3 Compiling either v1.18.0 Compiling chrono v0.4.45 Compiling url v2.5.8 Compiling tokio-stream v0.1.19 Compiling sha2 v0.10.9 Compiling futures-intrusive v0.5.0 Compiling tokio-util v0.7.19 Compiling rustls v0.23.45 Compiling atomic-waker v1.1.2 Compiling adler2 v2.0.1 Compiling try-lock v0.2.5 Compiling rand_core v0.6.4 Compiling untrusted v0.9.0 Compiling sqlx-core v0.9.0 Compiling want v0.3.1 Compiling rand v0.8.8 Compiling rustls-webpki v0.103.15 Compiling h2 v0.4.19 Compiling atoi v2.0.0 Compiling futures-executor v0.3.34 Compiling flume v0.12.0 Compiling inout v0.2.2 Compiling phf_shared v0.11.3 Compiling blake3 v1.8.7 Compiling sync_wrapper v1.0.2 Compiling tower-layer v0.3.3 Compiling subtle v2.6.1 Compiling httpdate v1.0.3 Compiling ryu v1.0.23 Compiling cmov v0.5.4 Compiling ipnet v2.12.2 Compiling hyper v1.11.1 Compiling ctutils v0.4.2 Compiling phf_generator v0.11.3 Compiling sqlx-sqlite v0.9.0 Compiling miniz_oxide v0.9.1 Compiling encoding_rs v0.8.41 Compiling multiversion-macros v0.9.0 Compiling block-buffer v0.12.1 Compiling phf_shared v0.12.1 Compiling heck v0.5.0 Compiling chrono-tz v0.10.4 Compiling dotenvy v0.15.7 Compiling arrayvec v0.7.8 Compiling hex v0.4.3 Compiling inotify-sys v0.1.8 Compiling zlib-rs v0.6.8 Compiling constant_time_eq v0.4.2 Compiling sqlx-macros-core v0.9.0 Compiling flate2 v1.1.10 Compiling phf v0.12.1 Compiling cipher v0.5.2 Compiling multiversion v0.9.0 Compiling phf_macros v0.11.3 Compiling universal-hash v0.6.1 Compiling hyper-util v0.1.20 Compiling tower v0.5.3 Compiling http-body-util v0.1.5 Compiling multer v3.1.0 Compiling linkme-impl v0.3.37 Compiling openssl-probe v0.2.1 Compiling mime v0.3.17 Compiling core_detect v1.0.0 Compiling unicode-joining-type v1.0.0 Compiling simdutf8 v0.1.5 Compiling multiversion_no_op v1.0.0 Compiling rustls-native-certs v0.8.4 Compiling phf v0.11.3 Compiling poly1305 v0.9.1 Compiling chacha20 v0.10.2 Compiling sqlx-macros v0.9.0 Compiling tokio-rustls v0.26.6 Compiling aead v0.6.1 Compiling miniz_oxide v0.8.9 Compiling fdeflate v0.3.7 Compiling utoipa-gen v6.0.1 Compiling aho-corasick v1.1.5 Compiling linkme v0.3.37 Compiling pulldown-cmark v0.13.4 Compiling calternal-path v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-path) Compiling zune-core v0.5.3 Compiling winnow v0.7.15 Compiling quick-error v2.0.1 Compiling pxfm v0.1.30 Compiling byteorder-lite v0.1.0 Compiling same-file v1.0.6 Compiling color_quant v1.1.0 Compiling weezl v0.1.12 Compiling walkdir v2.5.0 Compiling moxcms v0.8.1 Compiling image-webp v0.2.4 Compiling gif v0.14.2 Compiling cron v0.17.0 Compiling zune-jpeg v0.5.15 Compiling utoipa v6.0.0 Compiling regex-automata v0.4.18 Compiling png v0.18.1 Compiling chacha20poly1305 v0.11.0 Compiling hyper-rustls v0.27.10 Compiling inotify v0.11.5 Compiling sqlx v0.9.0 Compiling rustls-platform-verifier v0.7.0 Compiling axum-core v0.5.6 Compiling tower-http v0.6.11 Compiling serde_urlencoded v0.7.1 Compiling uuid v1.26.1 Compiling notify-types v2.1.0 Compiling serde_path_to_error v0.1.20 Compiling base64 v0.23.1 Compiling unicode-properties v0.1.4 Compiling matchit v0.8.4 Compiling unsafe-libyaml v0.2.11 Compiling bytemuck v1.25.2 Compiling unicase v2.9.0 Compiling bumpalo v3.20.3 Compiling unicode-casefold v0.2.0 Compiling image v0.25.10 Compiling zopfli v0.8.3 Compiling calternal-fs v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-fs) Compiling serde_yaml v0.9.34+deprecated Compiling axum v0.8.9 Compiling reqwest v0.13.5 Compiling tempfile v3.27.0 Compiling notify v8.2.0 Compiling calternal-db v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-db) Compiling regex v1.13.1 Compiling calternal-api v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-api) Compiling csv-core v0.1.13 Compiling quick-xml v0.42.0 Compiling rusty-fork v0.3.1 Compiling csv v1.4.0 Compiling calternal-plugin v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-plugin) Compiling calternal-notes-core v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-notes-core) Compiling calternal-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-money) Compiling zip v5.1.1 Compiling proptest v1.11.0 Compiling calternal-plugin-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/plugins/money) Finished `test` profile [unoptimized + debuginfo] target(s) in 5m 44s Running unittests src/lib.rs (/home/kayg/build/targets/bulkrev4/debug/deps/calternal_plugin_money-3d165b6d3890a332) running 135 tests test import::import_review_tests::actual_stream_memory_guard_child ... ignored, invoked as an isolated child by actual_stream_keeps_a_large_history_bounded test import::import_review_tests::actual_cents_conversion_never_rounds ... ok test import::import_review_tests::actual_cc_label_requires_missing_type_confirmation ... ok test import::import_review_tests::actual_orphan_split_children_are_rejected ... ok test import::import_review_tests::actual_transfer_legs_cannot_cross_months ... ok test import::import_review_tests::actual_account_checks_use_raw_monthly_source_rows ... ok test import::import_review_tests::import_control_reports_progress_and_stops_cancelled_work ... ok running 1 test test routes::import_cleanup_tests::dropped_preview_worker_retains_admission_until_exit ... ok test routes::import_staged_path_tests::staged_import_name_cannot_select_another_path_or_slot ... ok test routes::import_cleanup_tests::staged_import_files_keep_ranges_and_release_private_storage ... ok test routes::replay_reuse_tests::crossings_reuse_checked_current_totals_even_with_future_months ... ok test import::import_review_tests::ynab_transfer_pairing_handles_many_duplicate_legs ... ok test import_fidelity_1130::independent_split_and_transfer_numbers_check ... ok test routes::import_cleanup_tests::idle_imports_are_reclaimed_by_expiry_cleanup ... ok test routes::durable::checkpoint_tests::progress_wait_keeps_parser_writer_release_polled ... ok test routes::durable::admission_tests::cancelled_receiver_cannot_acknowledge_a_durable_job ... ok test routes::review_1140::cancel_wins_before_publication_lock ... ok test routes::replay_reuse_tests::assignment_retry_rebuilds_from_latest_source_bytes ... ok test routes::replay_reuse_tests::crossings_cover_source_ranges_relative_to_today ... ok test routes::review_1140::cancel_does_not_rewrite_published_result ... ok test routes::review_1140::review1140_operational_cancel_before_replacement_returns_no_receipt ... ok test store::parsed_cache_tests::global_budget_and_folder_pruning_release_stale_entries ... ok test store::parsed_cache_tests::parse_charge_accounts_for_line_structures ... ok test store::parsed_cache_tests::user_cache_evicts_old_parse_entries_and_shares_hot_documents ... ok test routes::review_1140::review1140_staged_size_limits_fail_without_publishing ... ok test routes::review_1140::review1140_tcp_malformed_inputs_leave_worker_usable ... ok test routes::review_1140::review1140_terminal_receipts_do_not_block_new_imports ... ok test routes::review_1140::review1140_cancel_after_rename_before_receipt_keeps_publication ... ok test tests::a_new_user_sees_the_real_empty_state ... ok test tests::active_money_handle_survives_other_users_cache_pressure ... ok test tests::actual_duplicate_names_import_by_id_without_sharing_a_payment_category ... ok test tests::actual_export_archive_imports_exact_rows_from_private_scratch ... ok test routes::review_1140::review1140_discard_after_confirmation_failure_releases_admission ... ok test import_fidelity_1130::actual_rows_round_trip ... ok test tests::a_broken_file_is_reported_not_hidden ... ok test tests::a_read_waits_for_a_write_in_progress ... ok test tests::api_account_numbers_equal_core_replay ... ok test routes::durable::admission_tests::live_publication_honors_operational_queue_cancellation ... ok test tests::a_split_row_written_by_hand_is_read_but_not_edited ... ok test tests::a_journal_for_a_completed_move_changes_nothing ... ok test tests::cancel_racing_confirm_has_one_consistent_outcome ... ok test tests::assignments_retry_source_conflicts_without_losing_neighbours ... ok test tests::cancelling_imports_leaves_no_budget_and_releases_slots ... ok test routes::review_1140::review1140_all_formats_replay_exact_balances ... ok test tests::csv_import_keeps_progress_and_cancel_responsive ... ok test tests::backdated_create_emits_current_month_overspend_crossing ... ok test tests::bulk_write_month_does_not_need_note_date_backfill ... ok test tests::bulk_write_invalid_neighbours_do_not_change_valid_rows ... ok test tests::durable_import_tests::operation_exit_child ... ignored, child of operation_recovery_survives_process_exit_at_every_phase test tests::bulk_write_rejects_intermediate_overflow ... ok test tests::concurrent_store_edits_keep_exactly_one_winner ... ok test tests::budget_flow_writes_exact_markdown_and_derives_available ... ok test tests::denied_preview_access_keeps_the_owners_pending_import ... ok test routes::review_1140::review1140_replacement_receipt_recovery_does_not_adopt_later_edits ... ok test tests::durable_import_tests::receipt_reads_are_bounded_and_old_receipts_are_addressable ... ok test tests::delete_transaction_emits_current_month_overspend_crossing ... ok test tests::durable_import_tests::replay_preserves_a_live_ready_preview ... ok test tests::durable_import_tests::running_jobs_do_not_expire_and_cancelled_jobs_do_not_restart ... ok test tests::durable_import_tests::publication_and_inverse_authority_use_full_commits ... ok test tests::durable_import_tests::queued_import_and_undo_survive_restarts ... ok test routes::durable::money_import_undo_mutation ... ok test tests::durable_import_tests::undo_receipt_replay_never_removes_a_restored_import ... ok test tests::durable_import_tests::undo_refuses_a_predecessor_restored_before_the_inverse ... ok test tests::far_month_assignment_cannot_make_the_budget_unreadable ... ok test tests::failed_cross_month_move_never_counts_the_row_twice ... ok test tests::durable_import_tests::undo_restarts_before_and_after_the_filesystem_inverse ... ok test tests::gap_month_assignments_and_opening_card_debt_do_not_create_cash ... ok test tests::import_file_limits_match_the_money_reader ... ok test tests::historical_overspend_does_not_emit_current_month_event ... ok test tests::hostile_inputs_are_rejected_without_writing ... ok test tests::import_preview_is_owner_bound_and_confirmation_publishes_once ... ok test tests::memo_and_tags_split_the_payee_without_losing_text ... ok test tests::money_is_on_for_the_instance_and_off_for_a_new_user ... ok test tests::import_preview_reads_only_generated_staged_upload_names ... ok test tests::inferred_opening_balance_needs_explicit_confirmation ... ok test tests::import_fidelity_review_requires_account_kind_and_keeps_notes ... ok test tests::month_revision_increases_after_each_assignment ... ok test tests::other_users_and_sessions_without_data_scope_see_nothing ... ok test tests::multiple_assignment_rows_set_one_exact_total ... ok test tests::move_money_keeps_ready_to_assign_and_card_gets_payment_category ... ok test tests::overflowing_category_sum_is_rejected_before_assignment_write ... ok test tests::overflowing_cleared_subset_is_rejected_before_transaction_write ... ok test tests::plugin_code_never_uses_floating_point ... ok test tests::overflowing_derived_balance_is_rejected_before_the_write ... ok test tests::recheck_metadata_files_use_the_reader_size_cap ... ok test tests::overspending_reports_ynab_states ... ok test tests::durable_import_tests::undo_refuses_every_later_budget_edit_after_restart ... ok test tests::review_1130::review1130_cancel_after_partial_preparation ... ok test tests::recheck_local_server_number_and_lifecycle_contract ... ok test tests::parsed_money_cache_shares_documents_and_prunes_removed_months ... ok test tests::review_1130::review1130_notes_are_inert ... ok test tests::recheck_source_checks_owner_and_opening_balance_confirmation ... ok test tests::review_1130::review1130_legacy_home_needs_no_metadata_rewrite ... ok test tests::recheck_random_preview_cancellation_leaves_no_files ... ok test tests::review_1130::review1130_long_imported_note_allows_amount_edit_without_loss ... ok test tests::review_984::review3_first_future_transaction_keeps_current_event_month ... ok test tests::review_1130::review1130_split_and_closed_transfer_have_one_posting ... ok test tests::review_1130::review1130_tcp_locks_reimport_and_cancel ... ok test tests::review_984::review3_future_only_edit_and_delete_keep_current_event_month ... ok test tests::review_1130::review1130_reconciled_closed_balances ... ok test tests::review_984::review_concurrent_assign_revisions_match_final_report ... ok test tests::review_984::review_category_edit_emits_for_old_category_only ... ok test tests::review_984::review3_outside_current_range_writes_emit_no_overspend ... ok test tests::review_984::review_cross_month_refund_move_emits_current_crossing ... ok test tests::review_984::review_user_zone_month_and_year_edges ... ok test tests::review_984::review_file_replacement_advances_month_revision ... ok test tests::review_984::review_exact_zero_healing_recrossing_and_delete ... ok test tests::review_bulkrev2::four_conflicts_return_409_without_writing ... ok test tests::idle_import_receive_releases_admission_and_cancel_stops_read ... ok test tests::review_984::review_split_and_tracking_transfer_writes_are_rejected_without_events ... ok test tests::source_total_mismatch_cannot_be_confirmed ... ok test tests::simultaneous_import_confirmations_have_one_winner ... ok test tests::review_984::review_source_generation_tracks_all_files_and_restoration ... ok test tests::transaction_identity_preview_is_atomic_and_reimport_changes_nothing ... ok test tests::transfer_register_view_exposes_linked_category ... ok test tests::same_handle_settles_a_failed_move_before_the_next_request ... ok test tests::wizard_background_job_recovers_preview_after_response_is_dropped ... ok test tests::transaction_logged_event_has_the_documented_create_payload ... ok test tests::wizard_background_job_retains_safe_failure ... ok test tests::ynab_conflicting_accounts_and_payees_are_not_silently_discarded ... ok test tests::ynab_csv_import_keeps_exact_month_and_register_amounts ... ok test tests::ynab_duplicate_category_ids_are_merged_only_when_identical ... ok test tests::ynab_plan_json_import_keeps_exact_milliunits ... ok test tests::ynab_public_demo_imports_duplicate_category_names_by_id ... ok test tests::wizard_starter_categories_validate_before_create_and_do_not_change_totals ... ok test tests::transfer_cleared_edits_are_per_account ... ok test tests::update_transaction_emits_current_month_overspend_crossing ... ok test tests::durable_import_tests::operation_recovery_survives_process_exit_at_every_phase ... ok test tests::review_bulkrev2::two_and_five_assignment_races_match_serial_targets ... ok test import::import_review_tests::actual_stream_memory_guard_child ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 134 filtered out; finished in 40.24s test import::import_review_tests::actual_stream_keeps_a_large_history_bounded ... ok test tests::durable_import_tests::generated_import_confirm_replay_and_undo_preserve_minor_units ... ok test tests::slow_15mb_import_receive_completes_with_progress ... ok test tests::durable_import_tests::replacement_restarts_at_every_durable_phase ... ok test tests::bulk_write_balances_equal_one_by_one has been running for over 60 seconds test tests::card_models_ignore_arrival_batch_and_timezone has been running for over 60 seconds test tests::bulk_write_balances_equal_one_by_one ... ok test tests::card_models_ignore_arrival_batch_and_timezone ... ok test result: ok. 133 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 606.52s Running tests/import_review.rs (/home/kayg/build/targets/bulkrev4/debug/deps/import_review-6a0b9e5006b57cbf) running 32 tests test identity_csv_transfer_growth_curve ... ignored, run with MONEY_IDENT_CSV_ROWS for 10k/100k/1M transfer profiling test recheck_actual_stream_growth_curve ... ignored, run with MONEY_RECHECK_ARCHIVE and MONEY_RECHECK_ROWS for profiling test recheck_csv_transfer_growth_curve ... ignored, run with MONEY_RECHECK_TRANSFERS for the bounded CSV growth probe test recheck_conflicting_transaction_ids_are_rejected ... ok test csv_transaction_ids_merge_or_reject_before_totals ... ok test split_identity_cannot_reuse_a_top_level_id ... ok test split_identity_includes_parent_deleted_and_transfer_fields ... ok test split_identity_rejects_an_inconsistent_embedded_parent ... ok test split_identity_review_cases_reject ... ok test transaction_identity_checks_fields_and_keeps_distinct_ids ... ok test csv_amount_edges_never_round_group_or_overflow ... ok test recheck_identical_transaction_ids_do_not_double_money ... ok test corrupt_actual_database_is_a_private_error ... ok test transfer_legs_prefer_a_same_month_mate ... ok test csv_bom_mixed_endings_and_decimal_comma_are_exact ... ok test recheck_e2e_csv_has_four_checks_and_keeps_every_minor_unit ... ok test transfer_month_review_cases_reject ... ok test recheck_reconciled_negative_zero_and_exact_source_scales ... ok test ynab_account_check_rejects_a_wrong_normalization ... ok test split_identity_concrete_valid_totals ... ok test ynab_negative_zero_amount_is_zero ... ok test unmatched_transfer_legs_keep_the_source_register ... ok test ynab_unrepresentable_milliunits_are_rejected ... ok test transfer_month_identity_rejects_in_both_adapters ... ok test csv_pairing_accepts_cancellation_during_its_loop ... ok test ynab_json_keeps_exact_split_and_transfer_postings ... ok test transaction_identity_preserves_exact_units ... ok test ynab_csv_preserves_exact_minor_units ... ok test split_identity_merges_before_totals ... ok test transfer_month_pairing_keeps_dates_and_exact_pair_priority ... ok test csv_pairing_keeps_exact_account_legs ... ok test raw_ynab_registers_match_a_raw_row_oracle ... ok test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 7.85s Doc-tests calternal_plugin_money running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` ### `python3 tests/money/bulkrev4-numbers.py` ```text 07b33aa56ff97a67: A=13222722 B=108 P=13222755 reserve=0; every stored field correct 08d823459b4f7555: A=1 B=1 P=1 reserve=0; every stored field correct 10dad10f207e3966: A=13222722 B=1 P=13222722 reserve=0; every stored field correct 217b597cc7b1b339: A=109170509 B=1000000000 P=110838733 reserve=889161267; every stored field correct 3c10364db1d4cd46: A=109170509 B=1 P=109170509 reserve=0; every stored field correct 405bf72849418ee7: A=28500 B=1 P=28500 reserve=0; every stored field correct 5cd63c6abac2f757: A=103816 B=1 P=103816 reserve=0; every stored field correct 70887b8579a61566: A=5789 B=1035233 P=55551 reserve=979682; every stored field correct aa06a27413c2238d: A=103816 B=454 P=103879 reserve=0; every stored field correct de05e2804212ba0e: A=5789 B=1 P=5789 reserve=0; every stored field correct f161754b530689ba: A=28500 B=8319 P=31192 reserve=0; every stored field correct Burst pins: reserve=6474+4103=10577; uncovered=51911-10577=41334 901a5dc38f13b647: February Available fees=-15151 tax=-3309 interest=-3232 retail=payment=0; reserve=0; raw/uncovered debt=366524 e6d77a36b9ded73d: RTA=1150500-560500+(20000-9853)=600147 PASS: 11 complete vectors, both changed burst pins and both changed vector records ``` ### `tests/money/bulkrev4-probe.sh --nocapture --test-threads=1` ```text running 6 tests test exact_bounds_and_hidden_categories ... Real visibility:: hidden preserves totals; deleted Category reference rejects; exact bounds pass ok test generated_opening_credit_conserves ... ignored, known BLOCK R4-1; run explicitly to shrink the accepted input test generated_unlinked_card_conserves ... ignored, known BLOCK R4-2; run explicitly to shrink the accepted input test hand_checked_envelope_edges ... CASE underfunded month=2026-03 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=0 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=0 CASE underfunded month=2026-04 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=0 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=0 CASE underfunded month=2026-05 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=0 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=0 CASE unfunded_later month=2026-03 allocation=100 real=200 delta=-100 cash=200 card=-100 other=0 food=-100 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=100 CASE unfunded_later month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0 CASE unfunded_later month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0 CASE part_funded_later month=2026-03 allocation=150 real=200 delta=-50 cash=200 card=-100 other=0 food=-50 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=50 CASE part_funded_later month=2026-04 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=50 CASE part_funded_later month=2026-05 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=50 CASE cash_overspend month=2026-03 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=-50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=0 CASE cash_overspend month=2026-04 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE cash_overspend month=2026-05 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE mixed_cash_credit month=2026-03 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=-50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=0 CASE mixed_cash_credit month=2026-04 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE mixed_cash_credit month=2026-05 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE refund_above_debt month=2026-03 allocation=250 real=250 delta=0 cash=200 card=50 other=0 food=150 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE refund_above_debt month=2026-04 allocation=250 real=250 delta=0 cash=200 card=50 other=0 food=150 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE refund_above_debt month=2026-05 allocation=250 real=250 delta=0 cash=200 card=50 other=0 food=150 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE funded_later month=2026-03 allocation=200 real=200 delta=0 cash=200 card=-100 other=0 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0 CASE funded_later month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE funded_later month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE fully_paid month=2026-03 allocation=200 real=200 delta=0 cash=100 card=100 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE fully_paid month=2026-04 allocation=200 real=200 delta=0 cash=100 card=100 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE fully_paid month=2026-05 allocation=200 real=200 delta=0 cash=100 card=100 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE partial_payment month=2026-03 allocation=150 real=150 delta=0 cash=150 card=-50 other=0 food=100 dining=0 reserve=50 other_reserve=0 rta=0 uncovered=0 CASE partial_payment month=2026-04 allocation=150 real=150 delta=0 cash=150 card=-50 other=0 food=100 dining=0 reserve=50 other_reserve=0 rta=0 uncovered=0 CASE partial_payment month=2026-05 allocation=150 real=150 delta=0 cash=150 card=-50 other=0 food=100 dining=0 reserve=50 other_reserve=0 rta=0 uncovered=0 CASE split_refund month=2026-03 allocation=200 real=200 delta=0 cash=50 card=150 other=0 food=100 dining=100 reserve=0 other_reserve=0 rta=0 uncovered=0 CASE split_refund month=2026-04 allocation=200 real=200 delta=0 cash=50 card=150 other=0 food=100 dining=100 reserve=0 other_reserve=0 rta=0 uncovered=0 CASE split_refund month=2026-05 allocation=200 real=200 delta=0 cash=50 card=150 other=0 food=100 dining=100 reserve=0 other_reserve=0 rta=0 uncovered=0 CASE debt_transfer month=2026-03 allocation=200 real=200 delta=0 cash=200 card=0 other=-100 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0 CASE debt_transfer month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=-100 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0 CASE debt_transfer month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=-100 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0 CASE credit_spending month=2026-03 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0 CASE credit_spending month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0 CASE credit_spending month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0 CASE credit_transfer month=2026-03 allocation=300 real=300 delta=0 cash=200 card=-100 other=100 food=0 dining=0 reserve=0 other_reserve=0 rta=300 uncovered=100 CASE credit_transfer month=2026-04 allocation=300 real=300 delta=0 cash=200 card=-100 other=100 food=0 dining=0 reserve=0 other_reserve=0 rta=300 uncovered=100 CASE credit_transfer month=2026-05 allocation=300 real=300 delta=0 cash=200 card=-100 other=100 food=0 dining=0 reserve=0 other_reserve=0 rta=300 uncovered=100 ok test opening_credit_and_missing_payment_observations ... CASE positive_card_opening month=2026-01 allocation=0 real=1 delta=-1 cash=0 card=1 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=0 uncovered=0 CASE positive_card_opening month=2026-02 allocation=0 real=1 delta=-1 cash=0 card=1 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=0 uncovered=0 CASE unlinked_card month=2026-01 L=0 M=1 rta=0 food=0 cash=1 card=-1 CASE unlinked_card month=2026-02 L=0 M=1 rta=0 food=0 cash=1 card=-1 ok test wider_histories ... ok test result: ok. 4 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 17.10s ``` ### `artifacts/bulkrev4-probe --ignored --nocapture --test-threads=1 (exit 101, expected BLOCK witnesses)` ```text running 2 tests test generated_opening_credit_conserves ... thread 'generated_opening_credit_conserves' (278672) panicked at tests/money/bulkrev4-probe.rs:294:1: Test failed: assertion failed: `(left == right)` left: `0`, right: `1` at tests/money/bulkrev4-probe.rs:303. minimal failing input: n = 1 successes: 0 local rejects: 0 global rejects: 0 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace FAILED test generated_unlinked_card_conserves ... thread 'generated_unlinked_card_conserves' (278675) panicked at tests/money/bulkrev4-probe.rs:294:1: Test failed: assertion failed: `(left == right)` left: `0`, right: `1` at tests/money/bulkrev4-probe.rs:313. minimal failing input: n = 1 successes: 0 local rejects: 0 global rejects: 0 FAILED failures: failures: generated_opening_credit_conserves generated_unlinked_card_conserves test result: FAILED. 0 passed; 2 failed; 0 ignored; 0 measured; 4 filtered out; finished in 0.06s ``` ### `cargo clean` ```text Removed 3459 files, 2.0GiB total ``` No web output was created. The standalone probe binary was deleted. All changed module and function comments were read again before this report. No secrets were displayed. No push, deployment or merge into dev was performed. BLOCK — R4-1 positive Card opening credit disappears; R4-2 accepted unlinked Card purchases remove funded money.
Author
Owner

bulkfix4 starts on branch job/bulkwrite-1393 at 82087a0163. Baseline origin/dev is cc1af3c12b. I will classify R4-1/R4-2 on that baseline, then fix opening Card credit and missing payment-link conservation, with focused and generated regressions. No push or deploy.

bulkfix4 starts on branch job/bulkwrite-1393 at 82087a0163a30f66a9bd190ad2e67db412f760c7. Baseline origin/dev is cc1af3c12b68ad26c8403adde1be39c096b9ddea. I will classify R4-1/R4-2 on that baseline, then fix opening Card credit and missing payment-link conservation, with focused and generated regressions. No push or deploy.
Author
Owner

bulkfix4 baseline classification

Ran the unchanged round-4 Markdown observation probe as a temporary integration test on detached origin/dev cc1af3c12b68ad26c8403adde1be39c096b9ddea, before product edits. All amounts are synthetic fixture minor units.

Defect origin/dev January and February Classification
R4-1 Card +1, Ready to Assign 0, allocation 0, real money 1 PRE-EXISTING
R4-2 Cash 1, Card -1, Food 0, Ready to Assign 0, allocation 0, real money 1 PRE-EXISTING

Command: cargo test --manifest-path artifacts/bulkfix4-dev/Cargo.toml -p calternal-money --test bulkfix4_baseline opening_credit_and_missing_payment_observations -- --nocapture. Result: test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 5 filtered out; finished in 0.02s. This observation test prints defects; it does not assert the incorrect totals. Both defects survive rollover, and neither was introduced by the R3 fixes.

## bulkfix4 baseline classification Ran the unchanged round-4 Markdown observation probe as a temporary integration test on detached origin/dev `cc1af3c12b68ad26c8403adde1be39c096b9ddea`, before product edits. All amounts are synthetic fixture minor units. | Defect | origin/dev January and February | Classification | | --- | --- | --- | | R4-1 | Card +1, Ready to Assign 0, allocation 0, real money 1 | PRE-EXISTING | | R4-2 | Cash 1, Card -1, Food 0, Ready to Assign 0, allocation 0, real money 1 | PRE-EXISTING | Command: `cargo test --manifest-path artifacts/bulkfix4-dev/Cargo.toml -p calternal-money --test bulkfix4_baseline opening_credit_and_missing_payment_observations -- --nocapture`. Result: `test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 5 filtered out; finished in 0.02s`. This observation test prints defects; it does not assert the incorrect totals. Both defects survive rollover, and neither was introduced by the R3 fixes.
Author
Owner

bulkfix4 R4-2 vector finding and decision

The full Money test run found exactly one changed record out of 625: de7c249363a57c0c. Its Card omits its payment link, so the requested R4-2 rule (every accepted Card has a distinct payment Category) changes its report shape. The new Category is card-payment-visa, Available 0; reserve 0; raw Card debt -4,950; uncovered debt 4,950. Food remains -4,950 and Ready to Assign remains 0. All amounts are synthetic fixture minor units. This is the explicit R4-2 behavior change, not a blanket oracle exception: update only those metadata/report fields and add an independent exact assertion. All prior B1/N2/R3 and eleven refund records remain unchanged.

Decision for the unspecified legacy case: deterministic, idempotent repair in the parsed calculation/edit view; normal edits save repaired metadata, with Category-first publication before a new Account link. Reads never write. A payment-for marker keyed by stable Account ID lets repair reuse a Category after a partial save. Same-named Cards remain distinct; ID collisions use the existing suffix rule. §48 states this rule.

## bulkfix4 R4-2 vector finding and decision The full Money test run found exactly one changed record out of 625: `de7c249363a57c0c`. Its Card omits its payment link, so the requested R4-2 rule (every accepted Card has a distinct payment Category) changes its report shape. The new Category is `card-payment-visa`, Available 0; reserve 0; raw Card debt -4,950; uncovered debt 4,950. Food remains -4,950 and Ready to Assign remains 0. All amounts are synthetic fixture minor units. This is the explicit R4-2 behavior change, not a blanket oracle exception: update only those metadata/report fields and add an independent exact assertion. All prior B1/N2/R3 and eleven refund records remain unchanged. Decision for the unspecified legacy case: deterministic, idempotent repair in the parsed calculation/edit view; normal edits save repaired metadata, with Category-first publication before a new Account link. Reads never write. A payment-for marker keyed by stable Account ID lets repair reuse a Category after a partial save. Same-named Cards remain distinct; ID collisions use the existing suffix rule. §48 states this rule.
Author
Owner

bulkfix4 core fix committed

Core commit e2ce0a08d: conserve opening Card credit and repair missing payment Categories. cargo clippy -p calternal-money --all-targets -- -D warnings passes. cargo test -p calternal-money passes: 72 passed, 1 ignored. The 256-history property now generates signed openings on both Cards, missing links on either Card, raw Account sums, post-rollover conservation, full shuffle equality and a separate current-month Ready to Assign check from raw ordered legs and Assignments. The latter uses prior positive Category carry as a boundary input; it does not compute Ready to Assign from the current allocation sum. Both one-cent and 12,345-cent witnesses assert the correct values.

The required single fetch/merge of origin/dev returned Already up to date. Server editable-view and Category-first persistence regression tests are the remaining feature slice; the two-crate gates are running.

## bulkfix4 core fix committed Core commit `e2ce0a08d`: conserve opening Card credit and repair missing payment Categories. `cargo clippy -p calternal-money --all-targets -- -D warnings` passes. `cargo test -p calternal-money` passes: 72 passed, 1 ignored. The 256-history property now generates signed openings on both Cards, missing links on either Card, raw Account sums, post-rollover conservation, full shuffle equality and a separate current-month Ready to Assign check from raw ordered legs and Assignments. The latter uses prior positive Category carry as a boundary input; it does not compute Ready to Assign from the current allocation sum. Both one-cent and 12,345-cent witnesses assert the correct values. The required single fetch/merge of origin/dev returned `Already up to date.` Server editable-view and Category-first persistence regression tests are the remaining feature slice; the two-crate gates are running.
Author
Owner

bulkfix4 independent verification

The unchanged round-4 probe now passes with all formerly ignored conservation properties enabled: tests/money/bulkrev4-probe.sh --include-ignored --nocapture --test-threads=1. Verbatim result: test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 26.18s. This includes the 512 wider histories and both one-cent shrink properties. January and February opening-credit allocations and real money are both 1; January and February unlinked-Card funded allocations and real money are both 1. The Python independent number script also passes every stored field in the eleven refund vectors and both prior corrected burst/vector results.

Required two-crate Clippy gate passed. Plugin test binaries are building for the combined test gate; server document-view persistence is the remaining verification.

## bulkfix4 independent verification The unchanged round-4 probe now passes with all formerly ignored conservation properties enabled: `tests/money/bulkrev4-probe.sh --include-ignored --nocapture --test-threads=1`. Verbatim result: `test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 26.18s`. This includes the 512 wider histories and both one-cent shrink properties. January and February opening-credit allocations and real money are both 1; January and February unlinked-Card funded allocations and real money are both 1. The Python independent number script also passes every stored field in the eleven refund vectors and both prior corrected burst/vector results. Required two-crate Clippy gate passed. Plugin test binaries are building for the combined test gate; server document-view persistence is the remaining verification.
Author
Owner

bulkfix4 gate finding

The combined plugin test gate aborted at the existing tests::concurrent_store_edits_keep_exactly_one_winner: thread ... has overflowed its stack, fatal runtime error: stack overflow, aborting, SIGABRT. No expectation was changed. The new Category-first publication branch enlarged the shared async write future, including for ordinary Budget edits that do not take that branch. Move the cold repair/publication path to a private boxed async helper so the normal write future stays small. Run the exact failing test first, then resume the affected crate gate. This is a real blocker found and fixed in the job, not a SLOW finding.

## bulkfix4 gate finding The combined plugin test gate aborted at the existing `tests::concurrent_store_edits_keep_exactly_one_winner`: `thread ... has overflowed its stack`, `fatal runtime error: stack overflow, aborting`, SIGABRT. No expectation was changed. The new Category-first publication branch enlarged the shared async write future, including for ordinary Budget edits that do not take that branch. Move the cold repair/publication path to a private boxed async helper so the normal write future stays small. Run the exact failing test first, then resume the affected crate gate. This is a real blocker found and fixed in the job, not a SLOW finding.
Author
Owner

bulkfix4 stack and size-cap regressions fixed

The exact existing concurrent-write regression passes after boxing the cold Account repair publisher. The new multi-step legacy fixture then exposed another stack overflow before shared setup returned. Box the nested filesystem writer and the new fixture setup/write futures; do not change stack-size settings or remove assertions. The filesystem writers carry fixed IO buffers, so their async future sizes matter even before the guarded path runs.

Focused result, verbatim: test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 136 filtered out; finished in 6.43s. Both legacy regressions pass on the normal test stack. They prove that reads leave source bytes unchanged, repaired Categories remain editable, Category-first publication resolves new links, a partial save reuses its identity, retries leave equal Budget bytes untouched, original source hashes remain CAS authority, and a Budget at the 8 MiB reader cap refuses the repair before changing either file. No existing expectation changed.

The final two-crate gate is running after these fixes. Earlier aborted outputs are retained in artifacts and will be disclosed in the final report.

## bulkfix4 stack and size-cap regressions fixed The exact existing concurrent-write regression passes after boxing the cold Account repair publisher. The new multi-step legacy fixture then exposed another stack overflow before shared setup returned. Box the nested filesystem writer and the new fixture setup/write futures; do not change stack-size settings or remove assertions. The filesystem writers carry fixed IO buffers, so their async future sizes matter even before the guarded path runs. Focused result, verbatim: `test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 136 filtered out; finished in 6.43s`. Both legacy regressions pass on the normal test stack. They prove that reads leave source bytes unchanged, repaired Categories remain editable, Category-first publication resolves new links, a partial save reuses its identity, retries leave equal Budget bytes untouched, original source hashes remain CAS authority, and a Budget at the 8 MiB reader cap refuses the repair before changing either file. No existing expectation changed. The final two-crate gate is running after these fixes. Earlier aborted outputs are retained in artifacts and will be disclosed in the final report.
Author
Owner

bulkfix4 publication preflight

Resolving a linked ID is not sufficient: a stale Account edit could resolve its old payment link to an Expense Category after a Budget edit. The Category-first publisher now reuses replay metadata validation with an empty month list before writing either source. It rejects wrong kinds and shared payment links without replaying transactions. The focused legacy regression sends a known Expense target and proves both files remain unchanged, then verifies the normal valid publication, reload and editing flow. Verbatim result: test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 136 filtered out; finished in 13.59s. No existing expectation changed. The in-progress gate was superseded for this last publication check; the final gate is now running with it included.

## bulkfix4 publication preflight Resolving a linked ID is not sufficient: a stale Account edit could resolve its old payment link to an Expense Category after a Budget edit. The Category-first publisher now reuses replay metadata validation with an empty month list before writing either source. It rejects wrong kinds and shared payment links without replaying transactions. The focused legacy regression sends a known Expense target and proves both files remain unchanged, then verifies the normal valid publication, reload and editing flow. Verbatim result: `test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 136 filtered out; finished in 13.59s`. No existing expectation changed. The in-progress gate was superseded for this last publication check; the final gate is now running with it included.
Author
Owner

bulkfix4 server slice committed

Commit bda6bc7eccdc2a4b6fe017831e67002e91a013c0 makes repaired Category documents editable with original source CAS hashes, publishes new Categories before Account links, skips equal Budget bytes on retry, enforces the reader cap before publishing, and rejects stale Expense links before either file changes. It keeps the write futures small on the default test stack. Both focused legacy regressions pass, the positive-opening route passes in the full run, and the final two-crate Clippy gate passes. No existing status-code or fixture expectation changed.

The final combined test gate has passed the new tests, the concurrent-edit regression, import, authorization, identity, recovery and Undo checks so far. Only the two existing bulk comparison properties remain in the plugin unit run. There are no failures in this final run. The source worktree is clean; this comment is progress, not a READY report. I will post full gate output and the final report after those properties settle.

## bulkfix4 server slice committed Commit `bda6bc7eccdc2a4b6fe017831e67002e91a013c0` makes repaired Category documents editable with original source CAS hashes, publishes new Categories before Account links, skips equal Budget bytes on retry, enforces the reader cap before publishing, and rejects stale Expense links before either file changes. It keeps the write futures small on the default test stack. Both focused legacy regressions pass, the positive-opening route passes in the full run, and the final two-crate Clippy gate passes. No existing status-code or fixture expectation changed. The final combined test gate has passed the new tests, the concurrent-edit regression, import, authorization, identity, recovery and Undo checks so far. Only the two existing bulk comparison properties remain in the plugin unit run. There are no failures in this final run. The source worktree is clean; this comment is progress, not a READY report. I will post full gate output and the final report after those properties settle.
Author
Owner

bulkfix4 complete

HEAD: cd622b94e212d88dd2e7292a796f2ad5f82df2cc

Money conservation fixes — bulkfix4, #1393

All amounts are synthetic test minor units. Both R4 defects are FIXED.
Code commits: e2ce0a08db2a73ba748360766716e019bfef3697 and bda6bc7eccdc2a4b6fe017831e67002e91a013c0. The final issue
comment gives the report commit HEAD. No push, deploy or promotion was made.

Baseline classification

Before product changes, the unchanged observation probe ran on detached
origin/dev cc1af3c12b68ad26c8403adde1be39c096b9ddea. It used the same
method as bulkfix3: real Markdown codec, projection and replay on the
baseline. The table was posted on #1393 before the fixes.

Defect Baseline January and February Classification
R4-1 Card +1, Ready to Assign 0, allocations 0, real money 1 PRE-EXISTING
R4-2 Cash 1, Card -1, Food 0, Ready to Assign 0, allocations 0, real money 1 PRE-EXISTING

The baseline observation test passed because it prints the defects. It does
not assert the wrong amounts. Both defects survive rollover on origin/dev.
The required single fetch and merge of origin/dev gave Already up to date.

Built and files

  • crates/calternal-money/src/budget.rs: put the exact positive-credit
    change from a Card opening in Ready to Assign. Debt adds no budget money.
    Reject a hand-built Ledger with missing or invalid payment links before
    replay can discard funded money.
  • crates/calternal-money/src/edit.rs: reuse the existing Category editor,
    ID collision rule, Markdown property writer and reference writer. Repair
    missing Card payment links in stable Account ID order. A payment for
    marker lets a partial save reuse its Category. Same-named Cards stay distinct.
  • crates/calternal-money/src/ledger.rs: apply that shared repair before
    calculation, including direct codec and streamed import callers.
  • crates/plugins/money/src/store.rs: expose repaired editable documents
    with the original source hashes for CAS. Keep the shared parse cache
    unchanged. Before an Account edit saves a repaired link, save its Category
    first. Skip equal Budget bytes on retry. Reject a repair above the reader
    size cap before any write. Validate a link's payment kind and uniqueness
    before publication, not only whether its target exists.
  • crates/calternal-money/tests/review_bulkrev3.rs: normal regressions for
    one-cent and 12,345-cent R4 witnesses, signed and repeated openings,
    refunds after rollover, repair collisions, duplicate display names and
    partial-save reuse. Extend the 256-history property with signed openings
    on both Cards and missing links on either Card. Keep raw Account sums,
    full model shuffle checks and conservation after each rollover. Check
    current-month Ready to Assign separately from raw ordered Account legs
    and Assignments, with prior positive Category carry as the boundary input.
  • crates/plugins/money/src/tests.rs: verify the positive-opening route,
    editable repaired Categories, Category-first persistence, restart reuse,
    source hash authority, unchanged source bytes on read and size-cap refusal.
  • crates/calternal-money/tests/vectors.rs and
    contracts/vectors/money/money.v1.json: change only the R4-2 report fields
    in de7c249363a57c0c and add exact assertions. Its unlinked Card now has a
    zero-balance payment Category and uncovered debt 4,950. Food stays -4,950;
    Ready to Assign stays 0. No vector input or divergence rule changed. All
    eleven refund vectors and the previous R3 records and burst pins stay unchanged.
  • docs/DESIGN.md §48: state opening-credit and legacy payment repair rules.

Decisions

Every accepted Card has one distinct payment Category. Use deterministic
repair in the parsed calculation and edit view for older files. Reads do not
write. Normal metadata edits save the repair with source hash checks. Save
new Categories before new Account links. A failure can leave an unused
Category, which its Account marker lets a retry reuse. Do not match by name.
This fills the R4-2 gap in §48 without a new route or background migration.

A Card opening adds only its positive-balance change to Ready to Assign.
This works across zero in both directions and with repeated adjustments.
Negative opening debt creates no Category money or Ready to Assign.

Verification and limits

The unchanged round-4 Rust probe passes with both formerly ignored shrink
properties enabled: six tests, including 512 wider histories. The independent
Python script still verifies every stored field in the eleven refund records
and the two previous corrected burst and vector results. B1, N2, R3-1 through
R3-5, shuffle independence and the 625-record vector test pass.

No requested conservation gap remains in the tested domain. The generated
current-month Ready to Assign check uses prior positive Category Available
as a boundary input; it is not a second independent Category funding engine.
Exact random current-month U remains private. The hand witnesses have known U.
Card income, Tracking and import reconciliation keep their existing coverage;
this report makes no new universal conservation claim for those forms.

There is no new UI control, route, background job or dependency. No UI
screenshot set or new throughput profile is part of this correctness slice.
Under the current verification policy, the original bulk throughput
measurements remain with the performance and merge rounds. Expected cost:
Card opening arithmetic is O(1) per leg. Healthy metadata repair scans Account
sections only. For K missing links it sorts K stable IDs and uses the existing
pure editors on the two metadata documents. It adds no Home scan or per-row IO.
For metadata of B bytes and K missing Cards, the existing editors do
O(K × B) byte work. The healthy path avoids copies of Budget.md.
Retained repair data is bounded by those documents and their Category markers.

UX gaps closed: the repaired Category is assignable and receives funded
purchases through the existing API. No new UI controls were built. UX gaps
left: none in this backend scope.

For the merge round

Run bun tests/adversarial/money_api.mjs against the merged local server to
check authorization, exact amounts and durable batch isolation with the
corrected replay. Run tests/adversarial/run.sh for the full cross-User and
protocol matrices. Full web suites, release/staging checks, Mac interop and
the original bulk throughput acceptance stay with the merge round. This job
ran the focused route regressions and one finite round-4 campaign.

Gates

Final results: calternal-money 72 passed, 1 ignored; calternal-plugin-money
165 passed, 5 ignored, plus its parent-invoked memory guard child. The two
bulk comparison properties passed. Existing ignored tests stay unchanged.

Use CARGO_BUILD_JOBS=4, CARGO_PROFILE_DEV_DEBUG=line-tables-only,
CARGO_INCREMENTAL=0 and TMPDIR=/target/tmp. Keep the configured
CARGO_TARGET_DIR unchanged. The output below is verbatim.

The first combined plugin gate aborted in the existing concurrent-edit test
with a stack overflow. The new Account publication branch enlarged the
shared write future. Move that cold branch to a boxed private async helper.
The exact concurrent_store_edits_keep_exactly_one_winner test then passed
on the normal test stack. A later gate reached a stack overflow in the new
multi-step legacy fixture, before shared setup returned. Box the nested
filesystem writer and the fixture's setup and write futures. Both legacy
regressions then passed on the normal stack (2 passed in 6.43s). No assertion
or input was removed. Restart the affected gates after these fixes.
A final publication check also rejects a stale link to an Expense Category
before either source file changes. Reuse replay's metadata validation with no
months; do not duplicate its link-kind or uniqueness rules. The focused legacy
tests pass with this check (2 passed in 13.59s). One in-progress gate was
superseded when this preflight was added; keep it in
artifacts/bulkfix4-tests-superseded.log. It is not a passing result.
No stack-size setting or existing test expectation changed. Keep both aborted
runs in artifacts/bulkfix4-tests-stack-abort.log and
artifacts/bulkfix4-tests-legacy-stack-abort.log; neither is a passing result.

cargo fmt --check

Exit 0. No output.

cargo clippy -p calternal-money -p calternal-plugin-money --all-targets -- -D warnings

    Checking calternal-plugin-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/plugins/money)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 17.14s

cargo test -p calternal-money -p calternal-plugin-money -- --test-threads=4

    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.96s
     Running unittests src/lib.rs (/home/kayg/build/targets/bulkfix4/debug/deps/calternal_money-5ad27f9b5c008064)

running 16 tests
test codec::tests::empty_payee_is_refused_by_the_writer ... ok
test codec::tests::malformed_dated_rows_fail_instead_of_vanishing ... ok
test codec::tests::property_edit_changes_one_value ... ok
test codec::tests::round_trip_keeps_bom_crlf_and_unknown_bytes ... ok
test edit::tests::cleared_tag_toggles_without_touching_other_tags ... ok
test codec::tests::transaction_round_trip_with_punctuation_in_labels_and_payee ... ok
test edit::tests::crlf_file_keeps_crlf_on_insert ... ok
test edit::tests::unicode_payee_tag_boundaries_match_shared_vectors ... ok
test units::independent_number_review::signed_edges_and_long_zero_padding_keep_exact_minor_units ... ok
test units::tests::exact_range_is_enforced_on_parse_and_arithmetic ... ok
test units::tests::format_uses_explicit_sign_and_exact_scale ... ok
test units::tests::parse_matches_the_oracle_examples ... ok
test units::tests::scale_table_has_all_165_codes_with_unique_entries ... ok
test codec::tests::checked_parse_stops_after_a_bounded_line_batch ... ok
test edit::tests::new_budget_projects_with_no_accounts ... ok
test edit::tests::assign_inserts_updates_and_removes_rows ... ok

test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s

     Running tests/account_kinds.rs (/home/kayg/build/targets/bulkfix4/debug/deps/account_kinds-40f136ace82559dd)

running 5 tests
test account_projection_rejects_legacy_and_unknown_kinds ... ok
test off_budget_balance_marker_does_not_change_budget_money ... ok
test tracking_deficit_rollover_does_not_reduce_ready_to_assign ... ok
test categorized_debit_loan_transfers_post_one_budget_leg ... ok
test imported_account_kinds_project_without_losing_identity ... ok

test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.11s

     Running tests/import.rs (/home/kayg/build/targets/bulkfix4/debug/deps/import-32258f8fda96f336)

running 13 tests
test duplicate_source_ids_are_rejected_and_duplicate_names_are_kept ... ok
test import_render_is_exact_and_byte_stable ... ok
test import_keeps_same_day_source_order_for_credit_payments_and_refunds ... ok
test import_render_reports_progress_and_propagates_cancel ... ok
test import_stream_renderer_matches_full_rendered_files ... ok
test production_v1_metadata_upgrade_keeps_balances ... ok
test import_replay_matches_full_ledger_month_by_month ... ok
test recheck_half_minor_units_negative_zero_and_nineteen_digits ... ok
test budget_replay_stops_at_a_bounded_transaction_checkpoint ... ok
test imported_ready_to_assign_matches_independent_month_oracle ... ok
test recheck_same_day_payment_and_refund_keep_source_fifo ... ok
test random_imports_conserve_source_balances_and_markdown ... ok
test recheck_random_multicurrency_ledgers_match_all_monthly_totals ... ok

test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.87s

     Running tests/properties.rs (/home/kayg/build/targets/bulkfix4/debug/deps/properties-9ff9e71a800dacb8)

running 21 tests
test bill_coverage_never_clamps_the_bill ... ok
test bulkrev2::boundary_shuffle_reports_acceptance_difference ... ok
test bulkrev2::i64_extremes_are_rejected_and_safe_bound_is_exact ... ok
test bulkrev2::literal_account_sum_and_funded_card_conservation ... ok
test bulkrev2::refund_payment_calendar_choice_is_visible_next_month ... ok
test any_text_that_parses_serializes_to_the_same_bytes ... ok
test bulkrev2::split_refund_keeps_payment_overfunding_when_card_becomes_positive ... ok
test assign_then_unassign_is_the_identity ... ok
test decimal_text_round_trips_for_every_scale ... ok
test cash_ledgers_conserve_money_every_month ... ok
test fully_funded_card_spending_conserves_cash ... ok
test money_code_never_uses_floating_point ... ok
test mixed_cash_credit_deficit_rolls_only_its_cash_part ... ok
test paired_write_replay_matches_independent_calculations ... ok
test reviewed_burst_order_matches_input_order ... ok
test partial_payment_then_category_refunds_conserve_cash_across_months ... ok
test bulkrev2::funded_shuffles_conserve_real_money_every_month ... ok
test transaction_rows_round_trip_byte_for_byte ... ok
test split_legs_post_exactly_the_parent ... ok
test same_date_card_postings_are_a_function_of_the_set ... ok
test bulkrev2::same_day_shuffles_cover_splits_transfers_and_month_edges ... ok

test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 8.05s

     Running tests/ready_to_assign_adjustment.rs (/home/kayg/build/targets/bulkfix4/debug/deps/ready_to_assign_adjustment-0e1c5c7276d14077)

running 1 test
test ready_to_assign_adjustment_changes_only_the_budget_pool ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s

     Running tests/review_984.rs (/home/kayg/build/targets/bulkfix4/debug/deps/review_984-dc85183370c2f07a)

running 5 tests
test review_pair_performance_profile ... ignored, performance measurements belong to the merge round on the perf VM
test review_pair_rejects_bad_months_and_amounts_without_rounding ... ok
test review_split_remainders_and_tracking_transfers_are_exact ... ok
test review_mixed_pair_matches_independent_replays ... ok
test review_large_ledger_pair_keeps_exact_totals ... ok

test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 4.39s

     Running tests/review_bulkrev3.rs (/home/kayg/build/targets/bulkfix4/debug/deps/review_bulkrev3-cbfa6724c48c7f18)

running 7 tests
test hidden_and_missing_categories ... ok
test legacy_payment_repair_is_idempotent_and_collision_safe ... ok
test card_opening_credit_enters_ready_to_assign_once ... ok
test unlinked_card_funded_purchase_keeps_its_payment_money ... ok
test envelope_edge_cases ... ok
test previous_witnesses_all_orders ... ok
test random_histories_conserve_money_after_every_rollover ... ok

test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 9.94s

     Running tests/vectors.rs (/home/kayg/build/targets/bulkfix4/debug/deps/vectors-b0e2a54af0711cc9)

running 5 tests
test rust_matches_random_oracle_ledgers_without_divergences ... ok
test reviewed_r4_unlinked_card_vector_keeps_its_unfunded_amount ... ok
test reviewed_eleven_refund_vectors_keep_their_exact_numbers ... ok
test reviewed_r3_vectors_assert_retired_debt_and_positive_credit ... ok
test rust_port_matches_every_recorded_oracle_vector ... ok

test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.74s

     Running unittests src/lib.rs (/home/kayg/build/targets/bulkfix4/debug/deps/calternal_plugin_money-3d165b6d3890a332)

running 138 tests
test import::import_review_tests::actual_cents_conversion_never_rounds ... ok
test import::import_review_tests::actual_cc_label_requires_missing_type_confirmation ... ok
test import::import_review_tests::actual_account_checks_use_raw_monthly_source_rows ... ok
test import::import_review_tests::actual_stream_memory_guard_child ... ignored, invoked as an isolated child by actual_stream_keeps_a_large_history_bounded
test import::import_review_tests::import_control_reports_progress_and_stops_cancelled_work ... ok
test import::import_review_tests::actual_transfer_legs_cannot_cross_months ... ok
test import::import_review_tests::actual_orphan_split_children_are_rejected ... ok

running 1 test
test import::import_review_tests::ynab_transfer_pairing_handles_many_duplicate_legs ... ok
test import_fidelity_1130::independent_split_and_transfer_numbers_check ... ok
test routes::durable::admission_tests::cancelled_receiver_cannot_acknowledge_a_durable_job ... ok
test routes::durable::checkpoint_tests::progress_wait_keeps_parser_writer_release_polled ... ok
test routes::durable::admission_tests::live_publication_honors_operational_queue_cancellation ... ok
test routes::import_cleanup_tests::dropped_preview_worker_retains_admission_until_exit ... ok
test routes::import_cleanup_tests::idle_imports_are_reclaimed_by_expiry_cleanup ... ok
test routes::import_cleanup_tests::staged_import_files_keep_ranges_and_release_private_storage ... ok
test routes::import_staged_path_tests::staged_import_name_cannot_select_another_path_or_slot ... ok
test routes::replay_reuse_tests::assignment_retry_rebuilds_from_latest_source_bytes ... ok
test import_fidelity_1130::actual_rows_round_trip ... ok
test routes::replay_reuse_tests::crossings_reuse_checked_current_totals_even_with_future_months ... ok
test routes::replay_reuse_tests::crossings_cover_source_ranges_relative_to_today ... ok
test routes::review_1140::cancel_wins_before_publication_lock ... ok
test routes::review_1140::cancel_does_not_rewrite_published_result ... ok
test routes::durable::money_import_undo_mutation ... ok
test routes::review_1140::review1140_cancel_after_rename_before_receipt_keeps_publication ... ok
test routes::review_1140::review1140_discard_after_confirmation_failure_releases_admission ... ok
test routes::review_1140::review1140_all_formats_replay_exact_balances ... ok
test routes::review_1140::review1140_operational_cancel_before_replacement_returns_no_receipt ... ok
test routes::review_1140::review1140_tcp_malformed_inputs_leave_worker_usable ... ok
test routes::review_1140::review1140_terminal_receipts_do_not_block_new_imports ... ok
test store::parsed_cache_tests::global_budget_and_folder_pruning_release_stale_entries ... ok
test store::parsed_cache_tests::parse_charge_accounts_for_line_structures ... ok
test store::parsed_cache_tests::user_cache_evicts_old_parse_entries_and_shares_hot_documents ... ok
test routes::review_1140::review1140_staged_size_limits_fail_without_publishing ... ok
test tests::a_broken_file_is_reported_not_hidden ... ok
test tests::a_new_user_sees_the_real_empty_state ... ok
test tests::a_journal_for_a_completed_move_changes_nothing ... ok
test routes::review_1140::review1140_replacement_receipt_recovery_does_not_adopt_later_edits ... ok
test tests::active_money_handle_survives_other_users_cache_pressure ... ok
test tests::actual_duplicate_names_import_by_id_without_sharing_a_payment_category ... ok
test tests::a_read_waits_for_a_write_in_progress ... ok
test tests::actual_export_archive_imports_exact_rows_from_private_scratch ... ok
test tests::a_split_row_written_by_hand_is_read_but_not_edited ... ok
test tests::assignments_retry_source_conflicts_without_losing_neighbours ... ok
test tests::api_account_numbers_equal_core_replay ... ok
test tests::backdated_create_emits_current_month_overspend_crossing ... ok
test tests::budget_flow_writes_exact_markdown_and_derives_available ... ok
test tests::bulk_write_invalid_neighbours_do_not_change_valid_rows ... ok
test tests::bulk_write_rejects_intermediate_overflow ... ok
test tests::cancel_racing_confirm_has_one_consistent_outcome ... ok
test tests::bulk_write_month_does_not_need_note_date_backfill ... ok
test tests::cancelling_imports_leaves_no_budget_and_releases_slots ... ok
test tests::card_opening_credit_route_conserves_real_budget_money ... ok
test tests::concurrent_store_edits_keep_exactly_one_winner ... ok
test tests::csv_import_keeps_progress_and_cancel_responsive ... ok
test tests::delete_transaction_emits_current_month_overspend_crossing ... ok
test tests::denied_preview_access_keeps_the_owners_pending_import ... ok
test import::import_review_tests::actual_stream_keeps_a_large_history_bounded has been running for over 60 seconds
test import::import_review_tests::actual_stream_memory_guard_child has been running for over 60 seconds
test import::import_review_tests::actual_stream_memory_guard_child ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 137 filtered out; finished in 72.16s

test import::import_review_tests::actual_stream_keeps_a_large_history_bounded ... ok
test tests::durable_import_tests::operation_exit_child ... ignored, child of operation_recovery_survives_process_exit_at_every_phase
test tests::durable_import_tests::generated_import_confirm_replay_and_undo_preserve_minor_units ... ok
test tests::durable_import_tests::publication_and_inverse_authority_use_full_commits ... ok
test tests::durable_import_tests::queued_import_and_undo_survive_restarts ... ok
test tests::durable_import_tests::receipt_reads_are_bounded_and_old_receipts_are_addressable ... ok
test tests::bulk_write_balances_equal_one_by_one has been running for over 60 seconds
test tests::card_models_ignore_arrival_batch_and_timezone has been running for over 60 seconds
test tests::durable_import_tests::operation_recovery_survives_process_exit_at_every_phase ... ok
test tests::durable_import_tests::replay_preserves_a_live_ready_preview ... ok
test tests::durable_import_tests::running_jobs_do_not_expire_and_cancelled_jobs_do_not_restart ... ok
test tests::durable_import_tests::undo_receipt_replay_never_removes_a_restored_import ... ok
test tests::durable_import_tests::undo_refuses_a_predecessor_restored_before_the_inverse ... ok
test tests::durable_import_tests::replacement_restarts_at_every_durable_phase has been running for over 60 seconds
test tests::durable_import_tests::undo_refuses_every_later_budget_edit_after_restart ... ok
test tests::durable_import_tests::undo_restarts_before_and_after_the_filesystem_inverse ... ok
test tests::failed_cross_month_move_never_counts_the_row_twice ... ok
test tests::far_month_assignment_cannot_make_the_budget_unreadable ... ok
test tests::durable_import_tests::replacement_restarts_at_every_durable_phase ... ok
test tests::gap_month_assignments_and_opening_card_debt_do_not_create_cash ... ok
test tests::hostile_inputs_are_rejected_without_writing ... ok
test tests::historical_overspend_does_not_emit_current_month_event ... ok
test tests::import_fidelity_review_requires_account_kind_and_keeps_notes ... ok
test tests::import_file_limits_match_the_money_reader ... ok
test tests::import_preview_is_owner_bound_and_confirmation_publishes_once ... ok
test tests::import_preview_reads_only_generated_staged_upload_names ... ok
test tests::inferred_opening_balance_needs_explicit_confirmation ... ok
test tests::legacy_card_payment_repair_cannot_make_its_budget_unreadable ... ok
test tests::legacy_card_payment_repair_is_editable_and_saved_category_first ... ok
test tests::memo_and_tags_split_the_payee_without_losing_text ... ok
test tests::money_is_on_for_the_instance_and_off_for_a_new_user ... ok
test tests::idle_import_receive_releases_admission_and_cancel_stops_read ... ok
test tests::month_revision_increases_after_each_assignment ... ok
test tests::move_money_keeps_ready_to_assign_and_card_gets_payment_category ... ok
test tests::multiple_assignment_rows_set_one_exact_total ... ok
test tests::other_users_and_sessions_without_data_scope_see_nothing ... ok
test tests::overflowing_cleared_subset_is_rejected_before_transaction_write ... ok
test tests::overflowing_category_sum_is_rejected_before_assignment_write ... ok
test tests::overflowing_derived_balance_is_rejected_before_the_write ... ok
test tests::overspending_reports_ynab_states ... ok
test tests::plugin_code_never_uses_floating_point ... ok
test tests::parsed_money_cache_shares_documents_and_prunes_removed_months ... ok
test tests::recheck_metadata_files_use_the_reader_size_cap ... ok
test tests::recheck_local_server_number_and_lifecycle_contract ... ok
test tests::recheck_source_checks_owner_and_opening_balance_confirmation ... ok
test tests::review_1130::review1130_cancel_after_partial_preparation ... ok
test tests::recheck_random_preview_cancellation_leaves_no_files ... ok
test tests::review_1130::review1130_legacy_home_needs_no_metadata_rewrite ... ok
test tests::review_1130::review1130_notes_are_inert ... ok
test tests::review_1130::review1130_long_imported_note_allows_amount_edit_without_loss ... ok
test tests::review_1130::review1130_reconciled_closed_balances ... ok
test tests::review_1130::review1130_split_and_closed_transfer_have_one_posting ... ok
test tests::review_984::review3_first_future_transaction_keeps_current_event_month ... ok
test tests::review_1130::review1130_tcp_locks_reimport_and_cancel ... ok
test tests::review_984::review3_future_only_edit_and_delete_keep_current_event_month ... ok
test tests::review_984::review_category_edit_emits_for_old_category_only ... ok
test tests::review_984::review3_outside_current_range_writes_emit_no_overspend ... ok
test tests::review_984::review_concurrent_assign_revisions_match_final_report ... ok
test tests::review_984::review_cross_month_refund_move_emits_current_crossing ... ok
test tests::review_984::review_file_replacement_advances_month_revision ... ok
test tests::review_984::review_exact_zero_healing_recrossing_and_delete ... ok
test tests::review_984::review_split_and_tracking_transfer_writes_are_rejected_without_events ... ok
test tests::review_984::review_user_zone_month_and_year_edges ... ok
test tests::review_984::review_source_generation_tracks_all_files_and_restoration ... ok
test tests::review_bulkrev2::four_conflicts_return_409_without_writing ... ok
test tests::same_handle_settles_a_failed_move_before_the_next_request ... ok
test tests::simultaneous_import_confirmations_have_one_winner ... ok
test tests::bulk_write_balances_equal_one_by_one ... ok
test tests::source_total_mismatch_cannot_be_confirmed ... ok
test tests::transaction_identity_preview_is_atomic_and_reimport_changes_nothing ... ok
test tests::review_bulkrev2::two_and_five_assignment_races_match_serial_targets ... ok
test tests::transaction_logged_event_has_the_documented_create_payload ... ok
test tests::transfer_register_view_exposes_linked_category ... ok
test tests::transfer_cleared_edits_are_per_account ... ok
test tests::wizard_background_job_recovers_preview_after_response_is_dropped ... ok
test tests::wizard_background_job_retains_safe_failure ... ok
test tests::wizard_starter_categories_validate_before_create_and_do_not_change_totals ... ok
test tests::ynab_conflicting_accounts_and_payees_are_not_silently_discarded ... ok
test tests::ynab_csv_import_keeps_exact_month_and_register_amounts ... ok
test tests::ynab_duplicate_category_ids_are_merged_only_when_identical ... ok
test tests::ynab_plan_json_import_keeps_exact_milliunits ... ok
test tests::ynab_public_demo_imports_duplicate_category_names_by_id ... ok
test tests::update_transaction_emits_current_month_overspend_crossing ... ok
test tests::slow_15mb_import_receive_completes_with_progress ... ok
test tests::card_models_ignore_arrival_batch_and_timezone ... ok

test result: ok. 136 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 1099.64s

     Running tests/import_review.rs (/home/kayg/build/targets/bulkfix4/debug/deps/import_review-6a0b9e5006b57cbf)

running 32 tests
test csv_bom_mixed_endings_and_decimal_comma_are_exact ... ok
test csv_amount_edges_never_round_group_or_overflow ... ok
test csv_transaction_ids_merge_or_reject_before_totals ... ok
test identity_csv_transfer_growth_curve ... ignored, run with MONEY_IDENT_CSV_ROWS for 10k/100k/1M transfer profiling
test corrupt_actual_database_is_a_private_error ... ok
test recheck_actual_stream_growth_curve ... ignored, run with MONEY_RECHECK_ARCHIVE and MONEY_RECHECK_ROWS for profiling
test recheck_conflicting_transaction_ids_are_rejected ... ok
test recheck_csv_transfer_growth_curve ... ignored, run with MONEY_RECHECK_TRANSFERS for the bounded CSV growth probe
test recheck_e2e_csv_has_four_checks_and_keeps_every_minor_unit ... ok
test recheck_identical_transaction_ids_do_not_double_money ... ok
test recheck_reconciled_negative_zero_and_exact_source_scales ... ok
test split_identity_cannot_reuse_a_top_level_id ... ok
test split_identity_concrete_valid_totals ... ok
test split_identity_includes_parent_deleted_and_transfer_fields ... ok
test csv_pairing_accepts_cancellation_during_its_loop ... ok
test split_identity_rejects_an_inconsistent_embedded_parent ... ok
test split_identity_review_cases_reject ... ok
test transaction_identity_checks_fields_and_keeps_distinct_ids ... ok
test transaction_identity_preserves_exact_units ... ok
test transfer_legs_prefer_a_same_month_mate ... ok
test split_identity_merges_before_totals ... ok
test transfer_month_identity_rejects_in_both_adapters ... ok
test transfer_month_review_cases_reject ... ok
test unmatched_transfer_legs_keep_the_source_register ... ok
test ynab_account_check_rejects_a_wrong_normalization ... ok
test ynab_csv_preserves_exact_minor_units ... ok
test transfer_month_pairing_keeps_dates_and_exact_pair_priority ... ok
test ynab_negative_zero_amount_is_zero ... ok
test ynab_unrepresentable_milliunits_are_rejected ... ok
test csv_pairing_keeps_exact_account_legs ... ok
test ynab_json_keeps_exact_split_and_transfer_postings ... ok
test raw_ynab_registers_match_a_raw_row_oracle ... ok

test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 7.60s

   Doc-tests calternal_money

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

   Doc-tests calternal_plugin_money

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

Independent probe and arithmetic

tests/money/bulkrev4-probe.sh --include-ignored --nocapture --test-threads=1:

test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 26.18s

python3 tests/money/bulkrev4-numbers.py:

07b33aa56ff97a67: A=13222722 B=108 P=13222755 reserve=0; every stored field correct
08d823459b4f7555: A=1 B=1 P=1 reserve=0; every stored field correct
10dad10f207e3966: A=13222722 B=1 P=13222722 reserve=0; every stored field correct
217b597cc7b1b339: A=109170509 B=1000000000 P=110838733 reserve=889161267; every stored field correct
3c10364db1d4cd46: A=109170509 B=1 P=109170509 reserve=0; every stored field correct
405bf72849418ee7: A=28500 B=1 P=28500 reserve=0; every stored field correct
5cd63c6abac2f757: A=103816 B=1 P=103816 reserve=0; every stored field correct
70887b8579a61566: A=5789 B=1035233 P=55551 reserve=979682; every stored field correct
aa06a27413c2238d: A=103816 B=454 P=103879 reserve=0; every stored field correct
de05e2804212ba0e: A=5789 B=1 P=5789 reserve=0; every stored field correct
f161754b530689ba: A=28500 B=8319 P=31192 reserve=0; every stored field correct
Burst pins: reserve=6474+4103=10577; uncovered=51911-10577=41334
901a5dc38f13b647: February Available fees=-15151 tax=-3309 interest=-3232 retail=payment=0; reserve=0; raw/uncovered debt=366524
e6d77a36b9ded73d: RTA=1150500-560500+(20000-9853)=600147
PASS: 11 complete vectors, both changed burst pins and both changed vector records

Cleanup

cargo clean: exit 0. Output, verbatim:

     Removed 6275 files, 2.6GiB total

The detached baseline worktree was removed. Both web build output directories
and this job's test temporary directory are absent. The standalone probe
executable was removed after verification. Text logs stay in ignored artifacts.
No screenshots, videos or build output were committed. The source worktree
was clean at code HEAD. This report is the final documentation commit.

R4-1/R4-2 FIXED; both PRE-EXISTING on origin/dev.

Final HEAD: cd622b94e2; R4-1/R4-2 FIXED; both PRE-EXISTING.

# bulkfix4 complete HEAD: `cd622b94e212d88dd2e7292a796f2ad5f82df2cc` # Money conservation fixes — bulkfix4, #1393 All amounts are synthetic test minor units. Both R4 defects are FIXED. Code commits: `e2ce0a08db2a73ba748360766716e019bfef3697` and `bda6bc7eccdc2a4b6fe017831e67002e91a013c0`. The final issue comment gives the report commit HEAD. No push, deploy or promotion was made. ## Baseline classification Before product changes, the unchanged observation probe ran on detached origin/dev `cc1af3c12b68ad26c8403adde1be39c096b9ddea`. It used the same method as bulkfix3: real Markdown codec, projection and replay on the baseline. The table was posted on #1393 before the fixes. | Defect | Baseline January and February | Classification | | --- | --- | --- | | R4-1 | Card +1, Ready to Assign 0, allocations 0, real money 1 | PRE-EXISTING | | R4-2 | Cash 1, Card -1, Food 0, Ready to Assign 0, allocations 0, real money 1 | PRE-EXISTING | The baseline observation test passed because it prints the defects. It does not assert the wrong amounts. Both defects survive rollover on origin/dev. The required single fetch and merge of origin/dev gave `Already up to date.` ## Built and files - `crates/calternal-money/src/budget.rs`: put the exact positive-credit change from a Card opening in Ready to Assign. Debt adds no budget money. Reject a hand-built Ledger with missing or invalid payment links before replay can discard funded money. - `crates/calternal-money/src/edit.rs`: reuse the existing Category editor, ID collision rule, Markdown property writer and reference writer. Repair missing Card payment links in stable Account ID order. A `payment for` marker lets a partial save reuse its Category. Same-named Cards stay distinct. - `crates/calternal-money/src/ledger.rs`: apply that shared repair before calculation, including direct codec and streamed import callers. - `crates/plugins/money/src/store.rs`: expose repaired editable documents with the original source hashes for CAS. Keep the shared parse cache unchanged. Before an Account edit saves a repaired link, save its Category first. Skip equal Budget bytes on retry. Reject a repair above the reader size cap before any write. Validate a link's payment kind and uniqueness before publication, not only whether its target exists. - `crates/calternal-money/tests/review_bulkrev3.rs`: normal regressions for one-cent and 12,345-cent R4 witnesses, signed and repeated openings, refunds after rollover, repair collisions, duplicate display names and partial-save reuse. Extend the 256-history property with signed openings on both Cards and missing links on either Card. Keep raw Account sums, full model shuffle checks and conservation after each rollover. Check current-month Ready to Assign separately from raw ordered Account legs and Assignments, with prior positive Category carry as the boundary input. - `crates/plugins/money/src/tests.rs`: verify the positive-opening route, editable repaired Categories, Category-first persistence, restart reuse, source hash authority, unchanged source bytes on read and size-cap refusal. - `crates/calternal-money/tests/vectors.rs` and `contracts/vectors/money/money.v1.json`: change only the R4-2 report fields in `de7c249363a57c0c` and add exact assertions. Its unlinked Card now has a zero-balance payment Category and uncovered debt 4,950. Food stays -4,950; Ready to Assign stays 0. No vector input or divergence rule changed. All eleven refund vectors and the previous R3 records and burst pins stay unchanged. - `docs/DESIGN.md` §48: state opening-credit and legacy payment repair rules. ## Decisions Every accepted Card has one distinct payment Category. Use deterministic repair in the parsed calculation and edit view for older files. Reads do not write. Normal metadata edits save the repair with source hash checks. Save new Categories before new Account links. A failure can leave an unused Category, which its Account marker lets a retry reuse. Do not match by name. This fills the R4-2 gap in §48 without a new route or background migration. A Card opening adds only its positive-balance change to Ready to Assign. This works across zero in both directions and with repeated adjustments. Negative opening debt creates no Category money or Ready to Assign. ## Verification and limits The unchanged round-4 Rust probe passes with both formerly ignored shrink properties enabled: six tests, including 512 wider histories. The independent Python script still verifies every stored field in the eleven refund records and the two previous corrected burst and vector results. B1, N2, R3-1 through R3-5, shuffle independence and the 625-record vector test pass. No requested conservation gap remains in the tested domain. The generated current-month Ready to Assign check uses prior positive Category Available as a boundary input; it is not a second independent Category funding engine. Exact random current-month U remains private. The hand witnesses have known U. Card income, Tracking and import reconciliation keep their existing coverage; this report makes no new universal conservation claim for those forms. There is no new UI control, route, background job or dependency. No UI screenshot set or new throughput profile is part of this correctness slice. Under the current verification policy, the original bulk throughput measurements remain with the performance and merge rounds. Expected cost: Card opening arithmetic is O(1) per leg. Healthy metadata repair scans Account sections only. For K missing links it sorts K stable IDs and uses the existing pure editors on the two metadata documents. It adds no Home scan or per-row IO. For metadata of B bytes and K missing Cards, the existing editors do O(K × B) byte work. The healthy path avoids copies of Budget.md. Retained repair data is bounded by those documents and their Category markers. UX gaps closed: the repaired Category is assignable and receives funded purchases through the existing API. No new UI controls were built. UX gaps left: none in this backend scope. ## For the merge round Run `bun tests/adversarial/money_api.mjs` against the merged local server to check authorization, exact amounts and durable batch isolation with the corrected replay. Run `tests/adversarial/run.sh` for the full cross-User and protocol matrices. Full web suites, release/staging checks, Mac interop and the original bulk throughput acceptance stay with the merge round. This job ran the focused route regressions and one finite round-4 campaign. ## Gates Final results: calternal-money 72 passed, 1 ignored; calternal-plugin-money 165 passed, 5 ignored, plus its parent-invoked memory guard child. The two bulk comparison properties passed. Existing ignored tests stay unchanged. Use CARGO_BUILD_JOBS=4, CARGO_PROFILE_DEV_DEBUG=line-tables-only, CARGO_INCREMENTAL=0 and TMPDIR=<worktree>/target/tmp. Keep the configured CARGO_TARGET_DIR unchanged. The output below is verbatim. The first combined plugin gate aborted in the existing concurrent-edit test with a stack overflow. The new Account publication branch enlarged the shared write future. Move that cold branch to a boxed private async helper. The exact `concurrent_store_edits_keep_exactly_one_winner` test then passed on the normal test stack. A later gate reached a stack overflow in the new multi-step legacy fixture, before shared setup returned. Box the nested filesystem writer and the fixture's setup and write futures. Both legacy regressions then passed on the normal stack (2 passed in 6.43s). No assertion or input was removed. Restart the affected gates after these fixes. A final publication check also rejects a stale link to an Expense Category before either source file changes. Reuse replay's metadata validation with no months; do not duplicate its link-kind or uniqueness rules. The focused legacy tests pass with this check (2 passed in 13.59s). One in-progress gate was superseded when this preflight was added; keep it in `artifacts/bulkfix4-tests-superseded.log`. It is not a passing result. No stack-size setting or existing test expectation changed. Keep both aborted runs in `artifacts/bulkfix4-tests-stack-abort.log` and `artifacts/bulkfix4-tests-legacy-stack-abort.log`; neither is a passing result. ### `cargo fmt --check` Exit 0. No output. ### `cargo clippy -p calternal-money -p calternal-plugin-money --all-targets -- -D warnings` ```text Checking calternal-plugin-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/plugins/money) Finished `dev` profile [unoptimized + debuginfo] target(s) in 17.14s ``` ### `cargo test -p calternal-money -p calternal-plugin-money -- --test-threads=4` ```text Finished `test` profile [unoptimized + debuginfo] target(s) in 0.96s Running unittests src/lib.rs (/home/kayg/build/targets/bulkfix4/debug/deps/calternal_money-5ad27f9b5c008064) running 16 tests test codec::tests::empty_payee_is_refused_by_the_writer ... ok test codec::tests::malformed_dated_rows_fail_instead_of_vanishing ... ok test codec::tests::property_edit_changes_one_value ... ok test codec::tests::round_trip_keeps_bom_crlf_and_unknown_bytes ... ok test edit::tests::cleared_tag_toggles_without_touching_other_tags ... ok test codec::tests::transaction_round_trip_with_punctuation_in_labels_and_payee ... ok test edit::tests::crlf_file_keeps_crlf_on_insert ... ok test edit::tests::unicode_payee_tag_boundaries_match_shared_vectors ... ok test units::independent_number_review::signed_edges_and_long_zero_padding_keep_exact_minor_units ... ok test units::tests::exact_range_is_enforced_on_parse_and_arithmetic ... ok test units::tests::format_uses_explicit_sign_and_exact_scale ... ok test units::tests::parse_matches_the_oracle_examples ... ok test units::tests::scale_table_has_all_165_codes_with_unique_entries ... ok test codec::tests::checked_parse_stops_after_a_bounded_line_batch ... ok test edit::tests::new_budget_projects_with_no_accounts ... ok test edit::tests::assign_inserts_updates_and_removes_rows ... ok test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s Running tests/account_kinds.rs (/home/kayg/build/targets/bulkfix4/debug/deps/account_kinds-40f136ace82559dd) running 5 tests test account_projection_rejects_legacy_and_unknown_kinds ... ok test off_budget_balance_marker_does_not_change_budget_money ... ok test tracking_deficit_rollover_does_not_reduce_ready_to_assign ... ok test categorized_debit_loan_transfers_post_one_budget_leg ... ok test imported_account_kinds_project_without_losing_identity ... ok test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.11s Running tests/import.rs (/home/kayg/build/targets/bulkfix4/debug/deps/import-32258f8fda96f336) running 13 tests test duplicate_source_ids_are_rejected_and_duplicate_names_are_kept ... ok test import_render_is_exact_and_byte_stable ... ok test import_keeps_same_day_source_order_for_credit_payments_and_refunds ... ok test import_render_reports_progress_and_propagates_cancel ... ok test import_stream_renderer_matches_full_rendered_files ... ok test production_v1_metadata_upgrade_keeps_balances ... ok test import_replay_matches_full_ledger_month_by_month ... ok test recheck_half_minor_units_negative_zero_and_nineteen_digits ... ok test budget_replay_stops_at_a_bounded_transaction_checkpoint ... ok test imported_ready_to_assign_matches_independent_month_oracle ... ok test recheck_same_day_payment_and_refund_keep_source_fifo ... ok test random_imports_conserve_source_balances_and_markdown ... ok test recheck_random_multicurrency_ledgers_match_all_monthly_totals ... ok test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.87s Running tests/properties.rs (/home/kayg/build/targets/bulkfix4/debug/deps/properties-9ff9e71a800dacb8) running 21 tests test bill_coverage_never_clamps_the_bill ... ok test bulkrev2::boundary_shuffle_reports_acceptance_difference ... ok test bulkrev2::i64_extremes_are_rejected_and_safe_bound_is_exact ... ok test bulkrev2::literal_account_sum_and_funded_card_conservation ... ok test bulkrev2::refund_payment_calendar_choice_is_visible_next_month ... ok test any_text_that_parses_serializes_to_the_same_bytes ... ok test bulkrev2::split_refund_keeps_payment_overfunding_when_card_becomes_positive ... ok test assign_then_unassign_is_the_identity ... ok test decimal_text_round_trips_for_every_scale ... ok test cash_ledgers_conserve_money_every_month ... ok test fully_funded_card_spending_conserves_cash ... ok test money_code_never_uses_floating_point ... ok test mixed_cash_credit_deficit_rolls_only_its_cash_part ... ok test paired_write_replay_matches_independent_calculations ... ok test reviewed_burst_order_matches_input_order ... ok test partial_payment_then_category_refunds_conserve_cash_across_months ... ok test bulkrev2::funded_shuffles_conserve_real_money_every_month ... ok test transaction_rows_round_trip_byte_for_byte ... ok test split_legs_post_exactly_the_parent ... ok test same_date_card_postings_are_a_function_of_the_set ... ok test bulkrev2::same_day_shuffles_cover_splits_transfers_and_month_edges ... ok test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 8.05s Running tests/ready_to_assign_adjustment.rs (/home/kayg/build/targets/bulkfix4/debug/deps/ready_to_assign_adjustment-0e1c5c7276d14077) running 1 test test ready_to_assign_adjustment_changes_only_the_budget_pool ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s Running tests/review_984.rs (/home/kayg/build/targets/bulkfix4/debug/deps/review_984-dc85183370c2f07a) running 5 tests test review_pair_performance_profile ... ignored, performance measurements belong to the merge round on the perf VM test review_pair_rejects_bad_months_and_amounts_without_rounding ... ok test review_split_remainders_and_tracking_transfers_are_exact ... ok test review_mixed_pair_matches_independent_replays ... ok test review_large_ledger_pair_keeps_exact_totals ... ok test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 4.39s Running tests/review_bulkrev3.rs (/home/kayg/build/targets/bulkfix4/debug/deps/review_bulkrev3-cbfa6724c48c7f18) running 7 tests test hidden_and_missing_categories ... ok test legacy_payment_repair_is_idempotent_and_collision_safe ... ok test card_opening_credit_enters_ready_to_assign_once ... ok test unlinked_card_funded_purchase_keeps_its_payment_money ... ok test envelope_edge_cases ... ok test previous_witnesses_all_orders ... ok test random_histories_conserve_money_after_every_rollover ... ok test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 9.94s Running tests/vectors.rs (/home/kayg/build/targets/bulkfix4/debug/deps/vectors-b0e2a54af0711cc9) running 5 tests test rust_matches_random_oracle_ledgers_without_divergences ... ok test reviewed_r4_unlinked_card_vector_keeps_its_unfunded_amount ... ok test reviewed_eleven_refund_vectors_keep_their_exact_numbers ... ok test reviewed_r3_vectors_assert_retired_debt_and_positive_credit ... ok test rust_port_matches_every_recorded_oracle_vector ... ok test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.74s Running unittests src/lib.rs (/home/kayg/build/targets/bulkfix4/debug/deps/calternal_plugin_money-3d165b6d3890a332) running 138 tests test import::import_review_tests::actual_cents_conversion_never_rounds ... ok test import::import_review_tests::actual_cc_label_requires_missing_type_confirmation ... ok test import::import_review_tests::actual_account_checks_use_raw_monthly_source_rows ... ok test import::import_review_tests::actual_stream_memory_guard_child ... ignored, invoked as an isolated child by actual_stream_keeps_a_large_history_bounded test import::import_review_tests::import_control_reports_progress_and_stops_cancelled_work ... ok test import::import_review_tests::actual_transfer_legs_cannot_cross_months ... ok test import::import_review_tests::actual_orphan_split_children_are_rejected ... ok running 1 test test import::import_review_tests::ynab_transfer_pairing_handles_many_duplicate_legs ... ok test import_fidelity_1130::independent_split_and_transfer_numbers_check ... ok test routes::durable::admission_tests::cancelled_receiver_cannot_acknowledge_a_durable_job ... ok test routes::durable::checkpoint_tests::progress_wait_keeps_parser_writer_release_polled ... ok test routes::durable::admission_tests::live_publication_honors_operational_queue_cancellation ... ok test routes::import_cleanup_tests::dropped_preview_worker_retains_admission_until_exit ... ok test routes::import_cleanup_tests::idle_imports_are_reclaimed_by_expiry_cleanup ... ok test routes::import_cleanup_tests::staged_import_files_keep_ranges_and_release_private_storage ... ok test routes::import_staged_path_tests::staged_import_name_cannot_select_another_path_or_slot ... ok test routes::replay_reuse_tests::assignment_retry_rebuilds_from_latest_source_bytes ... ok test import_fidelity_1130::actual_rows_round_trip ... ok test routes::replay_reuse_tests::crossings_reuse_checked_current_totals_even_with_future_months ... ok test routes::replay_reuse_tests::crossings_cover_source_ranges_relative_to_today ... ok test routes::review_1140::cancel_wins_before_publication_lock ... ok test routes::review_1140::cancel_does_not_rewrite_published_result ... ok test routes::durable::money_import_undo_mutation ... ok test routes::review_1140::review1140_cancel_after_rename_before_receipt_keeps_publication ... ok test routes::review_1140::review1140_discard_after_confirmation_failure_releases_admission ... ok test routes::review_1140::review1140_all_formats_replay_exact_balances ... ok test routes::review_1140::review1140_operational_cancel_before_replacement_returns_no_receipt ... ok test routes::review_1140::review1140_tcp_malformed_inputs_leave_worker_usable ... ok test routes::review_1140::review1140_terminal_receipts_do_not_block_new_imports ... ok test store::parsed_cache_tests::global_budget_and_folder_pruning_release_stale_entries ... ok test store::parsed_cache_tests::parse_charge_accounts_for_line_structures ... ok test store::parsed_cache_tests::user_cache_evicts_old_parse_entries_and_shares_hot_documents ... ok test routes::review_1140::review1140_staged_size_limits_fail_without_publishing ... ok test tests::a_broken_file_is_reported_not_hidden ... ok test tests::a_new_user_sees_the_real_empty_state ... ok test tests::a_journal_for_a_completed_move_changes_nothing ... ok test routes::review_1140::review1140_replacement_receipt_recovery_does_not_adopt_later_edits ... ok test tests::active_money_handle_survives_other_users_cache_pressure ... ok test tests::actual_duplicate_names_import_by_id_without_sharing_a_payment_category ... ok test tests::a_read_waits_for_a_write_in_progress ... ok test tests::actual_export_archive_imports_exact_rows_from_private_scratch ... ok test tests::a_split_row_written_by_hand_is_read_but_not_edited ... ok test tests::assignments_retry_source_conflicts_without_losing_neighbours ... ok test tests::api_account_numbers_equal_core_replay ... ok test tests::backdated_create_emits_current_month_overspend_crossing ... ok test tests::budget_flow_writes_exact_markdown_and_derives_available ... ok test tests::bulk_write_invalid_neighbours_do_not_change_valid_rows ... ok test tests::bulk_write_rejects_intermediate_overflow ... ok test tests::cancel_racing_confirm_has_one_consistent_outcome ... ok test tests::bulk_write_month_does_not_need_note_date_backfill ... ok test tests::cancelling_imports_leaves_no_budget_and_releases_slots ... ok test tests::card_opening_credit_route_conserves_real_budget_money ... ok test tests::concurrent_store_edits_keep_exactly_one_winner ... ok test tests::csv_import_keeps_progress_and_cancel_responsive ... ok test tests::delete_transaction_emits_current_month_overspend_crossing ... ok test tests::denied_preview_access_keeps_the_owners_pending_import ... ok test import::import_review_tests::actual_stream_keeps_a_large_history_bounded has been running for over 60 seconds test import::import_review_tests::actual_stream_memory_guard_child has been running for over 60 seconds test import::import_review_tests::actual_stream_memory_guard_child ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 137 filtered out; finished in 72.16s test import::import_review_tests::actual_stream_keeps_a_large_history_bounded ... ok test tests::durable_import_tests::operation_exit_child ... ignored, child of operation_recovery_survives_process_exit_at_every_phase test tests::durable_import_tests::generated_import_confirm_replay_and_undo_preserve_minor_units ... ok test tests::durable_import_tests::publication_and_inverse_authority_use_full_commits ... ok test tests::durable_import_tests::queued_import_and_undo_survive_restarts ... ok test tests::durable_import_tests::receipt_reads_are_bounded_and_old_receipts_are_addressable ... ok test tests::bulk_write_balances_equal_one_by_one has been running for over 60 seconds test tests::card_models_ignore_arrival_batch_and_timezone has been running for over 60 seconds test tests::durable_import_tests::operation_recovery_survives_process_exit_at_every_phase ... ok test tests::durable_import_tests::replay_preserves_a_live_ready_preview ... ok test tests::durable_import_tests::running_jobs_do_not_expire_and_cancelled_jobs_do_not_restart ... ok test tests::durable_import_tests::undo_receipt_replay_never_removes_a_restored_import ... ok test tests::durable_import_tests::undo_refuses_a_predecessor_restored_before_the_inverse ... ok test tests::durable_import_tests::replacement_restarts_at_every_durable_phase has been running for over 60 seconds test tests::durable_import_tests::undo_refuses_every_later_budget_edit_after_restart ... ok test tests::durable_import_tests::undo_restarts_before_and_after_the_filesystem_inverse ... ok test tests::failed_cross_month_move_never_counts_the_row_twice ... ok test tests::far_month_assignment_cannot_make_the_budget_unreadable ... ok test tests::durable_import_tests::replacement_restarts_at_every_durable_phase ... ok test tests::gap_month_assignments_and_opening_card_debt_do_not_create_cash ... ok test tests::hostile_inputs_are_rejected_without_writing ... ok test tests::historical_overspend_does_not_emit_current_month_event ... ok test tests::import_fidelity_review_requires_account_kind_and_keeps_notes ... ok test tests::import_file_limits_match_the_money_reader ... ok test tests::import_preview_is_owner_bound_and_confirmation_publishes_once ... ok test tests::import_preview_reads_only_generated_staged_upload_names ... ok test tests::inferred_opening_balance_needs_explicit_confirmation ... ok test tests::legacy_card_payment_repair_cannot_make_its_budget_unreadable ... ok test tests::legacy_card_payment_repair_is_editable_and_saved_category_first ... ok test tests::memo_and_tags_split_the_payee_without_losing_text ... ok test tests::money_is_on_for_the_instance_and_off_for_a_new_user ... ok test tests::idle_import_receive_releases_admission_and_cancel_stops_read ... ok test tests::month_revision_increases_after_each_assignment ... ok test tests::move_money_keeps_ready_to_assign_and_card_gets_payment_category ... ok test tests::multiple_assignment_rows_set_one_exact_total ... ok test tests::other_users_and_sessions_without_data_scope_see_nothing ... ok test tests::overflowing_cleared_subset_is_rejected_before_transaction_write ... ok test tests::overflowing_category_sum_is_rejected_before_assignment_write ... ok test tests::overflowing_derived_balance_is_rejected_before_the_write ... ok test tests::overspending_reports_ynab_states ... ok test tests::plugin_code_never_uses_floating_point ... ok test tests::parsed_money_cache_shares_documents_and_prunes_removed_months ... ok test tests::recheck_metadata_files_use_the_reader_size_cap ... ok test tests::recheck_local_server_number_and_lifecycle_contract ... ok test tests::recheck_source_checks_owner_and_opening_balance_confirmation ... ok test tests::review_1130::review1130_cancel_after_partial_preparation ... ok test tests::recheck_random_preview_cancellation_leaves_no_files ... ok test tests::review_1130::review1130_legacy_home_needs_no_metadata_rewrite ... ok test tests::review_1130::review1130_notes_are_inert ... ok test tests::review_1130::review1130_long_imported_note_allows_amount_edit_without_loss ... ok test tests::review_1130::review1130_reconciled_closed_balances ... ok test tests::review_1130::review1130_split_and_closed_transfer_have_one_posting ... ok test tests::review_984::review3_first_future_transaction_keeps_current_event_month ... ok test tests::review_1130::review1130_tcp_locks_reimport_and_cancel ... ok test tests::review_984::review3_future_only_edit_and_delete_keep_current_event_month ... ok test tests::review_984::review_category_edit_emits_for_old_category_only ... ok test tests::review_984::review3_outside_current_range_writes_emit_no_overspend ... ok test tests::review_984::review_concurrent_assign_revisions_match_final_report ... ok test tests::review_984::review_cross_month_refund_move_emits_current_crossing ... ok test tests::review_984::review_file_replacement_advances_month_revision ... ok test tests::review_984::review_exact_zero_healing_recrossing_and_delete ... ok test tests::review_984::review_split_and_tracking_transfer_writes_are_rejected_without_events ... ok test tests::review_984::review_user_zone_month_and_year_edges ... ok test tests::review_984::review_source_generation_tracks_all_files_and_restoration ... ok test tests::review_bulkrev2::four_conflicts_return_409_without_writing ... ok test tests::same_handle_settles_a_failed_move_before_the_next_request ... ok test tests::simultaneous_import_confirmations_have_one_winner ... ok test tests::bulk_write_balances_equal_one_by_one ... ok test tests::source_total_mismatch_cannot_be_confirmed ... ok test tests::transaction_identity_preview_is_atomic_and_reimport_changes_nothing ... ok test tests::review_bulkrev2::two_and_five_assignment_races_match_serial_targets ... ok test tests::transaction_logged_event_has_the_documented_create_payload ... ok test tests::transfer_register_view_exposes_linked_category ... ok test tests::transfer_cleared_edits_are_per_account ... ok test tests::wizard_background_job_recovers_preview_after_response_is_dropped ... ok test tests::wizard_background_job_retains_safe_failure ... ok test tests::wizard_starter_categories_validate_before_create_and_do_not_change_totals ... ok test tests::ynab_conflicting_accounts_and_payees_are_not_silently_discarded ... ok test tests::ynab_csv_import_keeps_exact_month_and_register_amounts ... ok test tests::ynab_duplicate_category_ids_are_merged_only_when_identical ... ok test tests::ynab_plan_json_import_keeps_exact_milliunits ... ok test tests::ynab_public_demo_imports_duplicate_category_names_by_id ... ok test tests::update_transaction_emits_current_month_overspend_crossing ... ok test tests::slow_15mb_import_receive_completes_with_progress ... ok test tests::card_models_ignore_arrival_batch_and_timezone ... ok test result: ok. 136 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 1099.64s Running tests/import_review.rs (/home/kayg/build/targets/bulkfix4/debug/deps/import_review-6a0b9e5006b57cbf) running 32 tests test csv_bom_mixed_endings_and_decimal_comma_are_exact ... ok test csv_amount_edges_never_round_group_or_overflow ... ok test csv_transaction_ids_merge_or_reject_before_totals ... ok test identity_csv_transfer_growth_curve ... ignored, run with MONEY_IDENT_CSV_ROWS for 10k/100k/1M transfer profiling test corrupt_actual_database_is_a_private_error ... ok test recheck_actual_stream_growth_curve ... ignored, run with MONEY_RECHECK_ARCHIVE and MONEY_RECHECK_ROWS for profiling test recheck_conflicting_transaction_ids_are_rejected ... ok test recheck_csv_transfer_growth_curve ... ignored, run with MONEY_RECHECK_TRANSFERS for the bounded CSV growth probe test recheck_e2e_csv_has_four_checks_and_keeps_every_minor_unit ... ok test recheck_identical_transaction_ids_do_not_double_money ... ok test recheck_reconciled_negative_zero_and_exact_source_scales ... ok test split_identity_cannot_reuse_a_top_level_id ... ok test split_identity_concrete_valid_totals ... ok test split_identity_includes_parent_deleted_and_transfer_fields ... ok test csv_pairing_accepts_cancellation_during_its_loop ... ok test split_identity_rejects_an_inconsistent_embedded_parent ... ok test split_identity_review_cases_reject ... ok test transaction_identity_checks_fields_and_keeps_distinct_ids ... ok test transaction_identity_preserves_exact_units ... ok test transfer_legs_prefer_a_same_month_mate ... ok test split_identity_merges_before_totals ... ok test transfer_month_identity_rejects_in_both_adapters ... ok test transfer_month_review_cases_reject ... ok test unmatched_transfer_legs_keep_the_source_register ... ok test ynab_account_check_rejects_a_wrong_normalization ... ok test ynab_csv_preserves_exact_minor_units ... ok test transfer_month_pairing_keeps_dates_and_exact_pair_priority ... ok test ynab_negative_zero_amount_is_zero ... ok test ynab_unrepresentable_milliunits_are_rejected ... ok test csv_pairing_keeps_exact_account_legs ... ok test ynab_json_keeps_exact_split_and_transfer_postings ... ok test raw_ynab_registers_match_a_raw_row_oracle ... ok test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 7.60s Doc-tests calternal_money running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests calternal_plugin_money running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` ## Independent probe and arithmetic `tests/money/bulkrev4-probe.sh --include-ignored --nocapture --test-threads=1`: ```text test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 26.18s ``` `python3 tests/money/bulkrev4-numbers.py`: ```text 07b33aa56ff97a67: A=13222722 B=108 P=13222755 reserve=0; every stored field correct 08d823459b4f7555: A=1 B=1 P=1 reserve=0; every stored field correct 10dad10f207e3966: A=13222722 B=1 P=13222722 reserve=0; every stored field correct 217b597cc7b1b339: A=109170509 B=1000000000 P=110838733 reserve=889161267; every stored field correct 3c10364db1d4cd46: A=109170509 B=1 P=109170509 reserve=0; every stored field correct 405bf72849418ee7: A=28500 B=1 P=28500 reserve=0; every stored field correct 5cd63c6abac2f757: A=103816 B=1 P=103816 reserve=0; every stored field correct 70887b8579a61566: A=5789 B=1035233 P=55551 reserve=979682; every stored field correct aa06a27413c2238d: A=103816 B=454 P=103879 reserve=0; every stored field correct de05e2804212ba0e: A=5789 B=1 P=5789 reserve=0; every stored field correct f161754b530689ba: A=28500 B=8319 P=31192 reserve=0; every stored field correct Burst pins: reserve=6474+4103=10577; uncovered=51911-10577=41334 901a5dc38f13b647: February Available fees=-15151 tax=-3309 interest=-3232 retail=payment=0; reserve=0; raw/uncovered debt=366524 e6d77a36b9ded73d: RTA=1150500-560500+(20000-9853)=600147 PASS: 11 complete vectors, both changed burst pins and both changed vector records ``` ## Cleanup `cargo clean`: exit 0. Output, verbatim: ```text Removed 6275 files, 2.6GiB total ``` The detached baseline worktree was removed. Both web build output directories and this job's test temporary directory are absent. The standalone probe executable was removed after verification. Text logs stay in ignored artifacts. No screenshots, videos or build output were committed. The source worktree was clean at code HEAD. This report is the final documentation commit. R4-1/R4-2 FIXED; both PRE-EXISTING on origin/dev. Final HEAD: cd622b94e212d88dd2e7292a796f2ad5f82df2cc; R4-1/R4-2 FIXED; both PRE-EXISTING.
Author
Owner

Independent bulkrev5 final number review started on job/bulkwrite-1393, base/head cd622b94e2. Required origin/dev merge: Already up to date. Product code remains unchanged. Checking signed Card openings, legacy metadata repair, independent reference arithmetic and 2,000 generated histories with a new seed.

Independent bulkrev5 final number review started on job/bulkwrite-1393, base/head cd622b94e212d88dd2e7292a796f2ad5f82df2cc. Required origin/dev merge: Already up to date. Product code remains unchanged. Checking signed Card openings, legacy metadata repair, independent reference arithmetic and 2,000 generated histories with a new seed.
Author
Owner

bulkrev5 independent review

Start: job/bulkwrite-1393 at cd622b94e2. Required origin/dev merge: Already up to date. No author reports or result files read.

DESIGN §48 defines L + U = M; rollover with no new rows gives L = M. Repair is in-memory on reads; durable publication must save Categories before links.

Reference arithmetic: PASS. All 11 complete original vectors and earlier revised records remain correct. Since round 4, only de7c249363a57c0c changes: repaired card-payment-visa has zero Assignment/activity/Available and Funded state; Visa reserve map now contains 0 and uncovered map contains 4950. The exact -49.50 USD FX total is -4950 budget units; no Assignment means U=4950, L=-4950, M=0. All other fields and inputs are unchanged.

# bulkrev5 independent review Start: job/bulkwrite-1393 at cd622b94e212d88dd2e7292a796f2ad5f82df2cc. Required origin/dev merge: Already up to date. No author reports or result files read. DESIGN §48 defines L + U = M; rollover with no new rows gives L = M. Repair is in-memory on reads; durable publication must save Categories before links. Reference arithmetic: PASS. All 11 complete original vectors and earlier revised records remain correct. Since round 4, only de7c249363a57c0c changes: repaired card-payment-visa has zero Assignment/activity/Available and Funded state; Visa reserve map now contains 0 and uncovered map contains 4950. The exact -49.50 USD FX total is -4950 budget units; no Assignment means U=4950, L=-4950, M=0. All other fields and inputs are unchanged.
Author
Owner

bulkrev5 independent review

Start: job/bulkwrite-1393 at cd622b94e2. Required origin/dev merge: Already up to date. No author reports or result files read.

DESIGN §48 defines L + U = M; rollover with no new rows gives L = M. Repair is in-memory on reads; durable publication must save Categories before links.

Reference arithmetic: PASS. All 11 complete original vectors and earlier revised records remain correct. Since round 4, only de7c249363a57c0c changes: repaired card-payment-visa has zero Assignment/activity/Available and Funded state; Visa reserve map now contains 0 and uncovered map contains 4950. The exact -49.50 USD FX total is -4950 budget units; no Assignment means U=4950, L=-4950, M=0. All other fields and inputs are unchanged.

Signed openings and metadata generator: seed 139305, 2,000 histories PASS (12,000 month models and 6,000 empty rollovers). Both Card opening signs and omitted links on either Card are generated. Independent Ready to Assign uses raw ordered account legs and positive Category carry, not the replay Ready to Assign. B1 2/2 and N2 24/24 same-date orders PASS.

Real-file repair PASS: 16 reads preserve source bytes and fingerprints in two Homes with identical IDs. A deliberately wrong Accounts.md CAS hash causes failure after the real Category publisher. A fresh handle calculates the valid partial Budget; retry reuses its payment-for marker and does not rewrite Budget.md. The other User remains unchanged. In-memory metadata repair does run during reads, as §48 requires; durable repair does not.

Gate progress: public positive Card opening route, editable Category-first legacy repair, source-cap refusal and vectors all pass in the required combined crate test. No conservation, wrong-number, read-write or cross-User finding has appeared. Final gate status and second 2,000-history generator remain pending.

# bulkrev5 independent review Start: job/bulkwrite-1393 at cd622b94e212d88dd2e7292a796f2ad5f82df2cc. Required origin/dev merge: Already up to date. No author reports or result files read. DESIGN §48 defines L + U = M; rollover with no new rows gives L = M. Repair is in-memory on reads; durable publication must save Categories before links. Reference arithmetic: PASS. All 11 complete original vectors and earlier revised records remain correct. Since round 4, only de7c249363a57c0c changes: repaired card-payment-visa has zero Assignment/activity/Available and Funded state; Visa reserve map now contains 0 and uncovered map contains 4950. The exact -49.50 USD FX total is -4950 budget units; no Assignment means U=4950, L=-4950, M=0. All other fields and inputs are unchanged. Signed openings and metadata generator: seed 139305, 2,000 histories PASS (12,000 month models and 6,000 empty rollovers). Both Card opening signs and omitted links on either Card are generated. Independent Ready to Assign uses raw ordered account legs and positive Category carry, not the replay Ready to Assign. B1 2/2 and N2 24/24 same-date orders PASS. Real-file repair PASS: 16 reads preserve source bytes and fingerprints in two Homes with identical IDs. A deliberately wrong Accounts.md CAS hash causes failure after the real Category publisher. A fresh handle calculates the valid partial Budget; retry reuses its payment-for marker and does not rewrite Budget.md. The other User remains unchanged. In-memory metadata repair does run during reads, as §48 requires; durable repair does not. Gate progress: public positive Card opening route, editable Category-first legacy repair, source-cap refusal and vectors all pass in the required combined crate test. No conservation, wrong-number, read-write or cross-User finding has appeared. Final gate status and second 2,000-history generator remain pending.
Author
Owner

Final bulkrev5 head: 74c58b72f590e3663b84751724f3119161c86689. READY — no blocking items.

Independent Money number review — bulkrev5, #1393

READY. No conservation defect, wrong number, file change on read or cross-User effect was found.

Reviewed product head: cd622b94e212d88dd2e7292a796f2ad5f82df2cc.
Branch: job/bulkwrite-1393. The fetched dev base is cc1af3c12b68ad26c8403adde1be39c096b9ddea (also the merge base). Required git fetch origin && git merge origin/dev: Already up to date. Review code head: 83bc8d71ee567608a15f27f4436c07f6e4230d4c. The final issue comment records the final report commit. Product code, dependencies, lockfiles and existing expectations were unchanged. Author reports and result files were not read. Prior independent reviews and their probes were reused. All amounts below are synthetic fixture minor units.

Built and files

  • tests/money/bulkrev5-numbers.py: independently checks all eleven original vectors and every changed field in this round.
  • tests/money/bulkrev5-probe.py: compiles prior probes against the real gate-built crates, with seed 139305 and 2,000 histories per generator. It changes only standalone copies' generator configuration. Rustc checks dependency metadata compatibility because cargo builds feature-distinct library artifacts.
  • tests/money/bulkrev5-store.rs: real-file probe for reads, interrupted Category-first publication, retry and User isolation.
  • tests/money/bulkrev5-review.md: this review, with verbatim gate evidence.
  • artifacts/bulkrev5-findings.md: findings appended during review; stays gitignored.

Invariant and comparison

DESIGN §48 defines M as Cash balances plus each positive Card balance, L as Ready to Assign plus all signed Category Available (payment Categories once), and U as current-month unfunded Card spending not canceled or covered. For the documented Cash-income/on-budget expense/refund/payment/transfer histories, L + U = M. Import reconciliation adjustments add to M. At rollover, negative Available resets; only its Cash part reduces Ready to Assign. With no new rows, L = M, including after underfunded histories. Every Account also equals its exact raw ordinary and transfer leg sum. Same-date input order must not change acceptance or the complete model.

The hand cases check exact Category distribution and known U. The random probes check raw Account sums, complete shuffled models and exact rollover conservation. The consecutive-month probe also checks L <= M in every month. The opening/legacy probe independently calculates current-month Ready to Assign from ordered raw Account legs, Assignments and positive Category carry. Private replay U is not independently exposed by random tests; an exact random current-month U oracle was not added. These checks cover excess allocations and losses that survive rollover, without pretending that every active-month L < M is a defect.

B1 passes both same-date orders: Cash income 20,000, Food and Dining Assignments 10,000 each, purchases 10,000 each, then payment 10,000 and Food refund 10,000 on March 31. Correct Food 10,000, Dining 0, reserve 0, Ready to Assign 0, Cash 10,000 and Card 0. March and April each allocate 10,000.

N2 passes all 24 orders. E = MAX_EXACT. Cash opening and Food Assignment E-1; same-date Cash Food -E, Cash split Food -1/Dining +2, Cash Food +E, Card Dining -1. Correct Cash E, Card -1, Food E-2, Dining 1, reserve 1 and Ready to Assign 0. The pre-pass accepts every permutation.

Requested envelope cases

Each case starts with Cash income 200. The following §48 values match the real replay. Other Category/Card values are zero unless stated.

Case Correct §48 result Comparison
Underfunded Card purchase and partial refund Food Assignment 50, buy 100, refund 50: Food 0, reserve 50, Ready to Assign 150, Cash 200, Card -50. Refund cancels U first. Matches.
Overspent Cash Category Food Assignment 50, Cash spend 100: March Food -50 and Ready to Assign 150; April Food 0 and Ready to Assign 100; Cash 100. Matches.
Mixed Cash and Card deficit Food Assignment 50, Cash spend 100, Card buy 100, Card refund 100: March Food -50, reserve 0, Ready to Assign 150, Cash 100, Card 0; April Ready to Assign 100. Matches.
Refund above debt Food Assignment 100, Card buy 100, refund 150: Food 150, reserve 0, Ready to Assign 100, Cash 200, Card +50. L = M = 250. Matches.
Unfunded refund in later month No Assignment, March Card buy 100, April refund 100: March Food -100, U 100; April Food 0, reserve 0, Ready to Assign 200, Card 0. Matches.
Partly funded refund in later month Food Assignment 50, March buy 100, April refund 50: March Food -50, reserve 50; April Food 50, reserve 0, Ready to Assign 150, Card -50. Matches.
Funded refund in later month Food Assignment 100, March buy 100, April refund 100: April Food 100, reserve 0, Ready to Assign 100, Cash 200, Card 0. Matches.
Refund after full payment Food Assignment 100, buy 100, pay 100, refund 100: Food 100, reserve 0, Ready to Assign 100, Cash 100, Card +100. Matches.
Partial payment then refund Food and Dining Assignments 100 each; buy 100 in each; pay 50; Food refund 100: Food 100, Dining 0, reserve 50, Ready to Assign 0, Cash 150, Card -50. Matches.
Split refunds Same Assignments/purchases; pay 150; split refund Food 100 and Dining 100: Food 100, Dining 100, reserve 0, Ready to Assign 0, Cash 50, Card +150. Only the first 50 reduces debt. Matches.
Transfer debt between Cards Food Assignment 100, Card buy 100, general transfer 100 from Other to Card: original reserve 100, Other reserve 0, Ready to Assign 100, Cash 200, Card 0, Other -100. Categories do not move. Matches.
Transfer into positive Card credit General transfer 100 from zero Card to zero Other: Ready to Assign 300, Cash 200, Card -100, Other +100; Categories unchanged. Matches.
Spend positive Card credit No Assignment; Card refund 50 then buy 50: Food 0, reserve 0, Ready to Assign 200, Card 0. Matches.
Return to hidden Category Actual visibility:: hidden parses as hidden and retains the same totals as visible. Matches.
Return to deleted identity Remove the linked Category identity; projection rejects the dangling reference. Rejects; no accepted wrong totals.

Final-round openings and repair

Positive Card openings enter Ready to Assign by the exact change in positive Card balance; debt openings add zero. One-cent and larger positive/negative fixtures pass. Repeated adjustments +n, -2n, +3n cross zero twice and give final Card credit and Ready to Assign 2n, with zero reserve. The fresh-seed generator includes signed openings on both Cards and omitted links on either Card. The public opening route also passes.

Repair is deterministic and idempotent. Existing independent collision tests pass with two same-named Cards and a taken generated ID. Fully repaired metadata needs no further repair. Budget-only persistence reuses the payment for marker. Source order does not change allocated Category identities.

The independent real-file probe uses two Homes with identical Budget and Account IDs. Sixteen reads preserve all source bytes and kernel fingerprints. Each funded one-cent purchase retains Cash 1, Card -1, Food 0, Ready to Assign 0 and reserve 1 before and after rollover. A deliberately wrong Accounts.md hash causes the real store to save the new Category and then fail its Account CAS. A fresh handle loads this partial save as a valid Budget and reuses the same payment Category. Retrying the Account edit leaves Budget.md bytes and fingerprint unchanged. The other User's source bytes and fingerprints remain unchanged.

The durable save order is Categories first, links second. calternal-fs gives each replacement the normal atomic/fsync contract. The failed-CAS probe reaches the same source state as interruption between those saves. This round did not add a process-kill campaign. Existing route tests also pass for editable repair, Category-first persistence and refusal before exceeding the source-file cap.

In-memory repair runs on reads, as §48 explicitly requires. Reads never save the repaired files. The brief's wording that repair never runs on read is interpreted as no durable repair on read, consistent with the stated design and requested file-change check.

Reference numbers

All eleven earlier vectors remain correct, including every stored field. With S assigned to both Food and Dining, Food purchase/full refund A, Dining purchase B and payment P: Food S, Dining S-B, Ready to Assign -2S, Cash -P, Card P-B and reserve max(B-P,0). The earlier revised burst pins and vector records also remain correct.

Only de7c249363a57c0c changed since round 4. Its source FX total is -49.50 USD = -4,950 budget units, with no Assignment. Correct Visa debt -4,950, uncovered 4,950, reserve 0, Food Available -4,950 and U 4,950. The new card-payment-visa Category has Assignment, activity and Available 0, Funded state and no target fields. L+U=M=0. The number probe compares the entire record against the prior record with exactly these independently computed additions. Every other field and input is unchanged. The Rust vectors gate checks the production replay against the records.

Generated histories

Seed 139305, distinct from earlier reviews:

  • 2,000 opening/legacy histories: signed Card openings, omitted payment links, two Cards, both transfer directions, arbitrary refunds and payments, split purchases/refunds, Cash refunds, later Assignments and month rollovers. Checked 12,000 complete month models and 6,000 empty rollovers, plus independent Ready to Assign.
  • 2,000 consecutive-month histories: four active months, 20 posting forms, mixed-sign Cash/Card splits, repeated children, hidden Categories, both Card transfer directions, overpayments and positive/negative expense/payment Assignments. Checked 10,000 models and 8,000 prefix rollovers.
  • Both old ignored R4 one-cent shrink properties were explicitly run and now pass.

Total: 4,000 histories, 22,000 month models and 14,000 rollover checks. All pass. The standalone source warning about proptest persistence does not affect the fixed seed or case count; there was no failed/shrunk generated input.

Known gaps and decisions

No product gap was found within this round. No product design decision was made. Review choices: reuse the existing independent generators with a fresh seed; simulate the Category/link interruption through a real failed Account CAS; interpret the read rule as no durable source mutation. These choices do not change product behavior.

Random exact U, Tracking transfers, Card Income Categories, import reconciliation and exhaustive integer intermediates are outside the expanded generators. Existing crate gates cover their existing contracts. This review does not claim exhaustive coverage of them. No UI or feature was built, so no screenshots or performance profile was added. No benchmark was run. No secrets were displayed.

For the merge round

On the combined branch, run cargo clippy --all-targets -- -D warnings and cargo test for workspace integration; cd apps/web && bun run check && bun run test for web integration; and tests/adversarial/run.sh for the live-server robustness, authorization and User-isolation matrix. These are the merge round's standard checks, not unfinished focused review work. The focused arithmetic, shuffle, opening, repair, interruption and isolation checks requested here were completed in this job; none were deferred. No push, deployment or merge into dev was performed.

Gate output (verbatim)

cargo fmt --check exited 0 with no stdout or stderr. The standalone Rust probe also passed rustfmt --edition 2024 --check tests/money/bulkrev5-store.rs.

cargo test -p calternal-money -p calternal-plugin-money (CARGO_BUILD_JOBS=4)

   Compiling proc-macro2 v1.0.107
   Compiling quote v1.0.47
   Compiling unicode-ident v1.0.26
   Compiling libc v0.2.189
   Compiling cfg-if v1.0.5
   Compiling memchr v2.8.3
   Compiling itoa v1.0.18
   Compiling serde_core v1.0.229
   Compiling once_cell v1.21.4
   Compiling serde v1.0.229
   Compiling syn v3.0.6
   Compiling futures-core v0.3.34
   Compiling pin-project-lite v0.2.17
   Compiling autocfg v1.5.1
   Compiling jobserver v0.1.35
   Compiling shlex v2.0.1
   Compiling find-msvc-tools v0.1.13
   Compiling bytes v1.12.1
   Compiling cc v1.4.7
   Compiling log v0.4.34
   Compiling stable_deref_trait v1.2.1
   Compiling zmij v1.0.23
   Compiling serde_json v1.0.151
   Compiling num-traits v0.2.19
   Compiling pkg-config v0.3.34
   Compiling version_check v0.9.5
   Compiling syn v2.0.119
   Compiling socket2 v0.6.5
   Compiling equivalent v1.0.2
   Compiling bitflags v2.13.2
   Compiling getrandom v0.4.3
   Compiling rand_core v0.10.1
   Compiling litemap v0.8.3
   Compiling hashbrown v0.17.1
   Compiling writeable v0.6.4
   Compiling serde_derive v1.0.229
   Compiling synstructure v0.14.0
   Compiling zerovec-derive v0.11.6
   Compiling zerofrom-derive v0.1.8
   Compiling yoke-derive v0.8.4
   Compiling zerofrom v0.1.8
   Compiling displaydoc v0.2.7
   Compiling yoke v0.8.3
   Compiling utf8_iter v1.0.4
   Compiling icu_normalizer_data v2.3.0
   Compiling tracing-attributes v0.1.31
   Compiling zerovec v0.11.8
   Compiling zerotrie v0.2.5
   Compiling generic-array v0.14.9
   Compiling tracing-core v0.1.36
   Compiling icu_properties_data v2.3.0
   Compiling tinystr v0.8.4
   Compiling potential_utf v0.1.6
   Compiling typenum v1.20.1
   Compiling icu_locale_core v2.3.0
   Compiling icu_collections v2.3.0
   Compiling futures-io v0.3.34
   Compiling futures-task v0.3.34
   Compiling scopeguard v1.2.0
   Compiling tracing v0.1.44
   Compiling mio v1.2.3
   Compiling errno v0.3.14
   Compiling icu_provider v2.3.1
   Compiling futures-sink v0.3.34
   Compiling percent-encoding v2.3.2
   Compiling signal-hook-registry v1.4.8
   Compiling lock_api v0.4.14
   Compiling tokio-macros v2.7.2
   Compiling fnv v1.0.7
   Compiling smallvec v1.16.1
   Compiling icu_properties v2.3.0
   Compiling iana-time-zone v0.1.65
   Compiling indexmap v2.14.2
   Compiling chrono v0.4.45
   Compiling tokio v1.53.1
   Compiling parking_lot_core v0.9.12
   Compiling rustix v1.1.5
   Compiling slab v0.4.12
   Compiling form_urlencoded v1.2.2
   Compiling linux-raw-sys v0.12.1
   Compiling getrandom v0.3.4
   Compiling futures-macro v0.3.34
   Compiling tinyvec v1.13.3
   Compiling unicode-normalization v0.1.25
   Compiling futures-util v0.3.34
   Compiling cmake v0.1.58
   Compiling zerocopy v0.8.58
   Compiling fs_extra v1.3.0
   Compiling vcpkg v0.2.15
   Compiling dunce v1.0.5
   Compiling regex-syntax v0.8.11
   Compiling aws-lc-sys v0.45.0
   Compiling rand_core v0.9.5
   Compiling thiserror-impl v2.0.21
   Compiling http v1.5.0
   Compiling aho-corasick v1.1.5
   Compiling siphasher v1.0.3
   Compiling crossbeam-utils v0.8.23
   Compiling regex-automata v0.4.18
   Compiling spin v0.9.9
   Compiling hybrid-array v0.4.15
   Compiling base64 v0.22.1
   Compiling fastrand v2.5.0
   Compiling cpufeatures v0.2.17
   Compiling foldhash v0.2.0
   Compiling allocator-api2 v0.2.21
   Compiling regex v1.13.1
   Compiling hashbrown v0.16.1
   Compiling tempfile v3.27.0
   Compiling ppv-lite86 v0.2.21
   Compiling icu_normalizer v2.3.0
   Compiling wait-timeout v0.2.1
   Compiling quick-error v1.2.3
   Compiling zeroize v1.9.0
   Compiling parking v2.2.1
   Compiling bit-vec v0.8.0
   Compiling crc-catalog v2.5.0
   Compiling aws-lc-rs v1.18.1
   Compiling rustversion v1.0.23
   Compiling bit-set v0.8.0
   Compiling crc v3.4.0
   Compiling event-listener v5.4.2
   Compiling rusty-fork v0.3.1
   Compiling idna_adapter v1.2.2
   Compiling crossbeam-queue v0.3.14
   Compiling rand_chacha v0.9.0
   Compiling hashlink v0.11.1
   Compiling block-buffer v0.10.4
   Compiling crypto-common v0.1.6
   Compiling http-body v1.1.0
   Compiling rand v0.9.5
   Compiling rand_xorshift v0.4.0
   Compiling futures-channel v0.3.34
   Compiling simd-adler32 v0.3.10
   Compiling httparse v1.10.1
   Compiling thiserror v2.0.21
   Compiling unarray v0.1.4
   Compiling proptest v1.11.0
   Compiling parking_lot v0.12.5
   Compiling digest v0.10.7
   Compiling idna v1.1.0
   Compiling rustls-pki-types v1.15.1
   Compiling calternal-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-money)
   Compiling crypto-common v0.2.2
   Compiling libsqlite3-sys v0.37.0
   Compiling tower-service v0.3.3
   Compiling cpufeatures v0.3.1
   Compiling crc32fast v1.5.2
   Compiling tokio-stream v0.1.19
   Compiling either v1.18.0
   Compiling url v2.5.8
   Compiling sha2 v0.10.9
   Compiling futures-intrusive v0.5.0
   Compiling tokio-util v0.7.19
   Compiling rustls v0.23.45
   Compiling rand_core v0.6.4
   Compiling atomic-waker v1.1.2
   Compiling try-lock v0.2.5
   Compiling untrusted v0.9.0
   Compiling adler2 v2.0.1
   Compiling want v0.3.1
   Compiling rand v0.8.8
   Compiling h2 v0.4.19
   Compiling sqlx-core v0.9.0
   Compiling atoi v2.0.0
   Compiling futures-executor v0.3.34
   Compiling flume v0.12.0
   Compiling inout v0.2.2
   Compiling phf_shared v0.11.3
   Compiling blake3 v1.8.7
   Compiling sync_wrapper v1.0.2
   Compiling cmov v0.5.4
   Compiling httpdate v1.0.3
   Compiling ipnet v2.12.2
   Compiling subtle v2.6.1
   Compiling ryu v1.0.23
   Compiling tower-layer v0.3.3
   Compiling hyper v1.11.1
   Compiling ctutils v0.4.2
   Compiling phf_generator v0.11.3
   Compiling sqlx-sqlite v0.9.0
   Compiling miniz_oxide v0.9.1
   Compiling encoding_rs v0.8.41
   Compiling multiversion-macros v0.9.0
   Compiling block-buffer v0.12.1
   Compiling phf_shared v0.12.1
   Compiling heck v0.5.0
   Compiling constant_time_eq v0.4.2
   Compiling arrayvec v0.7.8
   Compiling chrono-tz v0.10.4
   Compiling inotify-sys v0.1.8
   Compiling dotenvy v0.15.7
   Compiling hex v0.4.3
   Compiling zlib-rs v0.6.8
   Compiling sqlx-macros-core v0.9.0
   Compiling phf v0.12.1
   Compiling cipher v0.5.2
   Compiling multiversion v0.9.0
   Compiling hyper-util v0.1.20
   Compiling flate2 v1.1.10
   Compiling phf_macros v0.11.3
   Compiling universal-hash v0.6.1
   Compiling tower v0.5.3
   Compiling http-body-util v0.1.5
   Compiling multer v3.1.0
   Compiling linkme-impl v0.3.37
   Compiling unicode-joining-type v1.0.0
   Compiling simdutf8 v0.1.5
   Compiling core_detect v1.0.0
   Compiling openssl-probe v0.2.1
   Compiling multiversion_no_op v1.0.0
   Compiling mime v0.3.17
   Compiling rustls-native-certs v0.8.4
   Compiling phf v0.11.3
   Compiling poly1305 v0.9.1
   Compiling chacha20 v0.10.2
   Compiling sqlx-macros v0.9.0
   Compiling aead v0.6.1
   Compiling miniz_oxide v0.8.9
   Compiling fdeflate v0.3.7
   Compiling utoipa-gen v6.0.1
   Compiling pulldown-cmark v0.13.4
   Compiling same-file v1.0.6
   Compiling color_quant v1.1.0
   Compiling pxfm v0.1.30
   Compiling rustls-webpki v0.103.15
   Compiling linkme v0.3.37
   Compiling calternal-path v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-path)
   Compiling winnow v0.7.15
   Compiling byteorder-lite v0.1.0
   Compiling quick-error v2.0.1
   Compiling weezl v0.1.12
   Compiling zune-core v0.5.3
   Compiling zune-jpeg v0.5.15
   Compiling gif v0.14.2
   Compiling cron v0.17.0
   Compiling image-webp v0.2.4
   Compiling utoipa v6.0.0
   Compiling moxcms v0.8.1
   Compiling walkdir v2.5.0
   Compiling png v0.18.1
   Compiling tokio-rustls v0.26.6
   Compiling rustls-platform-verifier v0.7.0
   Compiling hyper-rustls v0.27.10
   Compiling sqlx v0.9.0
   Compiling chacha20poly1305 v0.11.0
   Compiling inotify v0.11.5
   Compiling axum-core v0.5.6
   Compiling tower-http v0.6.11
   Compiling serde_urlencoded v0.7.1
   Compiling uuid v1.26.1
   Compiling notify-types v2.1.0
   Compiling serde_path_to_error v0.1.20
   Compiling unsafe-libyaml v0.2.11
   Compiling unicode-properties v0.1.4
   Compiling unicode-casefold v0.2.0
   Compiling base64 v0.23.1
   Compiling bytemuck v1.25.2
   Compiling unicase v2.9.0
   Compiling bumpalo v3.20.3
   Compiling matchit v0.8.4
   Compiling serde_yaml v0.9.34+deprecated
   Compiling zopfli v0.8.3
   Compiling axum v0.8.9
   Compiling reqwest v0.13.5
   Compiling image v0.25.10
   Compiling calternal-fs v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-fs)
   Compiling calternal-db v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-db)
   Compiling notify v8.2.0
   Compiling calternal-api v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-api)
   Compiling quick-xml v0.42.0
   Compiling csv-core v0.1.13
   Compiling csv v1.4.0
   Compiling zip v5.1.1
   Compiling calternal-notes-core v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-notes-core)
   Compiling calternal-plugin v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-plugin)
   Compiling calternal-plugin-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/plugins/money)
    Finished `test` profile [unoptimized + debuginfo] target(s) in 2m 02s
     Running unittests src/lib.rs (/home/kayg/build/targets/bulkrev5/debug/deps/calternal_money-5ad27f9b5c008064)

running 16 tests
test codec::tests::empty_payee_is_refused_by_the_writer ... ok
test edit::tests::cleared_tag_toggles_without_touching_other_tags ... ok
test units::tests::exact_range_is_enforced_on_parse_and_arithmetic ... ok
test codec::tests::malformed_dated_rows_fail_instead_of_vanishing ... ok
test units::tests::format_uses_explicit_sign_and_exact_scale ... ok
test edit::tests::unicode_payee_tag_boundaries_match_shared_vectors ... ok
test codec::tests::transaction_round_trip_with_punctuation_in_labels_and_payee ... ok
test units::tests::scale_table_has_all_165_codes_with_unique_entries ... ok
test units::tests::parse_matches_the_oracle_examples ... ok
test codec::tests::property_edit_changes_one_value ... ok
test codec::tests::round_trip_keeps_bom_crlf_and_unknown_bytes ... ok
test edit::tests::crlf_file_keeps_crlf_on_insert ... ok
test units::independent_number_review::signed_edges_and_long_zero_padding_keep_exact_minor_units ... ok
test codec::tests::checked_parse_stops_after_a_bounded_line_batch ... ok
test edit::tests::new_budget_projects_with_no_accounts ... ok
test edit::tests::assign_inserts_updates_and_removes_rows ... ok

test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s

     Running tests/account_kinds.rs (/home/kayg/build/targets/bulkrev5/debug/deps/account_kinds-40f136ace82559dd)

running 5 tests
test account_projection_rejects_legacy_and_unknown_kinds ... ok
test tracking_deficit_rollover_does_not_reduce_ready_to_assign ... ok
test categorized_debit_loan_transfers_post_one_budget_leg ... ok
test off_budget_balance_marker_does_not_change_budget_money ... ok
test imported_account_kinds_project_without_losing_identity ... ok

test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s

     Running tests/import.rs (/home/kayg/build/targets/bulkrev5/debug/deps/import-32258f8fda96f336)

running 13 tests
test recheck_half_minor_units_negative_zero_and_nineteen_digits ... ok
test import_stream_renderer_matches_full_rendered_files ... ok
test duplicate_source_ids_are_rejected_and_duplicate_names_are_kept ... ok
test production_v1_metadata_upgrade_keeps_balances ... ok
test import_render_is_exact_and_byte_stable ... ok
test import_keeps_same_day_source_order_for_credit_payments_and_refunds ... ok
test import_render_reports_progress_and_propagates_cancel ... ok
test import_replay_matches_full_ledger_month_by_month ... ok
test recheck_same_day_payment_and_refund_keep_source_fifo ... ok
test budget_replay_stops_at_a_bounded_transaction_checkpoint ... ok
test imported_ready_to_assign_matches_independent_month_oracle ... ok
test random_imports_conserve_source_balances_and_markdown ... ok
test recheck_random_multicurrency_ledgers_match_all_monthly_totals ... ok

test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.16s

     Running tests/properties.rs (/home/kayg/build/targets/bulkrev5/debug/deps/properties-9ff9e71a800dacb8)

running 21 tests
test bill_coverage_never_clamps_the_bill ... ok
test decimal_text_round_trips_for_every_scale ... ok
test bulkrev2::literal_account_sum_and_funded_card_conservation ... ok
test money_code_never_uses_floating_point ... ok
test bulkrev2::split_refund_keeps_payment_overfunding_when_card_becomes_positive ... ok
test bulkrev2::i64_extremes_are_rejected_and_safe_bound_is_exact ... ok
test bulkrev2::boundary_shuffle_reports_acceptance_difference ... ok
test bulkrev2::refund_payment_calendar_choice_is_visible_next_month ... ok
test reviewed_burst_order_matches_input_order ... ok
test any_text_that_parses_serializes_to_the_same_bytes ... ok
test transaction_rows_round_trip_byte_for_byte ... ok
test paired_write_replay_matches_independent_calculations ... ok
test mixed_cash_credit_deficit_rolls_only_its_cash_part ... ok
test split_legs_post_exactly_the_parent ... ok
test assign_then_unassign_is_the_identity ... ok
test partial_payment_then_category_refunds_conserve_cash_across_months ... ok
test fully_funded_card_spending_conserves_cash ... ok
test cash_ledgers_conserve_money_every_month ... ok
test same_date_card_postings_are_a_function_of_the_set ... ok
test bulkrev2::funded_shuffles_conserve_real_money_every_month ... ok
test bulkrev2::same_day_shuffles_cover_splits_transfers_and_month_edges ... ok

test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.33s

     Running tests/ready_to_assign_adjustment.rs (/home/kayg/build/targets/bulkrev5/debug/deps/ready_to_assign_adjustment-0e1c5c7276d14077)

running 1 test
test ready_to_assign_adjustment_changes_only_the_budget_pool ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s

     Running tests/review_984.rs (/home/kayg/build/targets/bulkrev5/debug/deps/review_984-dc85183370c2f07a)

running 5 tests
test review_pair_performance_profile ... ignored, performance measurements belong to the merge round on the perf VM
test review_pair_rejects_bad_months_and_amounts_without_rounding ... ok
test review_split_remainders_and_tracking_transfers_are_exact ... ok
test review_mixed_pair_matches_independent_replays ... ok
test review_large_ledger_pair_keeps_exact_totals ... ok

test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 3.69s

     Running tests/review_bulkrev3.rs (/home/kayg/build/targets/bulkrev5/debug/deps/review_bulkrev3-cbfa6724c48c7f18)

running 7 tests
test card_opening_credit_enters_ready_to_assign_once ... ok
test legacy_payment_repair_is_idempotent_and_collision_safe ... ok
test unlinked_card_funded_purchase_keeps_its_payment_money ... ok
test hidden_and_missing_categories ... ok
test envelope_edge_cases ... ok
test previous_witnesses_all_orders ... ok
test random_histories_conserve_money_after_every_rollover ... ok

test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.72s

     Running tests/vectors.rs (/home/kayg/build/targets/bulkrev5/debug/deps/vectors-b0e2a54af0711cc9)

running 5 tests
test rust_matches_random_oracle_ledgers_without_divergences ... ok
test reviewed_r4_unlinked_card_vector_keeps_its_unfunded_amount ... ok
test reviewed_r3_vectors_assert_retired_debt_and_positive_credit ... ok
test reviewed_eleven_refund_vectors_keep_their_exact_numbers ... ok
test rust_port_matches_every_recorded_oracle_vector ... ok

test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.49s

     Running unittests src/lib.rs (/home/kayg/build/targets/bulkrev5/debug/deps/calternal_plugin_money-3d165b6d3890a332)

running 138 tests
test import::import_review_tests::actual_stream_memory_guard_child ... ignored, invoked as an isolated child by actual_stream_keeps_a_large_history_bounded
test import::import_review_tests::actual_cc_label_requires_missing_type_confirmation ... ok
test import::import_review_tests::actual_cents_conversion_never_rounds ... ok
test import::import_review_tests::actual_transfer_legs_cannot_cross_months ... ok
test import::import_review_tests::actual_orphan_split_children_are_rejected ... ok
test import::import_review_tests::import_control_reports_progress_and_stops_cancelled_work ... ok
test import::import_review_tests::actual_account_checks_use_raw_monthly_source_rows ... ok
test routes::import_staged_path_tests::staged_import_name_cannot_select_another_path_or_slot ... ok

running 1 test
test routes::import_cleanup_tests::dropped_preview_worker_retains_admission_until_exit ... ok
test import::import_review_tests::ynab_transfer_pairing_handles_many_duplicate_legs ... ok
test routes::replay_reuse_tests::crossings_reuse_checked_current_totals_even_with_future_months ... ok
test routes::import_cleanup_tests::staged_import_files_keep_ranges_and_release_private_storage ... ok
test import_fidelity_1130::independent_split_and_transfer_numbers_check ... ok
test routes::import_cleanup_tests::idle_imports_are_reclaimed_by_expiry_cleanup ... ok
test routes::durable::checkpoint_tests::progress_wait_keeps_parser_writer_release_polled ... ok
test routes::durable::admission_tests::cancelled_receiver_cannot_acknowledge_a_durable_job ... ok
test routes::replay_reuse_tests::crossings_cover_source_ranges_relative_to_today ... ok
test routes::review_1140::cancel_wins_before_publication_lock ... ok
test routes::replay_reuse_tests::assignment_retry_rebuilds_from_latest_source_bytes ... ok
test routes::review_1140::review1140_staged_size_limits_fail_without_publishing ... ok
test routes::review_1140::cancel_does_not_rewrite_published_result ... ok
test store::parsed_cache_tests::global_budget_and_folder_pruning_release_stale_entries ... ok
test store::parsed_cache_tests::parse_charge_accounts_for_line_structures ... ok
test store::parsed_cache_tests::user_cache_evicts_old_parse_entries_and_shares_hot_documents ... ok
test import_fidelity_1130::actual_rows_round_trip ... ok
test routes::review_1140::review1140_tcp_malformed_inputs_leave_worker_usable ... ok
test routes::review_1140::review1140_operational_cancel_before_replacement_returns_no_receipt ... ok
test tests::a_new_user_sees_the_real_empty_state ... ok
test routes::review_1140::review1140_terminal_receipts_do_not_block_new_imports ... ok
test tests::active_money_handle_survives_other_users_cache_pressure ... ok
test tests::actual_duplicate_names_import_by_id_without_sharing_a_payment_category ... ok
test routes::review_1140::review1140_cancel_after_rename_before_receipt_keeps_publication ... ok
test tests::actual_export_archive_imports_exact_rows_from_private_scratch ... ok
test routes::review_1140::review1140_discard_after_confirmation_failure_releases_admission ... ok
test tests::api_account_numbers_equal_core_replay ... ok
test tests::a_broken_file_is_reported_not_hidden ... ok
test tests::a_read_waits_for_a_write_in_progress ... ok
test routes::durable::admission_tests::live_publication_honors_operational_queue_cancellation ... ok
test tests::a_split_row_written_by_hand_is_read_but_not_edited ... ok
test tests::a_journal_for_a_completed_move_changes_nothing ... ok
test tests::cancel_racing_confirm_has_one_consistent_outcome ... ok
test tests::assignments_retry_source_conflicts_without_losing_neighbours ... ok
test tests::cancelling_imports_leaves_no_budget_and_releases_slots ... ok
test routes::review_1140::review1140_all_formats_replay_exact_balances ... ok
test tests::backdated_create_emits_current_month_overspend_crossing ... ok
test tests::csv_import_keeps_progress_and_cancel_responsive ... ok
test tests::bulk_write_invalid_neighbours_do_not_change_valid_rows ... ok
test tests::budget_flow_writes_exact_markdown_and_derives_available ... ok
test tests::bulk_write_month_does_not_need_note_date_backfill ... ok
test tests::durable_import_tests::operation_exit_child ... ignored, child of operation_recovery_survives_process_exit_at_every_phase
test tests::bulk_write_rejects_intermediate_overflow ... ok
test tests::concurrent_store_edits_keep_exactly_one_winner ... ok
test routes::review_1140::review1140_replacement_receipt_recovery_does_not_adopt_later_edits ... ok
test tests::denied_preview_access_keeps_the_owners_pending_import ... ok
test tests::durable_import_tests::receipt_reads_are_bounded_and_old_receipts_are_addressable ... ok
test tests::durable_import_tests::replay_preserves_a_live_ready_preview ... ok
test tests::durable_import_tests::running_jobs_do_not_expire_and_cancelled_jobs_do_not_restart ... ok
test tests::durable_import_tests::queued_import_and_undo_survive_restarts ... ok
test tests::delete_transaction_emits_current_month_overspend_crossing ... ok
test tests::durable_import_tests::publication_and_inverse_authority_use_full_commits ... ok
test tests::card_opening_credit_route_conserves_real_budget_money ... ok
test routes::durable::money_import_undo_mutation ... ok
test tests::durable_import_tests::undo_receipt_replay_never_removes_a_restored_import ... ok
test tests::durable_import_tests::undo_refuses_a_predecessor_restored_before_the_inverse ... ok
test tests::far_month_assignment_cannot_make_the_budget_unreadable ... ok
test tests::durable_import_tests::undo_restarts_before_and_after_the_filesystem_inverse ... ok
test tests::gap_month_assignments_and_opening_card_debt_do_not_create_cash ... ok
test tests::failed_cross_month_move_never_counts_the_row_twice ... ok
test tests::import_file_limits_match_the_money_reader ... ok
test tests::hostile_inputs_are_rejected_without_writing ... ok
test tests::historical_overspend_does_not_emit_current_month_event ... ok
test tests::import_preview_reads_only_generated_staged_upload_names ... ok
test tests::import_preview_is_owner_bound_and_confirmation_publishes_once ... ok
test tests::inferred_opening_balance_needs_explicit_confirmation ... ok
test tests::memo_and_tags_split_the_payee_without_losing_text ... ok
test tests::money_is_on_for_the_instance_and_off_for_a_new_user ... ok
test tests::import_fidelity_review_requires_account_kind_and_keeps_notes ... ok
test tests::month_revision_increases_after_each_assignment ... ok
test tests::legacy_card_payment_repair_is_editable_and_saved_category_first ... ok
test tests::move_money_keeps_ready_to_assign_and_card_gets_payment_category ... ok
test tests::legacy_card_payment_repair_cannot_make_its_budget_unreadable ... ok
test tests::multiple_assignment_rows_set_one_exact_total ... ok
test tests::other_users_and_sessions_without_data_scope_see_nothing ... ok
test tests::durable_import_tests::undo_refuses_every_later_budget_edit_after_restart ... ok
test import::import_review_tests::actual_stream_keeps_a_large_history_bounded has been running for over 60 seconds
test import::import_review_tests::actual_stream_memory_guard_child has been running for over 60 seconds
test tests::overflowing_category_sum_is_rejected_before_assignment_write ... ok
test tests::plugin_code_never_uses_floating_point ... ok
test tests::parsed_money_cache_shares_documents_and_prunes_removed_months ... ok
test tests::recheck_metadata_files_use_the_reader_size_cap ... ok
test import::import_review_tests::actual_stream_memory_guard_child ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 137 filtered out; finished in 61.89s

test import::import_review_tests::actual_stream_keeps_a_large_history_bounded ... ok
test tests::overflowing_derived_balance_is_rejected_before_the_write ... ok
test tests::overflowing_cleared_subset_is_rejected_before_transaction_write ... ok
test tests::review_1130::review1130_cancel_after_partial_preparation ... ok
test tests::overspending_reports_ynab_states ... ok
test tests::review_1130::review1130_notes_are_inert ... ok
test tests::recheck_local_server_number_and_lifecycle_contract ... ok
test tests::idle_import_receive_releases_admission_and_cancel_stops_read ... ok
test tests::recheck_source_checks_owner_and_opening_balance_confirmation ... ok
test tests::review_1130::review1130_legacy_home_needs_no_metadata_rewrite ... ok
test tests::review_984::review3_first_future_transaction_keeps_current_event_month ... ok
test tests::recheck_random_preview_cancellation_leaves_no_files ... ok
test tests::review_1130::review1130_long_imported_note_allows_amount_edit_without_loss ... ok
test tests::review_984::review3_future_only_edit_and_delete_keep_current_event_month ... ok
test tests::review_1130::review1130_tcp_locks_reimport_and_cancel ... ok
test tests::review_1130::review1130_split_and_closed_transfer_have_one_posting ... ok
test tests::review_984::review_concurrent_assign_revisions_match_final_report ... ok
test tests::review_984::review_category_edit_emits_for_old_category_only ... ok
test tests::review_1130::review1130_reconciled_closed_balances ... ok
test tests::review_984::review_user_zone_month_and_year_edges ... ok
test tests::review_984::review_file_replacement_advances_month_revision ... ok
test tests::review_984::review3_outside_current_range_writes_emit_no_overspend ... ok
test tests::review_984::review_cross_month_refund_move_emits_current_crossing ... ok
test tests::review_984::review_exact_zero_healing_recrossing_and_delete ... ok
test tests::simultaneous_import_confirmations_have_one_winner ... ok
test tests::source_total_mismatch_cannot_be_confirmed ... ok
test tests::review_bulkrev2::four_conflicts_return_409_without_writing ... ok
test tests::review_984::review_split_and_tracking_transfer_writes_are_rejected_without_events ... ok
test tests::review_984::review_source_generation_tracks_all_files_and_restoration ... ok
test tests::transfer_register_view_exposes_linked_category ... ok
test tests::same_handle_settles_a_failed_move_before_the_next_request ... ok
test tests::transaction_identity_preview_is_atomic_and_reimport_changes_nothing ... ok
test tests::wizard_background_job_retains_safe_failure ... ok
test tests::wizard_background_job_recovers_preview_after_response_is_dropped ... ok
test tests::ynab_conflicting_accounts_and_payees_are_not_silently_discarded ... ok
test tests::ynab_csv_import_keeps_exact_month_and_register_amounts ... ok
test tests::ynab_duplicate_category_ids_are_merged_only_when_identical ... ok
test tests::ynab_plan_json_import_keeps_exact_milliunits ... ok
test tests::ynab_public_demo_imports_duplicate_category_names_by_id ... ok
test tests::wizard_starter_categories_validate_before_create_and_do_not_change_totals ... ok
test tests::transaction_logged_event_has_the_documented_create_payload ... ok
test tests::bulk_write_balances_equal_one_by_one has been running for over 60 seconds
test tests::transfer_cleared_edits_are_per_account ... ok
test tests::update_transaction_emits_current_month_overspend_crossing ... ok
test tests::card_models_ignore_arrival_batch_and_timezone has been running for over 60 seconds
test tests::durable_import_tests::operation_recovery_survives_process_exit_at_every_phase ... ok
test tests::review_bulkrev2::two_and_five_assignment_races_match_serial_targets ... ok
test tests::durable_import_tests::generated_import_confirm_replay_and_undo_preserve_minor_units has been running for over 60 seconds
test tests::slow_15mb_import_receive_completes_with_progress ... ok
test tests::durable_import_tests::replacement_restarts_at_every_durable_phase has been running for over 60 seconds
test tests::durable_import_tests::generated_import_confirm_replay_and_undo_preserve_minor_units ... ok
test tests::durable_import_tests::replacement_restarts_at_every_durable_phase ... ok
test tests::bulk_write_balances_equal_one_by_one ... ok
test tests::card_models_ignore_arrival_batch_and_timezone ... ok

test result: ok. 136 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 786.32s

     Running tests/import_review.rs (/home/kayg/build/targets/bulkrev5/debug/deps/import_review-6a0b9e5006b57cbf)

running 32 tests
test identity_csv_transfer_growth_curve ... ignored, run with MONEY_IDENT_CSV_ROWS for 10k/100k/1M transfer profiling
test recheck_actual_stream_growth_curve ... ignored, run with MONEY_RECHECK_ARCHIVE and MONEY_RECHECK_ROWS for profiling
test recheck_csv_transfer_growth_curve ... ignored, run with MONEY_RECHECK_TRANSFERS for the bounded CSV growth probe
test split_identity_cannot_reuse_a_top_level_id ... ok
test csv_transaction_ids_merge_or_reject_before_totals ... ok
test recheck_conflicting_transaction_ids_are_rejected ... ok
test split_identity_includes_parent_deleted_and_transfer_fields ... ok
test split_identity_rejects_an_inconsistent_embedded_parent ... ok
test split_identity_review_cases_reject ... ok
test transaction_identity_checks_fields_and_keeps_distinct_ids ... ok
test recheck_identical_transaction_ids_do_not_double_money ... ok
test csv_bom_mixed_endings_and_decimal_comma_are_exact ... ok
test csv_amount_edges_never_round_group_or_overflow ... ok
test recheck_e2e_csv_has_four_checks_and_keeps_every_minor_unit ... ok
test recheck_reconciled_negative_zero_and_exact_source_scales ... ok
test transfer_month_review_cases_reject ... ok
test transfer_legs_prefer_a_same_month_mate ... ok
test split_identity_concrete_valid_totals ... ok
test ynab_account_check_rejects_a_wrong_normalization ... ok
test corrupt_actual_database_is_a_private_error ... ok
test ynab_unrepresentable_milliunits_are_rejected ... ok
test ynab_negative_zero_amount_is_zero ... ok
test unmatched_transfer_legs_keep_the_source_register ... ok
test csv_pairing_accepts_cancellation_during_its_loop ... ok
test transfer_month_identity_rejects_in_both_adapters ... ok
test ynab_csv_preserves_exact_minor_units ... ok
test transaction_identity_preserves_exact_units ... ok
test ynab_json_keeps_exact_split_and_transfer_postings ... ok
test split_identity_merges_before_totals ... ok
test transfer_month_pairing_keeps_dates_and_exact_pair_priority ... ok
test csv_pairing_keeps_exact_account_legs ... ok
test raw_ynab_registers_match_a_raw_row_oracle ... ok

test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 6.42s

   Doc-tests calternal_money

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

   Doc-tests calternal_plugin_money

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s


python3 tests/money/bulkrev5-numbers.py

07b33aa56ff97a67: A=13222722 B=108 P=13222755 reserve=0; every stored field correct
08d823459b4f7555: A=1 B=1 P=1 reserve=0; every stored field correct
10dad10f207e3966: A=13222722 B=1 P=13222722 reserve=0; every stored field correct
217b597cc7b1b339: A=109170509 B=1000000000 P=110838733 reserve=889161267; every stored field correct
3c10364db1d4cd46: A=109170509 B=1 P=109170509 reserve=0; every stored field correct
405bf72849418ee7: A=28500 B=1 P=28500 reserve=0; every stored field correct
5cd63c6abac2f757: A=103816 B=1 P=103816 reserve=0; every stored field correct
70887b8579a61566: A=5789 B=1035233 P=55551 reserve=979682; every stored field correct
aa06a27413c2238d: A=103816 B=454 P=103879 reserve=0; every stored field correct
de05e2804212ba0e: A=5789 B=1 P=5789 reserve=0; every stored field correct
f161754b530689ba: A=28500 B=8319 P=31192 reserve=0; every stored field correct
Burst pins: reserve=6474+4103=10577; uncovered=51911-10577=41334
901a5dc38f13b647: February Available fees=-15151 tax=-3309 interest=-3232 retail=payment=0; reserve=0; raw/uncovered debt=366524
e6d77a36b9ded73d: RTA=1150500-560500+(20000-9853)=600147
PASS: 11 complete vectors, both changed burst pins and both changed vector records
PASS: only de7c249363a57c0c changed this round; all added fields correct: Visa reserve 0, uncovered 4950, repaired payment Category all zero/Funded; Food -4950 and U 4950 give L+U=M=0. Every other field unchanged.

python3 tests/money/bulkrev5-probe.py

RUN bulkrev5-opening: seed 139305, 2000 histories

running 7 tests
test card_opening_credit_enters_ready_to_assign_once ... ok
test envelope_edge_cases ... CASE underfunded_partial_refund month=2026-03 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=0 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=0
CASE underfunded_partial_refund month=2026-04 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=0 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=0
CASE underfunded_partial_refund month=2026-05 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=0 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=0
CASE underfunded_full_refund_later month=2026-03 allocation=100 real=200 delta=-100 cash=200 card=-100 other=0 food=-100 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=100
CASE underfunded_full_refund_later month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0
CASE underfunded_full_refund_later month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0
CASE underfunded_partial_refund_later month=2026-03 allocation=150 real=200 delta=-50 cash=200 card=-100 other=0 food=-50 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=50
CASE underfunded_partial_refund_later month=2026-04 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=50
CASE underfunded_partial_refund_later month=2026-05 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=50
CASE overspent_cash month=2026-03 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=-50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=0
CASE overspent_cash month=2026-04 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE overspent_cash month=2026-05 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE mixed_cash_credit_refund month=2026-03 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=-50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=0
CASE mixed_cash_credit_refund month=2026-04 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE mixed_cash_credit_refund month=2026-05 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE refund_larger_than_debt month=2026-03 allocation=250 real=250 delta=0 cash=200 card=50 other=0 food=150 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE refund_larger_than_debt month=2026-04 allocation=250 real=250 delta=0 cash=200 card=50 other=0 food=150 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE refund_larger_than_debt month=2026-05 allocation=250 real=250 delta=0 cash=200 card=50 other=0 food=150 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE funded_refund_later month=2026-03 allocation=200 real=200 delta=0 cash=200 card=-100 other=0 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0
CASE funded_refund_later month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE funded_refund_later month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE refund_after_full_payment month=2026-03 allocation=200 real=200 delta=0 cash=100 card=100 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE refund_after_full_payment month=2026-04 allocation=200 real=200 delta=0 cash=100 card=100 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE refund_after_full_payment month=2026-05 allocation=200 real=200 delta=0 cash=100 card=100 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE partial_payment_refund month=2026-03 allocation=150 real=150 delta=0 cash=150 card=-50 other=0 food=100 dining=0 reserve=50 other_reserve=0 rta=0 uncovered=0
CASE partial_payment_refund month=2026-04 allocation=150 real=150 delta=0 cash=150 card=-50 other=0 food=100 dining=0 reserve=50 other_reserve=0 rta=0 uncovered=0
CASE partial_payment_refund month=2026-05 allocation=150 real=150 delta=0 cash=150 card=-50 other=0 food=100 dining=0 reserve=50 other_reserve=0 rta=0 uncovered=0
CASE split_refund month=2026-03 allocation=200 real=200 delta=0 cash=50 card=150 other=0 food=100 dining=100 reserve=0 other_reserve=0 rta=0 uncovered=0
CASE split_refund month=2026-04 allocation=200 real=200 delta=0 cash=50 card=150 other=0 food=100 dining=100 reserve=0 other_reserve=0 rta=0 uncovered=0
CASE split_refund month=2026-05 allocation=200 real=200 delta=0 cash=50 card=150 other=0 food=100 dining=100 reserve=0 other_reserve=0 rta=0 uncovered=0
CASE two_cards_debt_transfer month=2026-03 allocation=200 real=200 delta=0 cash=200 card=0 other=-100 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0
CASE two_cards_debt_transfer month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=-100 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0
CASE two_cards_debt_transfer month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=-100 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0
CASE spending_positive_card_credit month=2026-03 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0
CASE spending_positive_card_credit month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0
CASE spending_positive_card_credit month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0
CASE two_cards_credit_transfer month=2026-03 allocation=300 real=300 delta=0 cash=200 card=-100 other=100 food=0 dining=0 reserve=0 other_reserve=0 rta=300 uncovered=100
CASE two_cards_credit_transfer month=2026-04 allocation=300 real=300 delta=0 cash=200 card=-100 other=100 food=0 dining=0 reserve=0 other_reserve=0 rta=300 uncovered=100
CASE two_cards_credit_transfer month=2026-05 allocation=300 real=300 delta=0 cash=200 card=-100 other=100 food=0 dining=0 reserve=0 other_reserve=0 rta=300 uncovered=100
ok
test hidden_and_missing_categories ... HIDDEN retains totals; MISSING rejected: unknown category block id: food
ok
test legacy_payment_repair_is_idempotent_and_collision_safe ... ok
test previous_witnesses_all_orders ... CASE B1 month=2026-03 allocation=10000 real=10000 delta=0 cash=10000 card=0 other=0 food=10000 dining=0 reserve=0 other_reserve=0 rta=0 uncovered=0
CASE B1 month=2026-04 allocation=10000 real=10000 delta=0 cash=10000 card=0 other=0 food=10000 dining=0 reserve=0 other_reserve=0 rta=0 uncovered=0
CASE B1 month=2026-03 allocation=10000 real=10000 delta=0 cash=10000 card=0 other=0 food=10000 dining=0 reserve=0 other_reserve=0 rta=0 uncovered=0
CASE B1 month=2026-04 allocation=10000 real=10000 delta=0 cash=10000 card=0 other=0 food=10000 dining=0 reserve=0 other_reserve=0 rta=0 uncovered=0
B1 2/2 permutations, N2 24/24 permutations correct
ok
test random_histories_conserve_money_after_every_rollover ... proptest: FileFailurePersistence::SourceParallel set, but failed to find lib.rs or main.rs
ok
test unlinked_card_funded_purchase_keeps_its_payment_money ... ok

test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 82.75s

RUN bulkrev5-consecutive: seed 139305, 2000 histories

running 6 tests
test exact_bounds_and_hidden_categories ... Real visibility:: hidden preserves totals; deleted Category reference rejects; exact bounds pass
ok
test generated_opening_credit_conserves ... ignored, known BLOCK R4-1; run explicitly to shrink the accepted input
test generated_unlinked_card_conserves ... ignored, known BLOCK R4-2; run explicitly to shrink the accepted input
test hand_checked_envelope_edges ... CASE underfunded month=2026-03 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=0 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=0
CASE underfunded month=2026-04 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=0 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=0
CASE underfunded month=2026-05 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=0 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=0
CASE unfunded_later month=2026-03 allocation=100 real=200 delta=-100 cash=200 card=-100 other=0 food=-100 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=100
CASE unfunded_later month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0
CASE unfunded_later month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0
CASE part_funded_later month=2026-03 allocation=150 real=200 delta=-50 cash=200 card=-100 other=0 food=-50 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=50
CASE part_funded_later month=2026-04 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=50
CASE part_funded_later month=2026-05 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=50
CASE cash_overspend month=2026-03 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=-50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=0
CASE cash_overspend month=2026-04 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE cash_overspend month=2026-05 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE mixed_cash_credit month=2026-03 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=-50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=0
CASE mixed_cash_credit month=2026-04 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE mixed_cash_credit month=2026-05 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE refund_above_debt month=2026-03 allocation=250 real=250 delta=0 cash=200 card=50 other=0 food=150 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE refund_above_debt month=2026-04 allocation=250 real=250 delta=0 cash=200 card=50 other=0 food=150 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE refund_above_debt month=2026-05 allocation=250 real=250 delta=0 cash=200 card=50 other=0 food=150 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE funded_later month=2026-03 allocation=200 real=200 delta=0 cash=200 card=-100 other=0 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0
CASE funded_later month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE funded_later month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE fully_paid month=2026-03 allocation=200 real=200 delta=0 cash=100 card=100 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE fully_paid month=2026-04 allocation=200 real=200 delta=0 cash=100 card=100 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE fully_paid month=2026-05 allocation=200 real=200 delta=0 cash=100 card=100 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0
CASE partial_payment month=2026-03 allocation=150 real=150 delta=0 cash=150 card=-50 other=0 food=100 dining=0 reserve=50 other_reserve=0 rta=0 uncovered=0
CASE partial_payment month=2026-04 allocation=150 real=150 delta=0 cash=150 card=-50 other=0 food=100 dining=0 reserve=50 other_reserve=0 rta=0 uncovered=0
CASE partial_payment month=2026-05 allocation=150 real=150 delta=0 cash=150 card=-50 other=0 food=100 dining=0 reserve=50 other_reserve=0 rta=0 uncovered=0
CASE split_refund month=2026-03 allocation=200 real=200 delta=0 cash=50 card=150 other=0 food=100 dining=100 reserve=0 other_reserve=0 rta=0 uncovered=0
CASE split_refund month=2026-04 allocation=200 real=200 delta=0 cash=50 card=150 other=0 food=100 dining=100 reserve=0 other_reserve=0 rta=0 uncovered=0
CASE split_refund month=2026-05 allocation=200 real=200 delta=0 cash=50 card=150 other=0 food=100 dining=100 reserve=0 other_reserve=0 rta=0 uncovered=0
CASE debt_transfer month=2026-03 allocation=200 real=200 delta=0 cash=200 card=0 other=-100 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0
CASE debt_transfer month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=-100 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0
CASE debt_transfer month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=-100 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0
CASE credit_spending month=2026-03 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0
CASE credit_spending month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0
CASE credit_spending month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0
CASE credit_transfer month=2026-03 allocation=300 real=300 delta=0 cash=200 card=-100 other=100 food=0 dining=0 reserve=0 other_reserve=0 rta=300 uncovered=100
CASE credit_transfer month=2026-04 allocation=300 real=300 delta=0 cash=200 card=-100 other=100 food=0 dining=0 reserve=0 other_reserve=0 rta=300 uncovered=100
CASE credit_transfer month=2026-05 allocation=300 real=300 delta=0 cash=200 card=-100 other=100 food=0 dining=0 reserve=0 other_reserve=0 rta=300 uncovered=100
ok
test opening_credit_and_missing_payment_observations ... CASE positive_card_opening month=2026-01 allocation=1 real=1 delta=0 cash=0 card=1 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=1 uncovered=0
CASE positive_card_opening month=2026-02 allocation=1 real=1 delta=0 cash=0 card=1 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=1 uncovered=0
CASE unlinked_card month=2026-01 L=1 M=1 rta=0 food=0 cash=1 card=-1
CASE unlinked_card month=2026-02 L=1 M=1 rta=0 food=0 cash=1 card=-1
ok
test wider_histories ... ok

test result: ok. 4 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 70.85s


running 2 tests
test generated_opening_credit_conserves ... ok
test generated_unlinked_card_conserves ... ok

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 4 filtered out; finished in 0.34s


running 1 test
test read_and_interrupted_publication_are_isolated_and_idempotent ... PASS: 16 reads preserve bytes/fingerprints; failed link CAS leaves a valid Category-first Budget; retry reuses the Category without rewriting it; other User unchanged
ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s


python3 tests/money/bulkrev5-probe.py --store-only (strengthened partial/final replay assertions)


running 1 test
test read_and_interrupted_publication_are_isolated_and_idempotent ... PASS: 16 reads preserve bytes/fingerprints; failed link CAS leaves a valid Category-first Budget; retry reuses the Category without rewriting it; other User unchanged
ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s


cargo clean

     Removed 3234 files, 1.8GiB total

No web build output was created. The three standalone probe binaries were removed. All changed module and function doc comments were read again. The worktree contains only committed review files and ignored evidence.

READY — no blocking items.

Final bulkrev5 head: `74c58b72f590e3663b84751724f3119161c86689`. READY — no blocking items. # Independent Money number review — bulkrev5, #1393 READY. No conservation defect, wrong number, file change on read or cross-User effect was found. Reviewed product head: `cd622b94e212d88dd2e7292a796f2ad5f82df2cc`. Branch: `job/bulkwrite-1393`. The fetched dev base is `cc1af3c12b68ad26c8403adde1be39c096b9ddea` (also the merge base). Required `git fetch origin && git merge origin/dev`: `Already up to date.` Review code head: `83bc8d71ee567608a15f27f4436c07f6e4230d4c`. The final issue comment records the final report commit. Product code, dependencies, lockfiles and existing expectations were unchanged. Author reports and result files were not read. Prior independent reviews and their probes were reused. All amounts below are synthetic fixture minor units. ## Built and files - `tests/money/bulkrev5-numbers.py`: independently checks all eleven original vectors and every changed field in this round. - `tests/money/bulkrev5-probe.py`: compiles prior probes against the real gate-built crates, with seed 139305 and 2,000 histories per generator. It changes only standalone copies' generator configuration. Rustc checks dependency metadata compatibility because cargo builds feature-distinct library artifacts. - `tests/money/bulkrev5-store.rs`: real-file probe for reads, interrupted Category-first publication, retry and User isolation. - `tests/money/bulkrev5-review.md`: this review, with verbatim gate evidence. - `artifacts/bulkrev5-findings.md`: findings appended during review; stays gitignored. ## Invariant and comparison [DESIGN §48](../../docs/DESIGN.md#48-search-isolation-and-money-format-decisions-owner-2026-09-29) defines M as Cash balances plus each positive Card balance, L as Ready to Assign plus all signed Category Available (payment Categories once), and U as current-month unfunded Card spending not canceled or covered. For the documented Cash-income/on-budget expense/refund/payment/transfer histories, **L + U = M**. Import reconciliation adjustments add to M. At rollover, negative Available resets; only its Cash part reduces Ready to Assign. With no new rows, **L = M**, including after underfunded histories. Every Account also equals its exact raw ordinary and transfer leg sum. Same-date input order must not change acceptance or the complete model. The hand cases check exact Category distribution and known U. The random probes check raw Account sums, complete shuffled models and exact rollover conservation. The consecutive-month probe also checks L <= M in every month. The opening/legacy probe independently calculates current-month Ready to Assign from ordered raw Account legs, Assignments and positive Category carry. Private replay U is not independently exposed by random tests; an exact random current-month U oracle was not added. These checks cover excess allocations and losses that survive rollover, without pretending that every active-month L < M is a defect. B1 passes both same-date orders: Cash income 20,000, Food and Dining Assignments 10,000 each, purchases 10,000 each, then payment 10,000 and Food refund 10,000 on March 31. Correct Food 10,000, Dining 0, reserve 0, Ready to Assign 0, Cash 10,000 and Card 0. March and April each allocate 10,000. N2 passes all 24 orders. E = MAX_EXACT. Cash opening and Food Assignment E-1; same-date Cash Food -E, Cash split Food -1/Dining +2, Cash Food +E, Card Dining -1. Correct Cash E, Card -1, Food E-2, Dining 1, reserve 1 and Ready to Assign 0. The pre-pass accepts every permutation. ## Requested envelope cases Each case starts with Cash income 200. The following §48 values match the real replay. Other Category/Card values are zero unless stated. | Case | Correct §48 result | Comparison | | --- | --- | --- | | Underfunded Card purchase and partial refund | Food Assignment 50, buy 100, refund 50: Food 0, reserve 50, Ready to Assign 150, Cash 200, Card -50. Refund cancels U first. | Matches. | | Overspent Cash Category | Food Assignment 50, Cash spend 100: March Food -50 and Ready to Assign 150; April Food 0 and Ready to Assign 100; Cash 100. | Matches. | | Mixed Cash and Card deficit | Food Assignment 50, Cash spend 100, Card buy 100, Card refund 100: March Food -50, reserve 0, Ready to Assign 150, Cash 100, Card 0; April Ready to Assign 100. | Matches. | | Refund above debt | Food Assignment 100, Card buy 100, refund 150: Food 150, reserve 0, Ready to Assign 100, Cash 200, Card +50. L = M = 250. | Matches. | | Unfunded refund in later month | No Assignment, March Card buy 100, April refund 100: March Food -100, U 100; April Food 0, reserve 0, Ready to Assign 200, Card 0. | Matches. | | Partly funded refund in later month | Food Assignment 50, March buy 100, April refund 50: March Food -50, reserve 50; April Food 50, reserve 0, Ready to Assign 150, Card -50. | Matches. | | Funded refund in later month | Food Assignment 100, March buy 100, April refund 100: April Food 100, reserve 0, Ready to Assign 100, Cash 200, Card 0. | Matches. | | Refund after full payment | Food Assignment 100, buy 100, pay 100, refund 100: Food 100, reserve 0, Ready to Assign 100, Cash 100, Card +100. | Matches. | | Partial payment then refund | Food and Dining Assignments 100 each; buy 100 in each; pay 50; Food refund 100: Food 100, Dining 0, reserve 50, Ready to Assign 0, Cash 150, Card -50. | Matches. | | Split refunds | Same Assignments/purchases; pay 150; split refund Food 100 and Dining 100: Food 100, Dining 100, reserve 0, Ready to Assign 0, Cash 50, Card +150. Only the first 50 reduces debt. | Matches. | | Transfer debt between Cards | Food Assignment 100, Card buy 100, general transfer 100 from Other to Card: original reserve 100, Other reserve 0, Ready to Assign 100, Cash 200, Card 0, Other -100. Categories do not move. | Matches. | | Transfer into positive Card credit | General transfer 100 from zero Card to zero Other: Ready to Assign 300, Cash 200, Card -100, Other +100; Categories unchanged. | Matches. | | Spend positive Card credit | No Assignment; Card refund 50 then buy 50: Food 0, reserve 0, Ready to Assign 200, Card 0. | Matches. | | Return to hidden Category | Actual `visibility:: hidden` parses as hidden and retains the same totals as visible. | Matches. | | Return to deleted identity | Remove the linked Category identity; projection rejects the dangling reference. | Rejects; no accepted wrong totals. | ## Final-round openings and repair Positive Card openings enter Ready to Assign by the exact change in positive Card balance; debt openings add zero. One-cent and larger positive/negative fixtures pass. Repeated adjustments +n, -2n, +3n cross zero twice and give final Card credit and Ready to Assign 2n, with zero reserve. The fresh-seed generator includes signed openings on both Cards and omitted links on either Card. The public opening route also passes. Repair is deterministic and idempotent. Existing independent collision tests pass with two same-named Cards and a taken generated ID. Fully repaired metadata needs no further repair. Budget-only persistence reuses the `payment for` marker. Source order does not change allocated Category identities. The independent real-file probe uses two Homes with identical Budget and Account IDs. Sixteen reads preserve all source bytes and kernel fingerprints. Each funded one-cent purchase retains Cash 1, Card -1, Food 0, Ready to Assign 0 and reserve 1 before and after rollover. A deliberately wrong Accounts.md hash causes the real store to save the new Category and then fail its Account CAS. A fresh handle loads this partial save as a valid Budget and reuses the same payment Category. Retrying the Account edit leaves Budget.md bytes and fingerprint unchanged. The other User's source bytes and fingerprints remain unchanged. The durable save order is Categories first, links second. calternal-fs gives each replacement the normal atomic/fsync contract. The failed-CAS probe reaches the same source state as interruption between those saves. This round did not add a process-kill campaign. Existing route tests also pass for editable repair, Category-first persistence and refusal before exceeding the source-file cap. In-memory repair runs on reads, as §48 explicitly requires. **Reads never save the repaired files.** The brief's wording that repair never runs on read is interpreted as no durable repair on read, consistent with the stated design and requested file-change check. ## Reference numbers All eleven earlier vectors remain correct, including every stored field. With S assigned to both Food and Dining, Food purchase/full refund A, Dining purchase B and payment P: Food S, Dining S-B, Ready to Assign -2S, Cash -P, Card P-B and reserve max(B-P,0). The earlier revised burst pins and vector records also remain correct. Only `de7c249363a57c0c` changed since round 4. Its source FX total is -49.50 USD = -4,950 budget units, with no Assignment. Correct Visa debt -4,950, uncovered 4,950, reserve 0, Food Available -4,950 and U 4,950. The new `card-payment-visa` Category has Assignment, activity and Available 0, Funded state and no target fields. L+U=M=0. The number probe compares the entire record against the prior record with exactly these independently computed additions. Every other field and input is unchanged. The Rust vectors gate checks the production replay against the records. ## Generated histories Seed **139305**, distinct from earlier reviews: - **2,000 opening/legacy histories**: signed Card openings, omitted payment links, two Cards, both transfer directions, arbitrary refunds and payments, split purchases/refunds, Cash refunds, later Assignments and month rollovers. Checked 12,000 complete month models and 6,000 empty rollovers, plus independent Ready to Assign. - **2,000 consecutive-month histories**: four active months, 20 posting forms, mixed-sign Cash/Card splits, repeated children, hidden Categories, both Card transfer directions, overpayments and positive/negative expense/payment Assignments. Checked 10,000 models and 8,000 prefix rollovers. - Both old ignored R4 one-cent shrink properties were explicitly run and now pass. Total: **4,000 histories, 22,000 month models and 14,000 rollover checks**. All pass. The standalone source warning about proptest persistence does not affect the fixed seed or case count; there was no failed/shrunk generated input. ## Known gaps and decisions No product gap was found within this round. No product design decision was made. Review choices: reuse the existing independent generators with a fresh seed; simulate the Category/link interruption through a real failed Account CAS; interpret the read rule as no durable source mutation. These choices do not change product behavior. Random exact U, Tracking transfers, Card Income Categories, import reconciliation and exhaustive integer intermediates are outside the expanded generators. Existing crate gates cover their existing contracts. This review does not claim exhaustive coverage of them. No UI or feature was built, so no screenshots or performance profile was added. No benchmark was run. No secrets were displayed. ## For the merge round On the combined branch, run `cargo clippy --all-targets -- -D warnings` and `cargo test` for workspace integration; `cd apps/web && bun run check && bun run test` for web integration; and `tests/adversarial/run.sh` for the live-server robustness, authorization and User-isolation matrix. These are the merge round's standard checks, not unfinished focused review work. The focused arithmetic, shuffle, opening, repair, interruption and isolation checks requested here were completed in this job; none were deferred. No push, deployment or merge into dev was performed. ## Gate output (verbatim) `cargo fmt --check` exited 0 with no stdout or stderr. The standalone Rust probe also passed `rustfmt --edition 2024 --check tests/money/bulkrev5-store.rs`. ### `cargo test -p calternal-money -p calternal-plugin-money (CARGO_BUILD_JOBS=4)` ```text Compiling proc-macro2 v1.0.107 Compiling quote v1.0.47 Compiling unicode-ident v1.0.26 Compiling libc v0.2.189 Compiling cfg-if v1.0.5 Compiling memchr v2.8.3 Compiling itoa v1.0.18 Compiling serde_core v1.0.229 Compiling once_cell v1.21.4 Compiling serde v1.0.229 Compiling syn v3.0.6 Compiling futures-core v0.3.34 Compiling pin-project-lite v0.2.17 Compiling autocfg v1.5.1 Compiling jobserver v0.1.35 Compiling shlex v2.0.1 Compiling find-msvc-tools v0.1.13 Compiling bytes v1.12.1 Compiling cc v1.4.7 Compiling log v0.4.34 Compiling stable_deref_trait v1.2.1 Compiling zmij v1.0.23 Compiling serde_json v1.0.151 Compiling num-traits v0.2.19 Compiling pkg-config v0.3.34 Compiling version_check v0.9.5 Compiling syn v2.0.119 Compiling socket2 v0.6.5 Compiling equivalent v1.0.2 Compiling bitflags v2.13.2 Compiling getrandom v0.4.3 Compiling rand_core v0.10.1 Compiling litemap v0.8.3 Compiling hashbrown v0.17.1 Compiling writeable v0.6.4 Compiling serde_derive v1.0.229 Compiling synstructure v0.14.0 Compiling zerovec-derive v0.11.6 Compiling zerofrom-derive v0.1.8 Compiling yoke-derive v0.8.4 Compiling zerofrom v0.1.8 Compiling displaydoc v0.2.7 Compiling yoke v0.8.3 Compiling utf8_iter v1.0.4 Compiling icu_normalizer_data v2.3.0 Compiling tracing-attributes v0.1.31 Compiling zerovec v0.11.8 Compiling zerotrie v0.2.5 Compiling generic-array v0.14.9 Compiling tracing-core v0.1.36 Compiling icu_properties_data v2.3.0 Compiling tinystr v0.8.4 Compiling potential_utf v0.1.6 Compiling typenum v1.20.1 Compiling icu_locale_core v2.3.0 Compiling icu_collections v2.3.0 Compiling futures-io v0.3.34 Compiling futures-task v0.3.34 Compiling scopeguard v1.2.0 Compiling tracing v0.1.44 Compiling mio v1.2.3 Compiling errno v0.3.14 Compiling icu_provider v2.3.1 Compiling futures-sink v0.3.34 Compiling percent-encoding v2.3.2 Compiling signal-hook-registry v1.4.8 Compiling lock_api v0.4.14 Compiling tokio-macros v2.7.2 Compiling fnv v1.0.7 Compiling smallvec v1.16.1 Compiling icu_properties v2.3.0 Compiling iana-time-zone v0.1.65 Compiling indexmap v2.14.2 Compiling chrono v0.4.45 Compiling tokio v1.53.1 Compiling parking_lot_core v0.9.12 Compiling rustix v1.1.5 Compiling slab v0.4.12 Compiling form_urlencoded v1.2.2 Compiling linux-raw-sys v0.12.1 Compiling getrandom v0.3.4 Compiling futures-macro v0.3.34 Compiling tinyvec v1.13.3 Compiling unicode-normalization v0.1.25 Compiling futures-util v0.3.34 Compiling cmake v0.1.58 Compiling zerocopy v0.8.58 Compiling fs_extra v1.3.0 Compiling vcpkg v0.2.15 Compiling dunce v1.0.5 Compiling regex-syntax v0.8.11 Compiling aws-lc-sys v0.45.0 Compiling rand_core v0.9.5 Compiling thiserror-impl v2.0.21 Compiling http v1.5.0 Compiling aho-corasick v1.1.5 Compiling siphasher v1.0.3 Compiling crossbeam-utils v0.8.23 Compiling regex-automata v0.4.18 Compiling spin v0.9.9 Compiling hybrid-array v0.4.15 Compiling base64 v0.22.1 Compiling fastrand v2.5.0 Compiling cpufeatures v0.2.17 Compiling foldhash v0.2.0 Compiling allocator-api2 v0.2.21 Compiling regex v1.13.1 Compiling hashbrown v0.16.1 Compiling tempfile v3.27.0 Compiling ppv-lite86 v0.2.21 Compiling icu_normalizer v2.3.0 Compiling wait-timeout v0.2.1 Compiling quick-error v1.2.3 Compiling zeroize v1.9.0 Compiling parking v2.2.1 Compiling bit-vec v0.8.0 Compiling crc-catalog v2.5.0 Compiling aws-lc-rs v1.18.1 Compiling rustversion v1.0.23 Compiling bit-set v0.8.0 Compiling crc v3.4.0 Compiling event-listener v5.4.2 Compiling rusty-fork v0.3.1 Compiling idna_adapter v1.2.2 Compiling crossbeam-queue v0.3.14 Compiling rand_chacha v0.9.0 Compiling hashlink v0.11.1 Compiling block-buffer v0.10.4 Compiling crypto-common v0.1.6 Compiling http-body v1.1.0 Compiling rand v0.9.5 Compiling rand_xorshift v0.4.0 Compiling futures-channel v0.3.34 Compiling simd-adler32 v0.3.10 Compiling httparse v1.10.1 Compiling thiserror v2.0.21 Compiling unarray v0.1.4 Compiling proptest v1.11.0 Compiling parking_lot v0.12.5 Compiling digest v0.10.7 Compiling idna v1.1.0 Compiling rustls-pki-types v1.15.1 Compiling calternal-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-money) Compiling crypto-common v0.2.2 Compiling libsqlite3-sys v0.37.0 Compiling tower-service v0.3.3 Compiling cpufeatures v0.3.1 Compiling crc32fast v1.5.2 Compiling tokio-stream v0.1.19 Compiling either v1.18.0 Compiling url v2.5.8 Compiling sha2 v0.10.9 Compiling futures-intrusive v0.5.0 Compiling tokio-util v0.7.19 Compiling rustls v0.23.45 Compiling rand_core v0.6.4 Compiling atomic-waker v1.1.2 Compiling try-lock v0.2.5 Compiling untrusted v0.9.0 Compiling adler2 v2.0.1 Compiling want v0.3.1 Compiling rand v0.8.8 Compiling h2 v0.4.19 Compiling sqlx-core v0.9.0 Compiling atoi v2.0.0 Compiling futures-executor v0.3.34 Compiling flume v0.12.0 Compiling inout v0.2.2 Compiling phf_shared v0.11.3 Compiling blake3 v1.8.7 Compiling sync_wrapper v1.0.2 Compiling cmov v0.5.4 Compiling httpdate v1.0.3 Compiling ipnet v2.12.2 Compiling subtle v2.6.1 Compiling ryu v1.0.23 Compiling tower-layer v0.3.3 Compiling hyper v1.11.1 Compiling ctutils v0.4.2 Compiling phf_generator v0.11.3 Compiling sqlx-sqlite v0.9.0 Compiling miniz_oxide v0.9.1 Compiling encoding_rs v0.8.41 Compiling multiversion-macros v0.9.0 Compiling block-buffer v0.12.1 Compiling phf_shared v0.12.1 Compiling heck v0.5.0 Compiling constant_time_eq v0.4.2 Compiling arrayvec v0.7.8 Compiling chrono-tz v0.10.4 Compiling inotify-sys v0.1.8 Compiling dotenvy v0.15.7 Compiling hex v0.4.3 Compiling zlib-rs v0.6.8 Compiling sqlx-macros-core v0.9.0 Compiling phf v0.12.1 Compiling cipher v0.5.2 Compiling multiversion v0.9.0 Compiling hyper-util v0.1.20 Compiling flate2 v1.1.10 Compiling phf_macros v0.11.3 Compiling universal-hash v0.6.1 Compiling tower v0.5.3 Compiling http-body-util v0.1.5 Compiling multer v3.1.0 Compiling linkme-impl v0.3.37 Compiling unicode-joining-type v1.0.0 Compiling simdutf8 v0.1.5 Compiling core_detect v1.0.0 Compiling openssl-probe v0.2.1 Compiling multiversion_no_op v1.0.0 Compiling mime v0.3.17 Compiling rustls-native-certs v0.8.4 Compiling phf v0.11.3 Compiling poly1305 v0.9.1 Compiling chacha20 v0.10.2 Compiling sqlx-macros v0.9.0 Compiling aead v0.6.1 Compiling miniz_oxide v0.8.9 Compiling fdeflate v0.3.7 Compiling utoipa-gen v6.0.1 Compiling pulldown-cmark v0.13.4 Compiling same-file v1.0.6 Compiling color_quant v1.1.0 Compiling pxfm v0.1.30 Compiling rustls-webpki v0.103.15 Compiling linkme v0.3.37 Compiling calternal-path v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-path) Compiling winnow v0.7.15 Compiling byteorder-lite v0.1.0 Compiling quick-error v2.0.1 Compiling weezl v0.1.12 Compiling zune-core v0.5.3 Compiling zune-jpeg v0.5.15 Compiling gif v0.14.2 Compiling cron v0.17.0 Compiling image-webp v0.2.4 Compiling utoipa v6.0.0 Compiling moxcms v0.8.1 Compiling walkdir v2.5.0 Compiling png v0.18.1 Compiling tokio-rustls v0.26.6 Compiling rustls-platform-verifier v0.7.0 Compiling hyper-rustls v0.27.10 Compiling sqlx v0.9.0 Compiling chacha20poly1305 v0.11.0 Compiling inotify v0.11.5 Compiling axum-core v0.5.6 Compiling tower-http v0.6.11 Compiling serde_urlencoded v0.7.1 Compiling uuid v1.26.1 Compiling notify-types v2.1.0 Compiling serde_path_to_error v0.1.20 Compiling unsafe-libyaml v0.2.11 Compiling unicode-properties v0.1.4 Compiling unicode-casefold v0.2.0 Compiling base64 v0.23.1 Compiling bytemuck v1.25.2 Compiling unicase v2.9.0 Compiling bumpalo v3.20.3 Compiling matchit v0.8.4 Compiling serde_yaml v0.9.34+deprecated Compiling zopfli v0.8.3 Compiling axum v0.8.9 Compiling reqwest v0.13.5 Compiling image v0.25.10 Compiling calternal-fs v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-fs) Compiling calternal-db v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-db) Compiling notify v8.2.0 Compiling calternal-api v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-api) Compiling quick-xml v0.42.0 Compiling csv-core v0.1.13 Compiling csv v1.4.0 Compiling zip v5.1.1 Compiling calternal-notes-core v0.1.0 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-notes-core) Compiling calternal-plugin v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/calternal-plugin) Compiling calternal-plugin-money v0.0.1 (/home/kayg/Developer/calternal-wt/bulkwrite-1393/crates/plugins/money) Finished `test` profile [unoptimized + debuginfo] target(s) in 2m 02s Running unittests src/lib.rs (/home/kayg/build/targets/bulkrev5/debug/deps/calternal_money-5ad27f9b5c008064) running 16 tests test codec::tests::empty_payee_is_refused_by_the_writer ... ok test edit::tests::cleared_tag_toggles_without_touching_other_tags ... ok test units::tests::exact_range_is_enforced_on_parse_and_arithmetic ... ok test codec::tests::malformed_dated_rows_fail_instead_of_vanishing ... ok test units::tests::format_uses_explicit_sign_and_exact_scale ... ok test edit::tests::unicode_payee_tag_boundaries_match_shared_vectors ... ok test codec::tests::transaction_round_trip_with_punctuation_in_labels_and_payee ... ok test units::tests::scale_table_has_all_165_codes_with_unique_entries ... ok test units::tests::parse_matches_the_oracle_examples ... ok test codec::tests::property_edit_changes_one_value ... ok test codec::tests::round_trip_keeps_bom_crlf_and_unknown_bytes ... ok test edit::tests::crlf_file_keeps_crlf_on_insert ... ok test units::independent_number_review::signed_edges_and_long_zero_padding_keep_exact_minor_units ... ok test codec::tests::checked_parse_stops_after_a_bounded_line_batch ... ok test edit::tests::new_budget_projects_with_no_accounts ... ok test edit::tests::assign_inserts_updates_and_removes_rows ... ok test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s Running tests/account_kinds.rs (/home/kayg/build/targets/bulkrev5/debug/deps/account_kinds-40f136ace82559dd) running 5 tests test account_projection_rejects_legacy_and_unknown_kinds ... ok test tracking_deficit_rollover_does_not_reduce_ready_to_assign ... ok test categorized_debit_loan_transfers_post_one_budget_leg ... ok test off_budget_balance_marker_does_not_change_budget_money ... ok test imported_account_kinds_project_without_losing_identity ... ok test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s Running tests/import.rs (/home/kayg/build/targets/bulkrev5/debug/deps/import-32258f8fda96f336) running 13 tests test recheck_half_minor_units_negative_zero_and_nineteen_digits ... ok test import_stream_renderer_matches_full_rendered_files ... ok test duplicate_source_ids_are_rejected_and_duplicate_names_are_kept ... ok test production_v1_metadata_upgrade_keeps_balances ... ok test import_render_is_exact_and_byte_stable ... ok test import_keeps_same_day_source_order_for_credit_payments_and_refunds ... ok test import_render_reports_progress_and_propagates_cancel ... ok test import_replay_matches_full_ledger_month_by_month ... ok test recheck_same_day_payment_and_refund_keep_source_fifo ... ok test budget_replay_stops_at_a_bounded_transaction_checkpoint ... ok test imported_ready_to_assign_matches_independent_month_oracle ... ok test random_imports_conserve_source_balances_and_markdown ... ok test recheck_random_multicurrency_ledgers_match_all_monthly_totals ... ok test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 11.16s Running tests/properties.rs (/home/kayg/build/targets/bulkrev5/debug/deps/properties-9ff9e71a800dacb8) running 21 tests test bill_coverage_never_clamps_the_bill ... ok test decimal_text_round_trips_for_every_scale ... ok test bulkrev2::literal_account_sum_and_funded_card_conservation ... ok test money_code_never_uses_floating_point ... ok test bulkrev2::split_refund_keeps_payment_overfunding_when_card_becomes_positive ... ok test bulkrev2::i64_extremes_are_rejected_and_safe_bound_is_exact ... ok test bulkrev2::boundary_shuffle_reports_acceptance_difference ... ok test bulkrev2::refund_payment_calendar_choice_is_visible_next_month ... ok test reviewed_burst_order_matches_input_order ... ok test any_text_that_parses_serializes_to_the_same_bytes ... ok test transaction_rows_round_trip_byte_for_byte ... ok test paired_write_replay_matches_independent_calculations ... ok test mixed_cash_credit_deficit_rolls_only_its_cash_part ... ok test split_legs_post_exactly_the_parent ... ok test assign_then_unassign_is_the_identity ... ok test partial_payment_then_category_refunds_conserve_cash_across_months ... ok test fully_funded_card_spending_conserves_cash ... ok test cash_ledgers_conserve_money_every_month ... ok test same_date_card_postings_are_a_function_of_the_set ... ok test bulkrev2::funded_shuffles_conserve_real_money_every_month ... ok test bulkrev2::same_day_shuffles_cover_splits_transfers_and_month_edges ... ok test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.33s Running tests/ready_to_assign_adjustment.rs (/home/kayg/build/targets/bulkrev5/debug/deps/ready_to_assign_adjustment-0e1c5c7276d14077) running 1 test test ready_to_assign_adjustment_changes_only_the_budget_pool ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s Running tests/review_984.rs (/home/kayg/build/targets/bulkrev5/debug/deps/review_984-dc85183370c2f07a) running 5 tests test review_pair_performance_profile ... ignored, performance measurements belong to the merge round on the perf VM test review_pair_rejects_bad_months_and_amounts_without_rounding ... ok test review_split_remainders_and_tracking_transfers_are_exact ... ok test review_mixed_pair_matches_independent_replays ... ok test review_large_ledger_pair_keeps_exact_totals ... ok test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 3.69s Running tests/review_bulkrev3.rs (/home/kayg/build/targets/bulkrev5/debug/deps/review_bulkrev3-cbfa6724c48c7f18) running 7 tests test card_opening_credit_enters_ready_to_assign_once ... ok test legacy_payment_repair_is_idempotent_and_collision_safe ... ok test unlinked_card_funded_purchase_keeps_its_payment_money ... ok test hidden_and_missing_categories ... ok test envelope_edge_cases ... ok test previous_witnesses_all_orders ... ok test random_histories_conserve_money_after_every_rollover ... ok test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.72s Running tests/vectors.rs (/home/kayg/build/targets/bulkrev5/debug/deps/vectors-b0e2a54af0711cc9) running 5 tests test rust_matches_random_oracle_ledgers_without_divergences ... ok test reviewed_r4_unlinked_card_vector_keeps_its_unfunded_amount ... ok test reviewed_r3_vectors_assert_retired_debt_and_positive_credit ... ok test reviewed_eleven_refund_vectors_keep_their_exact_numbers ... ok test rust_port_matches_every_recorded_oracle_vector ... ok test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.49s Running unittests src/lib.rs (/home/kayg/build/targets/bulkrev5/debug/deps/calternal_plugin_money-3d165b6d3890a332) running 138 tests test import::import_review_tests::actual_stream_memory_guard_child ... ignored, invoked as an isolated child by actual_stream_keeps_a_large_history_bounded test import::import_review_tests::actual_cc_label_requires_missing_type_confirmation ... ok test import::import_review_tests::actual_cents_conversion_never_rounds ... ok test import::import_review_tests::actual_transfer_legs_cannot_cross_months ... ok test import::import_review_tests::actual_orphan_split_children_are_rejected ... ok test import::import_review_tests::import_control_reports_progress_and_stops_cancelled_work ... ok test import::import_review_tests::actual_account_checks_use_raw_monthly_source_rows ... ok test routes::import_staged_path_tests::staged_import_name_cannot_select_another_path_or_slot ... ok running 1 test test routes::import_cleanup_tests::dropped_preview_worker_retains_admission_until_exit ... ok test import::import_review_tests::ynab_transfer_pairing_handles_many_duplicate_legs ... ok test routes::replay_reuse_tests::crossings_reuse_checked_current_totals_even_with_future_months ... ok test routes::import_cleanup_tests::staged_import_files_keep_ranges_and_release_private_storage ... ok test import_fidelity_1130::independent_split_and_transfer_numbers_check ... ok test routes::import_cleanup_tests::idle_imports_are_reclaimed_by_expiry_cleanup ... ok test routes::durable::checkpoint_tests::progress_wait_keeps_parser_writer_release_polled ... ok test routes::durable::admission_tests::cancelled_receiver_cannot_acknowledge_a_durable_job ... ok test routes::replay_reuse_tests::crossings_cover_source_ranges_relative_to_today ... ok test routes::review_1140::cancel_wins_before_publication_lock ... ok test routes::replay_reuse_tests::assignment_retry_rebuilds_from_latest_source_bytes ... ok test routes::review_1140::review1140_staged_size_limits_fail_without_publishing ... ok test routes::review_1140::cancel_does_not_rewrite_published_result ... ok test store::parsed_cache_tests::global_budget_and_folder_pruning_release_stale_entries ... ok test store::parsed_cache_tests::parse_charge_accounts_for_line_structures ... ok test store::parsed_cache_tests::user_cache_evicts_old_parse_entries_and_shares_hot_documents ... ok test import_fidelity_1130::actual_rows_round_trip ... ok test routes::review_1140::review1140_tcp_malformed_inputs_leave_worker_usable ... ok test routes::review_1140::review1140_operational_cancel_before_replacement_returns_no_receipt ... ok test tests::a_new_user_sees_the_real_empty_state ... ok test routes::review_1140::review1140_terminal_receipts_do_not_block_new_imports ... ok test tests::active_money_handle_survives_other_users_cache_pressure ... ok test tests::actual_duplicate_names_import_by_id_without_sharing_a_payment_category ... ok test routes::review_1140::review1140_cancel_after_rename_before_receipt_keeps_publication ... ok test tests::actual_export_archive_imports_exact_rows_from_private_scratch ... ok test routes::review_1140::review1140_discard_after_confirmation_failure_releases_admission ... ok test tests::api_account_numbers_equal_core_replay ... ok test tests::a_broken_file_is_reported_not_hidden ... ok test tests::a_read_waits_for_a_write_in_progress ... ok test routes::durable::admission_tests::live_publication_honors_operational_queue_cancellation ... ok test tests::a_split_row_written_by_hand_is_read_but_not_edited ... ok test tests::a_journal_for_a_completed_move_changes_nothing ... ok test tests::cancel_racing_confirm_has_one_consistent_outcome ... ok test tests::assignments_retry_source_conflicts_without_losing_neighbours ... ok test tests::cancelling_imports_leaves_no_budget_and_releases_slots ... ok test routes::review_1140::review1140_all_formats_replay_exact_balances ... ok test tests::backdated_create_emits_current_month_overspend_crossing ... ok test tests::csv_import_keeps_progress_and_cancel_responsive ... ok test tests::bulk_write_invalid_neighbours_do_not_change_valid_rows ... ok test tests::budget_flow_writes_exact_markdown_and_derives_available ... ok test tests::bulk_write_month_does_not_need_note_date_backfill ... ok test tests::durable_import_tests::operation_exit_child ... ignored, child of operation_recovery_survives_process_exit_at_every_phase test tests::bulk_write_rejects_intermediate_overflow ... ok test tests::concurrent_store_edits_keep_exactly_one_winner ... ok test routes::review_1140::review1140_replacement_receipt_recovery_does_not_adopt_later_edits ... ok test tests::denied_preview_access_keeps_the_owners_pending_import ... ok test tests::durable_import_tests::receipt_reads_are_bounded_and_old_receipts_are_addressable ... ok test tests::durable_import_tests::replay_preserves_a_live_ready_preview ... ok test tests::durable_import_tests::running_jobs_do_not_expire_and_cancelled_jobs_do_not_restart ... ok test tests::durable_import_tests::queued_import_and_undo_survive_restarts ... ok test tests::delete_transaction_emits_current_month_overspend_crossing ... ok test tests::durable_import_tests::publication_and_inverse_authority_use_full_commits ... ok test tests::card_opening_credit_route_conserves_real_budget_money ... ok test routes::durable::money_import_undo_mutation ... ok test tests::durable_import_tests::undo_receipt_replay_never_removes_a_restored_import ... ok test tests::durable_import_tests::undo_refuses_a_predecessor_restored_before_the_inverse ... ok test tests::far_month_assignment_cannot_make_the_budget_unreadable ... ok test tests::durable_import_tests::undo_restarts_before_and_after_the_filesystem_inverse ... ok test tests::gap_month_assignments_and_opening_card_debt_do_not_create_cash ... ok test tests::failed_cross_month_move_never_counts_the_row_twice ... ok test tests::import_file_limits_match_the_money_reader ... ok test tests::hostile_inputs_are_rejected_without_writing ... ok test tests::historical_overspend_does_not_emit_current_month_event ... ok test tests::import_preview_reads_only_generated_staged_upload_names ... ok test tests::import_preview_is_owner_bound_and_confirmation_publishes_once ... ok test tests::inferred_opening_balance_needs_explicit_confirmation ... ok test tests::memo_and_tags_split_the_payee_without_losing_text ... ok test tests::money_is_on_for_the_instance_and_off_for_a_new_user ... ok test tests::import_fidelity_review_requires_account_kind_and_keeps_notes ... ok test tests::month_revision_increases_after_each_assignment ... ok test tests::legacy_card_payment_repair_is_editable_and_saved_category_first ... ok test tests::move_money_keeps_ready_to_assign_and_card_gets_payment_category ... ok test tests::legacy_card_payment_repair_cannot_make_its_budget_unreadable ... ok test tests::multiple_assignment_rows_set_one_exact_total ... ok test tests::other_users_and_sessions_without_data_scope_see_nothing ... ok test tests::durable_import_tests::undo_refuses_every_later_budget_edit_after_restart ... ok test import::import_review_tests::actual_stream_keeps_a_large_history_bounded has been running for over 60 seconds test import::import_review_tests::actual_stream_memory_guard_child has been running for over 60 seconds test tests::overflowing_category_sum_is_rejected_before_assignment_write ... ok test tests::plugin_code_never_uses_floating_point ... ok test tests::parsed_money_cache_shares_documents_and_prunes_removed_months ... ok test tests::recheck_metadata_files_use_the_reader_size_cap ... ok test import::import_review_tests::actual_stream_memory_guard_child ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 137 filtered out; finished in 61.89s test import::import_review_tests::actual_stream_keeps_a_large_history_bounded ... ok test tests::overflowing_derived_balance_is_rejected_before_the_write ... ok test tests::overflowing_cleared_subset_is_rejected_before_transaction_write ... ok test tests::review_1130::review1130_cancel_after_partial_preparation ... ok test tests::overspending_reports_ynab_states ... ok test tests::review_1130::review1130_notes_are_inert ... ok test tests::recheck_local_server_number_and_lifecycle_contract ... ok test tests::idle_import_receive_releases_admission_and_cancel_stops_read ... ok test tests::recheck_source_checks_owner_and_opening_balance_confirmation ... ok test tests::review_1130::review1130_legacy_home_needs_no_metadata_rewrite ... ok test tests::review_984::review3_first_future_transaction_keeps_current_event_month ... ok test tests::recheck_random_preview_cancellation_leaves_no_files ... ok test tests::review_1130::review1130_long_imported_note_allows_amount_edit_without_loss ... ok test tests::review_984::review3_future_only_edit_and_delete_keep_current_event_month ... ok test tests::review_1130::review1130_tcp_locks_reimport_and_cancel ... ok test tests::review_1130::review1130_split_and_closed_transfer_have_one_posting ... ok test tests::review_984::review_concurrent_assign_revisions_match_final_report ... ok test tests::review_984::review_category_edit_emits_for_old_category_only ... ok test tests::review_1130::review1130_reconciled_closed_balances ... ok test tests::review_984::review_user_zone_month_and_year_edges ... ok test tests::review_984::review_file_replacement_advances_month_revision ... ok test tests::review_984::review3_outside_current_range_writes_emit_no_overspend ... ok test tests::review_984::review_cross_month_refund_move_emits_current_crossing ... ok test tests::review_984::review_exact_zero_healing_recrossing_and_delete ... ok test tests::simultaneous_import_confirmations_have_one_winner ... ok test tests::source_total_mismatch_cannot_be_confirmed ... ok test tests::review_bulkrev2::four_conflicts_return_409_without_writing ... ok test tests::review_984::review_split_and_tracking_transfer_writes_are_rejected_without_events ... ok test tests::review_984::review_source_generation_tracks_all_files_and_restoration ... ok test tests::transfer_register_view_exposes_linked_category ... ok test tests::same_handle_settles_a_failed_move_before_the_next_request ... ok test tests::transaction_identity_preview_is_atomic_and_reimport_changes_nothing ... ok test tests::wizard_background_job_retains_safe_failure ... ok test tests::wizard_background_job_recovers_preview_after_response_is_dropped ... ok test tests::ynab_conflicting_accounts_and_payees_are_not_silently_discarded ... ok test tests::ynab_csv_import_keeps_exact_month_and_register_amounts ... ok test tests::ynab_duplicate_category_ids_are_merged_only_when_identical ... ok test tests::ynab_plan_json_import_keeps_exact_milliunits ... ok test tests::ynab_public_demo_imports_duplicate_category_names_by_id ... ok test tests::wizard_starter_categories_validate_before_create_and_do_not_change_totals ... ok test tests::transaction_logged_event_has_the_documented_create_payload ... ok test tests::bulk_write_balances_equal_one_by_one has been running for over 60 seconds test tests::transfer_cleared_edits_are_per_account ... ok test tests::update_transaction_emits_current_month_overspend_crossing ... ok test tests::card_models_ignore_arrival_batch_and_timezone has been running for over 60 seconds test tests::durable_import_tests::operation_recovery_survives_process_exit_at_every_phase ... ok test tests::review_bulkrev2::two_and_five_assignment_races_match_serial_targets ... ok test tests::durable_import_tests::generated_import_confirm_replay_and_undo_preserve_minor_units has been running for over 60 seconds test tests::slow_15mb_import_receive_completes_with_progress ... ok test tests::durable_import_tests::replacement_restarts_at_every_durable_phase has been running for over 60 seconds test tests::durable_import_tests::generated_import_confirm_replay_and_undo_preserve_minor_units ... ok test tests::durable_import_tests::replacement_restarts_at_every_durable_phase ... ok test tests::bulk_write_balances_equal_one_by_one ... ok test tests::card_models_ignore_arrival_batch_and_timezone ... ok test result: ok. 136 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 786.32s Running tests/import_review.rs (/home/kayg/build/targets/bulkrev5/debug/deps/import_review-6a0b9e5006b57cbf) running 32 tests test identity_csv_transfer_growth_curve ... ignored, run with MONEY_IDENT_CSV_ROWS for 10k/100k/1M transfer profiling test recheck_actual_stream_growth_curve ... ignored, run with MONEY_RECHECK_ARCHIVE and MONEY_RECHECK_ROWS for profiling test recheck_csv_transfer_growth_curve ... ignored, run with MONEY_RECHECK_TRANSFERS for the bounded CSV growth probe test split_identity_cannot_reuse_a_top_level_id ... ok test csv_transaction_ids_merge_or_reject_before_totals ... ok test recheck_conflicting_transaction_ids_are_rejected ... ok test split_identity_includes_parent_deleted_and_transfer_fields ... ok test split_identity_rejects_an_inconsistent_embedded_parent ... ok test split_identity_review_cases_reject ... ok test transaction_identity_checks_fields_and_keeps_distinct_ids ... ok test recheck_identical_transaction_ids_do_not_double_money ... ok test csv_bom_mixed_endings_and_decimal_comma_are_exact ... ok test csv_amount_edges_never_round_group_or_overflow ... ok test recheck_e2e_csv_has_four_checks_and_keeps_every_minor_unit ... ok test recheck_reconciled_negative_zero_and_exact_source_scales ... ok test transfer_month_review_cases_reject ... ok test transfer_legs_prefer_a_same_month_mate ... ok test split_identity_concrete_valid_totals ... ok test ynab_account_check_rejects_a_wrong_normalization ... ok test corrupt_actual_database_is_a_private_error ... ok test ynab_unrepresentable_milliunits_are_rejected ... ok test ynab_negative_zero_amount_is_zero ... ok test unmatched_transfer_legs_keep_the_source_register ... ok test csv_pairing_accepts_cancellation_during_its_loop ... ok test transfer_month_identity_rejects_in_both_adapters ... ok test ynab_csv_preserves_exact_minor_units ... ok test transaction_identity_preserves_exact_units ... ok test ynab_json_keeps_exact_split_and_transfer_postings ... ok test split_identity_merges_before_totals ... ok test transfer_month_pairing_keeps_dates_and_exact_pair_priority ... ok test csv_pairing_keeps_exact_account_legs ... ok test raw_ynab_registers_match_a_raw_row_oracle ... ok test result: ok. 29 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 6.42s Doc-tests calternal_money running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests calternal_plugin_money running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` ### `python3 tests/money/bulkrev5-numbers.py` ```text 07b33aa56ff97a67: A=13222722 B=108 P=13222755 reserve=0; every stored field correct 08d823459b4f7555: A=1 B=1 P=1 reserve=0; every stored field correct 10dad10f207e3966: A=13222722 B=1 P=13222722 reserve=0; every stored field correct 217b597cc7b1b339: A=109170509 B=1000000000 P=110838733 reserve=889161267; every stored field correct 3c10364db1d4cd46: A=109170509 B=1 P=109170509 reserve=0; every stored field correct 405bf72849418ee7: A=28500 B=1 P=28500 reserve=0; every stored field correct 5cd63c6abac2f757: A=103816 B=1 P=103816 reserve=0; every stored field correct 70887b8579a61566: A=5789 B=1035233 P=55551 reserve=979682; every stored field correct aa06a27413c2238d: A=103816 B=454 P=103879 reserve=0; every stored field correct de05e2804212ba0e: A=5789 B=1 P=5789 reserve=0; every stored field correct f161754b530689ba: A=28500 B=8319 P=31192 reserve=0; every stored field correct Burst pins: reserve=6474+4103=10577; uncovered=51911-10577=41334 901a5dc38f13b647: February Available fees=-15151 tax=-3309 interest=-3232 retail=payment=0; reserve=0; raw/uncovered debt=366524 e6d77a36b9ded73d: RTA=1150500-560500+(20000-9853)=600147 PASS: 11 complete vectors, both changed burst pins and both changed vector records PASS: only de7c249363a57c0c changed this round; all added fields correct: Visa reserve 0, uncovered 4950, repaired payment Category all zero/Funded; Food -4950 and U 4950 give L+U=M=0. Every other field unchanged. ``` ### `python3 tests/money/bulkrev5-probe.py` ```text RUN bulkrev5-opening: seed 139305, 2000 histories running 7 tests test card_opening_credit_enters_ready_to_assign_once ... ok test envelope_edge_cases ... CASE underfunded_partial_refund month=2026-03 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=0 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=0 CASE underfunded_partial_refund month=2026-04 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=0 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=0 CASE underfunded_partial_refund month=2026-05 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=0 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=0 CASE underfunded_full_refund_later month=2026-03 allocation=100 real=200 delta=-100 cash=200 card=-100 other=0 food=-100 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=100 CASE underfunded_full_refund_later month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0 CASE underfunded_full_refund_later month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0 CASE underfunded_partial_refund_later month=2026-03 allocation=150 real=200 delta=-50 cash=200 card=-100 other=0 food=-50 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=50 CASE underfunded_partial_refund_later month=2026-04 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=50 CASE underfunded_partial_refund_later month=2026-05 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=50 CASE overspent_cash month=2026-03 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=-50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=0 CASE overspent_cash month=2026-04 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE overspent_cash month=2026-05 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE mixed_cash_credit_refund month=2026-03 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=-50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=0 CASE mixed_cash_credit_refund month=2026-04 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE mixed_cash_credit_refund month=2026-05 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE refund_larger_than_debt month=2026-03 allocation=250 real=250 delta=0 cash=200 card=50 other=0 food=150 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE refund_larger_than_debt month=2026-04 allocation=250 real=250 delta=0 cash=200 card=50 other=0 food=150 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE refund_larger_than_debt month=2026-05 allocation=250 real=250 delta=0 cash=200 card=50 other=0 food=150 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE funded_refund_later month=2026-03 allocation=200 real=200 delta=0 cash=200 card=-100 other=0 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0 CASE funded_refund_later month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE funded_refund_later month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE refund_after_full_payment month=2026-03 allocation=200 real=200 delta=0 cash=100 card=100 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE refund_after_full_payment month=2026-04 allocation=200 real=200 delta=0 cash=100 card=100 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE refund_after_full_payment month=2026-05 allocation=200 real=200 delta=0 cash=100 card=100 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE partial_payment_refund month=2026-03 allocation=150 real=150 delta=0 cash=150 card=-50 other=0 food=100 dining=0 reserve=50 other_reserve=0 rta=0 uncovered=0 CASE partial_payment_refund month=2026-04 allocation=150 real=150 delta=0 cash=150 card=-50 other=0 food=100 dining=0 reserve=50 other_reserve=0 rta=0 uncovered=0 CASE partial_payment_refund month=2026-05 allocation=150 real=150 delta=0 cash=150 card=-50 other=0 food=100 dining=0 reserve=50 other_reserve=0 rta=0 uncovered=0 CASE split_refund month=2026-03 allocation=200 real=200 delta=0 cash=50 card=150 other=0 food=100 dining=100 reserve=0 other_reserve=0 rta=0 uncovered=0 CASE split_refund month=2026-04 allocation=200 real=200 delta=0 cash=50 card=150 other=0 food=100 dining=100 reserve=0 other_reserve=0 rta=0 uncovered=0 CASE split_refund month=2026-05 allocation=200 real=200 delta=0 cash=50 card=150 other=0 food=100 dining=100 reserve=0 other_reserve=0 rta=0 uncovered=0 CASE two_cards_debt_transfer month=2026-03 allocation=200 real=200 delta=0 cash=200 card=0 other=-100 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0 CASE two_cards_debt_transfer month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=-100 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0 CASE two_cards_debt_transfer month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=-100 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0 CASE spending_positive_card_credit month=2026-03 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0 CASE spending_positive_card_credit month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0 CASE spending_positive_card_credit month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0 CASE two_cards_credit_transfer month=2026-03 allocation=300 real=300 delta=0 cash=200 card=-100 other=100 food=0 dining=0 reserve=0 other_reserve=0 rta=300 uncovered=100 CASE two_cards_credit_transfer month=2026-04 allocation=300 real=300 delta=0 cash=200 card=-100 other=100 food=0 dining=0 reserve=0 other_reserve=0 rta=300 uncovered=100 CASE two_cards_credit_transfer month=2026-05 allocation=300 real=300 delta=0 cash=200 card=-100 other=100 food=0 dining=0 reserve=0 other_reserve=0 rta=300 uncovered=100 ok test hidden_and_missing_categories ... HIDDEN retains totals; MISSING rejected: unknown category block id: food ok test legacy_payment_repair_is_idempotent_and_collision_safe ... ok test previous_witnesses_all_orders ... CASE B1 month=2026-03 allocation=10000 real=10000 delta=0 cash=10000 card=0 other=0 food=10000 dining=0 reserve=0 other_reserve=0 rta=0 uncovered=0 CASE B1 month=2026-04 allocation=10000 real=10000 delta=0 cash=10000 card=0 other=0 food=10000 dining=0 reserve=0 other_reserve=0 rta=0 uncovered=0 CASE B1 month=2026-03 allocation=10000 real=10000 delta=0 cash=10000 card=0 other=0 food=10000 dining=0 reserve=0 other_reserve=0 rta=0 uncovered=0 CASE B1 month=2026-04 allocation=10000 real=10000 delta=0 cash=10000 card=0 other=0 food=10000 dining=0 reserve=0 other_reserve=0 rta=0 uncovered=0 B1 2/2 permutations, N2 24/24 permutations correct ok test random_histories_conserve_money_after_every_rollover ... proptest: FileFailurePersistence::SourceParallel set, but failed to find lib.rs or main.rs ok test unlinked_card_funded_purchase_keeps_its_payment_money ... ok test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 82.75s RUN bulkrev5-consecutive: seed 139305, 2000 histories running 6 tests test exact_bounds_and_hidden_categories ... Real visibility:: hidden preserves totals; deleted Category reference rejects; exact bounds pass ok test generated_opening_credit_conserves ... ignored, known BLOCK R4-1; run explicitly to shrink the accepted input test generated_unlinked_card_conserves ... ignored, known BLOCK R4-2; run explicitly to shrink the accepted input test hand_checked_envelope_edges ... CASE underfunded month=2026-03 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=0 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=0 CASE underfunded month=2026-04 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=0 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=0 CASE underfunded month=2026-05 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=0 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=0 CASE unfunded_later month=2026-03 allocation=100 real=200 delta=-100 cash=200 card=-100 other=0 food=-100 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=100 CASE unfunded_later month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0 CASE unfunded_later month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0 CASE part_funded_later month=2026-03 allocation=150 real=200 delta=-50 cash=200 card=-100 other=0 food=-50 dining=0 reserve=50 other_reserve=0 rta=150 uncovered=50 CASE part_funded_later month=2026-04 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=50 CASE part_funded_later month=2026-05 allocation=200 real=200 delta=0 cash=200 card=-50 other=0 food=50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=50 CASE cash_overspend month=2026-03 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=-50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=0 CASE cash_overspend month=2026-04 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE cash_overspend month=2026-05 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE mixed_cash_credit month=2026-03 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=-50 dining=0 reserve=0 other_reserve=0 rta=150 uncovered=0 CASE mixed_cash_credit month=2026-04 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE mixed_cash_credit month=2026-05 allocation=100 real=100 delta=0 cash=100 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE refund_above_debt month=2026-03 allocation=250 real=250 delta=0 cash=200 card=50 other=0 food=150 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE refund_above_debt month=2026-04 allocation=250 real=250 delta=0 cash=200 card=50 other=0 food=150 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE refund_above_debt month=2026-05 allocation=250 real=250 delta=0 cash=200 card=50 other=0 food=150 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE funded_later month=2026-03 allocation=200 real=200 delta=0 cash=200 card=-100 other=0 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0 CASE funded_later month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE funded_later month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE fully_paid month=2026-03 allocation=200 real=200 delta=0 cash=100 card=100 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE fully_paid month=2026-04 allocation=200 real=200 delta=0 cash=100 card=100 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE fully_paid month=2026-05 allocation=200 real=200 delta=0 cash=100 card=100 other=0 food=100 dining=0 reserve=0 other_reserve=0 rta=100 uncovered=0 CASE partial_payment month=2026-03 allocation=150 real=150 delta=0 cash=150 card=-50 other=0 food=100 dining=0 reserve=50 other_reserve=0 rta=0 uncovered=0 CASE partial_payment month=2026-04 allocation=150 real=150 delta=0 cash=150 card=-50 other=0 food=100 dining=0 reserve=50 other_reserve=0 rta=0 uncovered=0 CASE partial_payment month=2026-05 allocation=150 real=150 delta=0 cash=150 card=-50 other=0 food=100 dining=0 reserve=50 other_reserve=0 rta=0 uncovered=0 CASE split_refund month=2026-03 allocation=200 real=200 delta=0 cash=50 card=150 other=0 food=100 dining=100 reserve=0 other_reserve=0 rta=0 uncovered=0 CASE split_refund month=2026-04 allocation=200 real=200 delta=0 cash=50 card=150 other=0 food=100 dining=100 reserve=0 other_reserve=0 rta=0 uncovered=0 CASE split_refund month=2026-05 allocation=200 real=200 delta=0 cash=50 card=150 other=0 food=100 dining=100 reserve=0 other_reserve=0 rta=0 uncovered=0 CASE debt_transfer month=2026-03 allocation=200 real=200 delta=0 cash=200 card=0 other=-100 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0 CASE debt_transfer month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=-100 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0 CASE debt_transfer month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=-100 food=0 dining=0 reserve=100 other_reserve=0 rta=100 uncovered=0 CASE credit_spending month=2026-03 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0 CASE credit_spending month=2026-04 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0 CASE credit_spending month=2026-05 allocation=200 real=200 delta=0 cash=200 card=0 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=200 uncovered=0 CASE credit_transfer month=2026-03 allocation=300 real=300 delta=0 cash=200 card=-100 other=100 food=0 dining=0 reserve=0 other_reserve=0 rta=300 uncovered=100 CASE credit_transfer month=2026-04 allocation=300 real=300 delta=0 cash=200 card=-100 other=100 food=0 dining=0 reserve=0 other_reserve=0 rta=300 uncovered=100 CASE credit_transfer month=2026-05 allocation=300 real=300 delta=0 cash=200 card=-100 other=100 food=0 dining=0 reserve=0 other_reserve=0 rta=300 uncovered=100 ok test opening_credit_and_missing_payment_observations ... CASE positive_card_opening month=2026-01 allocation=1 real=1 delta=0 cash=0 card=1 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=1 uncovered=0 CASE positive_card_opening month=2026-02 allocation=1 real=1 delta=0 cash=0 card=1 other=0 food=0 dining=0 reserve=0 other_reserve=0 rta=1 uncovered=0 CASE unlinked_card month=2026-01 L=1 M=1 rta=0 food=0 cash=1 card=-1 CASE unlinked_card month=2026-02 L=1 M=1 rta=0 food=0 cash=1 card=-1 ok test wider_histories ... ok test result: ok. 4 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 70.85s running 2 tests test generated_opening_credit_conserves ... ok test generated_unlinked_card_conserves ... ok test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 4 filtered out; finished in 0.34s running 1 test test read_and_interrupted_publication_are_isolated_and_idempotent ... PASS: 16 reads preserve bytes/fingerprints; failed link CAS leaves a valid Category-first Budget; retry reuses the Category without rewriting it; other User unchanged ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s ``` ### `python3 tests/money/bulkrev5-probe.py --store-only (strengthened partial/final replay assertions)` ```text running 1 test test read_and_interrupted_publication_are_isolated_and_idempotent ... PASS: 16 reads preserve bytes/fingerprints; failed link CAS leaves a valid Category-first Budget; retry reuses the Category without rewriting it; other User unchanged ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s ``` ### `cargo clean` ```text Removed 3234 files, 1.8GiB total ``` No web build output was created. The three standalone probe binaries were removed. All changed module and function doc comments were read again. The worktree contains only committed review files and ignored evidence. READY — no blocking items.
Author
Owner

Deployed to calternal.cloud in merge round 35c (build 5a2c02c13, live 2026-10-09 ~16:35 IST). Closing.

Deployed to calternal.cloud in merge round 35c (build 5a2c02c13, live 2026-10-09 ~16:35 IST). Closing.
kayg closed this issue 2026-10-09 11:11:31 +00:00
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#1393
No description provided.