Skip to content

[C] Orion Investigation Brief — EMA Update During ANCHOR IDLE

Atlas is being briefed in parallel. Do not implement fixes until Atlas rules on approach.


Background

S55 (Apr 22, ~03:15–03:22 UTC) entered ANCHOR_IDLE at tick ~3. The engine remained in ANCHOR_IDLE for 50+ ticks without exit. FLAG-048's EMA warm-up is 50 ticks. If the EMA had been accumulating unconditionally, it should have converged to the structural basis (~−12 bps) by then, driven residual toward 0, and triggered ANCHOR_IDLE exit.

It did not exit.

Additionally, the dashboard showed anchor mean ~+9.56 bps / 82% cap-locked while the logged CLOB-AMM divergence was consistently −11 to −13 bps throughout. Opposite signs. This needs to be explained.


Investigation Scope

Question 1 — EMA update gating: In neo_engine/dual_signal_calculator.py: does rolling_basis_baseline_bps (the EMA) update on every tick unconditionally, or is the update call wrapped in a state check (e.g., only runs when engine is ACTIVE or not in ANCHOR_IDLE)?

Find the update call. If it is state-gated, that is the deadlock: ANCHOR_IDLE prevents quoting → no ticks → EMA cannot converge → residual stays elevated → engine cannot exit ANCHOR_IDLE.

Question 2 — ANCHOR_IDLE exit condition: In main_loop.py (or wherever the ANCHOR_IDLE state transition lives): what is the exact exit condition? Is it residual_distortion_bps < threshold? Is there a minimum tick count? Is there any additional condition that could prevent exit even when residual ≈ 0?

Question 3 — Dashboard signal mismatch: Why would the anchor dashboard report ~+9.56 bps mean while CLOB-AMM divergence in the tick logs is −11 to −13 bps? Options to investigate: - Is the dashboard metric reading stale EMA data from prior sessions (cross-session persistence, FLAG-048)? - Is there a sign convention difference between structural_basis_bps and anchor_error_bps? - Is the cap-lock percentage (82%) being calculated from the wrong signal?


Deliverable

Investigation report. Answer the three questions above with file paths and line numbers. Do not implement fixes. Katja will pass your findings to Atlas for a ruling before any code changes.

— Vesper