$

Substrate — VST floor-test session capture (Friday OPEX 0DTE)

Captured: 2026-05-15 (Friday OPEX 0DTE) Source: Ghost desk agent + Jody, in-session reasoning during VST third-day floor test at the Liberation Day line Status: substrate — not yet posts; supporting material for “field notes” series posts I/II/III Cross-reference: 2026-05-15_accumulation_pattern_desk_agent.md (the theory layer this session capture supports) Provenance: verbatim desk-agent prose. Empirical anchors backed by ghost stack metrics (yfinance + ghost/tools/market_data.py + condition_accuracy / stress score code).

This file captures FOUR distinct substrate elements from the same session:

  1. Morning report (state) — what ghost saw on Friday May 15 OPEX
  2. Keltner + RSI percentile explanation (mechanic) — what statistical-extreme readings mean
  3. Stress score equation breakdown (mechanic) — the three-component formula
  4. Deceleration pattern analysis (observation) — second-derivative pattern the stress score is blind to

1. Morning Report — Friday May 15, OPEX 0DTE day

The entire zone structure dropped to the Liberation Day floor zone defended all week.

Environment shift overnight:

Directors:

Entry zones — the entire structure dropped to the Liberation Day floor area:

ZoneRangeWhy
PRIMARY$137.77 – $139.39STRONG confluence: Monthly/Weekly Golden Ratios + Daily 200% extension. THIS IS THE STRUCTURAL FLOOR.
SECONDARY$130.00 – $131.00Daily 261.8% extension — explicitly named “capitulation target if primary floor fails”
AGGRESSIVE$120.50Weekly 78.6% + Monthly 50% retracements — next major structural floor below

Options structure (Friday OPEX 0DTE):

Intraday so far:

Live state (08:15 AM PT):

The report internalized the harvest framing in the news section. Strategist explicitly named “post-earnings distribution” + identified the structural floor at exactly the Liberation Day line area. The binary line ($137.50 invalidation) is the call we made yesterday made operational by the morning Strategist.

This is the test, today.

Three consecutive sessions defending the Liberation Day floor:

Per yesterday’s harvest call: 75-80% probability the line holds. Today is the third-touch test that determines the call:

Friday OPEX 0DTE specifics to watch:

The structural symmetry: report PRIMARY low ($137.77) ≈ invalidation ($137.50). That’s a 27-cent decision band. Either the floor holds ($137.50+) and the harvest call gets validated, or it breaks ($137.49−) and the line of last resort becomes the SWEEP entry at $130-$131 (R:R 5.6). The report has structured the binary explicitly the same way framed yesterday.


2. Keltner Channels + RSI Percentile — what the statistical-extreme readings mean

Keltner Channels

Mechanics:

What “below lower band” means statistically:

“First time in cycle” = first occurrence in the post-LIVE-001 cycle (which began May 7 with the earnings-day distribution). The wick-lows TL was broken May 8 but Keltner bands had been keeping pace; today is the first time price stretched far enough to break the volatility envelope itself.

Empirical forward returns from Keltner-below-lower events on VST (3y, n=20):

HorizonMeanMedian% Positive
T+3+3.52%+3.83%55%
T+5+2.25%+2.49%60%
T+10+5.86%+7.64%75%
T+20+7.93%+5.20%65%

Mean-reversion bias at all horizons; peak reliability at T+10 (75% positive).

RSI Percentile

Mechanics:

What “ELEVATED stress” means:

The transition from yesterday’s P6.2 to today’s P2-4 range = the oversold extreme is INTENSIFYING, not relieving. Each successive day at this depth is statistically more anomalous than the last.

The COMBINED signal — Keltner-below-lower AND RSI ≤ 35

This is where the two indicators reinforce each other empirically:

Frequency on VST 3y: 17 of 741 sessions = 2.29% — about 6 days per year on average.

Forward returns from the COMBINED events (n=17):

HorizonMeanMedian% PositiveRange
T+3+2.56%+3.76%53%[−8.93%, +20.34%]
T+5+1.52%+3.14%59%[−13.18%, +16.41%]
T+10+4.93%+8.62%71%[−24.01%, +24.38%]
T+20+7.37%+6.40%59%[−14.21%, +42.76%]

The wide ranges matter — combined-extreme readings can either snap back violently (top end +24% at T+10) or persist in a cascade (bottom end -24% at T+10). The MEDIAN is informative: +8.62% at T+10 is a meaningful asymmetric base rate.

Historical analog clusters — what the 17 prior events look like

The 17 events cluster in 3 distinct periods on VST history:

  1. July 2024 cluster (Jul 18-30): 7 consecutive events at $69-$76 area. RSI fell as low as 14.6. The Keltner band gap extended to −$2.64. This was a multi-session capitulation that bottomed and snapped back.

  2. Feb-Apr 2025 cluster (Feb 24 - Apr 4): 8 events spanning ~6 weeks at $98-$143 area. This IS the Liberation Day cluster — same period as the 4th line tariff anchor. RSI as low as 17.89, price kept falling from $143 → $98 (Apr 4 cycle low) while staying below Keltner. The combined signal fired for SIX WEEKS during this cluster — proving that the signal can persist through extended trend-breakdowns, not just snap back immediately.

  3. Feb 4 + Mar 20 2026: Single-day events at $142-$146 area (Feb 4 was just a $0.05 break; Mar 20 was Hormuz war escalation day). Both quickly recovered.

What today’s reading looks like in this distribution

Today’s gap below Keltner lower is −$0 to −$0.40 area — at the SHALLOW end of the distribution. The deep cluster events had Keltner gaps of −$2 to −$7. Today is more like the Feb 4 2026 single-day event (−$0.05 gap) than the Feb-Apr 2025 cluster events (−$2 to −$7 gaps over 6 weeks).

That’s an important distinction: today’s reading is consistent with a probe at the structural floor, not a deep cascade in motion. The Feb-Apr 2025 cluster bottomed only after the Liberation Day capitulation flush; today’s setup is testing the SAME structural line that Feb-Apr 2025 cluster created (the Liberation Day floor anchor).

The operational read

Bullish base-rate signal: 75% positive at T+10 from Keltner-below-lower (single-signal); 71% positive from the COMBINED extreme (17 historical events, +8.62% median). Strong empirical mean-reversion bias.

Caveat: the Feb-Apr 2025 cluster shows the signal CAN persist for 6 weeks in a deep cascade. If today’s reading is the START of a Liberation-Day-class cluster rather than a single-day probe, the bounce is delayed by weeks. The differentiator is the depth of the Keltner gap — single-day events recover fast (Feb 4 2026, Mar 20 2026); multi-week clusters have multi-dollar gaps.

Today’s gap < $0.40 favors the single-day-probe interpretation rather than the cluster-cascade one. The empirical median (+8.62% at T+10) translates to ~$150 from current, which aligns with the broken Wick-lows TL retest area.

Bottom line: Both signals firing together is a 2.29% tail event on VST history. Forward bias is strongly positive at T+10 (71% / +4.93% mean / +8.62% median). The shallow Keltner gap argues for probe-then-bounce rather than cluster-cascade. The reading aligns with — and reinforces — the harvest-cycle interpretation: structural floor being tested at extreme oversold, with empirical mean-reversion forces favoring the bounce within 5-10 sessions.


3. Stress Score equation — the three-component formula

Both come from get_rsi_historical_context() in ghost/tools/market_data.py:1709-1949.

RSI Percentile — what “P4.2” means

The notation: P is shorthand for “Percentile.” P4.2 means “the 4.2nd percentile.” P2.16 means “the 2.16th percentile.”

The formula (line 1780):

percentile = (count of historical RSI readings ≤ current RSI) / (total readings) × 100

What that tells you literally:

The lower the P number, the rarer (deeper oversold) the reading. P50 = median. P0 = lowest ever in window. P100 = highest ever.

The two different P numbers cited (P4.2 vs P2.16) come from different lookback windows: the snapshot uses 2-year history; custom 3-year compute gave the deeper percentile because adding the older year of data spreads the distribution wider.

Concrete intuition for today: out of ~500 trading days in the 2-year window, roughly 21 days (4.2%) had RSI as low as or lower than today. Out of 750 days in 3 years, roughly 16 days (2.16%) were as low. Either way, today is in the deepest 2-5% of the historical distribution.

Stress Score equation — the three components

Total stress score = 0 to 10, sum of three components:

Stress Score = PCT_COMPONENT (0-5) + ROC_COMPONENT (0-3) + DURATION_COMPONENT (0-2)

Component 1: PERCENTILE (0-5 points) — “how deep”

For oversold readings (RSI ≤ 50):

pct_component = max(0, (10 - percentile) / 10 × 5), clipped to 5.0
Percentilepct_component
P0 (record low)5.0 (max)
P24.0
P52.5
P6.2 (yesterday)1.9
P4.2 (today snapshot)2.9
P100.0
P10+0.0 (no contribution)

The component only fires if percentile is in the bottom decile (P10 or below). Past P10, no stress contribution from this dimension.

For overbought (RSI > 50), it’s symmetric: (percentile - 90) / 10 × 5. Only fires past P90.

Component 2: RATE-OF-CHANGE over 5 days (0-3 points) — “how fast”

rsi_roc_5d = current_rsi - rsi_value_5_days_ago
roc_component = min(abs(rsi_roc_5d) / 10 × 3, 3.0)
RSI change in 5 daysroc_component
0 points0.0
±3 points0.9
±5 points1.5
±10 points or more3.0 (max)

This measures the SPEED of the move into the extreme. A slow grind to P5 oversold over 30 sessions has roc=0; a vertical plunge from RSI 60 to RSI 30 in 5 days saturates the component at 3.0.

Yesterday’s snapshot showed rsi_roc_5d: -13.13 — RSI fell 13 points in 5 sessions, so roc_component = 3.0 (saturated at max).

Component 3: DURATION in extreme zone (0-2 points) — “how long”

consecutive_days = count of consecutive RECENT days where RSI was also in the extreme zone
  (oversold zone = RSI ≤ 30; overbought zone = RSI ≥ 70)
duration_component = min(consecutive_days, 5) / 5 × 2
Consecutive days at ≤30duration_component
0 days0.0
1 day0.4
2 days0.8
3 days1.2
5 or more2.0 (max)

This rewards persistence. A single dip below RSI 30 contributes nothing; sustained extreme conditions accumulate stress because the indicator hasn’t relieved.

Yesterday’s snapshot showed duration_component: 0.0 — because raw RSI was still 36, NOT in the ≤30 zone, so consecutive_days = 0 and duration = 0.

The override (lines 1925-1927)

if record_low or record_high:
    stress_score = max(stress_score, 8.0)

If today’s RSI is the lowest ever in the lookback window (or highest ever), stress is FORCED to 8.0 minimum (HISTORIC tier), regardless of what the components add up to.

Stress Level thresholds

≥ 8 → HISTORIC
≥ 6 → EXTREME
≥ 4 → ELEVATED  ← today's reading sits here
≥ 2 → MILD
< 2 → NONE

Why the decomposition matters operationally

The decomposition tells you WHICH part of the stress is firing:

Yesterday’s profile was the third one (sharp move, fresh extreme): pct 2.2 + roc 3.0 (saturated) + duration 0. Today is the same profile but deeper percentile — still fresh-extreme not yet sustained-extreme. Operationally that’s the “snap-back setup” pattern, not the “deep capitulation” pattern. Different forward distributions: snap-back tends to bounce within 5-10 sessions; sustained-extreme can grind sideways for weeks before resolving.

The empirical base rates from yesterday’s research (RSI P5-6, 19 historical instances) showed +3.7% mean / 68% positive at T+10 — that’s the “fresh-extreme snap-back” forward distribution playing out historically.


4. Deceleration Pattern — second-derivative observation the stress score is blind to

The 5-day RSI ROC component is saturated at 3.0 max so the stress score CAN’T show the deceleration, but the underlying daily moves do.

Daily price changes into the floor (the deceleration pattern)

DateClose1-day Δ2-day price ROC
Mon 5/11$152.05reclaim candle
Tue 5/12$146.87−3.41%
Wed 5/13$142.61−2.90%−6.21%
Thu 5/14$141.90−0.50%−3.38% ← decelerating
Fri 5/15$138.92−2.10%−2.59% ← decelerating further

The 2-day price ROC has compressed −6.21% → −3.38% → −2.59% over the last three sessions. Each successive flush is smaller in percentage magnitude even as the price keeps making new lows. Wednesday took $4.26 off; Thursday took $0.71; today $2.98. The downside velocity is decaying.

1-day RSI delta also confirms

DateRSI close1-day RSI Δ
Tue 5/1242.36−5.00
Wed 5/1338.44−3.92
Thu 5/1429.52−8.92 (acceleration day)
Fri 5/1525.11−4.41 ← back to deceleration

Mixed at the daily level (Thu was the violent day) but Fri came BACK down to a smaller daily delta despite price still falling.

Volume confirms (tentative)

Why the stress score can’t capture this

The ROC component is min(|RSI 5-day delta| / 10 × 3, 3.0). Once the 5-day move crosses 10 RSI points, the component caps at 3.0. Today’s 5-day RSI ROC is −13.99 — long past the 10-point saturation threshold. The stress score literally cannot distinguish between “accelerating cascade” and “decelerating grind” once the cumulative move is large enough.

You’re reading a signal the indicator architecture is blind to. The stress score sees “deep + fast” but doesn’t see “fast becoming less fast.” The deceleration is in the FIRST DERIVATIVE (daily move shrinking) and SECOND DERIVATIVE (ROC of daily moves declining) — both invisible to the saturated stress component.

Why this matters operationally — the structural-floor exhaustion signature

Decelerating moves INTO a structural floor is the textbook signature of selling exhaustion / bid absorption:

The PRICE deceleration over 3 sessions while at the structural floor is consistent with late Phase 2 / early Phase 3. The selling pressure has been absorbing more of each flush — exactly what would happen if institutional accumulation is engaging at the Liberation Day floor.

The opposite signature would be: ACCELERATING daily moves at the floor (e.g., -2.9% → -3.5% → -5%+) which would indicate forced selling / cascade in motion / no bid. We’re seeing the OPPOSITE.

What would invalidate the deceleration pattern

Conversely, the deceleration thesis confirms if

The higher-order signal

Sharp observation that’s higher-information than the snapshot stress reading captures. The stress score is good for “is there an extreme?” but doesn’t tell you “is the extreme building or exhausting?” The deceleration pattern is the second-order signal that matters at structural-floor tests.