# MLB Cross-Venue Matched Book — Schema and Methodology One row anchors a captured Polymarket sample for `team` and pairs it with the nearest captured Kalshi sample within **±30 seconds**. A later Kalshi sample can be chosen. This is retrospective nearest-neighbour alignment, **not a causal, backward-only as-of join** and not an execution backtest. The dated game key is `(date, game)`; coverage and absent dates are explicit in `MANIFEST.json`. | Column | Type | Meaning | | --- | --- | --- | | `ts` | double | Polymarket capture/sample timestamp, Unix seconds UTC; not an exchange freshness timestamp | | `date`, `game`, `team` | string | dated matchup key and represented outcome team | | `poly_bid`, `poly_ask`, `poly_mid` | double | captured Polymarket quote and midpoint on the 0–1 scale | | `kalshi_yes_bid`, `kalshi_yes_ask`, `kalshi_mid` | double | nearest captured Kalshi YES quote and midpoint on the 0–1 scale | | `xvenue_spread` | double | `poly_mid - kalshi_mid`; not executable profit | | `winner` | string | carried finalized Kalshi label; null when unresolved | | `won` | double | carried 1/0 label for the represented team; null when unresolved | | `settled` | bool | finalized resolution evidence was present in the source build | The capture timestamp says when our sampler recorded the value. It does not say when the exchange last confirmed the quote. There are no exchange timestamp or depth-validity fields here. Retained prices can therefore be older than their sample times. A ±30-second sample match does not guarantee fresh prices, valid size, a fill, simultaneity, or executable arbitrage. Sampled cadence is roughly 30–60 seconds; it is not event-level or tick-complete capture. The frozen v2 observation window is 00:00 UTC on the game's dated key through strictly before 12:00 UTC the following day, subject to an available Kalshi sample within the join tolerance. This includes evening play after UTC midnight, which the original one-file loader dropped. It does **not** stop at the final out: post-final and postponed-game quotes may persist in the window, and a rescheduled listing can retain its old date. Do not interpret the window as game finality or complete in-play coverage. Doubleheaders are excluded rather than ambiguously joined: the pair key cannot distinguish games with multiple Kalshi times or an explicit G1/G2 marker. Only games discovered and captured on both venues appear. One Polymarket outcome is independently captured per game; an opposite-side complementary price is a derived identity, **not an independently observed opposite-side book**. This packer copies the supplied matched Parquet bytes without changing quote fields or carried labels. It does not fetch outcomes or settle games. The source builder must enforce the stated dated-key and doubleheader exclusion policy; packing a file does not independently verify a discarded G1/G2 marker. Unresolved labels remain null, never losses. Check exact source-byte preservation and the current per-file hashes in `MANIFEST.json` before use.