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-15 — 0P0 6P1 5R
AI verdict
employee
high
· confidence: high
· by internal-exempt
“Sydnee Agent (AI): Sydnee nightly — entry_flow audit 2026-06-15 — 0P0 6P1 5R”
Reasoning: @sydnee.ai is a protected domain — hard exemption
Sydnee nightly — entry_flow audit — 2026-06-15
P0 findings: 0 P1 findings: 6 Risks: 5
- Area: Entry Flow (Monday theme)
- Bugs found (P0 / P1): 0 / 6 (3 carried from 06-08, 3 re-filed from 06-01 audit that were missed in 06-08)
- Risks noted: 5 (1 new, 2 carried from 06-08, 2 re-filed from 06-01)
Cross-check: `git log --oneline -30` and `docs/strategy_decisions.md` (all 1159 lines) reviewed.
`docs/audit_2026-06-08_entry_flow.md` reviewed. Recent commits since 06-08 are all tape/UI
(ee9f98d → f2f3827) — none touch bot.py entry flow. All 6 P1s verified against current code.
Note: 06-08 audit dropped 3 P1s and 2 risks that were in the 06-01 audit and remain
unresolved; re-filed below with evidence.
---
Full report (dev branch): https://github.com/kanex1/sydnee.signals/blob/dev/docs/audit_2026-06-15_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-15 — ENTRY FLOW
## Summary
- Area: Entry Flow (Monday theme)
- Bugs found (P0 / P1): 0 / 6 (3 carried from 06-08, 3 re-filed from 06-01 audit that were missed in 06-08)
- Risks noted: 5 (1 new, 2 carried from 06-08, 2 re-filed from 06-01)
Cross-check: `git log --oneline -30` and `docs/strategy_decisions.md` (all 1159 lines) reviewed.
`docs/audit_2026-06-08_entry_flow.md` reviewed. Recent commits since 06-08 are all tape/UI
(ee9f98d → f2f3827) — none touch bot.py entry flow. All 6 P1s verified against current code.
Note: 06-08 audit dropped 3 P1s and 2 risks that were in the 06-01 audit and remain
unresolved; re-filed below with evidence.
---
## Findings
### BUG [P1] (carried since 2026-06-08): TV-BXt `_eval_tv_bxt_sym` lacks Friday 15:00 ET entry cutoff
**File:** `bot.py:4064–4078`
**Evidence:**
```python
# bot.py:4064 — Friday EOD flat is guarded by 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") # closes at 15:45
...
return
sig = self._tv_bxt_signal(sym) # ← runs with my_pos is None AND for scale-in slots 2-10
```
`_evaluate_symbol` blocks ALL new entries Friday `t_min >= 15*60` at `bot.py:5914`.
`_eval_tv_bxt_sym` bypasses `_evaluate_symbol` and has no equivalent guard.
Compound issue with `TV_BXT_SCALE_IN=true`: once slot 1 opens a position at 15:10 ET Friday
(`my_pos is None → no gate → fires`), slots 2-10 (`my_pos is not None, cur==sig`) see
the 15:45 EOD flat check as False and continue adding shares until 15:44 ET.
**Impact:** Real-money SNDK/MU (dev) can take new TV-BXt positions—and scale into them—Friday
15:00–15:44 ET, in a window explicitly designated "no new entries" by CLAUDE.md.
**Fix:** Add before `sig = self._tv_bxt_signal(sym)` (line 4078), unconditional:
```python
_now_gate = datetime.now(ET)
if _now_gate.weekday() == 4 and (_now_gate.hour * 60 + _now_gate.minute) >= 15 * 60:
if self._tv_bxt_signal(_now_gate): # clear stale Friday signal
self._tv_bxt_signal_clear(sym)
if hasattr(self, "_tv_scale_state"):
self._tv_scale_state.pop(sym, None)
return
```
---
### BUG [P1] (carried since 2026-05-24): `TV_BXT_MAX_AGE_SEC` documented but never implemented — stale signals persist through the weekend
**File:** `bot.py:3769` (docstring only)
**Evidence:**
```python
# bot.py:3769 — docstring promises max-age check:
"""... Optionally ignore stale signals via TV_BXT_MAX_AGE_SEC."""
# bot.py:3774-3778 — actual implementation: no age check, no TTL:
v = r.get(f"tv_bxt_signal:{sym}")
return 1 if v == "up" else (-1 if v == "down" else 0)
```
`tv_bxt_signal:{sym}` Redis key has no TTL. A Friday-close webhook survives 65+ hours to fire
at Monday 04:15 ET, potentially in the wrong direction vs. the weekend gap.
**Impact:** TV-BXt (real money SNDK/MU) can open at Monday open on a signal set Friday evening.
**Fix (option 1):** Add TTL on webhook write (`bot.py:~13112`):
`r.set(f"tv_bxt_signal:{sym}", sig, ex=50400)` — 14-hour TTL clears before Monday open.
**Fix (option 2):** In `_eval_tv_bxt_sym` flat-window, always clear signal (not just when a
position is open):
```python
if win == "flat":
self._tv_bxt_signal_clear(sym) # move outside the my_pos is not None guard
...
```
---
### BUG [P1] (carried since 2026-05-17): `REVERSE_TIME_DECAY` uses `== "1"` — YAML `"true"` silently disables morning size ramp
**File:** `bot.py:6167`
**Evidence:**
```python
# bot.py:6167 — sole check:
if os.environ.get("REVERSE_TIME_DECAY", "0") == "1" and _in_rth:
```
Every other boolean env flag uses `.lower() in ("1", "true", "yes")`.
`REVERSE_TIME_DECAY: "true"` in docker-compose YAML silently has no effect.
**Impact:** The morning size ramp (50%→100% from 10:00→13:00 ET) is silently off when the
compose uses YAML boolean form. No diagnostic log when disabled by misconfiguration.
**Fix:** `if os.environ.get("REVERSE_TIME_DECAY", "").lower() in ("1", "true", "yes") and _in_rth:`
---
### BUG [P1] (re-filed from 2026-06-01; omitted from 06-08 audit): 1m BXt bias gate sets `_rsi_ext_pending_dir` BEFORE time gates run — poisons pending state on blocked bars
**File:** `bot.py:5830–5845` (1m BXt block) vs `bot.py:5887–5896` (time gates)
**Evidence:**
```python
# bot.py:5843 — pending state set and function returns BEFORE time gates:
ss._rsi_ext_pending_dir = raw_sig
self._log_activity(..., "RSI EXTREME PENDING: deferring 1 bar", "warn")
return # ← time gates at 5887 are never reached
# bot.py:5887-5896 — time gates (never reached when pending fires):
in_overnight_gap = 3 * 60 + 50 <= t_min < 4 * 60
in_open_30 = 9 * 60 + 30 <= t_min < 10 * 60
if in_overnight_gap: return
if in_open_30: return
```
**Scenario (opening 30-min block):**
- `09:35 ET`: rsi_extreme + 1m BXt against → pending set, returns before open-30 gate. Log
incorrectly says "deferring 1 bar" instead of "blocked: opening 30 min."
- `10:01 ET`: `_pend_dir == raw_sig` (set at 09:35) → entry fires at 50% size immediately.
- **Correct behavior**: pending is not set; at 10:01 ET the signal is fresh → defers again →
entry fires at `10:06 ET`, one full bar later.
**Impact:** rsi_extreme + 1m-BXt-against signals at open-30 start fire 5 min earlier than intended.
Off-hours toggle + overnight gap: same mechanism applies during the 03:50–04:00 ET gap.
**Fix:** Move time gates above the 1m BXt block or add early-abort inside the bias block:
```python
# top of 1m BXt block, after computing in_overnight_gap/in_open_30:
if in_overnight_gap or in_open_30:
pass # let time-gate below handle it; do not arm pending
else:
ss._rsi_ext_pending_dir = raw_sig
self._log_activity(...)
return
```
---
### BUG [P1] (re-filed from 2026-06-01; omitted from 06-08 audit): `daily_loss_limit` equals `capital` — DLL gate non-functional on prod
**File:** `config.json:3,6`; `core/risk.py:112`
**Evidence:**
```json
{ "capital": 50000, "daily_loss_limit": 50000 }
```
`core/risk.py:112`: gate fires only when `today_pnl < -daily_loss_limit`. With limit == capital,
the bot must lose 100% of paper equity before the DLL halts entries. Dev bypasses this via
`DISABLE_DAILY_LOSS_LIMIT=true` (env, added 2026-06-02) — but that env var is dev-only per
strategy_decisions.md: "Hard re-enable the gate before any real-money promotion — this flag is
NOT for prod." Prod is currently at config.json defaults with no env override.
**Impact:** On prod (real money since 2026-05-01), the daily-loss circuit-breaker is effectively
disabled. A runaway session can burn the full $50K account before the DLL stops entries.
**Fix:** `"daily_loss_limit": 1500` (3% of $50K, matching `core/risk.py:RiskConfig` dataclass
default). Also verify prod docker-compose does NOT set `DISABLE_DAILY_LOSS_LIMIT`.
---
### BUG [P1] (re-filed from 2026-06-01; omitted from 06-08 audit): `TV_BXT_TRAIL_AGAINST` default mismatch — history replay shows 50% wider trail than live
**File:** `bot.py:3838` vs `bot.py:14923`
**Evidence:**
```python
# bot.py:3838 — live OBV-trail path:
agnst = float(os.environ.get("TV_BXT_TRAIL_AGAINST", "1.0"))
# bot.py:14923 — /api/trade/history replay path:
agnst = float(os.environ.get("TV_BXT_TRAIL_AGAINST", "1.5"))
```
When `TV_BXT_TRAIL_AGAINST` is not set in the environment (defaults active), the stop-analysis
dashboard reports a 1.5× trailing stop while the live bot ran a 1.0× stop. Any post-trade
stop-placement audit on unset-env sessions is wrong by 50%.
**Impact:** Historical stop-analysis for TV-BXt is misleading when env var unset; could produce
incorrect "bot ran tight stop → bad outcome" vs "bot ran loose stop → preventable" conclusions.
**Fix:** Change `bot.py:14923` default from `"1.5"` to `"1.0"`. One-line fix.
---
### RISK (new tonight): `TV_BXT_TAPE_ENTRY_GATE` has no entry in `strategy_decisions.md`
**File:** `bot.py:4146–4181`; `docs/strategy_decisions.md` (entire file reviewed)
**Evidence:**
```python
# bot.py:4146 — comments date the feature to 2026-06-11:
# TV_BXT_TAPE_ENTRY_GATE=true (dev opt-in, default OFF — built 2026-06-11
# alongside the tick-level T&S upgrade).
```
`strategy_decisions.md` has no entry for `TV_BXT_TAPE_ENTRY_GATE`. No hypothesis, backtest,
validation window, or success criteria exist. When the gate blocks, it calls
`self._tv_bxt_signal_clear(sym)` — permanently clearing the webhook signal — with no
decision log supporting that behavior.
**Impact:** Signal-clearing on a block is intentional but undocumented; if the gate fires on
transient tape noise (book thinned momentarily, no stale/missing scenario that would fail-open),
the next same-direction webhook must re-fire before the bot re-enters. No ability to audit
whether this improved or hurt outcomes without a baseline.
**Recommendation:** Add a strategy_decisions.md entry with: hypothesis, backtest basis (or
explicit "none — observational"), validation window, and success criteria. Is it currently
enabled on dev (`TV_BXT_TAPE_ENTRY_GATE=true`)? Verify dev compose.
---
### RISK (carried since 2026-06-08): TV-BXt `_eval_tv_bxt_sym` opens new entries during RTH open-30 block (9:30–10:00 ET)
**File:** `bot.py:3971–3974` (design comment); `bot.py:4139`
**Evidence:** Design comment explicitly states TV-BXt does not honor "hold" windows.
`TV_BXT_RTH_ONLY=true` checks `570 <= _t_min < 960` (09:30–16:00 ET) — this ALLOWS entries
during 09:30–10:00 ET, whereas standard flow blocks ALL triggers during this window.
**Impact:** SNDK/MU TV-BXt entries at 09:35–09:59 ET at wide opening spreads.
CLAUDE.md says "06:30–07:00 PT: ALL triggers blocked" but TV-BXt is intentionally exempt.
**Recommendation:** Document in CLAUDE.md's Entry Time Blockers table. Consider shifting the
RTH-only window to `600 <= _t_min < 960` (10:00–16:00 ET) to align with standard flow.
---
### RISK (carried since 2026-06-08): `_check_pullback` overnight gap bypass preserves stale pending entries
**File:** `bot.py:6611–6614`
**Evidence:**
```python
if 3 * 60 + 50 <= _t_min < 4 * 60:
# Overnight gap: don't cancel — let pending survive to fire after gap closes
return
```
A pullback queued at 03:47 ET has a 180s timeout. By 04:00 ET, elapsed=780s > 180s → fires
unconditionally on timeout with no re-validation of RV, spread, or regime. Entry is based on
market conditions up to 13 minutes stale.
**Impact:** Off-hours pullback entries can fire at 04:00 ET on conditions from 03:47 ET.
**Recommendation:** Re-check RV+spread at fire-time, or cancel pending where
`elapsed > PULLBACK_TIMEOUT_SEC + 600` after the gap re-opens.
---
### RISK (re-filed from 2026-06-01; omitted from 06-08 audit): `in_rth` at `bot.py:5890` lacks weekday guard
**File:** `bot.py:5890`
**Evidence:**
```python
# bot.py:5890 — no weekday check:
in_rth = 9 * 60 + 30 <= t_min < 16 * 60
# bot.py:3738 — BXt 1m has the guard:
_in_rth = (9 * 60 + 30 <= tmin < 16 * 60) and now_et.weekday() < 5
# bot.py:5687 — RSI extreme TF check has the guard:
_in_rth_session = 570 <= t_min < 960 and now_et.weekday() < 5
```
If a weekend bar arrives (stale Polygon push), `in_rth = True` for 09:30–16:00 ET. The
off-hours gate at `bot.py:5917` (`if not in_rth and trigger_type != "rsi_extreme"`) would
NOT block BXt/divergence entries.
**Impact:** Theoretical — IBKR paper does not send weekend bars. Latent inconsistency.
**Fix:** `in_rth = 9 * 60 + 30 <= t_min < 16 * 60 and now_et.weekday() < 5`
---
### RISK (re-filed from 2026-06-01; omitted from 06-08 audit): `_rsi_ext_pending_dir` not persisted — restart loses 1m BXt pending state
**File:** `bot.py:5840–5850`; `core/persistence.py` (absent)
**Evidence:** `_rsi_ext_pending_dir` is an in-memory attribute on `SymbolState`. No DB column
or Redis key stores it. On any bot restart (container recreate, daily rotation), the state is
lost. A deferred entry (1m BXt against on bar N) re-defers on bar N+1