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 — exit_flow audit 2026-05-27 — 0P0 2P1 3R
AI verdict
employee
high
· confidence: high
· by internal-exempt
“Sydnee Agent (AI): Sydnee nightly — exit_flow audit 2026-05-27 — 0P0 2P1 3R”
Reasoning: @sydnee.ai is a protected domain — hard exemption
Sydnee nightly — exit_flow audit — 2026-05-27
P0 findings: 0 P1 findings: 2 Risks: 3
- Area: Exit flow (how and when open positions are closed)
- Bugs found (P0 / P1): 0 / 2
- Risks noted: 3
Branch: `dev` (7147326). Cross-checked against `git log --oneline -30` and `docs/strategy_decisions.md`.
Both P1 bugs are **carryovers from 2026-05-26 that were not fixed in today's commits** (7147326, 94aeea3, 7f1fd63, f631fd2, ee2a66d, 643b2a4, 3d8bdda, 2928bd1, c51d818, 8535f8e, d4aa901). One new RISK found in the dynamic TV-BXt symbol set.
---
Full report (dev branch): https://github.com/kanex1/sydnee.signals/blob/dev/docs/audit_2026-05-27_exit_flow.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-27 — EXIT FLOW
## Summary
- Area: Exit flow (how and when open positions are closed)
- Bugs found (P0 / P1): 0 / 2
- Risks noted: 3
Branch: `dev` (7147326). Cross-checked against `git log --oneline -30` and `docs/strategy_decisions.md`.
Both P1 bugs are **carryovers from 2026-05-26 that were not fixed in today's commits** (7147326, 94aeea3, 7f1fd63, f631fd2, ee2a66d, 643b2a4, 3d8bdda, 2928bd1, c51d818, 8535f8e, d4aa901). One new RISK found in the dynamic TV-BXt symbol set.
---
## Findings
### BUG [P1]: OBV Rule F permanently disabled after in-loss skip (carryover 2026-05-26)
**File:** `bot.py:4455–4477`
**Evidence:**
```python
if _profit_guard and profit_per_share < 0:
_dir_lbl_ex = "LONG" if t.direction == 1 else "SHORT"
if _loss_exit:
hit = True
reason = (...)
elif not getattr(t, '_obv_be_applied', False):
self._log_activity(...) # logs once, then silent
t._obv_be_applied = True # ← line 4475: flag consumed in in-loss path
t._obv_be_applied_at = datetime.now(ET).isoformat()
self._update_trade_field(t.trade_id, obv_be_applied=True, ...)
else:
# In-profit path — tighten stop
...
t._obv_be_applied = True # ← line 4481: correct (stop moved)
```
The outer guard at `bot.py:4409` is `and not getattr(t, "_obv_be_applied", False)`. Once the flag is True, Rule F never fires again. The in-loss path (profit guard) sets the flag on line 4475 **without moving the stop**, consuming the one-shot protection permanently.
**Impact:** Trades that go underwater before OBV turns adverse, then recover to profit later, lose their Rule F stop-tighten. The wide entry stop defends until hit or another exit fires. The −$774→−$217 avg damage reduction (bxt_reversal backtest) only applies to trades that are in-profit when Rule F first fires.
**Fix:** Move `t._obv_be_applied = True` inside the `else:` branch so it's only set when the stop actually moved:
```python
if _profit_guard and profit_per_share < 0:
if _loss_exit:
hit = True
...
elif not getattr(t, '_obv_be_applied', False):
self._log_activity(...) # no-op this bar only
# Do NOT set _obv_be_applied — let Rule F retry next bar when profitable
else:
...
t._obv_be_applied = True # only mark applied when stop actually moved
```
Note: `OBV_LOSS_EXIT` (spot-exit) path can keep the flag set because the trade is being closed — that's already correct (hit=True).
---
### BUG [P1]: TRIM2 `_rsi_force_trim2` flag never cleared for 1-share parents (carryover 2026-05-26)
**File:** `bot.py:4871–4905`
**Evidence:**
```python
if not hit and is_trimmed and not is_trimmed_2 and (_trim2_hit or _force_trim2):
trim = True # ← set unconditionally (line 4872)
trim2_shares = t.shares // 2
if trim2_shares > 0:
...
t._rsi_force_trim2 = False # ← only cleared when trim2_shares > 0
self._update_trade_field(t.trade_id, trimmed_2=True, force_trim2_pending=False, ...)
# No else branch
```
When TRIM1 reduces position to 1 share, `trim2_shares = 1 // 2 = 0`. The `_rsi_force_trim2` and `trimmed_2` flags are inside the `if trim2_shares > 0:` guard — they are never updated. On every subsequent bar, `_force_trim2` returns True, `trim = True` is set, and the normal activity log at `bot.py:5034` is suppressed (`elif not trim:`).
**Impact:** Per-bar CPU waste and silent activity log suppression for every bar until the position exits via stop, EOD flat, or target. The `force_trim2_pending` column stays True in DB, surviving restarts. No incorrect close is generated — the no-op is harmless to P&L but obscures the trade's live status in logs.
**Fix:** Add an `else` branch after the `if trim2_shares > 0:` block:
```python
else:
# 0 shares — can't trim. Mark done so we don't retry every bar.
t._trimmed_2 = True
t._rsi_force_trim2 = False
self._update_trade_field(t.trade_id, trimmed_2=True,
force_trim2_pending=False, force_trim_reason=None)
```
---
### RISK: Dynamic TV-BXt symbol position orphaned during Redis failure
**File:** `bot.py:3571–3589` (`_tv_bxt_active_syms`)
**Evidence:**
```python
def _tv_bxt_active_syms(self) -> set:
syms = self._tv_bxt_env_syms() # env symbols only (e.g. SNDK)
try:
r = getattr(self, "_regime_redis", None)
if r is not None:
for v in (r.smembers("tv_bxt_dynamic_syms") or []):
syms.add(v.upper())
except Exception:
pass # ← Redis failure silently dropped
return syms
```
`_eval_tv_bxt` (line 3828) iterates over `_tv_bxt_active_syms()` and calls `_eval_tv_bxt_sym(sym, win)`. The overnight flat (`win == "flat"` → force-close), OBV trail stop, and Friday EOD flat all live inside `_eval_tv_bxt_sym`. If Redis is temporarily unavailable, the try/except swallows the error and returns only env symbols.
**Scenario that breaks:** Model is "tv" (SNDK in env → `_bxt_model()` returns "tv"). A TV-BXt position is open for MU (added to `tv_bxt_dynamic_syms` via webhook). Redis goes down. `_tv_bxt_active_syms()` returns only `{SNDK}`. `_eval_tv_bxt_sym(MU, ...)` is never called. The model-inactive path (line 3822–3826) doesn't fire because the model is still "tv". MU's position:
- Never gets its overnight flat checked
- Never gets its OBV trail stop checked
- Never gets its Friday EOD flat checked
The position becomes an orphan until Redis recovers.
**Mitigation:** Add a safety sweep in `_eval_tv_bxt` that closes any open TV-BXt position whose symbol is not in the current active set:
```python
active = self._tv_bxt_active_syms()
for t in list(self.open_trades()):
if self._is_tv_bxt_trade(t) and t.symbol not in active:
# Symbol dropped from active set (Redis failure or TTL expiry)
# Force-close to prevent orphan.
win_sym = self._bxt1m_window(datetime.now(ET))
if win_sym == "flat":
self._close_trade(t, "TV-BXt FLAT — symbol dropped from active set")
self._tv_bxt_signal_clear(t.symbol)
```
Or simpler: log a WARN and let the next successful Redis read recover naturally (acceptable given the 7-day TTL makes overnight TTL expiry essentially impossible; real risk is only transient Redis failure).
---
### RISK: Stale "keep overnight" comments in Friday EOD progressive-trim block (carryover 2026-05-26)
**File:** `bot.py:4078, 4082, 4091`
**Evidence:**
```python
# Skip RSI extreme entries from after 12:00 PM PT — keep those intact. # ← wrong
# weekend. Only rsi_extreme is meant to keep overnight. # ← wrong
continue # skip — late RSI extreme, keep overnight # ← wrong
```
The overnight-hold exemption for late RSI extreme entries was removed in commit `52f1bb1` (2026-04-17). The final flat sweep at `bot.py:4139–4158` now closes ALL positions, no exemptions. The progressive-trim exemption (3:00–3:50 PM ET window) is scoped to **trimming only** — it prevents a fresh entry from being immediately trimmed, but the position is still closed at 3:50 PM. The comments say "keep overnight" which is incorrect.
**Impact:** No runtime bug — positions are not actually held overnight. The misleading comments risk a future developer re-introducing the overnight exemption assuming it was an intentional ongoing behavior.
**Mitigation:** Update comments at lines 4078, 4082, 4091 to: "Skip late RSI extreme entries from progressive trimming only — position still closes at 3:50 PM ET flat sweep."
---
### RISK: Stale trim3 DB-column comment (carryover 2026-05-26)
**File:** `bot.py:7787`
**Evidence:**
```python
elif trade.trade_id.endswith("_trim3"):
pass # no DB column for trim3 yet — state tracked in-memory
```
The `trimmed_3` column WAS added in the 2026-04-15 persistence fixes (commit `a6be962`, `strategy_decisions.md` line 344). It is written at EXIT 3 (`bot.py:4835–4836`) before the trim child is queued. The `pass` here is correct (parent already updated), but the comment is false.
**Impact:** No runtime impact. A developer reading this comment might attempt to "fix" it by adding the update here, causing a benign duplicate write.
**Mitigation:** Update comment to: `# trimmed_3 already set via _update_trade_field in EXIT 3 (bot.py:4835) — no second update needed`.
---
## OK (checked, working or recently fixed):
- **`_tv_bxt_signal_clear` on all exit paths** — verified: called on overnight flat (line 3844), OBV trail stop (line 3874), Friday EOD flat (line 3879), model-switch-into-tv signal purge (line 13226), manual close (line 13019), IBKR-side reconcile close (line 2390).
- **Dynamic symbol single-model lock** — `_bxt_active_syms()` correctly calls `_tv_bxt_active_syms()` in "tv" mode (line 3769), so the single-model suppression covers both env and dynamic symbols.
- **Switch-into-TV signal clear** — now clears both env and dynamic symbol signals via `_tv_bxt_active_syms()` (line 13226), correctly superseding the old env-only clear.
- **"hold" window removal for TV-BXt (f631fd2)** — entry during 09:15–09:45 ET and 15:45–16:15 ET transition windows is now allowed. Friday EOD flat fires on the next tick for positions opened during 15:45 ET window on Friday. OBV trail stop and outsideRth=True order routing remain active. No orphan risk from this change.
- **IP allowlist (`_tv_bxt_allowed_ips`)** — correctly defaults to TV's 4 official relay IPs; empty env string disables check (secret-only). Not an exit flow concern.
- **Auto-add to dynamic set (7147326)** — webhook handler calls `r.sadd("tv_bxt_dynamic_syms", sym)` + `r.expire(..., 7*86400)` on each valid webhook. 7-day TTL means set survives active webhook streams indefinitely. Exit flow for dynamically-added symbols is correct when Redis is healthy (see RISK above for failure mode).
- **FLAT_EXIT parent `exit_reason=""` in DB** — unchanged from yesterday's RISK finding (bot.py:1315). No new code touched this path.
- **OBV trail Redis restore wired (498275d)** — `_obv_trail_saved` tuples persisted and restored from Redis at startup. Verified in `_load_trades_from_db` (bot.py:1129–1140 area, including 2026-05-26 additions).
- **TV-BXt exempt from `_evaluate_symbol`** — confirmed (bot.py:4050–4052): `strategy_reason.startswith("BXT1m")` / `startswith("TV-BXt")` check prevents normal stop/trim/EOD logic from running on these positions (handled exclusively by `_eval_bxt_1m_naked` / `_eval_tv_bxt_sym`).
- **All items verified OK in 2026-05-26 audit** — re-confirmed unchanged.