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 — EXECUTION_QUALITY audit 2026-08-14 — 0P0 10P1 2R
AI verdict
employee
high
· confidence: high
· by internal-exempt
“Sydnee Agent (AI): Sydnee nightly — EXECUTION_QUALITY audit 2026-08-14 — 0P0 10”
Reasoning: @sydnee.ai is a protected domain — hard exemption
Sydnee nightly — EXECUTION_QUALITY audit — 2026-08-14
P0 findings: 0 P1 findings: 10 Risks: 2
- Area: Execution Quality (Friday theme)
- Branch: `dev` (3c9ec34 — docs(peak-monitor): hourly log 2026-08-13 13:15 PT)
- Files scanned: `bot.py` (24,173 lines), `core/risk.py` (150 lines),
`docs/audit_2026-08-07_EXECUTION_QUALITY.md`, `git log --oneline -30`
- **Bugs found (P0 / P1): 0 / 10 (all carried from 2026-08-07 — 0 new)**
- **Risks noted: 2 (both carried from 2026-08-07)**
**Cross-check:** `git log --oneline -30` shows zero commits to `bot.py`, `core/`,
or any strategy/core file since 2026-07-17. All 10 P1 bugs and 2 risks from the
2026-08-07 EXECUTION QUALITY audit re-verified at current line numbers — all present
and unchanged. `_kcr_entry_ms` P1 (filed 2026-06-26) confirmed RESOLVED via the
`datetime.fromisoformat` fallback at `bot.py:20742–20752` (comment references "Audit
2026-06-30 P1") — not carried, added to OK.
---
Full report (dev branch): https://github.com/kanex1/sydnee.signals/blob/dev/docs/audit_2026-08-14_EXECUTION_QUALITY.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-14 — EXECUTION QUALITY
## Summary
- Area: Execution Quality (Friday theme)
- Branch: `dev` (3c9ec34 — docs(peak-monitor): hourly log 2026-08-13 13:15 PT)
- Files scanned: `bot.py` (24,173 lines), `core/risk.py` (150 lines),
`docs/audit_2026-08-07_EXECUTION_QUALITY.md`, `git log --oneline -30`
- **Bugs found (P0 / P1): 0 / 10 (all carried from 2026-08-07 — 0 new)**
- **Risks noted: 2 (both carried from 2026-08-07)**
**Cross-check:** `git log --oneline -30` shows zero commits to `bot.py`, `core/`,
or any strategy/core file since 2026-07-17. All 10 P1 bugs and 2 risks from the
2026-08-07 EXECUTION QUALITY audit re-verified at current line numbers — all present
and unchanged. `_kcr_entry_ms` P1 (filed 2026-06-26) confirmed RESOLVED via the
`datetime.fromisoformat` fallback at `bot.py:20742–20752` (comment references "Audit
2026-06-30 P1") — not carried, added to OK.
---
## Findings
### BUG [P1] (carried from 2026-08-07): `Cancelled/Inactive` retry in `_execution_qa` missing `start_time` reset — retry order killed after ≤6 seconds
**File:** `bot.py:7984`
**Evidence:**
```python
# bot.py:7975-7985 — Cancelled/Inactive retry path
if not retried:
retried = True
...
exec_trade = self._place_order_with_overnight_fallback(_ct2, order2, ss.contract)
oid = exec_trade.order.orderId
self._active_order_ids.add(oid)
continue # ← no start_time = time.time() before this
# 30s fallback (bot.py:8037-8050) and PreSubmitted block (bot.py:8030-8034)
# both correctly reset start_time with identical comments.
```
`_place_order_with_overnight_fallback` can consume 2–3s. Without `start_time` reset,
the retry order inherits the near-exhausted original budget. Worst case: cancel at
t=113s, new order placed at t≈116s, while-loop exits at t=119s, retry order killed
after only ~3s of fill monitoring. An IOC entry that fills during those 3s is
undetected, creating an orphaned IBKR position.
**Impact:** `Cancelled`/`Inactive` retry orders get ≤6s of fill monitoring instead
of a full 120s window. On active market hours with IOC on thin-book names, retry is
guaranteed to be killed. Entry silently dropped with a misleading "EXEC QA: TIMEOUT
120s" log that obscures the budget-exhaustion root cause.
**Fix:** Add `start_time = time.time()` at `bot.py:7985`, after
`self._active_order_ids.add(oid)` and before `continue`.
---
### BUG [P1] (carried from 2026-07-10 / 2026-08-01 / 2026-08-07): `OBV LOSS EXIT` fires on profitable trades below cushion threshold — winners force-exited at market
**File:** `bot.py:5114`
**Evidence:**
```python
# bot.py:5113-5128
_min_cushion = max(float(t.entry_price) * _cushion_pct, atr_val * 0.25)
if _profit_guard and profit_per_share < _min_cushion: # _min_cushion always > 0
...
if _loss_exit:
hit = True
reason = ... "at loss after ..." # ← misleading: could be small winner
self._log_activity(sym, "OBV LOSS EXIT: ... at loss ...", "trade")
```
`< _min_cushion` is always a positive threshold (e.g. $0.75/sh on a $100 stock with
$3 ATR). Profitable trades with small gains below the cushion satisfy the condition
and get force-exited at market with a false "at loss" log entry. The `_loss_exit`
inner guard is necessary but not sufficient — `profit_per_share < _min_cushion` is
the wrong predicate.
**Impact:** On dev (`OBV_LOSS_EXIT=true`): winners held past 5 bars with a small
favourable move are ejected before profit target. Prod safe (flag default off).
**Fix:**
```python
if _loss_exit and profit_per_share < 0:
hit = True
...
```
---
### BUG [P1] (carried from 2026-07-04 / 2026-08-07): `risk.state.trade_count` not restored from DB on restart — `max_daily_trades` global cap bypassed after every restart
**File:** `core/risk.py:118`, `bot.py:23457–23460`
**Evidence:**
```python
# core/risk.py:30-34 — DailyState always starts zeroed:
@dataclass
class DailyState:
realized_pnl: float = 0.0
trade_count: int = 0
# bot.py:23457-23460 — startup only calls set_open_positions():
open_count = len(self.open_trades())
if open_count > 0:
self.risk.set_open_positions(open_count)
# No restore of trade_count or realized_pnl
# core/risk.py:118 — cap that relies on trade_count:
if self.state.trade_count >= self.cfg.max_daily_trades:
return False, "Max daily trades reached"
```
`RiskManager` has no `restore_daily_state()` method. Every mid-session restart
resets `trade_count` to 0 and `realized_pnl` to 0.0. A bot at the max daily trade
count that restarts places new trades freely; a bot past the daily loss limit bypasses
the circuit breaker for the rest of the session.
**Impact:** Real-money risk if `max_daily_trades` or `daily_loss_limit` are actively
managing exposure. Both caps are silently nullified after any restart.
**Fix:** At startup, query `SELECT COUNT(*), SUM(pnl) FROM trades WHERE trade_date =
today AND exit_time IS NOT NULL` and restore via `self.risk.record_exit(pnl)` per
closed trade, or add `restore_daily_state(trade_count, realized_pnl)` to
`RiskManager`.
---
### BUG [P1] (carried from 2026-07-03 / 2026-08-07): `_execution_qa` `IndexError` when `"Filled"` arrives before fill detail — orphaned IBKR position
**File:** `bot.py:7951`
**Evidence:**
```python
# bot.py:7946-7951
if status == "Filled" or (exec_trade.fills and filled > 0):
fp = float(exec_trade.orderStatus.avgFillPrice or 0) or \
float(exec_trade.fills[0].execution.price)
# ^^^ IndexError if fills == [] and avgFillPrice == 0
```
When IBKR fires `"Filled"` status before `execDetails` populates the `fills` list,
`fills[0]` raises `IndexError`. No `Trade` record is created → orphaned IBKR position
untracked in DB.
**Impact:** Race is rare but reproducible on fast MKT fills in liquid markets. Results
in IBKR holding shares with no bot-side trade record; reconcile re-imports as an
untracked position, distorting risk state.
**Fix:**
```python
fp = float(exec_trade.orderStatus.avgFillPrice or 0)
if not fp:
if exec_trade.fills:
fp = float(exec_trade.fills[0].execution.price)
else:
continue # fills not yet populated — wait one more poll
```
---
### BUG [P1] (carried from 2026-07-03 / 2026-08-07): `broker_executions.timestamp_sent` always equals `timestamp_filled` — order-to-fill latency unmeasurable
**File:** `bot.py:7910`
**Evidence:**
```python
# bot.py:7899-7911
ts_filled = _dt.datetime.now(_dt.timezone.utc)
...
VALUES (%s,%s,...,%s,%s)
(... ts_filled, ts_filled)) # ← both timestamp_sent and timestamp_filled = now()
```
`_persist_broker_execution` does not accept `start_time` as a parameter. `start_time`
is available in `_execution_qa` (defined at `bot.py:7934`) but never threaded in.
`timestamp_filled − timestamp_sent` is always 0 ms for every row.
**Impact:** `broker_executions` latency column is permanently useless. Execution
degradation (slow fills during high-VIX events, thin pre-market) is invisible.
**Fix:** Add `order_start_time` param to `_persist_broker_execution`; compute
`ts_sent = datetime.fromtimestamp(order_start_time, tz=UTC)` at the top of the
function. Pass `start_time` at the call site (bot.py:7960).
---
### BUG [P1] (carried from 2026-07-03 / 2026-08-07): `signals.tempo` uses P&L/share as execution-quality proxy — actual slippage never queried
**File:** `bot.py:11147`
**Evidence:**
```python
# bot.py:11145-11148
# Per-share P&L as proxy for execution quality
per_share = t.pnl / t.shares if t.shares > 0 else 0
slippages.append(per_share) # ← variable name misleading; not slippage
hourly_slippage.setdefault(entry_hour, []).append(per_share)
```
`broker_executions.slippage` is never read by `_tempo_daily_analysis`. Hourly
breakdown reflects trade profitability, not execution degradation. Bad fills (retried
orders, aggressive-limit slippage) are invisible in the tempo output.
**Impact:** Execution quality signal is blind to the very metric it claims to track.
Slow-fill hours and venue degradation events go undetected in the tempo report.
**Fix:** In `_tempo_daily_analysis`, join `broker_executions` on
`symbol + timestamp_filled` grouped by hour; report `avg(slippage)` separately from
P&L.
---
### BUG [P1] (carried since 2026-06-12 / 2026-08-07): `config_syms` NameError in `_exec_qa_patrol` — position mismatch check silently never runs
**File:** `bot.py:8333`
**Evidence:**
```python
# bot.py:8272: watchlist_syms = set(self.symbols) ← correct variable defined here
# bot.py:8333:
if ib_qty != bot_qty and sym in config_syms: # ← NameError: config_syms undefined
```
`config_syms` is undefined in `_exec_qa_patrol` and at class scope. The surrounding
`except Exception: pass` (bot.py:8336) swallows the `NameError` on every patrol
call. IBKR/bot position discrepancies are never detected.
**Impact:** Check 5 of `_exec_qa_patrol` has never executed since this code shipped.
Orphaned IBKR positions (from outside-bot trades, stale reconcile imports, or the
IndexError P1 above) go undetected intraday.
**Fix:** `bot.py:8333` — replace `config_syms` with `watchlist_syms`.
---
### BUG [P1] (carried since 2026-06-12 / 2026-08-07): `_execution_qa` 30s MKT fallback fires outside RTH — cancels valid resting LMT, places rejected MKT, silently drops entry
**File:** `bot.py:8037`
**Evidence:**
```python
# bot.py:8037
if elapsed > RETRY_AT and not retried and not is_manual: # no RTH guard
retried = True
self.ib.cancelOrder(exec_trade.order) # ← cancels valid resting off-hours LMT
...
order2 = MarketOrder(action, shares) # ← IBKR rejects MKT outside RTH
...
start_time = time.time() # budget reset present, but RTH guard missing
```
No `and in_rth` check. Off-hours resting LMT cancelled after 30s and replaced with a
GTC-wrapped MKT that IBKR rejects. `retried=True` → next rejection → handler returns
`(None, None)`. Entry is silently abandoned.
**Impact:** `rsi_extreme` pre/post-market entries that don't fill on the first
liquidity touch are abandoned after ~33s rather than resting in the off-hours book.
The 24×5 strategy edge is clipped every time a pre/post-market LMT takes more than
30s to fill.
**Fix:** Add RTH guard at `bot.py:8037`:
```python
if elapsed > RETRY_AT and not retried and not is_manual and in_rth:
```
Outside RTH: refresh the aggressive limit price via `_get_aggressive_limit` and
re-place a new LMT instead.
---
### BUG [P1] (carried since 2026-06-12 / 2026-08-07): `RSI_TICK_FIRE` window ends at 780 (13:00 ET) — three peak RTH afternoon hours cut
**File:** `bot.py:22189`
**Evidence:**
```python
# bot.py:22187-22189
if not (570 <= t_min < 780) or now_et.weekday() >= 5:
# Not RTH — reset state and skip
```
`780 = 13:00 ET`. RTH closes at `960 = 16:00 ET`. `rsi_extreme` entries and the
tick-fire state machine are blocked from 13:00–16:00 ET when `RSI_TICK_FIRE=true`.
The 13:00 ET bucket yielded +0.534% avg / 67.2% WR in the 2026-05-19 backtest —
the single highest-edge slot.
**Impact:** Three RTH hours of `rsi_extreme` signal completely suppressed. `RSI_TICK_FIRE=true` is the default on dev; same default applies if promoted to production.
**Fix:** `bot.py:22189` — change `780` → `960`:
```python
if not (570 <= t_min < 960) or now_et.weekday() >= 5:
```
---
### BUG [P1] (carried since 2026-06-19 / 2026-08-07): `_tape_last_loss_ms` in-memory only — TAPE loss cooldown resets on every bot restart
**File:** `bot.py:21312–21314` (write), `bot.py:21707–21709` (read)
**Evidence:**
```python
# bot.py:21312-21314 — write on -1% stop hit
if not hasattr(self, "_tape_last_loss_ms"):
self._tape_last_loss_ms = {}
self._tape_last_loss_ms[sym] = now_ms # ← dict in memory, no Redis write
# bot.py:21707-21709 — gate at entry
if not hasattr(self, "_tape_last_loss_ms"):
self._tape_last_loss_ms = {}
_last_loss = self._tape_last_loss_ms.get(sym, 0) # ← always 0 after restart
```
No Redis write, no DB write, no restore path. `TAPE_LOSS_COOLDOWN_MIN` gate
effe