# Quality report

Everything below is counted, not asserted. `pipeline/quality.py` reproduces it,
`catalog/quality.json` holds the machine-readable output and
`catalog/gaps.csv` the per-symbol gap detail.

## Session coverage, deep mirror

| symbol | first | last | sessions present | expected | missing | coverage | longest gap |
|---|---|---|---|---|---|---|---|
| SPY | 2008-01-02 | 2025-12-12 | 4,514 | 4,517 | 4 | 99.93 % | 1 |
| QQQ | 2011-03-23 | 2025-12-15 | 3,700 | 3,706 | 6 | 99.84 % | 1 |
| NVDA | 2008-01-02 | 2025-12-16 | 4,515 | 4,519 | 4 | 99.91 % | 1 |
| AVGO | 2009-08-24 | 2025-12-17 | 4,103 | 4,106 | 3 | 99.93 % | 1 |
| GS | 2008-01-02 | 2025-12-19 | 4,515 | 4,522 | 7 | 99.85 % | 2 |
| JPM | 2008-01-02 | 2025-12-17 | 4,516 | 4,520 | 4 | 99.91 % | 1 |
| LLY | 2008-01-02 | 2025-12-17 | 4,514 | 4,520 | 6 | 99.87 % | 2 |
| ORCL | 2008-01-02 | 2025-12-17 | 4,516 | 4,520 | 4 | 99.91 % | 1 |

The longest hole anywhere is two sessions (LLY, 2008-07-15/16). Three dates hit
most of the book at once — 2018-11-06, 2019-09-03 and 2020-06-23 — and are
upstream production gaps, not per-symbol problems. Everything else is isolated:
SPY 2009-01-06; QQQ 2015-12-04, 2016-01-14, 2021-11-04; GS four days in
2021-07/08 and 2021-12-23; NVDA 2024-11-07; ORCL 2024-06-14; JPM 2025-02-04;
LLY 2010-12-17. No symbol is missing a week, a month or a year.
`catalog/missing-dates.csv` lists every one.

The files end on different dates in December 2025 (2025-12-12 to 2025-12-19).
**The deep mirror is frozen there**, about eleven months behind today. Anything
after that must come from the broad mirror or a licensed top-up, and the gap is
shown per symbol above rather than papered over.

## Quote quality, shipped sample (SPY + NVDA, 16–20 March 2020)

| metric | SPY | NVDA |
|---|---|---|
| rows | 57,728 | 10,522 |
| two-sided quotes | 94.71 % | 89.79 % |
| zero-bid rows | 5.25 % | 10.21 % |
| crossed quotes (bid > ask) | 0.00 % | 0.00 % |
| IV present | 100 % | 100 % |
| greeks present | 100 % | 100 % |
| volume > 0 | 63.02 % | 56.14 % |
| open interest > 0 | 82.22 % | 82.09 % |

Zero-bid rows are the deep out-of-the-money tail; they are real quotes, not
nulls, and they are 5–10 % of a stressed-week chain. Nothing is imputed.

Put-call parity on matched strike/expiry pairs, using mids and the recorded
underlying close: median absolute residual **0.66 % of spot for SPY** and
**0.24 % for NVDA**. That is the expected size of an EOD mark on a 40-vol day,
not a data error; it is the honest ceiling on precision if you trade these mids.

## Split handling, verified

NVDA 10:1, ex-date 2024-06-10:

| session | strikes listed | min strike | max strike |
|---|---|---|---|
| 2024-06-07 | 381 | 5.00 | 2,500.00 |
| 2024-06-10 | 702 | 0.50 | 2,500.00 |

The adjusted series is present at one tenth of the old strikes on the ex-date
(the 10.00 call becomes a 1.00 contract under a new OCC symbol), and a fresh
unadjusted series is listed at the new level. Both are in the file, so the
chain is complete, but a contract carried across the ex-date changes id. See
`FIELDS.md` for the mapping rule.

## Broad mirror (Dolthub) quality

- Universe: ~1.5 k underlyings per session, including names that later disappear.
- Fields: bid, ask, IV and greeks. **No volume, no open interest, no
  underlying close** — join those or accept the hole.
- The public query API caps a result at 1,000 rows and intermittently returns a
  truncated page or an empty body under load. Our universe figures are therefore
  stated as sampled and paged, not as a precise daily census.
- It carries stale and reused tickers; expect rows for symbols whose last quote
  is years old on the session you ask for only if the upstream still lists them.

## Sampling

`iv_flag` coverage, solver non-convergence and missing-field counts are
recomputed on every build; the numbers above come from
`catalog/quality.json` at build time. A buyer can rerun
`pipeline/quality.py` against the shipped sample and get the same table.

## Not claimed

- No tick-level or NBBO reconstruction.
- No 15:45 executable snapshot in the historical mirrors.
- No pre-2008 rows and no guarantee that the broad mirror is complete back to
  its first date.
