Files
sentiment-engine/prod/docs/HANDOVER_20260713_FABLE_EOD.md
Codex e57a5e58a8 docs(review): pi's INDETERMINATE edge-case doc — verified faithful, 2 errors fixed, 7 missing seams M1-M7 enumerated for fleet
venue.py:43 location + 2026-07-13 date corrected in-place. §11 added: truth
audit, missing-seam table (cancel, lev SET, promo receipts, e-feed, exit legs,
ch_writer, broad-except), NO-RECONCILE guardrail on the P0 background task.
Handover item 8 updated to fleet-ready.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 18:01:28 +02:00

128 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 via
`uv_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 push` both 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)
1. **UV DDL apply + spool drain** (above). Unblocks the mechanics characterization
the relaxed gate is paying for.
2. **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).
3. **ADVSL staleness guard**: `_last_price` has 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.
4. **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).
5. **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.
6. **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.
7. **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.
8. **Indeterminate sweep codebase-wide — NOW SPECCED FOR FLEET**: pi red-teamed
the class (`COMPREHENSIVE_UV_EDGE_CASE_THEORETICALS.md`); Fable reviewed
2026-07-13 eve: doc FAITHFUL (2 factual errors fixed in-place: venue.py:43
location, 07-13 date), submit seam fully covered, **7 missing seams
enumerated in its §11 (M1–M7)**: cancel, leverage SET, promotion receipts,
E-feed gaps, exit legs, ch_writer dups, broad-except sweep. §11 carries the
NO-RECONCILE guardrail for the P0 background task. Fleet-ready: one seam
per agent; test pattern = test_indeterminate_submit.py.
9. **TIER-B inversion** (open): asex_kernel_executor.py:319 enqueues account/fill
at P4 below ENTER P3 — execution truth must outrank entries.
10. **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.
11. **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)
1. **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.
2. **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 journaled `leverage=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.
**OPERATOR RULING 2026-07-13: can wait AS LONG AS the clamp bugs DOWNWARD
and/or stays within the 3x cap.** Observed instance was 3→2 = downward =
within ruling. If any instance clamps UPWARD or breaches 3x → immediate.
3. **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.
4. **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.
5. **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).