tests/services/test_tide_etf_reasoning.py:654: in test_reason_event_bad_decision_coerced_no_trade out = TR.reason_tide_event(date(2026, 7, 6), ev, _timeline()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ev = {'direction': 'up', 'et': '10:00:00', 'kind': 'rollover_up', 'via': 'mt3'} monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x1256edd90> rtrader/services/tide_etf_reasoning.py:4535: in reason_tide_event prefix = _morning_prefix(day, str(event.get("et") or "")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ attempts = 3 conf = None day = datetime.date(2026, 7, 6) entry_facts = None event = {'direction': 'up', 'et': '10:00:00', 'kind': 'rollover_up', 'via': 'mt3'} max_tokens = 5000 model = None struct_ctx = None system_prompt = None timeline = {'day': '2026-07-06', 'fake_up_peak': {'et': '11:03', 'mean_pct': 0.813}, 'gap_down': (False, None, None), 'gap_up': (True, '09:30:00', '11:30:00'), ...} rtrader/services/tide_etf_reasoning.py:4315: in _morning_prefix return morning_prefix_for_consult(day, event_et) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ day = datetime.date(2026, 7, 6) event_et = '10:00:00' morning_prefix_for_consult = rtrader/services/morning_prior_day.py:336: in morning_prefix_for_consult return morning_prior_day_block(day, db_factory=db_factory) + "\n\n" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ day = datetime.date(2026, 7, 6) db_factory = None et = '10:00' event_et = '10:00:00' rtrader/services/morning_prior_day.py:278: in morning_prior_day_block late_turns = load_late_turns(d1) ^^^^^^^^^^^^^^^^^^^ d1 = datetime.date(2026, 7, 2) d1_iso = '2026-07-02' day = datetime.date(2026, 7, 6) db_factory = None late_turns = None ledger_rows = None profile = {'blocks': [BlockStory(direction='DOWN', start_et='09:30', end_et='09:42', duration_min=12, size=7.95, share_of_day=0....de. One side never got answered — the band goes home loaded on the TNA-below-crowd side.', 'close_stretch': 3.037, ...} rtrader/services/morning_prior_day.py:82: in load_late_turns for o in compute_rollover_onsets(day) or []: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ after_et = '14:00' compute_rollover_onsets = day = datetime.date(2026, 7, 2) out = [] rtrader/services/market_turn_algo_sim.py:459: in compute_rollover_onsets km_up = _km60_up(s, anchor, i, km_win=km_win, _cache=_picks_cache) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _gu_gate = True _km_min_bars = 30 _picks_cache = {0: None, 1: None, 2: None, 3: None, ...} _trs = anchor = datetime.datetime(2026, 7, 2, 9, 30, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')) day = datetime.date(2026, 7, 2) db_factory = None direction = 'down' dn = False end = None f = {'direction': 'up', 'fire_et': '18:45:46', 'fire_ts': datetime.datetime(2026, 7, 2, 22, 45, 46, 342000, tzinfo=datetime.timezone.utc), 'min_ticks': 3, ...} fires = {'down': False, 'up': False} gap_down_gate = True gap_fired = True gap_hi = datetime.datetime(2026, 7, 2, 11, 30, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')) gap_lo = datetime.datetime(2026, 7, 2, 9, 30, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')) gap_up_gate = True gapdn_fired = False gapdn_hi = None gapdn_lo = None i = 36 in_gap = True in_gapdn = False km_dn = False km_up = False km_win = None mt3_dn_hit = False mt3_down_min = {datetime.datetime(2026, 7, 2, 10, 1, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')), datetime.datetime(2026, 7, 2,...(key='America/New_York')), datetime.datetime(2026, 7, 2, 11, 2, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')), ...} mt3_up_hit = False mt3_up_min = set() out = [{'direction': 'down', 'down_vol': 250002957018.0, 'fire_et': '10:01:00', 'fire_ts': datetime.datetime(2026, 7, 2, 14, 1, tzinfo=datetime.timezone.utc), ...}] prev = {'down': False, 'up': False} regime_gap_up = False s = _Series(T=[datetime.datetime(2026, 7, 2, 9, 30, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')), datetime.datetime(2...685.0, 629945847137.0, 628191442895.0, 625621870356.0, 621362542811.0, 619078640240.0, 613987424600.0, 616034921743.0]) t = datetime.datetime(2026, 7, 2, 10, 6, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')) tmin = datetime.datetime(2026, 7, 2, 10, 5, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')) up = False via = {'down': 'mt3-accel', 'up': 'mt3-accel'} rtrader/services/market_turn_algo_sim.py:223: in _km60_up picks = _km60_picks(s, anchor_ts, i, km_win=km_win, _cache=_cache) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _cache = {0: None, 1: None, 2: None, 3: None, ...} anchor_ts = datetime.datetime(2026, 7, 2, 9, 30, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')) i = 36 km_win = None s = _Series(T=[datetime.datetime(2026, 7, 2, 9, 30, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')), datetime.datetime(2...685.0, 629945847137.0, 628191442895.0, 625621870356.0, 621362542811.0, 619078640240.0, 613987424600.0, 616034921743.0]) rtrader/services/market_turn_algo_sim.py:204: in _km60_picks km = KMeans(n_clusters=3, n_init=4, random_state=0).fit(vv) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ KMeans = _cache = {0: None, 1: None, 2: None, 3: None, ...} anchor_ts = datetime.datetime(2026, 7, 2, 9, 30, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')) i = 36 idx = [0, 1, 2, 3, 4, 5, ...] km_win = None lo_t = datetime.datetime(2026, 7, 2, 9, 30, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')) s = _Series(T=[datetime.datetime(2026, 7, 2, 9, 30, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')), datetime.datetime(2...685.0, 629945847137.0, 628191442895.0, 625621870356.0, 621362542811.0, 619078640240.0, 613987424600.0, 616034921743.0]) vv = array([[1.01190654e+12], [1.01223976e+12], [1.00849544e+12], [1.01282098e+12], [1.01186873... [1.01439202e+12], [1.01379674e+12], [1.01416832e+12], [1.01403242e+12], [1.01201824e+12]]) ../.pyenv/versions/3.12.12/lib/python3.12/site-packages/sklearn/base.py:1365: in wrapper return fit_method(estimator, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ args = (array([[1.01190654e+12], [1.01223976e+12], [1.00849544e+12], [1.01282098e+12], [1.0118687...1.01439202e+12], [1.01379674e+12], [1.01416832e+12], [1.01403242e+12], [1.01201824e+12]]),) estimator = KMeans(n_clusters=3, n_init=4, random_state=0) fit_method = global_skip_validation = False kwargs = {} partial_fit_and_fitted = False prefer_skip_nested_validation = True ../.pyenv/versions/3.12.12/lib/python3.12/site-packages/sklearn/cluster/_kmeans.py:1510: in fit labels, inertia, centers, n_iter_ = kmeans_single( X = array([[-1.26780769e+09], [-9.34587541e+08], [-4.67890271e+09], [-3.53365130e+08], [-1.305...21767304e+09], [ 6.22393848e+08], [ 9.93973010e+08], [ 8.58076565e+08], [-1.15610387e+09]]) X_mean = array([1.01317434e+12]) best_centers = array([[-8.46664155e+08], [ 6.81979858e+08], [-4.67890271e+09]]) best_inertia = 7.207561672318747e+18 best_labels = array([0, 0, 2, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0], dtype=int32) best_n_iter = 5 centers = array([[ 8.61204081e+08], [-1.97613869e+09], [-1.98831231e+08]]) centers_init = array([[-4.67890271e+09], [ 7.13490929e+08], [-7.86992695e+08]]) i = 2 inertia = 1.2523184073298803e+19 init = 'k-means++' init_is_array_like = False kmeans_single = labels = array([1, 2, 1, 2, 1, 0, 2, 0, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 2, 1, 2, 0, 0, 0, 2, 2, 0, 1, 2, 2, 2, 0, 0, 0, 0, 1], dtype=int32) n_iter_ = 7 random_state = RandomState(MT19937) at 0x125B9BA40 sample_weight = array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]) self = KMeans(n_clusters=3, n_init=4, random_state=0) x_squared_norms = array([1.60733634e+18, 8.73453872e+17, 2.18921306e+19, 1.24866915e+17, 1.70463649e+18, 6.08362786e+17, 9.307720...744e+17, 2.70738284e+17, 1.48272764e+18, 3.87374102e+17, 9.87982344e+17, 7.36295391e+17, 1.33657616e+18]) y = None ../.pyenv/versions/3.12.12/lib/python3.12/site-packages/sklearn/utils/parallel.py:173: in wrapper return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ args = (array([[-1.26780769e+09], [-9.34587541e+08], [-4.67890271e+09], [-3.53365130e+08], [-1.30...., 1., 1., 1., 1., 1., 1., 1.]), array([[-4.67890271e+09], [ 7.13490929e+08], [-7.86992695e+08]])) controller = func = kwargs = {'max_iter': 300, 'n_threads': 8, 'tol': np.float64(132745499570201.9), 'verbose': 0} limits = 1 user_api = 'blas' ../.pyenv/versions/3.12.12/lib/python3.12/site-packages/sklearn/cluster/_kmeans.py:700: in _kmeans_single_lloyd lloyd_iter( X = array([[-1.26780769e+09], [-9.34587541e+08], [-4.67890271e+09], [-3.53365130e+08], [-1.305...21767304e+09], [ 6.22393848e+08], [ 9.93973010e+08], [ 8.58076565e+08], [-1.15610387e+09]]) _inertia = center_shift = array([ 0. , 28303394.20129859, 60407489.69523799]) center_shift_tot = np.float64(4450146934594387.5) centers = array([[-4.67890271e+09], [ 7.13490929e+08], [-7.86992695e+08]]) centers_init = array([[-4.67890271e+09], [ 7.13490929e+08], [-7.86992695e+08]]) centers_new = array([[-4.67890271e+09], [ 1.56855367e+10], [-1.10066340e+10]]) i = 2 labels = array([2, 2, 0, 2, 2, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 1, 1, 1, 1, 2], dtype=int32) labels_old = array([2, 2, 0, 2, 2, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 1, 1, 1, 1, 2], dtype=int32) lloyd_iter = max_iter = 300 n_clusters = 3 n_threads = 8 sample_weight = array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]) strict_convergence = False tol = np.float64(132745499570201.9) verbose = 0 weight_in_clusters = array([ 1., 23., 13.]) sklearn/cluster/_k_means_lloyd.pyx:164: in sklearn.cluster._k_means_lloyd.lloyd_iter_chunked_dense ??? sklearn/cluster/_k_means_common.pyx:284: in sklearn.cluster._k_means_common._average_centers ??? ../.pyenv/versions/3.12.12/lib/python3.12/site-packages/numpy/_core/fromnumeric.py:1341: in argmax return _wrapfunc(a, 'argmax', axis=axis, out=out, **kwds) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ a = axis = None keepdims = kwds = {} out = None ../.pyenv/versions/3.12.12/lib/python3.12/site-packages/numpy/_core/fromnumeric.py:54: in _wrapfunc return _wrapit(obj, method, *args, **kwds) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ args = () bound = None kwds = {'axis': None, 'out': None} method = 'argmax' obj = ../.pyenv/versions/3.12.12/lib/python3.12/site-packages/numpy/_core/fromnumeric.py:46: in _wrapit result = getattr(arr, method)(*args, **kwds) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E Failed: Timeout (>60.0s) from pytest-timeout. args = () arr = array([ 1., 23., 13.]) conv = kwds = {'axis': None, 'out': None} method = 'argmax' obj =