Interactive Brokers Client Services
Jun 17 12:40 AM
Message Center Notification
Interactive Brokers ticket response regarding Kanex account messaging.
Joaquín Medina
Jun 17 12:34 AM
RE: Re:[## 708 ##] RE: RMA for EXT-4KHD70M
AVIT Vision requests credit memo for destroyed equipment per RMA 708.
Microsoft Outlook
Jun 16 10:36 PM
Undeliverable: FW: TIER 3 Trending Stocks Part 2 (1 New Red Candle): $DELL, $OSCR, $ONDS, $ZETA, $LMND and $TMC (June 17, 2026-daily)
Microsoft Outlook: Undeliverable: FW: TIER 3 Trending Stocks Part 2 (1 New Red
Interactive Brokers Client Services
Jun 16 9:59 PM
Security Notice for User k******8: Verify Log In
Fake Interactive Brokers security alert requesting account verification.
Microsoft Outlook
Jun 16 9:38 PM
Undeliverable: FW: $QCOM (June 17, 2026-daily)
Microsoft Outlook: Undeliverable: FW: $QCOM (June 17, 2026-daily)
TDhruv Sharma
Jun 16 9:05 PM
[Teams oneOnOne] (Teams DM)
Dhruv Sharma: [Teams oneOnOne] (Teams DM)
Fabiola Hernandez
Jun 16 6:55 PM
Tomorrow is Spirit Day – Souvenir T-Shirt Day
Spirit Day reminder: kids invited to wear souvenir t-shirt tomorrow at camp.
Derrick
Jun 16 6:19 PM
Request for More Info: EXT-USBC2XI-100M - Dual-Host USB 3.2 Gen 1 Extender over CAT6a — USB-C & USB-B Inputs, 100m/328ft
Product inquiry for USB extender; requesting pricing, specs, availability.
Sydnee Agent (AI)
Jun 16 6:00 PM
[Spread Cal] 2026-06-17 — per-stock max_spread_bps results
Sydnee Agent (AI): [Spread Cal] 2026-06-17 — per-stock max_spread_bps results
Sydnee Agent (AI)
Jun 16 5:40 PM
[Calibration Daily] 2026-06-17
Sydnee Agent (AI): [Calibration Daily] 2026-06-17
Sydnee Agent (AI)
Jun 16 5:30 PM
Sydnee algo daily — dev $-2,699 · prod $+0 · 6d window
Sydnee Agent (AI): Sydnee algo daily — dev $-2,699 · prod $+0 · 6d window
Find My
Jun 16 5:24 PM
A sound was played on Kelvin’s iPad mini.
Find My: A sound was played on Kelvin’s iPad mini.
Sammy Cemo, Matt Pourcho and Anthony DeLorenzo
Jun 16 4:04 PM
New Pricing | Fortune 40 Credit | STNL Industrial | 11 Yr. WALT | SoCal
⚠ PHISHING: employee impersonation: display name matches 'anthony' but sender is cbre.com
Microsoft Store
Jun 16 3:23 PM
Meet the new Surface lineup—with limited-time offers
Microsoft Store: Meet the new Surface lineup—with limited-time offers
[email protected]
Jun 16 2:34 PM
New Funding Program
Funding broker offering working capital solutions and consolidation services.
Sammy Cemo and Anthony DeLorenzo
Jun 16 2:03 PM
Single-Story Owner-User Offering in Newport Beach
⚠ PHISHING: employee impersonation: display name matches 'anthony' but sender is cbre.com
Aarti Gupta
Jun 16 1:53 PM
Re: CR-TOUCH6R 6" Widescreen Touch Panel with Knob, RS232/RS485 & PoE
Aarti Gupta: Re: CR-TOUCH6R 6" Widescreen Touch Panel with Knob, RS232/RS
[email protected]
Jun 16 1:43 PM
Action required: Your June booking bonuses expire soon
⚠ PHISHING: phishing subject pattern: 'Action required' from external sender vacationoffer.com
TAnthony Patino
Jun 16 1:30 PM
[Teams oneOnOne] (Teams DM)
LK account overdrawn; bank fee applied, needs replenishment before QB charge.
TAnthony Patino
Jun 16 1:27 PM
[Teams oneOnOne] (Teams DM)
Anthony Patino sent a brief Teams DM referencing 'LK'.
TAnthony Patino
Jun 16 1:27 PM
[Teams oneOnOne] (Teams DM)
Anthony Patino reports insufficient funds issue.
Amazon Payments
Jun 16 12:44 PM
Action requise sur le compte Amazon Payments
Fake Amazon Payments suspension notice in French requesting account verification.
Nick Daniel
Jun 16 11:04 AM
Quick question
TriNet HR solution sales inquiry.
Aarti Gupta
Jun 16 10:04 AM
Re: Order help #1227
Aarti Gupta: Re: Order help #1227
Aarti Gupta
Jun 16 10:03 AM
Re: Order help #1227
Aarti Gupta: Re: Order help #1227
Aarti Gupta
Jun 16 9:59 AM
EXT-USBCPD4K-70M 18Gbps USB-C 4K60 HDBaseT 3.0 Extender with 100W PD (70m)
Aarti Gupta: EXT-USBCPD4K-70M 18Gbps USB-C 4K60 HDBaseT 3.0 Extender with
Sean McGinley
Jun 16 9:58 AM
Order help #1227
Customer inquiry about HDMI extender transmitter compatibility for order #1227.
IBKR FYI
Jun 16 9:51 AM
FYI: Upcoming Exchange Holidays
Exchange holiday notice: MIAX, NASDAQ, NYSE closed June 19.
IBKR FYI
Jun 16 9:27 AM
FYI: Upcoming Exchange Holidays
NASDAQ/MIAX exchange holiday June 19, 2026 — no trading.
Hims
Jun 16 9:02 AM
Kelvin - action required on your account
⚠ PHISHING: phishing subject pattern: 'action required' from external sender icloud.com
[email protected]
Jun 16 9:02 AM
You have a new estimate
Suspicious medical estimate link from Providence—verify legitimacy before clicking.
Mail Delivery System
Jun 16 8:20 AM
Mail delivery failed [Invoice #36077 PO: SH260526762J]
Mail delivery failed for invoice #36077 to Mike Vanderkamp; recipient address rejected.
Mail Delivery System
Jun 16 8:19 AM
Mail delivery failed [Invoice #36078 PO: SH260430677J]
Mail delivery failed: [email protected] → [email protected] for invoice #36078.
Mail Delivery System
Jun 16 8:19 AM
Mail delivery failed [Invoice #36079 PO: SH2606101007J]
Mail delivery failure: invoice to [email protected] rejected by recipient server.
TDhruv Sharma
Jun 16 8:16 AM
[Teams oneOnOne] (Teams DM)
Dhruv Sharma: [Teams oneOnOne] (Teams DM)
Zoho Campaigns
Jun 16 7:55 AM
Campaign "NEW USB-C + USB-B Dual-Host Extender · 100m" has been successfully Sent - Zoho Campaigns
Zoho Campaigns notification: USB-C/USB-B extender product campaign sent successfully.
Ali Pacheco
Jun 16 7:53 AM
Request for More Info: EXT-USBC2XI-100M - Dual-Host USB 3.2 Gen 1 Extender over CAT6a — USB-C & USB-B Inputs, 100m/328ft
Product inquiry for USB 3.2 extender from external vendor.
KanexPro
Jun 16 7:51 AM
NEW USB-C + USB-BDual-Host Extender · 100m
KanexPro: NEW USB-C + USB-BDual-Host Extender · 100m
KanexPro
Jun 16 7:50 AM
NEW USB-C + USB-BDual-Host Extender · 100m
KanexPro: NEW USB-C + USB-BDual-Host Extender · 100m
KanexPro
Jun 16 7:50 AM
NEW USB-C + USB-BDual-Host Extender · 100m
KanexPro: NEW USB-C + USB-BDual-Host Extender · 100m
KanexPro
Jun 16 7:49 AM
NEW USB-C + USB-BDual-Host Extender · 100m
KanexPro: NEW USB-C + USB-BDual-Host Extender · 100m
TDhruv Sharma
Jun 16 7:33 AM
[Teams oneOnOne] (Teams DM)
Dhruv Sharma: [Teams oneOnOne] (Teams DM)
TDhruv Sharma
Jun 16 7:32 AM
[Teams oneOnOne] (Teams DM)
Dhruv Sharma: [Teams oneOnOne] (Teams DM)
Bank of America
Jun 16 6:16 AM
Your available account balance is low
Bank of America: Your available account balance is low
Let's Talk Supply Chain
Jun 16 6:01 AM
Are you ready?
Suspicious meeting confirmation from unknown sender with obfuscation.
Interactive Brokers Client Services
Jun 16 5:18 AM
Message Center Notification
Interactive Brokers ticket response regarding Kanex account notification.
Benjamin & Williams
Jun 16 5:03 AM
Commercial Claim Discovery Documents Our file:D-8222 Debtor: VICTORIA ROPA ELEGANTE
Fake debt collector demanding payment on unknown commercial claim within 24h.
IBKR FYI
Jun 16 5:01 AM
FYI: Option Expiration Notification
Oracle options expiring 18JUN2026 — immediate action required.
IBKR FYI
Jun 16 5:00 AM
FYI: Option Expiration Notification
MSTR call option expiring 18JUN2026; action needed if extending position.
Sydnee Agent (AI)
Jun 16 4:25 AM
Sydnee nightly — exit_flow audit 2026-06-16 — 0P0 8P1 6R
Sydnee Agent (AI): Sydnee nightly — exit_flow audit 2026-06-16 — 0P0 8P1 6R
Sydnee nightly — execution_quality audit 2026-05-29 — 0P0 2P1 3R
AI verdict
employee
high
· confidence: high
· by internal-exempt
“Sydnee Agent (AI): Sydnee nightly — execution_quality audit 2026-05-29 — 0P0 2P”
Reasoning: @sydnee.ai is a protected domain — hard exemption
Sydnee nightly — execution_quality audit — 2026-05-29
P0 findings: 0 P1 findings: 2 Risks: 3
- Area: Execution Quality (Friday theme)
- Branch: `dev` (0f470d7)
- Files scanned: `bot.py` (~17 700 lines), `docs/strategy_decisions.md`, prior execution audit (2026-05-15), recent commit chain
- Bugs found (P0 / P1): 0 / 2 (both carryovers from 2026-05-15 — neither fixed)
- Risks noted: 3 (1 new, 2 carryovers)
---
Full report (dev branch): https://github.com/kanex1/sydnee.signals/blob/dev/docs/audit_2026-05-29_execution_quality.md
Reply FROM [email protected] to [email protected] to request fixes, e.g.:
"code_task on sydnee-signals-dev: apply fix for the P0 about RVOL threshold in bot.py"
Sydnee Agent will propose + you APPROVE (or plain 'approve') + auto-push to dev.
--- Full audit below (first 12 KB) ---
# Nightly Audit 2026-05-29 — EXECUTION QUALITY
## Summary
- Area: Execution Quality (Friday theme)
- Branch: `dev` (0f470d7)
- Files scanned: `bot.py` (~17 700 lines), `docs/strategy_decisions.md`, prior execution audit (2026-05-15), recent commit chain
- Bugs found (P0 / P1): 0 / 2 (both carryovers from 2026-05-15 — neither fixed)
- Risks noted: 3 (1 new, 2 carryovers)
---
## Findings
### BUG [P1] CARRYOVER — `RSI_TICK_FIRE` window ends 13:00 ET (780), not 16:00 ET (960)
**File:** `bot.py:16204`
**Evidence:**
```python
# bot.py:16204 — confirmed present in HEAD (0f470d7)
if not (570 <= t_min < 780) or now_et.weekday() >= 5:
# Not RTH — reset state and skip
if ss._tick_state != 0:
ss._tick_state = 0
return
```
`780 = 13:00 ET = 1:00 PM ET`. RTH closes at `960 = 16:00 ET`. When `RSI_TICK_FIRE=true`,
the 5m peak-confirm path AND the plain RSI fallback are both suppressed
(`bot.py:5316-5322`). Net effect: zero `rsi_extreme` entries 1:00–4:00 PM ET when the
flag is on. Flag defaults off — risk dormant until explicitly enabled.
**Impact:** Three hours of RTH edge lost (1–4 PM ET window) for every session where
`RSI_TICK_FIRE=true`. The worst-affected setups are the afternoon rsi_extreme longs
(2026-05-19 backtest showed 13:00 ET is the single highest-edge slot: +0.534% avg).
**Fix:**
```python
# bot.py:16204 — change 780 → 960:
if not (570 <= t_min < 960) or now_et.weekday() >= 5:
```
---
### BUG [P1] CARRYOVER — `max_shares` cap applies to `_close_trade` but not `_open_trade`; now directly impacts TV-BXt 50% NLV sizing
**File:** `bot.py:7760-7763` (close cap), `bot.py:6876-6878` (open — NLV cap only, no absolute cap)
**Evidence:**
```python
# _close_trade — bot.py:7760-7763 — caps EVERY close at max_shares (default 500)
max_sh = self.cfg.get("max_shares", 500)
if shares > max_sh:
logger.warning("[%s] Close capped from %d to %d shares ...", ...)
shares = max_sh # ← sends only 500 to IBKR; remainder stranded
# _open_trade — bot.py:6876-6878 — NLV cap only, NO max_shares check
max_position_dollar = nlv * _max_pos_pct
max_shares_by_position = int(max_position_dollar / price) if price > 0 else shares
if shares > max_shares_by_position:
shares = max_shares_by_position
# max_shares never checked here
# TV-BXt override — bot.py:6890-6893 — bypasses NLV cap, sizes at 50% NLV
if (entry_reason or "").startswith("TV-BXt") and price > 0 and nlv > 0:
_tv_pct = float(os.environ.get("TV_BXT_NLV_PCT", "50.0"))
_tv_shares = int((nlv * _tv_pct / 100.0) / price)
```
**Concrete TV-BXt scenario** (now an active trading strategy on dev):
- NLV = $200 k, SNDK at ~$55, `TV_BXT_NLV_PCT=50`
- Open: `_tv_shares = int(200 000 × 0.50 / 55) = 1 818 shares` → submitted to IBKR
- Close: capped to `max_shares = 500` → 500 shares sent; **1 318 shares remain at IBKR**
- Bot marks trade closed in DB; IBKR still holds 1 318 shares
- `_reconcile_ibkr_positions` re-imports the orphan as `reconcile_import`
- TV engine adopts it as `my_pos` (commit 3907291) — cycle repeats on the next close
The 2026-05-15 audit described this for cheap biotech ($1–$3 stocks). With TV-BXt active
and sizing at 50% NLV, the gap now appears on every TV-BXt close at any liquid price
where open shares > 500. At SNDK $55, that is every single TV-BXt position.
**Impact:** IBKR/bot desync on every TV-BXt close. Orphaned IBKR position re-imported
as `reconcile_import`, adopted by TV engine, re-closed to 500 shares again, re-orphaned.
Loop terminates only when IBKR position drops below 500 shares via repeated partial fills.
Real-money equivalent: leftover shares accumulate unreported P&L and bypass all risk gates.
**Fix:**
```python
# bot.py — add after TV-BXt override block (~line 6900), before _exec_qa call:
max_sh = self.cfg.get("max_shares", 500)
if shares > max_sh:
self._log_activity(sym, f"Entry capped {shares}→{max_sh}sh (max_shares limit)", "warn")
shares = max_sh
if shares <= 0:
return
```
Alternatively, raise `max_shares` in config to cover the TV-BXt sizing
(e.g. `max_shares=3000` for $200k NLV / $10 min stock price at 15% NLV).
---
### RISK: `TV_BXT_DISABLE_ALGO_STOPS=true` removes all stop coverage — TV webhook downtime = unbounded loss
**File:** `bot.py:3966-3974` (84db012, 2026-05-28)
**Evidence:**
```python
_algo_stops_off = os.environ.get(
"TV_BXT_DISABLE_ALGO_STOPS", "").lower() in ("1", "true", "yes")
if my_pos is not None and price > 0:
if not _algo_stops_off: # ← OBV trail + catastrophic floor skipped when True
_sr = self._obv_trail_stop_hit(my_pos, ss, price)
if _sr:
self._tv_close(my_pos, f"TV-BXt {_sr}")
self._tv_bxt_signal_clear(sym)
return
_now = datetime.now(ET)
if _now.weekday() == 4 and ...: # ← Friday EOD still fires ✓
...
```
Safety flats (Friday EOD at 3:45 PM ET, overnight/weekend `win=="flat"`) are correctly
preserved outside the `_algo_stops_off` gate. However, when the flag is on, the ONLY
intraday exit path for a TV-BXt position is an opposite TV webhook alert.
**Failure scenarios:**
1. **TV alert service downtime / misconfigured ticker** — no alert arrives; position held
indefinitely (Mon–Thu overnight, no hard stop).
2. **Bot restart during session** — `_tv_bxt_signal` persists in Redis; position re-adopted
via `reconcile_import` (3907291); re-managed by TV engine. No OBV trail on restart since
the trail was never updated while `_algo_stops_off=True`. But the trail lazy-init at
`_obv_trail_stop_hit` catches up to current price on first call — so if `_algo_stops_off`
is LATER disabled, stop initializes at current price (ok, but misses intra-`off` peak).
3. **Rapid adverse move intraday** — without the 2×ATR catastrophic floor, a position can
lose arbitrarily until the next TV alert or the overnight/weekend flat.
**Note:** Flag is `default off`; dev compose enables it; prod not set. Risk is dev-only
for now. When promoting TV-BXt to prod, this flag must NOT be enabled in prod compose
without an independent stop mechanism (e.g., native IBKR stop order, monitoring alert).
---
### RISK CARRYOVER — `_reconcile_bracket_fills` records `ss.last_price` as exit price, not IBKR fill
**File:** `bot.py:8099`
**Evidence:**
```python
if t.direction == 1 and ibkr_qty <= 0:
ss = self.sym_states.get(t.symbol)
exit_price = ss.last_price if ss else t.entry_price # ← polled price, not fill
pnl = self._close_trade_in_store(t.trade_id, exit_price)
```
No change since 2026-05-15 filing. Distorted P&L on bracket-closed trades; affects
`consec_losses` accounting and daily report. Low blast radius but structurally silent.
---
### RISK CARRYOVER — `_on_portfolio_update` hook writes `ss.last_price` without `_sym_lock`
**File:** `bot.py:17493-17499`
**Evidence:**
```python
def _on_portfolio_update(item):
try:
_sym = item.contract.symbol
_px = float(item.marketPrice or 0)
if _px > 0 and _sym in self.sym_states: # ← not atomic with next line
self.sym_states[_sym].last_price = _px
except Exception:
pass
```
No change since 2026-05-15 filing. GIL-atomic float write is safe; the `in`+`[_sym]`
two-step can `KeyError` if `_sym` is removed mid-check (watchlist shrink overnight).
Low probability; silently caught by `except Exception`. No execution consequence.
---
## OK (checked, working or recently fixed)
- **FLAT_EXIT double-sell — FIXED** (commit 73481b3, 2026-05-19): `_close_trade` replaced
with `_close_trade_in_store` at `bot.py:5176`. DB-only close; no second IBKR order; no
asyncio conflict. Carryover P1 from 2026-05-08 audit resolved. ✓
- **`reconcile_import` adoption as TV `my_pos`** (commit 3907291, 2026-05-28): `_eval_tv_bxt_sym`
now recognises positions with `strategy_reason == "reconcile_import"` as `my_pos`. Fixes
the SNDK freeze where re-imported positions blocked TV signals and prevented new entries.
`other_open` guard correctly excludes `reconcile_import` from the manual-block list. ✓
- **avgCost sanity check** (commit 62f9195, 2026-05-28): `_reconcile_ibkr_positions` now
queries `ib.portfolio()` for live market price and substitutes it when `avgCost` deviates
>25% from market (IBKR paper-engine short→long flip corruption, e.g. AMZN $55 vs $271).
Prevents phantom-profit exits on corrupted basis imports. ✓
- **Quarantine guard 25%→55% NLV** (commit a4a5277, 2026-05-28): legitimate TV-BXt
positions at 50% NLV no longer quarantined on restart. 55% ceiling still catches true
runaways. ✓
- **Friday EOD + overnight/weekend safety flats preserved** when `TV_BXT_DISABLE_ALGO_STOPS=true`:
Friday EOD flat (3:45 PM ET, `bot.py:3975-3979`) is outside the `_algo_stops_off` guard;
overnight/weekend `win=="flat"` path (line 3934-3938) is entirely independent. ✓
- **Phase-0 scalp signal logger** (commit 0f470d7): pure research, no trading. Thread is
a no-op unless `SCALP_SIGNAL_LOG=true`. `_tape_score_sym` refactor is byte-for-byte
equivalent for the `/api/tape-scanner` route output (confirmed in commit validation). ✓
- **IOC limit entry with NBBO+1¢ cushion** (`bot.py:5963-5970`): marketable LMT IOC in RTH;
DAY outside; retries with GTC LMT or MKT on cancel. No MKT-at-entry exposure. ✓
- **`avgFillPrice` used in all close paths** (`bot.py:6125, 6777`): weighted average across
venue splits; fills[0] fallback only when avgFillPrice=0. ✓
- **`_deferred_closes` dedup** (trade_id + `is_open` guard, `bot.py:5250-5266`): correctly
suppresses duplicate close attempts queued during `ib.sleep()` yield windows. ✓
- **3-layer entry guard** (in-store + IBKR cache + ib_insync wrapper, `bot.py:5716-5754`):
prevents double-open from three independent data sources. ✓
- **`exec_qa_patrol` stale-order sweep** (`bot.py:6411-6489`): cancels PreSubmitted/Submitted
orders >5 min old that are not in `_active_order_ids`. Manual orders exempted. ✓
- **`BLOCK_PROFILE_ENABLED` default `"true"` carryover**: still unflipped at `bot.py:6191`.
Now consequential post the 2026-05-03 `total_scale` fix — block-profile ±15% does reach
actual share count on dev. Tracked in `strategy_decisions.md` action item; no change today. (noted)