From 05b0aa08426afef9c7a5592a8e580eebfaf8c6b4 Mon Sep 17 00:00:00 2001 From: Codex Date: Mon, 13 Jul 2026 01:30:33 +0200 Subject: [PATCH] =?UTF-8?q?uv(parity):=20DATA=20WIRING=20CENSUS=20?= =?UTF-8?q?=E2=80=94=2024=20live=20/=204=20defaulted=20/=209=20missing;=20?= =?UTF-8?q?holes=20concentrate=20at=20tpsl=5Fticker:319-348=20+=20dead=20h?= =?UTF-8?q?ook=2010=20+=20env=20pins?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exit_crawl/DATA_WIRING_CENSUS_20260713.md | 186 ++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 prod/docs/uv_cert/exit_crawl/DATA_WIRING_CENSUS_20260713.md diff --git a/prod/docs/uv_cert/exit_crawl/DATA_WIRING_CENSUS_20260713.md b/prod/docs/uv_cert/exit_crawl/DATA_WIRING_CENSUS_20260713.md new file mode 100644 index 0000000..f99afe4 --- /dev/null +++ b/prod/docs/uv_cert/exit_crawl/DATA_WIRING_CENSUS_20260713.md @@ -0,0 +1,186 @@ +# DATA WIRING CENSUS — UV flight-4 vs BLUE (2026-07-13) + +**Question (HJ):** "how the hell are not ALL data sources where they belong" — exhaustive +census of every data source BLUE's decision + exit surfaces consume, and whether UV wires it. + +**Method:** READ-ONLY crawl. BLUE anchors from `/mnt/dolphinng5_predict/prod/nautilus_event_trader.py` +(`_process_scan` 4051+, feeders 905–1400, ADVSL block 4835–4919, V7 hook 1241–1338), +`adaptive_exit/advanced_sl.py`, `nautilus_dolphin/.../alpha_exit_v7_engine.py`, +`esf_alpha_orchestrator.py`. UV anchors from the LOCAL tree +`/root/uv-wt/refactor/prod/clean_arch/violet/uv/` (runner, blue_prime, hooks, tpsl_ticker, +modulation ports, exec/e_feed). Cross-checked against `BIT_PARITY_UNROLL_VS_UV_20260713.md` +and `UV_EXIT_CRAWL.md`. Note: `mcp__argos__*` was not reachable in this session; filesystem +tools were used per CLAUDE.md fallback. + +**Verdicts:** +- **WIRED-LIVE** — real feed reaches the UV consumer. +- **WIRED-DEFAULT** — consumer runs on a silently defaulted / neutral value (DANGEROUS; default listed). +- **MISSING** — UV consumer exists but the input is never supplied. +- **N-A** — BLUE-only scope, or superseded by an equivalent-or-better UV mechanism. + +All UV paths below are relative to `/root/uv-wt/refactor/prod/clean_arch/violet/uv/`; +all BLUE paths relative to `/mnt/dolphinng5_predict/`. + +--- + +## 1. Decision surface (scan loop → 11 feeders → step_bar) + +| # | Input | Source of truth | BLUE consumer | UV wiring | Verdict | +|---|---|---|---|---|---| +| D1 | NG7 scan (scan_number, assets, asset_prices) | HZ `DOLPHIN_FEATURES["latest_eigen_scan"]` | `prod/nautilus_event_trader.py:4051+` (`_process_scan`) | `blue_prime/runner.py:217,340–345` (same key + BLUE's own `normalize_ng7_scan`) | **WIRED-LIVE** | +| D2 | vel_div (non-finite clamp) | scan field | `:4112–4115` | `blue_prime/runner.py:59` + `blue_prime/context.py:121` | **WIRED-LIVE** | +| D3 | w50 / w750 velocities | scan fields | `:4117–4121` | `runner.py:61–62` + `context.py:124–125` → `harness.step` (`blue_prime/engine.py:79–86`) | **WIRED-LIVE** | +| D4 | instability_50 | scan field | `:4209` (eigen_scans journal) + market_state via scan_payload `:4171` | `context.py:126,161` + `runner.py:446` (scan journal) + hook 09 scan_payload | **WIRED-LIVE** | +| D5 | prices + stablecoin removal | scan fields, `_STABLECOIN_SYMBOLS` (`:24`) | `:4102–4106` | BOTH paths filter: `runner.py:44–63` (engine path — T10R4 fix) + `context.py:38–41,118` (ctx path) | **WIRED-LIVE** | +| D6 | vol_ok (BTC 50-window stddev vs p60) | computed from scan BTC price | `:4021–4036` (`_compute_vol_ok`), used `:4110` | hook `hooks/01_vol_ok.py` (same window/threshold, env `DOLPHIN_VOL_P60_THRESHOLD` dflt 0.00026414); runner runs it FIRST + rebuilds ctx (`runner.py:354–361`) | **WIRED-LIVE** | +| D7 | posture (APEX/TURTLE/HIBERNATE) | HZ `DOLPHIN_SAFETY["latest"|"posture"]` | `:2582,2797` (`_read_posture`, 10s cache), sync block `:4128–4161` | `blue_prime/live_inputs.py:68–88` (same keys, same 10s cache, fail-soft APEX) → `ctx.posture` → hook `hooks/03_posture_sync.py` | **WIRED-LIVE** | +| D8 | ESoF payload | HZ `DOLPHIN_FEATURES["esof_latest"|"esof_advisor_latest"]` | `:761` (`_read_esof_payload`), gate `:4164` | `live_inputs.py:91–109` (parses via BLUE's own `esof_size_gate.parse_esof_payload`) → hook `hooks/04_esof_size_gate.py` (sets engine advisory score; engine computes `_esof_size_mult` itself, `esf_alpha_orchestrator.py:856–858`) | **WIRED-LIVE** | +| D9 | ExF snapshot (funding/dvol/fear_greed/taker) — decision surface | HZ `DOLPHIN_FEATURES["exf_latest"]` | listener `:2826` → `self._last_exf` | `live_inputs.py:112–124` → `ctx.exf_snapshot` → hooks 06 + 09 | **WIRED-LIVE** (decision side only — see X4/X8 for the exit-side holes) | +| D10 | OB engine construction (live OB provider) | HZ OB maps via `HZOBProvider(dolphin@127.0.0.1:5701)` | trader init + `self.ob_eng` | `blue_prime/deps.py:127–154` (`build_prime_deps`, fail-soft; raw first-scan universe enforced `runner.py:222–229`, hard-fails if absent) | **WIRED-LIVE** | +| D11 | OBF step_live (per-bar OB clock) | OB engine internal | `:4124–4125` | hook `hooks/02_ob_step_live.py` (same instance, engine `_global_bar_idx` clock) | **WIRED-LIVE** | +| D12 | OBF mid-price injection for open-position asset | HZ `DOLPHIN_FEATURES["obf_universe_latest"]` (live WS bid/ask, ≤3s fresh) | `:928–951` (`_inject_obf_midprice`), applied `:4187–4188` **before** `step_bar :4193` | hook `hooks/10_obf_midprice.py` exists BUT (a) it reads `ctx.extras["obf_universe_latest"]` (`10_obf_midprice.py:15`) which **no producer ever sets** (grep: only reader exists); (b) even if set, the hook's output prices live only in `HookEffect.mutations` — `runner.py:367–370` steps the engine with pre-hook `inp["prices"]` | **MISSING** (double-dead) | +| D13 | SC threshold advisor (shadow) | `SCThresholdAdvisor.load(strategy="blue", shadow_db="dolphin")` | `:691–698`, evaluate `:953–994` (sc, vel_div, exf, esof, trade_history, current_mult) | `deps.py:156–165` + hook `hooks/06_sc_threshold_advisor.py:41–54` — passes vel_div, `ctx.exf_snapshot`, `ctx.esof_payload`, live `engine._esof_size_mult` via `hooks/advisor_context.py` | **WIRED-LIVE** (shadow) | +| D14 | SC gauge advisor (shadow) | `SCGaugeAdvisor.load(...)` + `build_obf_snapshot_from_engine` | `:702–709`, evaluate `:1340–1373` | `deps.py:167–176` + hook `hooks/07_sc_gauge_advisor.py` (OBF snapshot from same ob_engine) | **WIRED-LIVE** (shadow) | +| D15 | Runtime direction (base −1) | env/config on trader | `:580–597` | `runner.py:353` hardcodes `trade_direction=-1` → hook `hooks/08_runtime_direction.py` (exact branch parity) | **WIRED-LIVE** | +| D16 | EFSM state — pending LONG-overlay slots / active | BLUE: in-process `PostWinExecutionFSM` (`:486,4222–4234,4656–4674`), never published | `_resolve_runtime_direction :580–589` | `blue_prime/efsm_state.py` (`EfsmMirror`): instantiates the SAME BLUE class, replays **`dolphin.trade_events`** (`:5,115,167`) + context gate from `dolphin.maras_fingerprint` (`:254`) + `dolphin.obf_universe` BTC window (`:286`); refreshed each scan `runner.py:180` | **WIRED-LIVE** — with caveat: slots derive from **BLUE's** closed-trade stream, not UV's own fills (see H7) | +| D17 | market_state_runtime feed (scan_payload, prices, vel/v50/v750, vol_ok, posture, exf, esof) | in-process `MarketStateRuntime` | ctor `:454`, update `:4169–4183` | `runner.py:154–163,230` (`_attach_market_state`) + hook `hooks/09_market_state.py:41–53` — full arg parity | **WIRED-LIVE** as a *producer* — but its outputs are consumed by NOBODY in UV (see X4) | +| D18 | Hibernate protect — bucket TP+SL arming | `adaptive_exit/models/bucket_assignments.pkl` + `_BUCKET_SL_PCT` | load `:722–732`; arm `:2424–2452` (`stop_pct_override` per bucket); trigger `:4144–4159` | hook `hooks/03_posture_sync.py` sets `engine._hibernate_protect_active=True` FLAG ONLY — never loads buckets (grep: zero bucket refs in uv/), never arms `stop_pct_override` | **MISSING** (bucket SL arm); flag path itself wired | +| D19 | `hibernate_protect_active` per-scan state | trader attr (trade_id) | `:477,4146–4159` | `context.py:151` pins `extras["hibernate_protect_active"]: False` every scan; runner never overrides | **WIRED-DEFAULT** (`False` always) | +| D20 | Catastrophic floor config | BLUE env `DOLPHIN_CATASTROPHIC_FLOOR_PCT` / overlay floor / max-loss | `:2456–2548` applied `:4192` | hook `hooks/11_catastrophic_floor.py` wired; BUT `runner.py` passes no `floor_cfg`, so `context.py:133–143` hard defaults 0.0120 / 0.0050 / $500 — UV does NOT read the BLUE env knobs | **WIRED-DEFAULT** (0.0120 / 0.0050 / 500.0 — matches BLUE defaults today, silently diverges if operator retunes BLUE via env) | +| D21 | TP threshold sync (soft curve from capital+notional) | tp_curve (`prod/clean_arch/tp_curve.py`) + capital + open-position notional | `:805–827` (`_tp_curve_context`), `:905–926` (`_sync_tp_threshold` → `eng.set_live_tp_pct`) | hook `hooks/05_tp_threshold.py` — same compute, BUT `capital = engine.capital` = the embedded engine's **paper** capital (init 25000, sim PnL), not venue E | **WIRED-LIVE** with divergence (see H8) | +| D22 | ACB / proxy-boost / EsoF gate / bet sizer internals | engine-internal (`create_d_liq_engine`) | inside `step_bar` | same REAL engine, same `ENGINE_KWARGS` (AST-extracted, `blue_prime/engine.py:32–43`) | **WIRED-LIVE** | +| D23 | EFSM overlay entry tagging + observe-closed-trade lifecycle | live FSM on trader | `:4222–4253` (tag), `:4656–4674` (observe) | mirror replays the same class over `dolphin.trade_events`; UV's own promotion path does not call `tag_next_entry` on its own entries | **N-A** for parity shadow / caveat for solo flight (H7) | + +## 2. Exit surface (TP / SL / MAX_HOLD / ADVSL / V7) + +| # | Input | Source of truth | BLUE consumer | UV wiring | Verdict | +|---|---|---|---|---|---| +| X1 | OBF exit ingress: cascade_count, regime_signal, imbalance_ma5, withdrawal_velocity, base 250 | ob_engine `get_signal`/`get_macro` at evaluation_bar | `AlphaExitManager.evaluate` (kernel) + trader | `max_hold_modulation.py:133–202` (`build_engine_ingress_provider`) — strict `_live_mode`/`_live_bar_idx` sync check (166–171); refuses stale cache → journaled `NO_INGRESS_FALLBACK` (tpsl_ticker.py:467–492) | **WIRED-LIVE** (fail-explicit, journaled) | +| X2 | MAX_HOLD modulation (250 → ×0.5/×0.4/×1.5/×0.40 branches) | ingress X1 | `AlphaExitManager.evaluate` branch order | `max_hold_modulation.py:78–116` (`blue_max_hold_yield`, doctrinal order) driven per scan `tpsl_ticker.py:272–297` | **WIRED-LIVE** | +| X3 | TP curve + OBF TP modulation + TP_FLOOR | base anchor `_tp_base_pct` (`:455`), capital, notional, ingress X1 | `:805–827,905–926` + kernel exit manager (×1.40 cascade etc.) | `tp_exit_modulation.py:70–137` (`blue_tp_yield`); base anchor from engine (`runner.py:322–329`); capital from **E-anchored venue provider** (`runner.py:262–265`, `tpsl_ticker.py:384–388`); trigger order TP_FLOOR→TP→SL in `brain_tpsl.py:334–383` | **WIRED-LIVE** | +| X4 | ADVSL `market_state` (choppiness, dd_pressure, trend, compression, mean-reversion, confidence) | `market_state_runtime.latest_state` | `:4837,4857` passes it into `advanced_sl.evaluate` (`adaptive_exit/advanced_sl.py:592`) | consumer param EXISTS (`advanced_sl_port.py:190`) but caller `tpsl_ticker.py:343–348` **never passes it** → `{}` → `choppy=dd=trend=compression=0` (`advanced_sl_port.py:83–88`) | **MISSING** — kills ADVSL (see H1) | +| X5 | ADVSL `exf_snapshot` | `self._last_exf` | `:4859` | param EXISTS (`advanced_sl_port.py:191`) but never passed at `tpsl_ticker.py:343–348` → defaults funding=0, dvol=0, fear=50, taker=0.5 → `exf_stress` frozen at 0.20 (`advanced_sl_port.py:89–99`) | **MISSING** — co-kills ADVSL (H1) | +| X6 | ADVSL `market_bundle` | `market_state_runtime.latest_bundle_dict` (+MARAS merge `:824–825`) | `:4838,4858` | hardcoded `market_bundle={}` at `advanced_sl_port.py:211` | **MISSING** | +| X7 | ADVSL `ae_shadow` (AdaptiveExitEngine p_continuation) | `_ae_ref.evaluate(...)` per position | `:4825–4833,4855` | UV port has no `ae_shadow` param at all; pure runtime falls back to `v7.p_continuation` else 0.5 (`advanced_sl_port.py:104–112`) | **MISSING** (neutral 0.5 stand-in) | +| X8 | ADVSL `meta_performance` (EFSM `exit_policy_meta` over MARAS ctx) | HZ `DOLPHIN_FEATURES["maras_latest"]` (`:527–535`) → `:4840–4844,4860` | absent; UV pure runtime substitutes constant `0.12*0.5` in score (`advanced_sl_port.py:126`) | **MISSING** (declared out-of-scope in port docstring — still a BLUE input UV drops) | +| X9 | ADVSL recent_prices tape | BLUE `_record_bounce_prices` (`:4108`) scan-price path | `:4824,4854` | `tpsl_ticker.py:299–308,343–346` — mark-price poll tape (~1 s, ≥ scan resolution), 32-deep, entry-seeded | **WIRED-LIVE** (finer than BLUE) | +| X10 | V7 forecast — ExF context (`ctx.set_exf(funding,dvol,fear_greed,taker)`) | `self._last_exf` | `:1269–1288` | `exit_v7_wrapper.py` accepts `exf` (param present, `_apply_exf`) but `tpsl_ticker.py:337–340` never passes it → V7 runs with zero EXF state | **MISSING** | +| X11 | V7 forecast — ob_imbalance | `ob_eng.get_signal(asset, eval_bar).imbalance_ma5` RAW | `:1292–1312`; engine treats it as raw direction (`alpha_exit_v7_engine.py:493 ob_direction = ob_imbalance`) | ingress X1 delivers the same field, BUT `tpsl_ticker.py:319–321` **sign-flips it for SHORT** before `evaluate` — BLUE does not | **WIRED-LIVE with SIGN DEVIATION** (H2) | +| X12 | V7 decision → ADVSL `v7_decision` (exit_pressure, p_cont, mae/mfe_risk) | `self._v7_decisions[tid]` (`:1315,4839,4856`) | | `tpsl_ticker.py:322–347` (`VioletExitV7Adapter.last_raw_decision`) | **WIRED-LIVE** (but degraded by X10/X11 upstream) | +| X13 | Exit price feed | BLUE: scan prices + OBF mid-price override | `_manage_position` via step_bar | `tpsl_ticker.py:65–79` BingX mark-price REST (~1 s, full precision, off-thread pool 137–141, 620–640); scan-lane falls back to entry price until first poll (`:242–247`, counted `_scan_price_fallbacks`) | **WIRED-LIVE** (superior cadence/precision) | +| X14 | bars_held / hold clock | engine bar clock | kernel exit manager | `tpsl_ticker.on_bar` once per processed scan (`runner.py:374–382`) + kernel-slot rehydration `_sync_from_kernel` (`tpsl_ticker.py:525–611`) | **WIRED-LIVE** | +| X15 | SL: catastrophic floor + withdrawal widen | 1.2% floor, regime_signal==1 → 10% | kernel `AlphaExitManager.evaluate` | `sl_exit_modulation.py:47–71` (`blue_sl_yield`: min(configured,0.012), widen 0.10) resolved per tick `brain_tpsl.py:355–366` | **WIRED-LIVE** (modulation) — configured input is X16 | +| X16 | Configured TP/SL fractions at arm | UV env `UV_TP_PCT` / `UV_SL_PCT` (mandatory when `UV_TPSL_ENABLE=1`, `tpsl_ticker.py:699–704`) | N-A (BLUE: ENGINE_KWARGS fixed_tp 0.0020, stop 1.00+floor) | pinned **nowhere** in the repo — only tests set them; a mis-set env silently reshapes every exit (SL parity holds only if `UV_SL_PCT ≥ 0.012`) | **WIRED-DEFAULT/UNPINNED** (H4 — known hole, verified) | +| X17 | Capital for TP curve (exit lane) | venue account truth | BLUE ledger capital | `make_e_capital_provider(zinc_plane)` fed by E-feed (`runner.py:262–277`, `tpsl_ticker.py:384–388`); fail-soft to None → curve at capital 0 | **WIRED-LIVE** | +| X18 | Notional (exit lane) | position qty × entry | pos.notional | `tpsl_ticker.py:399` (`pos.quantity * pos.entry_price`) | **WIRED-LIVE** | +| X19 | Overlay-ADVSL exit gate (LONG overlay positions) | `_overlay_advsl_should_exit` cfg `:472–476,2523–2551` | `:4866–4878` | absent in UV; hook 08 CAN resolve LONG overlay entries, but no overlay-specific ADVSL/V7 pressure gate exists on the exit side | **MISSING** (conditional on UV ever taking overlay LONGs) | +| X20 | ADVSL live-exit actuation channel | HZ `blue_runtime_commands` queue `:4880–4907` | | UV uses in-process steel-lane dispatch (`brain_tpsl` + `TpSlHandler`, M6 worker `tpsl_ticker.py:113–122`) | **N-A** (superseded, by design) | + +## 3. Account / venue truth + +| # | Input | Source of truth | BLUE consumer | UV wiring | Verdict | +|---|---|---|---|---|---| +| A1 | Account/E truth (balance, fills) | BLUE: capital anchor + Σ deltas (checkpoint/HZ pnl/position_state, `:1424–1760`) | trader capital ledger | UV: `exec/e_feed.py` (CEX-010: ASEx-owned BingX stream + REST gap-backfill, sole publisher into zinc plane) `runner.py:270–277`; armed promotion **fail-closes** on staleness | **WIRED-LIVE** (stronger law than BLUE) | +| A2 | E→K kernel mirror | applied EEvents | N-A | `exec/e_k_bridge.py` (one-way E→K through single kernel owner) `runner.py:271–274` | **WIRED-LIVE** | +| A3 | Position truth for exits | BLUE engine position | | kernel Zinc slots (`runner.py:261`, `tpsl_ticker._sync_from_kernel`) — qty, fill price, terminal state, restart rehydration | **WIRED-LIVE** | +| A4 | Venue readiness (no order before readiness) | N-A in BLUE | | `exec/venue_readiness.py` probes (venue_connect, e_feed_ready, capital_fresh, zinc healthy) `runner.py:283–306`, fail-DARK | **WIRED-LIVE** (UV-only safety addition) | +| A5 | HZ write protection | BLUE writes HZ freely | | `no_write_guard` + `hz_readonly.wrap_hz_client` (`runner.py:30–39`) | **N-A** (UV doctrine: never write BLUE reference state) | +| A6 | `live_tp_threshold` HZ observability key | HZ `DOLPHIN_FEATURES["live_tp_threshold"]` (docstring `:909`) | BLUE computes locally `:905–926` (does not actually read the key) | UV computes locally (hook 05) + journals TP ingress rows to `dolphin_uv` | **N-A** (neither system consumes it as an input) | + +--- + +## VERDICT COUNTS + +- **WIRED-LIVE: 24** (D1–D11, D13–D17, D22, X1–X3, X9, X12–X15, X17, X18, A1–A4 — counting grouped rows once) +- **WIRED-DEFAULT: 4** — D19 (hibernate flag pinned False), D20 (floor cfg hard-coded 0.0120/0.0050/500), X16 (UV_TP_PCT/UV_SL_PCT unpinned env), X7-fallback constant p_cont=0.5 +- **MISSING: 9** — X4 (ADVSL market_state), X5 (ADVSL exf), X6 (ADVSL market_bundle), X7 (ae_shadow), X8 (meta_performance/MARAS), X10 (V7 ExF), X19 (overlay ADVSL gate), D12 (OBF mid-price, double-dead), D18 (hibernate bucket SL) +- **N-A: 4** — X20, A5, A6, D23 +- **Deviations flagged: 2** — X11 (V7 ob_imbalance sign flip), D21/H8 (two-capital divergence) + +--- + +## HOLES — ordered by money impact + +### H1 — ADVSL is mathematically DEAD (market_state + exf never passed) — CRITICAL +`tpsl_ticker.py:343–348` calls `AdvancedSlPort.evaluate` without `market_state=`/`exf_snapshot=` +although both params exist (`advanced_sl_port.py:190–191`). With `state={}` and `exf={}` the +pure runtime computes a **deterministic** stress = 0.34·0 + 0.22·0 + 0.18·(1−0) + 0.12·(1−0) ++ 0.14·0.20 = **0.328**, and `gate_stress` requires ≥ **0.52** (`advanced_sl_port.py:100–101,132`). +`would_exit = all(gates)` → the ASL_PRESSURE_CONT_STRESS full-retract **can never fire**, on any +tape, ever. UV's only non-mechanical loss-cutting exit is a no-op while its counters +(`advsl_evaluations`) tick up green. BLUE passes both live +(`nautilus_event_trader.py:4837,4857–4859`). Fix: thread `market_state_runtime.latest_state` +(already produced each scan by hook 09 — currently produced-and-dropped, D17) and +`ctx.exf_snapshot` from the runner into the ticker's ADVSL call. + +### H2 — V7 forecast runs blind + sign-flipped — HIGH +(a) BLUE seeds every V7 context with live ExF (`nautilus_event_trader.py:1269–1288`); UV never +passes `exf` to `VioletExitV7Adapter.evaluate` (`tpsl_ticker.py:337–340`) though the wrapper +supports it. (b) BLUE feeds V7 the RAW `imbalance_ma5` (`:1292–1312`; +`alpha_exit_v7_engine.py:493` uses it as-is); UV flips the sign for SHORT positions first +(`tpsl_ticker.py:319–321`) — every SHORT (i.e. nearly every UV trade) hands V7 an inverted OB +direction. V7's `exit_pressure` feeds ADVSL's pressure gate and the journals, so even after H1 +is fixed, ADVSL fires on wrong-signed microstructure. + +### H3 — OBF mid-price injection is double-dead — HIGH (for embedded-engine exits) +Hook 10 exists but (a) nothing ever puts `obf_universe_latest` into `ctx.extras` +(`hooks/10_obf_midprice.py:15` is the only reference in uv/), and (b) even if it did, the +hook's output prices never reach `step_bar` — `runner.py:367–370` uses pre-hook `inp["prices"]`, +whereas BLUE reassigns `prices_dict` before stepping (`:4187–4196`). Coarse ~4-decimal scan +prices for a 0.20% TP is the exact failure class behind BLUE's TP-masking incident. Mitigation: +UV's REAL positions exit through the mark-price ticker (X13), so exposure is confined to +embedded-engine decision parity (exit timing the engine believes in vs what UV actuates) — but +that is the parity being certified. + +### H4 — UV_TP_PCT / UV_SL_PCT unpinned in any launcher — HIGH (verified known hole) +`maybe_build_ticker` hard-requires both when arming (`tpsl_ticker.py:699–704`) and they are set +**nowhere** in the repo outside tests (grep across .sh/.py/.conf/.md; supervisor conf has no UV +entry). SL parity with BLUE (1.2% catastrophic floor dominant) holds only if `UV_SL_PCT ≥ 0.012`; +a fat-fingered export silently retunes every exit with no journal of provenance. Pin both in the +canonical launcher/env file with the doctrine values. + +### H5 — Hibernate protect arms a flag, not a stop — MEDIUM +BLUE's HIBERNATE-with-open-position path arms a per-bucket `stop_pct_override` from +`bucket_assignments.pkl` + `_BUCKET_SL_PCT` (`:722–732, 2424–2452`). UV hook 03 only sets +`engine._hibernate_protect_active=True`; no bucket file is ever loaded in uv/ and no override is +armed. Additionally `context.py:151` pins `hibernate_protect_active=False` every scan (D19), so +the hook re-enters the arm branch each scan. Rare posture, but it is precisely the +capital-protection path for the worst regime. + +### H6 — Catastrophic floor config frozen at code defaults — MEDIUM +UV never reads `DOLPHIN_CATASTROPHIC_FLOOR_PCT` / overlay env knobs; `runner.py` passes no +`floor_cfg`, so `context.py:135–143` hard-codes 0.0120/0.0050/500.0. Identical to BLUE **today**, +silently divergent the day the operator retunes BLUE via env. + +### H7 — EFSM overlay slots track BLUE's trades, not UV's — MEDIUM (semantics) +`EfsmMirror` replays `dolphin.trade_events` (`efsm_state.py:5,115,167`) — BLUE's closed-trade +stream. Correct for shadowing BLUE; for UV as an independent live trader it means UV's own wins +never arm UV's post-win LONG overlay, and BLUE's wins arm overlay LONGs in UV's book. Related: +X19 — if such an overlay LONG is taken, UV has no overlay-ADVSL exit gate +(BLUE `:2523–2551,4866–4878`). + +### H8 — Two capitals: hook 05 TP threshold uses paper capital — LOW/MEDIUM +`hooks/05_tp_threshold.py` computes `live_tp_pct` from `engine.capital` (embedded engine's +simulated ledger, init 25000), while the actuating ticker TP uses venue-E capital (X17). BLUE +uses one ledger for both. As venue E and paper capital drift apart, the engine's internal exit +view and UV's actuated TP diverge. + +### H9 — ADVSL context degradations behind H1 — LOW (masked until H1 fixed) +`ae_shadow` absent (p_cont neutral 0.5, X7), `market_bundle` hardcoded `{}` +(`advanced_sl_port.py:211`, X6), MARAS `meta_performance` absent with constant 0.5 stand-ins in +the score (`advanced_sl_port.py:117,126`, X8). Note MARAS IS already queryable in UV +(`efsm_state.py:239–279` reads `dolphin.maras_fingerprint`) — the plumbing exists one module away. + +--- + +## What is demonstrably RIGHT (so the fix stays scoped) + +The entire decision surface is genuinely live: real NG7 scans, real prices with dual stablecoin +filtering, real posture/ESoF/ExF from the same HZ keys with BLUE's own parsers, the REAL +D_LIQ_GOLD engine with AST-pinned ENGINE_KWARGS, a live HZOBProvider OB engine stepped on BLUE's +clock, both SC advisors with full BLUE argument sets, market-state runtime fed with full parity, +EFSM mirrored with the genuine BLUE class, and an exit lane whose OBF ingress refuses stale +snapshots instead of inventing neutral ones. The holes are concentrated in ONE call site +(`tpsl_ticker.py:319–348` — ADVSL/V7 context) plus one dead hook (10) and one unpinned env pair. + +*Census by Fable (claude), 2026-07-13. Read-only; no source files modified.*