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-06 — 0P0 0P1 3R
AI verdict
employee
high
· confidence: high
· by internal-exempt
“Sydnee Agent (AI): Sydnee nightly — performance audit 2026-06-06 — 0P0 0P1 3R”
Reasoning: @sydnee.ai is a protected domain — hard exemption
Sydnee nightly — performance audit — 2026-06-06
P0 findings: 0 P1 findings: 0 Risks: 3
- Area: Performance (Saturday theme)
- Branch: `dev` (371b98c)
- Files scanned: `bot.py` (18 489 lines), `core/database.py`, `pages.py`,
`docs/strategy_decisions.md`, prior audit chain (2026-05-30, 2026-05-23)
- Bugs found (P0 / P1): 0 / 0
- Risks noted: 3 (1 new, 1 extended carry from 2026-05-30, 1 long carry from 2026-05-23)
---
Full report (dev branch): https://github.com/kanex1/sydnee.signals/blob/dev/docs/audit_2026-06-06_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-06 — PERFORMANCE
## Summary
- Area: Performance (Saturday theme)
- Branch: `dev` (371b98c)
- Files scanned: `bot.py` (18 489 lines), `core/database.py`, `pages.py`,
`docs/strategy_decisions.md`, prior audit chain (2026-05-30, 2026-05-23)
- Bugs found (P0 / P1): 0 / 0
- Risks noted: 3 (1 new, 1 extended carry from 2026-05-30, 1 long carry from 2026-05-23)
---
## Findings
### RISK (new): `_scalp_signal_log_loop` — duplicate `hgetall` per symbol per tick after e1981c3
**File:** `bot.py:16454` (pending-event scan), `bot.py:16492` (new-event scan)
**Evidence:**
```python
# bot.py:16447-16457 — per-pending-event fetch, called once per event per tick:
for ev in pending:
...
eh = r.hgetall(f"signals.poly.live.{ev['symbol']}") # line 16454
snap = self._tape_score_sym(ev["symbol"], eh, None, now_ms)
# bot.py:16490-16495 — symbol scan, also fetches same keys:
for sym in syms:
h = r.hgetall(f"signals.poly.live.{sym}") # line 16492
res = self._tape_score_sym(sym, h, prev.get(sym), now_ms)
```
At steady state with `SCALP_SIGNAL_LOG=true` and 8 symbols × `_SCALP_HORIZONS=(30,60,120,300)`:
- Max pending depth: `floor(300s / 60s cooldown) × 8 syms = 40 events`
- Per 2-second tick: 40 hgetall calls (pending) + 8 calls (scan) = **48 total**
- Unique keys needed: **8** → 6× redundancy at max depth
The pending-event comment at line 16449 acknowledges "one redis fetch + one score" per event
but does not deduplicate across events that share the same symbol. This pattern was introduced
by the exit-research redesign in commit e1981c3 (2026-05-31), which added per-event MFE/MAE
tracking and per-horizon snap calls requiring a fresh tape snapshot each tick.
**Impact:** Low today — Redis is localhost Docker (<0.1 ms/call), so 48 calls adds ~5 ms of
latency per 2s tick (0.25% overhead). Risk materialises if Redis moves off-host or if the
symbol set expands significantly. No data-correctness concern.
**Fix:**
```python
# At the top of the while loop body, pre-cache hgetall by symbol before either loop:
_sym_hashes = {}
for _sym in sorted(set(self.symbols)):
try:
_sym_hashes[_sym] = r.hgetall(f"signals.poly.live.{_sym}")
except Exception:
_sym_hashes[_sym] = None
# Replace bot.py:16454 in the pending loop:
eh = _sym_hashes.get(ev["symbol"])
# Replace bot.py:16492 in the new-event loop:
h = _sym_hashes.get(sym)
```
Collapses 48 calls to exactly 8, regardless of pending depth.
---
### RISK (extended carry from 2026-05-30): `api_scalp_signal_summary` + `api_scalp_signal_horizons` — no response cache; unbounded `count(*)` in summary
**File:** `bot.py:14466-14477` (summary, no cache), `bot.py:14479-14496` (horizons, no cache);
`core/database.py:393-430` (summary queries), `core/database.py:432-465` (horizons queries);
index: `database.py:331` (`idx_scalp_log_ts ON scalp_signal_log (ts)`)
**Evidence:**
```python
# bot.py:14467 — summary: no cache guard, 3 raw queries per call:
def api_scalp_signal_summary():
...
return jsonify(self.db.scalp_signal_summary(hours=hours) or {})
# bot.py:14479 — horizons (new since 2026-05-31): no cache guard, 4 raw queries per call:
def api_scalp_signal_horizons():
...
return jsonify(self.db.scalp_horizons_summary(hours=hours, min_score=min_score) or {})
```
```python
# database.py:426 — unbounded count(*) in scalp_signal_summary:
cur.execute("SELECT count(*)::int AS total FROM scalp_signal_log")
# No WHERE clause → full sequential scan, grows O(N) with table lifetime.
# database.py:444 — scalp_horizons_summary WHERE has ts + score + IS NOT NULL:
WHERE ts >= now() - make_interval(hours => %s)
AND score >= %s
AND ret_{hsec}s IS NOT NULL
# idx_scalp_log_ts covers ts filter; score + IS NOT NULL require heap-scan.
```
A single page load of the scalp research page fires **both** endpoints: 3 + 4 = 7 GROUP BY
queries, plus one unbounded sequential scan. None are cached. With `SCALP_SIGNAL_LOG=true`
accumulating data at ~120 events/hour (8 syms × 1/60s × 3600), after 2 weeks the table holds
~40 000 rows. The `count(*)` will read all 40 000 rows every summary call regardless of the
`?hours=` window.
Neither endpoint is currently auto-polled by the dashboard (no reference in `pages.py`), so
impact is limited to manual research page loads today.
**Fix:**
```python
# bot.py — add 30-second response cache mirroring _perf_cache pattern (bot.py:13062-13063):
_scalp_summary_cache: dict | None = None
_scalp_summary_cache_time: float = 0
_scalp_horizons_cache: dict | None = None
_scalp_horizons_cache_time: float = 0
# Inside 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, self._scalp_summary_cache_time = result, now
return jsonify(result)
# Inside api_scalp_signal_horizons() — same pattern with _scalp_horizons_cache.
```
```sql
-- database.py — replace unbounded count(*) with time-windowed count:
cur.execute(
"SELECT count(*)::int AS total FROM scalp_signal_log "
"WHERE ts >= now() - make_interval(hours => %s)", (hours,))
-- Uses idx_scalp_log_ts; stays O(window size), not O(table lifetime).
```
---
### RISK (carry from 2026-05-23): `pd.concat + iloc[-500:]` double-alloc GC pressure in bar handlers
**File:** `bot.py:2942`, `bot.py:2963`, `bot.py:3092`
**Evidence (unchanged from prior audits):**
```python
ss.bars[1] = pd.concat([ss.bars[1], new_row_1m]).iloc[-500:] # bot.py:2942
ss.bars[tf] = pd.concat([ss.bars[tf], new_row]).iloc[-500:] # bot.py:2963, 3092
```
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. Unchanged since filing.
Low severity at current scale; no failure mode.
---
## OK (checked, working or recently fixed)
**`_scalp_signal_log_loop` False-sentinel P1 (from 2026-05-30) → RESOLVED:**
Commit e1981c3 redesigned the horizon-snapshot loop to use `_snapped_{hsec}` flags
(bot.py:16469, 16479). Flag is set unconditionally for any elapsed horizon (inside `for hsec
in horizons` loop, outside the `if snap is not None:` block) — stale-tape events are
correctly finalised without retry. The double-write / wrong-horizon bug is closed. ✓
**`api_nav` 5s response cache:** confirmed at `bot.py:12717-12718`. `_nav_cache` + `_nav_cache_time`
guard short-circuits the two uncached DB queries when interval < 5s. ✓
**`_perf_cache` 30s TTL:** confirmed at `bot.py:13062-13063`. All `/api/performance` calls
within the same 30s window return cached payload. ✓
**Tape Scanner poll slowed 2.5s → 5s:** commit 5fde507 reduced `tape_scanner_poll` interval
from 2.5s to 5s, halving the `/api/tape-scanner` call rate and its per-call scoring overhead
(8 sym × `_tape_score_sym`). ✓
**TV-BXT scale-in redesign (3b0d6ac) — no new perf regressions:**
`_tv_scale_step` calls `self.open_trades()` (in-memory list filter, bot.py:1199-1201) twice
per slot-2..10 evaluation (lines 4273, 4287). With n<<10 open positions at any time, this
is O(n) over a negligible list. The `_regime_redis.get(f"tv_bxt_signal_ts:{sym}")` at
bot.py:4206 is a single lightweight GET per call. No new hot-path regression. ✓
**`_scalp_signal_log_loop` pending list size bound:** at 8 symbols, 60s cooldown, 300s max
horizon, max pending depth = 8 × floor(300/60) = 40 events. In-memory footprint ~7 KB
(40 events × ~180 bytes each). Negligible. ✓