Skip to content

Commit ba7038e

Browse files
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). --- ## ⚠️ 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) 1. **Set Device A clock wrong** (hours/day off). Keep Device B correct. 2. Load v30 on both (same build). 3. Confirm: * pulse display follows Kai logic (no timezone weirdness) * beat:step boundaries tick cleanly at pulse boundaries 4. Toggle: * background → foreground * focus changes * refresh 5. Confirm: * anchor persists (`phi_kai_anchor_pmicro_v1` present) * “NOW” resumes sealed (no reset-to-0 behavior, no drift jumps) --- ## 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.
2 parents 7ddfd76 + 8586e0d commit ba7038e

89 files changed

Lines changed: 472 additions & 6572 deletions

File tree

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.

dist/assets/EternalKlock-D-6bki8F.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/assets/EternalKlock-DfWXiodb.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

dist/assets/EternalKlock-Dw35TpVK.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

dist/assets/EternalKlock-IxDQx0_Y.js

Lines changed: 0 additions & 47 deletions
This file was deleted.

dist/assets/HomePriceChartCard-BieFQ0Qc.js

Lines changed: 0 additions & 28 deletions
This file was deleted.

dist/assets/HomePriceChartCard-Dq4fVHHi.js

Lines changed: 0 additions & 28 deletions
This file was deleted.

dist/assets/HomePriceChartCard-FLWmHWT_.js

Lines changed: 28 additions & 0 deletions
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.

dist/assets/KaiRealms-Dge15PtW.js

Lines changed: 0 additions & 2 deletions
This file was deleted.

0 commit comments

Comments
 (0)