From #192. keel_broker_robinhood.adapter.get_fee_summary returns fees_usd=Decimal("0") unconditionally, because Robinhood's v2 API exposes no account-level fees-paid total.
FeeSummary's own docstring states that its consumer is subscription lapse detection: a fee charged while the user claims a fee-free allowance contradicts the claim. With fees_usd pinned at zero, that contradiction can never be observed against Robinhood — the check does not error, it silently always passes. A rail that always passes is worse than an absent one, because it reads as coverage.
volume_usd and volume_window are genuine (thirty_day_volume, trailing_30d), so the volume half of the check is real; only the fees half is inert.
Likely fix: page order history and sum fee_charged across filled orders (v2 exposes fee_charged per order). Cost: one paginated sweep per fee summary, against a 100 req/min sustained limit.
Until fixed: this must not be treated as a working rail on Robinhood. Blocks wiring — see the prerequisites issue.
From #192.
keel_broker_robinhood.adapter.get_fee_summaryreturnsfees_usd=Decimal("0")unconditionally, because Robinhood's v2 API exposes no account-level fees-paid total.FeeSummary's own docstring states that its consumer is subscription lapse detection: a fee charged while the user claims a fee-free allowance contradicts the claim. Withfees_usdpinned at zero, that contradiction can never be observed against Robinhood — the check does not error, it silently always passes. A rail that always passes is worse than an absent one, because it reads as coverage.volume_usdandvolume_windoware genuine (thirty_day_volume,trailing_30d), so the volume half of the check is real; only the fees half is inert.Likely fix: page order history and sum
fee_chargedacross filled orders (v2 exposesfee_chargedper order). Cost: one paginated sweep per fee summary, against a 100 req/min sustained limit.Until fixed: this must not be treated as a working rail on Robinhood. Blocks wiring — see the prerequisites issue.