◆ kanex-ai
Loading…
Interactive Brokers Client Services Jun 17 12:40 AM
Message Center Notification
Interactive Brokers ticket response regarding Kanex account messaging.
financial
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.
vendor
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
employee high
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.
phishing urgent
Microsoft Outlook Jun 16 9:38 PM
Undeliverable: FW: $QCOM (June 17, 2026-daily)
Microsoft Outlook: Undeliverable: FW: $QCOM (June 17, 2026-daily)
employee high
TDhruv Sharma Jun 16 9:05 PM
[Teams oneOnOne] (Teams DM)
Dhruv Sharma: [Teams oneOnOne] (Teams DM)
personal
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.
family
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.
vendor
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
employee high
Sydnee Agent (AI) Jun 16 5:40 PM
[Calibration Daily] 2026-06-17
Sydnee Agent (AI): [Calibration Daily] 2026-06-17
employee high
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
employee high
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.
vendor
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
phishing urgent
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
vendor
[email protected] Jun 16 2:34 PM
New Funding Program
Funding broker offering working capital solutions and consolidation services.
vendor
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
phishing urgent
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
employee high
[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
phishing urgent
TAnthony Patino Jun 16 1:30 PM
[Teams oneOnOne] (Teams DM)
LK account overdrawn; bank fee applied, needs replenishment before QB charge.
employee high
TAnthony Patino Jun 16 1:27 PM
[Teams oneOnOne] (Teams DM)
Anthony Patino sent a brief Teams DM referencing 'LK'.
employee
TAnthony Patino Jun 16 1:27 PM
[Teams oneOnOne] (Teams DM)
Anthony Patino reports insufficient funds issue.
employee high
Amazon Payments Jun 16 12:44 PM
Action requise sur le compte Amazon Payments
Fake Amazon Payments suspension notice in French requesting account verification.
phishing urgent
Nick Daniel Jun 16 11:04 AM
Quick question
TriNet HR solution sales inquiry.
vendor low
Aarti Gupta Jun 16 10:04 AM
Re: Order help #1227
Aarti Gupta: Re: Order help #1227
employee high
Aarti Gupta Jun 16 10:03 AM
Re: Order help #1227
Aarti Gupta: Re: Order help #1227
employee high
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
employee high
Sean McGinley Jun 16 9:58 AM
Order help #1227
Customer inquiry about HDMI extender transmitter compatibility for order #1227.
vendor
IBKR FYI Jun 16 9:51 AM
FYI: Upcoming Exchange Holidays
Exchange holiday notice: MIAX, NASDAQ, NYSE closed June 19.
financial low
IBKR FYI Jun 16 9:27 AM
FYI: Upcoming Exchange Holidays
NASDAQ/MIAX exchange holiday June 19, 2026 — no trading.
financial low
Hims Jun 16 9:02 AM
Kelvin - action required on your account
⚠ PHISHING: phishing subject pattern: 'action required' from external sender icloud.com
phishing urgent
[email protected] Jun 16 9:02 AM
You have a new estimate
Suspicious medical estimate link from Providence—verify legitimacy before clicking.
phishing urgent
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.
financial
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.
vendor
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.
financial
TDhruv Sharma Jun 16 8:16 AM
[Teams oneOnOne] (Teams DM)
Dhruv Sharma: [Teams oneOnOne] (Teams DM)
personal
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.
employee
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.
vendor
KanexPro Jun 16 7:51 AM
NEW USB-C + USB-BDual-Host Extender · 100m
KanexPro: NEW USB-C + USB-BDual-Host Extender · 100m
employee high
KanexPro Jun 16 7:50 AM
NEW USB-C + USB-BDual-Host Extender · 100m
KanexPro: NEW USB-C + USB-BDual-Host Extender · 100m
employee high
KanexPro Jun 16 7:50 AM
NEW USB-C + USB-BDual-Host Extender · 100m
KanexPro: NEW USB-C + USB-BDual-Host Extender · 100m
employee high
KanexPro Jun 16 7:49 AM
NEW USB-C + USB-BDual-Host Extender · 100m
KanexPro: NEW USB-C + USB-BDual-Host Extender · 100m
employee high
TDhruv Sharma Jun 16 7:33 AM
[Teams oneOnOne] (Teams DM)
Dhruv Sharma: [Teams oneOnOne] (Teams DM)
personal
TDhruv Sharma Jun 16 7:32 AM
[Teams oneOnOne] (Teams DM)
Dhruv Sharma: [Teams oneOnOne] (Teams DM)
personal
Bank of America Jun 16 6:16 AM
Your available account balance is low
Bank of America: Your available account balance is low
financial
Let's Talk Supply Chain Jun 16 6:01 AM
Are you ready?
Suspicious meeting confirmation from unknown sender with obfuscation.
phishing urgent
Interactive Brokers Client Services Jun 16 5:18 AM
Message Center Notification
Interactive Brokers ticket response regarding Kanex account notification.
financial
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.
phishing urgent
IBKR FYI Jun 16 5:01 AM
FYI: Option Expiration Notification
Oracle options expiring 18JUN2026 — immediate action required.
financial high
IBKR FYI Jun 16 5:00 AM
FYI: Option Expiration Notification
MSTR call option expiring 18JUN2026; action needed if extending position.
financial
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
employee high

Sydnee nightly — exit_flow audit 2026-05-27 — 0P0 2P1 3R

Sydnee Agent (AI) <[email protected]>
To: Kelvin Yan <[email protected]>
Wednesday May 27, 2026 · 4:15 AM PT · in [email protected]
AI verdict  employee high · confidence: high · by internal-exempt
“Sydnee Agent (AI): Sydnee nightly — exit_flow audit 2026-05-27 — 0P0 2P1 3R”
Reasoning: @sydnee.ai is a protected domain — hard exemption
Sydnee nightly — exit_flow audit — 2026-05-27 P0 findings: 0 P1 findings: 2 Risks: 3 - Area: Exit flow (how and when open positions are closed) - Bugs found (P0 / P1): 0 / 2 - Risks noted: 3 Branch: `dev` (7147326). Cross-checked against `git log --oneline -30` and `docs/strategy_decisions.md`. Both P1 bugs are **carryovers from 2026-05-26 that were not fixed in today's commits** (7147326, 94aeea3, 7f1fd63, f631fd2, ee2a66d, 643b2a4, 3d8bdda, 2928bd1, c51d818, 8535f8e, d4aa901). One new RISK found in the dynamic TV-BXt symbol set. --- Full report (dev branch): https://github.com/kanex1/sydnee.signals/blob/dev/docs/audit_2026-05-27_exit_flow.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-27 — EXIT FLOW ## Summary - Area: Exit flow (how and when open positions are closed) - Bugs found (P0 / P1): 0 / 2 - Risks noted: 3 Branch: `dev` (7147326). Cross-checked against `git log --oneline -30` and `docs/strategy_decisions.md`. Both P1 bugs are **carryovers from 2026-05-26 that were not fixed in today's commits** (7147326, 94aeea3, 7f1fd63, f631fd2, ee2a66d, 643b2a4, 3d8bdda, 2928bd1, c51d818, 8535f8e, d4aa901). One new RISK found in the dynamic TV-BXt symbol set. --- ## Findings ### BUG [P1]: OBV Rule F permanently disabled after in-loss skip (carryover 2026-05-26) **File:** `bot.py:4455–4477` **Evidence:** ```python if _profit_guard and profit_per_share < 0: _dir_lbl_ex = "LONG" if t.direction == 1 else "SHORT" if _loss_exit: hit = True reason = (...) elif not getattr(t, '_obv_be_applied', False): self._log_activity(...) # logs once, then silent t._obv_be_applied = True # ← line 4475: flag consumed in in-loss path t._obv_be_applied_at = datetime.now(ET).isoformat() self._update_trade_field(t.trade_id, obv_be_applied=True, ...) else: # In-profit path — tighten stop ... t._obv_be_applied = True # ← line 4481: correct (stop moved) ``` The outer guard at `bot.py:4409` is `and not getattr(t, "_obv_be_applied", False)`. Once the flag is True, Rule F never fires again. The in-loss path (profit guard) sets the flag on line 4475 **without moving the stop**, consuming the one-shot protection permanently. **Impact:** Trades that go underwater before OBV turns adverse, then recover to profit later, lose their Rule F stop-tighten. The wide entry stop defends until hit or another exit fires. The −$774→−$217 avg damage reduction (bxt_reversal backtest) only applies to trades that are in-profit when Rule F first fires. **Fix:** Move `t._obv_be_applied = True` inside the `else:` branch so it's only set when the stop actually moved: ```python if _profit_guard and profit_per_share < 0: if _loss_exit: hit = True ... elif not getattr(t, '_obv_be_applied', False): self._log_activity(...) # no-op this bar only # Do NOT set _obv_be_applied — let Rule F retry next bar when profitable else: ... t._obv_be_applied = True # only mark applied when stop actually moved ``` Note: `OBV_LOSS_EXIT` (spot-exit) path can keep the flag set because the trade is being closed — that's already correct (hit=True). --- ### BUG [P1]: TRIM2 `_rsi_force_trim2` flag never cleared for 1-share parents (carryover 2026-05-26) **File:** `bot.py:4871–4905` **Evidence:** ```python if not hit and is_trimmed and not is_trimmed_2 and (_trim2_hit or _force_trim2): trim = True # ← set unconditionally (line 4872) trim2_shares = t.shares // 2 if trim2_shares > 0: ... t._rsi_force_trim2 = False # ← only cleared when trim2_shares > 0 self._update_trade_field(t.trade_id, trimmed_2=True, force_trim2_pending=False, ...) # No else branch ``` When TRIM1 reduces position to 1 share, `trim2_shares = 1 // 2 = 0`. The `_rsi_force_trim2` and `trimmed_2` flags are inside the `if trim2_shares > 0:` guard — they are never updated. On every subsequent bar, `_force_trim2` returns True, `trim = True` is set, and the normal activity log at `bot.py:5034` is suppressed (`elif not trim:`). **Impact:** Per-bar CPU waste and silent activity log suppression for every bar until the position exits via stop, EOD flat, or target. The `force_trim2_pending` column stays True in DB, surviving restarts. No incorrect close is generated — the no-op is harmless to P&L but obscures the trade's live status in logs. **Fix:** Add an `else` branch after the `if trim2_shares > 0:` block: ```python else: # 0 shares — can't trim. Mark done so we don't retry every bar. t._trimmed_2 = True t._rsi_force_trim2 = False self._update_trade_field(t.trade_id, trimmed_2=True, force_trim2_pending=False, force_trim_reason=None) ``` --- ### RISK: Dynamic TV-BXt symbol position orphaned during Redis failure **File:** `bot.py:3571–3589` (`_tv_bxt_active_syms`) **Evidence:** ```python def _tv_bxt_active_syms(self) -> set: syms = self._tv_bxt_env_syms() # env symbols only (e.g. SNDK) try: r = getattr(self, "_regime_redis", None) if r is not None: for v in (r.smembers("tv_bxt_dynamic_syms") or []): syms.add(v.upper()) except Exception: pass # ← Redis failure silently dropped return syms ``` `_eval_tv_bxt` (line 3828) iterates over `_tv_bxt_active_syms()` and calls `_eval_tv_bxt_sym(sym, win)`. The overnight flat (`win == "flat"` → force-close), OBV trail stop, and Friday EOD flat all live inside `_eval_tv_bxt_sym`. If Redis is temporarily unavailable, the try/except swallows the error and returns only env symbols. **Scenario that breaks:** Model is "tv" (SNDK in env → `_bxt_model()` returns "tv"). A TV-BXt position is open for MU (added to `tv_bxt_dynamic_syms` via webhook). Redis goes down. `_tv_bxt_active_syms()` returns only `{SNDK}`. `_eval_tv_bxt_sym(MU, ...)` is never called. The model-inactive path (line 3822–3826) doesn't fire because the model is still "tv". MU's position: - Never gets its overnight flat checked - Never gets its OBV trail stop checked - Never gets its Friday EOD flat checked The position becomes an orphan until Redis recovers. **Mitigation:** Add a safety sweep in `_eval_tv_bxt` that closes any open TV-BXt position whose symbol is not in the current active set: ```python active = self._tv_bxt_active_syms() for t in list(self.open_trades()): if self._is_tv_bxt_trade(t) and t.symbol not in active: # Symbol dropped from active set (Redis failure or TTL expiry) # Force-close to prevent orphan. win_sym = self._bxt1m_window(datetime.now(ET)) if win_sym == "flat": self._close_trade(t, "TV-BXt FLAT — symbol dropped from active set") self._tv_bxt_signal_clear(t.symbol) ``` Or simpler: log a WARN and let the next successful Redis read recover naturally (acceptable given the 7-day TTL makes overnight TTL expiry essentially impossible; real risk is only transient Redis failure). --- ### RISK: Stale "keep overnight" comments in Friday EOD progressive-trim block (carryover 2026-05-26) **File:** `bot.py:4078, 4082, 4091` **Evidence:** ```python # Skip RSI extreme entries from after 12:00 PM PT — keep those intact. # ← wrong # weekend. Only rsi_extreme is meant to keep overnight. # ← wrong continue # skip — late RSI extreme, keep overnight # ← wrong ``` The overnight-hold exemption for late RSI extreme entries was removed in commit `52f1bb1` (2026-04-17). The final flat sweep at `bot.py:4139–4158` now closes ALL positions, no exemptions. The progressive-trim exemption (3:00–3:50 PM ET window) is scoped to **trimming only** — it prevents a fresh entry from being immediately trimmed, but the position is still closed at 3:50 PM. The comments say "keep overnight" which is incorrect. **Impact:** No runtime bug — positions are not actually held overnight. The misleading comments risk a future developer re-introducing the overnight exemption assuming it was an intentional ongoing behavior. **Mitigation:** Update comments at lines 4078, 4082, 4091 to: "Skip late RSI extreme entries from progressive trimming only — position still closes at 3:50 PM ET flat sweep." --- ### RISK: Stale trim3 DB-column comment (carryover 2026-05-26) **File:** `bot.py:7787` **Evidence:** ```python elif trade.trade_id.endswith("_trim3"): pass # no DB column for trim3 yet — state tracked in-memory ``` The `trimmed_3` column WAS added in the 2026-04-15 persistence fixes (commit `a6be962`, `strategy_decisions.md` line 344). It is written at EXIT 3 (`bot.py:4835–4836`) before the trim child is queued. The `pass` here is correct (parent already updated), but the comment is false. **Impact:** No runtime impact. A developer reading this comment might attempt to "fix" it by adding the update here, causing a benign duplicate write. **Mitigation:** Update comment to: `# trimmed_3 already set via _update_trade_field in EXIT 3 (bot.py:4835) — no second update needed`. --- ## OK (checked, working or recently fixed): - **`_tv_bxt_signal_clear` on all exit paths** — verified: called on overnight flat (line 3844), OBV trail stop (line 3874), Friday EOD flat (line 3879), model-switch-into-tv signal purge (line 13226), manual close (line 13019), IBKR-side reconcile close (line 2390). - **Dynamic symbol single-model lock** — `_bxt_active_syms()` correctly calls `_tv_bxt_active_syms()` in "tv" mode (line 3769), so the single-model suppression covers both env and dynamic symbols. - **Switch-into-TV signal clear** — now clears both env and dynamic symbol signals via `_tv_bxt_active_syms()` (line 13226), correctly superseding the old env-only clear. - **"hold" window removal for TV-BXt (f631fd2)** — entry during 09:15–09:45 ET and 15:45–16:15 ET transition windows is now allowed. Friday EOD flat fires on the next tick for positions opened during 15:45 ET window on Friday. OBV trail stop and outsideRth=True order routing remain active. No orphan risk from this change. - **IP allowlist (`_tv_bxt_allowed_ips`)** — correctly defaults to TV's 4 official relay IPs; empty env string disables check (secret-only). Not an exit flow concern. - **Auto-add to dynamic set (7147326)** — webhook handler calls `r.sadd("tv_bxt_dynamic_syms", sym)` + `r.expire(..., 7*86400)` on each valid webhook. 7-day TTL means set survives active webhook streams indefinitely. Exit flow for dynamically-added symbols is correct when Redis is healthy (see RISK above for failure mode). - **FLAT_EXIT parent `exit_reason=""` in DB** — unchanged from yesterday's RISK finding (bot.py:1315). No new code touched this path. - **OBV trail Redis restore wired (498275d)** — `_obv_trail_saved` tuples persisted and restored from Redis at startup. Verified in `_load_trades_from_db` (bot.py:1129–1140 area, including 2026-05-26 additions). - **TV-BXt exempt from `_evaluate_symbol`** — confirmed (bot.py:4050–4052): `strategy_reason.startswith("BXT1m")` / `startswith("TV-BXt")` check prevents normal stop/trim/EOD logic from running on these positions (handled exclusively by `_eval_bxt_1m_naked` / `_eval_tv_bxt_sym`). - **All items verified OK in 2026-05-26 audit** — re-confirmed unchanged.