Snapshot PINK DITAv2 system + Sprint 0 flaw-fix verification

First commit of the previously-untracked PINK-on-DITAv2 migration system
(execution moves to the Rust kernel; policy stays on legacy DITA, so Alpha
Engine algorithmic integrity is preserved). BLUE is untouched.

Sprint 0 (safety snapshot + flaw-fix verification, MARKET single-leg scope):
- Verified Rust FSM fixes (flaws 2,4,10,11,13) by source read of lib.rs.
- Hardened 5 vacuous/guarded assertions in test_flaws.py so each flaw test
  genuinely exercises its fix. Most important: Flaw 5 now asserts capital
  moves by EXACTLY realized PnL (was entering/exiting at the same price).
- Offline suites: 533 passed, 0 failed (35 flaws + 402 kernel/accounting/
  bridge + 96 runtime/persistence/multi-exit/restart/seams).
- GATE PASS: MARKET-path-critical flaws 1,2,5 confirmed fixed + green.
- Added SPRINT0_FLAW_VERIFICATION.md report and _rust_kernel/.gitignore
  (excludes Rust target/ build artifacts).

LIMIT/partial-fill remain explicitly out of scope (MARKET-only bring-up).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Codex
2026-05-30 18:26:43 +02:00
parent 34d01fe6a4
commit 3d7b00e28d
89 changed files with 32782 additions and 0 deletions

View File

@@ -0,0 +1,139 @@
"""Decision → KernelIntent mapping table tests for PINK → DITAv2 bridge."""
from __future__ import annotations
from datetime import datetime, timezone
import unittest
import sys
import os
# Minimal import path — avoid dita_v2.__init__ which pulls in bingx_venue + legacy DITA
sys.path.insert(0, "/mnt/dolphinng5_predict/prod")
sys.path.insert(0, "/mnt/dolphinng5_predict/prod/clean_arch")
os.environ.setdefault("HZ_CLUSTER", "dolphin")
os.environ.setdefault("HZ_HOST", "localhost:5701")
os.environ.setdefault("BINGX_API_KEY", "test")
os.environ.setdefault("BINGX_SECRET_KEY", "test")
from clean_arch.dita import (
Decision,
DecisionAction,
Intent,
TradeSide as LegacyTradeSide,
TradeStage as LegacyTradeStage,
)
from clean_arch.dita_v2.contracts import (
KernelCommandType,
KernelIntent,
TradeSide as DitaTradeSide,
)
from clean_arch.runtime.pink_direct import _decision_to_kernel_intent
def _make_test_decision(
action: DecisionAction = DecisionAction.ENTER,
side: LegacyTradeSide = LegacyTradeSide.SHORT,
) -> Decision:
return Decision(
timestamp=datetime.now(timezone.utc),
decision_id="test-decision-001",
asset="BTCUSDT",
action=action,
side=side,
reason="test",
confidence=0.8,
velocity_divergence=-0.03,
irp_alignment=0.5,
reference_price=65000.0,
target_size=0.01,
leverage=2.0,
bars_held=0,
stage=LegacyTradeStage.ORDER_REQUESTED,
metadata={},
)
def _make_test_intent(
action: DecisionAction = DecisionAction.ENTER,
side: LegacyTradeSide = LegacyTradeSide.SHORT,
) -> Intent:
return Intent(
timestamp=datetime.now(timezone.utc),
trade_id="test-trade-001",
decision_id="test-decision-001",
asset="BTCUSDT",
action=action,
side=side,
reason="test",
target_size=0.01,
leverage=2.0,
reference_price=65000.0,
confidence=0.8,
bars_held=0,
stage=LegacyTradeStage.INTENT_CREATED,
exit_leg_ratios=(0.5, 1.0),
metadata={"entry_velocity_divergence": -0.03},
)
class TestDecisionToKernelIntent(unittest.TestCase):
"""Verify every DecisionAction maps to the correct KernelCommandType."""
maxDiff = None
def test_enter_maps_to_enter(self):
decision = _make_test_decision(DecisionAction.ENTER)
intent = _make_test_intent(DecisionAction.ENTER)
ki = _decision_to_kernel_intent(decision, intent, slot_id=0)
self.assertEqual(ki.action, KernelCommandType.ENTER)
self.assertEqual(ki.slot_id, 0)
self.assertEqual(ki.trade_id, "test-trade-001")
self.assertEqual(ki.asset, "BTCUSDT")
self.assertEqual(ki.side, DitaTradeSide.SHORT)
self.assertEqual(ki.reference_price, 65000.0)
self.assertEqual(ki.target_size, 0.01)
self.assertEqual(ki.leverage, 2.0)
self.assertEqual(ki.exit_leg_ratios, (0.5, 1.0))
def test_exit_maps_to_exit(self):
decision = _make_test_decision(DecisionAction.EXIT)
intent = _make_test_intent(DecisionAction.EXIT)
ki = _decision_to_kernel_intent(decision, intent, slot_id=0)
self.assertEqual(ki.action, KernelCommandType.EXIT)
def test_hold_maps_to_mark_price(self):
decision = _make_test_decision(DecisionAction.HOLD)
intent = _make_test_intent(DecisionAction.HOLD)
ki = _decision_to_kernel_intent(decision, intent, slot_id=0)
self.assertEqual(ki.action, KernelCommandType.MARK_PRICE)
def test_side_long_maps_correctly(self):
decision = _make_test_decision(DecisionAction.ENTER, LegacyTradeSide.LONG)
intent = _make_test_intent(DecisionAction.ENTER, LegacyTradeSide.LONG)
ki = _decision_to_kernel_intent(decision, intent, slot_id=0)
self.assertEqual(ki.side, DitaTradeSide.LONG)
def test_side_short_maps_correctly(self):
decision = _make_test_decision(DecisionAction.ENTER, LegacyTradeSide.SHORT)
intent = _make_test_intent(DecisionAction.ENTER, LegacyTradeSide.SHORT)
ki = _decision_to_kernel_intent(decision, intent, slot_id=0)
self.assertEqual(ki.side, DitaTradeSide.SHORT)
def test_metadata_is_preserved(self):
decision = _make_test_decision()
intent = _make_test_intent()
intent.metadata["exit_ratio"] = 0.5
ki = _decision_to_kernel_intent(decision, intent, slot_id=0)
self.assertEqual(ki.metadata.get("exit_ratio"), 0.5)
self.assertEqual(ki.metadata.get("entry_velocity_divergence"), -0.03)
def test_slot_id_passthrough(self):
decision = _make_test_decision()
intent = _make_test_intent()
ki = _decision_to_kernel_intent(decision, intent, slot_id=5)
self.assertEqual(ki.slot_id, 5)
if __name__ == "__main__":
unittest.main()