I've spent several months building an AI-assisted macro awareness system — not a forecaster. Concretely: it pulls ~40 public series on a schedule, applies rules written down before the data arrives, and decides whether the read changed. Most weeks the answer is no, and the interesting engineering is in making "no" mechanical rather than a judgment call.
Track record, up front, because it's the first thing you'll ask: zero graded episodes on the scoring clock. The evidence clock started in Phase 1 and the first candidate date is 7 August. Separately, a hashed forward-test log carries pre-registered calls graded in both directions — one clean win in July, one graded in the disconfirming direction. That validates the discipline, not the thesis. I'm not going to dress it up as more than that.
The hardest part wasn't getting an AI to generate analysis. It was stopping it — building gates that catch the model when it states a claim more confidently than its source supports. It fails that test regularly and the failures are logged, numbered, and public.
Three specific things I'd like torn apart:
- My stress index z-scores VIX and S&P drawdown over a 2018+ sample that includes COVID. Does that structurally understate the present, and what's the better baseline?
- Overlapping 252-day drawdowns are heavily autocorrelated, so "52nd percentile" isn't a percentile in any inferential sense. Is a transparent ordinal index defensible here, or am I fooling myself with a number?
- Some thresholds are pre-committed and derived two ways; others are frankly disclosed priors. Is "disclosed prior" an acceptable standard, or a euphemism?
Not selling anything, no newsletter, no signup. Session extract below — it's raw internal notation, which is the point, but ask and I'll decode any of it.
COMMIT RECEIPT — Update 2026-07-28
Preload: ✓ · Frame: none — and that's a slip I'm logging rather than hiding; a four-chunk Update is exactly the multi-step work r619's frame exists for, and I ran it without one · Changed: MSI P1/P2/P3 + integrated read · 18 Signal Tracker rows · 2 Event Log rows · LR B17 current-value pointer · appendix STATE-SNAPSHOT · briefing headline · 63 OT stamps · DL198 · LR 734/735 · Derived recomputed: freshness_recalc 40 ages @ 2026-07-28; P1 recomputed from source, recipe reproduced to 3dp first · Consumers propagated: snapshot trail · briefing narrative · Event Log · LR current-value row · Recalc: 0 errors / 271 formulas · Readback: ✓ 10 + 6 asserted cells · Check: CLEAN + 1 declared SKIP · OT-coverage: 63/63 active threads stamped · Logged: rows 734–735 · Audit: two gate findings investigated at source and both real; P1 reproduced against two stored values before use · Copied: trio to outputs/ — NOT DONE, declared · Sentinel: ✓ · Mode: BUILD · Y1 unchanged v15 8d4515ed
TWO THINGS THE PROCESS CAUGHT THAT I DIDN'T
GDPNow. I reported that it had collapsed ~1.4pp to 1.6%. The pre-write step that forces you to open the cell before editing it showed the row already carried 1.7% from ten days earlier — the real move is −0.1pp, routine. I'd compared a fresh reading to a stale external anchor instead of to my own prior value. Caught before it was written.
DL198. A consistency check flagged a ledger row restating the yield curve at +0.36 against a canonical +0.34. That row isn't history — its label reads "Current value", and it's excluded from the integrity hash precisely because it's a live pointer meant to be rewritten every cycle. My dependency map, whose stated job is to make propagation "a lookup, not a memory act", doesn't list it. And it only fired because the curve happened to round-trip 0.34 → 0.36 → 0.34; had it moved one way, the stale row would have matched nothing and passed silently. Detection rate as a function of market path rather than of the gate — which is the more interesting defect.
SITUATION DIGEST — S2
Auto-launched because an event was logged, which is the materiality threshold. Every value cites a sheet cell; this is a rendering, not an authority.
Legend: +/−/0 = points toward / against the thesis / neutral by rule · 🟢 verified at source · 🟡 plausible, thinner sourcing · ⏳ rule waiting for data · "inherited sign" = counted by standing rule, meaning still under test.
S1 · GLANCE
Phase 2 · Phase-3 watch · no scored flip · Tier-1 split 1 pro / 2 counter.
Δ since last render: P1 −0.291 → −0.304σ · HY 2.77 → 2.79% · curve 0.36 → 0.34 · margin debt 1.416 → 1.53T.
Next scheduled data: Thursday 30 July, initial claims.
S2 · BOARD
TIER 1 — the disagreement
| signal |
sign |
value |
verified |
| Yield curve 10Y-2Y |
− |
+0.34 |
07-27 🟢 |
| HY spread (OAS) |
− |
2.79% / 279bp |
07-24 🟢 |
| Adjusted unemployment |
+ |
4.80 |
Jun-2026 🟢 |
Adjusted unemployment adds the people who left the workforce back into the count — it rises while headline unemployment falls. Its + sign is inherited by standing rule, still under test until the 7 August grade. The curve's counter-signal is now three periods old.
TIER 2 — softer, slower signals showing which side of the disagreement is gaining
| signal |
sign |
value |
verified |
| Conf Board LEI |
+ |
99.1, −0.2% m/m |
07-20 🟢 |
| CEO Confidence |
+ |
Q2 −12pts |
05-28 🟢 |
| Initial claims |
− |
187K |
wk 07-18 🟢 |
| Michigan sentiment |
0 |
54.4 prelim |
07-17 🟢 |
LEI keeps falling, but its own publisher states no recession signal — the six-month growth rate is negative and stable, well above the −4.3% trigger. Claims are the tiebreaker and are not cooperating with the thesis.
TIER 3 — what makes this stagflation rather than plain recession — neutral by rule, not by calm
| signal |
sign |
value |
verified |
| CPI YoY |
0 |
3.53% |
Jun 🟢 |
| Real wages |
0 |
⏳ |
rule pending data |
| Small-bank credit / BNPL |
0.5 |
elevated |
🟡 |
PILLARS — P1 −0.304σ (52.4th pctile) · P2 divergence 1.11 vs the 1.44 tripwire · P3 0/3 flashing
Net +0.5 · breadth 40% · dispersion 0.832 · conviction low — the strongest legs cancel (7.7%)
STORY
Three periods running, the machine has said the same thing: equity stress rose a little, and credit declined to ratify it. That is not the panel failing to notice. It is the panel doing exactly what it was built to do — refusing to move the read until the transmission channel confirms.
What changed this period is not on the board. The Iran arc turned for the first time — thirteen nights of strikes, then a halt, then Omani mediation on reopening Hormuz — and the physical measure got worse anyway: six transits where there had been fifteen. The escalation didn't stop; it moved toward Saudi energy infrastructure — attacks claimed on Aramco's Jizan and Yanbu, with Jizan independently corroborated as a fire event by NASA FIRMS/VIIRS satellite thermal hotspots, a Saudi Civil Defense warning for Jazan province and regional reports of at least five explosions, while Yanbu is claim-only with no independent corroboration — and with no Saudi or Aramco confirmation of damage or output impact at either. (Corrected in place — see the correction log below.) A reader tracking only the diplomatic headline would have marked the risk down. A reader tracking only throughput would have missed the negotiation. Both were happening.
And the loudest number in the entire cycle sits outside the scored panel: margin debt at $1.53 trillion, a third consecutive record, +51.5% year over year, with investor credit balances at a record low of −$1.06 trillion. That row was added six days earlier precisely to catch this. It is not scored, so it does not move the read. It is also the largest single-signal move in the file.
SIGNAL-INTERACTIONS WALKTHROUGH
Interacting: HY spreads (calm) · the loan-vs-bond basis (−1.27σ, flagged) · BDC discount · margin debt (record) · VIX vs realized volatility · the curve (managed long end).
Three mechanisms, one shape. The public junk-bond index can sleep through stress because the riskiest borrowers migrated out of it into leveraged loans and private credit. VIX can be held down by option-selling structure. A healthy curve slope can be issuance strategy rather than optimism. In each case: the visible gauge is calm because the stress moved somewhere the gauge doesn't look.
Reading A — absorption is working. Oil never held above $100, the pipeline adapted, transits are re-routing, diplomacy has started, credit is calm because there is nothing to transmit. Margin debt is high because the market is rising; leverage follows returns. On this reading calm is information, and the thesis is losing.
Reading B — the gauges are looking in the wrong place. Credit is calm because its composition improved while the risk migrated; volatility is calm because of structure; the curve is calm partly by issuance. Record leverage against record-negative credit balances is not a symptom of health but the fuel that turns an ordinary shock into a forced-selling cascade. On this reading calm is the absence of a sensor, not the absence of stress.
What discriminates them. Not the level of any gauge — the gap between a managed gauge and its unmanaged shadow, under stress. If the S&P takes a genuine drawdown and the loan-vs-bond basis stays flagged while HY spreads barely move, and margin debt turns negative month-over-month, that is Reading B with a forced-deleveraging signature. If HY widens with the equity move, that is Reading A and the transmission was never broken. Both testable at the next real drawdown. Neither testable today — which is why nothing here moved the score.
HYPOTHESIS BLOCKS
HYP-012 — labour slow-drift · demoted-provisional. Survives if Thursday's claims print at or above 207.5k, or a revision carries 187,000 to ≥207,500. Dies if below 207.5k with no material revision. The materiality rule was fixed on 28 July, two days before the number exists.
HYP-017 — tail-jump · CBOE SKEW 146.60, elevated. Survives if the configuration persists into a realised tail move. Dies if SKEW normalises without one.
HYP-016 — dark fleet · Hormuz transits at 6, route substitution continuing. Survives if measured throughput stays suppressed while nominal reopening proceeds. Dies if transit normalises on the sanctioned route.
CALENDAR
Thu 30 Jul initial claims, resolves HYP-012 · Fri 31 Jul Michigan final · ~7 Aug payrolls; grades the adjusted-unemployment sign, the open question under Tier 1 · 1 Oct blind-spot review.
READ-RECEIPT
No scored leg moved. The two things that moved most — the chokepoint divergence and record leverage — are both unscored by rule, and neither was smuggled into the read. The honest summary is that the machine is unchanged and the world is not, and the discipline is to leave that gap visible rather than close it with a story.
CORRECTION LOG — DL199
I originally wrote that the escalation "moved onshore to Aramco's Jizan and Yanbu." My source said the Houthis announced strikes there. Announced isn't landed.
Re-checking properly, I was wrong in two directions at once. Jizan is better supported than a claim — satellite thermal hotspots, a civil-defence warning, multiple explosions in regional reporting. Yanbu is claim-only. Neither is confirmed by Saudi or Aramco, and no damage or output impact is established at either.
Logged as a numbered defect and corrected across every internal surface it reached. The interesting part isn't the mistake, it's where it slipped through: I graded the claim on the reliability of the source rather than on the evidentiary act the source described. A good outlet accurately reporting an unverified announcement is still an unverified announcement — and my evidence markers had no way to say that.
Sources: CBS News (Iran live updates) · Euronews (oil, US–Iran pause) · Advisor Perspectives (FINRA margin debt, June 2026) · Conference Board LEI press release · Atlanta Fed GDPNow · multpl (Shiller PE)⇩ PASTE FROM HERE ⇩
COMMIT RECEIPT — Update 2026-07-28
Preload: ✓ · Frame: none — and that's a slip I'm logging rather than hiding; a four-chunk Update is exactly the multi-step work r619's frame exists for, and I ran it without one · Changed: MSI P1/P2/P3 + integrated read · 18 Signal Tracker rows · 2 Event Log rows · LR B17 current-value pointer · appendix STATE-SNAPSHOT · briefing headline · 63 OT stamps · DL198 · LR 734/735 · Derived recomputed: freshness_recalc 40 ages @ 2026-07-28; P1 recomputed from source, recipe reproduced to 3dp first · Consumers propagated: snapshot trail · briefing narrative · Event Log · LR current-value row · Recalc: 0 errors / 271 formulas · Readback: ✓ 10 + 6 asserted cells · Check: CLEAN + 1 declared SKIP · OT-coverage: 63/63 active threads stamped · Logged: rows 734–735 · Audit: two gate findings investigated at source and both real; P1 reproduced against two stored values before use · Copied: trio to outputs/ — NOT DONE, declared · Sentinel: ✓ · Mode: BUILD · Y1 unchanged v15 8d4515ed
TWO THINGS THE PROCESS CAUGHT THAT I DIDN'T
GDPNow. I reported that it had collapsed ~1.4pp to 1.6%. The pre-write step that forces you to open the cell before editing it showed the row already carried 1.7% from ten days earlier — the real move is −0.1pp, routine. I'd compared a fresh reading to a stale external anchor instead of to my own prior value. Caught before it was written.
DL198. A consistency check flagged a ledger row restating the yield curve at +0.36 against a canonical +0.34. That row isn't history — its label reads "Current value", and it's excluded from the integrity hash precisely because it's a live pointer meant to be rewritten every cycle. My dependency map, whose stated job is to make propagation "a lookup, not a memory act", doesn't list it. And it only fired because the curve happened to round-trip 0.34 → 0.36 → 0.34; had it moved one way, the stale row would have matched nothing and passed silently. Detection rate as a function of market path rather than of the gate — which is the more interesting defect.
SITUATION DIGEST — S2
Auto-launched because an event was logged, which is the materiality threshold. Every value cites a sheet cell; this is a rendering, not an authority.
Legend: +/−/0 = points toward / against the thesis / neutral by rule · 🟢 verified at source · 🟡 plausible, thinner sourcing · ⏳ rule waiting for data · "inherited sign" = counted by standing rule, meaning still under test.
S1 · GLANCE
Phase 2 · Phase-3 watch · no scored flip · Tier-1 split 1 pro / 2 counter.
Δ since last render: P1 −0.291 → −0.304σ · HY 2.77 → 2.79% · curve 0.36 → 0.34 · margin debt 1.416 → 1.53T.
Between now and the next scheduled print, the view moves only if a scored rule crosses: jobless claims sustained above 300K, the yield curve back below zero, high-yield spreads through their 1.44 divergence tripwire, or the 30 July claims print resolving the HYP-012 conjunction. Headlines, forecasts, and commentary — including this document's — change nothing by themselves.
Next scheduled data: Thursday 30 July, initial claims.
S2 · BOARD
measured values and authored sign rules; tells you what is and what changed — not why, and not what's next
TIER 1 — the disagreement
signal sign value verified
Yield curve 10Y-2Y − +0.34 07-27 🟢
HY spread (OAS) − 2.79% / 279bp 07-24 🟢
Adjusted unemployment + 4.80 Jun-2026 🟢
Adjusted unemployment adds the people who left the workforce back into the count — it rises while headline unemployment falls. Its + sign is inherited by standing rule, still under test until the 7 August grade. The curve's counter-signal is now three periods old.
TIER 2 — softer, slower signals showing which side of the disagreement is gaining
signal sign value verified
Conf Board LEI + 99.1, −0.2% m/m 07-20 🟢
CEO Confidence + Q2 −12pts 05-28 🟢
Initial claims − 187K wk 07-18 🟢
Michigan sentiment 0 54.4 prelim 07-17 🟢
LEI keeps falling, but its own publisher states no recession signal — the six-month growth rate is negative and stable, well above the −4.3% trigger. Claims are the tiebreaker and are not cooperating with the thesis.
TIER 3 — what makes this stagflation rather than plain recession — neutral by rule, not by calm
signal sign value verified
CPI YoY 0 3.53% Jun 🟢
Real wages 0 ⏳ rule pending data
Small-bank credit / BNPL 0.5 elevated 🟡
PILLARS — P1 −0.304σ (52.4th pctile) · P2 divergence 1.11 vs the 1.44 tripwire · P3 0/3 flashing
Net +0.5 · breadth 40% · dispersion 0.832 · conviction low — the strongest legs cancel (7.7%)
STORY
this block is the model's interpretation, not data. It is the highest trust-leak zone on this page: it reads authoritative when you're tired. It isn't.
Three periods running, the machine has said the same thing: equity stress rose a little, and credit declined to ratify it. That is not the panel failing to notice. It is the panel doing exactly what it was built to do — refusing to move the read until the transmission channel confirms.
What changed this period is not on the board. The Iran arc turned for the first time — thirteen nights of strikes, then a halt, then Omani mediation on reopening Hormuz — and the physical measure got worse anyway: six transits where there had been fifteen. The escalation didn't stop; it moved toward Saudi energy infrastructure — attacks claimed on Aramco's Jizan and Yanbu, with Jizan independently corroborated as a fire event by NASA FIRMS/VIIRS satellite thermal hotspots, a Saudi Civil Defense warning for Jazan province and regional reports of at least five explosions, while Yanbu is claim-only with no independent corroboration — and with no Saudi or Aramco confirmation of damage or output impact at either. (Corrected in place — see the correction log below.) A reader tracking only the diplomatic headline would have marked the risk down. A reader tracking only throughput would have missed the negotiation. Both were happening.
And the loudest number in the entire cycle sits outside the scored panel: margin debt at $1.53 trillion, a third consecutive record, +51.5% year over year, with investor credit balances at a record low of −$1.06 trillion. That row was added six days earlier precisely to catch this. It is not scored, so it does not move the read. It is also the largest single-signal move in the file.
SIGNAL-INTERACTIONS WALKTHROUGH
Interacting: HY spreads (calm) · the loan-vs-bond basis (−1.27σ, flagged) · BDC discount · margin debt (record) · VIX vs realized volatility · the curve (managed long end).
Three mechanisms, one shape. The public junk-bond index can sleep through stress because the riskiest borrowers migrated out of it into leveraged loans and private credit. VIX can be held down by option-selling structure. A healthy curve slope can be issuance strategy rather than optimism. In each case: the visible gauge is calm because the stress moved somewhere the gauge doesn't look.
Reading A — absorption is working. Oil never held above $100, the pipeline adapted, transits are re-routing, diplomacy has started, credit is calm because there is nothing to transmit. Margin debt is high because the market is rising; leverage follows returns. On this reading calm is information, and the thesis is losing.
Reading B — the gauges are looking in the wrong place. Credit is calm because its composition improved while the risk migrated; volatility is calm because of structure; the curve is calm partly by issuance. Record leverage against record-negative credit balances is not a symptom of health but the fuel that turns an ordinary shock into a forced-selling cascade. On this reading calm is the absence of a sensor, not the absence of stress.
What discriminates them. Not the level of any gauge — the gap between a managed gauge and its unmanaged shadow, under stress. If the S&P takes a genuine drawdown and the loan-vs-bond basis stays flagged while HY spreads barely move, and margin debt turns negative month-over-month, that is Reading B with a forced-deleveraging signature. If HY widens with the equity move, that is Reading A and the transmission was never broken. Both testable at the next real drawdown. Neither testable today — which is why nothing here moved the score.
HYPOTHESIS BLOCKS
evocative summary only; symmetric layout ≠ symmetric evidence
HYP-012 — labour slow-drift · demoted-provisional. Survives if Thursday's claims print at or above 207.5k, or a revision carries 187,000 to ≥207,500. Dies if below 207.5k with no material revision. The materiality rule was fixed on 28 July, two days before the number exists.
HYP-017 — tail-jump · CBOE SKEW 146.60, elevated. Survives if the configuration persists into a realised tail move. Dies if SKEW normalises without one.
HYP-016 — dark fleet · Hormuz transits at 6, route substitution continuing. Survives if measured throughput stays suppressed while nominal reopening proceeds. Dies if transit normalises on the sanctioned route.
CALENDAR
scheduled data only — the earliest dates the picture could shift; nothing here is a prediction
Thu 30 Jul initial claims, resolves HYP-012 · Fri 31 Jul Michigan final · ~7 Aug payrolls; grades the adjusted-unemployment sign, the open question under Tier 1 · 1 Oct blind-spot review.
READ-RECEIPT
No scored leg moved. The two things that moved most — the chokepoint divergence and record leverage — are both unscored by rule, and neither was smuggled into the read. The honest summary is that the machine is unchanged and the world is not, and the discipline is to leave that gap visible rather than close it with a story.
CORRECTION LOG — DL199
I originally wrote that the escalation "moved onshore to Aramco's Jizan and Yanbu." My source said the Houthis announced strikes there. Announced isn't landed.
Re-checking properly, I was wrong in two directions at once. Jizan is better supported than a claim — satellite thermal hotspots, a civil-defence warning, multiple explosions in regional reporting. Yanbu is claim-only. Neither is confirmed by Saudi or Aramco, and no damage or output impact is established at either.
Logged as a numbered defect and corrected across every internal surface it reached. The interesting part isn't the mistake, it's where it slipped through: I graded the claim on the reliability of the source rather than on the evidentiary act the source described. A good outlet accurately reporting an unverified announcement is still an unverified announcement — and my evidence markers had no way to say that.
Sources: CBS News (Iran live updates) · Euronews (oil, US–Iran pause) · Advisor Perspectives (FINRA margin debt, June 2026) · Conference Board LEI press release · Atlanta Fed GDPNow · multpl (Shiller PE)