Skip to content

v30.0.0

Choose a tag to compare

@Phinetwork Phinetwork released this 23 Dec 00:10
· 10 commits to main since this release
ba7038e

Φ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 (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.

What's Changed

Full Changelog: v29.9.0...v30.0.0