◆ AI SURFACES (V6.7)

The eleven AI surfaces in Swing Deck

v5.7 introduced seven per-ticker AI surfaces; v6.3 → v6.6 added three more; v6.7 added the eleventh as the LLM layer of the new market-scanner funnel. The current count is eleven: AI Thesis, Devil's Advocate, Pillar Coach, Exit Coach, Entry Coach, Position Audit, Catalyst Interpreter, plus Whale Confirmation Coach (v6.3), Trap & Structure Coach (v6.4), Options Coach (v6.6), and Scanner Narration (v6.7.8). The first ten are per-ticker surfaces grouped by trade-lifecycle role; the eleventh is part of the separate scanner funnel and explains why a name surfaced from the algorithmic Layer 1 ranker. Each surface fires on a specific framework moment, narrates in the framework's voice, and stays out of the way until it's needed. There is no chat box and no free-text prompt by design. For the philosophy behind this decision, read Six AI surfaces, zero chat boxes. This page is the reference for what each surface does, when it appears, and what data it sees.

Surface-bound principle

Every AI surface in Swing Deck obeys five rules:

  1. Triggered, not summoned. The user doesn't choose when AI appears. The framework does.
  2. Bounded inputs. Each surface receives only the data relevant to the moment it's narrating. There is no global context window of "the user's entire trading history."
  3. Bounded outputs. Every response has a known structure (paragraph length, point count, mandatory anchors). No drift, no advice-sounding language, no speculation.
  4. Auditable. Every output traces to defined inputs. The same inputs produce a similar output. Cache fingerprints invalidate only when inputs materially change.
  5. Logged. Every successful generation appends a record to a single append-only JSONL log (ai_thesis_log.jsonl) with a kind discriminator. One source of truth, queryable from the dashboard's history modal.

All AI surfaces below derive from a single backend module (ai_thesis.py) with a registry-driven coach pattern. Adding a new AI surface is a registry entry, not a new file — the v6.7.8 Scanner Narration was added to the registry without touching any other coach.

① Always-on — default-visible per ticker

AI Thesis

✨ AI THESIS — the framework's interpretation, in your style

Reveal conditionAlways available on every ticker card
ColorGold
Cache key{ticker}:{state}-{score}-{trigger_count}
InputsTicker score / grade / state / triggers / pillar violations / 30d hit rate / macro context (VIX, oil, regime) / consensus (if licensed) / user preferences (length, focus weights, tone)
Output shapeSingle paragraph (40-220 words depending on user preference). No bullet structure.
PersonalizationSix feedback pills: 👍 / 👎 / shorter / longer / +macro / +price. Each click updates user preferences in ai_thesis_prefs.json. Future generations honor those preferences.
EndpointGET /thesis/ai/generate?ticker=X&force=0|1

Unlike the coaches, the AI Thesis is styled to the user. The pills let the user nudge the writing toward their preferred density and emphasis. This is the only AI surface in Swing Deck that personalizes. The others are framework voice and cannot be tuned by user feedback — that's a feature, not a limitation.

Devil's Advocate

⚖ DEVIL'S ADVOCATE — argues the opposite of the framework's conclusion

Reveal conditionAlways available. Auto-pairs with AI Thesis — clicking either header expands both panels and triggers both LLM calls in parallel. The discipline play: every framework conclusion gets a contrarian voice automatically, no opt-in.
ColorPurple
Direction logic EXIT → argue why exit may be premature (bull case)
TIGHTEN → argue why tightening is overcaution
ARMED → argue why entering is risky (bear case)
HOLD → argue against complacency — what could break
WATCH → pick the side the data tilts toward, or stand-aside
(unknown) → fall back to indicator bias as direction signal
Cache key{bias}-{state}-{score}-{trigger_count} — busts on state flip too
Header sublabelShows the framework's actual conclusion: · framework: EXIT
Output shape3 numbered points: incomplete-read reason · surprise data point · action if counter-view is right.
EndpointGET /coach/advocate/generate?ticker=X&force=0|1

State drives the direction, not indicator bias. The position-level conclusion (state) is the actionable signal the trader sees; bias is the indicator-level reading. These can disagree (a ticker can be in EXIT state while indicators are still bullish). The Devil's Advocate counters what the trader will act on, not what the indicators say.

② Trade lifecycle — fires at decision moments

Pillar Coach

⚠ PILLAR COACH — narrates active vetoes

Reveal conditionState ∈ {EXIT, TIGHTEN, WATCH} OR pillar_violations is non-empty
ColorRed
Header sublabelSurfaces violated pillars at-a-glance: · P6 P7 or · TIGHTEN
InputsPillar IDs + framework's terse reason + ticker state + score + sleeve + active triggers
Output shape3-sentence structure: framework's conclusion · the data that triggered it · framework's recommendation. 60-100 words.
System prompt forbids"Consult an advisor" · "do your own research" · disclaimer language · speculation beyond data
EndpointGET /coach/pillar/generate?ticker=X&force=0|1

The Pillar Coach maps pillar IDs to human names internally (P3 → Pre-Market Firewall, P7 → Stop Breach, etc.) so the LLM sees both the framework code and the plain-English meaning. When multiple pillars fire, the coach addresses the dominant cause (the primary field from the position-state classifier) and mentions secondary violations as supporting context.

Entry Coach

▲ ENTRY COACH — armed-trigger narrator

Reveal conditionUnowned position (shares == 0) AND entry_trigger.ready === true
ColorGreen
Header sublabelSetup type + check count: · pullback_to_ma · 4/4 checks
InputsTicker price / score / state / sleeve / entry-trigger setup type / individual check pass-fail list / earnings proximity
Output shape3 sentences: qualifying signal · framework size suggestion · caveats (earnings within window, sector tilt, etc.)
System prompt forbidsThe word "opportunity" · inflating language · making the trade sound easier than it is
EndpointGET /coach/entry/generate?ticker=X&force=0|1

The Entry Coach explicitly says: "the trader has fired the trigger; the coach's role is to confirm or temper, never inflate." If a caveat materially weakens the setup — earnings in 12 sessions, a sector that's already over-allocated — the coach says so plainly.

Exit Coach

◆ EXIT COACH — TP/stop-breach narrator

Reveal conditionOwned position (shares > 0) AND (price ≥ any TP rung OR price < chandelier stop)
ColorAmber
Header sublabel· TP1 HIT / · TP2 HIT / · STOP BREACHED
InputsTicker price / score / state / sleeve / TP ladder (TP1, TP2, TP3 with scale-out percentages) / chandelier stop / which rung was hit / triggers
Output shape3 sentences anchored on dollar amounts: what just happened (TP rung or stop) · ladder math (40/40/20 scaling) · price reference vs entry.
EndpointGET /coach/exit/generate?ticker=X&force=0|1

The chandelier stop (22-day high − 3 × ATR) is the framework's reference stop. If the user's manual stop is below chandelier, the position is already too loose — an exit-coach-worthy event in itself. The coach uses chandelier as the reference even when the user's stop hasn't yet been touched, because the framework's stop is what would have been recommended.

Trap & Structure Coach (NEW · v6.4)

🪤 TRAP & STRUCTURE COACH — classifies the current bar's structural state + gates entries

Reveal conditionAlways available on every ticker card with sufficient bar history (≥60 daily bars)
ColorPurple
What it doesClassifies the current bar into one of five structural states: TRAP (failed breakout/breakdown), FADE (rejection at level), CHASE (extended without consolidation), CLEAN (orderly trend), or NEUTRAL (no clear read). Then issues a per-bar entry verdict: OK / WAIT / AVOID.
10 local-compute S/R sourcesPivot points · prior-day high/low · prior-week high/low · 20/50/200 SMA · VWAP · volume profile HVN/LVN bins (60-bar lookback) · gap edges · swept highs/lows · psychological round numbers. All levels collapse via 0.15× ATR confluence merging.
InputsOHLCV (60+ bars) / RSI(14) state with smoothed momentum direction (rising / flat / rolling_down / falling) / geometry tags (gap / swept_high / swept_low / inside_day / engulfing) / Polygon + Databento tape-lean at primary levels / current price vs. confluence-merged S/R levels
Output shapeFive labeled sections: ◆ STRUCTURE (level map with current price marker) · ◆ EXHAUSTION (RSI + momentum) · ◆ TAPE (volume signature at primary level) · ◆ STATE (the classification + reasoning) · ◆ VERDICT (OK/WAIT/AVOID with reason). Optional better_entries array suggests alternative price levels.
Hallucination guardValidator checks every cited price against the known-levels set with 0.5% tolerance; any reference to a price not in the level map is rejected before return. AAPL calibration confirmed zero hallucinations after the tolerance bump from 0.1% → 0.5%.
EndpointGET /coach/trap_structure/generate?ticker=X&force=0|1

The Trap & Structure Coach is the first AI surface that issues a direct entry verdict (OK / WAIT / AVOID), not just narrates state. It's intended to be read before firing an entry trigger from the 11 price-action primitives — the framework triggers can fire valid breakouts that are also structurally traps. Calibration on 8 tickers showed AI-overrode-framework on 37.5% of cases, all of them subsequently validated by post-trade outcome.

③ Context & discipline — sanity checks beyond the immediate trade

Whale Confirmation Coach (NEW · v6.3)

🐋 WHALE CONFIRMATION COACH — AI cross-checks framework whale signals against external sources

Reveal conditionFramework's whale_sentiment sub-score (Point 5 of the 11-point framework) is non-trivial AND the user has Anthropic API access (BYOK Claude key configured in Settings)
ColorCyan
Why it existsThe original Hidden Tape Coach (v5.8) was a closed loop — the framework computed whale sub-scores from public price/volume/options data, then narrated those same scores back. There was no external check. 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.
InputsTicker / framework whale_sentiment score / OBV / volume ratio / dark-pool activity tag / options sweep detection / web_search results (filtered to last 7 days)
Output shapeThree labeled sections: ◆ FRAMEWORK SAYS · ◆ EXTERNAL EVIDENCE · ◆ VERDICT (CONFIRMED / CONFLICT / WEAK SIGNAL). Hard requirement: every external claim must cite a URL.
Hallucination guardServer-side validator strips any URL not present in the web_search result set before returning. Override rate observed in calibration: 37.5% (3 of 8 tickers had AI-corrected verdicts vs. framework alone).
EndpointGET /coach/whale_confirmation/generate?ticker=X&force=0|1

The Whale Confirmation Coach is the first surface that goes outside the framework's input boundary on purpose. The other coaches narrate from defined local inputs; this one is allowed to fetch fresh web data because the failure mode being guarded against is "the framework tells itself a story." Calibration on PLTR found a $435M insider-selling pattern the framework alone would have missed entirely — that's the whole reason this surface exists.

Catalyst Interpreter

📰 CATALYST INTERPRETER — news signal vs noise

Reveal conditionTicker has ≥1 news headline today (via /news data-provider cascade)
ColorBlue
Header sublabelLive count: · 8 headlines today
InputsUp to 12 headlines: title + publisher + date + source tier; ticker context (price, score, state, regime)
Material rules (signal)Earnings results / guidance change / analyst-day reset / M&A / regulatory action / major contract or customer event / insider buying or selling at scale / macro headlines that mechanically affect the ticker's sector
Noise rulesPrice-change recaps · generic analyst chatter without rating change · reblog/aggregator headlines · macro that doesn't mechanically affect this ticker · "every investor should..." clickbait
Output shape3 lines: classification (N total, M material, K noise) · most material item with publisher + direction + magnitude · framework action anchored to current state
EndpointGET /coach/catalyst/generate?ticker=X&force=0|1

The interpreter is ruthless about classification by design. On any given day, most headlines for any given ticker are noise. The interpreter's job is to make filtering effortless — the trader reads one paragraph instead of scanning twelve headlines.

Critically, when the framework state and the news disagree (e.g., framework says EXIT but news brought a guidance raise + analyst upgrade), the interpreter surfaces the conflict and says exactly what to verify before re-acting. It doesn't flip the trade for you.

Position Audit

📊 POSITION AUDIT — the discipline mirror

Reveal conditionTicker has ≥1 prior AI thesis OR ≥1 trade journal entry
ColorCyan
EndpointPOST /coach/audit/generate — CSRF-protected; body includes {ticker, force, journal: [...]}
Phase 1 (5.7.4)Reads server-side data: thesis log filtered to kind=thesis + audit_history snapshots (last 60) + current state. Surfaces score drift, thesis evolution, state stability.
Phase 2 (5.7.5)Adds the user's local trade journal via POST body. Computes win/loss split, win rate, avg P/L %, max win/max loss, avg hold days, avg entry/exit prices, last 5 trades by date. Surfaces fills-vs-thesis divergence ("selling TP1 rung on two trades, holding a loss on one").
PrivacyJournal data is POSTed to localhost:8001 only. Never persisted server-side — used for prompt assembly, then discarded. Journal storage stays in browser localStorage.
Output shape3 observations: clearest pattern · drift signal · framework suggestion. 80-150 words.

This is the local-first AI moat. Cloud-hosted competitors cannot read your fills + your prior theses + your framework state and tell you "low conviction masquerading as activity." They don't have the data. Position Audit makes the trader's behavior the AI's primary input, which is only possible because the journal lives on your machine and nowhere else.

The system prompt explicitly affirms correct restraint when the data shows it. If the trader is appropriately avoiding a low-quality setup, the audit says "restraint (EXIT) is correct." It doesn't manufacture fault.

④ Options — derivatives sleeve narrator

Options Coach (NEW · v6.6)

⚙ OPTIONS COACH — narrates the 13-pt options audit when one of eight structural triggers fires

Reveal conditionOne of eight structural triggers fires on the 13-pt options audit. Coach panel stays hidden when nothing's actionable — same Surface-Bound principle as Trap & Structure, no chat box.
ColorOrange
Scope lockStrict Level 1-2 single-leg only (Long Call · Long Put · CSP · Covered Call · Protective Put). Actively redirects any inferred Level 3 (spreads) or Level 4 (naked) implication back to the single-leg equivalent + explains the execution-risk + unlimited-risk reasoning. Spreads add fill risk; naked sells add unlimited-risk + margin-call exposure.
The eight triggers armor_floor_breach (CSP/CC collateral pushes armor below floor) · vix_trap (long premium with Δ < 0.80 while VIX < 25 — theta will burn ~60% of premium) · earnings_in_dte (selected expiration spans an earnings event) · strategy_equity_mismatch (selling premium on a C/D/F-graded equity) · vix_regime_cross (VIX crossed 25 — premium-buy ↔ premium-sell mode flip) · no_qualifying_setup (audit ran but no tradeable contract) · entry_blocked (setup found BUT OPT score < 70 entry gate) · entry_ready (OPT score ≥ 80 + qualifying setup). One fires as trigger_fired; others land in triggers_also_fired for AI context, so the most-specific reason narrates first.
Inputs13-pt options sub-pillar scores (Stru / Mome / VIX / Volu / Swee / Trap / Exec / Sizi / Ener / Macr / IV-R / Δ-θ / Prof) · selected best_setup (strike / Δ / premium / DTE / armor_post_pct) · current strategy + VIX + prior_vix + equity grade. No web_search — pure framework synthesis.
Output shapeJSON validated by hallucination guard: trigger_fired (must be in VALID_TRIGGER_SET and must have actually fired — can't invent), triggers_also_fired, 2-4 sentence narrative, ≤6-word recommended_action, optional scope_warning (Level-3/4 redirect), sources array (audit trail with literal framework values), confidence.
Hallucination guardValidator refuses any trigger_fired that isn't in VALID_TRIGGER_SET or wasn't actually fired by the deterministic detect_triggers pass. AI can't invent a trigger to justify a verdict.
EndpointGET /coach/options/generate?ticker=X&force=0|1
Cost~$0.003-$0.04/call (Haiku 4.5, no web_search). Calibration on AAPL entry_blocked trigger logged $0.003 narrations — ~10× under the docstring's $0.02-0.04 target.

Options Coach closes the gap left by the existing Pillar / Exit / Entry coaches, which all narrate the equity audit. Pre-v6.6 the 13-pt options panel had a 13-pt score and a setup but no narrator — users had to interpret the sub-pillar grid themselves. The coach reads that grid + the macro context (VIX, regime, earnings calendar, armor-floor state) and explains what's actionable. The entry_blocked trigger added in v6.6.x specifically handles the "setup found but score-gated" case — e.g. AAPL with a $260 Δ 0.935 13-DTE call but composite score 60/100. Coach narrates which sub-pillars dragged the composite below the 70 entry gate (in that case Sweeps 2/10 + IV-Rank 1/10 — whale flow against the long-premium direction + premium historically skinny) and recommends a specific pillar threshold to wait on ("Wait for RSI reset or VIX spike").

Scanner Funnel (NEW · v6.7.8) — top-of-funnel discovery, separate workflow from the per-ticker surfaces above

The market scanner is a three-layer top-of-funnel surface. Layers 1 + 2 are purely algorithmic — the framework's hard line is that AI never picks names. Layer 3 narrates why a name surfaced after the algorithm ranked it. The narration is the only LLM call in the funnel, and it counts toward your LLM cost badge — Layers 1 + 2 stay at zero.

Scanner Narration (NEW · v6.7.8)

💬 SCANNER NARRATION — explains which signals carried a scanner result's rank

The Layer 1 scanner ranks 30 curated names by a weighted blend of five cheap signals (relative strength · volume surge · breakout proximity · sector tilt · momentum). The Scanner Narrator reads that result and explains, in 50–90 words, which signals actually carried the rank for a specific ticker. It does not pick names — the scanner already did. It does not recommend buying — entry is decided by the full 11-point audit, not the scanner. It does not invent framework gates — the threshold-citation guard binds.

Reveal conditionUser clicks the 💬 Why button on any row of the Scanner Results table inside ② MARKET SCAN → 🔭 Scanner. Cached server-side per (composite + RS + volume + breakout) signal-band, so re-clicking a stable ranking is free.
ColorPurple
InputsComposite scanner score, rank in scan, sector ETF benchmark, all five per-signal scores (0–100), raw market context (price, 5d change, 20d change, volume ratio, % off 52-wk high), and the methodology weights so the LLM can attribute share if it chooses.
Output shape3 sentences: (1) the strongest signal carrying the rank, named with its score; (2) supporting signal or qualifier if one signal is doing heavy lifting; (3) explicit instruction to promote to candidates for the full 11-point audit before considering entry.
Cost classPer click. Layers 1 + 2 of the scanner are 0 LLM calls; this surface is the funnel's only LLM cost. Cached aggressively. Counts toward the LLM cost badge.
EndpointGET /scan/narrate/<TICKER>?force=0|1
EXAMPLE · AMD · rank #1 of 23 · composite 83.4
AMD ranks #1 on RS rank 100/100 — relative-strength leader vs SPY and SMH on the IBD-style composite. Volume surge of 1.8× the 20-day average backs the move, though breakout proximity is weaker at 38/100, so this reads as momentum-not-breakout. Worth promoting to candidates for the 11-point audit; the scanner is upstream of the entry gate.

Scanner Narration is the only LLM-touching surface in the otherwise-algorithmic scanner funnel. The threshold-citation guard from v6.7.0 binds especially hard here — the LLM cites the exact composite + per-signal numbers it was given, never invents framework gates ("this would clear the 80-point gate" is wrong because the scanner is upstream of the entry gate, not gated by it). Layer 1 (universe scoring) and Layer 2 (Recommended Moves panel that suggests promote/demote/remove based on the live audit + per-ticker score history) are 100% deterministic and add zero LLM cost.

v6.5 chips — deterministic, surface-bound, no LLM (NEW · v6.5)

The v6.5 release adds five per-ticker chips on the position card. They are not new AI surfaces — the count is still ten. Chips are deterministic readings the framework computes from public data; the AI surfaces above read these chips as additional context, but each chip is also visible on its own. Listed here because this page is the canonical reference for what the dashboard puts in front of the trader.

📅 INSIDER ACTIVITY — with 10b5-1 distinction

SourceSEC EDGAR Form 4 (free, no key). 24-hour ticker cache + indefinite per-accession cache.
WindowLast 90 days of insider transactions
StatesEXTREME_SELLING / HEAVY_SELLING / MODERATE_SELLING / SCHEDULED_SELLING / NEUTRAL / MODERATE_BUYING / HEAVY_BUYING
10b5-1 rule (v6.5)If ≥80% of dollar-volume sits under disclosed 10b5-1 plans, the chip flips to SCHEDULED_SELLING (cyan / 📅) instead of EXTREME_SELLING. Pre-scheduled plan sales are calendar-driven, not bearish — the framework needs to see them as different.
Click behaviorTop-5 transaction list with venue, side, dollar amount, and 10b5-1 plan flag

📉 FLOAT / SHORT INTEREST (v6.5.0b)

Sourceyfinance + FINRA semi-monthly short-interest reports
SurfacesShort % of float · days-to-cover · float size
Squeeze flagAuto-flagged when short % of float and days-to-cover both clear the squeeze threshold

📈 RS RANK (v6.5.0c)

Score0–100 relative-strength rank vs SPY plus the ticker's sector ETF
WeightingIBD-style: 1mo 40% / 3mo 20% / 6mo 20% / 1y 20%
Trend glyphImproving / deteriorating arrow alongside the score

🧱 GAMMA WALLS (v6.5.0d)

SourceTradier option chain (real Greeks + OI) across 2–60 DTE
SurfacesTop call wall · top put wall · zero-gamma flip level
Regime classifierLONG_GAMMA · SHORT_GAMMA · MIXED_GAMMA. Walls behave as dynamic S/R; SHORT_GAMMA regime amplifies moves through them.
Read byTrap & Structure Coach uses gamma walls as additional confluence levels alongside the existing 10 local-compute S/R sources.

🔁 COMPARABLE SETUPS — Phase 1 (v6.5.1)

What it doesWalks this ticker's audit history and counts prior snapshots that match the current state within tolerance: score ±5, same vix_regime, same macro regime.
SurfacesMatch count · dominant forward bias from those matches
PhasePhase 1 is per-ticker only. Cross-ticker matching is on the v6.6+ list.

Structural R:R (also v6.5) is not a chip but a framework-wide change: every entry's reward target is now computed from the nearest confluence-merged S/R level above instead of a hardcoded 1.5. The broker preview gate refuses any order whose computed R:R is below 2.0.

History modal

Every AI surface generation appends one record to a single append-only log: ai_thesis_log.jsonl (Options Coach uses its own options_coach_log.jsonl). Each record carries a kind discriminator (thesis, pillar_coach, devils_advocate, exit_coach, entry_coach, position_audit, catalyst_interpreter, whale_confirmation, trap_structure, options_coach) plus the ticker, timestamp, score, state, and full narration text. Whale Confirmation entries additionally log the web_search queries fired and the URL set returned, so any cited URL can be traced back to its retrieval moment.

The dashboard's history modal (accessible via the history button on any AI panel) reads this log directly. As of v5.7.6 it opens in unified All view by default. As of v6.5, whale and trap rows render the full reasoning text alongside the verdict and agreement % — the verdict alone hides the work. The toggle row at the top of the modal is built dynamically — only kinds that have at least one record in your log show as tabs, with their per-kind counts. Tab colors match the panel colors throughout the app:

TAB KIND BADGE COLOR
All(no filter)cyan
Thesisthesisgold
Counterdevils_advocatepurple
Coachpillar_coachred
Exitexit_coachamber
Entryentry_coachgreen
Auditposition_auditcyan
Catalystcatalyst_interpreterblue
Optionsoptions_coachorange

Trim policy: the log retains the last 5,000 records (HISTORY_MAX_LINES in ai_thesis.py). At ~500 bytes per record, that's roughly 2.5 MB — plenty for years of typical use.

Privacy & cost

BYOK (bring your own key)

Every AI surface uses your own Anthropic or OpenAI API key, configured in Settings → Data Sources. Swing Deck does not run a hosted LLM. We don't see your prompts or your outputs. Two implications:

What leaves your machine

For each AI surface fire, the dashboard sends the prompt (system + user payload) to your configured provider. The user payload contains:

What does not leave your machine: your full portfolio, your account balance, broker tokens, journal entries for any ticker you're not currently asking about, the AI history log itself.

Cost ceiling

Each panel caches by a fingerprint that invalidates only when inputs materially change (state flip, new TP rung hit, new news cycle, new fills appended). Repeatedly opening the same panel without changes returns the cached entry — no LLM call, no cost. A typical active-trading day with 10 portfolio tickers and 2-3 framework events per ticker generates 30-50 LLM calls, well under $0.10 in total at default-model pricing.

Troubleshooting

"Not found" errors after upgrading

The dashboard is HTML/CSS/JS that auto-reloads on hard-refresh, but the Python control server doesn't hot-reload. After a Python-code change (most v5.7.x ships), click ↻ Restart Server in the topbar (next to ? Glossary). Server re-execs in place via os.execv; the dashboard polls /heartbeat and auto-reloads when the server returns. ~3-5 seconds typical.

An AI surface panel doesn't appear on a ticker

Each panel has a defined reveal condition (see the table at the top of each section above). If the condition isn't met, the panel is hidden by design — that's the surface-bound principle. Confirm the relevant data:

"Bring your own key" CTA shows up

Your Anthropic or OpenAI API key isn't configured. Open Settings → Data Sources, paste your key, save. All ten AI surfaces light up with the same key — no per-surface configuration. The v6.3 Whale Confirmation Coach additionally uses Anthropic's web_search tool which is billed at $10 per 1000 searches on top of token usage; the nine other surfaces are token-only.

Dev preview mode

For development or shake-down testing only: open browser DevTools console and run document.body.classList.add('coach-preview') to reveal all panels on every ticker regardless of signal. Endpoints accept ?preview=1 to synthesize plausible framework signals so the LLM has something to narrate. Disable with document.body.classList.remove('coach-preview') or refresh the page. Not for production use — preview narrations are based on synthetic signals, not your real data.

Read the philosophy behind v5.7

For the architectural decisions that produced this design (no chat box, surface-bound prompts, pills + slash palette over NLQ, paired counter-cases), read the v5.7 release blog post.

Read the v5.7 release post →