Skip to content

v2.6.0: Deterministic Core, Single-Drain Countdown, and Web Release Hardening - #112

Merged
divijg19 merged 1 commit into
mainfrom
update
Oct 4, 2026
Merged

divijg19 merged 1 commit into
mainfrom
update

Conversation

@divijg19

@divijg19 divijg19 commented Oct 4, 2026

Copy link
Copy Markdown
Owner

Rust core: derive every reported total from the generated steps instead of tracking them separately, make generation numeric-only with a width-preserving duplicate repair, normalize duration onto the shared effective_from grid, and prove digit-width bounds rather than asserting them. Replace the stop signal's busy-wait with a Condvar, roll back a failed spawn, and join without holding the lock.

WASM/browser correctness: convert the bridge's u64 session_id and seed to BigInt at the boundary. They were passed as plain numbers, which threw, and the caller swallowed it as "planner unavailable", so every browser session silently ran the JS planner. Add real JS/WASM parity tests against the built package, and remove wasm_bindgen_test_configure!(run_in_browser), which was making the node run execute zero tests without failing.

Countdown: drain the progress ring once across the whole countdown instead of three per-count animations, so it cannot rewind, snap, or drift from the digits, and nothing in JS drives it. Rest the blades at one angle per digit and turn once per change rather than sweeping. Pin both mechanisms with tests, plus a stylesheet guard that every class the countdown applies has a rule: jsdom applies no CSS, so a deleted rule previously left the suite green while the ring stopped rendering.

Splash: read the timings off the splash element rather than the document root. Custom properties inherit downwards, so the root read returned nothing and every value silently fell back to constants that only agreed by coincidence.

Browser runtime: chained monotonic scheduler with stale-event skipping for backgrounded tabs, teardown-before-await, best-effort fullscreen that can no longer kill the Start button, JS fallback digit rotation matching Rust, and allocation cuts in the plan and driver hot paths. Release profile tuned with LTO, one codegen unit and symbol stripping, cutting the binary from 14.2MB to 6.4MB.

CI: run wasm clippy and the real wasm tests against the built package, gate the release on a verification job, publish with least privilege, and correct the dependabot frontend ecosystem to bun.

Verified: 54+95 Rust, 13 wasm, 123 frontend, cargo fmt, Biome, tsc, build:web, and pedantic clippy clean on host and wasm32.

@divijg19 divijg19 left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2.6.0: Deterministic Core, Single-Drain Countdown, and Web Release Hardening

…ardening

Rust core: derive every reported total from the generated steps instead of
tracking them separately, make generation numeric-only with a width-preserving
duplicate repair, normalize duration onto the shared effective_from grid, and
prove digit-width bounds rather than asserting them. Replace the stop signal's
busy-wait with a Condvar, roll back a failed spawn, and join without holding the
lock.

WASM/browser correctness: convert the bridge's u64 session_id and seed to BigInt
at the boundary. They were passed as plain numbers, which threw, and the caller
swallowed it as "planner unavailable", so every browser session silently ran the
JS planner. Add real JS/WASM parity tests against the built package, and remove
wasm_bindgen_test_configure!(run_in_browser), which was making the node run
execute zero tests without failing.

Countdown: drain the progress ring once across the whole countdown instead of
three per-count animations, so it cannot rewind, snap, or drift from the digits,
and nothing in JS drives it. Rest the blades at one angle per digit and turn once
per change rather than sweeping. Pin both mechanisms with tests, plus a
stylesheet guard that every class the countdown applies has a rule: jsdom applies
no CSS, so a deleted rule previously left the suite green while the ring stopped
rendering.

Splash: read the timings off the splash element rather than the document root.
Custom properties inherit downwards, so the root read returned nothing and every
value silently fell back to constants that only agreed by coincidence.

Browser runtime: chained monotonic scheduler with stale-event skipping for
backgrounded tabs, teardown-before-await, best-effort fullscreen that can no
longer kill the Start button, JS fallback digit rotation matching Rust, and
allocation cuts in the plan and driver hot paths. Release profile tuned with LTO,
one codegen unit and symbol stripping, cutting the binary from 14.2MB to 6.4MB.

CI: run wasm clippy and the real wasm tests against the built package, gate the
release on a verification job, publish with least privilege, and correct the
dependabot frontend ecosystem to bun. The release verify gate also installs the
Linux native dependencies now: cargo test and clippy build Tauri's whole GTK and
WebKit stack, and without them glib-sys fails inside its build script, so the
gate died on a missing system package instead of on anything wrong with the
code. build-web deliberately keeps none, since wasm32 compiles tauri out.

Verified: 54+95 Rust, 13 wasm, 123 frontend, cargo fmt, Biome, tsc, build:web,
and pedantic clippy clean on host and wasm32.
@divijg19
divijg19 merged commit a1c5a61 into main Oct 4, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant