בס״ד

MIS — FSE Architecture Addendum · 2026-05-01

docs/MIS_FSE_ADDENDUM_2026-05-01.md · last changed (pre-VM history) · rendered from GitHub master

MIS — FSE Architecture Addendum · 2026-05-01

Status: Append-only addendum to docs/MIS_FSE_ARCHITECTURE.md (canonical Apr 27).
Captured: Fri May 1 2026 · 3:30 PM EDT · Session 21 · Claude Code Opus 4.7 (1M).
Source: Sam's parallel sessions in Claude Excel + Gemini (their handoff briefs are in MIS/claude_excel_# MIS Handoff Brief — 2026-05-01.txt and MIS/gemini_Here is the full handoff brief form.txt).


Why this doc exists

Sam ran two parallel sessions today (May 1) — one in Claude Excel and one with Gemini — both editing the MIS workbook. They produced:
1. A new merged master file (different naming convention from the existing repo)
2. An explicit SACS formula previously only inferable
3. Two new tabs (Entry_Pad, EntryTracker) addressing the entry workflow gap
4. Macro context centralization (claimed; needs verification)
5. A python production-builder script (MIS_v8_production_builder.py) for fresh workbook generation

The canonical FSE doc was written Apr 27 against the production sheet. Today's work happened against a forked Excel mirror. This addendum reconciles.


1. The new master file

Aspect Value
Filename MIS_v7.1_gsheet_forclaudeedit_5-1_z gemini fixes.xlsx (and _v2.xlsx later iteration)
Drive ID (live edit copy in MIS_v7.1_gsheet_forclaudeedit1HEmRevZZZmpXEnjkkwxIw0VetEjFVe5ZxVYzu4hgo2c)
Tab count 58 (was 56 + Entry_Pad + EntryTracker)
Tab naming Spaces (e.g., Reference Rules, Momentum Engine) — different from production sheet which uses underscores
Status ACTIVE MASTER per Claude Excel handoff
Production sheet 1cosuFrU_EJRAprVMm-FEpmddSUTVQWhlI0tHpS1w2S4 — the FSE canonical implementation target. Excel mirror is for editing only

2. SACS formula — finally explicit

Quoted verbatim from the Claude Excel handoff brief:

SACS = ROUND(AG*0.3 + AD*0.3 + MIN(100, AW*20)*0.2 + Grade_score*0.2, 2)

Where:
  AG = Composite (13-weight sum from Reference Rules named cells)
  AD = FlowStrength (0-100)
  AW = RR_13W (capped at 100 after ×20 multiplication)
  Grade_score = numeric mapping of Grade A/B/C/D

Why this matters

Before this brief, SACS was reverse-engineered as additive composite + flow boost + grade boost (per the Apr 27 audit). The actual formula is a weighted average with each component pre-normalized to 0-100 before combining. This addresses the methodology weakness flagged in the Apr 27 sheet audit (vol penalty dominance because non-normalized factors with disparate scales).

Weights: 30% Composite + 30% FlowStrength + 20% RR_13W (capped) + 20% Grade.

Grade thresholds (NEW, from Claude Excel Session 7)

Grade Threshold
A ≥ 40
B ≥ 25
C ≥ 10
D < 10

Caveat: these are CLAIMED to be derived from Composite, but the actual mapping function from Composite-to-Grade isn't documented in either handoff brief. To verify in Session 2 (Brain Restore).

Verified ground-truth outputs (Claude Excel Session 7)

Ticker Setup SACS Composite Grade Flow Notes
NVO Breakout Watch 61.22 43 A 69 Pre-Earnings May 6
AAPL Momentum Trim 41 24 C 74 RR_13W = -0.09; Pre-Earnings 4/30

These can be used as regression-test fixtures for Session 1 FSE wiring.


3. Column maps (verbatim from Claude Excel handoff)

Momentum Engine (56 cols)

A=Ticker B=Name C=DayChg% D=Price E=DayHigh F=DayLow G=%FromHigh H=%FromLow
I=3D% J=10D% K=30D% L=30D_Avg M=Above30D N=13W_High O=13W_Low P=%From13WH Q=%From13WL
R=52W_High S=52W_Low T=%From52WH U=%From52WL V=Vol30D W=DayRange% X=Compression
Y=Trend Z=Regime AA=STTag AB=VolMode AC=FlowProxy AD=FlowStrength AE=Setup
AF=EventImpact AG=Composite★ AH=ActionFlag AI=Stop_1.5ATR AJ=Target_3ATR
AK=Sector AL=Industry AM=SectorAvg3D AN=SectorMean3D AO=SectorStdev AP=ZScore
AQ=Outlier AR=Contrarian AS=RS_SPY AT=RS_Sector AU=RVI AV=Grade AW=RR_13W★
AX=IPQ★ AY=VSM★ AZ=SACS★★ BA=EarnDate BB=EarnFlag BC=IPQ_Pct BD=Notes

Snapshot tab (60 cols) — this is the FSE-shape pipeline

A=Ticker B=Name C=Price D=DayChg% E=Sector F=Setup G=Trend H=Regime I=Flow J=ATR14
K=Stop_1xATR L=Stop_1.3xATR M=Stop_2xATR N=Risk%_1.3 O=Target%_2.5R P=Target_Price
Q=Shares_1pct R=Position_$ S=RR_Ratio T=SACS★ U=FlowStrength V=Composite W=Grade
X=VSM Y=RVI Z=RS_SPY AA=RS_Sector AB=%From52WH AC=%From52WL AD=%From13WH AE=Above30D
AF=Compression AG=Vol30D AH=Outlier AI=Contrarian AJ=EarnDate AK=EarnFlag
AL=DaysToEarn AM=ActionFlag AN=RiskGate_2.5 AO=GradeGate_AB AP=SACS_Gate_60
AQ=FlowGate_75 AR=FinalGate AS=FinalState★ AT=RejectCode AU=Notes
AV=DataQuality AW=AsOf AX=RR_13W AY=IPQ AZ=Beta BA=Industry BB=Type
BC=Include BD=ProxyETF BE=DayHigh BF=DayLow

Mapping to FSE canonical schema

The FSE canonical doc §5 specifies a FINAL_STATE_ENGINE tab with 30 specific columns. The merged file's Snapshot tab implements most of FSE-shape but with a different schema:

FSE canonical column Snapshot equivalent Notes
AsOf AW
Ticker A
Price C
ChangePct D
ScannerState F (Setup) + G (Trend) Decomposed
SetupType F
SACS T
Grade W
Flow I
Trend G
RiskPct N (Risk%_1.3)
Sector E
LiveGuardState MISSING in Snapshot
NewsState MISSING in Snapshot
EarningsState AK (EarnFlag)
PortfolioOverlapState MISSING in Snapshot
ExtensionState MISSING in Snapshot
FinalState AS
PrimaryRejectCode AT ✓ (single, not primary/secondary split)
ActionAllowed AM (ActionFlag) partial
Stop L (Stop_1.3xATR)
Target P
RR S
Shares Q
DataQuality AV

Gap summary

The Snapshot tab is FSE-shape but not FSE-complete. Missing per canonical schema:
- LiveGuardState column
- NewsState column
- PortfolioOverlapState column
- ExtensionState column
- Secondary RejectCode column
- RunType (Morning vs Power Hour vs Playbook) column

These need to be added in Session 1 of the canonical FSE plan when the proper FINAL_STATE_ENGINE tab is created. The Snapshot tab is not yet a substitute.


4. The 5-gate decision pipeline (now documented)

Per Snapshot tab cols AN-AS, the merged file has the explicit 5-gate pipeline:

Gate Column Threshold Outcome on fail
Risk Gate AN (RiskGate_2.5) Risk% ≤ 2.5 RISK_FAIL
Grade Gate AO (GradeGate_AB) Grade in {A, B} GRADE_FAIL
SACS Gate AP (SACS_Gate_60) SACS ≥ 60 SACS_FAIL
Flow Gate AQ (FlowGate_75) FlowStrength ≥ 75 FLOW_FAIL
Final Gate AR (FinalGate) All four prior pass + EarnFlag clear EARNINGS_BLOCK or rolled-up reject
→ FinalState AS ADD / STARTER / WATCH / REJECTED / EARNINGS_RISK (final classification)

This matches FSE Resolver Order (canonical doc §3) closely. Gaps:
- No Live Guard gate (item #2 in canonical resolver)
- No Existing-Position-At-Loss gate (#3)
- No Portfolio Concentration gate (#4)
- No Extension gate (#9)
- No Stop/Trigger gate (#10)

So the merged file implements 5 of the 11 canonical resolver gates. Sessions 1-4 of the canonical plan are still required to add the remaining 6 + relabel as FINAL_STATE_ENGINE.


5. Macro context — claimed fix vs verified state

Gemini's brief claims: "Eliminated ETF proxies for macro data and routed all live pricing through the Tickers tab" — using .INX, .DJI, .IXIC for indexes plus VIX, Gold, Bitcoin, Oil, 10-Year Yield.

Verified state (from Drive read 2:30 PM May 1, sheet 1HEmRevZZZmpXEnjkkwxIw0VetEjFVe5ZxVYzu4hgo2c):

Macro item What the sheet shows Correctness
S&P 500 $7,239.66 ✓ correct (SPX index)
Dow $49,570.67 ✓ correct (DJI index)
Nasdaq $25,139.38 ✓ correct (IXIC)
VIX 16.94 ✓ correct
Gold $424.22 ❌ Still GLD ETF price (gold spot is ~$3,300/oz)
Bitcoin $78,544.80 ✓ correct (BTC spot)
Oil (WTI) $142.66 ❌ Still USO ETF price (WTI is ~$60-80/bbl)
10-Year Yield 4.38% ✓ correct
DXY (USD) (not in macro panel) ❌ Missing
Ethereum (not in macro panel; columns exist in Macro_v2 log but unwired) ❌ Missing

Verdict: Bitcoin is fixed. Indexes are correct. Gold + Oil + USD + ETH still wrong. The Gemini work fixed indexes (move from INDEXSP:.INX references) but did not migrate Gold to CURRENCY:XAUUSD, Oil to a proper WTI feed, or add DXY/ETH.

Required fixes (5-minute job each):
- Gold: =GOOGLEFINANCE("CURRENCY:XAUUSD")
- Oil WTI: =GOOGLEFINANCE("CL=F") if GF still serves futures, otherwise external feed
- DXY: =GOOGLEFINANCE("INDEXNYSEGIS:DX")
- ETH: =GOOGLEFINANCE("CURRENCY:ETHUSD") (if available; otherwise CoinGecko via fetch)

This is Gripe A from the FSE canonical doc — partially closed but not closed. Carries forward.


6. Two new tabs — Entry_Pad + EntryTracker

Built in Session 6+7 (May 1). Per Claude Excel handoff:
- Entry_Pad (position 4, blue color) — per-trade entry workflow form. Inherits from zGoogle Finance Investment Tracker (Sheet 4 in the canonical FSE doc) which had Entry Pad as a per-ticker research form with ATR stop, target, R:R 3.0, 13W/52W proximity, volume vs avg, volatility, 40+ day daily close history, momentum flags, risk box.
- EntryTracker (position 5) — log of entries made through Entry_Pad.

Mapping to FSE plan: these implement parts of Session 9 (Entry Pad rebuild + bridge to FSE) ahead of schedule. They're useful artifacts but built without the FSE foundation (Sessions 1-8) below them. Decision needed: keep these as-is and retrofit FSE bridge later, or rebuild against FSE once it exists?

Recommendation: keep, freeze, and revisit in Session 9. The schemas are correct; the missing piece is the FSE-lookup (read FinalState before allowing entry).


7. Owed work per Claude Excel handoff (still pending)

Tab Purpose Priority
Signal_View 3-panel dashboard (Breakout / Contrarian / Oversold) filtered from Snapshot High
Momentum_Digest 7-bucket emoji grouping of all 184 tickers by Regime + SACS Medium
Sector_Rotation Manual curated table with formatting scaffold Medium

These are email/output-layer tabs, not engine tabs. They feed Session 5/7 of the FSE canonical plan (Email reads FSE only; Email rebuild). Build them AFTER FSE Session 1 wires the canonical engine — otherwise they'll suffer the same surface-conflict problem the Architect emails have today.


8. Apps Script email-render mismatch

Per Claude Excel handoff:

"Email render system is broken downstream (separate problem). NVO email said LEAN IN/SACS 100; engine computes Breakout Watch/SACS 61. Apps Script render uses different/older logic than Momentum Engine."

This is the surface-conflict problem the FSE doc was built to solve (canonical §3 + §10 acceptance test #11 "Email reads FinalState from FSE only. No independent signal decisions.").

Fix path: Session 5 of canonical plan — emailDailySnapshot.gs reads FSE.FinalState and FSE.SACS only. The fact that the merged file has Snapshot tab with FinalState already populated means half the work is done. The remaining half is the Apps Script change.


9. Python builder script (MIS_v8_production_builder.py)

Sam dropped two python scripts in MIS/python/:
- MIS_v8_builder.py
- MIS_v8_production_builder.py

These build a fresh xlsx workbook from scratch with:
- Settings tab (VIX thresholds, equity, risk caps, regime multipliers)
- Tickers, Market_Data, Command_Center, Holdings, Trade_Planner, Behavior_Tracker tabs
- GOOGLEFINANCE formulas for gsheets edition; STOCKHISTORY for Excel edition

Role: "fresh start" template generator. Different design philosophy from the merged file (much smaller — 8-10 tabs vs 58). Could be useful as a reference for clean-slate FSE build but is NOT the canonical implementation.

Decision: keep in repo as MIS/python/. Document that this is a sandbox builder, not the production target.


10. The next concrete action

Per FSE canonical §16 — Session 1 brief: paste docs/MIS_FSE_ARCHITECTURE.md + this addendum + the Claude Excel handoff brief into a new Claude Code session. Goal: wire INTC end-to-end through a proper FINAL_STATE_ENGINE tab on the production sheet (not the Excel mirror).

Do NOT in Session 1:
- Do not edit the merged xlsx file (it stays as a working draft)
- Do not migrate Snapshot → FINAL_STATE_ENGINE in the Excel mirror
- Do not build Signal_View / Momentum_Digest / Sector_Rotation
- Do not touch the Apps Script email render

DO in Session 1:
- Clone production sheet
- Create proper FINAL_STATE_ENGINE tab (30 cols per canonical §5)
- Create FINAL_STATE_HISTORY + SURFACE_CONFLICT_CHECK
- Wire INTC manually
- Verify FinalState resolves correctly

The merged xlsx work is preserved as the design reference for what columns and formulas should look like once Session 2 (Brain Restore) ports them into production.


11a. v1 vs v2 sheet diff (added 4:00 PM May 1)

Sam shared a second sheet 1F31zPcaXtyszJnGcgHSgnkwsUua3qvei8U-CZf8kXQU (MIS_v7.1_gsheet_forclaudeedit_5-1_z gemini fixes_v2) created by downloading v1 as xlsx, editing in Excel, re-uploading.

v2 verdict: BROKEN — Excel-roundtrip corruption confirmed.

Surface v1 (1HEmRev) v2 (1F31zPca)
Top 10 Movers Flow column populated (50, 85, 73, 76 etc.) #NAME? on every row
Bottom 10 Movers Flow populated #NAME? on every row
TSLA Action Verdict "✘" blank
TSLA SACS Score "41.06" blank
TSLA Setup Type "Hold/Wait" blank
TSLA Mom. Regime "Reversing Up" blank
TSLA Vol populated blank
Sector Performance Avg SACS / Flow "33.22" / "50.00" etc. all blank
Performance Summary Avg SACS / Flow populated blank
Decision Quality Grade Gate Pass Rate non-zero 0
Conversational Check full sentence with values placeholder gaps ("the system is telling me to Action Verdict because it's currently in a Uptrend with momentum")

Root cause: GOOGLEFINANCE doesn't survive the Excel save→reupload roundtrip. When the live formulas evaluate to #NAME? in Excel, all downstream calcs (FlowStrength, SACS, Setup, Composite) cascade. Re-uploading to Sheets re-fires GOOGLEFINANCE for the original calls but the downstream chain stays poisoned because the Excel-saved values are static text now.

Recommendation: DISCARD v2. Stay on v1. Any edits Sam made in Excel that he wants preserved need to be manually re-applied to v1 (probably none — most of the v2 changes are likely the same value updates v1 already has live).

Action for Sam: rename v2 to MIS_v7.1_DO_NOT_USE_excel_roundtrip_corruption_2026-05-01.xlsx or move to Drive trash so it doesn't get accidentally re-opened as the working master.


11b. Apps Script project mapping (added 4:30 PM May 1)

After Sam shared the script project IDs:

Sheet Drive ID Script project ID Script project state
Production 1cosuFrU_EJRAprVMm-FEpmddSUTVQWhlI0tHpS1w2S4 1r9vWL1DsqSloDL8OteFNekkDZihFw_5jtTBSJ0UjbEigwRxGlILtUzbI ("emailDailySnapshot") POPULATED — 360KB+ source, matches local MIS/src/Code.js + emailDailySnapshot.js
Gemini v1 1HEmRevZZZmpXEnjkkwxIw0VetEjFVe5ZxVYzu4hgo2c 1yBMztL4RCYGViYMuCSNoahvTzvRS83VgDX0OXMzr0IvUFjghQ2pDpm7Q ("gemini sheet") EMPTY — file exists in Drive, Code.gs source is "", just default config
Excel-roundtrip v2 1F31zPcaXtyszJnGcgHSgnkwsUua3qvei8U-CZf8kXQU None No script bound

Strategic implication: v1's bound script project exists as a clean shell. To make v1 live, copy production code into v1's empty script via clasp push. No manual "Extensions → Apps Script" creation step needed — Sam already has the project ready, just empty.

Blocker: clasp auth expired (invalid_rapt). Sam needs to run ! clasp login before clasp clone/push works.

Local prep done Session 21: created empty MIS-v1-script/ directory at workspace root, ready for clasp clone 1yBMztL4... once auth is restored.


11. Open questions for Sam (decide before next session)

  1. Production target: the canonical FSE plan targets the production Google Sheet (1cosuFrU_...). The Claude Excel work targets the editable mirror (1HEmRevZZZ...). Are we cutting over to the Excel mirror as the new production, or porting back to the original?
  2. Tab naming convention: spaces (merged) or underscores (production)? FSE doc references underscores throughout. Pick one.
  3. Schwab credentials migration: still in CONTROL tab plaintext per Data Health warning. Move to PropertiesService now or after Session 5?
  4. Macro feed fix priority: 5-minute job for Gold/Oil/DXY/ETH — do this before any other FSE work since the macro panel is the top of every email and currently misleading.

Generated 2026-05-01 3:30 PM EDT · Session 21 · Claude Code Opus 4.7 (1M) · synthesizing Claude Excel handoff + Gemini handoff + Drive sheet read + workspace doc cross-reference.

Source trail · docs/MIS_FSE_ADDENDUM_2026-05-01.md @ master · rendered 2026-07-02 7:23 PM EDT by scripts/build-docs.py · the .md in the repo is the truth; this page is the phone-readable view