 ✓ src/engine/__tests__/engine.test.ts > classification concentration: width, not level > leaves the mean score essentially unchanged
 ✓ src/engine/__tests__/engine.test.ts > classification concentration: width, not level > materially narrows the spread when evidence is strong
 ✓ src/engine/__tests__/engine.test.ts > classification concentration: width, not level > gives the weakly-evidenced track the wider rank band
 ✓ src/engine/__tests__/engine.test.ts > determinism > produces identical output for the same seed
 ✓ src/engine/__tests__/engine.test.ts > determinism > produces different output for a different seed
 ✓ src/engine/__tests__/engine.test.ts > determinism > agrees between seeds on the ordering it is confident about
 ✓ src/engine/__tests__/engine.test.ts > slack behaviour > flags a track whose response window has closed and scores it zero
 ✓ src/engine/__tests__/engine.test.ts > slack behaviour > still counts a closed-window track in the baseline column
 ✓ src/engine/__tests__/engine.test.ts > slack behaviour > a track straddling the deadline gets a wide band and real attention
 ✓ src/engine/__tests__/engine.test.ts > risk posture > AVERSE promotes the heavy upper tail without any uncertainty bonus in the score
 ✓ src/engine/__tests__/engine.test.ts > degenerate boards > handles zero tracks
 ✓ src/engine/__tests__/engine.test.ts > degenerate boards > handles a single track
 ✓ src/engine/__tests__/engine.test.ts > degenerate boards > handles a board where every field is a population prior
 ✓ src/engine/__tests__/engine.test.ts > degenerate boards > handles a board that has gone entirely stale
 ✓ src/engine/__tests__/engine.test.ts > staleness moves attention without moving action rank > a track that stops updating climbs attention while holding its action rank
 ✓ src/sim/__tests__/scenario.test.ts > beat 1 — opening state is legible > action #1 is the confident, high-consequence track
 ✓ src/sim/__tests__/scenario.test.ts > beat 1 — opening state is legible > attention #1 is the track nothing is known about
 ✓ src/sim/__tests__/scenario.test.ts > beat 1 — opening state is legible > the two columns disagree, which is the entire point
 ✓ src/sim/__tests__/scenario.test.ts > beat 2 — a decisive report resolves the ambiguous track > TRK-03 leaves both columns once it is classified as clutter
 ✓ src/sim/__tests__/scenario.test.ts > beat 2 — a decisive report resolves the ambiguous track > learning shows up as concentration, not as a moved mean
 ✓ src/sim/__tests__/scenario.test.ts > beat 3 — sensor dropout ages beliefs without moving them > kinematic uncertainty separates sharply from the tracks still reporting
 ✓ src/sim/__tests__/scenario.test.ts > beat 3 — sensor dropout ages beliefs without moving them > rank bands widen for dropped tracks and stay tight for reporting ones
 ✓ src/sim/__tests__/scenario.test.ts > beat 3 — sensor dropout ages beliefs without moving them > attention rises for the dropped tracks near the decision boundary
 ✓ src/sim/__tests__/scenario.test.ts > beat 3 — sensor dropout ages beliefs without moving them > action ranks are held, not scrambled, by the dropout itself
 ✓ src/sim/__tests__/scenario.test.ts > beat 4 — a raid arrives without destabilising the action column > the board grows to twenty tracks
 ✓ src/sim/__tests__/scenario.test.ts > beat 4 — a raid arrives without destabilising the action column > the action top two are unchanged across the injection
 ✓ src/sim/__tests__/scenario.test.ts > beat 4 — a raid arrives without destabilising the action column > the attention column immediately reprioritises onto the new tracks
 ✓ src/sim/__tests__/scenario.test.ts > beat 5 — classification moves a track up the action column > the resolved raid track climbs several ranks and roughly doubles its score
 ✓ src/sim/__tests__/scenario.test.ts > beat 6 — a track crosses its response deadline > TRK-02 peaks and then leaves the actionable list, unscripted
 ✓ src/sim/__tests__/scenario.test.ts > beat 6 — a track crosses its response deadline > it becomes an attention priority exactly while it straddles the deadline
 ✓ src/sim/__tests__/scenario.test.ts > beat 6 — a track crosses its response deadline > the naive baseline gets this case wrong, visibly
 ✓ src/sim/__tests__/scenario.test.ts > reproducibility and isolation > two runs of the same scenario are byte-identical
 ✓ src/sim/__tests__/scenario.test.ts > reproducibility and isolation > ground truth cannot leak into the engine
 ✓ src/sim/__tests__/scenario.test.ts > reproducibility and isolation > every track stays inside the stated board size
 ✓ src/engine/__tests__/voi.test.ts > expected-regret attention > case 1: no uncertainty means no attention
 ✓ src/engine/__tests__/voi.test.ts > expected-regret attention > case 2: analytic expected value is exactly 2.5
 ✓ src/engine/__tests__/voi.test.ts > expected-regret attention > case 3: certain and dangerous scores exactly zero
 ✓ src/engine/__tests__/voi.test.ts > expected-regret attention > case 4: uncertain but irrelevant scores zero
 ✓ src/engine/__tests__/voi.test.ts > expected-regret attention > case 5: swap deltas are never negative, under fuzz
 ✓ src/engine/__tests__/voi.test.ts > expected-regret attention > is not an uncertainty sort: the pivotal track outranks the noisier one
 ✓ src/engine/__tests__/voi.test.ts > expected-regret attention > degenerate boards do not throw
 ✓ src/engine/__tests__/stability.test.ts > stability across seeds, 20 tracks > the action top-3 set, and the top-ranked track, are identical under every seed
 ✓ src/engine/__tests__/stability.test.ts > stability across seeds, 20 tracks > only genuinely tied tracks change places between seeds
 ✓ src/engine/__tests__/stability.test.ts > stability across seeds, 20 tracks > the attention top-3 set is identical under every seed
 ✓ src/engine/__tests__/stability.test.ts > stability across seeds, 20 tracks > mean scores agree between seeds to within Monte Carlo error
 ✓ src/engine/__tests__/stability.test.ts > stability across seeds, 20 tracks > pTop3 is a well-conditioned statistic
 ✓ src/engine/__tests__/stability.test.ts > stability across seeds, 20 tracks > reported rank bands do not swing between seeds
 ✓ src/engine/__tests__/propagate.test.ts > propagation: staleness inflates variance and never moves the mean > variance grows as process noise plus a quadratic velocity-uncertainty term
 ✓ src/engine/__tests__/propagate.test.ts > propagation: staleness inflates variance and never moves the mean > the quadratic term dominates over the timescale of a demo
 ✓ src/engine/__tests__/propagate.test.ts > propagation: staleness inflates variance and never moves the mean > the mean is never modified
 ✓ src/engine/__tests__/propagate.test.ts > propagation: staleness inflates variance and never moves the mean > sigma is capped so an abandoned track degrades to unknown, not to nonsense
 ✓ src/engine/__tests__/propagate.test.ts > propagation: staleness inflates variance and never moves the mean > classification evidence decays monotonically toward the uniform prior
 ✓ src/engine/__tests__/propagate.test.ts > propagation: staleness inflates variance and never moves the mean > classification ages more slowly than kinematics
 ✓ src/engine/__tests__/propagate.test.ts > propagation: staleness inflates variance and never moves the mean > a track with everything imputed still propagates without throwing
 ✓ src/engine/__tests__/propagate.test.ts > slack window > is exactly zero once the response window has closed
 ✓ src/engine/__tests__/propagate.test.ts > slack window > peaks at the deadline and decreases monotonically with slack
 ✓ src/engine/__tests__/propagate.test.ts > slack window > falls steeply inside the near window and gently beyond it
 ✓ src/engine/__tests__/random.test.ts > samplers > the PRNG is deterministic and reproducible from a seed
 ✓ src/engine/__tests__/random.test.ts > samplers > the PRNG stays in [0,1) 2488ms
 ✓ src/engine/__tests__/random.test.ts > samplers > normal samples have the requested mean and standard deviation
 ✓ src/engine/__tests__/random.test.ts > samplers > gamma samples have mean and variance equal to the shape
 ✓ src/engine/__tests__/random.test.ts > samplers > dirichlet draws sum to one and match the analytic mean and variance 1219ms
 ✓ src/engine/__tests__/random.test.ts > samplers > concentration controls dirichlet spread but not its mean
 ✓ src/engine/__tests__/score.test.ts > scoring plan > agrees with the reference implementation exactly
 ✓ src/engine/__tests__/score.test.ts > scoring plan > deduplicates response deadlines
 ✓ src/engine/__tests__/score.test.ts > score composition > is linear in the class distribution, which is why concentration cannot shift the mean
 ✓ src/engine/__tests__/score.test.ts > score composition > gives correctly identified clutter exactly zero consequence
 ✓ src/engine/__tests__/score.test.ts > score composition > scales linearly with asset value
 ✓ src/engine/__tests__/score.test.ts > score composition > a track past every response deadline scores exactly zero regardless of severity
 Test Files  7 passed (7)
      Tests  69 passed (69)
