# SOFR-OIS basis naming audit — 2026-07-25

**Trigger:** External feedback on `~/Obsidian-Macro/Files/SOFR_OIS_Basis_Analysis.pdf`
(2 pages, 2026-07-25, by external reviewer).

**Protocol:** `~/.hermes/skills/finance/macro-mentor/references/contamination-cleanup-protocol.md`
(7-step cleanup workflow, codified 2026-07-20 / Session 29).

## Verified data (2026-07-23/24, NY Fed markets API live)

| Rate | Level | Spread |
|---|---|---|
| SOFR | 3.64% | |
| EFFR | 3.63% | **SOFR−EFFR = +1bp** |
| BGCR | 3.62% | **SOFR−BGCR = +2bp** |
| TGCR | 3.62% | SOFR−TGCR = +2bp |
| IORB | 3.65% | SOFR−IORB = −1bp |
| FOMC target | 3.50–3.75% | corridor |

**Calm regime.** All rates within FOMC target range. Secured-vs-unsecured basis (SOFR−EFFR) at +1bp. Within-SOFR-complex basis (SOFR−BGCR) at +2bp. SRF (cap at 3.75%) and RRP (floor at 3.55%) corridor functioning.

## External feedback's claims (all verified against the live data + product mechanics)

1. **"SOFR-OIS" is close to a category error** — VERIFIED. SOFR is the USD OIS index. There is no bank-credit spread in the SOFR complex. The "SOFR-OIS basis" colloquially used in the deck referred to the bank-balance-sheet stress read; that's actually EFFR−SOFR (or BGCR−SOFR), NOT Term SOFR-OIS. ✓
2. **Two tradeable products** — VERIFIED. Term SOFR vs compounded SOFR OIS (fixing-convention basis) + EFFR (fed funds OIS) vs SOFR basis swap (secured vs unsecured, the bank-balance-sheet expression). ✓
3. **Long basis = receive Term SOFR / pay compounded SOFR OIS, spread sits on the lower leg** — VERIFIED as market convention. ✓
4. **P&L framing in the card was wrong** — VERIFIED. Basis is struck at zero PV. Forward strip of expected basis is in the price. "Bet basis stays at +X" ≠ "collect +X" — it's roughly breakeven ex-roll/carry. P&L = realised basis minus forward-implied basis at entry. ✓
5. **Magnitude: 72bp wrong by ~10x** — VERIFIED. Term SOFR−compounded SOFR runs low single-digit bp on a 2y. EFFR−SOFR runs ±10bp normally. 72bp is swap-spread / 2020-vintage LIBOR-OIS territory, not a current SOFR-complex basis. ✓
6. **Bank credit/balance sheet doesn't drive Term SOFR−OIS** — VERIFIED. It's a secured-rate-derived index. Balance-sheet pressure drives EFFR−SOFR (reserve scarcity, QT, GSIB constraints). ✓
7. **Reversal direction correct** — VERIFIED. Pay Term SOFR / receive OIS to short the basis.

## The naming-convention lock (post-audit)

Three distinct products, three distinct substrates, three distinct colloquial names:

| Term | Definition | Driver | Normal magnitude | Stress magnitude |
|---|---|---|---|---|
| **"SOFR-OIS basis"** (Term SOFR − compounded SOFR) | Fixing-convention basis (set-in-advance vs in-arrears) | Convexity/timing/one-way hedging demand from Term SOFR loan books | Low single-digit bp | n/a |
| **"EFFR-SOFR basis"** (or BGCR/TGCR − SOFR) | Secured-vs-unsecured basis | Bank balance sheet (reserve scarcity, QT/bill supply, GSIB constraints, dealer intermediation) | ±10bp | 2019-09 spike, quarter-end |
| **"LIBOR-OIS basis"** (historical, pre-2023) | Term-unsecured-bank-funding premium = tenor + credit | Bank credit risk + tenor risk | 30-50bp | 100-150bp stress, 350bp 2008, 130bp March 2020 |

**The contamination:** the deck had been using "SOFR-OIS basis" as the bank-funding-stress read. That's actually EFFR−SOFR. Renamed across 7 Category-B cards (Block 014 / Block 016 / Block 015).

## Cards touched

### Deleted
- **1784060117585** — the user-flagged basis-swap structure card. Taught a forward-pricing-error anti-pattern ("bet basis stays at +Xbp") AND used a magnitude (~72bp) that was not a current SOFR-complex basis reading.

### Rewritten in place (rename "SOFR-OIS" → "EFFR-SOFR")
- **1783787949622** — Block 014 signal-layer three legs (MBS-Treasury / SOFR-OIS / cross-currency) → MBS-Treasury / EFFR-SOFR / cross-currency.
- **1783787949641** — Block 014 diagnostic interpretation ("SOFR-OIS-only" → "EFFR-SOFR-only").
- **1783859475597** — Block 015 sequence substrate ("SOFR-OIS first" → "EFFR-SOFR first").
- **1784060117549** — Block 016 funding-crisis ordering.
- **1784060117563** — Block 016 balance-sheet-channel diagnostic.
- **1784142183619** — Block 016 card-redesign version of funding-crisis ordering.
- **1784142183646** — Block 016 reverse card on diagnostic order reveals type.

All 7 tagged `session-fixed-2026-07-25-feedback-correction` and `naming-convention-2026-07-25`.

### Added (2 corrective atomic cards)
- **1784975950878** — Forward-basis P&L mechanic (multi-recall-path pattern, atomic): why "long basis at +X, betting it stays at X" is an anti-pattern.
- **1784975950892** — Two-basis taxonomy: name the two distinct post-LIBOR USD basis instruments + the historical LIBOR-OIS analog.

**Out of scope (intentionally NOT touched):**
- 7 Category-D diagnostic-ordering cards (1784060117542, 1784060117549 ✅ already done, 1784060117555, 1784060117568, 1784060117574, 1784142183593, 1784145913870, 1783859475580) — kept "SOFR-OIS basis" as shorthand anchored by the naming convention rather than renamed
- 2 Category-C cards (1783441333671, 1783859475547) — substrate already correctly distinguishes tenor from credit; the daily-routine naming convention block covers them

## 2026-07-25 update: Tier 1 + Tier 2 fixes applied after Pass 1 audit

**Trigger:** Pass 1 mechanical audit identified 9 remaining stale-SOFR-OIS cards + 4 Block 020 instrument-imprecision cards (Tier 1, same-class fixes) and 5 cross-block substrate disagreements (Tier 2, decisions).

### Tier 1 — applied (13 cards)

SOFR-OIS naming fixes (8 cards): 1783441333671 (Block 012, kept tenor framing, renamed to Term SOFR-compounded SOFR, removed LIBOR-era magnitudes), 1783859475547 (reframed as historical LIBOR-OIS), 1783859475580 (renamed to EFFR-SOFR for quarter-end substrate), 1784060117542, 1784060117555, 1784060117568, 1784142183593, 1784145913870 (all Block 016/017 diagnostic-ordering cards using EFFR-SOFR for bank-balance-sheet transmission).

Block 020 instrument-precision fixes (4 cards): 1784201356442, 1784201356618, 1784201356800, 1784201356967 — replaced "paying SOFR-OIS basis" directional-policy-path expressions with directional instruments (SOFR futures, payer swaptions, DV01-neutral 10s30s steepener/flattener, EFFR-SOFR where substrate is bank-balance-sheet).

Cleanup: 1783787949641 front renamed for consistency with renamed back.

### Tier 2 — applied (5 decisions, 6 cards)

1. **Payer swaption convention (lock):** Block 010's "long payer = long a put on bond" framing is correct (same payoff). Block 011's MOTIVE was wrong — payer buyers hedge against rate RISES, not rallies. Block 011 motive fix only (not changed in this session — flagged for next session).
2. **Vega vs vol-of-vol (lock):** Vega (first-order) and vol-of-vol (second-order) are INDEPENDENT sensitivities in practice. 1783285549604 (Block 011) rewritten to acknowledge independence; Block 010 framing locked.
3. **Liquidity premium sign (lock):** Two equivalent forms. 1783599647968 (Block 013) rewritten to show both forms explicitly.
4. **Taper Tantrum driver (lock):** Fed-policy EXPECTATIONS repricing = dominant driver, TP = secondary. 1782248557289 rewritten to match locked substrate (Block 005 plan + competence map); 1782387710100 was already correct.
5. **Observed-yield decomposition (lock):** Three distinct decompositions serve different questions. 1782159679162 + 1782159679290 rewritten to distinguish Fisher/observed-identity vs ACM/expectations vs DKW/breakeven.

### Cards remaining for future sessions

- Block 011 payer motive card (1783285549375) — flagged, not yet fixed (in-session scope was naming + payer convention clarification only).
- Tier 3 (~70 MED magnitude flags queued for Pass 2 data verification + 18 scattered HIGH card-design flags) — to be addressed in next session(s).

### Process changes filed

- All Tier 1 + Tier 2 fixes tagged `session-fixed-2026-07-25-feedback-correction` plus issue-specific tags (`naming-convention-2026-07-25`, `vega-volofvol-2026-07-25`, `lp-sign-2026-07-25`, `tantrum-driver-2026-07-25`, `yield-decomposition-2026-07-25`, `block-020-instrument-precision`).
- Synced to AnkiWeb.

**Final "SOFR-OIS" string count in the deck: 5 mentions, all correctly using the term** (defining it, distinguishing from it, or framing as historical LIBOR-OIS). No remaining contamination.

## 2026-07-25 cleanup pass: audit-trail removal from 9 cards

**Trigger:** User noted that historical audit-trail content on card backs re-introduces the wrong substrate into review, which is counterproductive once the substrate is locked.

**Applied to 9 cards** (all tagged `session-cleaned-2026-07-25-audit-trail`):
- 1782420776259 (Taper Tantrum decomposition)
- 1782552503381 (10y coupon — removed "(Trap from Block 008 ...)" parenthetical)
- 1783152276470 (Pre-FOMC vol — removed 3-sentence anti-pattern framing)
- 1783152700116 (Black's model — removed 3-sentence anti-pattern framing)
- 1783153591108 (Vol surface four-layer order — removed 3-sentence anti-pattern framing)
- 1783154320636 (TYVIX — removed 1-sentence "Anti-pattern: 'vol is rich = short vol.'"; kept the corrected framing)
- 1783285549375 (Payer RR buyer — removed "Anti-pattern in deck: previously labeled ..." audit-trail and "NOT a rally hedge" hint)
- 1783285549604 (Vega vs vol-of-vol — removed 1-sentence anti-pattern framing; kept the substrate independence explanation)
- 1784060117580 (DFII10 — removed "Common slip: ..." audit-trail)

**Process rule codified:** `~/.hermes/skills/finance/macro-mentor/references/anki-helper.md` — "No audit-trail on card backs" section added. Rule: once substrate is locked, cards carry correct substrate only; audit trail lives in vault memos. Anti-pattern framing is kept only when the front explicitly asks for it.

## Process rule surfaced (carry to next session)

**"When a 'X-Y basis' is used to read on a phenomenon, verify which product the substrate actually lives in — especially in transition regimes (post-LIBOR, post-cessation) where multiple products share the same colloquial name."**

This generalizes the existing `mentor-framing-data-fabrication.md` rule (magnitude + direction verification) to **product identification verification** — a third verification axis beyond magnitude and direction.

Codified in `_meta/2026-07-25-sofr-ois-feedback-audit.md` for next-session carry-forward.

## What the next session should re-probe

The two new corrective cards (1784975950878 + 1784975950892) should be probed cold-recall at next session open per the existing protocol. If the user nails both with mechanism-level recall, the rename is substrate-locked. If the user substitutes "SOFR-OIS basis" for "EFFR-SOFR basis" in any probe response, the rename is not yet substrate-locked and needs re-drill.

Also re-probe the existing Block 014 / Block 016 diagnostic-ordering cards (1784060117542, 1784060117549, 1784060117563) to confirm the rename didn't break recall of the diagnostic-ordering substrate.