v30.0.0
ΦNet Sovereign Gate — v30.0.0 Release Notes
Codename: Full Determinism / Genesis-Locked μpulse Anchor
Scope: App shell refactor + deterministic time hardening + PWA warmup/perf
🔥 Headline Changes (What’s Actually New)
✅ 1) Genesis seed is now canonical across devices (wall-clock independent)
This release removes “0-based” or “device-time-based” boot behavior and replaces it with a Genesis-anchored μpulse coordinate that is:
-
Derived from the canonical Genesis bridge (
GENESIS_TS + pulses * PULSE_MS) -
Stored as μpulses since Genesis under a single stable key:
phi_kai_anchor_pmicro_v1
-
Re-sealed on lifecycle boundaries (boot, visibility return, focus) so the app never “drifts into fake time”
-
Persisted on a fixed cadence (every 15s + pagehide/visibilitychange)
Result: the pulse coordinate is deterministic and consistent across machines even if their wall clocks are wrong, because the app’s “now” is enforced as Kai μpulse state, not Chronos sampling.
🧠 Deterministic Engine Hardening (μpulse-first)
✅ 2) μpulse is now the canonical internal clock format
New canonical internal invariant:
-
Everything runs off
pμ(BigInt μpulses since Genesis) -
UI timestamps (epoch-ms, ISO, etc.) are derived, never sourced:
epochMs = GENESIS_TS + (pμ / 1e6) * PULSE_MS
✅ 3) Added normalization layer so “kairosEpochNow” can’t poison determinism
A major failure mode in hybrid systems is when a “now” provider changes units (μpulses vs ms vs seconds) and silently corrupts downstream math.
v30 introduces a strict normalization gate:
- If the raw value looks like a plausible μpulse range → accept as μpulses.
- If it looks like an epoch-ish number → convert to μpulses via the Genesis bridge.
- If it’s unsafe to convert → refuse to pretend, pass through without corrupting state.
This is what makes the system resilient across builds, environments, and future refactors.
✅ 4) Banker's rounding (ties-to-even) for all Number→BigInt bridges
Any time you must cross the float boundary (ms → pulses → μpulses), v30 enforces:
- ties-to-even rounding
- no float accumulation
- no “random rounding bias over time”
This eliminates long-run systematic skew from conversion jitter.
⏱ Live Kai Clock: Boundary-Exact, Low Re-render
✅ 5) Live ticker now schedules on true pulse boundaries
Instead of “update every N ms”, the ticker computes:
into = pμ % 1_000_000remainMicro = 1_000_000 - intodelayMs = (remainMicro / 1e6) * PULSE_MS
So updates happen exactly at the next φ pulse boundary, not “close enough.”
✅ 6) Memoized LiveKaiButton + render-diff guard
The live clock no longer causes the app to churn. Updates are filtered:
- if
pulseStr,beatStepLabel, anddmyLabelhaven’t changed → no state update - Live UI is isolated + memoized to keep deterministic ticking without repaint storms
🧮 KKS v1.0 Display Math (Beat/Step/DMY) Stabilized
✅ 7) Deterministic Beat/Step/Day math is clamped and integer-stable
computeBeatStepDMY() now enforces:
- strict bounds for beat (0–35) and step (0–43)
- robust day index selection (uses
dayIndex/dayIndex0/dayIndexSinceGenesisif present) - safe fallback
floor((pulse + eps)/PULSES_PER_DAY)to avoid boundary wobble
Net: no negative wrap bugs, no out-of-range UI, no boundary flicker.
🧱 App Shell Refactor (Performance + Modularity)
✅ 8) Centralized shell constants + behavior isolated into focused helpers
v30 turns App.tsx from a monolith into a deterministic shell with clean modules:
- central route lists (
SHELL_ROUTES_TO_WARM,SIGIL_STREAM_ROUTES) - deterministic title routing (
pageTitleFromPath) - panel lock rules (
lockPanelForPath) - viewport sizing + layout gates
- stable navigation metadata (
NAV_ITEMSreused, no regeneration churn)
⚡ Lazy Loading + “No Splash” Enforcement
✅ 9) Instant first paint preserved with empty Suspense fallbacks
Heavy modules remain lazy-loaded without a splash screen regression:
KaiVohModal,SigilModal,HomePriceChartCard,SigilExplorer,EternalKlock- fallbacks are empty (
null) or invisible height placeholders (chart)
✅ 10) Splash killer runs twice (module eval + layout)
To guarantee “zero splash” even under weird PWA restore behavior:
- kill splash immediately at module eval
- kill again via isomorphic layout effect on route changes
🛰 Service Worker Warm-Up (Offline-First, Battery-Sane)
✅ 11) SW cache warmup is now controlled, gated, and targeted
New behavior:
-
sends
WARM_URLSmessage to active/waiting/installing worker -
warms both offline artifacts + shell routes
-
auto-disables warmup on:
saveDatamodeslow-2g / 2g
Also re-warms on focus (debounced), improving “return to app” speed without hammering low-end connections.
📱 Mobile / iOS Hardening
✅ 12) VisualViewport publisher is RAF-throttled and shared
- one global store
- subscribable listeners
- RAF-throttled updates
- prevents resize storms from re-rendering the whole app
✅ 13) iOS scroll lock is fixed-position safe
Locks body scroll without breaking restore position:
- stores scrollY + inline styles
- applies fixed positioning + restores cleanly on unlock
✅ 14) Portal host safety checks
Modals/popovers avoid attaching into a transform/backdrop-filter hostile host when unsafe, preventing iOS fixed-position glitches.
♿ Accessibility + UX
- Skip link added (
#app-content) - ARIA labels for major regions (topbar/panel/nav)
- SR-only announcements when portals open (KaiVoh / Explorer / Klock)
- Mobile nav autoscroll to active item
- DNS IP copy includes Clipboard API + textarea fallback with feedback animation
✅ Fixes / Cleanups Included in v30.0.0
- Replaced old “zero-based fallback seeding” with Genesis-aligned μpulse anchoring.
- Guarded deterministic “now” plumbing after seeding to prevent null/undefined propagation (resolves the class of TS/runtime issues seen in shared μpulse ticker wiring).
- Normalized timer typing (
number) to avoid NodeJS.Timeout bleed in browser code. - Deterministic scheduling now pauses while hidden and re-seals on return (prevents background jitter illusions and saves battery).
⚠️ Behavioral Notes (Important)
Storage impact
-
This release introduces/standardizes:
phi_kai_anchor_pmicro_v1
-
Clearing site data resets the persisted anchor (expected). The system will reseal deterministically on next boot.
“Wall clock irrelevant” clarification (what this release guarantees)
- If a device’s wall clock is wrong, the app no longer “believes” it for Kai time once seeded.
- All displayed “now” and all scheduling is derived from μpulse since Genesis, not Date.now/perf clocks.
🔍 Verification Checklist (Prove it’s deterministic)
-
Set Device A clock wrong (hours/day off). Keep Device B correct.
-
Load v30 on both (same build).
-
Confirm:
- pulse display follows Kai logic (no timezone weirdness)
- beat:step boundaries tick cleanly at pulse boundaries
-
Toggle:
- background → foreground
- focus changes
- refresh
-
Confirm:
- anchor persists (
phi_kai_anchor_pmicro_v1present) - “NOW” resumes sealed (no reset-to-0 behavior, no drift jumps)
- anchor persists (
Summary
v30.0.0 is the determinism milestone.
The app shell now boots and runs on a Genesis-anchored μpulse coordinate, persists it as a single canonical checkpoint, schedules UI updates on exact φ pulse boundaries, and keeps the entire PWA experience fast, splashless, and offline-ready—without letting host wall clocks inject distortion.
What's Changed
- v29.9.5 by @Phinetwork in #73
- v29.9.6 by @Phinetwork in #74
- v29.9.7 by @Phinetwork in #75
- v29.9.8 by @Phinetwork in #76
- v30.0.0 by @Phinetwork in #77
Full Changelog: v29.9.0...v30.0.0