בס״ד

MIS Email Render — UI/UX Requirements (Post-FSE Targets)

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

MIS Email Render — UI/UX Requirements (Post-FSE Targets)

Status: Architectural requirements log. Do NOT code these tonight. FSE Session 1 (MIS_FSE_ARCHITECTURE.md §8) is prerequisite.
Captured: 2026-05-03 9:30 PM EDT · Session 22 pt 2
Source: Gemini critique #3 (May 3 Power Hour test email teardown) + Genesis Context §13 + Sam's recurring email-clarity asks


When these apply

After FSE_ENGINE tab exists and is the single source of decision truth (per MIS_FSE_ARCHITECTURE.md). Email render becomes a consumer of FSE state, not an independent classifier.

Until then: keep current Lean In / Actionable / Watch split (already shipped 2026-05-03 commit).


Requirement 1 — Zero Contradictions Rule

Rule: Email must never surface a ticker under "Trade Actions," "Lean In," "High Conviction," or any execution-implying header unless the ticker has cleared the FSE ADD or STARTER gate.

Pattern that violated this (May 3 test email):
- Game Plan said "OBSERVE-ONLY — 0 actionable today"
- Trade Actions section showed 💎 LEAN IN: LLY, PEP, XLU, DBX, AAPL
- Reader has to resolve the conflict the system should have resolved

Already partially fixed (May 3): Plaintext + HTML now split into ✅ ACTIONABLE TODAY (In Sync gate) vs 💎 LEAN IN SETUPS — INFORMATIONAL ONLY (pattern only).

Still needed (post-FSE):
- Replace independent signalTag === 'Lean In' filter with FSE.FinalState IN ('ADD','STARTER') lookup
- Tickers that are FSE-WATCH go to "🔭 On The Radar" appendix at email tail, never near execution headers
- Tickers that are FSE-BLOCKED / REJECTED never appear in user-facing render at all (still logged in DIAGNOSTICS)


Requirement 2 — Smart Earnings Tiering

Rule: Earnings list must split into two tiers with distinct visual weight. No "top 5 dumb cap" filter.

Tier 1 — Direct Risk (always show, bold):
- Currently held tickers (per Holdings_Clean)
- Active watchlist tickers (per Tickers tab Include = TRUE)

Tier 2 — Macro Movers (always show, dimmer):
- Mkt Cap > $150B (per Tickers tab cap column or Yahoo lookup)
- OR Mag 7 (AAPL, MSFT, GOOG, AMZN, NVDA, META, TSLA — already wired in misBuildMag7_)
- OR sector leaders for Semis / Banks / Mega-cap Tech regardless of cap

Tier 3 — Hide:
- Small/mid-cap not in Tier 1 or 2
- Behind a "+ N other tickers reporting this week (see EARNINGS_REPORTED_LOG)" footer

Implementation hint: add IsMacroMover boolean column to Tickers tab (or compute from cap+sector lookup). Email reads that flag.


Requirement 3 — Mandatory Risk Display

Rule: Any ticker printed under Holdings or Trade Actions MUST display Stop and Target inline.

Today's failure: Trade Progress block shows P&L without showing where the rip-cord is.

Format: TICKER · $price (+chg%) · Stop: $X · Target: $Y · R:R: 2.0

Source data: Snapshot tab columns K (Stop_1xATR), L (Stop_1.3xATR), M (Stop_2xATR), P (Target_Price), S (RR_Ratio). All exist; render layer just doesn't pull them.

Tied to Trade_Planner: if Entry_Date is populated (per Sam's manual entry), show Held N days after R:R.


Requirement 4 — BLUF (Bottom Line Up Front)

Rule: First element of every email body (after header band) must be a 1-2 sentence dynamically generated summary.

Inputs: Macro regime label, breadth (in-sync count vs total), FSE actionable count.

Format:

BLUF: Regime is <NORMAL|SELECTIVE|DARK> · Breadth <N of M tickers in sync> · FSE shows <K actionable> setups today.
One-line read: <dynamic narrative tied to those 3 numbers>

Examples:
- Regime NORMAL · 47 of 184 in sync · FSE shows 3 actionable. Selective tape, narrow leadership.
- Regime DARK · 12 of 184 in sync · FSE shows 0. No new entries; protect capital.
- Regime NORMAL · 89 of 184 in sync · FSE shows 7. Broad strength; full deployment allowed.

Already partially shipped: the existing misBuildBLUF_ (May 1 commit 4504d44) has the skeleton. Needs to be promoted to position #1 (currently buried below Macro Pulse) and rewritten to read off FSE counts not raw signal counts.


Requirement 5 — Market Mode Framing (added 2026-05-03 after Sun PM test)

Rule: Every email must carry an explicit "Market Mode" line at the top describing why the data looks the way it does. Empty actionable list with no framing = reader assumes system is broken.

The missing frames:
- Closed (weekends, holidays): "📅 Markets closed · Showing post- data · Mon Open setups to watch: [N candidates]"
- Pre-market (4-9:30 AM weekdays): "🌅 Pre-market · Yesterday's close data + overnight news · No live trigger gates yet"
- Open / mid-day (9:30 AM – 2:30 PM): "📈 Live trading · Setups not yet validated for ADD (per FSE Time Lock §X) · STARTER tier may fire"
- Power Hour (3:00-4:00 PM): "⚡ Power Hour · Live tape · ADD signals unlocked"
- After-hours (4-8 PM): "🌆 After-hours · Today's close data · Tomorrow's setups previewing"

Hypothetical-mode caveat: when no setups qualify due to mode (closed/pre-market), the email should still show what WOULD be top-conviction if market were open. Frame as: "Hypothetical Lean In if market were open: TICKER1, TICKER2, TICKER3 — verify on Mon open."

Source: Sam Sun May 3 10:25 PM EDT — email read came across as broken because it didn't acknowledge market state. "Why isn't it telling me that the reason it's not there is because it's after hours?"

Implementation note: FSE schema already includes DataQuality and RunType columns. After Session 1, RunType can carry the mode value. After Session 5 (email reads FSE), this becomes a one-line read at top of every email body.


Sequencing rule

These 4 requirements are downstream of FSE. They can be wired in any order after FSE_ENGINE tab exists, but not before — wiring them on top of the current pre-FSE pipeline (where 4 surfaces classify independently) builds a more elaborate version of the contradiction Gemini's critique #3 already exposed.

Proposed order once FSE is in place:
1. R1 (Zero Contradictions) — biggest reader-trust win
2. R4 (BLUF) — sets the frame for everything below it
3. R3 (Mandatory Risk Display) — every ticker now self-documents
4. R2 (Smart Earnings Tiering) — last because requires Mkt Cap data wiring


Source trail

Source trail · docs/MIS_EMAIL_RENDER_REQUIREMENTS.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