7.7 KiB
7.7 KiB
HANDOVER — Fable, 2026-07-13 EOD (token-limit divert)
Written at operator order at 96% token budget. State + ALL open TODOs as Fable sees them.
LIVE STATE (as of 16:15 CEST)
- F5 RUNNING: PID 237222,
/root/dolphin_logs/uv_prime_flight5.log, launched viauv_prime_launch5.sh(setsid-detached). Open position at writing: TRXUSDT SHORT 5108cf2b entry 0.3255 qty 3038 (~−0.20% at 16:13). - GATE RELAXED ON PURPOSE:
DOLPHIN_VOL_P60_THRESHOLD=0.00001(launcher line 26). Operator order 2026-07-13: DO NOT TIGHTEN YET. Sequence: (1) characterize exit MECHANICS with relaxed gate = high sample rate on VST, (2) vol-gate parity (restore 0.00026414) as the LAST rung. - Exit mechanics observed today: 7 ADVSL losers (−0.05..−0.51%), 1 FIXED_TP winner ADAUSDT +0.4416% @15:02 (vs 0.20 configured → overshoot-study datapoint), earlier 4 ADVSL losers (MFE ≤ +0.013%). Heartbeat healthy: polls ~15k, tick lane live.
COMMITTED TODAY (all local — NOT pushed)
bdc54fb(canonical /mnt): INDETERMINATE submit fix — unknown is never flat. http.py effect classes, bingx_direct point-lookup (NOT a reconcile), venue.py VenueIndeterminateError(VenuePostAckError), bingx_venue escalation, 14 tests. Suite 3416 passed/19 skip/3 xfail.54cd5d5(uv-wt refactor): vendored side + VENDOR.lock repin. Sync gate refused 93v92 → ported test UP to canonical, proved zero .py drift, then --force. Drift verify green, dita_v2 collection gate green.f2e7d41: POST_FINISH research entries (dvol sweep × regime, cadence effects, streak wave-phase).- TODO:
h5i share pushboth repos; Gitea push (broken Windows post-receive hook, memory: violet_unified_repo).
IN-FLIGHT (next command, prepped)
Apply UV DDL: dolphin_uv.max_hold_ingress + tp_exit_ingress DDLs EXIST at
prod/clickhouse/uv/04_max_hold_ingress.sql + 05_tp_exit_ingress.sql but were
NEVER APPLIED → F5 404s every scan, mechanics data spool-only
(/root/dolphin_logs/uv_journal_spool.jsonl, 1,576 rows).
Run: cd /root/uv-wt/refactor && python3 prod/clickhouse/uv/apply_uv_ddl.py
(idempotent, IF NOT EXISTS). Then: confirm 404s stop next scan; check whether the
journal lane auto-drains the spool or rows need manual JSONEachRow replay
(journal.py:328 — fsynced-sidecar ack + spool compaction; verify it replays old rows).
TODO LADDER (Fable's full view)
- UV DDL apply + spool drain (above). Unblocks the mechanics characterization the relaxed gate is paying for.
- Vol-gate parity restore = LAST rung (operator sequence): launcher line 26 → 0.00026414, restart F5 while flat (TPSL REHYDRATE exists but don't test it with money). Then tag the relax-window trades DO_NOT_ACCOUNT for the parity ledger (window = F5 launch→restore; ADA winner + all ADVSL losers included).
- ADVSL staleness guard:
_last_pricehas NO max-age — if fetches fail after first success, ADVSL decides on a fossil price forever (tpsl_ticker.py on_bar reads it; only never-fetched case falls back to entry). Fix = stamp age, skip ADVSL on stale (like no-price). Small, mutation-testable. Awaiting go. - Clock findings (research done, delivered): SL/TP evaluate on 1s tick (UV_TPSL_POLL_S, floor 0.5 in code); TP/SL modulation recomputed per tick via set_tp_resolver (tpsl_ticker.py:167 → brain_tpsl.py:334); ADVSL/MAX_HOLD on scan bar ~11.06s vs BLUE NG7 pinned 5.97s → all bar-denominated constants stretched 1.85× in wall-clock. OPEN QUESTION: bar constants = hold-TIME or evidence-COUNT (N OBF observations)? Decides time-normalize vs cadence-match. Fable rec: attack WHY UV scan is 11.06s (cadence-match beats constant-scaling for parity).
- OBF freshness (post-parity): ingress provider called per tick but returns scan-stale snapshot; OBF native cadence ~300-500ms — refresh ingress at native rate once parity certified. No structural blocker.
- Venue-side catastrophic SL backstop: BingX placeOrder supports attached stopLoss/takeProfit JSON on SAME request (workingType MARK_PRICE). Pro pattern = software-primary + venue-resident wide backstop (~2× software SL) as dead-man's brake (our HZ silent-death history!). Cost: FSM must accept a non-kernel-originated exit fill via E-feed; attached-stop auto-cancel on close needs VST verification (orphan-order risk). Our serializer lacks the attach params (execution.py has standalone conditionals only). Belongs in exec-router workstream.
- Exec friction (POST_FINISH SEQUENCED, first upon parity): adjudicate PINK ExecutionRouter (maker/taker policy, 265 tests) ∪ BLUE SmartPlacer (OB-aware placement) vs prod/docs/BingX_FILL_CHARACTERIZATION_AND_ADVANTAGES.md. Router under 1s steel clock = maker orders actually managed.
- Indeterminate sweep codebase-wide (belled to codex, napped): cancel/
cancel_async, EKBridge, e_feed, ch_writer, ExecutionRouter, promotion receipts,
every
except: passafter venue I/O — same NOT_ATTEMPTED/REFUSED/INDETERMINATE triage asbdc54fb. - TIER-B inversion (open): asex_kernel_executor.py:319 enqueues account/fill at P4 below ENTER P3 — execution truth must outrank entries.
- Research studies (logged POST_FINISH): dvol sweep × regime (PREREQ: persist per-trade dvol at entry — same field DDSketch self-tuning gate needs); cadence effects; streak wave-phase vs vel_div. TP-overshoot split (cadence-luck vs modulation): measure exit_pct − tp_effective_pct on BLUE TP exits; today's ADA +0.44 is a UV datapoint.
- Missing venue truth: dolphin_uv.exec_journal etc. fine; but relax-window trades need DO_NOT_ACCOUNT tags before parity ledger consumes them.
ANOMALIES — "that's odd" caught at spark level (operator order: log before fire)
- E-TRIPWIRE capital anchor drift — 17:20:21 CEST at DASH fill (0c2ee114): expected 49,550.8744 vs observed 49,561.5166 = +$10.64 (~2bps). Promo metadata then anchored capital at the OBSERVED value. Likely fee/timing accounting at fill, but capital = anchor + Σ deltas is sacred (zombie-trades lesson) — reconcile which side is right before it compounds.
- Leverage clamp mystery — promotion line said
lev=3 raw_conv=8.0(intent c16ae587), venue log line:leverage SET symbol=DASH-USDT 1→→2, and the next intent journaledleverage=2. Something between bridge sizing and venue SET clamps 3→2 (venue max for DASH-USDT? sizing bridge internal_lev 0.637?). Money-path arithmetic — verify deliberate, not silent. - KERNEL_REJECTED over-entry, live confirmation — 17:22:40 brain re-fired DASHUSDT SHORT while slot 0 already held DASH short (13 bars). Pre-wire FSM refusal (same-millisecond receipt, no HTTP). Guard WORKS; upstream position-blindness (PRIME 2.7× over-entry finding) remains the disease.
- EXIT-mislabel parade confirmed live — exec_journal writes an EXIT BRIDGE row per no-entry scan (uv-trade-* ids, ~12s apart, no real exits). Known cosmetic item, now confirmed polluting exec_journal volume/queries.
- Bar cadence is BIMODAL, not slow — BAR pulse instrumentation (cc01d28) shows consecutive scan numbers with dt ≈ 6s OR ≈ 12s (exact doubles), nothing between. The "11.06s average" = ~6s base clock (matches NG7's 5.97 pin) with frequent double-length beats. Cadence question is now: WHERE does UV lose every other scan (NG7 emission jitter / HZ pickup / dedup gate)?
DOCTRINE REMINDERS (cost blood today)
- Never edit vendored copies; sync-gate REFUSE = port UP + prove zero drift before --force. New test files must exist CANONICALLY first.
- Rollback only on proven absence: NOT_ATTEMPTED/REFUSED yes, INDETERMINATE never.
- Argos MCP unreachable this session; verify_no_fake_done done by hand (no stubs).