Xenphone · GTM · Attempt 11

Steps to Get This Done

One shipped Xenphone where messaging, SMS, voice, browser, and the omni inbox all work together, live and stable, behind a single installable app. After 10 failed attempts, this is the path that breaks the loop.
THE SHAPE (decide first — this is where every prior attempt forked):
ONE SHELLXUI 3-panel command center. React XOS becomes a tile inside it, not a 2nd app.
ONE BACKENDomnimind spine at api.xlrd.org. Every function fans from here.
ONE SOURCEMac xp/ edits → E:\hitthe.link pushes. Never edit the deployed copy.

The 8-step build order · each gated by the prior

1

Reconcile the split-brainBLOCKER · do first

Mac xp/ is ahead of deployed E:\hitthe.link\{xos,xui} despite the same commit. Pick xp/ as winner, copy forward, commit once, tag xenphone-canon-v11. Also fix the chatIDchatId mismatch that silently breaks sends. Edits never reached users until this is true.

2

Stand up the spine as contract owner

Confirm omnimind.js serves all routes on :4441 and the api.xlrd.org tunnel is up. Health check becomes a deploy gate.

3

Wire Beeper into the omni inbox

Spine folds Beeper threads into /api/omni/threads (source:beeper). beeper-warm-keeper holds the bridge live. XUI left panel already filters by source + persona.

4

Wire Beside SMS + dialer into the right panel

Beside inbound → omni (source:beside); /api/omni/send sends; keypad/contacts → /api/call-start; SMS → /send. Call lifecycle closed by /api/call-end.

5

Embed VVSVEI voice + muse into the middle panel

Mic (Web Speech → composer) + muse/3 webview already wired, echo-immune. Verify the iframe + mic both load. No new wiring.

6

Embed the browser

Middle webview = the WebView of the wrapper showing the same XUI. Native XenBrowser (:9999) is the Mac power tool, not required for GTM.

7

Wrap as the installable app

VVSVEI WebView wrapper: iOS WKWebView IPA + Android WebView APK, both loading the canonical XUI over https. Sign the IPA + publish the APK — that's the gap between "demoable" and "shippable."

8

Deploy gateDONE = passes the gate

Push → GitHub Pages. "Live" = HTTP 200 + no template tokens + real-browser render with ZERO console errors + spine health 200. Anything less is "deployed," not "live."

⚠ The single biggest GTM blocker

The whole live experience depends on the omnimind spine running only on the Mac (api.xlrd.org → Mac :4441 via Cloudflare tunnel). Mac sleeps or tunnel drops = every shell silently empties = "Mac-Death." Until the spine is redundant (always-on host or cloud fallback), the product is one closed laptop lid from total outage. Fix before GTM.

ATTEMPT-11 INVARIANTS (on the wall)
  1. ONE shell (XUI), ONE backend (spine), ONE source (xp/E:\hitthe.link → push).
  2. Reconcile the split-brain + fix chatId BEFORE adding features.
  3. Lock VVSVEI as the only wrapper. Electron + Capacitor archived.
  4. "Looks live" ≠ "is live" — the deploy gate is the only definition of done.
  5. No live secret in the repo; rotate nothing, scrub to keychain/SSH.