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 — persistence audit 2026-06-04 — 0P0 2P1 2R
AI verdict
employee
high
· confidence: high
· by internal-exempt
“Sydnee Agent (AI): Sydnee nightly — persistence audit 2026-06-04 — 0P0 2P1 2R”
Reasoning: @sydnee.ai is a protected domain — hard exemption
Sydnee nightly — persistence audit — 2026-06-04
P0 findings: 0 P1 findings: 2 Risks: 2
- Area: Persistence
- Bugs found (P0 / P1): 0 / 2 (1 new + 1 carried from 2026-05-28)
- Risks noted: 2 (both carried from 2026-05-22 / 2026-05-28)
---
Full report (dev branch): https://github.com/kanex1/sydnee.signals/blob/dev/docs/audit_2026-06-04_persistence.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-06-04 — PERSISTENCE
## Summary
- Area: Persistence
- Bugs found (P0 / P1): 0 / 2 (1 new + 1 carried from 2026-05-28)
- Risks noted: 2 (both carried from 2026-05-22 / 2026-05-28)
---
## Findings
### BUG [P1] NEW: `_tv_scale_state` not persisted — scale-in silently abandoned on restart
**File:** `bot.py:4201-4202` (init), `bot.py:4230` (only in-memory write)
**Evidence:**
```python
# bot.py:4201-4202 — lazily initialised, never restored from Redis/DB
if not hasattr(self, "_tv_scale_state"):
self._tv_scale_state = {} # ← resets to {} on every restart
# bot.py:4230 — only in-memory write
self._tv_scale_state[sym] = st # no Redis setex, no DB update_trade_field
# bot.py:4026-4033 — scale_active gate depends on in-memory state
_scale_active = (
os.environ.get("TV_BXT_SCALE_IN", "").lower() in ("1", "true", "yes")
and hasattr(self, "_tv_scale_state")
and sym in self._tv_scale_state # ← False on restart
and self._tv_scale_state[sym].get("dir") == sig
and self._tv_scale_state[sym].get("slots_done", 10) < 10)
if not _scale_active:
return # already in direction, no more slots due
```
`_tv_scale_state[sym]` tracks the full scale-in window per symbol: `sig_ts`, `dir`, `target_shares`, `slot_shares`, `slots_done`, `parent_trade_id`, `next_slot_ms`, `start_ms`. No part of this dict is written to Redis or the DB. The slot-advance-on-skip change (ec7ed26) means `slots_done` increments on every call regardless of fill outcome, making the counter even more important to survive a restart.
**Failure path on mid-scale restart (e.g. at slots_done=4/10):**
1. TV webhook fires → `tv_bxt_signal:{sym}` set in Redis; scale starts.
2. Slot 1 opens parent trade via `_open_trade`; slots 2-4 call `_tv_scale_add_shares`, mutating `parent.shares` + `parent.entry_price` in DB. Parent trade correctly persisted (4 × slot_shares shares, weighted-avg price).
3. Bot restarts at slot 5/10.
4. `_tv_scale_state` resets to `{}`.
5. `_load_trades_from_db` reloads the parent trade correctly from DB (shares, entry_price, strategy_reason preserved).
6. Next tick: `my_pos` found, `cur == sig`. Check `_scale_active`: `sym not in _tv_scale_state` → `_scale_active = False`. Returns early at line 4033.
7. `_tv_scale_step` is never reached. Remaining 6 slots (5-10) silently abandoned.
8. Parent trade survives with 4-slot shares, managed normally by OBV-trail stop and opposite-TV-flip exit.
**Impact:** Scale-in does not complete after any mid-session restart. Position is undersized vs intent (40% of target in the above example). No duplicate orders, no incorrect closes — behavior is safe but incomplete. Active risk: `TV_BXT_SCALE_IN=true` on dev as of 2026-06-04 re-enable (strategy_decisions.md line 1009).
**Fix:**
```python
# 1. bot.py — persist at write site (bot.py:4230), after every st mutation:
self._tv_scale_state[sym] = st
if getattr(self, "_regime_redis", None):
try:
self._regime_redis.setex(
f"tv_scale_state:{sym}", 660, # 10×60s + grace
json.dumps(st))
except Exception:
pass
# 2. bot.py — restore on init (bot.py:4201-4202):
if not hasattr(self, "_tv_scale_state"):
self._tv_scale_state = {}
_r = getattr(self, "_regime_redis", None)
if _r:
for _sym in self._tv_bxt_active_syms():
_raw = _r.get(f"tv_scale_state:{_sym}")
if _raw:
try:
self._tv_scale_state[_sym] = json.loads(
_raw.decode() if isinstance(_raw, bytes) else _raw)
except Exception:
pass
```
After restore, the next call to `_eval_tv_bxt_sym` sees `sym in _tv_scale_state` with `slots_done=4` and `parent_trade_id` set → `_scale_active=True` → falls through to `_tv_scale_step`. The step function checks `st["sig_ts"] == _sigts` (Redis signal timestamp still matches) and `st["slots_done"] >= 1` → jumps to the slot-2+ path, finds the existing parent by `parent_trade_id`, and resumes correctly. Eviction (TTL 660s = 11 min) ensures a restart 11+ minutes after a signal does not attempt to resume a dead window.
---
### BUG [P1] CARRIED (from 2026-05-28): `tv_bxt_signal` no-TTL + `_tv_confirm_state` not persisted
**File:** `bot.py:12533-12534` (no-TTL set), `bot.py:4113-4114` (`_tv_confirm_state`)
**Evidence:**
```python
# bot.py:12533-12534 — plain r.set(), no TTL (unchanged since 2026-05-28 filing)
r.set(f"tv_bxt_signal:{sym}", sig)
r.set(f"tv_bxt_signal_ts:{sym}", str(int(time.time())))
# bot.py:4113-4114 — flow-confirm retry counter, in-memory only
if not hasattr(self, "_tv_confirm_state"):
self._tv_confirm_state = {} # ← resets to {} on every restart
```
Status note: with `TV_BXT_SCALE_IN=true` on dev, the `_tv_confirm_state` code path is bypassed — scale-in handles its own per-slot flow-confirm inside `_tv_scale_step`. The no-TTL `tv_bxt_signal:{sym}` concern remains active for both paths: a stale signal can survive a restart indefinitely, causing a fresh 10-attempt confirmation window (or a fresh scale window) to open on a signal that may be 15+ minutes old. The fail-open path (`_fresh = False` on stale WS at restart) bypasses flow confirmation and immediately attempts entry.
**Impact / Fix:** Unchanged from 2026-05-28 filing. Apply `r.setex(f"tv_bxt_signal:{sym}", 900, sig)` and `r.setex(f"tv_bxt_signal_ts:{sym}", 900, ...)` at bot.py:12533-12534. Persist and restore `_tv_confirm_state` via Redis as described in the 2026-05-28 audit.
---
### RISK: `_fri_flat_queued` not persisted — RTH force-flat dedup missed (CARRIED from 2026-05-22 → 2026-05-28)
**File:** `bot.py:4610-4615`
**Evidence:**
```python
# bot.py:4610-4615 — dedup guard in-memory only; no _update_trade_field
if getattr(t, '_fri_flat_queued', False):
continue
t._fri_flat_queued = True # ← no persist
self._deferred_closes.append((t, f"Friday FLAT: ..."))
```
Unchanged from 2026-05-28. On restart during the 3:50 PM ET Friday-close window, dedup resets and a second close order is enqueued. `is_open` guard in `_close_trade` provides secondary protection if the first fill processes first. Narrow window (Friday only, 3:50–3:51 ET); no financial harm on paper; structural gap mirrors the now-fixed `_fri_ah_close_queued` (8845a24).
**Fix:** Add `fri_flat_queued BOOLEAN DEFAULT FALSE` to `ensure_trade_state_columns`, persist with `_update_trade_field(t.trade_id, fri_flat_queued=True)` at bot.py:4615, restore in `_load_trades_from_db` alongside `fri_ah_close_queued`.
---
### RISK: `_bxt1m_last_bar` not persisted — BXt-1m dedup replays last bar on restart (CARRIED from 2026-05-22 → 2026-05-28)
**File:** `bot.py:3915-3916`, `bot.py:4431`
**Evidence:**
```python
# bot.py:3915-3916 — always empty on restart
if not hasattr(self, "_bxt1m_last_bar"):
self._bxt1m_last_bar = {}
# bot.py:4431 — in-memory only
self._bxt1m_last_bar[sym] = idx[-1] # no Redis write
```
On restart the dedup guard resets, and the catch-up replay re-evaluates the last processed 1m bar as "new." If `desired_dir == 0` (1m stalled, 5m alignment gone) at restart, an open BXT1m position is force-closed prematurely. Risk is dormant if `BXT_1M_NAKED_SYMBOLS` is unset (empty by default on both environments); dev currently sets it.
**Fix (unchanged from 2026-05-22):** `_regime_redis.setex(f"bxt1m_last_bar:{sym}", 120, str(last_ts))` at bot.py:4431; restore on init.
---
## OK (checked, working or recently fixed)
**New since 2026-05-28 — commits 3b0d6ac (scale-in redesign), ec7ed26 (slot-advance-on-skip), 82c80de (RTH pre-market re-open), b2178a7 (multi-fill original, reverted by 3b0d6ac), 44aec76 (DISABLE_DAILY_LOSS_LIMIT):**
- **`_tv_scale_add_shares` DB write** — mutates `parent.shares` and `parent.entry_price` via `_update_trade_field(parent.trade_id, shares=new_shares, entry_price=...)` (bot.py:4345-4347). These columns are restored in `_load_trades_from_db` at line 1102-1103. ✓ Parent trade correctly survives restart with accumulated shares regardless of `_tv_scale_state` loss.
- **`_tv_block_logged` dict** — still purely cosmetic (dedup for one dashboard log line per signal change; bot.py:4159-4168). No trading impact on restart. ✓
- **`TV_BXT_RTH_ONLY` gate** — pure time check, no new in-memory state. On block outside session, `_tv_bxt_signal_clear(sym)` deletes both Redis keys (bot.py:4066). No signal survives the block. ✓
- **`TV_BXT_SCALE_IN=false` revert path** — falls through the `if TV_BXT_SCALE_IN` block at line 4075, reaches the flow-confirm path at line 4078. `_tv_confirm_state` code path correctly resumes. ✓
- **`DISABLE_DAILY_LOSS_LIMIT`** — pure env flag in `core/risk.py:106-112` wrapping the daily-loss check. No new state, no persistence concern. ✓
- **Single-record redesign audit (3b0d6ac commit message):** py_compile clean, 0 hits for `my_positions` (reverted), all close paths use `my_pos` single record, `_open_trade` GUARD bypass removed, `_tv_scale_add_shares` defined and called only by `_tv_scale_step`. ✓
- **Slot-advance-on-skip (ec7ed26):** `slots_done` now increments on every call regardless of fill outcome — dedup slots correctly (no retry). No new state beyond what `_tv_scale_state` already tracks. ✓
**From 2026-05-28 audit — all still OK:**
- `_tv_bxt_signal_clear` correctly deletes both `tv_bxt_signal:{sym}` and `tv_bxt_signal_ts:{sym}` on close and entry (bot.py:3726). ✓
- Flow-confirm `_ratio` / `_flow_min` / `_vol_min` — computed live from WS overlay on each call; no per-trade state. ✓
- `_pending_manual_orders`, bar snapshots, OBV trail, all DB-persisted trade flags (`trimmed_1/2/3`, `fri_ah_close_queued`, etc.) — no regressions detected. ✓
**Long-standing — re-confirmed no regression:**
- All 7 items from 8845a24 (oracle TTL, consec_losses, tick_peak, tick_fire_ts, fri_ah_close_queued, signal_price/time) remain correctly implemented. ✓
- `ensure_trade_state_columns()` idempotent migration — no new columns needed for the scale-in redesign (shares and entry_price are existing columns). ✓
- OBV divergence swing-point history — dormant (`OBV_DIVERGENCE_ENABLED=false`). ✓