+
+
Instrument model
+
+ One canonical instrument catalog in the middle, two independent mappings off it: a
+ broker's tradable handle (broker_instrument) and a data feed's pricing symbol (
+ feed_instrument). Priceable and tradable are independent — each is just the
+ existence of a row.
+
+
+
+
+ {CARDS.map((c) => (
+
+
+ {c.tag}
+
+
+ {c.title}
+
+
+ {c.body}
+
+
+ ))}
+
+
+
+
+ End to end
+
+
+ One catalog in the middle, an adapter at each end. A feed translates its own symbols
+ through FeedSymbology; a broker publishes its tradable catalog through{" "}
+ InstrumentProvider. Each adapter owns its own symbology, so neither end
+ knows the other exists.
+
+
+
+
+
+
+ Tables & relationships
+
+
+ Foreign keys shown. broker_instrument and feed_instrument each
+ reference the master instrument; neither references the other. Two soft links by code (no
+ FK): broker_code → broker_connection, and feed_code{" "}
+ is ranked for failover in provider_feed_policy.
+
+
+
+
+
+
+ Seeding — where rows come from
+
+
+ Broker-first: sync-broker creates the master catalog + broker mapping;{" "}
+ map-feed then maps feeds onto it. make seed-live runs the whole
+ chain idempotently.
+
+
+
+
+
+
+ Runtime — the two paths
+
+
+ Pricing reads feed_instrument; order routing reads broker_instrument.
+ They never cross — a feed can price an instrument no broker trades, and vice versa.
+
+
+
+
+
+ Reflects migrations 0016–0019 and the sync-broker / map-feed flow.
+ See also{" "}
+
+ API docs
+
+ .
+
+
+