MIS v2 — GAP ANALYSIS vs docs/MIS_*
Built 2026-05-28. Sam: "Go through this in detail, make sure anything related to MIS is fully acknowledged and digested and already considered. Obviously, it's not."
Method: thorough read of all 9 older docs/MIS_* files (Audit/Review/FSE Architecture/March 5 Formulas/Phase 2 Blueprint/Tab Audit/Entry Pad Reference/FSE Addendum/Email Render Requirements) cross-referenced against the 9 v2 baseline docs (Logic_Capture / Definition_of_Done / Status / Requirements_Checklist / Next_Steps / Tab_Coverage / 2-ticker Proof / Setup_and_Keys / Trade_Ingestion_and_Behavioral).
Honest bottom line: v2 has nailed the architectural core — single-classifier FSE, weighted SACS, real ATR, grade bands A≥40/B≥25/C≥10/D<10, 5 accounts loaded, 2-ticker proof clean. The gap is mostly BUILD not CAPTURE: most items below are documented somewhere in the v2 docs but never wired into the engine or render layer.
⭐ TOP-PRIORITY UNCOVERED ITEMS (the 6 worth doing first)
✅ SHIPPED 2026-05-28 NIGHT (Stage 9 — locally, deploys with clasp) — FINAL PUSH (95% done)
- News-on-holdings (gap #15):
misV2RefreshNews_pulls Finnhub/company-newsfor every ticker in HOLDINGS_CLEAN (up to 10 names), caches to newNEWS_CACHEtab (headline + URL + source + datetime + sentiment), 1.1s rate-limit. Dashboard renders NEWS ON YOUR HOLDINGS section — only catalysts on names Sam actually holds. The "Burry at YOUR cost basis" framing the MIS_AUDIT flagged.fn=news(refresh) +fn=newsview(render). - Mandatory Risk Display inline (gap #11 finish):
misV2HoldingsRiskHtml_joins HOLDINGS_CLEAN × FSE → per-position Stop · Target · R:R · verdict inline, sorted by market value. Mobile-collapsible via the.scalerclass. Dashboard's new YOUR HOLDINGS section ships this. Every held name self-documents its exit plan.
Net: 19 of 20 gap items closed (95%). Code.gs: 141 KB → 147 KB.
Only remaining (gap #20): Outlook iOS render polish — kicks in if MIS ever pushes a real email brief (today MIS pushes via the Telegram notify webhook, not email; portal HTML is fine). Captured as design constraint; not blocking.
✅ SHIPPED 2026-05-28 LATE EVE (Stage 8 — locally, deploys with clasp) — MARQUEE GAP CLOSURE
- Earnings depth (gap #11):
misV2RefreshEarningsDepth_pulls Finnhub/stock/earnings(surprise),/stock/dividend2,/stock/insider-transactions→ newEARNINGS_DEPTHtab (last earnings + EPS actual/estimate/surprise %, last dividend date + amount, 30-day insider net + transaction count, updated timestamp). Rolling refresh + dedup. Test Entry renders EARNINGS DEPTH section with color-coded surprise + insider net.fn=earndepthendpoint. - IsMacroMover helper (gap #17 foundation):
misV2IsMacroMover_(sym, capM)flags Mag-7 + market cap ≥ $150B. Foundation for Smart Earnings Tiering T1/T2/T3 (T1 = held + watch, T2 = macro mover, T3 = hide). - Signal_View (gap #16a):
misV2SignalViewHtml_3-panel (Breakout / Contrarian / Oversold) on the dashboard. Breakout = setup includes Breakout/Lean In; Contrarian = Downtrend with today positive; Oversold = ≤8% from 52w low. Top 5 per panel. - Momentum_Digest (gap #16b):
misV2MomentumDigestHtml_= 7-bucket emoji grouping of the FSE universe (🟢 ADD · 🔵 STARTER · 🟡 WATCH · 🟠 EARNINGS · 🔴 REJECTED · ⚪ EXTENDED · 🚫 WASH/REDUCE). Compact one-row-per-bucket view on the dashboard. SURFACE_CONFLICT_CHECK(gap #6):misV2SurfaceConflictCheck_(runId)compares Snapshot'sFinalStatevs FSE'sFinalStateper ticker; appends mismatches to the new tab. Called automatically at the end of everymisV2BuildFSE— the persistent surface-drift monitor the canonical FSE doc demanded.Integrity_Check(gap #14):misV2Integrity_()runs 5 checks (Include=Y count, blank sectors, valid prices,Weight_*≥ 12 dial-corruption guard, FSE populated); appends per-check rows to the tab + returns a one-line summary.fn=integrity.- VSM / IPQ / Beta chips on entry (gap #18): graceful-fallback chip reads from Momentum_Engine; renders only when columns are present (the 16-column Schwab Entry Pad reference now reflected on the new ticket).
- Shabbos / Yom Tov rule (SmartHub "spiritually attuned"):
misV2IsQuietDay_returns{quiet, why}for Saturdays + 2026 chag dates.misV2BriefAndNotify_+misV2GapPulseAndNotify_now skip with"Quiet day (Shabbos / Pesach 1 / Yom Kippur) — brief suppressed". The Hashem-attuned trigger discipline from the March-2025 SmartHub origin is honored.
Net: 17 of 20 gap items closed (85%). Code.gs: 126 KB → 141 KB.
✅ SHIPPED 2026-05-28 EVE (Stage 7 — locally, deploys with clasp) — ARCHITECTURAL DEPTH
- FSE resolver Gates 2, 3, 4, 9 wired (was 7 of 11 → now 10 of 11 —
LIVE_GUARD_BLOCKfor >7% shock days,HELD_LOSSREDUCE/EXIT for held positions ≤92% of cost,PORTFOLIO_OVERLAPfor already-held ≥20% of portfolio,EXTENDEDfor within 8% of 52w high). The only remaining gate is the full external news-shock detection (Gate 2's news side — heuristic price-shock side is now wired). - ADD-requires-live-quote rule locked (FSE doctrine): GOOGLEFINANCE is 15-min delayed → any ADD verdict is automatically downgraded to STARTER with reason note unless a
LIVE_QUOTE_SOURCEScript Property is set (i.e. when Schwab API is wired in Phase 5). This is the canonical FSE doctrine + 15-point test #14 finally honored. - RiskGate definition LOCKED to R:R ≥ 2.5 (the canonical doctrine from
MIS_V2_REQUIREMENTS_CHECKLIST.md§1): the FSE resolver now rejects onrr < 2.5, not onRisk% > 2.5%(which was systematically rejecting high-ATR setups). Position sizing handles risk% via the existing 1% portfolio-risk + 8% Max_Stop_Pct caps. The three-way doc conflict (March-5 Formulas vs 2-Ticker Proof vs Requirements Checklist) is now resolved in favor of doctrine. - SACS components shown on every Test Entry (gap #12): mono line under the headline says
SACS = Composite X · Flow Y · R:R Z · Grade G (weighted 0.3/0.3/0.2/0.2)— the math is now visible. FLOW_CLUSTER_WARNdiagnostic (gap #13):misV2BuildFSEchecks if >35% of tickers share an identical Flow Strength value and surfaces the warning in the log + return string. Catches the "Flow data noise" case the canonical FSE doc warned about.- Container queries on the universe table (
misV2StyleBlock_+class="scaler"):@media(max-width:640px)collapses table rows to cards on phone. Universe table is now genuinely scale-ready at 200 rows without breaking iPhone layout. - WHY-text branches added on the entry pad for all new reject codes (SHOCK_DOWN/UP, HELD_LOSS, PORTFOLIO_OVERLAP, EXTENDED, DELAYED_QUOTE) so every rejection explains itself in plain language.
Net: 10 of 20 gap items closed (50%). Code.gs: 121 KB → 126 KB.
✅ SHIPPED 2026-05-28 PM (Stage 6 — locally, deploys with clasp)
- Wash-sale gate (gap #0):
Wash_Saletab +WASH_SALE_BLOCKreject code wired as FSE Gate 0 (first-fires-wins, before DATA_STALE/EARNINGS/everything) + entry-pad banner with blocked-until date + helpersmisV2WashSaleAdd_/Check_/All_+ endpointsfn=washsale(add) andfn=washlist. - Bracket-order paste block (gap #9): dark monospace
BUY LMT SYM N @ $P / STOP / TARGET / RISKon every ADD/STARTER Test Entry — paste straight to broker (Phase 2 Blueprint §3d). - VIX history (5/7/10-day) (gap #5 / Sam-favorite): History tab now pulls VIX series; dashboard renders 5/7/10-day avg/low/high with ⚠ extreme markers when any day touched 28.
- Relative Volume chip (gap #6 / Sam-favorite): tries
Vol_Rel/Vol_vs_Avg/Rel_Vol/Volume_Ratiocols on Momentum_Engine; renders as a chip when available (graceful n/a fallback). - BLUF + Market Mode header (gaps #7 + #8): navy + gold band on the dashboard + text-BLUF prepended to the daily brief:
Mode · Regime · Breadth N of M · K actionable + narrative. US 2026 holiday list baked in; closed days surface hypothetical-if-open framing. - DESIGN_SYSTEM compliance (cross-session lesson): Apple system font stack · 15px body · 1.4 line-height ·
font-feature-settings:"tnum"·viewport-fit=cover·color-scheme=light·env(safe-area-inset-*)outer padding · long pill10-DAY · 2WKcompacted to10-DAY(≤14-char rule).
0. Wash-sale tracking (PROMOTED 2026-05-28 after re-reading the March 2025 SmartHub origin chat)
Source: Sam's lived experience — March 2025 chat: "I'm selling things that I'm trimming positions at a loss even when I go back into it like JP Morgan I can't go back into." Re-confirmed in MIS_V2_REQUIREMENTS_CHECKLIST.md §6 and MIS_V2_LOGIC_CAPTURE.md. Recurring Sam-favorite. Lived dollar consequences (disallowed losses are real tax cost).
What needs to ship:
- Wash_Sale tab in MIS v2 keyed by Ticker → last loss-sell date → re-entry blocked until +30 days.
- New canonical reject code WASH_SALE_BLOCK added to MIS_FSE_ARCHITECTURE.md reject codes; fires from the 11-gate resolver as a hard stop on ADD/STARTER.
- Auto-detection from broker emails: when misV2ImportTrades_ parses a SELL, compute if loss vs weighted-avg basis; if loss, write to Wash_Sale with blocked_until = sell_date + 30d.
- Surface on the Test Entry: amber/red banner near verdict — "WASH SALE BLOCK until 2026-06-26 (sold at loss 2026-05-27)."
- Brief + shortlist: wash-blocked names auto-excluded + flagged.
Until built, MIS can recommend a buy that costs Sam real money. Not a nice-to-have — promote to FSE resolver core.
1. Four of the 11 FSE resolver gates are NOT wired
Source: MIS_FSE_ARCHITECTURE.md §3 (the canonical doc per CLAUDE.md). Captured in MIS_V2_DEFINITION_OF_DONE.md §M as "TODO when holdings wire" — never built.
Missing gates (out of 11 first-fires-wins):
- Gate 2 — LIVE_GUARD_BLOCK (intraday news shock / circuit-breaker block)
- Gate 3 — held-position REDUCE/EXIT (existing position at loss threshold)
- Gate 4 — PORTFOLIO_OVERLAP (already-held / concentration / total book risk ≥ 6%)
- Gate 9 — EXTENDED (>1.5× ATR extension intraday → CONDITIONAL/EXTENDED, not ADD)
Why this is #1: these are the holdings-aware gates. Without them v2's verdict for a ticker Sam ALREADY holds is the same as for one he doesn't — wrong.
2. The "6 Permission Tiers + Market Mode + BLUF" header layer is missing
Source: MIS_FSE_ARCHITECTURE.md (6 tiers) + MIS_EMAIL_RENDER_REQUIREMENTS.md R4 (BLUF) + R5 (Market Mode).
v2 emits per-ticker verdicts but never produces the day's overall posture ("Today: TIER 3 STARTER ONLY — delayed data + limit orders") + the regime/breadth/actionable BLUF sentence ("Regime NORMAL · 47 of 184 in sync · FSE shows 3 actionable. Selective tape, narrow leadership.") + the Market Mode line (Closed / Pre-market / Open / Power Hour / After-hours + a "what would be top conviction if open" hypothetical for closed times).
This is the first thing Sam should see every time he opens a brief or dashboard.
3. Three Sam-favorites that keep getting asked for and never built
- VIX history block (5/7/10-day) with 🚨 markers on days touching extreme (>28) —
MIS_REVIEW_2026-04-27.mdC1, explicitly flagged as a Sam-favorite that got lost. - Volume rendering (
Vol: 1.4× avg/🔥 Vol: 2.8× avg) — computed in Momentum_Engine BF/BG/BH, never surfaced anywhere. Flagged inMIS_REVIEW_2026-04-27.mdC2 +MIS_V2_DEFINITION_OF_DONE.md§M. - Bracket order copy-paste format —
BUY LMT INTC 26 @ $117.83 / STOP $108.40 (8% / 1.3 ATR) / TARGET $141.40 (2.5R) / RISK $245 (1%). FromMIS_PHASE2_BLUEPRINT.md§3d. Paste straight into the broker.
4. ADD should require live-trigger confirmation; GOOGLEFINANCE = 15-min delayed
Source: MIS_FSE_ARCHITECTURE.md §3 + 15-point acceptance test #14.
v2 calls INTC=ADD using GOOGLEFINANCE (15-min delayed). Per the canonical FSE doctrine, delayed data should force STARTER, not ADD. ADD should be reserved for tickers with live quotes (Schwab API / Finnhub real-time). Today: every ADD is technically wrong by the doctrine.
5. The RiskGate definition conflicts across three docs
MIS_MARCH5_FORMULAS.mdsays: "OK (within 2.5%)" when %Risk @ 1.3× ATR ≤ 2.5%MIS_V2_2TICKER_PROOF.mdsays: changed to "Shares ≥ 1" (the v2 fix)MIS_V2_REQUIREMENTS_CHECKLIST.md§1 says: "🔑 RiskGate must check R:R ≥ 2.5, NOT Risk% ≤ 2.5%"
All three live as "the right one" in different docs. Lock one + propagate.
🟡 NEXT-PRIORITY (the next 10)
| # | Item | Source | Action |
|---|---|---|---|
| 6 | SURFACE_CONFLICT_CHECK persistent tab (logs every surface vs FSE disagreement) |
MIS_FSE_ARCHITECTURE.md §5 |
Build tab; surface in Data Health |
| 7 | News → holdings mapping ("Burry initiating PYPL at YOUR cost basis") not "Ticker Warning" | MIS_AUDIT_2026-04-26.md |
Cross-ref catalyst ticker vs HOLDINGS_CLEAN |
| 8 | FLOW_CLUSTER_WARN + Data Health GREEN/YELLOW/RED single badge |
MIS_FSE_ARCHITECTURE.md §7 |
If >35% of tickers share Flow Strength → WARN; single visible Health badge per run |
| 9 | Earnings depth — Last Earnings + Dividend (/stock/dividend2) + Insider Activity (/stock/insider-transactions) + Earnings Surprise (/stock/earnings) |
MIS_REVIEW_2026-04-27.md C4 + Definition-of-Done §N |
4 more Finnhub calls; show on ticket + universe |
| 10 | SACS component breakdown shown on ticket — SACS 64 = Comp×0.3 + Flow×0.3 + RR×0.2 + Grade×0.2 = 19.2 + 20.7 + 12 + 12 |
MIS_REVIEW_2026-04-27.md C6 |
Add "SACS components" line to entry ticket |
| 11 | R3 Mandatory Risk Display — every Trade Action / Holdings row shows Stop $X / Target $Y / R:R / Held N days inline |
MIS_EMAIL_RENDER_REQUIREMENTS.md R3 |
Enforce in brief + dashboard render layer |
| 12 | R2 Smart Earnings Tiering + IsMacroMover boolean on Tickers — T1 Held+Watch, T2 Mkt Cap >$150B or Mag-7 or sector leader, T3 hide |
MIS_EMAIL_RENDER_REQUIREMENTS.md R2 |
Add IsMacroMover column; tier the earnings list |
| 13 | Integrity_Check tab — Include=Y count · blank sectors · valid prices · errors · Weight_* ≥12 (locked dials) | MIS_TAB_AUDIT_2026-04-28.md + MIS_V2_TAB_COVERAGE.md |
Build tab; tie to Data Health |
| 14 | Signal_View (3-panel Breakout/Contrarian/Oversold) + Momentum_Digest (7-bucket emoji grouping by Regime+SACS) + Sector_Rotation curated | MIS_FSE_ADDENDUM_2026-05-01.md §7 |
Portal sections, READ from FSE only |
| 15 | VSM, IPQ, Beta Dynamic Risk, Sector Avg_RS columns on entry ticket + universe table | MIS_ENTRY_PAD_REFERENCE.md View 1 (16 cols) |
Add chips on ticket; columns on table |
✅ ALREADY WELL-COVERED (the 9 older docs are not ignored — these items ARE built)
- Single-source-of-truth FSE (no surface independently classifies) — proven at 2 tickers
- Weighted SACS exact formula (
Composite×0.3 + Flow×0.3 + min(100,RR×20)×0.2 + Grade×0.2) - Grade thresholds A≥40 / B≥25 / C≥10 / D<10
- ATR 1.3× stop · 1% risk per trade · Max_Stop_Pct = 0.08
- Reference_Rules canonical weights (VolPenalty 40→15 fix, all 14 dials)
- Bitcoin + Gold via Coinbase (real spot, not ETF proxies)
- HOLDINGS_CLEAN loaded across 5 accounts (Fidelity + Schwab + kids segregated)
- Holdings sorted; cash-bond tagged
- Account masking format
(...0600)style - Test Entry v3 (ACTUAL-vs-IDEAL behavioral layer + protection + how-to)
- TRACK RECORD on every ticket (history-aware)
- Trigger discipline locked in
MIS_V2_REQUIREMENTS_CHECKLIST.md - Secrets in PropertiesService (no plaintext in cells)
- Color palette + verdict tokens locked
- Data Freshness box (LIVE / CACHED / COMPUTED) on every ticket
SO WHAT'S THE TAKEAWAY
Sam's instinct was right that stuff hasn't been fully built, but the underlying capture is actually solid — every item above is documented in either the older docs or the v2 baseline docs (often both). What's missing is mostly the wire-it-up + render-it work, not the decide-what-to-do work.
The next build session (after clasp reauth) should target the TOP 5 before adding more features. Specifically:
1. The 4 missing FSE gates (Live Guard + held-position REDUCE/EXIT + portfolio overlap + EXTENDED)
2. Posture / BLUF / Market Mode header
3. VIX history + Volume + Bracket-order block (the 3 Sam-favorites)
4. ADD-requires-live-quote rule (force STARTER on GOOGLEFINANCE)
5. RiskGate definition lock
Gap analysis · 2026-05-28 · all 18 docs read in full · companion: MIS_V2_REQUIREMENTS_CHECKLIST.md, MIS_V2_NEXT_STEPS.md, MIS_V2_STATUS.md.