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-05-30 — 0P0 1P1 2R
AI verdict
employee
high
· confidence: high
· by internal-exempt
“Sydnee Agent (AI): Sydnee nightly — performance audit 2026-05-30 — 0P0 1P1 2R”
Reasoning: @sydnee.ai is a protected domain — hard exemption
Sydnee nightly — performance audit — 2026-05-30
P0 findings: 0 P1 findings: 1 Risks: 2
- Area: Performance (Saturday theme)
- Branch: `dev` (0f470d7)
- Files scanned: `bot.py` (18 140 lines), `core/database.py`, `docs/strategy_decisions.md`,
prior audit chain (2026-05-23, 2026-05-16)
- Bugs found (P0 / P1): 0 / 1
- Risks noted: 2 (1 new, 1 carried from 2026-05-23)
---
Full report (dev branch): https://github.com/kanex1/sydnee.signals/blob/dev/docs/audit_2026-05-30_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-05-30 — PERFORMANCE
## Summary
- Area: Performance (Saturday theme)
- Branch: `dev` (0f470d7)
- Files scanned: `bot.py` (18 140 lines), `core/database.py`, `docs/strategy_decisions.md`,
prior audit chain (2026-05-23, 2026-05-16)
- Bugs found (P0 / P1): 0 / 1
- Risks noted: 2 (1 new, 1 carried from 2026-05-23)
---
## Findings
### BUG [P1]: `_scalp_signal_log_loop` — forward-price horizons re-filled after tape stale, corrupting research data
**File:** `bot.py:16126-16141` (introduced in commit 0f470d7, 2026-05-28)
**Evidence:**
```python
# bot.py:16170 — events initialized with None for all three horizons:
pending.append({
"t0_ms": now_ms, ...,
"price_30s": None, "price_60s": None, "price_120s": None,
})
# bot.py:16132-16137 — fill loop every `period` seconds (default 2.0):
if ev.get(key) is not None: # <-- None is not None == False → does NOT skip
continue
if now_ms - ev["t0_ms"] >= hsec * 1000:
ev[key] = self._scalp_live_price(r, ev["symbol"], now_ms) # can return None
else:
done = False
```
`_scalp_live_price` returns `None` when the tape is stale (age > 10 s — normal
during pre/post-market transitions and sidecar restarts). When this happens at
the exact 30s window:
1. `ev["price_30s"] = None` (unchanged from initial state)
2. Next tick: `ev.get("price_30s") is not None` → `None is not None` → `False` → **re-enters the fill branch**
3. At e.g. t₀+62s, tape is live again → `ev["price_30s"] = P₆₂` (the 62s price, not the 30s price)
4. `ev["price_60s"]` may fill with the same `P₆₂` at the same tick
Resulting DB row: `price_30s = P₆₂`, `price_60s = P₆₂`, `ret_30s` and `ret_60s`
both equal the ~62s return, **not** the 30s and 60s returns. The research data
is silently contaminated whenever the tape has any stale window (>10s) within the
first 60 seconds after an event.
**Impact:** The scalp-edge logger's core purpose is to answer "does the 4-signal
checklist beat cost at +30s/+60s/+120s?" Mislabeled horizons make the 30s and 60s
columns unreliable. If the tape is stale at many events' 30s mark (e.g., during
any pre-market low-volume period), the averaged `avg_ret_30s` in
`scalp_signal_summary` reflects an arbitrary-horizon return — the 30s column can
only be trusted if the tape was live at every event's exact 30s window.
**Fix:**
```python
# bot.py:16170 — use a sentinel (False) to distinguish "not yet attempted":
"price_30s": False, "price_60s": False, "price_120s": False,
# bot.py:16132 — skip horizons that have been attempted (None=miss, float=price):
if ev.get(key) is not False: # already attempted → skip regardless of result
continue
```
With `False` as the "not yet tried" sentinel:
- First attempt at the horizon window: `ev[key]` goes from `False` → `None` (tape stale) or `float` (price)
- Subsequent ticks: `ev.get(key) is not False` is `True` for both `None` and `float` → `continue`, no re-try
- `_ret(pf)` in `_scalp_finalize_event` already handles `None` → stores SQL NULL, which `avg()` skips correctly
One additional change needed in `_scalp_finalize_event` (bot.py:16075):
```python
def _ret(pf):
if pf is None or pf is False or not p0: # False = never attempted (shouldn't occur)
return None
return round(d * (pf - p0) / p0, 6)
```
---
### RISK: `api_scalp_signal_summary` has no response cache — 3 aggregation queries per call
**File:** `bot.py:14185`
**Evidence:**
```python
@app.route("/api/scalp-signal-log/summary")
def api_scalp_signal_summary():
...
return jsonify(self.db.scalp_signal_summary(hours=hours) or {})
```
`scalp_signal_summary` runs 3 SQL aggregation queries (GROUP BY score, GROUP BY
sig2, COUNT(*)) on `scalp_signal_log` with no response-level cache. The endpoint
currently returns immediately (table is empty unless `SCALP_SIGNAL_LOG=true`).
Once the logger accumulates data (days of 2-second ticks at 8 symbols), the table
will grow into the tens-of-thousands of rows and these GROUP BY queries will add
latency.
**Current impact:** Low — endpoint is not auto-polled by the dashboard. Only
relevant once the Phase-0 logger is running continuously and the summary page is
being actively monitored.
**Fix:** Add a 30-second cache mirroring `_perf_cache` at `bot.py:15872`:
```python
_scalp_summary_cache = None
_scalp_summary_cache_time = 0
# In api_scalp_signal_summary():
now = time.time()
if self._scalp_summary_cache and now - self._scalp_summary_cache_time < 30:
return jsonify(self._scalp_summary_cache)
result = self.db.scalp_signal_summary(hours=hours) or {}
self._scalp_summary_cache = result
self._scalp_summary_cache_time = now
return jsonify(result)
```
---
### RISK [carried from 2026-05-23]: `pd.concat + iloc[-500:]` double-alloc GC pressure in bar handlers
**File:** `bot.py:2918`, `bot.py:2939`, `bot.py:3068`
**Evidence (unchanged):**
```python
ss.bars[1] = pd.concat([ss.bars[1], new_row_1m]).iloc[-500:] # 2918
ss.bars[tf] = pd.concat([ss.bars[tf], new_row]).iloc[-500:] # 2939, 3068
```
Each bar event allocates a new DataFrame (concat) then immediately discards a
slice (iloc). At 8 symbols × 5 TFs × ~12 events/min: ~480 alloc+GC cycles/min.
Minor at current scale; long-standing carry. Still unfixed.
---
## OK (checked, working or recently fixed)
**Fixes from 2026-05-23 confirmed in HEAD (0f470d7):**
- **`_tv_atr_obv` bar-count cache [RISK 2026-05-23]:** `ss._tv_atr_obv_cache = (n, atr, slope)` at `bot.py:3716–3730`. Recomputes only when `len(ss.bars[5])` increments. ✓
- **OBV trail ratchet Redis persist [RISK 2026-05-23]:** `setex(f"obv_trail:{trade_id}", 604800, ...)` at `bot.py:3788`. Ratcheted `_obv_peak`/`_obv_stop` survive restart. ✓
- **`_lazy_trend()` cache fix [RISK 2026-05-23]:** `pc.fetch_bars_cached(symbol, tf, dur)` at `bot.py:9216`. No longer bypasses the 15s `_bar_cache`. ✓
- **`api_trading_stocks` N+1 [RISK 2026-05-23]:** `get_stock_strategies("day_15m")` + `get_catalysts_for_symbols()` batch calls at `bot.py:15017–15020`. Loop now uses dict lookups; per-request DB cost is flat at 2 queries regardless of watchlist size. ✓
- **`api_trade_sim` O(1000) scan [RISK 2026-05-23]:** `get_trim_children(trade_id)` at `bot.py:13894` uses indexed `LIKE` prefix. ✓
**Working correctly (verified this audit):**
- **`REVERSE_TIME_DECAY` sizing math** (`bot.py:5748–5757`): linear ramp from `MORNING_SIZE_SCALE` at `_open_et = 600` (10:00 ET) to 1.0 at `REVERSE_DECAY_FULL_ET = 780` (13:00 ET). `_frac` correctly clamped [0, 1]. Off-hours and last-hour caps handled separately by `_late_session_scale`. ✓
- **Hourly P&L timezone** (`bot.py:13088–13097`): `SET timezone = 'America/Los_Angeles'` on all DB connections (database.py:37,49). psycopg2 returns PT-aware datetimes; `str(dt)[11:13]` extracts PT hour, consistent with the team's operational timezone. ✓
- **`compute_performance` max drawdown** (`database.py:1561–1565`): running equity + peak tracking; initialises peak at 0 (correct — drawdown from flat capital baseline). ✓
- **`_perf_cache` 30-second TTL** (`bot.py:13062–13063`): cache-hit path returns `jsonify(_perf_cache)` without DB queries. ✓
- **`_scalp_live_price` stale guard** (`bot.py:16064`): `if now_ms - int(ts) > 10000: return None` — correctly rejects tape older than 10s. ✓
- **`scalp_signal_summary` net60_bps formula** (`database.py:368`): `avg(ret_60s * 10000 - spread_bps)` correctly subtracts one full spread as round-trip cost proxy. SQL `avg()` handles NULL returns. ✓
- **`_scalp_signal_log_loop` pending list growth**: bounded by 60s per-symbol cooldown (`SCALP_SIGNAL_LOG_COOLDOWN_SEC`). At 8 symbols × 1 event/60s, accumulates at most ~3,840 events over an 8h trading day — ~700 KB in-memory, negligible. ✓
- **`api_nav` 5-second cache** (`bot.py:11269–11270`): confirmed. ✓
- **`_status_precompute_loop` 5-second background precompute**: all `/api/status` requests return cached `_status_cache`. ✓