MIS Deep-Dive — Cluster A

Independent audit · Power Hour vs Claude · Logic review · "MIS → 100% useful" plan
Session 36 cont · Cluster A
Generated: Tuesday, May 19 2026 · 11:42 PM EDT (NY)
Author: Claude Code Opus 4.7 (1M) · receipts-protocol pass + 3 parallel Explore agents
Repo: zee78900/hookstreet-workspace · Branch: master · Parent commit: fc00f3c
Sources: live MIS v1 sheet 1HEmRev… [Drive] · 3 today emails 19e41aab/19e41751/19e407ef [Gmail] · MIS/MIS-v1-script/*.js [Code] · gh issue list zee78900/MIS [GitHub]
Not read: private broker screenshots · Schwab token values (placeholder posture)

TL;DR

Today's three MIS emails fired clean — Morning 9:47 AM, Trade Action 2:15 PM, Power Hour 3:13 PM, no #N/A / NaN / undefined, BLUF rendering with badges. The visible surface looks healthy.

Underneath, the system has three live operational gaps (Sunday 5/17 holdings paste apparently didn't land · FSE is dormant unless someone clicks the menu · Schwab 24+ days stale) and five known-coded-but-dormant features (REDUCE/EXIT graduation · afternoon delta brief · High Conviction visual badges · backtest tracking · live Schwab API integration). The brain underneath isn't yet trade-grade.

Codex / Claude shipped ~60% of the visible-issue work since 5/8 (BLUF colors · PORTFOLIO_OVERLAP gate · Trade_Log_Imported plumbing · holdings card grid). 40% remains in plain sight. Section 4 below names every P0/P1/P2 with file:line evidence.

Section 6 is the "MIS → 100% useful" playbook — daily rhythm, money-management bumpers, up-vs-down market protocols, when to ETF vs single-stock — written as how to use what you have today, not a wish list for future builds.

1Codex / GitHub issue status

Issues #3–#10 on zee78900/MIS as of tonight. All eight are still in OPEN state in GitHub even where the underlying code has shipped — Sam hasn't closed them. My read of code + today's emails:

#TitleStateReality
#3 BLUF: bold tickers + colored % + action badges Shipped Sam-confirmed "looked pretty okay" 5/8. misBuildBLUFHtml_ active in today's email — green/red colored deltas, ↑↓ arrows, ADD badges. Close this.
#4 Game Plan: bold tickers + action badges Partial HTML variant exists (misBuildGamePlanHtml_, badges at line 2047-2052). Plaintext fallback still flat. Today's HTML render shows colored badges in Game Plan — looks shipped to me. Verify on Outlook iOS.
#5 High Conviction Setups: bold tickers + arrows Not shipped Still plaintext (misBuildHighConvictionSummary_ line 2214). No badges, no arrows. Real fix needed.
#6 Trade Actions / Holdings / Trade Progress visual Partial Holdings card grid shipped. Trade Actions inherits BLUF treatment. Trade Progress still plain.
#7 Afternoon update — delta-only brief at ~2:30 / 3 PM Not shipped misSendPowerHour300 line 296-322 calls misBuildDailyBrief_('POWER_HOUR') but the runType arg is never used inside the function (line 2232). Power Hour is a full re-render, not a delta.
#8 Holdings: Trade_Log_Imported as source of truth Code yes / data no Code shipped (misBuildHoldingsFromTradeLogImported_ line 4567, precedence over HOLDINGS_CLEAN at line 4562-4564). But the 5/17 paste apparently didn't land — today's email shows 10 positions; paste was 24. The code is there; the data isn't. See P0-1 in section 4.
#9 Backtest / recommendation tracking Parked Design first per doctrine. I'd argue this is the highest-leverage parked item. The system has 5099 rows of HIST_MOMENTUM and nothing reading it to score past calls.
#10 Sheet-to-bones audit (which 4 tabs do all the work) Parked Sequenced after #5-#7 land. Per per-tab map in docs/MIS_TAB_AUDIT_2026-04-28.md the answer is roughly: Tickers · Trade_Log_Imported · Reference Rules · Snapshot (Snapshot subsumes Momentum_Engine in v12 plan).

Verdict line. Codex / Claude shipped 60% since 5/8. 40% remains as known unwired logic. The two issues that matter most to a trading day (#5 visual fix + #7 delta brief) are both unshipped — and #8 has shipped code but data that didn't follow.

2Claude's own MIS report

This is what I'd send Sam at 3 PM today if I were the engine — read directly from the live v1 sheet, not piped through the production renderer. Compare against the real Power Hour in Section 3.

Regime read

MetricReadingFrame
SPY$734.52 −0.55%Soft session — minor distribution
VIX18.04Normal regime (Reference Rules: Low 14 / Normal 19.5 / High 27)
10Y yield4.67% +1.04%Bond pressure — drives defensives bid
Sector strengthHealth Care +1.58%Defensives leading
Sector weaknessAutomobiles −1.99%Cyclicals soft
Energy bidXLE +1.06% · CVX +1.49% · UNG +3.42%Iran tension premium in oil (per Live Guard 4/30 ingests)

Frame: Risk-On-with-headwind. SPY soft, VIX calm, but rate pressure (10Y +1%) is steering money into defensives + energy. Not a full risk-off, not a clean rally day.

Top SACS A-grade names (FSE / Snapshot, ranked)

#TickerSACSGradeTodayDirStop / Target
1XLE77.70A+1.06% @ $61.26$58.20 / $68.92
2CVX77.61A+1.49% @ $197.23$187.37 / $221.88
3XOM74.95A+0.96% @ $162.03$153.93 / $182.28
4UNG74.46A+3.42% @ $11.93$11.33 / $13.42
5OXY73.78A+1.54% @ $60.68$57.65 / $68.27
6MSFT · TMV · MDLZmid-70sA/Bmixed

Setup tail (the 40+ candidates the email's 8-cap hides)

Daily Snapshot's breakout list — not surfaced in any of today's 3 emails — includes: AAPL, COST, CRWD, CSCO, DBX, DUOL, GD, GS, INTC, KO, LIN, LLY, MDLZ, MGK, MRVL, PLD, QCOM, QRVO, SBUX, SCHG, SGOV, SPY, TBF, TBT, TMV, TSLA, TSM, V, VOO, VTI, XLG, XLP, XLRE, XOM, XOP, ZM. Sam should look at this list at least weekly — the email-rendered top 8 today is energy-dominated, but the deeper Snapshot shows broader breadth. Defensives setups (KO, LIN, MDLZ, SCHG, V) are quietly setting up alongside the energy stack.

Sector rotation

Reversals tab (downtrend → reversing): BAC, CVX, MCD, PEP, SCHW, SO, TJX, TOST, WFC — financials + defensive consumer leading the dip-buy. This is where I'd look for next-leg names if energy gets crowded.

News-to-position read

Live Guard active BLOCKs: META (EARNINGS_RISK + SHOCK_DOWN −7.93%), ETSY (SHOCK_DOWN), NVDL (SHOCK_DOWN), UVIX (SHOCK_DOWN). Of these, only META appears in current holdings (the paste had 10.806 sh combined; the email is rendering 8.25 sh — discrepancy, see Section 4). The other three blocks are universe-level, not positions.

Quick Trade Calc state

QTC tab is present in the live sheet with the canonical 13-column scaffold (Ticker · Entry · Stop · Target · $Risk · Live · Risk% · Reward% · R:R · Shares · Position$ · MIS_State · Verdict). The Drive read shows no hand-entered ticker rows tonight — either Sam zeroed it after the LLY trade closed, or the formulas blanked because upstream Momentum_Engine row missing (per feedback_tab_data_duplicity.md, this is the NVDA-style silent-blank failure). If Sam acts on any signal tomorrow, type the ticker in col A and let the bracket compute.

Holdings reality (what I see vs what email rendered)

Position (from 5/14 paste)Email todayStatus
SPY 10.954 shSPY 10.95 shMatch
META 10.806 sh (Margin 10.351 + Joint 0.455)META 8.25 shWrong
ASML 4.007 shASML 4.00 shMatch
ABBV 17.000 sh @ $208.75MissingAbsent
COST 2.003 shMissingAbsent
KO 6.086 shMissingAbsent
ORCL 0.847 sh @ $301.07 (Margin)Missing (only Joint 1.267 sh shown)Absent
GOOG 0.087 shMissingAbsent
SCHG 6.169 shMissingAbsent
SCHZ 21.376 shMissingAbsent
SGOV 3.000 shMissingAbsent
BA 2.000 shMissingAbsent
UNG 24.000 shMissing (but UNG is in today's ADD list)Absent
SLV 7.000 shMissingAbsent
ABNB 1.000 shMissingAbsent
AFRM 7 sh (after Thu 5/7 sale of 8)AFRM 15.00 shStale by 12 days

Eleven positions plus the META + AFRM corrections — fifteen rows of reality missing or wrong. The Trade_Log_Imported paste apparently did not land Sunday 5/17, or the renderer is dropping rows. See P0-1 in Section 4 for the action.

One ADD I'd flag personally

Tonight's clean call UNG (United States Natural Gas Fund LP) — Nat-gas ETF, single underlying. SACS 74.46/A, accelerating up, compression breaking. Today +3.42% @ $11.93. You already hold 24 shares from 5/13 @ $11.07 (per the paste that didn't land). At today's close you're +7.77% in 6 trading days. The "ADD" signal is real — but for you it's a hold-or-trim decision, not a new entry. If MIS knew about your existing 24 sh, it would suppress UNG from ADD (PORTFOLIO_OVERLAP gate). It doesn't, because the paste isn't there.

3Comparison: Claude vs real Power Hour

Real Power Hour

3:13 PM · thread 19e41aab69ffe3c5

BLUF: SPY down 0.55%; Health Care leading +1.58%, Automobiles weak −1.99%. 8 ADD-state names: XLE, CVX, XOM, UNG, OXY, MSFT, TMV, MDLZ. Setup-only: none.

Final State: 20 ADD · 5 STARTER · 28 WATCH · 0 BLOCKED · 123 REJECTED · 6 EARNINGS_RISK

Holdings: 10 (SPY, META, ASML, LLY, AAPL, EQIX, ORCL, AMZN, AFRM, DAL)

Macro: Gold $412.59 (−1.38%) · Oil $152.65 (+2.36%) · BTC $76,869 · ETHA $16.00 · UUP $27.78 (+0.29%) · 10Y 4.67%

VIX: 18.04 (since 9:55 AM −0.2%)

Claude's read

live sheet @ 11:42 PM

BLUF: Risk-On-with-headwind. SPY soft, rate pressure (10Y +1%) steering money into defensives + energy. 5 clean A-grade names by SACS: XLE, CVX, XOM, UNG, OXY — energy-stack overconcentration risk.

Final State (full sheet): 23 ADD / 5 STARTER / 24 WATCH (Drive cache had earlier snapshot — email rounds 20/5/28)

Holdings reality: 21 paste rows — only 10 surfaced in email (META wrong qty, 11 missing positions). P0 data delivery failure.

Macro check: Gold proxy GLD price valid; ETH "$16.00" is ETHA ETF NAV, not ETH spot ($3K range). Known feed error, Gemini v11 audit flagged it 5/4.

Tail: 40+ breakout candidates in Daily Snapshot that the 8-cap suppresses — KO, LIN, MDLZ, SCHG, V, COST = defensives setup quietly forming.

Where Claude and the Power Hour agree

FieldRealClaudeMatch
Top SACS ADD #1XLE 77.70/AXLE 77.70/A
Top SACS ADD #2CVX 77.61/ACVX 77.61/A
HC leading+1.58%confirmed
Auto weak−1.99%confirmed
Gold$412.59$411.50 (Drive cache)
BTC$76,869$76,611 (Drive cache)

Where Claude and the Power Hour differ

4Power Hour audit — what's still wrong

Ranked P0 → P2. Each with file:line evidence + fix path. Do not implement these in this session — the user's explicit instruction was "produce the report, do not direct-push MIS master." This list is the work-queue for the next MIS code session.

P0 — Live operational gaps that will surface as wrong trades next week

P0-1 · Sunday 5/17 holdings paste did NOT land

Today's three emails show 10 positions. The 5/14 corrected paste-block (outputs/2026-05-14_16-55_action_holdings-paste-block-CORRECTED.md) had 24 rows. 11 positions are entirely invisible to MIS — ABBV (17 sh, the newest position), COST, KO, ABNB, BA, UNG (the very ticker today's email said ADD!), SLV, SCHG, SCHZ, SGOV, GOOG. Plus META qty rendered as 8.25 vs paste's 10.806. Plus AFRM still 15 sh despite the 5/7 sale of 8 sh.

Why this matters. The PORTFOLIO_OVERLAP gate (shipped 5/15) uses misGetHeldTickerSet_() from Trade_Log_Imported. If the paste isn't there, the gate runs against 10 tickers instead of 22. UNG fires as ADD today even though Sam already holds 24 sh @ $11.07 — that's a buy-on-top recommendation the system would correctly suppress with proper data.

Sam action (10 min, Sunday or now) 1. Open outputs/2026-05-14_16-55_action_holdings-paste-block-CORRECTED.md on portal.
2. Open the v1 MIS sheet → Trade_Log_Imported tab → click A1.
3. Replace all rows (header + 24 data rows). Paste the tab-separated block.
4. In Apps Script editor: misBuildHoldingsFromTradeLogImported_ → Run. Read execution log.
5. Run misSendMorningBrief manually → look at the YOUR HOLDINGS section in your inbox.
6. Verify ABBV / COST / KO / UNG / SLV all appear. If yes, paste is good.
7. If ABBV is missing → check Tickers tab has an ABBV row with Include=Y.
P0-2 · FSE is operationally dormant

Session 1 infrastructure is in place (fse_foundation.js:55-227 sets up the 3 FSE tabs + 10 named ranges). Session 3 resolver is wired (fseResolveTicker_ at line 365-456 — full 5-gate pipeline w/ Live Guard / News / Holdings / Portfolio Overlap). But no auto-trigger calls misBuildFSE(). The email reads signals[].finalState, which only carries FSE values if someone clicked the "🚀 Build FSE Now" menu item that day. Otherwise it falls back to Snapshot.FinalState — the v1 compatibility gate, which lacks Portfolio Overlap and Held-Position gates.

Evidence: emailDailySnapshot.js:2234 says "misApplyFSEToSignals_ adds .finalState to signals ONLY if FSE tab has data". Line 2249 comment: "email renders from fresh FINAL_STATE_ENGINE when built today. Snapshot remains only the fallback."

Fix (next MIS code session, ~15 min) Add 3 lines to misRunFullRefreshNow() in emailDailySnapshot.js — at the top, wrapped in try/catch so a build failure doesn't kill the email:
try {
  misBuildFSE();  // populate FINAL_STATE_ENGINE before email render
} catch(e) { Logger.log('FSE build failed: ' + e); }
Keep the menu item as belt-and-suspenders.
P0-3 · Schwab 24+ days stale, AFRM Thu 5/7 sale invisible

SCHWAB_LAST_SYNC still shows 2026-04-14. OAuth functions exist (misGetSchwabAuthUrl_, misFetchSchwabPositions_) but nothing invokes them in the daily flow. The "Schwab: 5d stale" line in the email is hardcoded text, not a real diagnostic.

Surface: AFRM showing 15 sh in today's email. Sam sold 8 sh @ $67.35 on Thu 5/7. Correct count = 7 sh. The system is twelve days behind reality on this one position.

Fix sequence 1. Sam re-runs Schwab OAuth (misGetSchwabAuthUrl_ → browse → paste code → misSchwabExchangeAuthCode_).
2. When token good, add misFetchSchwabPositions_() call to misRunFullRefreshNow alongside the FSE build.
3. Replace hardcoded "5d stale" with a real SCHWAB_LAST_PULL diagnostic.
Alternative if OAuth keeps breaking: enforce the manual-paste discipline (P0-1) as the canonical bridge and remove the Schwab stub claims.

P1 — Coded but dormant

P1-1 · REDUCE / EXIT graduation never invoked

Thresholds defined: emailDailySnapshot.js:5955-5965 — at −7% → REDUCE, at −15% → EXIT, at +20% → REDUCE/lock-gains. But no caller wires this into fseResolveTicker_ or the email render path. Today's email gives ORCL (−11.24%), AMZN (+23.21%), AFRM (+27.37%) a text-only "REDUCE recommended" string; none get a real FSE state graduation, none flow into the Trade Actions section as SELL signals.

Fix: in fseResolveTicker_, before the grade gate, check holdingsByTicker[t]. If pnlPct < −0.15 → FinalState=EXIT, PrimaryRejectCode=HELD_LOSS_EXIT. If −0.15 ≤ pnlPct < −0.07 → FinalState=REDUCE, PrimaryRejectCode=HELD_LOSS_REDUCE. Same for the +20% gain band.

P1-2 · Afternoon delta brief missing

misSendPowerHour300 line 296-322 calls misBuildDailyBrief_('POWER_HOUR'). But the runType arg is never used inside misBuildDailyBrief_ (line 2232). Power Hour is a full re-render of the same content as the Morning Brief, not a delta. Sam's stated ask in issue #7: "different parts of reports… could decide what I want to get when."

Fix: branch on runType in misBuildDailyBrief_. When POWER_HOUR, read REPORT_SNAPSHOTS for the latest PLAYBOOK row (2:13 PM body), diff section-by-section, render only what changed under a "Since 2:13 PM" header.

P1-3 · High Conviction Setups still plaintext (Issue #5)

misBuildHighConvictionSummary_ line 2214 renders as plain text. No bold tickers, no arrows, no colored deltas. The same BLUF-style HTML treatment that misBuildBLUFHtml_ applies (line 5410) needs to be ported.

P1-4 · VolPenalty = 40 still in Reference Rules sheet

Sam's locked target is 15 (per project_mis_resume_marker_pt3.md, May 5 start-of-day checklist item #1). At 40, VolPenalty is 3–4× any other Composite weight; vol-flag toggles produce ±40-point Composite swings → SACS / Grade / FinalState reshuffles between recompute cycles. This is a manual sheet fix, not code: Sam opens Reference Rules → row VolPenalty → set Value=15. The cascade stabilizes immediately.

P2 — Hygiene

5Independent logic review

Is the math right?

ComponentCurrent formula / behaviorVerdict
SACS composite =ROUND(AG*0.3 + AD*0.3 + MIN(100,AW*20)*0.2 + Grade_score*0.2, 2) Math sound Internally consistent within a snapshot. The instability Sam saw 5/4 (LLY 70→39→70) was VolPenalty=40 dominance, not formula error.
Position size shares = $250 risk ÷ (Entry × 5%) Math sound 1% of $25K portfolio per Reference Rules. Standard institutional.
ATR stops Entry − 1.3 × ATR(14) Math sound XLE today @ $61.26 with $58.20 stop = 4.99% drop = sensible.
R:R Target = Entry × 1.10, Stop = Entry × 0.95 → fixed 2:1 Constant, not market Real R:R should vary by setup. The constant produces a "R:R 2.0 — marginal" verdict on every Quick Trade Calc row (gate requires ≥2.5 to flip to "trade"). Suggest deriving Target = next resistance or +1.5σ above 13W high.
VolPenalty −40 per vol-flag (currently) Weight dominance 3–4× other weights. Fix to 15. (P1-4.)

Is Sam capturing the right inputs?

InputStatusDetail
Trend / Flow / SACS / Composite / GradeCapturedSolid base suite.
Sector + RS vs SPY + breadthCapturedSector_Map + Daily Snapshot working.
ATR stops + position sizingCapturedInstitutional pattern.
Live Guard (shock / news / earnings)Captured4 active blocks today.
Holdings P&LCaptured when paste landsP0-1 today.
Volume vs avgCaptured, NOT surfacedMomentum_Engine BF/BG/BH columns. Sam asked Apr 27. Still not in email.
VIX 5/7/10-day historyCaptured, NOT surfacedVIX_OPEN_HISTORY tab populated. Email shows single point only.
News-to-holdings mappingAsymmetricLive Guard tags news as risk; doesn't tag news as bullish-on-held (Burry-buys-PYPL pattern).
Macro → sizingNot capturedNo code that halves position size when VIX > 25.
Sector concentration limitsNot capturedToday's 8 ADD = 6 energy. No cap or warning.
Backtest / outcome trackingNot captured5099 HIST_MOMENTUM rows, nothing scoring them. Issue #9 parked.
Time-in-position disciplineNot capturedAMZN +23% — no age-based trim signal.
Short signals + inverse-ETF playbookNot capturedTBT/UUP/VXX in universe but no short setups surfaced. System is long-only.
Pre-market / after-hours signalsNot captured9:46 AM is earliest fire — gap-up moves already happened.

The honest call

The 6 things Sam IS capturing are good — institutional-grade signal layer. The 7 things that are missing/unwired are roughly half of what makes the difference between "find good setups" and "trade well." The system can identify ADD candidates. It can't yet enforce trade discipline.

Translation: MIS today is a good idea-generator. It's not yet a trade governor. Sam still has to do the governing himself (sector concentration, sizing-vs-VIX, age-based trims). Section 6 below is how to govern with what's there.

6"MIS → 100% useful" plan

How to use what you have today + the upgrade list ranked by leverage. Time, money, momentum bang-for-buck, market regime playbook, ETF vs single-stock.

A · Daily rhythm — 25 min, no more

WhenTimeWhat you do
Pre-market6:30 AM · 3 minOpen v1 sheet on phone. Glance Macro Pulse + News Catalyst. Any TICKER_BLOCK / MACRO_OVERRIDE since yesterday? Don't decide. Absorb.
Morning Brief9:46 AM · 5 minRead BLUF + Today's Game Plan only. If the 8 ADD names sit in one sector (today's energy stack), say it aloud. Don't enter all 8.
Trade window9:55 AM–2:00 PM · 10 min if tradingFor any ADD you're acting on: Quick Trade Calc → type ticker col A → set $Risk col E. Let bracket compute. Place in Schwab/Fidelity. Same day, note in Trade_Log_Imported. One new position max per day unless explicit reason.
Playbook check2:13 PM · 3 minAnything dropped from Game Plan? Any new STARTER? If a name you entered at 10 AM is now REJECTED, that's information.
Power Hour3:07 PM · 3 minScan Holdings P&L. Anything down −7% — trim before close? Anything up +20% on a winner held >7 days — partial trim?
EOD4:05 PM · 1 minConfirm Trade_Log_Imported matches what filled. Paste discipline is what keeps the system honest.

B · Money management rules — the bumpers

C · Markets-up vs markets-down playbook

RegimeIndicatorsPlaybook
Up SPY > 50DMA · VIX < 19 · broad breadth · Sam's RUN_LOG shows no recent SHOCK_DOWN cluster Lean into ADD names with SACS > 70 + Grade A. ETF or single-stock both fine. Hold winners through pullbacks unless stop hits. Standard 1% risk per trade. This is most of 2026 so far.
Choppy SPY oscillating around 50DMA · VIX 19–25 · sector leadership rotating >weekly · multiple Live Guard SHOCKs STARTER size only. Single-stock with high conviction (LLY, NVDA, MSFT-class names) — defer ETFs (chop kills sector beta). 0.5% risk per trade. Today is closer to choppy than up — energy concentration + soft SPY + rate pressure.
Down SPY < 50DMA · VIX > 25 · Live Guard firing daily · 10Y spiking Mostly cash + selective shorts. Inverse ETFs (TBT/TBF for rates, VXX for vol, UUP for dollar). Position sizing halved. No new full positions until VIX rolls back under 25. The system doesn't surface short setups today — you have to spot them.

D · ETFs vs single stocks — when to play which

ETF when…

Today: XLE is the cleanest energy basket play. UNG is the cleanest commodity play (single underlying — nat-gas futures).

Single stock when…

Today: CVX (single-stock energy) edges out XLE if you want the conviction trade. LLY held, +4.94% from entry — that's a hold.

E · Momentum bang-for-buck rules

F · How to use the sheet (the 5-tab subset that matters)

TabWhat you read forHow often
Daily SnapshotRegime · VIX · 10Y · breadth · breakout candidates listEvery fire
Snapshot (per-ticker)ATR stop · position size · Setup type · Contrarian flag · Outlier flag · risk %Before any trade
Quick Trade CalcBracket order math · R:R · MIS_State · VerdictWhen entering
Trade_Log_ImportedWhat you actually hold · cost basis · which accountEOD reconcile
Live GuardActive BLOCKs · SHOCK_DOWN / NEG_NEWS / EARNINGS_RISKBefore any trade · skim daily

The other ~50 tabs are support (RUN_LOG, DIAGNOSTICS, HIST_*, REPORT_SNAPSHOTS, NEWS_CATALYST, CONTROL). Look only when something's wrong.

G · What would make MIS 100% useful — ranked by leverage

  1. Holdings discipline + Schwab auto-pull (P0). Without correct holdings, every gate that depends on isTickerHeld_ is wrong. This is the single biggest unlock.
  2. REDUCE / EXIT graduation wired (P0). System needs to tell you when to trim, not just enter. Already coded — needs caller.
  3. FSE auto-trigger before email (P0). Otherwise email falls back to old gate.
  4. Sector cap warning (P1). Rendered inline: "8 ADD: 6 energy → recommend 2 of 6 (XLE + UNG by SACS)".
  5. Volume + VIX trajectory surfaced (P1). Two extra lines in BLUF. Both Sam-requested Apr 27.
  6. Backtest tracking — Issue #9 (P2, high leverage). 5099 rows of HIST_MOMENTUM already there. Score the system against its own past calls. Could change which setup types you trust.
  7. Short signals + inverse-ETF playbook (P2). Adds down-market utility. Critical for the next time we see a sustained VIX > 25 stretch.
  8. Macro → sizing automation (P2). When VIX > 25, halve QTC sizing column. Codifies the rule.

H · Tonight's clean call (acting tomorrow morning)

If you're going to act on anything from today's emails

1. Paste the 24-row holdings block first — P0-1 above. 10 min. Run misBuildHoldingsFromTradeLogImported_. Then re-run misSendMorningBrief manually. Verify ABBV / COST / UNG appear.

2. Once the paste is in, MIS will correctly suppress UNG, COST, KO from its ADD list (already-held). Today's real "new buy" candidate shrinks to CVX or XOM — single-stock energy plays, both A-grade, both +1%-ish on the day, both sector-leading.

3. Don't enter both. CVX has the cleaner setup (higher SACS, mid-cap energy, less commodity-price beta than XOM). One position, 1% risk, ATR stop at $187, target $221.

4. If you want pure beta to energy without single-stock risk: XLE instead of CVX. Same direction, less event risk.

5. Hold off on UNG add until you've decided on the energy concentration question. 24 sh @ $11.07 already + day's +3.42% = you're +7.77% in 6 days. That's a trim-25% candidate per the +20%-in-15-days rule (you're not there yet — but watching).