◆ WHAT'S NEW

Release notes — Swing Deck v5.0 → v7.8

Reverse-chronological log of every meaningful release since v5.0. Each section covers what shipped, why, and where to find it in the dashboard. Latest first. v7.8 release window: June 1, 2026 — currently in dev branch (80+ commits stacked locally), public .dmg ships when GitHub Actions quota refreshes.

v7.8 — Portfolio Truth · Standalone Mac app · 24/7 daemons · broker hardening · May 2026

The largest single architectural push in the project's life. v7.8 reframes Swing Deck from "a dashboard you open in a browser tab" to "a Mac app whose brain runs 24/7." Four major themes, ~80 patch releases on top, all gated for the June 1, 2026 public-release window (CI quota frozen until then).

Net effect of v7.8: Swing Deck is now a proper standalone Mac app whose brain runs 24/7. The dashboard window becomes optional viewing surface, not a critical-path runtime. Broker truth is real-time and reconciled. Six bug-class fixes captured in pin tests so they can't regress (file-wide regex pins + AST introspection in tests/test_etrade_endpoint_pinning.py and tests/test_audit_loop_isolation.py). 16+ commits stacked locally; public release waits on CI quota refresh.

v7.4 → v7.7 — R:R framework cleanup · calibration upgrades · Control Panel + Daemons infrastructure · April → early May 2026

Four-line arc that solidified the methodology layer and the operational dashboard before v7.8 added the new architectural surfaces on top. v7.4 closed the long-running R:R fix-revert-refix loop. v7.5 added the data-quality envelope. v7.6 modernized the Control Panel. v7.7 unified the Daemons grid.

v7.0 → v7.3 — v7.0 milestone · UX feature wave · cash bookkeeping triple · March → April 2026

Mid-arc work that established the v7.x framing. v7.0 closed the v6.x line and captured 6 bug-class lessons. v7.1 shipped a UX feature wave (charts, alerts, calendar, screener, compare). v7.2 added per-setup expectancy tracking. v7.3 fixed a series of cash-bookkeeping bugs that surfaced once positions.json became the canonical share-state source.

v6.6 → v6.7 — Dashboard display contract · swing-candidate scanner funnel · threshold-citation hardening · early April 2026

Two minors that connected the v6.5 critical-gaps batch to the v7.x architecture. v6.6 unified how analytics surfaces read state. v6.7 brought the scanner funnel + hardened the AI coach narratives against threshold drift.

v6.5.2 → v6.5.15 — Hardening sweep + UX optimization passes · 2026-04-29 → 2026-04-30

Fourteen patch releases on top of v6.5.1 across two days. No new AI surfaces in the run, no breaking changes. The work split into four themes: (1) a 36-bug sweep across the framework; (2) Windows-installer firefighting; (3) UX cleanup that removed four duplicate panes and tightened the topbar; (4) two systematic audit passes (tooltip coverage + Performance section A+B optimization) that brought every dashboard card surface to consistent quality.

Net effect by end of v6.5.15: every audited card surface has tooltips on every badge, chip, and data point that informs a decision; zero native title= attrs (full data-tip consistency); two recurring framework bugs catalogued (timezone anchoring + atomic writes) so future patches don't reintroduce them. The honest enumeration count is now ten AI surfaces — Options Coach (v6.6) is the tenth, after AI Thesis · Devil's Advocate · Pillar Coach · Exit Coach · Entry Coach · Position Audit · Catalyst Interpreter · Whale Confirmation Coach (v6.3) · Trap & Structure Coach (v6.4).

v6.5.1 — Hardening + E*TRADE quotes · 2026-04-28

Twelve commits on top of v6.5.0. No breaking changes, no new AI surfaces. Mostly hardening — quote-cascade redundancy, audit-cadence calibration, market-session-aware budget rollover — plus a few user-visible polish items that were sitting in the v6.5 backlog.

The rest of v6.5.1 is internal: server-side single-instance gate on broker writes (409 stale_session for writes from a stale tab), a topbar live-dot fix that anchors to the actual audit timestamp, and a Risk Pulse cleanup so non-broker users don't see a false "FEED DOWN: Tradier" flag.

v6.5 — Critical-gaps batch · 2026-04-28

v6.5 closes the structural and contextual gaps the framework needed before the v6.6 synthesis layer can stack signals cleanly. Six chips and a hard R:R floor — all deterministic, all surface-bound, none of them new AI surfaces. The eight-surface count is unchanged.

All v6.5 chips are deterministic and surface-bound. No LLM calls. They feed the eight existing AI surfaces as additional context (the trap coach already reads gamma walls and float/short into its reasoning) and are also visible directly on every position card.

v6.4 — Trap & Structure Coach · 2026-04-27

The Trap & Structure Coach was the eighth-shipped of ten per-ticker AI surfaces and the first to issue a direct entry verdict (OK / WAIT / AVOID), not just narrate state. It classifies the current bar into one of five structural states — TRAP (failed breakout/breakdown), FADE (rejection at level), CHASE (extended without consolidation), CLEAN (orderly trend), NEUTRAL — using ten local-compute support/resistance level sources collapsed via 0.15× ATR confluence merging. Read the full surface spec on the AI surfaces page.

Calibration on 8 tickers showed zero hallucinations and a 37.5% AI-override rate vs. the framework alone — meaning roughly 1 in 3 framework-valid breakouts get re-classified as structural traps before the trader fires. For the launch story, see Hidden Tape v2 ships.

Also in v6.4: Founding 100 program opens at $14.50/mo (50% off Pro forever) for the first 100 customers. Live counter on /pricing.

v6.4.2 — Operational hardening

v6.5.0a — SEC Form 4 insider activity · 2026-04-26

Per-ticker insider activity from SEC EDGAR Form 4 filings, surfaced as a chip on every position card. The chip color-codes the most recent 90 days of insider transactions: EXTREME_SELLING / HEAVY_SELLING / MODERATE_SELLING / NEUTRAL / MODERATE_BUYING / HEAVY_BUYING. Click for the top-5 transaction list with venue, side, dollar amount, and 10b5-1 plan flag.

The fetcher uses the public SEC EDGAR API (free, no key required) with a 24-hour ticker cache plus indefinite per-accession cache. Calibration on PLTR identified a $435M insider-selling pattern the framework alone would have missed entirely — this surface is what catches that.

v6.3 — Whale Confirmation Coach · 2026-04-25

The seventh per-ticker AI surface and the first that goes outside the framework's input boundary on purpose. The framework's whale-sentiment sub-score (Point 5 of the 11-point indicator framework) was previously a closed loop — framework computes it from public price/volume/options data, then narrates those same scores back. v6.3 closes the loop: the AI runs web_search against SEC filings, reputable financial press, and dark-pool reports to verify or contradict what the framework "thinks" institutional flow looks like. Verdicts: CONFIRMED / CONFLICT / WEAK SIGNAL.

Hard requirement: every external claim must cite a URL. Server-side validator strips any URL not present in the web_search result set before returning. Override rate observed in calibration: 37.5% — the AI corrected the framework's whale read on 3 of 8 tickers. See the surface spec.

v6.2 — Dryrun mode + broker safety · 2026-04-22

BROKER_MODE=dryrun short-circuits all place and cancel calls so they log the intent but never hit the broker; preview still runs against real prod for full validation. Combined with the 8-layer pre-flight check in broker_guard.py (audit-freshness, confirm-token, position-size cap, risk-budget cap, options-level enforcement, halt check, dry-run window for new accounts, idempotency keys), this is what "discipline as a process" looks like at the broker boundary.

Also in v6.2: circuit breaker on the order pipeline — trips after 3 consecutive 5xx and locks for 30 min cooldown so a flaky upstream can't be hammered into a worse state.

v6.1 — Atomic order placement · 2026-04-19

Native order placement against E*TRADE: equity entries (BUY / SELL / SELL_SHORT / BUY_TO_COVER), single-leg options (BUY_OPEN / SELL_OPEN / BUY_CLOSE / SELL_CLOSE), multi-leg shapes (vertical spreads, iron condors, butterflies, calendars, diagonals), bracketed entry+SL combos, and TP ladder management. Every order goes through the same preview→confirm→place flow with idempotency keys and tamper-evident logging.


Everything below this line shipped in v5.0 → v5.7 (April 2026). It's still the foundation of everything above — the v6.x releases add to v5.x, they don't replace it.

v5.0 — Status Light: one signal per position

v4.x showed an 11-cell radar chart per ticker — technically correct, mentally exhausting. v5.0 keeps that grid (click any card to expand), but shows one color per ticker above it. Glance 30 positions in 2 seconds.

STATE MEANING ACTION
🟢 ARMEDFilter pass + price-action trigger fired + all pillars clearEnter now (or queue the order)
🔵 HOLDOwned, score ≥ 75, no pillar breachNothing — position is healthy
🟡 WATCHQualified by filter, no trigger yetWait — the moment hasn't arrived
🟠 TIGHTENOwned but degrading — score 60-74 or pillar cautionRaise stop or reduce size
🔴 EXITOwned + hard pillar breach OR score < 60Rotate to cash
⚫ COLDFilter fail — don't openSkip

Hover the status badge to see the 4-layer tooltip: macro regime, sentiment (VIX), indicator score, price-action triggers. Each layer's stance explained in one line.

Price-Action Triggers — 11 primitives

Every 60 seconds during market hours (30s during the 9:30-10:30 ET opening window), the engine runs every ticker in your portfolio through 11 price-action primitives. Each fire is logged, scored 0-100, and surfaced through the status-light system.

The 11 primitives:

PRIMITIVE FIRES WHEN
inside_dayToday's range is fully inside yesterday's — coil
n_day_breakoutClose above prior 20-day high
volume_expansionToday's volume ≥ 1.5× the 20-day average
pullback_bounceTagged 20-EMA within 3 bars and bouncing on volume
vwap_reclaimIntraday: lost session VWAP, then reclaimed
bearish_divergencePrice HH + RSI LH — exhaustion
bullish_divergencePrice LL + RSI HL — reversal precursor
liquidity_sweep_reclaimPunched a swing high/low on ≥1.4× vol, snapped back
bull_flagSharp pole + tight flag + volume break
engulfing_reversalToday's body engulfs yesterday's with ≥1.3× volume
gap_and_goOpen > yday high, close in upper third, ≥1.2× volume
key_level_reclaimBroke support, stayed below ≥2 bars, reclaimed on volume

Every fire also has a strength score 0-100 and a one-line narrative. The minimum strength to promote WATCH → ARMED is 20 (auto-tuned per-primitive after 10+ samples; see Per-User Calibration).

Expand any ticker card to see which primitives fired today with their narratives. Every fire is also logged to trigger_fires.log in your swing-audit directory for audit.

Focus Mode

The FOCUS chip in the action strip collapses the dashboard to only positions that need action: ARMED, TIGHTEN, EXIT. Most of the time, that list is empty.

Use this as your default screen during market hours. Discipline is doing nothing when nothing needs doing.

Click again to restore the full view. State is persisted to localStorage.

AI Thesis (BYOK)

Every ticker card now has a collapsible ✨ AI THESIS panel. Expand it and the engine generates a one-paragraph thesis grounded in your live Swing Deck data: filter score, which triggers fired today, active pillar violations, macro regime, historical primitive hit rate, and consensus from other Premium users.

BYOK — bring your own LLM key. No data leaves your machine except to the provider you choose with your own key. Supports:

Configuration

Add to your .env:

AI_THESIS_ENABLED=true
AI_THESIS_PROVIDER=openai
AI_THESIS_API_KEY=sk-...
AI_THESIS_MODEL=gpt-4o-mini

For Anthropic:

AI_THESIS_PROVIDER=anthropic
AI_THESIS_API_KEY=sk-ant-...
AI_THESIS_MODEL=claude-3-5-haiku-latest

For Ollama (free, local):

AI_THESIS_PROVIDER=openai
AI_THESIS_API_KEY=ollama
AI_THESIS_BASE_URL=http://localhost:11434/v1
AI_THESIS_MODEL=llama3.2

Feedback buttons

Every generated thesis has a row of buttons: 👍 👎 shorter longer +macro +price ↻. Each click tunes the prompt for you — length, focus weights, tone. After 50 interactions your thesis reads differently from anyone else's. The preferences are stored in ai_thesis_prefs.json (gitignored, local only).

Reset any time at POST /thesis/ai/reset. Check current state at GET /thesis/ai/status.

Daily Briefing Email

Every weekday at 6:25 AM MST (1 hour before US market open), the local dashboard computes your portfolio state and POSTs it to api.swing-deck.com, which formats and sends an email via Resend.

The email shows:

If nothing needs action: "◆ ALL POSITIONS HEALTHY · NOTHING REQUIRES ACTION". Discipline is doing nothing when nothing needs doing.

Configuration

Requires a valid license with alerts_email entitlement. Controlled by:

DAILY_BRIEFING_ENABLED=true

Test it manually without waiting for 6:25 AM:

curl http://localhost:8001/briefing/preview    # see the JSON payload
curl http://localhost:8001/briefing/send-now  # fire it now

Per-User Calibration Warmup

Over your first 30 days, the engine learns which price-action primitives work for you. Every fire is logged with entry price. At +5 bars (≈1 trading week), each fire is graded: win if price is up ≥ 2%, loss if down ≥ 2%.

Once a primitive has ≥10 graded outcomes, the auto-tuner adjusts its strength gate:

Bounded [10..50] so the engine never fully silences or floods you. Check progress at:

curl http://localhost:8001/calibration/status | python3 -m json.tool

Why this is a moat: by day 31, your engine is tuned to your portfolio, your regime exposure, and your broker's fill quality. Switching to a competitor means starting over — pure switching cost.

Public Track Record

The owner's local dashboard publishes a daily snapshot of notable fires to swing-deck.com/track-record. Every ARMED / EXIT / TIGHTEN fire is publicly auditable with date, ticker, primitive, strength, and narrative.

This is a trust moat. Anyone can verify what the system said at the time — no retroactive editing. The publish is owner-only; regular users don't publish.

To opt in as the owner:

# In your local .env
TRACK_RECORD_PUBLISH=true

# On Railway (for your swingdeck-api)
TRACK_RECORD_OWNER_KEY=SWING-XXXX-XXXX-XXXX

Consensus Network

Every 60 seconds, your local dashboard submits anonymized trigger fires to /api/consensus/submit. The payload contains ticker + primitive + strength + state — nothing else. No portfolio size, no P&L, no IP.

User identity is hashed via SHA-256 of the license key. Aggregate reads are gated by a k-anonymity floor of 5 users — we never return data that could identify an individual.

Query the crowd:

GET /api/consensus/ticker/NVDA
GET /api/consensus/top

Example response — "73% of Premium users are ARMED on NVDA right now, top primitive n_day_breakout." Available in the AI thesis context automatically once there are ≥5 users firing on that ticker.

Mobile PWA

Every page on swing-deck.com is now a Progressive Web App. On iOS Safari or Android Chrome, tap Share → Add to Home Screen. The site installs as a standalone app with:

Works best for checking the track record + blog on mobile. The dashboard itself (localhost:8001) is still desktop-only.

v5 Environment Variables Reference

Full list of new env vars in v5.0. All optional — defaults work out of the box.

VAR DEFAULT NOTES
TRIGGER_LAYER_ENABLEDtrueMaster switch for the price-action engine
TRIGGER_LOOP_SEC60Base cadence during market hours
TRIGGER_OPENING_SEC309:30-10:30 ET cadence
DAILY_BRIEFING_ENABLEDtrue6:25 AM MST weekday email
TRACK_RECORD_PUBLISHfalseOwner-only; keep false for users
AI_THESIS_ENABLEDtrueMaster switch for thesis panel
AI_THESIS_PROVIDERopenaiopenai / anthropic
AI_THESIS_API_KEY(required)BYOK. Empty = thesis panel shows config error
AI_THESIS_MODELgpt-4o-miniAny model your provider serves
AI_THESIS_BASE_URL(empty)Override for Ollama/self-hosted

See also: v5.0 API endpoints · Troubleshooting

◆ READ NEXT

The framework: indicators filter, price action triggers →

v5.0 release notes — full changelog →

Broker setup — E*TRADE OAuth + Tradier →