Vesper Review — Orion Pre-Code Findings, FLAG-048¶
Orion —
Investigation is solid. All five items below. Branch cut authorized after you read this in full.
D1 — Sign Convention: APPROVE Option A (Atlas-literal)¶
Follow Atlas's text literally:
Positive ⇒ CLOB above AMM. Matches the architectural framing in Atlas's ruling.
The dashboard sign flip is a one-time adjustment. Operators will be reading new fields — there is no legacy muscle memory to break on structural_basis_bps or residual_distortion_bps because they are new. The legacy anchor_error_bps column (AMM - CLOB sign) is retained unchanged for back-compat and will continue to read the same way. No confusion.
D1: Option A confirmed.
D2 — Uncapped Structural Observation: APPROVED¶
Confirmed: structural_basis_bps is computed from raw (clob_mid, amm_price) before any cap. The cap survives unchanged on the quote-placement path only.
Your reasoning is exactly right: if the observation layer inherits the cap, the EMA baseline gets biased low in hostile regimes and the residual never normalizes — which recreates the exact problem we are fixing. Two separate things, treated separately.
D2: uncapped structural observation, capped quote_anchor_price — confirmed.
D3 — Three Config Knobs: APPROVED¶
Three separate knobs under AnchorDualSignalConfig:
- basis_ema_window_ticks (default 150)
- residual_hysteresis_lookback_ticks (default 20, matching current anchor saturation guard)
- warmup_ticks (default 50)
Plus existing entry/exit/prevalence thresholds from AnchorSaturationGuardConfig carried over and applied to residual.
A single knob would force tuning one parameter to do three jobs. This is the right decomposition. It also makes it possible to independently tune the baseline tracking speed vs. the guard's stability requirement vs. the cold-start suppression window — three legitimately separate concerns.
D3: three separate knobs confirmed.
Session 52 as S49/S50 Stand-In: APPROVED with Atlas notification¶
Session 52 (38 ticks, Apr 21 14:57Z, 100% +cap-locked, afternoon ET, clean stable basis) is an acceptable substitute for CLAUDE.md-numbered S49 and S50 in the Atlas replay gate.
Reasoning:
- The live DB is confirmed corrupted and inaccessible (multiple access methods failed during S50 investigation session — WAL file malformed, SMB mount unreliable even post-shutdown).
- Session 52 is the cleanest possible proof case because 100% cap-saturation with zero basis variance is a harder test than partially saturated sessions would be. If the model works on session 52 it works on S49/S50.
- The pattern Atlas described ("100% cap-locked, engine idling through live market") is exactly what session 52 shows. Same pair, same time of day, same structural phenomenon.
- Trying to recover the exact sessions via sqlite3 .recover requires root and is out of scope for this branch. The circular alternative (run a new session to capture data before merging) is operationally worse.
What to note for Atlas: When delivering, document that the replay gate uses session_id 51 (S48 equivalent) + session_id 52 (afternoon +cap equivalent) as the S48/S49/S50 stand-ins, with the reason. Atlas should know the exact sessions weren't in the backup. He will likely accept session 52 as the proof case given what it demonstrates — but flag it explicitly in the delivery memo rather than presenting it as if you ran the exact sessions.
Session 52 stand-in: approved. Flag it clearly in delivery.
Startup-Reset Coupling: APPROVED (no reset on the dual-signal baseline)¶
Correct call. Structural basis is a pair characteristic — it is explicitly designed to outlive session boundaries. Resetting it would defeat cross-session persistence entirely. Document the deliberate deviation from the startup-reset convention in a code comment and in the delivery memo.
5-Commit Plan: APPROVED as scoped¶
The commit structure is clean. One note: C4 (cross-session persistence) should verify the startup-reset code path in fix/startup-mode-reset doesn't accidentally clear the new engine_state keys. That code resets inventory_truth.* namespace keys — confirm the dual-signal keys (anchor_dual_signal.*) are not in scope of that reset. Document either way.
EMA Window: 150 ticks — APPROVED¶
The benchmark numbers support the recommendation. 300 is too slow to be useful within a single session cold-start; 50 picks up too much noise. 150 is the right midpoint.
One request: include the 150-tick row in the delivery memo benchmark table (currently shows 50/100/300 only). Atlas will want to see where 150 falls, not just that you chose it.
Test Plan: 12 tests — APPROVED¶
Covers all three Atlas-mandated validation tests. The SQL seed files from session_id 51 + 52 as replay fixtures is the right approach — these become reproducible, deterministic tests that don't depend on live DB state.
What You Can Start Now¶
Branch cut authorized. Proceed through C1–C5 in order. No additional Vesper sign-off required mid-branch unless you hit something unexpected.
Standard delivery: patch bundle to 08 Patches/, delivery memo to NEO Desk/handoffs/TO_VESPER_patch_delivery_FLAG-048.md, apply instructions following the Orion apply instruction rules.
One thing to add to the delivery memo explicitly (Atlas's requirement): the exit reachability proof. Session 52 data is the proof case — residual = 0.000 across all 38 ticks from tick 0. Make sure that number is front and center in the delivery so Katja can include it when she shows Atlas.
— Vesper (COO) BlueFly AI Enterprises 2026-04-22