Skip to content
ULAP ONE
Research preview
AI-RAN Alliance · Working Group 3 · Work Item 6

ULAP ONE
SIDSense operator console

One GPU host running a private 5G network, a TV-white-space spectrum sensor and edge-AI video at the same time, so you can watch three workloads that normally need three boxes share one piece of silicon and one slice of spectrum.

This is a research preview, not a spectrum-access authority. On a 28-channel UHF survey measured 2026-08-04 in the Nairobi region (560 records, 10 occupied / 15 vacant / 3 ambiguous, ground truth derived from measured physics rather than annotation), the shipped sensing checkpoint detected 2 of 10 live multiplexes. Wiring in the physics detector — energy plus cyclostationary, the same unchanged checkpoint, both arms in one process, differing only in whether a calibrated control floor is passed — takes that to 10 of 10, with 0 of 15 vacant channels called occupied. The older “40 of 80” number came from a 2026-07-29 set that was entirely occupied: a detector answering OCCUPIED unconditionally also scores 80 of 80 on it, so it measured no discrimination at all. Still not clean: UHF 28 asserts OCCUPIED on 8 of 20 records, and that threshold was not moved. This caveat used to blame the threshold for calibration on synthetic noise; a measured receiver-noise null falsified that on 2026-08-05 — real receiver noise tops out at comb z = 2.289 against the synthetic 2.19, and 0 of 300 records reach the 3.5 threshold. The firing arrives through the antenna and its cause is now open: a genuine emission below the energy floor, which would mean the ground truth needs revising rather than the detector, or front-end intermodulation. The RX-gain sweep that separates them has not been run. The detector is opt-in and the running service is unchanged — with no calibrated control floor configured it falls back to the legacy CNN verdict and says so via occupancy_source, so a live verdict on these pages is the CNN’s unless a floor is set. Confidence is not accuracy. Use PAWS grant state as the authority and treat sensing as advisory. The full caveat, the synthesized-in-browser labels and the not-measured channels live on the sensing surface.
Waiting Not a snapshot Updated nothing has answered yet Sources 0 of 4 sources answering · 4 waiting
This console no answer yet Sensing API no answer yet Grafana no answer yet Prometheus no answer yet
Data provenance

Where every state on this page came from

Waiting

Identity

Read by
Your browser, over this origin. No server-side cache sits in between.
Mode
Live poll. This is not a snapshot and it is not a recording.
Last read
not yet
Sources
4

Measurements

This console
Waiting · never
GET /sensing.html, /cotenancy.html, /video.html, /workloads.html, /control-plane.html, /evidence.html, /explorer.html, /ulap-overview.html · every 30 s · this app's own prerendered pages — a build check, not a health check
Sensing API
Waiting · never
GET /api/tvws/api/v1/health · every 30 s · healthy
Grafana
Waiting · never
GET /grafana/api/health · every 30 s · grafana health API answered
Prometheus
Waiting · never
GET /prom/-/healthy · every 30 s · server healthy

Thresholds, and where they come from

Stale after 2.5 poll cadences (floor 4 s, cap 90 s)
Source: ui/src/lib/domain/liveness.svelte.ts — derived from wall clock, not set by the poll, so a loop that DIED is still detected
Not answering after 3 consecutive misses
Source: ui/src/lib/domain/liveness.svelte.ts — one miss is a blip, three is a fault
Static after 20 poll cadences with no change in the reported value (floor 60 s, cap 5 min)
Source: ui/src/lib/domain/liveness.svelte.ts — an ORTHOGONAL axis. A static source is still live: it answered. The two facts are separate because on 2026-08-03 a tile read 0.0 Mbps for fifteen minutes beside a chip that said "Live · just now". Only sources that report their value to feed.ok(id, value) are judged; the rest claim nothing.

What this proves

  • The build shipped that file and the web server is serving it.
  • The body is the right page: the probe reads a string only that page could have sent, so a 200 carrying somebody else's index.html reads as an unexpected response.
  • The service answered your browser over this origin, and the body proves it was that service and not a proxy front page.
  • For the sensing API and Grafana the probe asserts a field only that service returns, so a misrouted 200 is caught rather than counted.

What this does NOT prove

  • It does NOT mean anything behind the page works. Every one of these pages can be served in full while every service it polls is dead.
  • If you can read this roll-up at all, these pages are up by construction. Treat the count as a build check, not as a health check.
  • That a service answered does not mean the value it returns is correct. A green here means it responded, not that it is right.
  • A green sensing API is not an authorisation to transmit, and it says nothing about whether the classifier is accurate. On the 28-channel UHF survey of 2026-08-04 (560 records, 10 occupied / 15 vacant, ground truth from measured physics) the shipped checkpoint detected 2 of 10 live multiplexes and called 48 of 300 vacant records occupied. With the physics detector wired in — same unchanged checkpoint, one process, differing only in whether a calibrated control floor is passed — that becomes 10 of 10 multiplexes and 0 of 15 vacant channels. It is still not clean: UHF 28 asserts OCCUPIED on 8 of 20 records, and that threshold was not moved. This text used to blame the threshold for calibration on synthetic noise; a measured receiver-noise null falsified that on 2026-08-05, with real receiver noise topping out at comb z = 2.289 against the synthetic 2.19 and 0 of 300 records reaching 3.5. The firing arrives through the antenna and its cause is open between a genuine emission below the energy floor — which would mean the ground truth needs revising, not the detector — and front-end intermodulation.
  • The occupancy verdict this API returns is probably still the classifier's. The physics detector is opt-in: ModelSettings.control_floor_dbfs defaults to None, and with no calibrated floor the engine falls back to the legacy CNN verdict and reports occupancy_source: cnn-confidence. Read that field before reading the verdict.
  • These three are not the whole stack. Explorer probes all of the gateway routes and separates opt-in-not-deployed from deployed-and-failing using the control-api inventory, which this page does not read.

Environment

Two planes
The 8 prerendered pages are ONE feed source because they are one fact: the web server that served this page is still serving files. Each of the 3 stack services is its own source, because each is a separate claim.
Probe kind
Content, not status code. A 200 carrying the wrong body reads as an unexpected response, never as up.

Provenance

This console
GET /sensing.html, /cotenancy.html, /video.html, /workloads.html, /control-plane.html, /evidence.html, /explorer.html, /ulap-overview.html · every 30 s
Sensing API
GET /api/tvws/api/v1/health · every 30 s
Grafana
GET /grafana/api/health · every 30 s
Prometheus
GET /prom/-/healthy · every 30 s
Caveat, verbatim

A green card on the console plane is up by construction. It proves the build shipped that file and the web server is serving it, and nothing at all about the services the page polls.

Raw source

  • ui/src/lib/domain/surfaces.ts the probes and their expectations
Live surface check This console — 0 of 8 pages served · 8 still checking. The stack — 0 of 3 services answering · 3 still checking. Last sweep not yet

This console

Up by construction 8 prerendered pages
0 of 8 pages served · 8 still checking

This app's own prerendered pages, served by the same web server that served the page you are reading.

If you can read this roll-up at all, these pages are up by construction. Treat the count as a build check, not as a health check. Every one of these pages can be served in full while every service it polls is dead — which is precisely what happened on 2026-08-03, when this page scored a dead stack at 6 of 9.

The stack

The count that means something 3 services behind the gateway
Answering 0 / 3 live probe, this browser, every 30 s
Deployed but failing 0 a real red: brought up, not answering correctly
Opt-in, not deployed 0 absent by choice — in neither the numerator nor the failures
No safe probe 0 not asserted either way

The services behind the gateway. A green here is a contract-backed statement about the running system.

These three are not the whole stack. Explorer probes every gateway route and reads the control-api inventory, which is what lets it separate opt-in and never deployed from deployed and dead. This page reads the opt-in register from ui/src/lib/domain/gateway.ts but not the inventory, so on an opt-in route it can only say the component was not brought up and name the command that would bring it up.

Spectrum Sensing

/sensing.html
Dashboard this console

TVWS 470-698 MHz occupancy from the SIDSense CNN, with every unmeasured channel labelled as such and the over-the-air result stated up front.

Checking Not probed yet.

Edge AI Co-Tenancy

/cotenancy.html
Dashboard this console

The RAN and the AI tenant on one GPU. Mode, UE count and the isolation state as the scheduler actually reports them.

Checking Not probed yet.

Video Analytics

/video.html
Dashboard this console

Coastal-resilience video over the local break-out, with super-resolution running on the same GPU as the radio.

Checking Not probed yet.

Unified Workloads

/workloads.html
Console this console

Every container, its logs and its node and GPU metrics in one console. Capabilities tagged NOW, PHASE-1 or EXTENSION.

Checking Not probed yet.

Control Plane

/control-plane.html
Console this console

Subscriber, eSIM and stack actuation. The deepest surface here and the only one that changes state, which is why it is no longer the front door.

Checking Not probed yet.

Benchmark Evidence

/evidence.html
Research this console

What has actually been measured, and what may be concluded from it. Forty-five benchmark artefacts behind a persistent snapshot boundary.

Checking Not probed yet.

Explorer

/explorer.html
Research this console

What is built, what is running and what is missing. Probes every gateway route and separates opt-in-not-deployed from deployed-and-failing.

Checking Not probed yet.

ULAP Overview

/ulap-overview.html
Reference this console

What the stack is and how the pieces fit, for someone who has not seen it before.

Checking Not probed yet.

Sensing API

/api/tvws/docs
Service · /api/tvws/ the stack

The TVWS inference service itself: OpenAPI docs, the sense endpoint, and the model provenance the dashboard reads.

Checking Not probed yet.

Grafana

/grafana/
Service · /grafana/ the stack

Time-series panels for RAN throughput, GPU occupancy and sensing rate.

Checking Not probed yet.

Prometheus

/prom/graph
Service · /prom/ the stack

Raw PromQL against the scrape targets behind every panel on this stack.

Checking Not probed yet.

Status is a real fetch of each surface, performed by your browser when this page loaded and re-run every 30 seconds, and it checks response content and not just the status code, because at least one service behind these paths answers 200 with its own front page for any URL you ask it for. A card that says a surface answered has read something only that surface could have sent. The two counts above are kept apart on purpose: 8 of these 11 cards are this console's own prerendered pages, and if you can read this sentence they are up by construction.

How to read this page

What a green card proves, and what it does not

This console · 0 of 8 The stack · 0 of 3

Identity

Read by
Your browser, over this origin. Every probe is an origin-relative path.
Sweep
Every 30 s, starting when this page loaded
Last sweep
not yet
Console plane
8 prerendered pages of this app
Stack plane
3 services behind the gateway

Measurements

This console
0 of 8 pages served · 8 still checking
This app's own prerendered pages, served by the same web server that served the page you are reading.
The stack
0 of 3 services answering · 3 still checking
The services behind the gateway. A green here is a contract-backed statement about the running system.
Why there is no single percentage
The two counts answer different questions
Adding them produced "6 of 9 answering correctly" during a total backend outage. The numerator and the denominator meant two different things.

Thresholds, and where they come from

A card is green only if the BODY proves the surface expect(body) === true
Source: ui/src/lib/domain/surfaces.ts — a 200 alone is not enough, because at least one service behind these paths answers 200 with its own front page for any URL
The stack denominator excludes opt-in components nobody deployed deployed and probeable only
Source: ui/src/lib/domain/gateway.ts — ROUTES[].optIn is the single register of what is opt-in and what deploys it

What this proves

  • The build shipped that file and the web server is serving it.
  • The body is the right page: the probe reads a string only that page could have sent, so a 200 carrying somebody else's index.html reads as an unexpected response.
  • The service answered your browser over this origin, and the body proves it was that service and not a proxy front page.
  • For the sensing API and Grafana the probe asserts a field only that service returns, so a misrouted 200 is caught rather than counted.

What this does NOT prove

  • It does NOT mean anything behind the page works. Every one of these pages can be served in full while every service it polls is dead.
  • If you can read this roll-up at all, these pages are up by construction. Treat the count as a build check, not as a health check.
  • That a service answered does not mean the value it returns is correct. A green here means it responded, not that it is right.
  • A green sensing API is not an authorisation to transmit, and it says nothing about whether the classifier is accurate. On the 28-channel UHF survey of 2026-08-04 (560 records, 10 occupied / 15 vacant, ground truth from measured physics) the shipped checkpoint detected 2 of 10 live multiplexes and called 48 of 300 vacant records occupied. With the physics detector wired in — same unchanged checkpoint, one process, differing only in whether a calibrated control floor is passed — that becomes 10 of 10 multiplexes and 0 of 15 vacant channels. It is still not clean: UHF 28 asserts OCCUPIED on 8 of 20 records, and that threshold was not moved. This text used to blame the threshold for calibration on synthetic noise; a measured receiver-noise null falsified that on 2026-08-05, with real receiver noise topping out at comb z = 2.289 against the synthetic 2.19 and 0 of 300 records reaching 3.5. The firing arrives through the antenna and its cause is open between a genuine emission below the energy floor — which would mean the ground truth needs revising, not the detector — and front-end intermodulation.
  • The occupancy verdict this API returns is probably still the classifier's. The physics detector is opt-in: ModelSettings.control_floor_dbfs defaults to None, and with no calibrated floor the engine falls back to the legacy CNN verdict and reports occupancy_source: cnn-confidence. Read that field before reading the verdict.
  • These three are not the whole stack. Explorer probes all of the gateway routes and separates opt-in-not-deployed from deployed-and-failing using the control-api inventory, which this page does not read.

Environment

Where the probes run
In your browser, not on the server. A card is what YOU can reach, which is the question a launcher should answer.
Opt-in resolution
This page reads gateway.ts for the opt-in record but does not fetch the control-api inventory, so it cannot separate "never deployed" from "deployed and dead". Explorer fetches the inventory and does separate them.

Provenance

Spectrum Sensing
/sensing.html · console plane
Edge AI Co-Tenancy
/cotenancy.html · console plane
Video Analytics
/video.html · console plane
Unified Workloads
/workloads.html · console plane
Control Plane
/control-plane.html · console plane
Benchmark Evidence
/evidence.html · console plane
Explorer
/explorer.html · console plane
ULAP Overview
/ulap-overview.html · console plane
Sensing API
/api/tvws/api/v1/health · stack plane
Grafana
/grafana/api/health · stack plane
Prometheus
/prom/-/healthy · stack plane
Caveat, verbatim

8 of the 11 surfaces on this page are this console's own prerendered pages, served by the same web server that served the page you are reading. If you can read this at all, they are up by construction. They are counted separately from the 3 stack services and the two counts are never added, because a dead stack used to score 6 of 9 here.

Raw source

  • ui/src/lib/domain/surfaces.ts the probes, the expectations and the plane field
  • ui/src/lib/domain/gateway.ts the opt-in register
  • docs/CONSOLE-AUDIT-2026-08-03.md the outage measurement that produced this rebuild
Amini Amini Infratech for the Global South

Every link and every data fetch on this console is origin-relative. One origin fans out by path: / gateway, /video/, /grafana/, /prom/, /api/. An absolute http://localhost:NNNN URL works on exactly one machine, the one it was written on, and is blocked as mixed content the moment the page is served over https, which is how every operator actually reaches this stack.