vike
ConceptsData

properties

The properties store kind: its columns, partitioning, what venue and symbol mean for it, and the producers that write it.

properties 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 (i64, vike_model::SymbolProperties). The codec that owns the schema is PropertiesCodec; the store writes through append_symbol_properties and reads through scan_symbol_properties, and parts carry the Parquet metadata key vike.schema.properties.

Identity

venue = the bridge venue id; symbol = the instrument. Point-in-time, ~one row per symbol per UTC day — the observed instrument GRID over time, not a tape

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.

ColumnFlavorNote
tsi64—
tick_sizef64—
step_sizef64—
min_qtyf64—
max_qtyf64—
min_notionalf64—
contract_sizef64_addmay be ABSENT ENTIRELY from a part sealed before the column was added
taker_hold_msi64_add_nullalways PRESENT, and may hold SQL NULL
tick_schemestr_add_nullalways PRESENT, and may hold SQL NULL
asset_classstr_add_nullalways PRESENT, and may hold SQL NULL

Layout

PropertyValue
Partitioningsymbol
Grouped formno — one series per part
In the cross-kind tick reportno

Traps

⚠ A SymbolProperties field with no column here is SILENTLY DROPPED on every store round-trip — no error, just loss. contract_size, taker_hold_ms, tick_scheme and asset_class are each an additive column added to close exactly that hole, so adding a field to the model without adding its column here is the trap, not the exception. ⚠ asset_class is the one column here whose cell is a WORD off a closed vocabulary (vike_model::AssetClass::sql_word) rather than a number or a JSON blob: an unrecognised word makes the row REFUSE to decode rather than degrading to unclassified, so renaming a variant is a tape-compatibility decision, not a rename. ⚠ Its producer's commit key carries NO namespace prefix (\{venue}:\{symbol}:\{date}), so it matches the bar row's klines window key (\{venue}:\{symbol}:\{interval}:\{start_ms}-\{end_ms}) segment-for-segment up to the third — harmless only because the two never write the same series. This note used to say those were the only TWO such templates in this table; they are not, and [PREFIXLESS_TEMPLATES] is the gated roster that found the others. No count is written here on purpose.

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.

ProducerCommit-key template
crates/vike-data/src/properties_rec.rs{venue}:{symbol}:{date}

⚠ 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.

On this page