Commit ba7038e
authored
Merge pull request #77 from kojibai/main
# Φ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_000`
* `remainMicro = 1_000_000 - into`
* `delayMs = (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`, and `dmyLabel` haven’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/dayIndexSinceGenesis` if 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_ITEMS` reused, 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_URLS` message to active/waiting/installing worker
* warms both offline artifacts + shell routes
* **auto-disables** warmup on:
* `saveData` mode
* `slow-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).
---
## 89 files changed
Lines changed: 472 additions & 6572 deletions
File tree
- dist
- assets
- public
- src
- components
- hooks
- kai
- utils
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
This file was deleted.
0 commit comments