| [gw0] darwin -- Python 3.12.12 /Users/cao/.pyenv/versions/3.12.12/bin/python3.12
|
| tests/test_verdict_recovery.py:397: in test_guard_disabled_setting_bypasses_check
|
| dispatched, _mock_add_plan = _run_dispatch_with_guard(
|
| self = <tests.test_verdict_recovery.TestDispatchRecycleGuardCallSite object at 0x128e01220>
|
| tests/test_verdict_recovery.py:330: in _run_dispatch_with_guard
|
| dispatched = dispatch_llm_verdicts(trading_day="2026-04-18", dry_run=True)
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| NfsReadStatus = <enum 'NfsReadStatus'>
|
| buyback_doc = {'account_nick': 'cuixia', 'buy_filled_at': datetime.datetime(2026, 4, 16, 14, 0), 'dispatch': 'verdict-buy_back-ulcc-cuixia', 'status': 'holding', ...}
|
| call_count = [2]
|
| col = <MagicMock id='5031178464'>
|
| dispatch_llm_verdicts = <function dispatch_llm_verdicts at 0x125fe7ec0>
|
| find_side_effect = <function _run_dispatch_with_guard.<locals>.find_side_effect at 0x12a0013a0>
|
| k = 'VERDICT_RECYCLE_SELL_GUARD_ENABLED'
|
| mock_add_plan = <MagicMock id='5035930640'>
|
| mock_db = <MagicMock id='5031179952'>
|
| mock_db_ctx = <MagicMock id='5035926224'>
|
| mock_read_nfs = <MagicMock id='5031280320'>
|
| mock_scheduler = <MagicMock id='4988565312'>
|
| mock_settings = <MagicMock id='4988559312'>
|
| positions = [{'account_nick': 'cuixia', 'avg_entry_price': 4.0, 'current_price': 4.5, 'days_held': 4, ...}]
|
| recycle_guard_hit = True
|
| settings_overrides = {'VERDICT_RECYCLE_SELL_GUARD_ENABLED': False}
|
| v = False
|
| verdicts = [{'account_nick': 'cuixia', 'action': 'exit', 'buy_price': 4.0, 'confidence': 0.85, ...}]
|
| rtrader/utils/daily_summary_llm.py:10073: in dispatch_llm_verdicts
|
| from rtrader.services.channel_scalp_service import ChannelScalpRepository as _CSR_demote
|
| DBAccounting = <MagicMock name='DBAccounting' id='4977276688'>
|
| _DBA_conv = <MagicMock name='DBAccounting' id='4977276688'>
|
| _ET = <DstTzInfo 'America/New_York' LMT-1 day, 19:04:00 STD>
|
| _act = 'exit'
|
| _action = 'exit'
|
| _action_counts = {'exit': 1}
|
| _action_end = 360
|
| _close_dt = None
|
| _conv_job = None
|
| _db_conv = <MagicMock id='5031179952'>
|
| _dedup_query = {'account_nick': 'cuixia', 'date': {'$gte': datetime.datetime(2026, 6, 6, 0, 0), '$lt': datetime.datetime(2026, 6, 7, 0, 0)}, 'status': {'$in': ['pending', 'processing', 'review']}, 'symbol': 'ULCC'}
|
| _dedup_statuses = ['pending', 'processing', 'review']
|
| _dropped_unbought = 0
|
| _hay = 'test exit '
|
| _is_option_plan = False
|
| _kept = [{'account_nick': 'cuixia', 'action': 'exit', 'buy_price': 4.0, 'confidence': 0.85, ...}]
|
| _keyword_hit = False
|
| _minutes_to_close = 999
|
| _mode = 'DRY-RUN'
|
| _now_et = datetime.datetime(2026, 6, 6, 8, 12, 7, 748085, tzinfo=<DstTzInfo 'America/New_York' EDT-1 day, 20:00:00 DST>)
|
| _pre_close_min_confidence = 0.75
|
| _pre_close_mode = False
|
| _reason_l = 'test exit'
|
| _resilient_forced = 0
|
| _resilient_score_floor = 1.0
|
| _score_hit = False
|
| _score_val = 0.0
|
| _signals_l = ''
|
| _summary = '1×exit'
|
| _v = {'account_nick': 'cuixia', 'action': 'exit', 'buy_price': 4.0, 'confidence': 0.85, ...}
|
| account_nick = 'cuixia'
|
| action = 'exit'
|
| actionable = [{'account_nick': 'cuixia', 'action': 'exit', 'buy_price': 4.0, 'confidence': 0.85, ...}]
|
| add_bonus_budget = {}
|
| add_budget_override = 0.0
|
| add_trading_plan = <MagicMock id='5035930640'>
|
| buy_actions = []
|
| buyback_quote_cache = {}
|
| col = <MagicMock id='5031178464'>
|
| confidence = 0.85
|
| current_price = 4.5
|
| delisted_symbols = set()
|
| dispatched = []
|
| dry_run = True
|
| existing = None
|
| get_per_order_budget = <MagicMock name='get_per_order_budget' id='4988139664'>
|
| is_option = False
|
| is_position_locked = <MagicMock name='is_position_locked' id='4987932352'>
|
| key = 'ULCC|cuixia'
|
| linked_enabled = False
|
| local_date_str = '2026-06-06'
|
| locks_col = <MagicMock id='5031178464'>
|
| math = <module 'math' from '/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/lib-dynload/math.cpython-312-darwin.so'>
|
| max_bonus_mult = 1.0
|
| min_confidence = 0.6
|
| mongo = <MagicMock id='5031179952'>
|
| p = {'account_nick': 'cuixia', 'avg_entry_price': 4.0, 'current_price': 4.5, 'days_held': 4, ...}
|
| panic_active = False
|
| plan_date = '2026-06-06'
|
| plan_params = {'account_nick': 'cuixia', 'action_end': 360, 'alpaca_mode': 'live', 'broker_backend': 'alpaca', ...}
|
| plan_status = 'pending'
|
| pnl_pct = 12.5
|
| pos = {'account_nick': 'cuixia', 'avg_entry_price': 4.0, 'current_price': 4.5, 'days_held': 4, ...}
|
| pos_key = 'ULCC|cuixia'
|
| pos_map = {'ULCC|cuixia': {'account_nick': 'cuixia', 'avg_entry_price': 4.0, 'current_price': 4.5, 'days_held': 4, ...}}
|
| positions = [{'account_nick': 'cuixia', 'avg_entry_price': 4.0, 'current_price': 4.5, 'days_held': 4, ...}]
|
| profit_protect_enabled = False
|
| pytz = <module 'pytz' from '/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/site-packages/pytz/__init__.py'>
|
| qty = 100
|
| query_days = ['2026-06-06', '2026-04-18']
|
| reason = 'test exit'
|
| resilience_budget = {}
|
| resilience_enabled = False
|
| scheduler = <MagicMock id='4988565312'>
|
| seen = {'ULCC|cuixia': {'account_nick': 'cuixia', 'action': 'exit', 'buy_price': 4.0, 'confidence': 0.85, ...}}
|
| send_discord_async = <MagicMock name='send_discord_async' id='4988564112'>
|
| skipped = []
|
| spy_panic_lock = None
|
| symbol = 'ULCC'
|
| symbols = None
|
| today_date = datetime.date(2026, 6, 6)
|
| trading_day = '2026-04-18'
|
| trim_pct = 0.5
|
| unlock_position = <MagicMock name='unlock_position' id='4988138608'>
|
| v = {'account_nick': 'cuixia', 'action': 'exit', 'buy_price': 4.0, 'confidence': 0.85, ...}
|
| verdict_query = {'trading_day': {'$in': ['2026-06-06', '2026-04-18']}}
|
| verdicts = [{'account_nick': 'cuixia', 'action': 'exit', 'buy_price': 4.0, 'confidence': 0.85, ...}]
|
| rtrader/services/channel_scalp_service.py:99: in <module>
|
| from rtrader.services.critical_sell_genome import (
|
| E ModuleNotFoundError: No module named 'rtrader.services.critical_sell_genome'
|
| ABC = <class 'abc.ABC'>
|
| Any = typing.Any
|
| ChannelState = <class 'rtrader.analysis.rolling_channel.ChannelState'>
|
| DBAccounting = <MagicMock name='DBAccounting' id='4977276688'>
|
| Deque = typing.Deque
|
| Dict = typing.Dict
|
| Enum = <enum 'Enum'>
|
| List = typing.List
|
| Optional = typing.Optional
|
| Set = typing.Set
|
| Tuple = typing.Tuple
|
| ZoneInfo = <class 'zoneinfo.ZoneInfo'>
|
| __annotations__ = {}
|
| __builtins__ = <builtins>
|
| __cached__ = '/Users/cao/robinhood/rtrader/services/__pycache__/channel_scalp_service.cpython-312.pyc'
|
| __doc__ = '\nChannel Regime Scalp Service.\n\nAuto-scalps by entering when R² (20-bar window on 5-min bars) crosses above\nthe e...ob → TradeJournal (trade_type="scalp",\n dispatch="scalp-...") → Daily Summary LLM ("Scalp Trades" strategy group).\n'
|
| __file__ = '/Users/cao/robinhood/rtrader/services/channel_scalp_service.py'
|
| __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x12bd83a70>
|
| __name__ = 'rtrader.services.channel_scalp_service'
|
| __package__ = 'rtrader.services'
|
| __spec__ = ModuleSpec(name='rtrader.services.channel_scalp_service', loader=<_frozen_importlib_external.SourceFileLoader object at 0x12bd83a70>, origin='/Users/cao/robinhood/rtrader/services/channel_scalp_service.py')
|
| _pdt_force = <function force_restricted at 0x125b62700>
|
| abstractmethod = <function abstractmethod at 0x1022ea520>
|
| annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
|
| asdict = <function asdict at 0x1076cf2e0>
|
| asyncio = <module 'asyncio' from '/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/asyncio/__init__.py'>
|
| collections = <module 'collections' from '/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/collections/__init__.py'>
|
| dataclass = <function dataclass at 0x1076cf060>
|
| date = <class 'datetime.date'>
|
| datetime = <class 'datetime.datetime'>
|
| detect_channel = <function detect_channel at 0x1206a5260>
|
| dt_time = <class 'datetime.time'>
|
| field = <function field at 0x1076cd3a0>
|
| fields = <function fields at 0x1076cf100>
|
| free_buying_power = <function free_buying_power at 0x125a35760>
|
| get_stock_realtime_price = <function get_stock_realtime_price at 0x11ed840e0>
|
| has_dtbp_for = <function has_dtbp_for at 0x125b628e0>
|
| is_pdt_restricted = <function is_pdt_restricted at 0x125b62a20>
|
| json = <module 'json' from '/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/json/__init__.py'>
|
| lock_position = <function lock_position at 0x11d3dcd60>
|
| logger = <loguru.logger handlers=[(id=2, level=20, sink=<_io.FileIO name=10 mode='rb+' closefd=True>)]>
|
| math = <module 'math' from '/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/lib-dynload/math.cpython-312-darwin.so'>
|
| os = <module 'os' (frozen)>
|
| redis_local = <function redis_local at 0x10f9f4ae0>
|
| ring = <module 'ring' from '/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/site-packages/ring/__init__.py'>
|
| scheduler = <MagicMock id='4988565312'>
|
| sentry_sdk = <module 'sentry_sdk' from '/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/site-packages/sentry_sdk/__init__.py'>
|
| settings = <dynaconf.base.LazySettings object at 0x10eefdd00>
|
| shutil = <module 'shutil' from '/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/shutil.py'>
|
| subprocess = <module 'subprocess' from '/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/subprocess.py'>
|
| threading = <module 'threading' from '/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/threading.py'>
|
| time = <module 'time' (built-in)>
|
| timedelta = <class 'datetime.timedelta'>
|
| timezone = <class 'datetime.timezone'>
|
| trim_profitable_for_room = <function trim_profitable_for_room at 0x125a35580>
|
| trim_scalp_excess_for_room = <function trim_scalp_excess_for_room at 0x125a35620>
|
| unlock_position = <MagicMock name='unlock_position' id='4988138608'>
|
| uuid = <module 'uuid' from '/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/uuid.py'>
|