{
 "packet_version": 2,
 "generated_at": "2026-07-17T16:22:04.085451-04:00",
 "session": "close",
 "reading_protocol": [
  "1. Read current.squeeze.label/score/direction \u2014 the headline state.",
  "2. Check current.gex.net_gex_usd_per_pct sign \u2014 negative = amplification regime.",
  "3. Locate spot vs triggers (flip, call_wall, put_wall, pin) \u2014 these are the map.",
  "4. Check charm_flow_into_close_usd and net_vex \u2014 the engine of 14:00-16:00 drift.",
  "5. Read moc.side/confidence \u2014 the 15:50 auction overlay.",
  "6. Scan history_tail for regime changes (net_gex sign flips, wall migrations).",
  "7. Apply doctrine_md decision trees; state triggers + invalidation, never certainty."
 ],
 "current": {
  "spot": 7457.6899,
  "squeeze": {
   "score": 40,
   "max_score": 100,
   "label": "WATCHFUL",
   "direction": "squeeze_down",
   "components": [
    {
     "name": "gamma_regime",
     "points": 20,
     "max": 25,
     "why": "Net GEX $-12.1B NEGATIVE (p15 of 39-run history) \u2014 dealers short gamma, hedging chases price and amplifies moves"
    },
    {
     "name": "flip_proximity",
     "points": 8,
     "max": 20,
     "why": "Flip 7523 is 0.88% away \u2014 reachable on a strong tape"
    },
    {
     "name": "wall_pressure",
     "points": 3,
     "max": 15,
     "why": "Spot mid-range between walls \u2014 no immediate wall event"
    },
    {
     "name": "dte0_fuel",
     "points": 2,
     "max": 15,
     "why": "Thin 0DTE fuel near spot ($0M) \u2014 off-hours or early session"
    },
    {
     "name": "vanna_charm",
     "points": 5,
     "max": 15,
     "why": "Vanna ($-103,109M) and charm ($+0M) oppose each other \u2014 flows partially cancel"
    },
    {
     "name": "moc_alignment",
     "points": 2,
     "max": 10,
     "why": "MOC read SELL but LOW confidence (model_estimate) \u2014 context only, no points for a guess"
    }
   ],
   "triggers": {
    "upside_ignition": 7700.0,
    "downside_ignition": 7300.0,
    "pin_magnet": 7400.0,
    "regime_flip": 7523.412718848146
   },
   "invalidation": "Squeeze thesis invalidates if SPX reclaims/holds above the flip (7523.412718848146) for 15+ minutes, or if the 15:50 MOC prints opposite the flow."
  },
  "gex": {
   "net_gex_usd_per_pct": -12066602092.387726,
   "net_gex_0dte_usd_per_pct": 0.0,
   "dte0_share_of_abs_gex": 0.0,
   "dte0_fuel_near_spot_usd": 0.0,
   "gamma_flip": 7523.412718848146,
   "gamma_flip_dist_pct": -0.881,
   "call_wall": 7700.0,
   "put_wall": 7300.0,
   "pin_strike": 7400.0,
   "magnets": [
    {
     "strike": 7300.0,
     "gex_usd": -4893212704.0,
     "call_oi": 82601,
     "put_oi": 171751
    },
    {
     "strike": 7700.0,
     "gex_usd": 3178431704.0,
     "call_oi": 111474,
     "put_oi": 35611
    },
    {
     "strike": 7600.0,
     "gex_usd": 3099086323.0,
     "call_oi": 191384,
     "put_oi": 143099
    },
    {
     "strike": 7800.0,
     "gex_usd": 3075128520.0,
     "call_oi": 124776,
     "put_oi": 26893
    },
    {
     "strike": 7200.0,
     "gex_usd": -2766648828.0,
     "call_oi": 75168,
     "put_oi": 152162
    },
    {
     "strike": 7650.0,
     "gex_usd": 2505092465.0,
     "call_oi": 66597,
     "put_oi": 16919
    },
    {
     "strike": 7400.0,
     "gex_usd": -2443415144.0,
     "call_oi": 103839,
     "put_oi": 125239
    },
    {
     "strike": 7350.0,
     "gex_usd": -2350995639.0,
     "call_oi": 42475,
     "put_oi": 79071
    },
    {
     "strike": 7750.0,
     "gex_usd": 2195798918.0,
     "call_oi": 73549,
     "put_oi": 9649
    },
    {
     "strike": 7620.0,
     "gex_usd": 2061735897.0,
     "call_oi": 31773,
     "put_oi": 6084
    }
   ],
   "net_vex_usd_per_volpt": 48719817589.89384,
   "dealer_charm_usd_per_day": -10180605742.573837,
   "charm_flow_into_close_usd": 0.0,
   "minutes_to_close": 0.0
  },
  "moc": {
   "source": "model_estimate",
   "side": "SELL",
   "net_imbalance_bn": null,
   "note": "No imbalance feed available \u2014 direction inferred from intraday trend + dealer charm flow. Treat as LOW confidence.",
   "date": "2026-07-17",
   "read_at": "2026-07-17T16:22:04.083800-04:00",
   "imbalance_published": true,
   "publish_time_et": "15:50",
   "calendar": {
    "is_opex": true,
    "is_quad_witching": false,
    "is_spx_rebalance": false,
    "is_month_end": false,
    "is_quarter_end": false,
    "is_russell_recon": false,
    "expected_auction_size_bn": 8.1
   },
   "confidence": "low"
  }
 },
 "history_tail": [
  {
   "ts": "2026-07-16T10:17:08.333760-04:00",
   "session": "morning",
   "spot": 7549.77,
   "net_gex_bn": 30.984,
   "net_gex_0dte_bn": -6.981,
   "flip": 7544.137769520076,
   "call_wall": 7600.0,
   "put_wall": 7520.0,
   "pin": 7600.0,
   "net_vex_mm": 51469.1,
   "charm_close_mm": 7067.8,
   "squeeze_score": 48,
   "squeeze_dir": "squeeze_down",
   "moc_side": "SELL",
   "moc_usd_bn": null,
   "moc_source": "model_estimate",
   "rt_spot": 753.47
  },
  {
   "ts": "2026-07-16T12:33:19.056353-04:00",
   "session": "midday",
   "spot": 7548.0601,
   "net_gex_bn": 27.595,
   "net_gex_0dte_bn": -8.507,
   "flip": 7544.880082886472,
   "call_wall": 7600.0,
   "put_wall": 7520.0,
   "pin": 7600.0,
   "net_vex_mm": 51177.6,
   "charm_close_mm": 4262.4,
   "squeeze_score": 48,
   "squeeze_dir": "squeeze_down",
   "moc_side": "SELL",
   "moc_usd_bn": null,
   "moc_source": "model_estimate",
   "rt_spot": 752.07
  },
  {
   "ts": "2026-07-16T15:02:59.783966-04:00",
   "session": "afternoon",
   "spot": 7532.7998,
   "net_gex_bn": 7.812,
   "net_gex_0dte_bn": -15.576,
   "flip": 7542.393257677183,
   "call_wall": 7600.0,
   "put_wall": 7520.0,
   "pin": 7520.0,
   "net_vex_mm": 50700.5,
   "charm_close_mm": 1457.9,
   "squeeze_score": 58,
   "squeeze_dir": "squeeze_down",
   "moc_side": "SELL",
   "moc_usd_bn": null,
   "moc_source": "model_estimate",
   "rt_spot": 750.43
  },
  {
   "ts": "2026-07-16T15:50:05.979561-04:00",
   "session": "moc",
   "spot": 7513.8301,
   "net_gex_bn": -13.182,
   "net_gex_0dte_bn": -24.305,
   "flip": 7534.947701251791,
   "call_wall": 7600.0,
   "put_wall": 7515.0,
   "pin": 7515.0,
   "net_vex_mm": 50311.1,
   "charm_close_mm": 400.4,
   "squeeze_score": 71,
   "squeeze_dir": "squeeze_down",
   "moc_side": "SELL",
   "moc_usd_bn": null,
   "moc_source": "model_estimate",
   "rt_spot": 7510.63
  },
  {
   "ts": "2026-07-16T15:55:02.220387-04:00",
   "session": "moc",
   "spot": 7516.7598,
   "net_gex_bn": -11.569,
   "net_gex_0dte_bn": -23.172,
   "flip": 7536.966370618433,
   "call_wall": 7600.0,
   "put_wall": 7515.0,
   "pin": 7515.0,
   "net_vex_mm": 50548.7,
   "charm_close_mm": 151.1,
   "squeeze_score": 79,
   "squeeze_dir": "neutral",
   "moc_side": "BUY",
   "moc_usd_bn": null,
   "moc_source": "tape_reaction",
   "rt_spot": 7524.42
  },
  {
   "ts": "2026-07-16T16:19:56.646141-04:00",
   "session": "close",
   "spot": 7533.77,
   "net_gex_bn": 30.866,
   "net_gex_0dte_bn": 0.0,
   "flip": 7525.791576560338,
   "call_wall": 7600.0,
   "put_wall": 7520.0,
   "pin": 7600.0,
   "net_vex_mm": 50805.6,
   "charm_close_mm": 0.0,
   "squeeze_score": 50,
   "squeeze_dir": "squeeze_down",
   "moc_side": "SELL",
   "moc_usd_bn": null,
   "moc_source": "model_estimate",
   "rt_spot": 750.72,
   "realized": {
    "px_1550": 7510.63,
    "close_spot": 7533.77,
    "drift_1550_to_close_pct": 0.308,
    "moc_call_was": "SELL",
    "squeeze_call_was": "squeeze_down",
    "squeeze_score_was": 71
   }
  },
  {
   "ts": "2026-07-17T08:49:16.184540-04:00",
   "session": "premarket",
   "spot": 7533.77,
   "net_gex_bn": 14.877,
   "net_gex_0dte_bn": -10.622,
   "flip": 7539.317309830749,
   "call_wall": 7600.0,
   "put_wall": 7520.0,
   "pin": 7520.0,
   "net_vex_mm": 52250.9,
   "charm_close_mm": 23062.0,
   "squeeze_score": 58,
   "squeeze_dir": "squeeze_down",
   "moc_side": "SELL",
   "moc_usd_bn": null,
   "moc_source": "model_estimate",
   "rt_spot": 750.72
  },
  {
   "ts": "2026-07-17T09:33:20.918831-04:00",
   "session": "open",
   "spot": 7533.77,
   "net_gex_bn": 17.934,
   "net_gex_0dte_bn": -8.929,
   "flip": 7536.436609468274,
   "call_wall": 7600.0,
   "put_wall": 7515.0,
   "pin": 7515.0,
   "net_vex_mm": 52164.8,
   "charm_close_mm": 24258.7,
   "squeeze_score": 58,
   "squeeze_dir": "squeeze_down",
   "moc_side": "SELL",
   "moc_usd_bn": null,
   "moc_source": "model_estimate",
   "rt_spot": 750.76
  },
  {
   "ts": "2026-07-17T10:18:20.613152-04:00",
   "session": "morning",
   "spot": 7480.7402,
   "net_gex_bn": -35.217,
   "net_gex_0dte_bn": -33.997,
   "flip": 7541.780865683135,
   "call_wall": 7600.0,
   "put_wall": 7515.0,
   "pin": 7515.0,
   "net_vex_mm": 49701.4,
   "charm_close_mm": 1389.9,
   "squeeze_score": 65,
   "squeeze_dir": "squeeze_down",
   "moc_side": "SELL",
   "moc_usd_bn": null,
   "moc_source": "model_estimate",
   "rt_spot": 746.2
  },
  {
   "ts": "2026-07-17T12:33:20.548522-04:00",
   "session": "midday",
   "spot": 7489.5298,
   "net_gex_bn": -37.906,
   "net_gex_0dte_bn": -39.095,
   "flip": 7542.3701718202465,
   "call_wall": 7600.0,
   "put_wall": 7515.0,
   "pin": 7515.0,
   "net_vex_mm": 49982.8,
   "charm_close_mm": -334.5,
   "squeeze_score": 75,
   "squeeze_dir": "squeeze_down",
   "moc_side": "SELL",
   "moc_usd_bn": null,
   "moc_source": "model_estimate",
   "rt_spot": 746.23
  },
  {
   "ts": "2026-07-17T15:03:18.985511-04:00",
   "session": "afternoon",
   "spot": 7462.7598,
   "net_gex_bn": -42.742,
   "net_gex_0dte_bn": -33.012,
   "flip": 7534.134484510357,
   "call_wall": 7600.0,
   "put_wall": 7470.0,
   "pin": 7470.0,
   "net_vex_mm": 48738.7,
   "charm_close_mm": -425.9,
   "squeeze_score": 75,
   "squeeze_dir": "squeeze_down",
   "moc_side": "SELL",
   "moc_usd_bn": null,
   "moc_source": "model_estimate",
   "rt_spot": 744.58
  },
  {
   "ts": "2026-07-17T15:50:09.052480-04:00",
   "session": "moc",
   "spot": 7455.5298,
   "net_gex_bn": -40.913,
   "net_gex_0dte_bn": -27.828,
   "flip": 7541.274206225546,
   "call_wall": 7700.0,
   "put_wall": 7450.0,
   "pin": 7450.0,
   "net_vex_mm": 48565.0,
   "charm_close_mm": -72.5,
   "squeeze_score": 75,
   "squeeze_dir": "squeeze_down",
   "moc_side": "SELL",
   "moc_usd_bn": null,
   "moc_source": "model_estimate",
   "rt_spot": 7466.95
  },
  {
   "ts": "2026-07-17T15:55:02.920435-04:00",
   "session": "moc",
   "spot": 7453.6899,
   "net_gex_bn": -40.716,
   "net_gex_0dte_bn": -27.23,
   "flip": 7540.696632807979,
   "call_wall": 7700.0,
   "put_wall": 7450.0,
   "pin": 7450.0,
   "net_vex_mm": 48547.8,
   "charm_close_mm": -21.7,
   "squeeze_score": 75,
   "squeeze_dir": "squeeze_down",
   "moc_side": "BALANCED",
   "moc_usd_bn": null,
   "moc_source": "tape_reaction",
   "rt_spot": 7465.19
  },
  {
   "ts": "2026-07-17T16:22:03.988591-04:00",
   "session": "close",
   "spot": 7457.6899,
   "net_gex_bn": -12.067,
   "net_gex_0dte_bn": 0.0,
   "flip": 7523.412718848146,
   "call_wall": 7700.0,
   "put_wall": 7300.0,
   "pin": 7400.0,
   "net_vex_mm": 48719.8,
   "charm_close_mm": 0.0,
   "squeeze_score": 40,
   "squeeze_dir": "squeeze_down",
   "moc_side": "SELL",
   "moc_usd_bn": null,
   "moc_source": "model_estimate",
   "rt_spot": 743.29,
   "realized": {
    "px_1550": 7466.95,
    "close_spot": 7457.6899,
    "drift_1550_to_close_pct": -0.124,
    "moc_call_was": "SELL",
    "squeeze_call_was": "squeeze_down",
    "squeeze_score_was": 75
   }
  }
 ],
 "moc_events_tail": [
  {
   "date": "2026-07-15",
   "timeline": [
    {
     "t": "15:30",
     "score": 43,
     "dir": "pin",
     "moc_side": "BUY",
     "moc_source": "model_estimate",
     "spot": 7563.27,
     "rt_spot": 7561.8
    },
    {
     "t": "15:50",
     "score": 52,
     "dir": "squeeze_up",
     "moc_side": "BUY",
     "moc_source": "model_estimate",
     "spot": 7558.23,
     "rt_spot": 7564.55
    },
    {
     "t": "15:55",
     "score": 48,
     "dir": "squeeze_up",
     "moc_side": "BALANCED",
     "moc_source": "tape_reaction",
     "spot": 7563.4902,
     "rt_spot": 7566.73
    }
   ],
   "final_moc_side": "BALANCED",
   "final_moc_source": "tape_reaction",
   "final_moc_usd_bn": null,
   "final_squeeze_score": 48,
   "final_squeeze_dir": "squeeze_up",
   "px_1550": 7564.55,
   "close_spot": 7572.4199,
   "drift_1550_to_close_pct": 0.104,
   "drift_graded_pct": 0.075,
   "graded_from": "15:55",
   "moc_call_hit": null,
   "sides_flipped_intraday": false
  },
  {
   "date": "2026-07-16",
   "timeline": [
    {
     "t": "15:50",
     "score": 71,
     "dir": "squeeze_down",
     "moc_side": "SELL",
     "moc_source": "model_estimate",
     "spot": 7513.8301,
     "rt_spot": 7510.63
    },
    {
     "t": "15:55",
     "score": 79,
     "dir": "neutral",
     "moc_side": "BUY",
     "moc_source": "tape_reaction",
     "spot": 7516.7598,
     "rt_spot": 7524.42
    }
   ],
   "final_moc_side": "BUY",
   "final_moc_source": "tape_reaction",
   "final_moc_usd_bn": null,
   "final_squeeze_score": 79,
   "final_squeeze_dir": "neutral",
   "px_1550": 7510.63,
   "close_spot": 7533.77,
   "drift_1550_to_close_pct": 0.308,
   "drift_graded_pct": 0.124,
   "graded_from": "15:55",
   "moc_call_hit": true,
   "sides_flipped_intraday": true
  },
  {
   "date": "2026-07-17",
   "timeline": [
    {
     "t": "15:50",
     "score": 75,
     "dir": "squeeze_down",
     "moc_side": "SELL",
     "moc_source": "model_estimate",
     "spot": 7455.5298,
     "rt_spot": 7466.95
    },
    {
     "t": "15:55",
     "score": 75,
     "dir": "squeeze_down",
     "moc_side": "BALANCED",
     "moc_source": "tape_reaction",
     "spot": 7453.6899,
     "rt_spot": 7465.19
    }
   ],
   "final_moc_side": "BALANCED",
   "final_moc_source": "tape_reaction",
   "final_moc_usd_bn": null,
   "final_squeeze_score": 75,
   "final_squeeze_dir": "squeeze_down",
   "px_1550": 7466.95,
   "close_spot": 7457.6899,
   "drift_1550_to_close_pct": -0.124,
   "drift_graded_pct": -0.1,
   "graded_from": "15:55",
   "moc_call_hit": null,
   "sides_flipped_intraday": false
  }
 ],
 "moc_scorecard": {
  "graded_events": 1,
  "hits": 1,
  "hit_rate": 1.0,
  "by_source": {
   "tape_reaction": {
    "n": 1,
    "hit_rate": 1.0
   }
  }
 },
 "doctrine_md": "# THEIA DOCTRINE \u2014 SPX Dealer Positioning, EOD Squeezes, and the Close\nVersion 1.0 \u00b7 Written for a downstream AI analyst (\"Theia\") reading themarketpulse.vercel.app. Every number on /gex.html and /data/theia.json follows the definitions here. Apply the decision trees, always state trigger + invalidation, never certainty.\n\n## 1. The machine you are reading\nMarket makers (dealers) take the other side of nearly all SPX option flow and hedge the net delta continuously with ES futures. Their hedging is mechanical and size is enormous \u2014 which makes it PREDICTABLE. Three greeks drive the hedge flow:\n- **Gamma (GEX)**: how dealer delta changes as SPOT moves. Dealer LONG gamma \u2192 they sell rallies, buy dips (moves dampen, market pins). Dealer SHORT gamma \u2192 they buy rallies, sell dips (moves amplify \u2014 squeezes and cascades live here).\n- **Vanna (VEX)**: how dealer delta changes as IV moves. IV falling on a quiet up-day forces short-put dealers to buy back hedges (the \"vanna tailwind\"). IV spiking forces selling. Vanna flow dominates on VIX-crush days and post-event days.\n- **Charm**: how dealer delta changes as TIME passes. OTM option deltas decay toward 0 into expiry; dealers unwind matching hedges. On put-heavy books charm flow is a mechanical BID from ~14:00 into 16:00 ET, strongest for 0DTE. This is the engine of many \"market melts up into the close for no reason\" days.\n\n## 2. Conventions used by this feed (memorize)\n- `net_gex_usd_per_pct`: dollars of dealer delta-hedging per 1% SPX move. Sign convention: calls = dealer long gamma (+), puts = dealer short gamma (\u2212). This is the standard naive model \u2014 see caveats \u00a78.\n- Units: GEX in $/1% (display $B). VEX in $ per 1 vol-point of IV change. Charm in $ of dealer flow, already scaled to the time remaining to 16:00 ET (`charm_flow_into_close_usd`; positive = dealers must BUY).\n- **Gamma flip**: spot level where net GEX crosses zero, from re-pricing the whole book across spot scenarios (not the sloppy cumulative-strike method). Below flip = amplification regime; above = dampening.\n- **Call wall / put wall**: largest positive / most negative net-GEX strikes within \u00b15%. **Pin**: largest |GEX| strike within \u00b11.5%.\n- **0DTE volume-proxy GEX**: OI updates only overnight, so same-day opened 0DTE positions are invisible in OI. The volume-weighted figure is the better 0DTE proxy but assumes volume \u2248 new dealer inventory \u2014 treat as directional, lower confidence.\n- Data is CBOE delayed ~15 min. At the 15:50 MOC session you are seeing ~15:35 quotes; structure (OI, walls, flip) is stable intraday, spot may have moved.\n\n## 3. Regime table \u2014 first thing you check\n- Net GEX > +$3B/1%: **suppressed**. Expect mean-reversion, pin toward max-|GEX| strike into 16:00, sell strength/buy weakness works. Squeezes rare; fade \"breakouts\" near walls.\n- Net GEX 0 to +$3B: **mild dampening**. Trend can carry but slows near walls.\n- Net GEX 0 to \u2212$1B: **amplification**. Intraday trends extend; afternoon accelerations common.\n- Net GEX < \u2212$1B: **unstable**. Every push gets chased by dealer hedging. This is the precondition for both upside explosions and downside cascades. Realized vol >> implied on these days.\n- The MOVE matters more than the LEVEL: a sign flip vs yesterday (see history_tail) is a regime event \u2014 call it out even if magnitudes are small.\n\n## 4. The EOD window \u2014 why 14:00\u201316:00 ET is special\n1. **Charm acceleration**: 0DTE delta decay is hyperbolic \u2014 the last 2 hours carry most of the day's charm flow. Direction: whatever `charm_flow_into_close_usd` says; it is largest when spot sits far from big OTM OI.\n2. **Gamma compression**: 0DTE gamma density near spot (`dte0_fuel_near_spot_usd`) explodes as T\u21920. If spot is parked ON a big 0DTE strike, expect pinning; if it BREAKS away from it in negative gamma, hedging chases and you get the 15:00-15:45 \"option explosion\" candle.\n3. **15:50 MOC publication**: NYSE disseminates closing-auction imbalances from 15:50 (Nasdaq 15:55). A large directional imbalance (>$2B net) aligned with dealer flow = second engine; opposed = fade-fight into 15:55-16:00.\n4. Watch the sequence: 14:00 charm bid starts \u2192 15:00 0DTE gamma dominates \u2192 15:50 MOC prints \u2192 15:55+ index-arb executes against the imbalance \u2192 16:00 auction.\n\n## 5. Squeeze-score decision tree (mirror of the engine's scoring)\nThe score weights: gamma_regime 25, flip_proximity 20, wall_pressure 15, 0DTE fuel 15, vanna/charm alignment 15, MOC alignment 10.\n- **\u226570 EXPLOSIVE**: all engines aligned. Say so plainly, give direction, trigger level (nearest wall/flip), and expected behavior (acceleration through trigger, not drift). These are the days a 0DTE lottery strike prints 10-50x \u2014 and equally the days to NOT stand in front of the move.\n- **55-69 ELEVATED**: primed but missing one engine (usually MOC unknown or vanna opposed). Name the missing engine \u2014 it is the thing to watch at 15:50.\n- **40-54 WATCHFUL**: structure interesting, flows not aligned. Pin scenarios live here when net GEX is positive: name the magnet strike.\n- **<40 QUIET**: dampened book. The trade is usually NO trade; say that.\nDirectional reads: `squeeze_up` needs charm>0 or vanna tailwind + spot under call wall in neg gamma. `squeeze_down` needs spot hovering just above put wall in neg gamma \u2014 the cascade only RUNS if the wall breaks; above the wall it's support.\n\n## 6. MOC imbalance doctrine\n- Sources ranked: `manual` (operator entered the real printed dollars \u2014 high) > `lseg` (entitled feed \u2014 high) > `tape_reaction` (inferred at 15:55 from SPY's response to the 15:50 print \u2014 medium at best) > `model_estimate` (calendar + charm prior \u2014 LOW, never trade it alone).\n- `tape_reaction` semantics: the printed dollars are paywalled, but index-arb desks execute against the print immediately, so SPY's 15:50-15:55 signed move + volume anomaly is the imbalance's shadow. Read `spy_ret_bp_post_print` and `volume_ratio_vs_baseline`; medium confidence requires BOTH direction (\u226512bp) and volume (\u22651.25x) to confirm. Compare against `spy_ret_bp_pre_print`: if pre- and post-print point the same way, part of the move is trend, not auction flow \u2014 discount it. A volume spike without direction reads as a large-but-paired auction. It measures the RESPONSE, never the print \u2014 say \"the tape is trading like a SELL imbalance,\" not \"there is a SELL imbalance.\"\n- The daily rhythm: 15:50 read publishes with the best source then available; a 15:55 refresh upgrades it (tape, or manual if the operator entered the real number) and REPLACES the alert. A read whose `source` improved between passes is a stronger read; one that flipped sides between passes is itself a signal (imbalance flip \u2014 classic late-reversal tell).\n- Benchmarks (2024-2026 era): normal closing auction ~$3-6B total. Net directional imbalance: <$1B noise; $1-2B lean; $2-4B real flow (\u22480.1-0.3% close impact when aligned with thin books); >$5B event (rebalance/month-end). Russell recon and quad-witching auctions run 5-15x normal size \u2014 imbalance $ there is mostly PAIRED and less directional than it looks: check `calendar` flags before excitement.\n- Month-end/quarter-end: pension rebalance flows are pre-telegraphed (equities sold after equity rallies vs bonds); imbalances often lean opposite the month's trend.\n- Read `imbalance_published`: before 15:50 ET any MOC claim is estimate-only.\n- Feedback loop: history lines from `close` sessions include realized 15:50\u219216:00 behavior. Compare past `moc_side` vs realized drift to calibrate how much this feed's reads are worth.\n\n## 7. Playbook patterns (name them when you see them)\n- **Negative-gamma melt-up**: net GEX < 0, spot crosses ABOVE flip mid-afternoon, charm positive, VIX bleeding. Dealer chase + vanna + charm = trend-day close at highs. Trigger: flip cross. Invalidation: back below flip 15+ min.\n- **Put-wall cascade**: net GEX < 0, spot breaks the put wall after 15:00 with SELL MOC. Hedging sells into a hole; closes at lows. The wall that WAS support becomes the ignition level.\n- **OPEX pin**: positive GEX, huge |GEX| strike within 0.3%, mixed flows \u2192 gravitates to the strike, vol dies. Expected close: the pin \u00b1 a few points.\n- **Vanna crush rally**: post-CPI/FOMC/earnings, IV collapses, negative VEX book \u2192 dealers buy all day. Often tagged WATCHFUL by score but persistent grind up \u2014 flag when VIX \u22127% or more intraday.\n- **Charm-bid fade at 16:00**: charm flow ends AT the close. A day that levitated purely on charm (no volume, no breadth) often gives back overnight \u2014 note it for the next premarket.\n- **Unpinned open**: yesterday's dominant 0DTE strike expired; if today opens far from remaining OI, early amplification until new 0DTE positioning builds (first 30 min).\n\n## 8. Model caveats \u2014 where this feed can lie to you\n- The dealer-sign convention (calls dealer-long, puts dealer-short) is an ASSUMPTION. It breaks when customers are heavy call BUYERS (meme melt-ups: dealers short calls \u2192 chasing UP, not dampening) or put SELLERS (income funds). Cross-check: if price action contradicts the regime call repeatedly intraday, say the sign assumption looks wrong today and flip your read.\n- OI is yesterday's photo. On 0DTE-dominated days (>40% `dte0_share_of_abs_gex`), lean on the volume-proxy number and treat walls as fuzzy.\n- Flip/walls move intraday as positions open; a wall with <20k combined OI is decoration, not structure.\n- SPX here excludes SPY/ES/XSP books (correlated but not identical) and the JPM collar (quarter-end: short call leg near-the-money can dominate \u2014 flag the strike if headlines mention it).\n- Delayed data: in the last 10 minutes, always caveat that spot may have already tested a trigger.\n- GEX explains HOW the market moves (transmission), not WHY (catalyst). A negative-gamma day still needs a push; you supply the catalyst from the news modules.\n\n## 9. Learning from the MOC event log\n`/data/moc_events.jsonl` (also in theia.json as `moc_events_tail` + `moc_scorecard`) holds one consolidated record per trading day: the full 15:30\u219215:55 read timeline, the final MOC call with its source, the realized 15:50\u2192close drift, and `moc_call_hit`. Use it:\n- Before leaning on ANY MOC read, check `moc_scorecard.by_source` \u2014 quote the hit rate of that source class (\"tape_reaction is 6/9 over the last month\") instead of treating confidence labels as gospel. Under 8 graded events, say the sample is too small to trust.\n- `sides_flipped_intraday: true` days are the interesting ones \u2014 study whether the flip predicted the close better than the 15:30 read. Flips are rare and informative.\n- Calibrate impact, not just direction: over graded events, relate |drift| to score and (when real dollars exist) to net_imbalance_bn. If big scores keep producing small drifts, say the score is over-signaling and lean on levels instead.\n- The log is small-sample for weeks. Prefer \"the data so far shows X of Y\" phrasing over percentages until n \u2265 20.\n\n## 10. Output discipline for Theia\nWhen writing the EOD read, always produce: (1) regime + net GEX with sign, (2) the map \u2014 flip, walls, pin with distances, (3) the flow \u2014 charm $ and vanna direction into close, (4) MOC side/size/confidence, (5) squeeze score + direction + the ONE trigger level, (6) invalidation, (7) confidence caveat if any input is stale/estimated. Levels are always index points, not percentages. Never say \"will\" \u2014 say \"if X then dealers must Y\".\n",
 "data_urls": {
  "full_state": "/data/gex_latest.json",
  "history": "/data/gex_history.jsonl",
  "moc": "/data/moc_latest.json",
  "moc_events": "/data/moc_events.jsonl",
  "visual": "/gex.html"
 }
}