Hold readiness: manual Dedup scrub remains pending while injected damage is downloadable #1422

Closed
opened 2026-10-07 23:15:06 +00:00 by kayg · 8 comments
Owner

Unresolved integrity verification in the bounded merge34 / #1403 release-server round. Head d395b6e25d; runtime ef0aa12b1. This holds readiness until the repair/recovery contract is demonstrated.

The unchanged Dedup probe creates identical CAS-backed files and an intact private sync copy. It intentionally overwrites the shared CAS inode outside the server, then POSTs /api/v1/admin/dedup/scrub/trigger (202). After 90 seconds:

!! dedup scrub repair: scrub did not report repaired corruption: {'phase': 'never', 'timezone': 'Europe/Berlin', 'finished_at': None, 'checked_files': 0, 'bytes_checked': 0, 'problems': [], 'has_error': False}

Same-round, read-only diagnostic:

  • Download of the affected same-1.bin returns 200 and exactly the injected R bytes, not the intact private copy (262192 bytes).
  • The Home file shares its inode with one actual CAS file; that CAS hardlink also contains injected damage. The private copy is a distinct intact inode.
  • The scrub job is pending, attempts=0, priority=-100. No kind controls are paused. There were 916 pending thumbnail jobs, then 902 in a later snapshot. Notes preview and other kinds are also pending.

This is not evidence that an executed scrub repairs incorrectly. The scrub has not started. It is also not a green repair check: damaged bytes remain observable, and the probe skips its per-path repair assertions after phase never. Server runtime intentionally uses one ordinary background handler (#549); priority ordering selects higher-priority work before the scrub. DESIGN §5 requires detection/repair by the next scrub, with bounded reads and resumable pages.

Keep the existing repair assertions. Investigate bounded scheduling/fairness or an explicit manual integrity-check admission policy, without raising worker/IO budgets or weakening thresholds. Demonstrate corrupt inode quarantine, verified private-copy repair of every affected hardlink, affected stable IDs and recovery after interruption on the real server. Existing attack2.py Dedup coverage is the regression location. The planned crash barriers are intentional SIGKILLs, not unexpected crashes.

Initial diagnostic tried SHA-256 and a post-restart stat digest to locate CAS; those lookups were invalid for the original damaged blob. The later inode comparison above is the valid CAS evidence. No incorrect missing-blob inference is claimed.

Unresolved integrity verification in the bounded merge34 / #1403 release-server round. Head d395b6e25da20d8c67b8b9fc1a593b813939c8a7; runtime ef0aa12b1. This holds readiness until the repair/recovery contract is demonstrated. The unchanged Dedup probe creates identical CAS-backed files and an intact private sync copy. It intentionally overwrites the shared CAS inode outside the server, then POSTs /api/v1/admin/dedup/scrub/trigger (202). After 90 seconds: ``` !! dedup scrub repair: scrub did not report repaired corruption: {'phase': 'never', 'timezone': 'Europe/Berlin', 'finished_at': None, 'checked_files': 0, 'bytes_checked': 0, 'problems': [], 'has_error': False} ``` Same-round, read-only diagnostic: - Download of the affected same-1.bin returns 200 and exactly the injected R bytes, not the intact private copy (262192 bytes). - The Home file shares its inode with one actual CAS file; that CAS hardlink also contains injected damage. The private copy is a distinct intact inode. - The scrub job is pending, attempts=0, priority=-100. No kind controls are paused. There were 916 pending thumbnail jobs, then 902 in a later snapshot. Notes preview and other kinds are also pending. This is not evidence that an executed scrub repairs incorrectly. The scrub has not started. It is also not a green repair check: damaged bytes remain observable, and the probe skips its per-path repair assertions after phase never. Server runtime intentionally uses one ordinary background handler (#549); priority ordering selects higher-priority work before the scrub. DESIGN §5 requires detection/repair by the next scrub, with bounded reads and resumable pages. Keep the existing repair assertions. Investigate bounded scheduling/fairness or an explicit manual integrity-check admission policy, without raising worker/IO budgets or weakening thresholds. Demonstrate corrupt inode quarantine, verified private-copy repair of every affected hardlink, affected stable IDs and recovery after interruption on the real server. Existing attack2.py Dedup coverage is the regression location. The planned crash barriers are intentional SIGKILLs, not unexpected crashes. Initial diagnostic tried SHA-256 and a post-restart stat digest to locate CAS; those lookups were invalid for the original damaged blob. The later inode comparison above is the valid CAS evidence. No incorrect missing-blob inference is claimed.
Author
Owner

Readiness hold #1422: the unchanged Dedup corruption probe received 202, then remained phase never after 90 seconds. Read-only same-round evidence confirms an affected download returns the injected R bytes, with an intact private sync copy still present. Inode comparison confirms the damaged Home link is still shared with CAS. The scrub is pending, attempts=0, priority=-100, behind 916 thumbnails (902 in a later snapshot); no kind control is paused. Thus repair has not run, rather than a demonstrated failure inside an executed repair handler. Initial guessed digest lookups are not used as missing-blob evidence.

The later Dedup collector did not begin within 120 seconds, so its crash/recovery assertion is not green either. Planned upload/publication SIGKILL barriers are intentional. The full single round remains bounded; final verdict will be NOT READY unless the remaining evidence demonstrates repair and required verification coverage. No background concurrency, priority, threshold or expectation was changed to force a pass.

Readiness hold #1422: the unchanged Dedup corruption probe received 202, then remained phase never after 90 seconds. Read-only same-round evidence confirms an affected download returns the injected R bytes, with an intact private sync copy still present. Inode comparison confirms the damaged Home link is still shared with CAS. The scrub is pending, attempts=0, priority=-100, behind 916 thumbnails (902 in a later snapshot); no kind control is paused. Thus repair has not run, rather than a demonstrated failure inside an executed repair handler. Initial guessed digest lookups are not used as missing-blob evidence. The later Dedup collector did not begin within 120 seconds, so its crash/recovery assertion is not green either. Planned upload/publication SIGKILL barriers are intentional. The full single round remains bounded; final verdict will be NOT READY unless the remaining evidence demonstrates repair and required verification coverage. No background concurrency, priority, threshold or expectation was changed to force a pass.
Author
Owner

Single bounded release-server round completed: 22:17:48–23:24:07 UTC (66m 19s), exit 1. No second full round ran.

Final authorization matrix completed all 3036 requests across 4 base identities, invalid/stale sessions and 21 App Password scope classes. It covered 429 operations, 20 privileged body routes and 53 admin policy routes, with no denial failure reported. The earlier XUser matrix had zero denial failures across 938 owned/missing comparisons and 122 Job/Mail/quota checks.

Dedup remains a readiness hold (#1422): repair phase never, then collection never started; 32 test orphan blobs and named garbage remained. These are 37 related probe findings, not 37 independent repair defects. The upload/publication crash barriers executed, but collection's crash marker did not occur. The probe did not demonstrate repair or collection resume. No threshold, priority or concurrency budget was changed to force a pass.

Additional recorded findings:

  • #1423 Notes IMAP FETCH/structural-base lookup fails, while a read-only diagnostic finds the 182-byte source with both markers and a 200 API list entry. No source loss shown. Notes submission reports 0 findings.
  • #1424 restart probe expects a changed epoch without measuring it; the target has two durable history records and a cached room. The history-enabled production contract resumes lineage. No Markdown duplication, changed body or rebuilt-document mismatch is reported. Keep its original expectations pending review.

NOT READY pending the unresolved Dedup integrity verification and the full-workspace test command exits recorded earlier. The remaining camera-only Money frames are running now; screenshots do not override the original Money/Search acceptance failures.

Single bounded release-server round completed: 22:17:48–23:24:07 UTC (66m 19s), exit 1. No second full round ran. Final authorization matrix completed all 3036 requests across 4 base identities, invalid/stale sessions and 21 App Password scope classes. It covered 429 operations, 20 privileged body routes and 53 admin policy routes, with no denial failure reported. The earlier XUser matrix had zero denial failures across 938 owned/missing comparisons and 122 Job/Mail/quota checks. Dedup remains a readiness hold (#1422): repair phase never, then collection never started; 32 test orphan blobs and named garbage remained. These are 37 related probe findings, not 37 independent repair defects. The upload/publication crash barriers executed, but collection's crash marker did not occur. The probe did not demonstrate repair or collection resume. No threshold, priority or concurrency budget was changed to force a pass. Additional recorded findings: - #1423 Notes IMAP FETCH/structural-base lookup fails, while a read-only diagnostic finds the 182-byte source with both markers and a 200 API list entry. No source loss shown. Notes submission reports 0 findings. - #1424 restart probe expects a changed epoch without measuring it; the target has two durable history records and a cached room. The history-enabled production contract resumes lineage. No Markdown duplication, changed body or rebuilt-document mismatch is reported. Keep its original expectations pending review. NOT READY pending the unresolved Dedup integrity verification and the full-workspace test command exits recorded earlier. The remaining camera-only Money frames are running now; screenshots do not override the original Money/Search acceptance failures.
Author
Owner

Started #1422 on branch job/scrub-1422, base ef0aa12b12. Investigate bounded integrity admission under the existing single background handler budget; preserve attack2.py assertions.

Started #1422 on branch job/scrub-1422, base ef0aa12b12e0047cf9a779827cc0ed32261b934e. Investigate bounded integrity admission under the existing single background handler budget; preserve attack2.py assertions.
Author
Owner

Finding #1422: trigger_dedup_scrub and restart enqueue both used CAS_SCRUB_PRIORITY=-100; JobQueue::lease_matching orders priority DESC. The single server Worker has max_concurrency=1 and a 1-second poll interval. This permits an unbounded derivative backlog to starve integrity work. Fix: priority 200 for explicit/resumed checks; one reserved oldest-ready integrity admission every 16 claims for timers. Reserved claims use the existing pause/time/lease guards and a partial kind/run-time index. Normal worker and I/O budgets stay unchanged. The admission cadence counts urgent work too, so repeated manual triggers cannot reset the timer bound. The 5-second target is conditional on the current handler yielding its slot; handlers are not preempted. No new dependency or download hash is introduced.

Finding #1422: trigger_dedup_scrub and restart enqueue both used CAS_SCRUB_PRIORITY=-100; JobQueue::lease_matching orders priority DESC. The single server Worker has max_concurrency=1 and a 1-second poll interval. This permits an unbounded derivative backlog to starve integrity work. Fix: priority 200 for explicit/resumed checks; one reserved oldest-ready integrity admission every 16 claims for timers. Reserved claims use the existing pause/time/lease guards and a partial kind/run-time index. Normal worker and I/O budgets stay unchanged. The admission cadence counts urgent work too, so repeated manual triggers cannot reset the timer bound. The 5-second target is conditional on the current handler yielding its slot; handlers are not preempted. No new dependency or download hash is introduced.
Author
Owner

Verification finding: the manual flooded-queue server regression passed. Adding core migration 16 (jobs_ready_kind) exposes three exact live release-migration pins in server upgrade_tests.rs: they still enumerate the pre-#1422 pending receipts/frontier/count. Extend only these live pins by the new receipt; do not alter deployed fixture SQL, deployed receipt frontiers or any source/data assertions. Add an explicit upgraded-index assertion. This expectation change follows the new Index migration for the requested fair-admission behavior and is flagged for orchestrator review.

Verification finding: the manual flooded-queue server regression passed. Adding core migration 16 (jobs_ready_kind) exposes three exact live release-migration pins in server upgrade_tests.rs: they still enumerate the pre-#1422 pending receipts/frontier/count. Extend only these live pins by the new receipt; do not alter deployed fixture SQL, deployed receipt frontiers or any source/data assertions. Add an explicit upgraded-index assertion. This expectation change follows the new Index migration for the requested fair-admission behavior and is flagged for orchestrator review.
Author
Owner

Probe setup finding: the focused ADVERSARIAL_DEDUP_ONLY runner tried dedup_setup.mjs after setup.mjs had already created six active Users. New member registration returned 409 before any Dedup assertion ran; the unlicensed Instance limit is six (calternal-auth/src/licence.rs FREE_USER_LIMIT). Fix only the focused runner: refresh the Owner assertion and use setup's still-live four-User campaign roster. The full round still creates replacement Users after its deletion campaign. No Licence limit, role, API assertion or timeout is changed. Restart the focused run because the first attempt never reached the campaign.

Probe setup finding: the focused ADVERSARIAL_DEDUP_ONLY runner tried dedup_setup.mjs after setup.mjs had already created six active Users. New member registration returned 409 before any Dedup assertion ran; the unlicensed Instance limit is six (calternal-auth/src/licence.rs FREE_USER_LIMIT). Fix only the focused runner: refresh the Owner assertion and use setup's still-live four-User campaign roster. The full round still creates replacement Users after its deletion campaign. No Licence limit, role, API assertion or timeout is changed. Restart the focused run because the first attempt never reached the campaign.
Author
Owner

scrub-1422 final report

Branch: job/scrub-1422. Head: 8083de20a5. Base: origin/dev d395b6e25 (fetched and merged once before final gates). Five atomic commits. No push, deploy or UI change.

Built

Manual and restart Dedup scrubs use priority 200, ahead of bulk Derived data. Timer scrubs stay at -100. Every 16th successful admission reserves the shared handler for the oldest ready scrub. Urgent admissions count toward that cadence. No added worker, IO budget, read limit or preemption. DESIGN §5 and code explain the bound: no older scrub means at most 15 other admissions; with N older scrubs, at most 16 × (N + 1) slots. Wall-clock time depends on the running handler and subsequent handler durations. Paused jobs are excluded.

Core migration 0016 adds the pending kind/run-time index. Normal claims retain the existing priority index. Expected queue cost is an indexed claim plus at most one extra kind-index lookup per 16 admissions. Scrub cost remains 64 entries per page and 1 MiB/s. No per-download hash was added.

Rust tests flood the queue with 900 derivative jobs, and independently with 900 urgent integrity jobs. The timer starts in slot 16. The server test uses the actual manual options and verifies admission within 5 seconds after the active handler releases its slot.

The real-server attack2.py Dedup assertions remain unchanged. Added evidence proves the damaged inode moves to quarantine (paired inotify rename cookie), all affected hardlinks are restored from verified bytes, original stable IDs stay unchanged, and downloads return intact bytes. Independent scan recovery adds 130 distinct 64 KiB uploads and SIGKILLs after a persisted page.

Local real-server results:

dedup manual scrub admission: 685.735 ms (local)
dedup damaged inode moved to quarantine (paired rename cookie)
dedup scan resumed: saved=64 final=148 bytes=12255426
server alive at end: True
==== ROUND 2 FINDINGS 0
==== ROUND 2 SLOW 0

Both repair and scan-recovery sections returned zero findings and zero SLOW results. The campaign deliberately killed the server during upload, publication, collection and scan. Log: artifacts/dedup-probe-final.log. Retained fixture: target/tmp/adversarial.n9MePJ.

Files

bench/dedup-scrub-1422.md
contracts/perf/exceptions.json
crates/calternal-db/src/jobs.rs
crates/calternal-db/src/migrations.rs
crates/calternal-db/src/migrations/0016_jobs_ready_kind.sql
crates/calternal-db/src/worker.rs
crates/calternal-db/tests/queue.rs
crates/calternal-server/src/upgrade_tests.rs
crates/calternal-server/src/wire.rs
docs/DESIGN.md
tests/adversarial/attack2.py
tests/adversarial/run.sh

Gates (verbatim)

cargo fmt --check: exit 0, no output. Cargo commands used the required debug/incremental/jobs/temp environment.

cargo clippy -p calternal-db --all-targets -- -D warnings:

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

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

test result: ok. 40 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 6.20s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.25s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.13s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.23s
test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.41s
test result: ok. 22 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 1.27s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

cargo clippy -p calternal-server --all-targets -- -D warnings:

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

cargo test -p calternal-server -- --test-threads=4 passed all runtime unit tests, then stopped at the exact performance exception hash for the changed admin mutation. Refreshed only that live hash and reran the failing guard and the remaining integration test. The complete unit suite was not repeated after the data-only pin fix. Verbatim successful results:

server-test-final.log:

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

server-perf-guard-final.log:

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

server-private-permissions.log:

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

Earlier upgrade-test failures required adding the new migration receipt to three exact live-schema pins. Deployed fixtures and frontiers were retained. All four upgrade tests then passed; the subsequent full runtime unit suite also passed. The orchestrator must review those pin expansions. The focused Dedup runner initially hit the six-User Instance limit before any Dedup assertion; it now reuses the four active fixture Users. Original assertions, roles and limits were retained.

Python compilation and shell syntax checks passed. All touched source doc comments were reread. git diff --check passed. Cargo cleanup removed 20552 files, 16.9GiB total. Web build output was deleted. Review logs remain ignored, outside commit history.

Web checks (verbatim)

cd apps/web && bun run check: exit 0. Four unused-selector warnings in untouched MailView and budget page files.

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

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

Ran 140 tests in 0.083s
 8 pass
 0 fail
design rules: no new shared primitive overrides or hand-rolled buttons (origin/dev baseline)
 Test Files  297 passed (297)
      Tests  2116 passed (2116)
   Duration  894.51s (environment 28%, transform 25%, import 23%, tests 18%, setup 6%)

Decisions and known gaps

Decisions: use priority 200 and one FIFO scrub admission in 16, keep timer priority -100, add core migration 0016 for bounded indexed claims, and keep the single handler. No existing cheap CAS-download integrity check was reused; full hashing on download would change its cost.

Known gaps: an active handler cannot be preempted, so the 5-second target is not an unconditional deadline for an arbitrarily long current job. External CAS damage can still be served before repair. Formal p50/p95 CPU/RSS measurements were not collected: the latest verification policy reserves those runs for performance work on the perf VM. bench/dedup-scrub-1422.md records the reproducible profile, local functional sample and absence of a matching baseline.

UX gaps closed/left: none; no UI change.

For the merge round

Run cargo test -p calternal-server -- --test-threads=4 once on the combined head to confirm the unit suite and both integrations in one command. The focused real-server Dedup campaign has already passed in this job; full combined adversarial matrices belong to the merge round.

# scrub-1422 final report Branch: job/scrub-1422. Head: 8083de20a505756eb2c88a5e8e2d995ae5d37687. Base: origin/dev d395b6e25 (fetched and merged once before final gates). Five atomic commits. No push, deploy or UI change. ## Built Manual and restart Dedup scrubs use priority 200, ahead of bulk Derived data. Timer scrubs stay at -100. Every 16th successful admission reserves the shared handler for the oldest ready scrub. Urgent admissions count toward that cadence. No added worker, IO budget, read limit or preemption. DESIGN §5 and code explain the bound: no older scrub means at most 15 other admissions; with N older scrubs, at most 16 × (N + 1) slots. Wall-clock time depends on the running handler and subsequent handler durations. Paused jobs are excluded. Core migration 0016 adds the pending kind/run-time index. Normal claims retain the existing priority index. Expected queue cost is an indexed claim plus at most one extra kind-index lookup per 16 admissions. Scrub cost remains 64 entries per page and 1 MiB/s. No per-download hash was added. Rust tests flood the queue with 900 derivative jobs, and independently with 900 urgent integrity jobs. The timer starts in slot 16. The server test uses the actual manual options and verifies admission within 5 seconds after the active handler releases its slot. The real-server attack2.py Dedup assertions remain unchanged. Added evidence proves the damaged inode moves to quarantine (paired inotify rename cookie), all affected hardlinks are restored from verified bytes, original stable IDs stay unchanged, and downloads return intact bytes. Independent scan recovery adds 130 distinct 64 KiB uploads and SIGKILLs after a persisted page. Local real-server results: ```text dedup manual scrub admission: 685.735 ms (local) dedup damaged inode moved to quarantine (paired rename cookie) dedup scan resumed: saved=64 final=148 bytes=12255426 server alive at end: True ==== ROUND 2 FINDINGS 0 ==== ROUND 2 SLOW 0 ``` Both repair and scan-recovery sections returned zero findings and zero SLOW results. The campaign deliberately killed the server during upload, publication, collection and scan. Log: artifacts/dedup-probe-final.log. Retained fixture: target/tmp/adversarial.n9MePJ. ## Files ```text bench/dedup-scrub-1422.md contracts/perf/exceptions.json crates/calternal-db/src/jobs.rs crates/calternal-db/src/migrations.rs crates/calternal-db/src/migrations/0016_jobs_ready_kind.sql crates/calternal-db/src/worker.rs crates/calternal-db/tests/queue.rs crates/calternal-server/src/upgrade_tests.rs crates/calternal-server/src/wire.rs docs/DESIGN.md tests/adversarial/attack2.py tests/adversarial/run.sh ``` ## Gates (verbatim) `cargo fmt --check`: exit 0, no output. Cargo commands used the required debug/incremental/jobs/temp environment. `cargo clippy -p calternal-db --all-targets -- -D warnings`: ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 11m 37s ``` `cargo test -p calternal-db -- --test-threads=4`: ```text test result: ok. 40 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 6.20s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.25s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.13s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.23s test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.41s test result: ok. 22 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 1.27s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` `cargo clippy -p calternal-server --all-targets -- -D warnings`: ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 30s ``` `cargo test -p calternal-server -- --test-threads=4` passed all runtime unit tests, then stopped at the exact performance exception hash for the changed admin mutation. Refreshed only that live hash and reran the failing guard and the remaining integration test. The complete unit suite was not repeated after the data-only pin fix. Verbatim successful results: server-test-final.log: ```text test result: ok. 273 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 194.01s ``` server-perf-guard-final.log: ```text test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 43.89s ``` server-private-permissions.log: ```text test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 6.95s ``` Earlier upgrade-test failures required adding the new migration receipt to three exact live-schema pins. Deployed fixtures and frontiers were retained. All four upgrade tests then passed; the subsequent full runtime unit suite also passed. The orchestrator must review those pin expansions. The focused Dedup runner initially hit the six-User Instance limit before any Dedup assertion; it now reuses the four active fixture Users. Original assertions, roles and limits were retained. Python compilation and shell syntax checks passed. All touched source doc comments were reread. `git diff --check` passed. Cargo cleanup removed 20552 files, 16.9GiB total. Web build output was deleted. Review logs remain ignored, outside commit history. ## Web checks (verbatim) `cd apps/web && bun run check`: exit 0. Four unused-selector warnings in untouched MailView and budget page files. ```text svelte-check found 0 errors and 4 warnings in 2 files ``` `cd apps/web && bun run test --maxWorkers=2`: exit 0. ```text Ran 140 tests in 0.083s 8 pass 0 fail design rules: no new shared primitive overrides or hand-rolled buttons (origin/dev baseline) Test Files 297 passed (297) Tests 2116 passed (2116) Duration 894.51s (environment 28%, transform 25%, import 23%, tests 18%, setup 6%) ``` ## Decisions and known gaps Decisions: use priority 200 and one FIFO scrub admission in 16, keep timer priority -100, add core migration 0016 for bounded indexed claims, and keep the single handler. No existing cheap CAS-download integrity check was reused; full hashing on download would change its cost. Known gaps: an active handler cannot be preempted, so the 5-second target is not an unconditional deadline for an arbitrarily long current job. External CAS damage can still be served before repair. Formal p50/p95 CPU/RSS measurements were not collected: the latest verification policy reserves those runs for performance work on the perf VM. bench/dedup-scrub-1422.md records the reproducible profile, local functional sample and absence of a matching baseline. UX gaps closed/left: none; no UI change. ## For the merge round Run `cargo test -p calternal-server -- --test-threads=4` once on the combined head to confirm the unit suite and both integrations in one command. The focused real-server Dedup campaign has already passed in this job; full combined adversarial matrices belong to the merge round.
kayg referenced this issue from a commit 2026-10-08 10:41:40 +00:00
Author
Owner

Deployed to calternal.cloud in merge round 35a (build cc1af3c12, live 2026-10-09 00:12 IST). Closing.

Deployed to calternal.cloud in merge round 35a (build cc1af3c12, live 2026-10-09 00:12 IST). Closing.
kayg closed this issue 2026-10-08 18:41:21 +00:00
kayg referenced this issue from a commit 2026-10-08 19:43:32 +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#1422
No description provided.