MIS Review — Apr 27 2026 (Session 17 — post-v11.0e/f Sam live read)
Source: Sam read 3 MIS Architect emails today (after v11.0e/f deploy) and dictated a stream-of-consciousness review. This doc is the parsed, structured version.
Status: Bench list for next MIS session. Code NOT changed in response to this — Sam was heading out, said "make of this what you will, commit, leave clean handoff."
Companion:docs/MIS_AUDIT_2026-04-26.md(the prior audit),docs/MIS_PHASE2_BLUEPRINT.md(the architectural target),MIS/docs/MIS_v7.1_Production_Blueprint.md(the original spec).
A. What the v11.0e/f run actually fixed (Sam confirmed)
| Fix | Sam's verbatim verdict |
|---|---|
Compression Setups now show Today: X% @ $Y + Bias arrow |
"Intel today 2.93% at $84.99 — beautiful, that's exactly what closed" |
Header date format Mon, Apr 27 · 4:57 PM |
"Monday, April 27, 4 PM. That's so cool. Thank you." |
| Header price freshness disclaimer "Prices: GOOGLEFINANCE (~15-min delayed)" | "Data Google Finance live. That means everything in this sheet will be there." |
| Holdings P&L % | "You give me percentage. Okay. That's good." |
| Outliers section populated (Up/Down) | "Okay. It's giving me everything up and then down. Fine." |
v11.0f-specific (catalyst self-doc + earnings NONE-skip + sector ME-seed) — Sam did not run again, deferred to next session.
B. Format / Rendering — STILL BROKEN
B1. 🚨 Outlook iOS rendering — VIX trajectory header is unreadable
Symptom (Outlook iOS app):
VIX intraday flat (open snapshots) → [BLANK BLUE BOX] → 09:55
Same content on Apple Mail iOS: renders correctly.
Cause: the <table bgcolor> patch in v11.0e helps the regime header but doesn't fully fix the inline VIX trajectory line. Outlook iOS strips many CSS properties, including some inside table cells.
Fix path next session:
- Convert ALL HTML email styling to inline style="" attributes (no <style> blocks, no class selectors)
- Specifically: replace any opacity: / background: divs with <font color="..."> + bgcolor="" table attrs
- Test on Outlook iOS specifically (not Apple Mail) before declaring fixed
B2. 🚨 Time format — VIX slot still shows raw 09:55 instead of 9:55 AM
Per memory feedback_time_format.md: every time display must be 12-hr AM/PM. The VIX trajectory slot reads 09:55 not 9:55 AM. The slot column comes from parseIcs_ which we patched in v11.0e to format with h:mm a, but apparently a separate code path renders it with leading zeros + no AM/PM in the daily brief.
Investigate:
- misReadVIXHistory_() line 3608+ already uses h:mm a for Date instances
- Check if the cell is being read as a STRING (not a Date) — when it's a string 09:55, the instanceof Date check fails and misClean_ passes it through unchanged
- Fix: re-parse string-typed slots through Utilities.parseDate or strip leading zero + append " AM"/" PM"
B3. "Open snapshots" / "VIX flat" — meaningless to Sam
The VIX trajectory line reads:
VIX intraday flat (open snapshots) → 09:55
(open snapshots) is leaking from the variable name vixOpenHistory. Sam doesn't know what it means. Fix: rephrase to VIX today (5-minute checkpoints, last 7 days): flat or similar plain English.
B4. Decimals showing where percentages should be / column widths broken
Sam observed: "within the MIS sheet itself from one of the AppScript runs or builds, it took away somehow the formatting for a lot of the stuff. So things that you're supposed to be percentages are showing me in decimals. Or things like that nature, and not properly fitting columns or wrapping texts."
Likely cause: one of the v11 functions calls setValue without setting setNumberFormat. Possibilities:
- misWireEarningsToTickers_ writes Date but only sets format if writes > 0
- misPopulateCatalystFromNews_ clears + writes — may strip prior column number formats
- misBuildHoldingsClean may not preserve number formats
Fix: every Apps Script setValue/setValues call must be paired with setNumberFormat for percentages, currency, dates. Also: setColumnWidth/setWrap for layout. Audit all build functions.
C. Missing data — wanted, not present
C1. VIX history view (5/7/10 trading days) — SAM-FAVORITE, currently lost
Quote: "I used to be able to track how it was over the last seven, five, ten trading days if it touched extreme. Was it volatile? I knew able to look at volatility."
Action: Build a --- VIX HISTORY --- block:
- Last 5 / 7 / 10 trading-day VIX closes
- Mark days that touched extreme (> 28) with 🚨
- Show min/max range over each window
- Source: VIX_OPEN_HISTORY tab + misGoogleFinanceLive_ for today
C2. Volume — not surfaced
Quote: "volume was something we need to talk about... high volatility, but not high volume, I guess."
Action: Momentum_Engine cols BF/BG/BH already track Today Volume / 30D Avg Volume / Volume vs Avg. They need to surface in the email — at minimum on Forward Look + Outliers. Show as Vol: 1.4x avg or 🔥 Vol: 2.8x avg if extreme.
C3. Leadership / Pressure — fields blank
Quote: "leadership pressure, those are blank."
Per CONTEXT.md MIS bug list (P2). The fields exist in code but logic doesn't populate them. Either wire them to a real source (sector rotation winners/losers) OR remove from email until ready.
C4. Earnings — accuracy unverified, also need MORE than just next date
Quote: "We have to make sure we get the earnings information right and everything's picked up properly... besides for the update always on the earnings, [we need] previous earnings, and other information... dividend timing, wash losses, pre-sales, warnings, some kind of insider buying or selling a specific stock."
Action — incremental:
1. Verify Finnhub data accuracy (sample 5 known earnings dates against earnings calendar)
2. Add Last Earnings Date column to EARNINGS_MASTER (Finnhub returns past + future)
3. Add Dividend Date field (Finnhub: /stock/dividend2)
4. Add Insider Activity (Finnhub: /stock/insider-transactions)
5. Add Earnings Surprise (Finnhub: /stock/earnings)
Each is a separate Finnhub endpoint call — additive, doesn't break existing.
C5. Tape Breath / Last 5 Trades — empty
Both per CONTEXT.md MIS bug list. Tape Breath blank; Last 5 Trades schema mismatch (broken since Jan 2026). Decision needed: fix or remove.
C6. SACS score provenance — Sam doesn't know what's behind it
Quote: "I need you to also take into account what's the SACS score coming from. I need to make sure that the SACS score is not just false because it's not giving real information, not picking up enough news, not picking up for enough news from enough tickers. Not calculating properly because there's no event dimension."
Per MIS_PHASE2_BLUEPRINT.md:
SACS: 0-100 weighted score. base
50 + (zScore14 × 15), adjusted for accumulation/distribution, compression, volume, RS vs SPY, headline penalty.
Current implementation: unclear — we now feed Catalyst_Engine (so Event Impact populates), but the actual SACS calc lives in Momentum_Engine col AZ as a formula. Need to:
- Document SACS formula in code AND in legend
- Verify each input is actually populated (not just blank → defaulting to base 50)
- Show SACS components in Forward Look (SACS 78 = base 50 + zScore +12 + flow +10 + RS +6) so Sam sees the math
D. Direction / Explainability — must be EVERYWHERE
D1. "Compression setup ready to move" — up or down?
Quote: "AMD is down 3.79%. It has a grade C, but it's giving me forward low compression setup ready to move. Is that up or down? I don't know."
Fix: every signal in Forward Look + High Conviction Setups + Trade Actions must lead with direction:
- ↑ AMD breakout candidate (Trend: Up · Today: -3.79% @ $X · SACS 72) — clear it's a LONG candidate having a pullback
- ↓ XYZ short candidate (Trend: Down · Today: +1.2% @ $X · SACS 68) — clear it's a SHORT candidate having a bounce
We added Bias arrow to Compression Setups in v11.0e. Need to extend to:
- High Conviction Setups (line 1556)
- Earnings Risk
- Lean In ticker lines
- Watch ticker lines
- Starter rows (HTML brief)
D2. "Breakout watch" + ticker that's down today = confusion
Quote: "Apple breakout watch, but down 1.45% today. So it's like, I'm gonna use my head on that, but I need to know."
Same fix as D1 — explicit direction + today's % so Sam can reconcile.
D3. Glossary / Legend — exists but Sam wants more
We added --- LEGEND --- to plain-text email in v11.0e. Sam wants:
- Same Legend in HTML email (currently text-only)
- Each term should also have inline-popup-tooltip (HTML title attribute) where used
D4. Color coding — losses must be RED or in (parens)
Quote: "if you're showing me a PayPal negative 29%, that has to be either in red or in parentheses. Like, things have to be very obvious when flipping at it."
Fix:
- HTML email: style="color:#c00;" on negative %s
- Plain-text email: wrap negative %s in (...)
- misFormatPct_/misFormatCurrency_ already do parens for currency — extend to %
E. Data sourcing — Sam wants traceability
E1. "I need to know if it was pulled from somewhere"
Quote: "Maybe I should be pulling from Schwab API. But the truth is, if it's only from Google Finance and when it got it, maybe you should tell me somewhere later on."
Currently: v11.0e header says "Prices: GOOGLEFINANCE (~15-min delayed)". Good but not enough.
Add: per-section source line:
--- SECTOR POSTURE ---
Source: Sector_Map (computed from Momentum_Engine RS_SPY_30D · refreshed every full run)
Pattern matches what BOS reports do (per feedback_output_format.md).
E2. Schwab API — pre-flight needed
On bench (CONTEXT.md): Schwab re-auth was DUE Apr 21, possibly happened Apr 22. Status unverified. Until Schwab is wired:
- Sam can't move off GOOGLEFINANCE
- Holdings live prices stay stale-ish
- Real-time outliers blocked
Phase 2 path: Per MIS_PHASE2_BLUEPRINT.md §1, Yahoo Finance REST API is the prescribed alternative ("No GOOGLEFINANCE Cell Formulas"). Phase 2 is not deployed.
F. Architecture mismatch — current code ≠ Phase 2 Blueprint
This is the biggest finding from re-reading MIS_PHASE2_BLUEPRINT.md (Apr 15) against current state.
| Phase 2 Blueprint says | Current state |
|---|---|
| No GOOGLEFINANCE cell formulas — all logic in JS via Yahoo Finance REST | ❌ GOOGLEFINANCE everywhere in Code.js buildMomentumEngine (cols C–U), buildSnapshot, buildTickers |
| ATR 1.3× stop-distance position sizing | ❌ Not implemented in current emailDailySnapshot.js |
portfolio-sync.js module with buildTradePlannerTab, syncHoldingsPnL, isTickerHeld_, getTotalBookRisk_, buildEarningsOverlay |
❌ Not present (Phase 2 module never built) |
| Bracket Order Playbook email format (BUY LMT / STOP / TARGET / RISK) | ❌ Current format is text Lean In list only |
Account masking Invest n Save (...0600) |
❌ Account number handling absent — no portfolio sync exists |
| Position overlap gates (per-ticker max + 6% total book risk) | ❌ No book-risk gate |
Finnhub via PropertiesService |
⚠️ Code.js uses getControlValue_('EARNINGS_API_KEY') from CONTROL tab — not PropertiesService |
This is a SCOPE problem, not a bug problem. The Blueprint represents intent from Apr 15. The code has drifted in different directions since. Either:
- (A) Reconcile: rebuild to match the Blueprint (large effort — 1-2 full sessions)
- (B) Update the Blueprint to reflect what's actually working + ship from there (1 session of doc work)
- (C) Hybrid: keep current as v11.x maintenance, plan v12 = Phase 2 cutover
Sam's verbatim ask suggests (C): "Do you understand all the logic? Like, now, can you build the entire sheet? I'm not asking you to do that. That's a different time. Maybe."
Recommendation: option (B) first — this session has captured enough that updating the Blueprint to match-or-deviate-with-rationale is the cheapest move. Then plan v12 as a proper Phase 2 cutover.
G. Sheet hygiene — many tabs working, many bloated/dead
Sam's quote: "I went through my MIS every single sheet, every single tab. There's history, beer history, execution playbook... so many that don't seem to be working within the sheet, and they're just like there. I'd like to see what's not, what's bloated, what's activated, what's not activated."
Action: write docs/MIS_TAB_AUDIT_2026-04-28.md that walks every tab in MIS_v7.1_gsheet:
- Tab name
- Built by which buildXxx in Code.js
- Last modified
- Current state (live data / formulas only / empty / orphaned)
- Recommendation: KEEP / REPAIR / RETIRE
Code.js buildMIS() references these tabs (full list — see MIS/src/Code.js:25-50):
Reference_Rules, Tickers, Catalyst_Engine, Momentum_Engine, Sector_Map,
Daily_Snapshot, Snapshot, Trade_Signals, Setup_Engine, Playbook_V2,
execution_playbook, Trade_Planner, Trade_Log, Holdings, Behavior_Tracker,
Performance_Summary, Integrity_Check, Dashboard_2, VIX_945_History
Plus support tabs from emailDailySnapshot.js MIS_CFG.support:
CONTROL, RUN_LOG, DIAGNOSTICS, NEWS_CATALYST, LIVE_GUARD, REPORT_SNAPSHOTS,
VIX_OPEN_HISTORY, MARKET_CALENDAR, HOLDINGS_CLEAN, SELF_GRADE, BROKER_IMPORT,
HIST_DAILY_SNAPSHOT, HIST_MOMENTUM, HIST_EXECUTION_PLAYBOOK, HIST_PLAYBOOK_V2,
HIST_TRADE_LOG
Plus Earnings + Master:
EARNINGS_MASTER
That's ~35 tabs. The audit should answer: which are firing, which are dead?
H. New asks (queued, not started)
| Ask | Effort | Notes |
|---|---|---|
| ATR 14-day @ 1.3× multiplier visible per signal | M | Already in Phase 2 Blueprint §2 |
| Leveraged-ETF awareness (NVDL etc.) — flag separately | S | Add ETF: Leveraged Type in Tickers + flag in Forward Look |
| Wash-sale + lot-tracking awareness for Holdings | L | Multi-lot Trade_Planner upgrade. Phase 2.5+. |
| Dividend timing | S | Finnhub /stock/dividend2 |
| Insider buying/selling | M | Finnhub /stock/insider-transactions |
| Pre-announcement / guidance warnings | L | Sentiment overlay on news catalyst |
| Auto-trigger without computer being on | DONE | Apps Script time-triggers run server-side. Sam can ignore — already true. |
I. Process feedback (locked in for next session)
I1. "You should have become experts on what you have"
Quote: "Look through the 2026 BH folder. Don't I have some of these sheets in the MIS repo and the MIS GitHub and the MIS folder on my computer, online, in my drive. Like, how come you don't know all this already? It should be in CLAUDE.md, CONTEXT.md."
This is a recurring theme, already partially codified in:
- feedback_pre_session_repo_scan.md — scan repo BEFORE answering
- feedback_session_lessons.md — open files first
New artifact this session: docs/MIS_TAB_AUDIT_2026-04-28.md (next MIS session) — single-file canonical reference for every MIS tab. Once written, future Claude sessions read it first and don't re-discover.
I2. "Voice-to-text parsing is a SKILL"
Quote: "Any skills you kind of learn — let's not forget that that's an actual skill. However, you figure out how to parse my words, how the way I talk specifically. You'll see I have other stuff and other repos and other thoughts and files with regards to text-to-talk talk-to-text and how to utilize it."
Action: check hookstreet-skills/braindump-router/ — already exists per feedback_drafts_as_open_loops.md. Sam's voice-dictation pattern is captured in feedback_enumerate_voice_prompts.md (every multi-thought voice message = enumerate every ask, treat "anyway"/"also" as live items). Reinforce.
J. Prioritized fix queue — next MIS session (~4-hour block)
In dependency order:
| # | Fix | Time | Why |
|---|---|---|---|
| 1 | Outlook iOS rendering — pure inline styles audit | 45m | B1 — visible failure, ruins phone read |
| 2 | VIX slot AM/PM + remove "open snapshots" leak | 15m | B2 + B3 — quick wins |
| 3 | Number format audit — every setValue paired with setNumberFormat | 30m | B4 — formatting decay protection |
| 4 | Direction/bias arrow on EVERY signal section | 30m | D1 + D2 — Sam's #1 reading complaint |
| 5 | Color coding — red for negative %, parens fallback | 20m | D4 — quick visual win |
| 6 | Per-section source attribution lines | 20m | E1 — pattern from BOS |
| 7 | VIX history block (5/7/10 day window) | 45m | C1 — Sam-favorite, currently lost |
| 8 | Volume surfacing in Outliers + Forward Look | 30m | C2 — data exists, surface it |
| 9 | Tab audit doc MIS_TAB_AUDIT_2026-04-28.md |
60m | G — closes the "I don't know what's bloated" gap |
Estimated: 4h 35m. Sequence #1-6 first (visible wins), then #7-8 (new data), then #9 (architectural understanding).
NOT in this 4-hour block (deferred):
- Schwab API (separate session, blocked on re-auth confirm)
- Phase 2 cutover (separate planning session — choose Option A/B/C from §F)
- Multi-lot wash-sale awareness (Phase 2.5+)
- Earnings expansion (last earnings, dividends, insider) — Finnhub-call expansion, ~1 session
K. v11 history (for the record)
| Version | Date | What |
|---|---|---|
| v10.1 | (pre-Apr 27) | MIS MASTER baseline — 3 daily emails firing, Sector empty, VIX cached, Catalyst empty |
| v11.0e | 2026-04-27 ~7:00 PM EDT | Mobile-Claude phone session: SACS-sorted news/lean-in, 12-hr dates, Outlook iOS table fix attempt, Today % on signals, Legend, fallback Top/Bottom, GOOGLEFINANCE live VIX read. Plus 3 orphan calls (no bodies — token-out). Claude Code (this desktop session) wrote the 3 missing bodies (misWireEarningsToTickers_, misRebuildSectorMapFormulas_, misPopulateCatalystFromNews_). Pushed 465fb6b. |
| v11.0f | 2026-04-27 ~7:30 PM EDT | Sam's same-day review: earnings wire was writing literal "NONE" string from EARNINGS_MASTER → fixed to skip. Catalyst sentiment was opaque → headlines now suffix [Bullish · +beats · Imp:3 · Earnings · Reuters]. Sector_Map only 2 rows because Tickers!F sparse → auto-seed from Momentum_Engine!AK. CONTROL!B2 doc fix. Pushed f4eddbd. |
| v11.0g | (next session) | Items #1-9 from §J above |
L. Files referenced
MIS/src/emailDailySnapshot.js— email engine (3,900+ lines after v11.0f)MIS/src/Code.js— tab builder (1,200+ lines, ~20 buildXxx functions)MIS/src/MIS_v8_builder.py+MIS_v8_production_builder.py— Python builders (legacy, not connected to live system)MIS/docs/MIS_v7.1_Production_Blueprint.md— original spec (Oct 2025)MIS/docs/MIS v7.1_ System Hardening & Optimization Blueprint.docx— design doc (not yet read)MIS/docs/MIS v7.6_ Script Audit & Optimization Blueprint.docx— script audit (not yet read)docs/MIS_PHASE2_BLUEPRINT.md— Phase 2 architectural target (Apr 15 2026)docs/MIS_AUDIT_2026-04-26.md— Sun night state auditMIS/README.md— folder overview (stale, references "v8 production" — current is v11.0f)MIS_v7.1_gsheet(1cosuFrU_EJRAprVMm-FEpmddSUTVQWhlI0tHpS1w2S4) — the live spreadsheetemailDailySnapshotscript (1r9vWL1DsqSloDL8OteFNekkDZihFw_5jtTBSJ0UjbEigwRxGlILtUzbI) — container-bound script
Generated 2026-04-27 7:35 PM EDT · last touched 11:05 PM EDT · Session 17 · Claude Code Opus 4.7 (1M)