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 WEEKLY (cross-cutting) audit 2026-06-14 — 0P0 0P1 0R
AI verdict
employee
high
· confidence: high
· by internal-exempt
“Sydnee Agent (AI): Sydnee WEEKLY (cross-cutting) audit 2026-06-14 — 0P0 0P1 0R”
Reasoning: @sydnee.ai is a protected domain — hard exemption
Sydnee WEEKLY (cross-cutting) audit — 2026-06-14
P0 findings: 0 P1 findings: 0 Risks: 0
- **Commits since last weekly (2026-06-07):** ~43 feature/fix commits (excl. peak-monitor hourly logs and daily-audit docs; 90 total)
- **Files changed:** `bot.py`, `pages.py`, `vianexus_client.py`, `futures_client.py`, `polygon_client.py`, `Dockerfile.oracle`, `Dockerfile.ibkr_ws`, `Dockerfile.poly_ws`
- **Major new work this week:** Day/Tone page (SMB three-pillar, NDJSON streaming, Sonnet direct SDK), ENGINE selector flattening (MODEL→ENGINE, 6-option mutex), Tape phase 2 completion (A4 sector gate, in-play A1/A3 gates, discovery scanner, TAPE_STRICT_SIG2, TAPE_TICK_EXIT), viaNexus integration + earnings guard, nav Day→Tone pill with live RISK-ON/OFF score
| Category | Count |
|---|---|
| P1 carried | 5 |
| P1 new | 1 |
| P2 carried | 5 |
| P2 new | 2 |
| Dead code | 1 |
| Perf | 1 |
| **Fixed since last weekly** | 0 (none of the 10 prior findings addressed) |
---
Full report (dev branch): https://github.com/kanex1/sydnee.signals/blob/dev/docs/audit_2026-06-14_weekly.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) ---
# Weekly Code Audit 2026-06-14
## Summary
- **Commits since last weekly (2026-06-07):** ~43 feature/fix commits (excl. peak-monitor hourly logs and daily-audit docs; 90 total)
- **Files changed:** `bot.py`, `pages.py`, `vianexus_client.py`, `futures_client.py`, `polygon_client.py`, `Dockerfile.oracle`, `Dockerfile.ibkr_ws`, `Dockerfile.poly_ws`
- **Major new work this week:** Day/Tone page (SMB three-pillar, NDJSON streaming, Sonnet direct SDK), ENGINE selector flattening (MODEL→ENGINE, 6-option mutex), Tape phase 2 completion (A4 sector gate, in-play A1/A3 gates, discovery scanner, TAPE_STRICT_SIG2, TAPE_TICK_EXIT), viaNexus integration + earnings guard, nav Day→Tone pill with live RISK-ON/OFF score
| Category | Count |
|---|---|
| P1 carried | 5 |
| P1 new | 1 |
| P2 carried | 5 |
| P2 new | 2 |
| Dead code | 1 |
| Perf | 1 |
| **Fixed since last weekly** | 0 (none of the 10 prior findings addressed) |
---
## Fixed Since Last Weekly (2026-06-07)
None. All 10 findings from the 2026-06-07 weekly carry forward unchanged.
---
## Findings
---
### [SECURITY] P1 (carried 7 weeks — 2026-05-03 → 2026-06-14): Hardcoded `"8881"` API key — 5 sites remain
**Files:** `pages.py:7222`, `pages.py:7466`, `pages.py:8030`, `pages.py:8317`, `pages.py:8322`, `pages.py:8325`
**Evidence:**
```js
// pages.py:7222 — stock add
fetch('/api/stocks/add',{...,'X-API-Key':'8881'}...)
// pages.py:7466 — screener scan
apiPost("/api/screener/run",{...,"password":"8881"})
// pages.py:8030 — cancel order
fetch("/api/positions/cancel",{...,"X-API-Key":"8881"}...)
// pages.py:8317, 8322, 8325 — QA approve/reject/defer
apiPost('/api/qa/suggestion/'+id,{action:'approved',...,password:'8881'})
```
Working pattern already in use at lines 1812, 5987, 9087, 9176 etc.: `(window.API_KEY||"8881")`. The 5 remaining sites are untouched.
**Impact:** Key visible in page source; rotation silently breaks these 5 write paths with 401. Seven weeks unfixed.
**Recommendation:** Apply `(window.API_KEY||"8881")` to all 5 sites. ~10 min.
---
### [SCHEMA] P1 (carried 7 weeks — 2026-05-03 → 2026-06-14): 6 tables + 18 columns missing from `core/schema.sql`
**Files:** `core/database.py:1869`, `2062`, `2074`, `2174`, `2195`, `310`; `core/schema.sql`
**Evidence:**
```bash
grep -n "scalp_signal_log\|change_requests\|qa_report\|screener_result\|screener_run" core/schema.sql
# → zero results
```
Missing tables: `scalp_signal_log`, `change_requests`, `qa_reports`, `qa_suggestions`, `screener_results`, `screener_runs`. Missing ALTER TABLE columns on `trades` (`tick_peak_signed_vol`, `fri_ah_close_queued`) and 16 exit-research columns on `scalp_signal_log` (`price_300s`, `ret_300s`, `flow_30s/60s/120s/300s`, `score_30s/60s/120s/300s`, `mfe_30s/60s/120s/300s`, `mae_30s/60s/120s/300s`).
**Impact:** Fresh DB provision is silently broken. Disaster-recovery or new staging stand-up starts missing 6 tables; `_safe()` wrappers swallow subsequent errors. Seven weeks unfixed.
**Recommendation:** Add `CREATE TABLE IF NOT EXISTS` blocks for all 6 tables and the 18 missing ALTER TABLE columns to `schema.sql`. Establish convention: ALTER TABLE in `database.py` must land in `schema.sql` in the same commit.
---
### [CONFIG] P1 (carried 4 weeks — 2026-05-17 → 2026-06-14): `TV_BXT_TRAIL_AGAINST` default drift between live path and replay endpoint
**Files:** `bot.py:3775`, `bot.py:14802`
**Evidence:**
```python
# bot.py:3775 — _obv_trail_stop_hit (LIVE TRADING):
agnst = float(os.environ.get("TV_BXT_TRAIL_AGAINST", "1.0"))
# bot.py:14802 — api_trade_obv_trail (HISTORY REPLAY endpoint):
agnst = float(os.environ.get("TV_BXT_TRAIL_AGAINST", "1.5"))
```
**Impact:** When `TV_BXT_TRAIL_AGAINST` is unset (the default), the trade card's OBV-trail history panel reconstructs stops with a 1.5× ATR against-stop while the live engine ran 1.0×. Every closed-trade stop timeline in the UI is wrong by 50% of the against-trail width on the default path.
**Recommendation:** Change `bot.py:14802` default from `"1.5"` → `"1.0"`. One line, 30 seconds.
---
### [SECURITY] P1 (carried 4 weeks — 2026-05-17 → 2026-06-14): XFF first-hop bypass in `_tv_webhook_client_ip`
**Files:** `bot.py:3617-3626`
**Evidence:**
```python
def _tv_webhook_client_ip(self, req) -> str:
"""... X-Forwarded-For contains the original client IP (first entry)."""
xff = req.headers.get("X-Forwarded-For", "")
if xff:
return xff.split(",")[0].strip() # ← attacker-controlled first entry
return req.remote_addr or ""
```
`ProxyFix(x_for=1)` (bot.py:11389) already sets `request.remote_addr` to the verified client IP by consuming the rightmost Traefik-appended entry. The manual `.split(",")[0]` takes the leftmost entry — an attacker can prepend any TV relay IP to spoof `X-Forwarded-For: 52.89.214.238, <attacker_real_ip>` and bypass the allowlist check.
**Impact:** Defense-in-depth bypass. Shared-secret check (`_secrets.compare_digest`) still runs first; exploiting this also requires knowing the secret.
**Recommendation:** Replace `bot.py:3621-3623` with `return req.remote_addr or ""`. ProxyFix has already done the right thing. Update docstring. One line.
---
### [DOC] P1 (carried 1 week — 2026-06-07 → 2026-06-14): `DISABLE_DAILY_LOSS_LIMIT` absent from CLAUDE.md
**Files:** `core/risk.py:112`; `CLAUDE.md`
**Evidence:**
```bash
grep "DISABLE_DAILY_LOSS_LIMIT" CLAUDE.md # → zero results
```
`strategy_decisions.md` explicitly states: *"Hard re-enable the gate before any real-money promotion — this flag is NOT for prod."* That critical safety note exists nowhere in CLAUDE.md.
**Impact:** Any operator or AI session reading CLAUDE.md and deploying the dev docker-compose env block to prod will run with no daily drawdown limit on real money. CLAUDE.md is the first reference an operator reads.
**Recommendation:** Add to CLAUDE.md env-var table:
```
| DISABLE_DAILY_LOSS_LIMIT | "" (gate ON) | ⚠️ DEV ONLY — disables 5% NLV daily-loss circuit breaker. MUST be unset before real-money promotion. |
```
---
### [INFRA] P1 (new — 2026-06-14): `Dockerfile.oracle` exposes port 8083 — collides with main bot Flask server
**Files:** `Dockerfile:20`, `Dockerfile.oracle:12`; `oracle/config.py:56`
**Evidence:**
```dockerfile
# Dockerfile (main bot):
EXPOSE 8083
# Dockerfile.oracle (oracle sidecar):
EXPOSE 8083
```
```python
# oracle/config.py:56
HEALTH_PORT = int(os.environ.get("ORACLE_HEALTH_PORT", "8083"))
```
`Dockerfile.poly_ws` correctly uses 8084; `Dockerfile.ibkr_ws` correctly uses 8085. The oracle is the only sidecar that defaults to the same port as the main bot's Flask server. If docker-compose maps both services on port 8083 of the host, one will fail to bind.
**Impact:** Oracle health endpoint (`/health` on 8083) will collide with the main bot's Flask server if both are started on the same host without an explicit port override via `ORACLE_HEALTH_PORT`. On current dev/prod this may be masked by docker network isolation, but it's a landmine for any docker-compose port mapping.
**Recommendation:** Change `oracle/config.py:56` default from `"8083"` to `"8086"` (next available after ibkr_ws's 8085). Update `Dockerfile.oracle` EXPOSE to 8086. ~5 min.
---
### [DEP] P2 (carried 4 weeks — 2026-05-17 → 2026-06-14): `requirements-oracle.txt` uses unpinned version ranges
**Files:** `requirements-oracle.txt`
**Evidence:**
```
numpy>=1.24
pandas>=2.0
psycopg2-binary>=2.9
redis>=5.0
requests>=2.31
```
All other requirements files (`requirements.txt`, `requirements-ibkr_ws.txt`, `requirements-poly_ws.txt`) use `==` pins. The oracle sidecar is the only exception. A `pip install` today could pull `pandas 3.1` or `numpy 3.x` with breaking API changes.
**Recommendation:** Pin to currently-resolved versions. Run on the dev oracle container: `pip freeze | grep -E "numpy|pandas|psycopg2|redis|requests"` and hard-pin the output. ~5 min.
---
### [DOC] P2 (carried 4 weeks — 2026-05-17 → 2026-06-14): CLAUDE.md Architecture section stale (line counts + Polygon contradiction)
**Files:** `CLAUDE.md:6-11`, `CLAUDE.md:74-83`
**Evidence:**
```
CLAUDE.md:6: "bot.py ~10K lines" → actual: 20,646 lines (bot.py) + 12,207 lines (pages.py)
CLAUDE.md:74-83: "Polygon data layer — dev uses Polygon.io for bars + real-time prices"
+ "Production: IBKR for everything (no env var set)"
```
The Polygon "dev-only" description directly contradicts CLAUDE.md's own RVOL Policy section which states "active on both dev + prod." Code confirms `POLYGON_API_KEY` gates RVOL on both environments; `USE_POLYGON_DATA=true` is also prod-deployed per Architecture section. The "dev-only" framing is wrong.
Also still absent from the Architecture section: oracle sidecar, poly_ws sidecar, ibkr_ws sidecar, Day/Tone page, tape scanner, ENGINE selector.
**Recommendation (15 min):**
1. `CLAUDE.md:6`: update to "bot.py ~21K lines, pages.py ~12K lines"
2. Remove the Polygon "Production: IBKR for everything" line
3. Add sidecar sentence to Architecture: "Sidecars: oracle (regime), poly_ws (Polygon WS), ibkr_ws (IBKR WS) — each with its own Dockerfile.{name} and requirements-{name}.txt"
---
### [DOC] P2 (carried 4 weeks — 2026-05-17 → 2026-06-14): Friday EOD entry cutoff absent from CLAUDE.md Entry Time Blockers
**Files:** `CLAUDE.md:39-52`, `bot.py:4552-4558`
**Evidence:**
```python
# bot.py:4552-4558
if now_et.weekday() == 4 and t_min >= 15 * 60: # 15:00 ET = 12:00 PT
self._log_activity(sym, "FRI CUTOFF: no new entries Friday after 12:00 PM PT", "block")
return
```
The CLAUDE.md "Net effect" line says "RSI extreme runs RTH 07:00-13:00 PT always" — implying Friday PM is open. It isn't; the 12:00 PT Friday cutoff blocks all triggers including RSI extreme.
**Recommendation:** Add row to Entry Time Blockers table:
```
| Fri 12:00 PT (15:00 ET) onward | all entries blocked (weekend gap risk) | ALL triggers |
```
---
### [DOC] P2 (carried 4 weeks — 2026-05-17 → 2026-06-14): `TV_BXT_RTH_ONLY` flag name no longer describes its behavior
**Files:** `bot.py:4047-4065`; `docs/strategy_decisions.md`
**Evidence:**
```python
# bot.py:4047-4048:
# 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
```
Flag name implies "RTH only" (09:30-16:00 ET). Actual behavior allows pre-market (04:00-09:30 ET). The code comment acknowledges the mismatch but the docs don't. `strategy_decisions.md` entry still describes it as "gate entries to 09:30-16:00 ET."
**Recommendation:** Rename to `TV_BXT_SESSION_ONLY` with search-replace across bot.py + strategy_decisions.md, or add a clarifying CLAUDE.md note. Either way fix strategy_decisions.md description.
---
### [DOC] P2 (new — 2026-06-14): Day page hardcodes stale Claude model ID; UI label mismatches
**Files:** `bot.py:12114`, `pages.py:6246`
**Evidence:**
```python
# bot.py:12114 (api_day_analyze, NDJSON streaming path):
model="claude-sonnet-4-5-20250929",
```
```js
// pages.py:6246 (Sydnee chat card header):
html += '<span class="model">claude-sonnet-4-5</span>';
```
The current Sonnet generation is `claude-sonnet-4-6` (model ID: `claude-sonnet-4-6`). `claude-sonnet-4-5-20250929` is two generations behind. The Day page is the most user-visible AI surface — it streams to the dashboard on every page open. The UI label also shows the stale version to any user who inspects the card header.
**Impact:** Using an older model costs the same API tokens but produces lower-quality analysis. If Anthropic deprecates `claude-sonnet-4-5-20250929`, the Day page silently falls back to the CLI path (`_call_sydnee`) with no streaming.
**Recommendation:** Update `bot.py:12114` to `model="claude-sonnet-4-6"` and `pages.py:6246` to `claude-sonnet-4-6`. Two lines.
---
### [DOC] P2 (new — 2026-06-14): `CHANGELOG.md [Unreleased]` still empty — now 90 commits behind
**Files:** `CHANGELOG.md`
**Evidence:**
```
## [v1.1] - 2026-04-13
## [Unreleased - dev branch] ← no entries
```
This week alone: 43+