[gw0] darwin -- Python 3.12.12 /Users/cao/.pyenv/versions/3.12.12/bin/python3.12
 [1m [31mrtrader/utils/nfs.py [0m:289: in read_text_with_status
     [0mresult = future.result(timeout=timeout) [90m [39;49;00m
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [90m [39;49;00m
        executor   = <concurrent.futures.thread.ThreadPoolExecutor object at 0x127a3be00>
        future     = <Future at 0x1279495e0 state=finished raised FileNotFoundError>
        path       = PosixPath('/Users/cao/mnt/silverssd/minio-mirror/data/snapshots/2026-01-30/SPY.json')
        s3key      = 'snapshots/2026-01-30/SPY.json'
        timeout    = 2.0
 [1m [31m../.pyenv/versions/3.12.12/lib/python3.12/concurrent/futures/_base.py [0m:456: in result
     [0m [94mreturn [39;49;00m  [96mself [39;49;00m.__get_result() [90m [39;49;00m
           ^^^^^^^^^^^^^^^^^^^ [90m [39;49;00m
        self       = None
        timeout    = 2.0
 [1m [31m../.pyenv/versions/3.12.12/lib/python3.12/concurrent/futures/_base.py [0m:401: in __get_result
     [0m [94mraise [39;49;00m  [96mself [39;49;00m._exception [90m [39;49;00m
        self       = None
 [1m [31m../.pyenv/versions/3.12.12/lib/python3.12/concurrent/futures/thread.py [0m:59: in run
     [0mresult =  [96mself [39;49;00m.fn(* [96mself [39;49;00m.args, ** [96mself [39;49;00m.kwargs) [90m [39;49;00m
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [90m [39;49;00m
        self       = None
 [1m [31m../.pyenv/versions/3.12.12/lib/python3.12/pathlib.py [0m:1027: in read_text
     [0m [94mwith [39;49;00m  [96mself [39;49;00m.open(mode= [33m' [39;49;00m [33mr [39;49;00m [33m' [39;49;00m, encoding=encoding, errors=errors)  [94mas [39;49;00m f: [90m [39;49;00m
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [90m [39;49;00m
        encoding   = 'locale'
        errors     = None
        self       = PosixPath('/Users/cao/mnt/silverssd/minio-mirror/data/snapshots/2026-01-30/SPY.json')
 [1m [31m../.pyenv/versions/3.12.12/lib/python3.12/pathlib.py [0m:1013: in open
     [0m [94mreturn [39;49;00m io.open( [96mself [39;49;00m, mode, buffering, encoding, errors, newline) [90m [39;49;00m
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [90m [39;49;00m
 [1m [31mE   FileNotFoundError: [Errno 2] No such file or directory: '/Users/cao/mnt/silverssd/minio-mirror/data/snapshots/2026-01-30/SPY.json' [0m
        buffering  = -1
        encoding   = 'locale'
        errors     = None
        mode       = 'r'
        newline    = None
        self       = PosixPath('/Users/cao/mnt/silverssd/minio-mirror/data/snapshots/2026-01-30/SPY.json')

 [33mDuring handling of the above exception, another exception occurred: [0m
 [1m [31mtests/cli/test_sector_momentum_filter.py [0m:1088: in test_breakout_exception_disabled_by_setting
     [0mresult = apply_filter( [90m [39;49;00m
        apply_filter = <function apply_sector_momentum_filter at 0x121816480>
        date       = <class 'datetime.date'>
        mock_breakout = <MagicMock name='check_soft_sector_breakout' id='4958957984'>
        mock_settings = <MagicMock id='4958325360'>
        picks      = [{'momentum_final_score': 50.0, 'sector': 'Consumer Defensive', 'symbol': 'BG'}]
        self       = <test_sector_momentum_filter.TestSectorBreakoutException object at 0x1210d3560>
 [1m [31mrtrader/cli/trader_eod_core/services/log_formatting_service.py [0m:1398: in apply_sector_momentum_filter
     [0m_spy_status, _spy_text = read_text_with_status(_spy_path) [90m [39;49;00m
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [90m [39;49;00m
        CAUTION_WORSENING_BLOCK = True
        CHANNEL_REGIME_FILTER_ENABLED = True
        EXHAUSTION_FILTER_ENABLED = True
        INSTITUTIONAL_DISTRIBUTION_FILTER_ENABLED = True
        NEGATIVE_MOMENTUM_FILTER_ENABLED = False
        NEGATIVE_SCORE_FILTER_ENABLED = False
        NfsReadStatus = <enum 'NfsReadStatus'>
        OK_WORSENING_FILTER_ENABLED = True
        OPTIONS_BEARISH_THRESHOLD = 1.0
        OPTIONS_BULLISH_THRESHOLD = 1.0
        OPTIONS_SENTIMENT_ENABLED = True
        OVERHEATED_SECTOR_FILTER_ENABLED = False
        SECTOR_BREAKOUT_EXCEPTION_ENABLED = False
        SECTOR_BREAKOUT_LOOKBACK_DAYS = 90
        SECTOR_BREAKOUT_MIN_BREAKOUT_CONF = 0.6
        SECTOR_BREAKOUT_MIN_CORRELATION = 0.3
        SECTOR_BREAKOUT_MIN_MEMBERSHIP_CONF = 0.4
        SYMBOL_CROSS_CHECK_THRESHOLD = 1.0
        TREND_STATE_FILTER_ENABLED = False
        _capitulation = False
        _find_spy_snap = <function find_snapshot_json at 0x121e01f80>
        _json_spy  = <module 'json' from '/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/json/__init__.py'>
        _load_sector_channel = <function apply_sector_momentum_filter.<locals>._load_sector_channel at 0x127afb060>
        _market_defensive = False
        _sector_channel_cache = {}
        _spy_dvr   = 0.0
        _spy_path  = PosixPath('/Users/cao/mnt/silverssd/minio-mirror/data/snapshots/2026-01-30/SPY.json')
        _spy_regime = ''
        _spy_slope = 0.0
        _spy_snapshot_row = None
        _symbol_options_bearish = <function apply_sector_momentum_filter.<locals>._symbol_options_bearish at 0x1279ad8a0>
        bearish_families = set()
        cfg        = <MagicMock id='4958325360'>
        exempt_symbols = None
        market_stress_level = None
        picks      = [{'momentum_final_score': 50.0, 'sector': 'Consumer Defensive', 'symbol': 'BG'}]
        read_text_with_status = <function read_text_with_status at 0x121e01760>
        result     = SectorMomentumFilterResult(filtered_picks=[], filtered_out_by_sector={}, saved_by_individual_momentum=[], filtered_out...stribution=[], filtered_out_by_channel_regime={}, market_defensive=False, spy_momentum_guard=False, spy_regime_info='')
        sector_direction = None
        sector_momentum_data = None
        sector_options_sentiment = None
        snapshot_dir = None
        symbol_options_sentiment = None
        symbol_sectors = {'BG': 'Consumer Defensive'}
        trading_day = datetime.date(2026, 1, 30)
        trend_stats_cache = {}
        weak_sectors = {'XLP'}
 [1m [31mrtrader/utils/nfs.py [0m:312: in read_text_with_status
     [0mminio_text = _read_from_minio(s3key) [90m [39;49;00m
                 ^^^^^^^^^^^^^^^^^^^^^^^ [90m [39;49;00m
        executor   = <concurrent.futures.thread.ThreadPoolExecutor object at 0x127a3be00>
        future     = <Future at 0x1279495e0 state=finished raised FileNotFoundError>
        path       = PosixPath('/Users/cao/mnt/silverssd/minio-mirror/data/snapshots/2026-01-30/SPY.json')
        s3key      = 'snapshots/2026-01-30/SPY.json'
        timeout    = 2.0
 [1m [31mrtrader/utils/nfs.py [0m:239: in _read_from_minio
     [0mresponse = client.get_object(bucket_name= [33m" [39;49;00m [33mdata [39;49;00m [33m" [39;49;00m, object_name=s3key) [90m [39;49;00m
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [90m [39;49;00m
        _is_minio_reachable = <function _is_minio_reachable at 0x121482480>
        client     = <minio.api.Minio object at 0x127a3be90>
        minio_client = <function minio_client at 0x121482840>
        s3key      = 'snapshots/2026-01-30/SPY.json'
 [1m [31m../.pyenv/versions/3.12.12/lib/python3.12/site-packages/minio/api.py [0m:1257: in get_object
     [0m [94mreturn [39;49;00m  [96mself [39;49;00m._execute( [90m [39;49;00m
        bucket_name = 'data'
        extra_query_params = None
        headers    = {}
        length     = 0
        object_name = 'snapshots/2026-01-30/SPY.json'
        offset     = 0
        request_headers = None
        self       = <minio.api.Minio object at 0x127a3be90>
        ssec       = None
        version_id = None
 [1m [31m../.pyenv/versions/3.12.12/lib/python3.12/site-packages/minio/api.py [0m:444: in _execute
     [0m [94mreturn [39;49;00m  [96mself [39;49;00m._url_open( [90m [39;49;00m
        body       = None
        bucket_name = 'data'
        headers    = {}
        method     = 'GET'
        no_body_trace = False
        object_name = 'snapshots/2026-01-30/SPY.json'
        preload_content = False
        query_params = None
        region     = 'us-east-1'
        self       = <minio.api.Minio object at 0x127a3be90>
 [1m [31m../.pyenv/versions/3.12.12/lib/python3.12/site-packages/minio/api.py [0m:306: in _url_open
     [0mresponse =  [96mself [39;49;00m._http.urlopen( [90m [39;49;00m
        body       = None
        bucket_name = 'data'
        creds      = Credentials(access_key='minioadmin', secret_key='minioadmin', session_token=None, expiration=None)
        date       = datetime.datetime(2026, 7, 5, 11, 5, 53, 717508, tzinfo=datetime.timezone.utc)
        headers    = {'Authorization': 'AWS4-HMAC-SHA256 Credential=minioadmin/20260705/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz...m64) minio-py/7.2.20', 'x-amz-content-sha256': 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', ...}
        http_headers = HTTPHeaderDict({'Host': '100.85.98.88:9000', 'User-Agent': 'MinIO (Darwin; arm64) minio-py/7.2.20', 'x-amz-content-sha...ers=host;x-amz-content-sha256;x-amz-date, Signature=c94898149a373887f29016fa6cc59a510cf6af189991a7a0e3a8364701573d68'})
        key        = 'Authorization'
        method     = 'GET'
        no_body_trace = False
        object_name = 'snapshots/2026-01-30/SPY.json'
        preload_content = False
        query_params = None
        region     = 'us-east-1'
        self       = <minio.api.Minio object at 0x127a3be90>
        url        = SplitResult(scheme='http', netloc='100.85.98.88:9000', path='/data/snapshots/2026-01-30/SPY.json', query='', fragment='')
        value      = 'AWS4-HMAC-SHA256 Credential=minioadmin/20260705/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=c94898149a373887f29016fa6cc59a510cf6af189991a7a0e3a8364701573d68'
 [1m [31m../.pyenv/versions/3.12.12/lib/python3.12/site-packages/urllib3/poolmanager.py [0m:376: in urlopen
     [0mresponse = conn.urlopen(method, u.request_uri, **kw) [90m [39;49;00m
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [90m [39;49;00m
        conn       = <urllib3.connectionpool.HTTPConnectionPool object at 0x127a40110>
        kw         = {'assert_same_host': False, 'body': None, 'headers': HTTPHeaderDict({'Host': '100.85.98.88:9000', 'User-Agent': 'MinIO...amz-date, Signature=c94898149a373887f29016fa6cc59a510cf6af189991a7a0e3a8364701573d68'}), 'preload_content': False, ...}
        method     = 'GET'
        redirect   = True
        self       = <urllib3.poolmanager.PoolManager object at 0x127a3bc20>
        u          = Url(scheme='http', auth=None, host='100.85.98.88', port=9000, path='/data/snapshots/2026-01-30/SPY.json', query=None, fragment=None)
        url        = 'http://100.85.98.88:9000/data/snapshots/2026-01-30/SPY.json'
 [1m [31m../.pyenv/versions/3.12.12/lib/python3.12/site-packages/urllib3/connectionpool.py [0m:895: in urlopen
     [0mretries.sleep(response) [90m [39;49;00m
        assert_same_host = False
        body       = None
        body_pos   = None
        chunked    = False
        clean_exit = True
        conn       = <urllib3.connection.HTTPConnection object at 0x127a40590>
        destination_scheme = None
        err        = None
        has_retry_after = True
        headers    = HTTPHeaderDict({'Host': '100.85.98.88:9000', 'User-Agent': 'MinIO (Darwin; arm64) minio-py/7.2.20', 'x-amz-content-sha...ers=host;x-amz-content-sha256;x-amz-date, Signature=c94898149a373887f29016fa6cc59a510cf6af189991a7a0e3a8364701573d68'})
        http_tunnel_required = False
        httplib_response = <http.client.HTTPResponse object at 0x1279fa230>
        is_new_proxy_conn = False
        method     = 'GET'
        parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/data/snapshots/2026-01-30/SPY.json', query=None, fragment=None)
        pool_timeout = None
        redirect   = False
        redirect_location = False
        release_conn = False
        release_this_conn = False
        response   = <urllib3.response.HTTPResponse object at 0x1279fb100>
        response_conn = <urllib3.connection.HTTPConnection object at 0x127a40590>
        response_kw = {'preload_content': False, 'request_method': 'GET'}
        retries    = Retry(total=9, connect=None, read=None, redirect=0, status=None)
        self       = <urllib3.connectionpool.HTTPConnectionPool object at 0x127a40110>
        timeout    = <object object at 0x104c41dc0>
        timeout_obj = Timeout(connect=10.0, read=60.0, total=120.0)
        url        = '/data/snapshots/2026-01-30/SPY.json'
 [1m [31m../.pyenv/versions/3.12.12/lib/python3.12/site-packages/urllib3/util/retry.py [0m:430: in sleep
     [0mslept =  [96mself [39;49;00m.sleep_for_retry(response) [90m [39;49;00m
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [90m [39;49;00m
        response   = <urllib3.response.HTTPResponse object at 0x1279fb100>
        self       = Retry(total=9, connect=None, read=None, redirect=0, status=None)
 [1m [31m../.pyenv/versions/3.12.12/lib/python3.12/site-packages/urllib3/util/retry.py [0m:409: in sleep_for_retry
     [0mtime.sleep(retry_after) [90m [39;49;00m
 [1m [31mE   Failed: Timeout (>60.0s) from pytest-timeout. [0m
        response   = <urllib3.response.HTTPResponse object at 0x1279fb100>
        retry_after = 60
        self       = Retry(total=9, connect=None, read=None, redirect=0, status=None)
