◆ 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 — persistence audit 2026-05-28 — 0P0 1P1 3R

Sydnee Agent (AI) <[email protected]>
To: Kelvin Yan <[email protected]>
Thursday May 28, 2026 · 4:20 AM PT · in [email protected]
AI verdict  employee high · confidence: high · by internal-exempt
“Sydnee Agent (AI): Sydnee nightly — persistence audit 2026-05-28 — 0P0 1P1 3R”
Reasoning: @sydnee.ai is a protected domain — hard exemption
Sydnee nightly — persistence audit — 2026-05-28 P0 findings: 0 P1 findings: 1 Risks: 3 - Area: Persistence - Bugs found (P0 / P1): 0 / 1 - Risks noted: 4 --- Full report (dev branch): https://github.com/kanex1/sydnee.signals/blob/dev/docs/audit_2026-05-28_persistence.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-28 — PERSISTENCE ## Summary - Area: Persistence - Bugs found (P0 / P1): 0 / 1 - Risks noted: 4 --- ## Findings ### BUG [P1]: `_tv_confirm_state` not persisted + `tv_bxt_signal` has no TTL — stale signal retried after restart **File:** `bot.py:4020-4053` (confirm state), `bot.py:12245-12246` (signal set) **Evidence:** ```python # bot.py:12245-12246 — plain r.set(), no TTL r.set(f"tv_bxt_signal:{sym}", sig) r.set(f"tv_bxt_signal_ts:{sym}", str(int(time.time()))) # bot.py:4020-4037 — retry counter is in-memory only if not hasattr(self, "_tv_confirm_state"): self._tv_confirm_state = {} # ← resets to {} on every restart _st = self._tv_confirm_state.get(sym, {}) if _st.get("sig_ts") != _sigts: _st = {"sig_ts": _sigts, "attempts": 0, "last_check": 0.0} # ← resets to 0 _st["attempts"] = _st.get("attempts", 0) + 1 self._tv_confirm_state[sym] = _st if _st["attempts"] >= 5: self._tv_bxt_signal_clear(sym) # abandon after 5 ... return ``` `_tv_confirm_state[sym]` is a per-symbol dict tracking how many flow-confirmation retries have been attempted for the current TV-BXt signal. It lives entirely in memory — no Redis persist, no DB write. The `tv_bxt_signal:{sym}` Redis key is set via `r.set()` with no TTL, so it persists indefinitely until `_tv_bxt_signal_clear` is called (on position close or after 5 failed attempts). **Failure path on restart during a flow-confirmation retry:** 1. TV webhook fires → `tv_bxt_signal:{sym}` set in Redis (no TTL). 2. Flow not confirmed; `_tv_confirm_state[sym]` shows `attempts=3/5`. 3. Bot restarts (crash, redeploy, health-check eviction). 4. `tv_bxt_signal:{sym}` still in Redis — no expiry. 5. `_tv_confirm_state` is `{}` (reset). The `sig_ts` check re-initializes to `attempts=0`. 6. Fresh 5-attempt window begins. A signal that should have been abandoned after 2 more retries now gets 5 more. 7. If the WS sidecar is slow to reconnect on restart (`_ws_age > 5000ms`), the `_fresh = False` **fail-open** path bypasses flow confirmation entirely and triggers an immediate entry on a signal that may be 5–15 min old. **Impact:** On any restart during trading hours while a TV-BXt flow retry is in progress, the bot may enter on a stale signal. The fail-open path (stale WS on startup) is the critical sub-case — it short-circuits all confirmation logic, so even a signal that never confirmed flow (e.g., because it was a blowoff move) gets an immediate entry attempt on restart. **Fix (two changes):** ```python # 1. bot.py — give tv_bxt_signal keys a TTL (at signal-set site, bot.py:12245): r.setex(f"tv_bxt_signal:{sym}", 900, sig) # expire after 15 min r.setex(f"tv_bxt_signal_ts:{sym}", 900, str(int(time.time()))) # 2. bot.py — persist _tv_confirm_state to Redis (at update site, bot.py:4037): self._tv_confirm_state[sym] = _st if self._regime_redis: try: self._regime_redis.setex(f"tv_confirm:{sym}", 600, json.dumps(_st)) except Exception: pass # 3. bot.py — restore on startup (after Redis init, ~bot.py:790): if not hasattr(self, "_tv_confirm_state"): self._tv_confirm_state = {} if self._regime_redis: for _sym in self._tv_bxt_active_syms(): _raw = self._regime_redis.get(f"tv_confirm:{_sym}") if _raw: try: self._tv_confirm_state[_sym] = json.loads(_raw) except Exception: pass ``` Either fix alone significantly reduces the risk: the TTL prevents stale signals from surviving multi-minute restarts; the state persistence preserves the attempt counter so a 4/5 signal isn't retried fresh. --- ### RISK: `reconcile_import` positions now TV-managed without OBV trail state **File:** `bot.py:3907291 commit` (`_eval_tv_bxt_sym`), `bot.py:3735-3790` (`_obv_trail_stop_hit`) **Evidence:** ```python # 3907291 — my_pos now includes reconcile_import (fresh today) my_pos = next((t for t in open_here if self._is_tv_bxt_trade(t) or getattr(t, "strategy_reason", "") == "reconcile_import"), None) # _obv_trail_stop_hit — initializes OBV trail if _obv_peak not present # bot.py:3753-3770 r = getattr(self, "_regime_redis", None) if r is not None and not getattr(my_pos, "_obv_peak", None): _ot = r.get(f"obv_trail:{my_pos.trade_id}") # → None for reconcile_import (never set by _obv_trail_stop_hit before) ``` A reconcile_import trade was never processed by `_obv_trail_stop_hit`, so no `obv_trail:{trade_id}` key exists in Redis. When the TV engine now inherits such a position as `my_pos`, the first call to `_obv_trail_stop_hit` initializes `_obv_peak` and `_obv_stop` from the current price — not from the actual price action since entry. For a long that ran +2% before the bot restarted, the OBV trail starts from the top (fair). For a long that ran up and then gave back, the trail floor misses the true peak — the stop is set too tight or too loose depending on direction. **Impact:** The first OBV trail evaluation on a reconcile_import position uses a fresh start rather than accumulated history. Low probability of causing a stop-out in one bar, but the trail won't tighten correctly until a new peak is established post-adoption. For a TV position that was deep in profit pre-restart, this could allow more drawback before the trail fires. **Fix:** In `_eval_tv_bxt_sym`, after setting `my_pos` for a reconcile_import trade, try to restore OBV trail from Redis using the same logic as `_load_trades_from_db:1170-1192` (which already handles `obv_trail:{trade_id}` restore). Alternatively, skip OBV trail exit management for `reconcile_import` positions on the first bar and let the position fall through to price-stop logic only. --- ### RISK: `_fri_flat_queued` not persisted — RTH force-flat dedup missed (CARRIED OVER from 2026-05-22) **File:** `bot.py:4334-4339` **Evidence:** ```python if getattr(t, '_fri_flat_queued', False): continue # ← in-memory only; no _update_trade_field t._fri_flat_queued = True self._deferred_closes.append((t, ...)) ``` Contrast: sister flag `_fri_ah_close_queued` was persisted in 8845a24 (audit 2026-05-21 R4). On restart during the 3:50 PM ET Friday close window, the dedup guard resets and a second close is enqueued. The `is_open` guard in `_close_trade` provides secondary protection if the first fill processed. Unchanged from 2026-05-22 filing; narrow Friday-only window; no financial harm on paper. **Fix (identical to `fri_ah_close_queued` pattern):** ```python # core/database.py ensure_trade_state_columns — add: "ALTER TABLE trades ADD COLUMN IF NOT EXISTS fri_flat_queued BOOLEAN DEFAULT FALSE", # bot.py:4339 — add: self._update_trade_field(t.trade_id, fri_flat_queued=True) # bot.py _load_trades_from_db — add alongside fri_ah_close_queued: if row.get("fri_flat_queued"): t._fri_flat_queued = True ``` --- ### RISK: `_bxt1m_last_bar` not persisted — 1m BXt dedup replays on restart (CARRIED OVER from 2026-05-22) **File:** `bot.py:3891-3892`, `bot.py:4149-4155` **Evidence:** ```python if not hasattr(self, "_bxt1m_last_bar"): self._bxt1m_last_bar = {} # ← always empty on restart ... if self._bxt1m_last_bar.get(sym) == idx[-1]: return # dedup skips already-processed bar self._bxt1m_last_bar[sym] = idx[-1] # ← in-memory only ``` On restart, the dedup guard resets and the most recent 1m bar is re-evaluated. If `desired_dir == 0` (5m trend not aligned) at the moment of restart, an open BXT1m position is force-closed prematurely. Unchanged from 2026-05-22 filing. Gated behind `BXT_1M_NAKED_SYMBOLS` env var (empty by default = off on both dev and prod). Risk dormant if `BXT_1M_NAKED_SYMBOLS` is unset. **Fix (from 2026-05-22):** Persist `last_ts` to Redis with `setex(f"bxt1m_last_bar:{sym}", 120, str(last_ts))`; restore on init. --- ## OK (checked, working or recently fixed) **New since 2026-05-22 — TV-BXt feature commits reviewed:** - **`tv_bxt_signal` set/clear logic** — `_tv_bxt_signal_clear` correctly deletes both `tv_bxt_signal:{sym}` and `tv_bxt_signal_ts:{sym}` on close and on entry (line 3937, 3967). Deletion side correct; missing TTL filed as P1 above. - **`_tv_block_logged` dict** — not persisted, but purely cosmetic (dedup for a dashboard log line). On restart, at most one extra "manual position blocked" log per signal. No trading impact. ✓ (RISK too low to file) - **Flow-confirm `_ratio` / `_flow_min` / `_vol_min` checks** — purely computed from live WS overlay on each call; no per-trade state, no persistence needed. ✓ - **WS-touch marketable limit order kwargs** — `_close_order_kwargs` is a runtime attribute set on the Trade object in `_eval_tv_bxt_sym`. Not persisted. On restart, the trade reverts to market-order close. Acceptable: limit close is an optimization, not a correctness requirement. ✓ - **Spread gate `ws_spread_bps`** — read live from `_ws_live_overlay` on each entry evaluation; no cached state to persist. ✓ - **`reconcile_import` quarantine guard raised 25%→55% NLV** (`fix(reconcile)` 62f9195) — env-var math, computed fresh at each reconcile tick; no state. ✓ **From 2026-05-22 audit — all still OK:** - All 7 items fixed in 8845a24 (oracle TTL, consec_losses, tick_peak, tick_fire_ts, fri_ah_close_queued, signal_price/time restore) remain correct. ✓ - `_fri_flat_queued` and `_bxt1m_last_bar` remain open risks (carried above). Status unchanged. **Long-standing — re-confirmed no regression:** - `trimmed_1/2/3`, `eod_trimmed`, `obv_be_applied`, `extreme_since_trim`, `last_eod_trim_time`, `last_ah_trim_time`, `pending_reversal`, `force_trim_pending/2`, `force_trim_reason`, `tick_peak_signed_vol`, `fri_ah_close_queued`, `signal_price/time` — all correctly persisted to DB and restored in `_load_trades_from_db`. ✓ - OBV trail (`obv_trail:{trade_id}`) persisted to Redis with 7-day TTL (604800s); restored at startup for genuinely TV-opened trades. ✓ - `_pending_manual_orders` persisted to Redis hash; restored on restart; stale-cleanup patrol uses Redis inventory to skip known manual orders. ✓ - Bar snapshots (`bars:{sym}:{tf}`) saved to Redis every 5m via `_save_bars_to_redis` (86400s TTL); restored in `_load_bars_from_redis`. ✓ - `_deferred_closes` drain deduplicates by `trade_id` + `is_open` guard; double-close risk contained. ✓ - `ensure_trade_state_columns()` runs at `__init__` (line 733); idempotent `ADD COLUMN IF NOT EXISTS`. New columns from all recent audits confirmed present in migration. ✓ - `exit_reason` empty for FLAT_EXIT parent and reconcile closes — filed as RISK in 2026-05-26 exit_flow audit; no change since then. ✓ - `vix_at_entry/exit`, `position_size_pct` always 100.0, `_setup_mode` — analytics-only, carried from prior audits. ✓ - OBV divergence swing-point history — dormant (`OBV_DIVERGENCE_ENABLED=false`). ✓