quote
The quote store kind: its columns, partitioning, what venue and symbol mean for it, and the producers that write it.
quote is one of the shapes the historical store holds. A stored series lives under a
kind= path segment, and that segment is the layout contract its producers and its consumers
have to agree on: the columns, how the leaf is partitioned, and what venue and symbol mean
for this particular kind. All of it is below, rendered from the same table the runtime dispatches
on.
One decoded row becomes a vike_model::QuoteTick. The codec that owns the schema is QuoteCodec; the
store writes through append_quotes and reads through scan_quotes.
Identity
venue = the bridge venue id; symbol = the instrument, or EMPTY on a row that the per-symbol path tags on read — which is exactly why a GROUPED append rejects an empty symbol
This is the field most often assumed and most often wrong, which is why it is stated per kind rather than once for the store.
Columns
Every Arrow column today's writer emits, in schema order, with the codec flavor that picks its Arrow type and nullability.
| Column | Flavor | Note |
|---|---|---|
ts | i64 | — |
bid | f64 | — |
ask | f64 | — |
bid_size | f64 | — |
ask_size | f64 | — |
local_ts | i64_add | may be ABSENT ENTIRELY from a part sealed before the column was added |
symbol_col | str_add | may be ABSENT ENTIRELY from a part sealed before the column was added |
Layout
| Property | Value |
|---|---|
| Partitioning | symbol |
| Grouped form | yes — many symbols in one part, told apart by a row-level symbol column |
| In the cross-kind tick report | yes |
Traps
⚠ NO clickhouse producer writes this kind any more — both are deleted (spot 2026-09-19, poly 2026-09-20: data is fetched by API or from the venue, never by reaching ClickHouse) — and the RULE they left behind is what this note is for: a clickhouse: producer had to pick a second segment no sibling used, because the namespace is shared and only that segment told two apart. One keyed a Polymarket TOKEN (clickhouse:quote:\{token}:\{day}), the other a SYMBOL (clickhouse:spot:\{symbol}:\{day}), and nothing but that segment separated them. Rows written under either key are still readable and --produced-by still accepts the prefix; nothing mints a new one. The hazard is dormant rather than gone: a second producer re-creates it. The recorder's commit key interpolates the kind tag POSITIONALLY (\{} fed from crates/vike-data/src/live_rec.rs's RecKind), so quote/trade/book/depth/equity share one template and differ only in that slot. local_ts is the LOCAL receive time and is 0 in any part sealed before the column existed.
Pinned rather than fixed: the contradiction is recorded with both sides named, so a reader meets it here instead of in production.
Known producers
Idempotency in this store is batch-level and keyed on a commit-key string, never on per-row value dedup. Two producers that collide on one template silently no-op each other's appends, and a producer that changes its template re-admits history it already wrote — both invisible unless the shapes are written side by side.
| Producer | Commit-key template |
|---|---|
crates/vike-data/src/live_rec.rs | live-{venue}-{symbol}-{}-{first_ts}-{last_ts}-{seq} |
crates/vike-backfill/src/pmxt/ingest.rs | pmxt:quote:{asset}:{hour} |
crates/vike-backfill/src/events_api.rs | eventsapi:quote:{symbol}:{day} |
crates/vike-backfill/src/dukascopy.rs | dukascopy:{symbol}:{start_ms}-{end_ms} |
crates/vike-backfill/src/vike_archive.rs | vikearchive:{}:{date}:rg{rg_idx} |
crates/vike-backfill/src/tardis/ingest.rs | tardis:{}:{symbol}:{day} |
crates/vike-backfill/src/databento/ingest.rs | databento:{}:{symbol}:{window} |
⚠ That list is observed, not exhaustive, and no gate can make it so: a commit key is an ordinary string argument, so proving the list complete would mean following every call in the workspace. What is gated per listed entry is that the producer exists and spells the template verbatim. Read it as "these producers write this kind", never as "only these do".
Where this comes from
vike_data::store_kind::STORE_KINDS, exported as rosters.json at every release. The store's
own gate derives the live kind set from the code — the series directory literals, the compaction
dispatch and the write verbs — and fails until a new kind has a row, so this page cannot describe
a shape the store does not write.