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 — config_drift audit 2026-06-07 — 0P0 5P1 9R
AI verdict
employee
high
· confidence: high
· by internal-exempt
“Sydnee Agent (AI): Sydnee nightly — config_drift audit 2026-06-07 — 0P0 5P1 9R”
Reasoning: @sydnee.ai is a protected domain — hard exemption
Sydnee nightly — config_drift audit — 2026-06-07
P0 findings: 0 P1 findings: 5 Risks: 9
- Area: Config Drift (Sunday theme)
- Bugs found (P0 / P1): 0 / 5 (1 new, 4 carried)
- Risks noted: 10 (1 new, 9 carried)
Cross-check: `git log --oneline -30` and `docs/strategy_decisions.md` reviewed before filing.
`docs/audit_2026-05-31_config_drift.md` (last config-drift) and `docs/audit_2026-06-07_weekly.md`
reviewed. All 4 carried P1s confirmed still present in current code; 1 new P1 (DISABLE_DAILY_LOSS_LIMIT
CLAUDE.md gap — carried from weekly). Recent commits: feat(tv-bxt) scale-in redesign 3b0d6ac,
pre-market window relaxation 82c80de, risk flag 44aec76 — none resolved carried items.
---
Full report (dev branch): https://github.com/kanex1/sydnee.signals/blob/dev/docs/audit_2026-06-07_config_drift.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-07 — CONFIG DRIFT
## Summary
- Area: Config Drift (Sunday theme)
- Bugs found (P0 / P1): 0 / 5 (1 new, 4 carried)
- Risks noted: 10 (1 new, 9 carried)
Cross-check: `git log --oneline -30` and `docs/strategy_decisions.md` reviewed before filing.
`docs/audit_2026-05-31_config_drift.md` (last config-drift) and `docs/audit_2026-06-07_weekly.md`
reviewed. All 4 carried P1s confirmed still present in current code; 1 new P1 (DISABLE_DAILY_LOSS_LIMIT
CLAUDE.md gap — carried from weekly). Recent commits: feat(tv-bxt) scale-in redesign 3b0d6ac,
pre-market window relaxation 82c80de, risk flag 44aec76 — none resolved carried items.
---
## Findings
### BUG [P1] (new since 2026-05-31): `DISABLE_DAILY_LOSS_LIMIT` absent from CLAUDE.md — production safety warning buried in strategy_decisions.md only
**Files:** `core/risk.py:106–116`; `docs/strategy_decisions.md:1059`; `CLAUDE.md`
**Evidence:**
```python
# core/risk.py:112
if os.environ.get("DISABLE_DAILY_LOSS_LIMIT", "").lower() not in ("1", "true", "yes"):
if self.state.realized_pnl <= -self.cfg.daily_loss_limit:
return False, ...
```
```
# docs/strategy_decisions.md:1059
"Hard re-enable the gate before any real-money promotion — this flag is NOT for prod."
```
`grep "DISABLE_DAILY_LOSS_LIMIT" CLAUDE.md` → zero results. The flag was added on 2026-06-02
(commit 44aec76) and is currently active on dev (`TV_BXT_SCALE_IN=true` re-enabled on dev
docker-compose per strategy_decisions.md:1009). The hard warning lives only in strategy_decisions.md,
which is not the first file an operator or AI session reads when deploying.
**Impact:** An operator or automated session that copies the dev docker-compose to prod (or
cherry-picks env vars) silently removes the $5K daily-loss circuit breaker on real money.
Config.json already sets `daily_loss_limit: 50000` (see carried P1 below), so the DLL is already
effectively disabled by the value — but if the value were fixed, this flag would bypass the fix.
**Fix:** Add to CLAUDE.md env-var reference (under Dev-Only Features or a new Env Vars section):
```
| DISABLE_DAILY_LOSS_LIMIT | "" (gate ON) | ⚠️ DEV ONLY — removes 5% NLV daily-loss circuit
breaker. MUST be unset/absent before any real-money promotion. |
```
---
### BUG [P1] (carried since 2026-05-24): `TV_BXT_MAX_AGE_SEC` documented but never implemented — stale Friday signals persist through the weekend
**File:** `bot.py:3705`
**Evidence:**
```python
# bot.py:3705 — docstring for _tv_bxt_signal():
"""... 0 (none). Optionally ignore stale signals via TV_BXT_MAX_AGE_SEC."""
# grep "TV_BXT_MAX_AGE_SEC" bot.py → 1 hit, docstring only. No os.environ.get call.
```
`tv_bxt_signal:{sym}` Redis key has no TTL. A Friday-close TV webhook sets the signal; the Redis
key persists through the weekend. On Monday's first loop tick the bot reads the signal and may
enter before any live webhook arrives, acting on a direction that is up to 65+ hours stale.
**Impact:** TV-BXt model (SNDK, MU — real money since 2026-05-01) can open a position at
Monday open based on a Friday signal in the opposite direction from the weekend gap.
**Fix:** In `_tv_bxt_signal()` webhook writer (`bot.py:~11832–11843`), add `EX=TTL` to the
Redis SET. A 14-hour TTL (50,400s) survives intraday reconnects but expires before Monday open.
Alternatively, gate signal read on age using a companion `tv_bxt_signal_ts:{sym}` key.
---
### BUG [P1] (carried since 2026-05-17): `REVERSE_TIME_DECAY` uses `== "1"` — YAML-style `"true"` silently has no effect
**File:** `bot.py:6019`
**Evidence:**
```python
# bot.py:6019 — sole check for the flag
if os.environ.get("REVERSE_TIME_DECAY", "0") == "1" and _in_rth:
```
Every other boolean env flag in bot.py uses `.lower() in ("1", "true", "yes")`.
`REVERSE_TIME_DECAY: "true"` in a docker-compose YAML silently disables the morning size ramp
with no log or diagnostic. The only working form is the bare `"1"`.
**Impact:** If the dev compose is edited to YAML boolean form, the opening-hour size ramp is
silently off — affecting all non-TV-BXt entries that rely on `MORNING_SIZE_SCALE`.
**Fix:** Change to `os.environ.get("REVERSE_TIME_DECAY", "").lower() in ("1", "true", "yes")`.
One-line change; update default guard accordingly.
---
### BUG [P1] (carried since 2026-05-17): `config.json:daily_loss_limit: 50000` equals `capital` — DLL fires only at 100% intraday drawdown
**Files:** `config.json:3,6`; `core/risk.py:112`
**Evidence:**
```json
{ "capital": 50000, "daily_loss_limit": 50000 }
```
```python
# core/risk.py:112
if self.state.realized_pnl <= -self.cfg.daily_loss_limit:
return False, ...
```
Gate fires only after a full $50,000 intraday realized loss — a 100% drawdown. The bot is live
on real money. This is also the backstop the TV-BXt SHIELD exemption relies on. The RiskConfig
dataclass default is `daily_loss_limit=1_500.0` (bot.py:769) — correct — but config.json
overrides it to 50,000 on every load.
**Impact:** No intraday loss circuit breaker is operational on real money. A runaway session
(cascading fills, bad data) can lose up to the full account value before the gate fires.
**Fix:** `"daily_loss_limit": 1500` (3% of $50K) in config.json. The RiskConfig default is
already correct; config.json is the only thing overriding it to an unsafe value.
---
### BUG [P1] (carried since 2026-05-17): `TV_BXT_TRAIL_AGAINST` default mismatch — live engine `"1.0"` vs history-replay endpoint `"1.5"`
**Files:** `bot.py:3774`; `bot.py:14344`
**Evidence:**
```python
# bot.py:3774 — _obv_trail_stop_hit() LIVE TRADING path:
agnst = float(os.environ.get("TV_BXT_TRAIL_AGAINST", "1.0"))
# bot.py:14344 — api_trade_obv_trail() HISTORY REPLAY endpoint:
agnst = float(os.environ.get("TV_BXT_TRAIL_AGAINST", "1.5"))
```
When `TV_BXT_TRAIL_AGAINST` is unset (the default path on both dev and prod), the live engine
uses a 1.0×ATR against-stop, but the dashboard's OBV-trail history panel reconstructs using
1.5×ATR. Every closed-trade stop timeline is wrong by 50% of the against-trail width.
**Impact:** Post-trade stop-width analysis on the trade card is systematically misleading.
"The stop was too tight" conclusions may be reversed — the replay shows a wider stop than
what actually triggered the exit.
**Fix:** Change `bot.py:14344` default from `"1.5"` to `"1.0"`. One-line fix.
---
### RISK (new): `TV_BXT_RTH_ONLY` flag name misnomer after 2026-06-03 window relaxation
**File:** `bot.py:4047–4065`; `docs/strategy_decisions.md:938`
**Evidence:**
```python
# bot.py:4047-4048 — comment in code:
# TV_BXT_RTH_ONLY=true (dev opt-in, kept name for compat): block NEW
# entries outside the active session — pre-market + RTH = 04:00-16:00 ET
```
```
# strategy_decisions.md:938:
"semantics now 'block after-hours + overnight' rather than 'RTH-only'."
"Reason for keeping the flag name: backward compat with the dev docker-compose env"
```
The flag was introduced 2026-06-01 (9603296) as a true RTH gate (09:30–16:00 ET). On 2026-06-03
(82c80de), the window was relaxed to 04:00–16:00 ET to allow pre-market entries. The flag name
`TV_BXT_RTH_ONLY` was kept for compose backward-compat — but "RTH" is an industry-standard term
meaning 09:30–16:00 ET. CLAUDE.md does not document this flag at all.
**Impact:** An operator reading the flag name expects it to gate entries to RTH (09:30–16:00 ET).
Enabling it on prod would actually allow pre-market entries into thin 04:00–07:00 ET liquidity
(wider spreads, shallow book). The mismatch between name and behavior is documented only in
strategy_decisions.md; CLAUDE.md has no mention.
**Recommendation:** Either rename to `TV_BXT_SESSION_GATE` (document the old name as alias) or
add a note to CLAUDE.md: `TV_BXT_RTH_ONLY=true gates NEW entries to 04:00–16:00 ET weekdays
(pre-market + RTH; after-hours/overnight blocked).`
---
### RISK (carried from 2026-05-31): `TV_BXT_NLV_PCT = 50.0` sizing bypass absent from `strategy_decisions.md`
**File:** `bot.py:4216`; `bot.py:7171`; `docs/strategy_decisions.md`
**Evidence:**
```python
# bot.py:4216 — TV-BXt single-entry sizing (also bot.py:7171):
_tv_pct = float(os.environ.get("TV_BXT_NLV_PCT", "50.0"))
_tv_shares = int((nlv * _tv_pct / 100.0) / price)
```
This explicitly bypasses `MAX_POSITION_PCT` (10% cap), ATR-risk sizing, and all conviction
multipliers. At `$100K NLV × 50%` = $50K per trade. `grep "TV_BXT_NLV_PCT" docs/strategy_decisions.md`
→ zero results. Six weeks unfixed.
**Recommendation:** Add a strategy_decisions.md entry for the 50% NLV sizing with hypothesis,
approval date, validation criteria, and the `TV_BXT_NLV_PCT` env-var name.
---
### RISK (carried from 2026-05-25): `config.json:max_concurrent_positions: 50` — concurrent-position gate never fires
**File:** `config.json:11`; `core/risk.py:114`
**Evidence:** `"max_concurrent_positions": 50`. With 8 symbols in the watchlist, max realistic
concurrent positions ≈ 8–12. Gate fires only at 50 — effectively disabled on real money.
**Recommendation:** `"max_concurrent_positions": 5` (or 8 at most for an 8-symbol book).
---
### RISK (carried from 2026-05-25): `config.json:risk_per_trade_pct: 2.0` bypassed by env-var live sizing path
**Files:** `config.json:7`; `bot.py:6780`; `bot.py:7126`
**Evidence:**
```python
# bot.py:6780 — live sizing (reads env vars, not config.json):
sym_risk_pct = max(1.0, min(3.0, float(os.environ.get("RISK_ATR_BUDGET", "12.0")) / daily_atr_pct))
# bot.py:7126 — per-trade cap:
_max_risk_pct = float(os.environ.get("MAX_RISK_PCT", "0.015"))
```
Config.json `risk_per_trade_pct: 2.0` is read only by the backtester. Live sizing reads
`RISK_ATR_BUDGET` and `MAX_RISK_PCT` env vars; the config.json value is dead for live trading.
**Recommendation:** Comment `risk_per_trade_pct` in config.json as backtester-only; document
`MAX_RISK_PCT` (default 1.5%) as the live cap in CLAUDE.md.
---
### RISK (carried from 2026-05-24): Oracle `HEALTH_PORT` and bot `DASH_PORT` both default to `8083`
**Files:** `oracle/config.py:56`; `bot.py:184`; `Dockerfile.oracle:12`; `Dockerfile:20`
**Evidence:**
```python
HEALTH_PORT = int(os.environ.get("ORACLE_HEALTH_PORT", "8083")) # oracle/config.py:56
DASH_PORT = int(os.environ.get("DASH_PORT", "8083")) # bot.py:184
```
Both `Dockerfile` and `Dockerfile.oracle` declare `EXPOSE 8083`. A compose stack that maps both
containers' `8083` to the host gets a silent bind conflict; whichever service starts second loses.
**Recommendation:** Change `ORACLE_HEALTH_PORT` default to `8084` in `oracle/config.py:56` and
`Dockerfile.oracle:12`.
---
### RISK (carried from 2026-05-24): `config.json:atr_stop_multiplier: 1.5` diverges from code fallback `2.0`
**Files:** `config.json:8`; `bot.py:769`
**Evidence:**
```python
# bot.py:769
self.atr_stop_mult = self.cfg.get("atr_stop_multiplier", 2.0)
```
Removing or misspelling the config key silently widens stops by 33% — no log or alert. The
calibrated value (1.5×) is incompatible with the code default (2.0×).
**Recommendation:** Comment `config.json` to note the code fallback is 2.0; or align both to 1.5.
---
### RISK (carried from 2026-05-31): `pages.py:1448` hardcodes `"TradingView webhook (SNDK only)"` label — stale when `TV_BXT_SYMBOLS` changes
**File:** `pages.py:1448`
**Evidence:**
```js
var nm = { ..., tv: 'TradingView webhook (SNDK only)' }[m];
```
`TV_BXT_SYMBOLS` env var controls the actual symbol list; dashboard label is static. MU was added
to TV_BXT_SYMBOLS but the label still reads "SNDK only."
**Recommendation:** Pass `TV_BXT_SYMBOLS` through Jinja2 into the JS map, or update label to
`"TradingView webhook"` (no symbol list).
---
### RISK (carried from 2026-05-17): `sentiment.cashtags` mismatches trading `symbols`
**File:** `config.json:2,37`
**Evidence:**
```json
"symbols": ["WDC", "STX", "MU", "SNDK", "APP", "META", "TSLA", "PLTR"],
"cashtags": ["APP", "KORU", "MU", "SNDK", "STX", "WDC"]
```
`META`, `TSLA`, `PLTR` are traded but absent from cashtag seed — sentiment bypas