Feature Pack: YU07-historical-tick-store
Status: Implemented
Track: architecture
Lineage role: optional
Previous state: YU06-eod-price-production
This pack defines a historical tick store; a new tick-store component persisting TraderX's own
live ticks and a normalized slice of NYSE TAQ data into one partitioned Parquet schema, queryable
uniformly through DuckDB; on top of the YU06-eod-price-production baseline.
Primary intent:
- capture TraderX's own live ticks (
pricing.*price ticks,/accounts/*/tradesfills) with zero change to any existing publisher, consumer, or the order-matching hot path, - normalize a real NYSE TAQ Consolidated Quotes CSV sample into the same schema, streamed directly from its zip archive without extracting the decompressed file to disk,
- serve both uniformly through a DuckDB query recipe over the partitioned Parquet store.
Core artifacts:
spec.mdrequirements/functional-delta.mdrequirements/nonfunctional-delta.mdresearch.mddata-model.mdquickstart.mdcontracts/contract-delta.mdsystem/architecture.model.jsonsystem/architecture.mdsystem/runtime-topology.mdsystem/messaging-subject-map.mdsystem/adr-029-tick-store-component-and-streaming-taq-ingestion.mdsystem/adr-059-kdb-analytical-layer-and-off-consensus-capture.mdgeneration/generation-hook.mdgeneration/implementation-status.md
Target runtime behavior:
tick-store(new component) runscapture.pycontinuously against the NATS broker, andingest_taq_quotes.pyon demand against a TAQ CSV piped throughunzip -p.- Everything else (deploy/runtime harness, observability stack, every existing service) is inherited
unchanged from
YU06-eod-price-production.
Added later; the KDB-X analytical layerβ
Added after this state's original implementation; specified in the addendum in spec.md and
decided in system/adr-059. It reads the corpus above rather than changing it.
generation/runtime-overrides/tick-store/kdb/;tickstore.qmaps the existing ZSTD Parquet objects as date/symbol-partitionedquoteandtradetables with no conversion step;txstore.qloads TraderX's own capturedtxOrderandtxTrade;selfcheck.q(17 gates, cross-implementation against DuckDB) andtxselfcheck.q(18 gates over a fixture the cluster itself wrote) gate both.- The leader-side capture tap that produces those rows,
KdbTapWriter, ships in theYU13-limit-order-booklayer because it lives in the clusteredorder-matcher. On this state and its pre-cluster descendants the session store loads from file, and its gates run against the committed fixture without a cluster.