From 4483a88b226ca6b6586fc93d223bcfa05c5eb719 Mon Sep 17 00:00:00 2001 From: ruv Date: Sun, 26 Apr 2026 21:14:18 -0400 Subject: [PATCH] feat(dashboard): wire all rail buttons + add Ghost Murmur view MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously the Inspector and Witness rail buttons did nothing useful. The Ghost Murmur research spec from docs/research/quantum-sensing/16-ghost-murmur-ruview-spec.md had no in-dashboard surface at all. Both addressed. ## nv-rail - Inspector button → view='inspector', pins inspector to Signal tab - Witness button → view='witness', pins inspector to Witness tab - New Ghost Murmur button (ghost-shaped svg) → view='ghost-murmur' - All 5 nav buttons + Settings now functional ## nv-app - View union extended: scene | apps | inspector | witness | ghost-murmur - Main area swaps between , , - nv-inspector receives a `pinTab` prop forcing Signal/Witness tab when the user clicks the corresponding rail button ## nv-ghost-murmur (new view) - Full research view summarising the publicly-reported April 2026 CIA NV-diamond heartbeat program and RuView's 3-tier mesh equivalent - Sections: news context, physics reality check, RuView mapping table, $165 build BoM + honest performance, privacy/ethics/legal, refs - Links out to the spec doc, public gist, issue #437, Sci Am article - Content sourced verbatim from the on-disk research spec ## nv-inspector pinTab - Implements willUpdate() so parent-driven tab pin happens within the same render pass, fixing a Lit "update after update" warning Validated end-to-end with `npx agent-browser` against the live GitHub Pages deploy at https://ruvnet.github.io/RuView/nvsim/ — all 5 rail buttons work, Ghost Murmur view renders 7 sections / 9 cards / 4 outbound links, witness verification still passes. Co-Authored-By: claude-flow --- dashboard/src/components/nv-app.ts | 14 +- dashboard/src/components/nv-ghost-murmur.ts | 339 ++++++++++++++++++++ dashboard/src/components/nv-inspector.ts | 16 +- dashboard/src/components/nv-rail.ts | 18 +- 4 files changed, 379 insertions(+), 8 deletions(-) create mode 100644 dashboard/src/components/nv-ghost-murmur.ts diff --git a/dashboard/src/components/nv-app.ts b/dashboard/src/components/nv-app.ts index 8e54ba8a..bdfb8629 100644 --- a/dashboard/src/components/nv-app.ts +++ b/dashboard/src/components/nv-app.ts @@ -17,8 +17,9 @@ import './nv-palette'; import './nv-debug-hud'; import './nv-settings-drawer'; import './nv-onboarding'; +import './nv-ghost-murmur'; -export type View = 'scene' | 'apps' | 'settings'; +export type View = 'scene' | 'apps' | 'inspector' | 'witness' | 'ghost-murmur'; @customElement('nv-app') export class NvApp extends LitElement { @@ -78,9 +79,16 @@ export class NvApp extends LitElement {
- ${this.view === 'apps' ? html`` : html``} + ${this.view === 'apps' + ? html`` + : this.view === 'ghost-murmur' + ? html`` + : html``}
- + + diff --git a/dashboard/src/components/nv-ghost-murmur.ts b/dashboard/src/components/nv-ghost-murmur.ts new file mode 100644 index 00000000..1c6a7e98 --- /dev/null +++ b/dashboard/src/components/nv-ghost-murmur.ts @@ -0,0 +1,339 @@ +/* Ghost Murmur — research view. + * + * Walks through the publicly-reported April 2026 CIA program and maps + * the physically-defensible parts onto RuView's three-tier heartbeat + * mesh. Source: docs/research/quantum-sensing/16-ghost-murmur-ruview-spec.md + * + * This view is reference material, not an operational mode. It exists + * so practitioners (and journalists) can audit the physics-vs-press + * gap in the open. ADR-092 §14b. + */ + +import { LitElement, html, css } from 'lit'; +import { customElement } from 'lit/decorators.js'; + +@customElement('nv-ghost-murmur') +export class NvGhostMurmur extends LitElement { + static styles = css` + :host { + display: block; + height: 100%; + overflow-y: auto; + background: radial-gradient(ellipse at 50% 30%, var(--bg-2) 0%, var(--bg-0) 70%); + padding: 24px 28px 60px; + } + h1 { + margin: 0 0 4px; + font-size: 22px; + letter-spacing: -0.02em; + color: var(--ink); + } + .subtitle { + color: var(--ink-3); + font-size: 13px; + margin-bottom: 22px; + } + .links { + display: flex; flex-wrap: wrap; gap: 6px; + margin-bottom: 22px; + } + .links a { + padding: 5px 10px; + background: var(--bg-2); + border: 1px solid var(--line); + border-radius: 999px; + font-size: 11.5px; + font-family: var(--mono); + color: var(--accent-2); + text-decoration: none; + } + .links a:hover { border-color: var(--accent-2); } + h2 { + font-size: 14px; + font-weight: 600; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var(--ink-3); + margin: 28px 0 10px; + } + .grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 12px; + } + .card { + background: var(--bg-2); + border: 1px solid var(--line); + border-radius: var(--radius); + padding: 14px; + } + .card h3 { + margin: 0 0 8px; + font-size: 13.5px; font-weight: 600; + color: var(--ink); + } + .card p { + font-size: 12.5px; color: var(--ink-2); + margin: 0 0 8px; + line-height: 1.5; + } + .card p:last-child { margin-bottom: 0; } + .stat { + display: inline-flex; align-items: baseline; gap: 6px; + margin-right: 10px; + } + .stat .v { + font-family: var(--mono); font-size: 16px; font-weight: 600; + color: var(--accent); + } + .stat .l { + font-size: 10px; color: var(--ink-3); + text-transform: uppercase; letter-spacing: 0.04em; + } + table { + width: 100%; border-collapse: collapse; + font-size: 12.5px; + } + th, td { + padding: 8px 10px; + text-align: left; + border-bottom: 1px solid var(--line); + } + th { + color: var(--ink-3); + font-weight: 600; + font-size: 11px; + text-transform: uppercase; + letter-spacing: 0.06em; + } + td.amber { color: var(--accent); font-family: var(--mono); } + td.cyan { color: var(--accent-2); font-family: var(--mono); } + td.bad { color: var(--bad); font-family: var(--mono); } + .pill { + display: inline-block; + padding: 1px 6px; + border-radius: 4px; + font-family: var(--mono); + font-size: 10px; + border: 1px solid var(--line); + } + .pill.ok { color: var(--ok); border-color: oklch(0.78 0.14 145 / 0.4); } + .pill.skeptical { color: var(--bad); border-color: oklch(0.65 0.22 25 / 0.4); } + .pill.partial { color: var(--warn); border-color: oklch(0.7 0.18 35 / 0.4); } + .architecture { + font-family: var(--mono); + font-size: 11px; + color: var(--ink-2); + background: var(--bg-3); + padding: 16px; + border-radius: var(--radius-sm); + border: 1px solid var(--line); + white-space: pre; + overflow-x: auto; + line-height: 1.4; + } + .ethics { + background: linear-gradient(180deg, var(--bg-2) 0%, oklch(0.65 0.22 25 / 0.04) 100%); + border: 1px solid oklch(0.65 0.22 25 / 0.25); + border-radius: var(--radius); + padding: 16px; + } + .ethics h3 { color: var(--bad); margin-top: 0; } + .ethics ul { padding-left: 18px; margin: 8px 0; } + .ethics li { font-size: 12.5px; color: var(--ink-2); margin-bottom: 4px; } + `; + + override render() { + return html` +

Ghost Murmur — open-source reality check

+
+ The physics-vs-press audit for the publicly-reported April 2026 + CIA NV-diamond heartbeat detector, and how RuView's existing + stack maps onto an honest, civilian version of the same idea. +
+ + + +

What the press reported

+
+
+

The story

+

3 Apr 2026: USAF F-15E pilot "Dude 44 Bravo" goes down in southern Iran during the regional exchange and evades for ~2 days.

+

President Trump publicly suggests detection from 40 miles away on a mountainside at night; CIA Director Ratcliffe says "invisible to the enemy, but not to the CIA."

+
+
+

The named tech

+

"Ghost Murmur" — Lockheed Skunk Works system using NV defects in synthetic diamond + AI to extract a heartbeat from environmental noise.

+

Outlets: Newsweek, Scientific American, Military.com, WION, Open The Magazine, Yahoo, Calcalist + HN thread #47679241.

+
+
+

What physicists said

+

Wikswo (Vanderbilt), Orzel (Union College), Roth (Oakland) — all pushing back hard.

+

"At 1 km, the heartbeat field drops to ~10⁻¹² of its 10 cm value." MCG-only at multi-mile range is not consistent with published physics.

+
+
+ +

Physics reality check

+
+ + + + + + + + + + + +
DistanceCardiac MCG (peak QRS)vs Earth field (~50 µT)
10 cm50 pT10⁹× weaker
1 m50 fT10¹²× weaker
10 m50 aT10¹⁵× weaker
1 km5 × 10⁻²³ T10²⁷× weaker
40 mi (65 km)~10⁻²⁸ T10³³× weaker
+

+ Best published NV-ensemble lab record: 0.9 pT/√Hz [Wolf 2015]. + Best SQUID in a shielded room: ~1 fT/√Hz. To detect a single heartbeat at 10 m + you'd need ~2 billion× more sensitivity than any published ensemble has ever shown, + in a magnetically silent environment. 40 miles is press-release physics. +

+
+ +

RuView's three-tier mesh — what is actually buildable

+
┌──────────────────────────┐ + │ Tier 3 — NV-diamond │ Range: 0.1–2 m (lab) + │ magnetometer ring │ Status: nvsim simulator only + │ (close-confirm) │ Hardware: $$$ (≥$8k DNV-B1) + └──────────┬───────────────┘ + │ + ┌──────────┴───────────────┐ + │ Tier 2 — 60 GHz FMCW │ Range: 1–10 m HR/BR + │ mmWave radar mesh │ Status: shipping (ADR-021) + │ (vital signs, posture) │ Hardware: $15 (MR60BHA2 + ESP32-C6) + └──────────┬───────────────┘ + │ + ┌──────────┴───────────────┐ + │ Tier 1 — WiFi CSI mesh │ Range: 10–30 m through-wall + │ (presence, breathing, │ Status: shipping (ADR-014, ADR-029) + │ pose, intention) │ Hardware: $9 (ESP32-S3 8MB) + └──────────┬───────────────┘ + │ + ▼ + ┌────────────────────────────────┐ + │ RuvSense multistatic fusion │ + │ + cross-viewpoint attention │ + │ + AETHER re-ID embeddings │ + │ + Cramer-Rao gating │ + └────────────────────────────────┘
+ +

Press claim → RuView equivalent

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Press claimRuView equivalent todayCrate / ADRHonest range
NV-diamond magnetometryDeterministic NV pipeline simulatornvsim · ADR-089Simulator only
"AI strips environmental noise"RuvSense multistatic fusion + AETHERsignal/ruvsense/ · ADR-029Mature
Heartbeat at distance60 GHz FMCW HR/BR + WiFi CSI breathingvitals · ADR-0211–5 m HR · 10–30 m presence
Long-range localisationMultistatic time-of-flight + CRLBruvector/viewpoint/Limited by node spacing
40-mile single-heartbeat detectionNot feasible at any tierPress-release physics
+
+ +

Build today on $165

+
+
+

Bill of materials

+

+ 3 × ESP32-S3 8 MB ($9 ea)
+ 3 × PoE injector + cat6 ($6 ea)
+ 1 × ESP32-C6 + Seeed MR60BHA2 ($15)
+ 1 × Raspberry Pi 5 8 GB ($80)
+ 1 × unmanaged GbE switch ($25) +

+

Total: $165

+
+
+

Honest performance

+ 95%TPR (LOS, 0–15 m)

+ ±2 bpmHR (LOS 0–3 m)

+ ±1 br/minBR (any mode)

+ ~10 cmpose error

+ 80–150 msend-to-end latency +
+
+

Determinism

+

Same (scene, config, seed) → byte-identical SHA-256 witness across browsers, OSes, transports.

+

Reference: cc8de9b01b0ff5bd…

+

Try the Witness tab on the right — it re-derives the hash live in this browser and compares against the published reference.

+
+
+ +

Privacy, ethics, legal

+
+

This is the open-source version. Same physics, opposite governance.

+
    +
  • Civilian opt-in only — search-and-rescue, elder-care, occupancy, ICU vitals. Not surveillance.
  • +
  • No directional pursuit — no beam-steering, target-following, or remote person-of-interest tracking.
  • +
  • Data minimisation — fused output is (presence, HR, BR, pose, p_alive); raw streams discarded at the edge.
  • +
  • PII gates (ADR-040) block identifying biometric streams from leaving the local mesh without consent.
  • +
  • Adversarial-signal detection flags physically-impossible signal patterns from compromised mesh nodes.
  • +
  • No export-controlled hardware — RuView targets < $50 COTS. ITAR/EAR sub-THz coherent radars and shielded NV ensembles are out of scope.
  • +
+

+ RuView is not affiliated with the United States government, the CIA, Lockheed Martin, + or any classified program. References to "Ghost Murmur" in this view refer + exclusively to the publicly-reported program of that name as covered in the open + press in April 2026. +

+
+ +

Cross-references

+
+

+ ADRs: 014 (signal) · 021 (vitals) · 024 (AETHER) · 027 (MERIDIAN) · + 028 (witness audit) · 029 (RuvSense) · 040 (PII gates) · 086 (ESP32 RaBitQ) · + 089 (nvsim, Accepted) · 090 (Lindblad, Proposed-conditional) · + 091 (sub-THz radar research) · 092 (this dashboard).

+ Primary physics: Cohen 1970 · Bison 2009 · Wolf 2015 · Barry RMP 2020 · Doherty 2013 · Jackson 3e §5.6/§5.8. +

+
+ `; + } +} diff --git a/dashboard/src/components/nv-inspector.ts b/dashboard/src/components/nv-inspector.ts index e33690c1..158cab38 100644 --- a/dashboard/src/components/nv-inspector.ts +++ b/dashboard/src/components/nv-inspector.ts @@ -1,6 +1,6 @@ /* Inspector — tabbed: Signal / Frame / Witness. */ -import { LitElement, html, css, svg } from 'lit'; -import { customElement, state } from 'lit/decorators.js'; +import { LitElement, html, css, svg, type PropertyValues } from 'lit'; +import { customElement, state, property } from 'lit/decorators.js'; import { effect } from '@preact/signals-core'; import { traceX, traceY, traceZ, stripBars, lastFrame, @@ -13,6 +13,8 @@ type Tab = 'signal' | 'frame' | 'witness'; @customElement('nv-inspector') export class NvInspector extends LitElement { @state() private tab: Tab = 'signal'; + /** When set by the parent, force the tab and pulse-highlight it. */ + @property({ attribute: false }) pinTab: Tab | null = null; static styles = css` :host { @@ -123,6 +125,16 @@ export class NvInspector extends LitElement { }); } + override willUpdate(changed: PropertyValues): void { + // Apply parent-driven tab pin during willUpdate so the new tab value + // participates in this same render pass — avoids the "update after + // update completed" Lit warning that would fire if we did this in + // updated(). + if (changed.has('pinTab') && this.pinTab && this.tab !== this.pinTab) { + this.tab = this.pinTab; + } + } + private async verify(): Promise { const c = getClient(); if (!c) return; witnessVerified.value = 'pending'; diff --git a/dashboard/src/components/nv-rail.ts b/dashboard/src/components/nv-rail.ts index bca45c0f..d947c7b3 100644 --- a/dashboard/src/components/nv-rail.ts +++ b/dashboard/src/components/nv-rail.ts @@ -50,6 +50,7 @@ export class NvRail extends LitElement { content: ''; position: absolute; left: -10px; top: 8px; bottom: 8px; width: 2px; background: var(--accent); border-radius: 2px; } + .btn.ghost.active::before { background: var(--accent-3); } .spacer { flex: 1; } svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.8; } `; @@ -69,16 +70,27 @@ export class NvRail extends LitElement { @click=${() => this.navigate('apps')}> - - +
`; }