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 — entry_flow audit 2026-06-08 — 0P0 3P1 2R
AI verdict
employee
high
· confidence: high
· by internal-exempt
“Sydnee Agent (AI): Sydnee nightly — entry_flow audit 2026-06-08 — 0P0 3P1 2R”
Reasoning: @sydnee.ai is a protected domain — hard exemption
Sydnee nightly — entry_flow audit — 2026-06-08
P0 findings: 0 P1 findings: 3 Risks: 2
- Area: Entry Flow (Monday theme)
- Bugs found (P0 / P1): 0 / 3 (1 new, 2 carried)
- Risks noted: 3 (1 new, 2 carried)
Cross-check: `git log --oneline -30` and `docs/strategy_decisions.md` reviewed before filing.
`docs/audit_2026-06-07_config_drift.md` + `docs/audit_2026-06-07_weekly.md` reviewed.
Prior entry-flow audits (`audit_2026-05-18_entry_flow.md`, `audit_2026-05-25_entry_flow.md`) not
present in the audit series (5/18 and 5/25 were different themes that included entry-flow items).
Carried P1s verified still present in current code.
---
Full report (dev branch): https://github.com/kanex1/sydnee.signals/blob/dev/docs/audit_2026-06-08_entry_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-06-08 — ENTRY FLOW
## Summary
- Area: Entry Flow (Monday theme)
- Bugs found (P0 / P1): 0 / 3 (1 new, 2 carried)
- Risks noted: 3 (1 new, 2 carried)
Cross-check: `git log --oneline -30` and `docs/strategy_decisions.md` reviewed before filing.
`docs/audit_2026-06-07_config_drift.md` + `docs/audit_2026-06-07_weekly.md` reviewed.
Prior entry-flow audits (`audit_2026-05-18_entry_flow.md`, `audit_2026-05-25_entry_flow.md`) not
present in the audit series (5/18 and 5/25 were different themes that included entry-flow items).
Carried P1s verified still present in current code.
---
## Findings
### BUG [P1] (new): TV-BXt `_eval_tv_bxt_sym` lacks Friday 15:00 ET entry cutoff — new positions open after the "all entries blocked" window
**File:** `bot.py:3964–4170` (`_eval_tv_bxt_sym`)
**Evidence:**
```python
# bot.py:4007-4013 — Friday EOD flat fires only when my_pos is NOT None:
if my_pos is not None and price > 0:
...
if _now.weekday() == 4 and (_now.hour * 60 + _now.minute) >= 15 * 60 + 45:
self._tv_close(my_pos, "TV-BXt Friday EOD flat")
...
return
# bot.py:4014-4170 — entry logic continues for my_pos is None (new position) with no Friday check
sig = self._tv_bxt_signal(sym) # reads live Redis signal
if sig == 0:
return
...
self._open_trade(sym, sig, ...) # FIRES even Friday 15:00–15:44 ET
```
CLAUDE.md: `Fri 12:00 PT (15:00 ET) onward | all entries blocked (weekend gap risk) | ALL triggers`.
The standard `_evaluate_symbol` flow correctly blocks all new entries via `bot.py:5791`:
`if now_et.weekday() == 4 and t_min >= 15 * 60: return`.
TV-BXt bypasses `_evaluate_symbol` entirely and has NO equivalent Friday gate for new entries.
**Concrete scenario (dev, TV_BXT_RTH_ONLY=true):**
1. TV webhook arrives 15:10 ET Friday (5m BXt cross, e.g. SNDK)
2. `_bxt1m_window` → `win = "active"` (9:45-15:45 ET window)
3. `my_pos = None` → Friday EOD flat check (requires `my_pos is not None`) skipped
4. `TV_BXT_RTH_ONLY=true`: `240 <= 910 < 960` → True → allowed
5. `_open_trade` fires → SNDK long position created at 15:10 ET Friday
6. Position closes at 15:45 ET via the EOD flat check (35 min later)
**On prod (no TV_BXT_RTH_ONLY):** new entries can fire 15:00–15:44 ET (closed at 15:45 ET), and
16:15–19:44 ET (post-market "active" window; position gets force-closed on the very next tick
since the 15:45 check fires immediately for `my_pos is not None`).
**Impact:** Real-money SNDK + MU (live since 2026-05-01) can take new TV-BXt positions on Friday
afternoon during a window explicitly designated "all entries blocked." The 15:45 EOD flat provides
a safety net, but it depends on the bot surviving until 15:45 ET. A crash or restart between
15:10–15:44 ET leaves the position open with weekend gap risk.
**Fix:** Add a Friday entry cutoff guard before the new-entry code path in `_eval_tv_bxt_sym`,
immediately before `sig = self._tv_bxt_signal(sym)`:
```python
# Mirror _evaluate_symbol:5791 — block all new TV-BXt entries Friday after 15:00 ET
_now_gate = datetime.now(ET)
if _now_gate.weekday() == 4 and (_now_gate.hour * 60 + _now_gate.minute) >= 15 * 60:
if sig := self._tv_bxt_signal(sym): # if there's a pending signal, clear it
self._tv_bxt_signal_clear(sym)
return
```
(The signal clear is important so a Friday-afternoon webhook doesn't survive to fire at Monday 4:15 ET.)
---
### BUG [P1] (carried since 2026-05-24): `TV_BXT_MAX_AGE_SEC` documented but not implemented — stale signals persist through the flat window when no position is open
**File:** `bot.py:3702–3716` (`_tv_bxt_signal`), `bot.py:3964–3970` (flat-window branch)
**Evidence:**
```python
# bot.py:3705 — docstring promises max-age check:
"""... Optionally ignore stale signals via TV_BXT_MAX_AGE_SEC."""
# bot.py:3710-3714 — actual implementation: no age check, no TTL, no expiry:
v = r.get(f"tv_bxt_signal:{sym}")
return 1 if v == "up" else (-1 if v == "down" else 0)
# bot.py:3964-3970 — flat window only clears signal if a position is open:
if win == "flat":
if my_pos is not None:
self._tv_close(...)
self._tv_bxt_signal_clear(sym)
...
return # ← if my_pos is None, signal is NOT cleared
```
`tv_bxt_signal:{sym}` Redis key has no TTL. A TV webhook arriving during the "flat" window
with no open position (e.g. Friday 19:30 ET) persists in Redis and fires on Monday's
first "active" tick (04:15 ET), up to 60+ hours stale.
**Impact:** TV-BXt model (SNDK, MU — real money) can open a position at Monday 4:15 AM ET
based on a signal set Friday evening, potentially in the opposite direction from the weekend gap.
**Fix (two options — either sufficient):**
1. In the flat window, also clear the signal when there's no position:
```python
if win == "flat":
if my_pos is not None:
self._tv_close(...)
self._tv_bxt_signal_clear(sym) # always clear in flat window
...
return
```
2. Add TTL to the Redis SET in the webhook handler (`bot.py:~11832–11843`):
`r.set(f"tv_bxt_signal:{sym}", ..., ex=50400)` — 14h TTL survives intraday reconnects
but expires before Monday open.
---
### BUG [P1] (carried since 2026-05-17): `REVERSE_TIME_DECAY` uses `== "1"` — YAML-style `"true"` silently disables the morning size ramp
**File:** `bot.py:6019`
**Evidence:**
```python
# bot.py:6019 — sole check for the flag:
if os.environ.get("REVERSE_TIME_DECAY", "0") == "1" and _in_rth:
```
Every other boolean env flag in bot.py uses `.lower() in ("1", "true", "yes")`.
`REVERSE_TIME_DECAY: "true"` in a docker-compose YAML silently has no effect;
only `"1"` works. No log or diagnostic when disabled by misconfiguration.
**Impact:** The morning size ramp (50%→100% from 10:00→13:00 ET, tuned from backtest showing
2× stronger midday edge) is silently off if the compose uses YAML boolean form.
**Fix:** One-line: `if os.environ.get("REVERSE_TIME_DECAY", "").lower() in ("1", "true", "yes") and _in_rth:`
---
### RISK (new): TV-BXt `_eval_tv_bxt_sym` opens new entries during the opening 30-min block (9:30–10:00 ET)
**File:** `bot.py:3971–3974`; `bot.py:4047–4067`
**Evidence:**
```python
# bot.py:3971-3974 — explicitly documents the design:
# NOTE: TV-BXt does NOT honor "hold" windows (9:15-9:45 + 15:45-16:15 ET
# session-transition gaps). User intent is "act on every TV webhook"
# regardless of where it falls within the trading day.
# bot.py:4061 — TV_BXT_RTH_ONLY gate allows 4:00 AM - 4:00 PM ET (includes 9:30-10:00 ET):
_in_session = _now_et.weekday() < 5 and 240 <= _t_min < 960
```
Standard flow blocks ALL triggers 9:30-10:00 ET (`in_open_30` at `bot.py:5765-5772`).
TV-BXt explicitly exempts itself from the hold window per the design comment. This means a
TV webhook arriving at 9:35 ET would create a new position during the opening 30-min block
on both dev (TV_BXT_RTH_ONLY=true) and prod (no gate at all).
**Impact:** Opening 30-min entries on SNDK/MU at high spread, thin book, wide intraday range.
CLAUDE.md says "ALL triggers blocked" 9:30-10:00 ET but TV-BXt is intentionally exempt.
No operational risk per the design comment; risk is fill quality and spread cost.
**Recommendation:** Document in CLAUDE.md's Entry Time Blockers table that TV-BXt is exempt
from the opening 30-min block (by design). Consider adding `TV_BXT_RTH_ONLY` window adjustment
to `10:00-16:00 ET` (`600 <= _t_min < 960`) to align with standard flow's post-opening window.
---
### RISK (carried): `_check_pullback` overnight gap (3:50-4:00 ET) preserves pending pullbacks to fire after gap — stale-signal entry risk
**File:** `bot.py:6606–6614`
**Evidence:**
```python
# bot.py:6611-6614 — explicit design decision (comment says "don't cancel"):
if 3 * 60 + 50 <= _t_min < 4 * 60:
# Overnight gap: don't cancel — let pending survive to fire
# after the gap closes at 4:00 AM ET.
return
```
A pullback queued at e.g. 3:47 ET (3 minutes before the overnight gap) has a 180s timeout
(`PULLBACK_TIMEOUT_SEC = 180`). By 4:00 ET, elapsed = 780s > 180s → fires unconditionally on
timeout via `trigger_type = "timeout (180s, no pullback)"`. The entry is based on market
conditions from 3:47 ET — up to 13 minutes stale — with no re-validation of RV, spread, or
regime at the fire-time.
**Impact:** Off-hours pullback entries (BXt / RSI extreme if off-hours toggle is ON) can fire
at 4:00 ET on conditions evaluated at 3:47 ET. 13 minutes is substantial in pre-market.
**Recommendation:** At minimum, re-check RV and spread at fire-time (after the gap). Or add
a stale-signal expiry: cancel pending pullbacks where `elapsed > PULLBACK_TIMEOUT_SEC + 600`
(10-minute grace) at re-evaluation after gap close.
---
### OK (checked, working or recently fixed):
- **Standard entry time gates — all correct:** overnight gap `3*60+50 <= t_min < 4*60`
(bot.py:5764-5770), opening 30 min `9*60+30 <= t_min < 10*60` (5765-5772), close hour
`15*60 <= t_min < 16*60` BXt/div blocked rsi_extreme exempt (5779-5781), Friday EOD
all-triggers block `weekday()==4 and t_min>=15*60` (5791-5793), off-hours gate
`not in_rth and trigger_type != "rsi_extreme"` (5794-5796). Order of gates is correct;
Friday EOD fires after close-hour so rsi_extreme that passes close-hour gate is still
blocked on Friday. ✓
- **Off-hours rsi_extreme toggle:** fail-closed (returns `False` when Redis unavailable,
bot.py:10790-10809). RTH rsi_extreme unaffected by toggle. ✓
- **RVOL policy — fail-closed and direction-aware:** RV unavailable → block (bot.py:6249-6251);
BXt/div/pullback floor 0.8× (6278-6280); rsi_extreme blowoff ceiling 5.0× using rv_10m
(6296-6299); rsi_extreme exempt from 0.8× floor (correct — exhaustion setup). ✓
- **WS tick-RV gate:** mutually exclusive with REST gate; WS floor only fires when fresh
(<5s) and baseline_p50 configured (bot.py:6261-6276). ✓
- **1m BXt bias gate for rsi_extreme (`_rsi_ext_pending_dir`):** auto-clears when RSI
recovers above OS or below OB threshold (bot.py:5569-5573). Pending fires at 50% on
second bar if 1m still against (5723-5724). ✓
- **Model lock in `_process_entry_candidates`:** correctly drops ALL original-model candidates
when TV model is active. Pending pullback NOT created for dropped candidates (pullback creation
at bot.py:6494 is inside the per-candidate loop, AFTER the model lock `continue` at 6163).
TV symbols cannot accidentally get original-model positions via the pullback path. ✓
- **GUARD 1/2/3 in `_open_trade`:** prevents double-entry (open trade check, IBKR cache
position check, ib.wrapper direct read — bot.py:7026-7060). ✓
- **Atomic swap in `_process_entry_candidates`:** tuple-RHS assignment is one bytecode
(bot.py:6126). Race condition fixed 2026-04-28 (commit: audit P0). ✓
- **TV-BXt flat window force-closes existing positions:** `win == "flat"` path at bot.py:3964
correctly closes any open TV position and clears signal. ✓
- **`_bxt_active_syms()` correctly gates `_process_entry_candidates`:** when TV model is active
for SNDK+MU, all original 5m BXt / rsi-div / rsi-extreme / pullback entries for ALL symbols
are dropped via the single-model lock. This is intentional design. ✓
- **BXt zone gate:** `BXT_RSI_LONG_MAX=60` / `BXT_RSI_SHORT_MIN=40` defaults (bot.py:5902-5910)
correctly block BXt entries with RSI already in the overbought/oversold zone. ✓
- **15m bias gate:** `BXT_USE_15M_BIAS` default "true" hard-blocks counter-trend BXt
(bot.py:5931-5948); divergence/pullback get 50% reduce instead. rsi_extreme exempt. ✓
- **TV-BXt signal cleared on close-opposite and OBV-trail stop:** `_tv_bxt_signal_clear`
called at bot.py:4005, 4010, 4066 (block), and 4139/4140 (flow-confirm abandoned). ✓
- **Friday EOD flat for TV-BXt (existing positions):** fires at 15:45 ET Friday for any open
TV-BXt position (bot.py:4007-4013). Scale state also cleared. ✓
- **Sibling stopout gate:** `sibling_stopout_min` correctly compares `other_ss.last_stopout_time`
across all symbols (bot.py:5880-5885). ✓