Sydnee Inc Legal
Aug 15 7:55 PM
TEST — Veer 304E, how the Izeal reply will look
⚠ PHISHING: domain impersonation: display name contains 'sydnee' but sender is email.sydneeinc.com
Sydnee Inc Legal
Aug 15 7:46 PM
Veer Towers 304E - furnished 1BR, corporate housing
⚠ PHISHING: domain impersonation: display name contains 'sydnee' but sender is email.sydneeinc.com
Kelvin Yan
Aug 15 7:34 PM
Veer 304E — three drafts for review before sending
⚠ PHISHING: employee impersonation: display name matches 'kelvin yan' but sender is email.sydneeinc.com
Bank of America
Aug 15 5:44 PM
Your statement is available
Bank of America: Your statement is available
Bank of America
Aug 15 5:43 PM
Your statement is available
Bank of America: Your statement is available
Sydnee Agent (AI)
Aug 15 5:39 PM
[Calibration Daily] 2026-08-16
Sydnee Agent (AI): [Calibration Daily] 2026-08-16
Sydnee Inc Legal
Aug 15 5:34 PM
Access test 1 of 3 - link
⚠ PHISHING: domain impersonation: display name contains 'sydnee' but sender is email.sydneeinc.com
Sydnee Inc Legal
Aug 15 5:33 PM
Access test 3 of 3 - verified
⚠ PHISHING: domain impersonation: display name contains 'sydnee' but sender is email.sydneeinc.com
Sydnee Inc Legal
Aug 15 5:09 PM
Access test 3 of 3 - verified
⚠ PHISHING: domain impersonation: display name contains 'sydnee' but sender is email.sydneeinc.com
Sydnee Inc Legal
Aug 15 5:09 PM
Access test 1 of 3 - link
⚠ PHISHING: domain impersonation: display name contains 'sydnee' but sender is email.sydneeinc.com
Sydnee Inc Legal
Aug 15 4:48 PM
Access test 1 of 3 - link (opens straight away, no code)
⚠ PHISHING: domain impersonation: display name contains 'sydnee' but sender is email.sydneeinc.com
Microsoft Outlook
Aug 15 4:47 PM
Undeliverable: FW: Dr Cat's Video Insights on $NOW and $TEAM-Video 2 of 12 (August 16, 2026)
Microsoft Outlook: Undeliverable: FW: Dr Cat's Video Insights on $NOW and $TEAM
Microsoft Outlook
Aug 15 4:46 PM
Undeliverable: FW: Dr Cat's Video Insights on $ABCL-Video 3 of 12 (August 16, 2026)
Microsoft Outlook: Undeliverable: FW: Dr Cat's Video Insights on $ABCL-Video 3
Sydnee Inc Legal
Aug 15 4:26 PM
Veer 304E - all three access levels
⚠ PHISHING: domain impersonation: display name contains 'sydnee' but sender is email.sydneeinc.com
Sydnee Inc Legal
Aug 15 4:16 PM
Veer 304E - replacement links
⚠ PHISHING: domain impersonation: display name contains 'sydnee' but sender is email.sydneeinc.com
Sydnee Inc Legal
Aug 15 4:10 PM
Veer 304E - short links, one with a code
⚠ PHISHING: domain impersonation: display name contains 'sydnee' but sender is email.sydneeinc.com
Sydnee Inc Legal
Aug 15 4:04 PM
Your access code
⚠ PHISHING: domain impersonation: display name contains 'sydnee' but sender is email.sydneeinc.com
Sydnee Inc Legal
Aug 15 4:04 PM
Your access code
⚠ PHISHING: domain impersonation: display name contains 'sydnee' but sender is email.sydneeinc.com
Sydnee Inc Legal
Aug 15 4:00 PM
Veer 304E - test of the secure file links
⚠ PHISHING: domain impersonation: display name contains 'sydnee' but sender is email.sydneeinc.com
Sydnee Inc Legal
Aug 15 4:00 PM
Your access code
⚠ PHISHING: domain impersonation: display name contains 'sydnee' but sender is email.sydneeinc.com
Amazon Payments
Aug 15 12:52 PM
Action requise sur le compte Amazon Payments
Fake Amazon Payments suspension threat; credential harvesting attempt.
Guest Relations at The Ritz-Carlton, Laguna Niguel
Aug 15 10:49 AM
Kelvin, please complete the travel request form to customize your stay at The Ritz-Carlton, Laguna Niguel
Suspicious Ritz-Carlton email with obfuscation; potential credential theft attempt.
Manus Team
Aug 15 7:33 AM
ACTION REQUIRED: 7 days left to back up Kelvin Yan for future restoration
⚠ PHISHING: phishing subject pattern: 'ACTION REQUIRED' from external sender privaterelay.appleid.com
Benjamin & Williams
Aug 15 5:02 AM
Commercial Claim Discovery Documents Our file:D-8222 Debtor: VICTORIA ROPA ELEGANTE
Fake debt collection demand with 24h payment pressure; spoofed domain.
Sydnee Agent (AI)
Aug 15 4:15 AM
Sydnee nightly — PERFORMANCE audit 2026-08-15 — 0P0 2P1 13R
Sydnee Agent (AI): Sydnee nightly — PERFORMANCE audit 2026-08-15 — 0P0 2P1 13R
The Ritz-Carlton Reservations
Aug 15 4:12 AM
Plan for your upcoming stay at The Ritz-Carlton, Laguna Niguel on Monday, August 17, 2026
Ritz-Carlton reservation confirmation for August 17 stay at Laguna Niguel.
Tesla
Aug 15 12:55 AM
Full Self-Driving (Supervised) Subscription Renewed
Tesla FSD subscription auto-renewed for Model Y, $107.29/month.
Sydnee.ai Legal
Aug 14 9:22 PM
Jiao 移民案件最新进展说明(好消息,请放心)
⚠ PHISHING: domain impersonation: display name contains 'sydnee' but sender is email.sydnee.ai
KuCoin
Aug 14 6:38 PM
Dormancy Fee Deduction Notice
KuCoin dormancy fee deducted from account this month.
Tommy Wang (Wang IP Law)
Aug 14 6:30 PM
Re: I-485 Application (IOE0934359789 and IOE0934359788)
Tommy Wang (Wang IP Law): Re: I-485 Application (IOE0934359789 and IOE0934359788)
Bank of America
Aug 14 6:16 PM
We've sent your payment to SOUTHERN CALIFORNIA EDISON SCE as requested
Bank of America: We've sent your payment to SOUTHERN CALIFORNIA EDISON SCE as
Sydnee Agent (AI)
Aug 14 5:42 PM
[Calibration Daily] 2026-08-15
Sydnee Agent (AI): [Calibration Daily] 2026-08-15
Sydnee Agent (AI)
Aug 14 5:30 PM
Sydnee algo daily — dev $-2,239 · prod $+0 · 6d window
Sydnee Agent (AI): Sydnee algo daily — dev $-2,239 · prod $+0 · 6d window
Laguna Road Area Community Message
Aug 14 2:39 PM
1 New School Flyer for Your Child
School flyer: Congressional App Challenge signup opportunity.
Anthony Patino in Teams
Aug 14 2:34 PM
Anthony Patino sent a message
⚠ PHISHING: employee impersonation: display name matches 'anthony' but sender is teams.mail.microsoft
TAnthony Patino
Aug 14 1:34 PM
[Teams oneOnOne] (Teams DM)
Anthony Patino flagging ~$20k air shipment payment for approval.
Amy Burghardt
Aug 14 1:19 PM
RE: Meeting
Amy Burghardt: RE: Meeting
Mary Chmelka
Aug 14 1:07 PM
Survey invite to Ameritas California Language Assistance Program Survey
Ameritas requesting language preference survey for insurance benefits.
TAnthony Patino
Aug 14 12:47 PM
[Teams oneOnOne] (Teams DM)
Anthony Patino requesting updated HDCVT statement.
TAnthony Patino
Aug 14 12:45 PM
[Teams oneOnOne] (Teams DM)
Teams DM acknowledgment from Anthony Patino.
TAnthony Patino
Aug 14 12:45 PM
[Teams oneOnOne] (Teams DM)
Anthony Patino confirms E-like assessment via Teams DM.
TAnthony Patino
Aug 14 12:08 PM
[Teams oneOnOne] (Teams DM)
Anthony found something; not due for ~30 days.
TAnthony Patino
Aug 14 12:05 PM
[Teams oneOnOne] (Teams DM)
SAVLink payment $15,915 awaiting approval
TAnthony Patino
Aug 14 11:59 AM
[Teams oneOnOne] (Teams DM)
Anthony Patino internal Teams message about communications or notes.
TAnthony Patino
Aug 14 11:56 AM
[Teams oneOnOne] (Teams DM)
Anthony Patino confirming he will set something up now.
TAnthony Patino
Aug 14 11:56 AM
[Teams oneOnOne] (Teams DM)
Anthony Patino Teams DM about something that just came due recently.
TAnthony Patino
Aug 14 11:55 AM
[Teams oneOnOne] (Teams DM)
Anthony Patino confirms document dated 6/04 with net60 terms.
TAnthony Patino
Aug 14 11:54 AM
[Teams oneOnOne] (Teams DM)
SmartAV Link requesting payment of $15,915.
TAnthony Patino
Aug 14 11:47 AM
[Teams oneOnOne] (Teams DM)
Anthony reports received Iolo Capital invoice, needs approval to add to CC.
TAnthony Patino
Aug 14 11:25 AM
[Teams oneOnOne] (Teams DM)
Anthony Patino initiating a Teams call.
Sydnee nightly — PERFORMANCE audit 2026-08-09 — 0P0 2P1 12R
AI verdict
employee
high
· confidence: high
· by internal-exempt
“Sydnee Agent (AI): Sydnee nightly — PERFORMANCE audit 2026-08-09 — 0P0 2P1 12R”
Reasoning: @sydnee.ai is a protected domain — hard exemption
Sydnee nightly — PERFORMANCE audit — 2026-08-09
P0 findings: 0 P1 findings: 2 Risks: 12
- Area: Performance (Saturday theme)
- Branch: `dev` (8e4cfac — docs(audit): weekly 2026-08-09)
- Files scanned: `bot.py` (24,173 lines), `core/database.py`, `futures_client.py`,
`pages.py`, `docs/strategy_decisions.md`, `git log --oneline -30`,
prior performance audits 2026-08-08, 2026-08-02
- **Bugs found (P0 / P1): 0 / 2 (both carried; no new P0 or P1 bugs)**
- **Risks noted: 12 (1 new + 11 carried)**
**Cross-check:** `git log --oneline -30` shows zero commits to `bot.py`, `core/`,
or any strategy/config file since 2026-07-17. All subsequent commits are docs-only
(7 daily audit files + 41 peak-monitor hourly logs). Both P1s and 11 of 12 risks
confirmed unchanged at identical line numbers. One new risk identified: the same
permanently-False bytes-key check previously noted only in `_ws_live_overlay` also
exists in `_tape_score_sym` (line 18417), where it fires 19× per invocation across
7 call sites — the larger contributor to redundant iterator overhead.
---
Full report (dev branch): https://github.com/kanex1/sydnee.signals/blob/dev/docs/audit_2026-08-09_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-08-09 — PERFORMANCE
## Summary
- Area: Performance (Saturday theme)
- Branch: `dev` (8e4cfac — docs(audit): weekly 2026-08-09)
- Files scanned: `bot.py` (24,173 lines), `core/database.py`, `futures_client.py`,
`pages.py`, `docs/strategy_decisions.md`, `git log --oneline -30`,
prior performance audits 2026-08-08, 2026-08-02
- **Bugs found (P0 / P1): 0 / 2 (both carried; no new P0 or P1 bugs)**
- **Risks noted: 12 (1 new + 11 carried)**
**Cross-check:** `git log --oneline -30` shows zero commits to `bot.py`, `core/`,
or any strategy/config file since 2026-07-17. All subsequent commits are docs-only
(7 daily audit files + 41 peak-monitor hourly logs). Both P1s and 11 of 12 risks
confirmed unchanged at identical line numbers. One new risk identified: the same
permanently-False bytes-key check previously noted only in `_ws_live_overlay` also
exists in `_tape_score_sym` (line 18417), where it fires 19× per invocation across
7 call sites — the larger contributor to redundant iterator overhead.
---
## Findings
### BUG [P1] (carried × 6 performance audits, unfixed since 2026-07-11): `_generate_daily_summary()` uses in-memory `_build_performance()` — reports $0 P&L after any bot restart
**File:** `bot.py:11681` (`perf = self._build_performance()`),
`bot.py:11731` (`self.db.upsert_daily_summary(...)`),
`bot.py:1156` (`def _load_trades_from_db`)
**Evidence:**
```python
# bot.py:1156 — startup loads only OPEN trades
def _load_trades_from_db(self) -> None:
db_trades = self.db.get_open_trades() # closed trades never loaded
# bot.py:11681 — daily summary uses in-memory stats built from empty closed-trades cache
perf = self._build_performance()
today = perf["today"] # {pnl: 0, trades: 0, win_rate: 0} after restart
# bot.py:11731-11737 — permanently writes wrong daily record to DB
self.db.upsert_daily_summary(
d=date.fromisoformat(today_str), pnl=today["pnl"], # ← $0
trade_count=today["trades"], # ← 0
...
)
```
Also affected: `_agent_ledger()` (bot.py:9156) writes Redis `signals.ledger.state`
with $0/0-trade values after every restart; `_ledger_eod_report()` (bot.py:9184)
produces a $0 EOD summary; `_audit_scan()` win-rate regression detector
(bot.py:2817-2828) silently disables post-restart because `len(closed) >= 30`
is never satisfied until trades accumulate in-memory.
**Impact:** Daily AI review at 4:15 PM ET receives "P&L: $0, Trades: 0, Win rate: 0%"
context on any day with a bot restart. The `daily_summaries` row is permanently
written with incorrect values. `signals.ledger` Redis state reflects $0 for up to
6 minutes (360s TTL) after each restart. Win-rate regression alert is offline
for the remainder of any session after a restart until 30 trades accumulate.
**Fix:** Replace `_build_performance()` with the DB-backed path in
`_generate_daily_summary()` — same pattern already used by `api_performance`
(bot.py:14428):
```python
today_str = datetime.now(ET).strftime("%Y-%m-%d")
today = self.db.compute_performance(date_from=today_str)
```
---
### BUG [P1] (carried × 6 performance audits, unfixed since 2026-07-11): FLAT_EXIT parent `pnl=0` counted as loss in `_compute_period_stats()` — win rate and total P&L understated
**File:** `bot.py:8943–8975` (`_compute_period_stats`), `bot.py:5718–5758`
(FLAT_EXIT parent close), `bot.py:1374` (`_close_trade_in_store` pnl calc)
**Evidence:**
```python
# bot.py:5743-5744: shares decremented BEFORE close-in-store
remaining = t.shares - trim_shares # = 0 on full close
self._update_trade_field(t.trade_id, shares=remaining) # t.shares → 0
if remaining == 0 and _flat_full_close:
self._close_trade_in_store(t.trade_id, live_price)
# bot.py:1374: pnl computed against already-decremented shares
t.pnl = round((exit_price - t.entry_price) * t.direction * t.shares, 2)
# t.shares=0 → pnl=0.0 even on a profitable trade
# bot.py:8950-8951: losses includes pnl=0 parents
wins = [p for p in pnls if p > 0]
losses = [p for p in pnls if p <= 0] # ← pnl=0 lands here
```
**Impact:** With `FLAT_EXIT=true` (active on dev), every profitable mean-revert /
extension-fade close appears as a $0 "loss" in in-session win-rate stats.
`_generate_daily_summary()` and `daily_summaries` rows understate win_rate.
`_audit_scan` win-rate regression (bot.py:2823-2828) may fire false alerts as
$0 parents dilute the last-20 window's WR computation.
**Fix:** Filter zero-pnl full-closed parents in `_compute_period_stats()`:
```python
pnls = [t.pnl for t in trades
if t.pnl is not None
and not (t.pnl == 0.0 and t.exit_price is not None and t.shares == 0)]
```
Long-term: move all performance callers to the DB path (same root fix as P1 above).
---
## Risks
### RISK (NEW — first detected 2026-08-09): `_tape_score_sym` inner `_g()` helper at line 18417 has the same permanently-False bytes-key check as `_ws_live_overlay` — 19 redundant `next(iter(h))` calls per invocation, 7 call sites
**File:** `bot.py:18417–18424` (inner `_g()` helper), call sites at
`bot.py:4228, 15537, 16310, 16442, 21179, 22073, 22120`
**Evidence:**
```python
# bot.py:18417-18424 — identical to _ws_live_overlay at bot.py:1487-1494
def _tape_score_sym(self, sym, h, prev, now_ms):
def _g(k, cast=float, default=0.0):
v = h.get(k.encode()) if isinstance(next(iter(h)), bytes) else h.get(k)
...
ts_ms = _g("ts_ms", int, 0) # call 1
price = _g("last_price") # call 2
bid_sz = _g("bid_size", int, 0) # call 3
ask_sz = _g("ask_size", int, 0) # call 4
signed60 = _g("signed_volume_60s", ...) # call 5
# ... 14 more _g() calls in this function (19 total confirmed by grep)
```
All Redis clients in bot.py use `decode_responses=True` (bot.py:803, 14603, 14631,
14815, 23367, 23406, 23581). The `h` dict passed to `_tape_score_sym` always comes
from one of these clients (`hgetall` at `bot.py:21174`, `15535`, `16308`, `16440`,
`22120`). `isinstance(next(iter(h)), bytes)` is permanently `False` on all paths;
`h.get(k.encode())` is dead code.
With tape loop running at 1Hz × ~49 symbols:
- `_tape_score_sym` path: 19 `_g()` calls × 49 symbols × 1Hz = **931 redundant
`next(iter(h))` calls/second**
- Prior audit's `_ws_live_overlay` path: 9 × 49 × 1Hz = 441/second
`_tape_score_sym` is the **dominant contributor** (~2.1× `_ws_live_overlay`);
the total is ~1,372 redundant iterator-creation calls/second during active tape
sessions. The prior audit's estimate of 441/second was therefore less than a
third of the actual overhead.
**Fix:** In `_tape_score_sym`, hoist the bytes check outside `_g()` (always False,
so simplify to direct key access) or remove the bytes branch entirely — same fix
as `_ws_live_overlay`:
```python
def _g(k, cast=float, default=0.0):
v = h.get(k) # decode_responses=True; bytes path is dead code
if v is None:
return default
try:
return cast(v)
except (TypeError, ValueError):
return default
```
---
### RISK (carried × 3 from 2026-08-02): `_build_positions_with_status` fires redundant `db.get_open_trades()` on every 3-second `/api/positions` poll
**File:** `bot.py:18039`; `core/database.py:195–196`; `pages.py:7669`
(`setInterval(upd,3000)`)
20 DB queries/minute during RTH; `entry_reason` (line 18048) is already available
as `t.strategy_reason` in-memory. **Fix:** Read `entry_reason` from the in-memory
`Trade` object; keep the DB call only for `trigger_type` which isn't on the
dataclass. Add partial index: `CREATE INDEX idx_trades_open ON trades(entry_time)
WHERE exit_price IS NULL`. Unchanged.
---
### RISK (carried × 3 from 2026-08-02): `_build_positions_with_status` computes fresh RSI(9) series per open position on every 3-second poll — redundant with `ss.last_rsi`
**File:** `bot.py:18065–18075`
`_rsi()` (bot.py:255) is an O(n) ewm pass over up to 500 rows; 5 positions × 20
calls/min = 100 redundant Series allocations/minute from the API path. `ss.last_rsi`
is already maintained by `_evaluate_symbol()`. Comment at 18059 acknowledges the
issue ("ss.last_rsi can be stale if _evaluate_symbol hasn't run since restart") but
proposes a trade-off fix rather than eliminating the recompute. **Fix:** Gate the
recompute on bar-staleness via a cached `ss._last_rsi_api_ts`; use `ss.last_rsi`
otherwise. Unchanged.
---
### RISK (carried × 3 from 2026-07-25): `futures_client.py` — new `ThreadPoolExecutor` per call, no module-level cache
**File:** `futures_client.py:57–75`
```python
with ThreadPoolExecutor(max_workers=len(symbols)) as ex: # created + torn down each call
```
1 call/min on `/` × 5 Yahoo fetches = 5/min pool create+destroy cycles.
**Fix:** Module-level `ThreadPoolExecutor` with 15s TTL result cache. Unchanged.
---
### RISK (carried × 3 from 2026-07-25): `tickPrices()` full `innerHTML` DOM rebuild at 1s polling — 60 full rebuilds/min when SSE is unhealthy
**File:** `pages.py:4811` (`el("symbols").innerHTML=sh`); `pages.py:6201–6207`
(`setInterval(fn, 1000)`)
Full positions grid (all open-trade cards with regime/sentiment/trim/OBV panels)
destroyed and recreated every second when SSE is unhealthy. Button handlers
rebound after every write. **Fix:** Shallow equality guard before innerHTML write,
or targeted DOM updates for changed fields only. Unchanged.
---
### RISK (carried × 6 from 2026-07-11): `_bxt_regime()` caches `"unknown"` for the full trading day on Polygon failure — all BXt SHORTs silently blocked
**File:** `bot.py:913–933`
```python
except Exception:
reg = "unknown"
self._regime_cache[symbol] = (today_pt, reg) # cached all day; no retry TTL
```
A transient Polygon timeout at open caches `SPY → (today, "unknown")`; gate at
bot.py:6326 blocks all BXt SHORTs for the rest of the day, forfeiting the
+$13K/60d SHORT edge validated in `2227b52`. **Fix:** Cache "unknown" with a 5-min
TTL and re-query. Unchanged.
---
### RISK (carried × 6 from 2026-07-11): `_tape_l2_sums_history` list rebuilt O(n) per symbol per tick
**File:** `bot.py:18618`
```python
_sh = [(t, b, a) for (t, b, a) in _sh if _now_ts - t <= 60] # new list every tick
```
Dormant when `TAPE_SIG3_L2_SWEEP=false` (default). Active on dev at ~1Hz × 20
symbols = 20 list comprehensions/second. **Fix:** Convert to `deque` with
`popleft()` expiry. Unchanged.
---
### RISK (carried × 6 from 2026-07-11): 13+ `os.environ.get()` calls per `_tape_score_sym()` tick — 637+ env-reads/second
**File:** `bot.py:18406–18700` (`_tape_score_sym` hotpath); also
`bot.py:5057–5082` (OBV-BE inner block re-reads env per bar)
13 `os.environ.get`/`os.getenv` calls confirmed in `_tape_score_sym` lines 18406–18700.
20 syms × 1Hz = 637+ env-reads/second in the tape path during active sessions.
(Prior count of "260+" was for `_ws_live_overlay` path; `_tape_score_sym` is the
larger source at 13 env-reads × 49 symbols × 1Hz = 637/second.)
**Fix:** Cache flag-like env vars at startup or as class attributes. Unchanged.
---
### RISK (carried × 7 from 2026-06-25): `scalp_signal_summary` full-table `COUNT(*)` with no `WHERE` clause
**File:** `core/database.py:506`
```python
cur.execute("SELECT count(*)::int AS total FROM scalp_signal_log") # full scan
```
~6M rows/month at 2Hz insert rate when `SCALP_SIGNAL_LOG=true`. Grows unbounded.
**Fix:** Add `WHERE ts >= now() - make_interval(hours => 720)` to bound the scan.
Unchanged.
---
### RISK (carried × 6 from 2026-07-11): `pd.concat + iloc[-500:]` GC pressure in 1Hz bar aggregation loop
**File:** `bot.py:3069` (1m Polygon), `bot.py:3090` (TF IBKR tick),
`bot.py:3219` (TF Polygon bar)
```python
ss.bars[tf] = pd.concat([ss.bars[tf], new_row]).iloc[-500:] # two ephemeral DataFrames
```
~49 symbols × 3+ TFs = 147+ ephemeral DataFrame pairs pushed to GC per bar-close
event (once per minute per TF). **Fix:** In-place `loc` append or pre-allocated
rolling buffer. Unchanged.
---
### RISK (carried × 3 from 2026-07-25): `_ws_live_overlay()` bytes-