How it's wired Tepna
← the -Dex suite · fusion layer

🧠Integrator

The Integrator is the suite’s integration centre — not a receptor. Afferent node exports converge here and become one coherent percept: the longitudinal, cross-signal picture no single receptor can produce. It senses nothing itself; it fuses.

Role in the arc
Integration centrefuses afferent nodes
Consumes
Every node’s exportganglior.node-export · .crossnight
Input format
Ganglior JSON1–N exports · + fascia alias
Produces
Fused perceptsame-night + longitudinal
01 — WHAT IT'S FOR

The integration centre

Read the suite as a reflex arc: receptors → relay → integration → insight. The Integrator is the integration stage — afferent signals converge and become a single percept. It depends only on the CORE export contract, never on any node’s internals, so nodes stay independent and standalone.

🧠
It fuses; it never senses. The Integrator computes no number from a raw signal. It consumes what receptors emit onto the Ganglior bus and weaves them together — cross-signal work that is the Integrator’s job, never a node’s.
02 — THE WIRING

The file stack

The Integrator is built from external *.js files referenced by Integrator.src.html and bundled to a standalone Integrator.html. It has no registry of its own — it preserves each node’s evidence badge and provenance, reading the shared CORE export schema rather than redefining metrics. Dependencies point downhill: UI → fusion DSP → CORE contract.

DSP
integrator-dsp.jsDSP
The fusion core: parse + normalize every node’s ganglior.node-export, time-align events on the shared floating clock, and run per-signal authority fusion (effConf = conf × sqi). Accepts the bus name and its fascia alias. No DOM — pure data.
Core
kernel-constants.jsCore · shared
The frozen physiology kernel — one source of truth for every cross-fleet threshold, plus a content-derived hash stamped into each export so two bundles built on different rulebooks can’t silently “agree” when fused.
ganglior-provenance.jsCore · shared
Loaded first — installs the read-hook that makes every export attributable to the exact code + inputs that produced it (the buildHash provenance stamp). 100% local.
metric-registry.jsCore · shared
The shared half of the evidence system: the badge SHAPE, depth tiering and the injected badge CSS. The per-node registry below supplies the DATA, so a Validated dot looks identical in every node.
crossnight-envelope.jsCore · shared
The shared, versioned shape (ganglior.crossnight v1.0) every node emits and the Integrator reads — the container, not the math (the local crossNight() stats stay per-node).
(no node registry)Core
The Integrator declares no metric registry of its own — it preserves each node’s evidence badge and provenance, reading the shared CORE schema rather than redefining metrics.
Render · UI
integrator-render.jsRender · UI
DOM + hand-rolled inline-SVG rendering: node chips, the same-night fusion view, cross-signal coupling plots and the longitudinal trends. Reads helpers off IntegratorDSP; does no parsing or fusion math.
App · glue
integrator-app.jsApp · glue
Glue: drag-drop + picker ingest, dedupe, run fusion, render, and export / write-back of producer-side correlations to a peer node’s reserved slot. Wiring only — no DOM construction.
Fusion · cross-night
integrator-longitudinal.jsFusion · cross-night
Orthogonal cross-night read: consumes ganglior.crossnight envelopes, persists each node’s daily summaries to IndexedDB, and date-joins them across nodes to surface couplings no single node sees — durable across reloads, no network.
🕒
The Clock Contract, verbatim. The Integrator mirrors parseTimestamp / fmtClock locally and aligns every node on floating wall-clock tMs read back with getUTC* — the one thing that makes cross-node simultaneity hold without any node sharing a timezone.
03 — HOW IT'S ACHIEVED

From many exports to one percept

Fusion runs in two orthogonal planes: same-night (align and reconcile events recorded the same night) and longitudinal (date-join daily summaries across weeks). Both obey the same honesty rules — authority is per-signal and quality-gated, and confidence is never conflated with signal quality.

Drop the node exports

Drag one or more ganglior.node-export JSON files (from OxyDex, ECGDex, PulseDex, …) onto the picker. Two or more from the same night is where fusion earns its keep.

integrator-app.js → ingest + dedupe

Normalize + stamp the clock

Each export is parsed to a common NodeRec on floating wall-clock tMs, read back with getUTC* — so two devices that recorded the same minute align without sharing a timezone.

integrator-dsp.js → parseTimestamp (mirrored)

Time-align the events

Events from different nodes are matched within a tolerance window (~120 s, configurable) so a desaturation and an autonomic surge that belong together are paired, not double-counted.

runFusion({ toleranceSec })

Fuse by per-signal authority

Authority is assigned per signal and quality-gated: the gold source yields to a clean backup when its own SQI trips. Confidence is attenuated by quality — effConf = conf × sqi — never collapsed into one number.

integrator-dsp.js → per-signal authority

Render + write back

Same-night fusion, cross-signal couplings and the durable longitudinal trends are drawn; producer-side correlations are written back to a peer node’s reserved slot.

integrator-render.js + integrator-longitudinal.js
04 — HOW MUCH TO TRUST IT

Evidence is inherited, then composed

The Integrator does not invent a grade — it carries each node’s evidence badge through so a validated dot looks identical post-fusion. Its own contributions (couplings, fused readiness, projections) sit lower on the ladder, honestly marked as composed rather than measured.

Measured (none) — the Integrator computes nothing from raw signal; it fuses node outputs
Validated Pass-through of each node’s validated metrics — provenance + evidence badge preserved
Emerging Cross-signal couplings · AHI↔ODI concordance · autonomic-recovery ↔ ODI-4 trend
Experimental Same-night fused readiness · multi-node confidence weighting
Heuristic Multi-week longitudinal projections across nodes
05 — LIMITATIONS & CONSIDERATIONS

What it can and can't say

Honesty is architectural: a guess is never dressed as a measurement, a missing value stays null rather than fabricated, and confidence is kept separate from signal quality. The fusion-specific caveats:

Capability before consensusby design

When sources disagree the Integrator does not count devices — it filters to the sensors that can observe the signal, checks plausibility, and looks for the obligate physiological consequence.

No single “best device”note

Authority is per-signal. Chest ECG owns HRV magnitude but yields to wrist PPG for HR when its battery dies; a node declares what it is authoritative for, not that it is best.

Confidence ≠ qualitycaution

An event’s severity (conf) and its signal quality (sqi) are separate axes. Fusion attenuates via effConf = conf × sqi — never merged, so a strong reading from a noisy sensor is discounted, not trusted.

Needs at least one exportlimitation

The Integrator has no signal of its own — it is the integration centre, not a receptor. With one node it summarizes; the cross-signal value appears only when nights overlap.

06 — HOW TO USE IT

For the curious, and for the next coder

📂

Open the instrument

The Integrator is one self-contained file. Open Integrator.html in any browser — online, offline, or from file://. Nothing installs, nothing phones home.

Open the Integrator →
📥

Drop your node exports

Export a ganglior.node-export JSON from each -Dex node, then drop them all here. Overlapping nights unlock the cross-signal view; a single export still summarizes.

🔀

Read the fusion

The same-night view reconciles events across sensors by per-signal authority; the longitudinal view date-joins daily summaries to surface couplings — e.g. declining autonomic recovery tracking rising ODI-4 over weeks.

🗃️

It remembers

Longitudinal history persists to IndexedDB on your device, so trends accumulate across sessions. It survives reload; it never leaves the browser. Clear it any time.

🛠️

If you’re changing it

Edit integrator-*.js or Integrator.src.htmlnever the bundled Integrator.html — then re-bundle. Run Dex-Test-Suite.html until all-green, and verify-provenance.html after re-bundling.