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 — performance audit 2026-06-14 — 0P0 0P1 5R
AI verdict
employee
high
· confidence: high
· by internal-exempt
“Sydnee Agent (AI): Sydnee nightly — performance audit 2026-06-14 — 0P0 0P1 5R”
Reasoning: @sydnee.ai is a protected domain — hard exemption
Sydnee nightly — performance audit — 2026-06-14
P0 findings: 0 P1 findings: 0 Risks: 5
- Area: Performance (Saturday theme)
- Branch: `dev` (ea69590)
- Files scanned: `bot.py` (20 646 lines), `core/database.py`, `core/persistence.py`,
`poly_ws/aggregator.py`, `docs/strategy_decisions.md`, `git log --oneline -30`
- Commits since last Sat audit (2026-06-13): 4 meaningful (f977cac TAPE_STRICT_SIG2
+ TAPE_TICK_EXIT; 6ea52ec + 87cfebd ENGINE/MODEL UI flattening; docs only)
- Bugs found (P0 / P1): 0 / 0
- Risks noted: 5 (3 new, 2 carry from 2026-06-13)
---
Full report (dev branch): https://github.com/kanex1/sydnee.signals/blob/dev/docs/audit_2026-06-14_performance.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-14 — PERFORMANCE
## Summary
- Area: Performance (Saturday theme)
- Branch: `dev` (ea69590)
- Files scanned: `bot.py` (20 646 lines), `core/database.py`, `core/persistence.py`,
`poly_ws/aggregator.py`, `docs/strategy_decisions.md`, `git log --oneline -30`
- Commits since last Sat audit (2026-06-13): 4 meaningful (f977cac TAPE_STRICT_SIG2
+ TAPE_TICK_EXIT; 6ea52ec + 87cfebd ENGINE/MODEL UI flattening; docs only)
- Bugs found (P0 / P1): 0 / 0
- Risks noted: 5 (3 new, 2 carry from 2026-06-13)
---
## Findings
### RISK (new): Return-on-risk (RoR) absent from all performance tracking paths
**Files:** `bot.py:8493-8525` (`_compute_period_stats`), `core/database.py:1637-1695`
(`compute_performance`), `core/persistence.py:19-59` (`Trade` dataclass)
**Evidence:**
```python
# _compute_period_stats returns:
{"pnl", "trades", "win_rate", "profit_factor", "avg_win",
"avg_loss", "max_drawdown", "best", "worst", "avg_daily"}
# ← no return_on_risk, no avg_risk_per_trade
# Trade dataclass fields:
stop_price: float | None = None # only stop level stored
# ← no initial_risk_dollars (shares × |entry - stop|) field
```
**Impact:** Three changes deployed 25+ days ago — 2× risk (ca4b173, 2026-05-20),
reverse time-decay (5fdaad4, 2026-05-19), and MAX_POSITION_PCT 10%→15% (b3fedce,
2026-05-19) — all declare "return-on-risk (P&L ÷ total $ risk) improves" as their
primary success criterion. `strategy_decisions.md` shows `Observed: TBD / Final call:
TBD` for all three. Their 5-7 day validation windows closed in late May. Without RoR
in any dashboard or API endpoint, passive validation is impossible; the criteria stay
"pending" indefinitely.
**Fix:** Compute RoR in `db.compute_performance()` via SQL:
```sql
SELECT ROUND(SUM(pnl) / NULLIF(SUM(
ABS(entry_price - stop_price) * shares
), 0), 3) AS return_on_risk
FROM trades WHERE exit_price IS NOT NULL ...
```
Expose as `return_on_risk` in the API response and add to the Performance tab.
`stop_price` is already persisted per `Trade.stop_price`. This is a read-only
SQL change — no schema migration needed.
---
### RISK (new): No per-trigger breakdown in `/api/performance` — success criteria unverifiable from dashboard
**Files:** `core/database.py:1637`, `bot.py:13799`
**Evidence:**
```python
# db.compute_performance() returns aggregate-only stats — no GROUP BY strategy_reason.
# db.per_stock_performance() groups by symbol — no trigger axis.
# No db.per_trigger_performance() or equivalent exists.
```
Eight pending changes in `strategy_decisions.md` use trigger-level success criteria:
- "BXt WR rises from 12% to ≥25%" (2026-05-06)
- "rsi_extreme WR improves week-over-week at full size" (2026-04-14)
- "divergence WR rises from 30% to ≥45%" (2026-05-06)
- "OBV-divergence WR > RSI-divergence WR by ≥5pp" (2026-04-26)
- "bxt_reversal count drops ≥50% WoW" (Rule F, 2026-04-15)
The `strategy_reason` column in `trades` carries the trigger name (e.g., `"BXt
reversal"`, `"RSI extreme (oversold)"`). It exists in the DB, but no API endpoint
exposes aggregated WR/avg/count by trigger. Validation is manual-SQL-only and
has evidently not been performed: all 8 criteria show `Observed: TBD`.
**Fix:** Add `db.per_trigger_performance(date_from, date_to)`:
```sql
SELECT
CASE
WHEN entry_reason ILIKE '%bxt%' THEN 'bxt'
WHEN entry_reason ILIKE '%rsi extreme%' THEN 'rsi_extreme'
WHEN entry_reason ILIKE '%divergence%' THEN 'divergence'
WHEN entry_reason ILIKE '%pullback%' THEN 'pullback'
ELSE 'other'
END AS trigger,
COUNT(*) AS n,
ROUND(100.0 * SUM(CASE WHEN pnl > 0 THEN 1 ELSE 0 END) / COUNT(*), 1) AS wr,
ROUND(AVG(pnl), 2) AS avg_pnl
FROM trades
WHERE exit_price IS NOT NULL AND entry_time >= %s
GROUP BY trigger
```
Surface via `/api/performance/by-trigger?days=7` (30s cache, matching `_perf_cache`
pattern). ~20 min to add; unblocks all 8 pending validation closes.
---
### RISK (new): `TAPE_STRICT_SIG2` strict AND-gate bypassed on sidecar-absent ticks
**File:** `bot.py:17211-17236`
**Evidence:**
```python
_strict = os.environ.get("TAPE_STRICT_SIG2", "").lower() in ("1", "true", "yes")
if ask_run > 0 or bid_run > 0 or vol2 > 0: # ← sidecar tick-data present
run_hit = ...
flow_hit = ...
if _strict:
# AND-gate enforced: run_hit AND flow_hit AND opp_run<1 AND prints_5s>=70
sig2 = bool((run_hit and flow_hit and clean_tape and hot_tape)
or (blocks > 0 and last_block >= _block_min * 2))
else:
sig2 = bool(run_hit or flow_hit or ...)
else: # ← sidecar data absent
# _strict flag NOT consulted — old loose imbal30-based sig2 used:
imbal30 = (abs(signed30) / vol30) if vol30 > 0 else 0.0
sig2 = bool((imbal30 >= 0.5 and d != 0 and ...) or (blocks > 0 ...))
```
When `ask_run=bid_run=vol2=0` (sidecar quiet: no trades in the 2s window), the strict
gate is silently bypassed and the pre-upgrade loose sig2 fires. The backtest that
motivated `TAPE_STRICT_SIG2` was entirely on events with sidecar data present; the
fallback branch was not part of the offline analysis. During brief sidecar-quiet
periods (e.g., between trades at open, or during a sidecar restart), entries in the
"flipper" cohort (flow_flip_within_30s = −6 bp avg, 41.8% positive) can still reach
score=4 and trigger a trade despite `TAPE_STRICT_SIG2=true`.
**Impact:** False confidence in "strict mode" during tick-quiet intervals. On an
active RTH tape this is infrequent (v2 > 0 most of the time); in pre-market or slow
midday it's more common. Doesn't affect safety (−1% stop + 60min cap still protect);
affects the quality-filter property the flag is supposed to enforce.
**Fix:** Add a guard in the `else` branch so strict mode requires at least the 30s
imbalance to exceed the same 0.68 threshold seen in the held cohort:
```python
else:
imbal30 = (abs(signed30) / vol30) if vol30 > 0 else 0.0
if _strict:
# No 2s data: require tighter imbal floor (held-cohort 30s avg = 0.58+)
sig2 = bool(imbal30 >= 0.6 and d != 0 and ...
or (blocks > 0 and last_block >= _block_min * 2))
else:
sig2 = bool((imbal30 >= 0.5 and ...) or ...)
```
Or simply log `sig2=False` in strict mode when sidecar data is absent (most conservative,
easiest to validate).
---
### RISK (carry from 2026-06-13): `/api/day/tick` — no response cache; Yahoo Finance 48/min call rate
**File:** `bot.py:11796`, `futures_client.py:69-83`
No change since 2026-06-13 filing. 5s Day-page poll × 4 Yahoo calls = 48/min; no
in-process cache guard. Yahoo unofficial rate limit ~20-100/min; sustained load
is fragile. Thread-pool creation overhead ~12-60 ms/min. Fix: 15s `_day_tick_cache`
dict + `_day_tick_cache_ts` float (non-locking, worst case a redundant live fetch). ✓
---
### RISK (carry from 2026-06-13): `api_day_analyze` hardcodes `claude-sonnet-4-5-20250929`
**File:** `bot.py:12114`
No change since 2026-06-13 filing. Current model is `claude-sonnet-4-6`. The Day
page streams to the dashboard on every page open using one generation behind the
current model. One-line fix. ✓
---
## OK (checked, working or recently fixed)
**`_tape_tick_exit_hit` data freshness:** `h = r.hgetall(f"signals.poly.live.{sym}")`
at bot.py:18179 is fetched at the top of `_tape_eval_sym` (1Hz loop). Exit at
bot.py:18266 receives the same `h`. Staleness bounded by 1s loop rate — same as the
entry path. ✓
**`_tape_tick_exit_hit` zero-volume guard:** `if vol2 <= 0: return None`
(bot.py:18156) prevents false exits when no trades in the 2s window. Sidecar
data absent = no exit fire. ✓
**TAPE_STRICT_SIG2 AND-gate (tick-data branch):** `run_hit AND flow_hit AND
opp_run<1 AND prints_5s>=70` at bot.py:17225-17228 correctly matches the held-cohort
profile from the 23K-event backtest (run≥4.2 / opp≤0.5 / imbal2≥0.68 /
prints_5s≥87). Threshold 70 (vs mean 87) is a deliberate calibration choice — the
point was not to use the mean as a threshold. Block-only path requires 2× block_min
(consistent with strategy_decisions.md). ✓
**OBV-exit and tick-exit sequence:** OBV-exit at bot.py:18252 reads from `ss`
(SymbolState 5m bars); tick-exit at bot.py:18263 reads from `h` (2s Redis hash).
Both gated by the same `TAPE_MIN_HOLD_SEC` (60s default). OBV runs first; if it
fires, function returns before tick-exit is evaluated. No double-close. ✓
**Scalp horizon snap on stale tape:** `_snapped_{h}` is set at line 18614 regardless
of whether `snap is None`. Price/flow/score land as NULL (initialized None at 18661);
MFE/MAE from `ev["mfe_running"]` / `ev["mae_running"]` are non-NULL. Event finalizes
correctly. `ret_{h}s` computed via `_ret(pf)` returns None on None input. Aggregates
skip NULL rows. Consistent with design comment at bot.py:18504. ✓
**MFE/MAE tracking:** `mfe_running` starts 0.0 and tracks max `ret_now`;
`mae_running` starts 0.0 and tracks min `ret_now`. For a long, downward moves
produce negative `ret_now` → mae goes negative. For a short, upward moves produce
negative `ret_now` (direction = −1). Both correct. Stale-tick guard at line 18594
(`if snap is not None and snap["price"] > 0`) prevents stale data from polluting
the running trackers. ✓
**P&L formula:** `(exit_price − entry_price) × direction × shares − fees`
(persistence.py:57-58). Correct for both long (+1) and short (−1). ✓
**`_compute_period_stats` max_drawdown:** sequential equity-curve walk from 0,
tracking `peak − eq` max. Standard definition. Audited weekly 2026-06-14 as OK. ✓
**`profit_factor = gp / gl`:** `gp = sum(wins)`, `gl = abs(sum(losses))`. Standard
definition. Guard on `gl > 0`. ✓
**`api_performance` cache:** 30s `_perf_cache` + `_perf_cache_time` (bot.py:13801-13803).
Cache hits avoid the `db.compute_performance()` + `db.daily_pnl_series()` +
`db.per_stock_performance()` triple query. Correct TTL for the dashboard's
manual-refresh pattern. ✓
**Two prior carry risks (2026-06-13):** `_scalp_signal_log_loop` duplicate hgetall
(6× Redis redundancy) and `api_scalp_signal_summary` unbounded count(*) — confirmed
still present, still not auto-polled (severity unchanged, no regression). ✓