Threat prioritization under uncertainty
A decision-support prototype. Given tracks with incomplete and unequally trustworthy information, it answers two different questions from one belief state.
Fully simulated data. Every constant is a synthetic placeholder and represents no real system.
Two minutes eleven seconds. Guided mode pauses at each beat with a note on what to watch.
The two questions
What to act on now
Ranked by expected consequence, computed per sampled world and then aggregated — so a rank is a distribution, not a number. Uncertainty is the width of the band, never a bonus added to the score.
Where to look next
Ranked by expected regret: how much worse the committed set becomes if this track's uncertainty resolves badly. A dangerous track we are certain about scores exactly zero — there is nothing left to learn.
Conflating those is the standard failure mode. A track that is dangerous and well characterised belongs at the top of the first list and the bottom of the second.
Try it
The demo runs entirely in the browser — no backend, no network calls, nothing is collected. Press Play, or use the controls to inject tracks, degrade confidence, and override the ranking by hand.
Three things a reviewer usually asks
- Why doesn't uncertainty raise the score? It is already represented, in the width. Adding a bonus would count it twice. Risk aversion changes the functional — mean to CVaR of the worst decile — not the score.
-
Why is staleness variance growth rather than a penalty? Because a stale
mean is not wrong, it is the last thing we knew.
σ² += q·Δt + (rel·Δt)²is covariance propagation with the measurement update removed — which is exactly the situation. - What is the attention column computing? Not entropy. Expected regret against the committed set, so uncertainty only counts where it could change the decision. Pinned by tests with hand-computable answers to a tolerance of 1e-12.
Scope
Deliberately excluded: multi-source fusion, asset or interceptor assignment, geospatial views, learned models. Every weight lives in one documented file because the goal is a prioritization core that can be argued with, not one that hides its reasoning. The engine directory imports nothing outside itself and can be run and challenged on its own.
81 tests. The full scenario runs headless with no browser and produces byte-identical output across runs; that dump is in the package.