Reference

Timed Trading — Data Dictionary

Practical eng reference for live KV blobs, API ticker fields, D1 tables, sessions, entitlement tiers, and central Discord/digest payloads.

Sources: price-data-pipeline rules, CONTEXT, shared-price-utils, feed outputs, price-stream, api.js, d1-schema, mirror-kernel, alerts, KV/D1 skills. TBD means not pinned from code — do not invent.

1. KV namespaces

BindingPurpose
KVAuth + sessions (session:<sid>, user:<id>)
KV_TIMEDTicker snapshots + live state (timed:*)
KV_TIMED_TRAIL5m bar trail for Markov (trail:<TICKER>:<bucket_ts>)
KV_MODEL_CONFIGOperator model knobs (model_config:gates, model_config:overlays)

Prod reads need --env production. KV is eventually consistent (~60s).

2. timed:prices (KV_TIMED) — live price aggregate

2.1 Blob envelope

NameType/shapeMeaningOwner/writerReadersFreshness / invariantsDo not confuse with
timed:pricesJSON objectUniverse live quotestt-feed REST cron; PriceStream DO/timed/prices, /timed/all overlay, health, SL feed, client pollWriters must never omit per-row q_ts/p_ts; blob-level fields must survive partial DO rewritestimed:latest:<T>; timed:all / snapshot
.prices{ [SYM]: row }Per-symbol short-key rowsSameAll consumers unwrap .pricesAlways unwrap: (await get)?.prices || {}Top-level of the blob
.updated_atnumber (ms)Blob write timeFeed cron / DO flushHealth, notify hubPoll freshness only — not value freshnessPer-row t, q_ts, p_ts
.ticker_countnumberCount of symbols in .pricesFeed cronOps / logs—Universe size in SECTOR_MAP
._sourcestringWriter path labelFeed cronLogsTBD exact enum values—
.stale_symbolsstring[] (capped ~30)Samples still stale after sweepFeed cron/timed/health, watchdogCleared / suppressed when market closed; DO must preserve on rewritePer-row missing q_ts
.stale_symbol_countnumberFull stale countFeed cronHealth / watchdogSame session gating as stale_symbolsvalueStaleCount (writer-independent)
.market_openbooleanRTH open flag at last writeFeed cronOverlay / UIDO preserves on rewriteClient isNyRegularMarketOpen()

2.2 Per-symbol short keys

NameTypeMeaningOwner/writerReadersFreshness / invariantsDo not confuse with
pnumberHeadline / RTH session price. Outside RTH for equities = today’s RTH close; live EXT print is ahpREST + stream DOOverlay, movers, SLDuring RTH, live last; outside RTH must not become AH printahp; scoring price/close
pcnumberPrevious regular-session closeREST + streamDay change, overlay prev_closeSession-closed: preserve when TD zeros day fieldsp (today close)
dcnumber | nullDay change $ (p - pc)REST + streamOverlay → day_changePrefer TD native change; preserve when market closed if TD zerosahdc
dpnumber | nullDay change %REST + streamOverlay → day_change_pct, RTH moversSame preserve rules as dcahdp; never raw UI dailyChgPct without getDailyChange
dh / dl / dvnumberDaily high / low / volumeREST + stream_live_daily_*—Candle OHLC in D1
tnumber (ms)Poll / flush timestampEvery writer tickLegacy tick freshness onlyMust not gate display freshnessq_ts, p_ts
q_tsnumber (ms)Vendor quote receipt stampREST: jittered now; stream: event lastTs; merge never regressesisPriceValueFresh, client, healthMandatory; jitter prevents batch lockstep agingVendor trade_ts; poll t
p_tsnumber (ms)Last time p actually movedWriters on price change; merge never regressesFreshness gates (with q_ts)Mandatoryq_ts (receipt ≠ price move)
ahpnumberExtended-hours last printREST/stream only when !isNyRegularMarketOpen()EXT moversNever write during RTHp
ahdc / ahdpnumberEXT change $ / % vs RTH closeSame as ahp_ah_change*Same RTH gate; crypto excluded from EXT row UIdc/dp
sessionstring (optional)Vendor session hintSome tick pathsClient tick day-changeBare WS ticks often omitBlob .market_open
trade_tsnumber (optional)Vendor last-trade timeREST parseForensicsNot used as q_ts after 2026-07-28 TD quantization fixq_ts

2.3 Freshness constants

NameValueMeaning
PF_FRESH_MS10 minRTH value-fresh window
VALUE_STALE_PAGE_GRACE_MS10 minExtra grace before Discord/health page (≥20 min stale)
PF_VALUE_FRESH_MS_CLOSED26 hOutside-RTH value-fresh window
PF_STALE_JITTER_MAX_MS8 minREST q_ts jitter window
Page threshold≥40 symbols value-stale in RTH/preopenprice_value_freshness + /timed/health

Invariant: Stream DO must own every symbol present in timed:prices or DO rewrite can clobber cron q_ts on orphans.

3. Other critical KV blobs

NameType/shapeMeaningOwner/writerReadersFreshness / invariantsDo not confuse with
timed:latest:<TICKER>Large JSON (~150–200 KB)Full scoring payloadScoring / ingest / rescore (tt-engine)Rails, admin, hydrateStale if scoring skip/OOM; not a live price sourceSlim index timed:all:snapshot
timed:all:snapshotSlim JSON indexUniverse index for /timed/all fast pathScoring tail/timed/all, options/deskMust pass max-age at readFull payload in timed:latest:*
timed:all{ data, updated_at }Dashboard universe map (micro-cache)/timed/all assemblyPages UI5-min fast path must overlayTimedPricesRowtimed:all:snapshot
timed:investor:scoresObject keyed by tickerInvestor kanban / scoresInvestor compute cronInvestor UIPurge must clear companion keys/timed/all trader graph
timed:investor:rankRanked listInvestor rank orderScoring cron (~*/5)Investor dashboardSingle-ticker rescore does not refresh thisTrader rank on snapshot
timed:capture:latest:<T>JSONLatest ingest capturePOST /timed/ingest-captureMarket internals, local smokeBest local exercise pathtimed:latest: scoring blob
timed:capture:trail:<T>JSON arrayShort capture historyIngestInternalsTBD retentionD1 timed_trail
timed:cloud-pivot:deskDesk JSONCloud Pivot desk stateScoring tick only/timed/plays/todayGate on scanned; no empty fallback writesAction rings
timed:opt-dt-actionsAction ring (cap 500)Index option day-trade paper actionsOptions DT enginePortfolio DT P&L, coverageInclude TRIM in round accountingaccount_ledger
timed:opt-dt-book:<signalId>Book JSONOpen DT paper book per signalDT engineMirror / UI—timed:opt-dt-carry:<T>
timed:opt-dt-carry:<T>Carry JSONPer-underlying carry / book pointerDT engineRe-entry / lean—Mirror row
timed:opt-dt-mirror:<signalId>Mirror stateBroker mirror flagsoptions-auto-mirrorCoverage, reconcile—timed:opt-dt-mirror-log
timed:opt-dt-mirror-logLog ringDT mirror attempt outcomesMirror + coveragemodel_broker_coverageEntry declines with reason are terminalPer-signal mirror key
timed:opt-dt:last-close:<T>stampLast DT close for re-entry cooldown (10 min)DT engineEntry gate—Reduce-unreconciled keys
timed:opt-dt:reduce-unreconciledmapFired reduces not yet reconciledMirror Stage 5bHealthKeys off reconcile statePartner-close keys
timed:brief:claim:{date}:{type}claimDaily brief generate leaseBrief cronBrief cronPrevents double evening email racedaily_briefs D1 row
bridge:client:recentringBridge order dispatch ringBroker bridge clientCoverage, catch-upRecords model qty; accepted_qty separateD1 mirror_order_attempt
timed:trades:allarray (legacy/cache)Paper trade list used by feed SL loopTrade simulationFeed SL breachPrefer D1 trades for authorityD1 trades
timed:cache:candle-tf-countscounts JSONCandle coverage gaps (1h TTL)Candle ingest helpersOnboard / gap detectionBust with ingestion-statusScanning ticker_candles GROUP BY

4. API ticker / score fields

Used by /timed/all, /timed/prices consumers, cards, rails. Live + proprietary fields are tier-gated (Section 7).

4.1 Price + day-change aliases

NameTypeMeaningOwner/writerReadersFreshness / invariantsDo not confuse with
price / closenumberSnapshot / RTH close fieldsScoring + overlayHeadline outside RTHOutside RTH overlay sets close = pf.p when value-fresh_live_price; ahp
_live_pricenumberLive feed overlay of poverlay / client mergeRTH headline when freshGated by q_ts/p_tsEXT print
_live_prev_closenumberOverlay of pcOverlaygetDailyChange source 1—Scoring prev_close
prev_close / aliasesnumberPrior close aliasesServer must emit aliasesgetDailyChange chainPrefer live pc; heal splitspc short key only in prices blob
day_change / aliasesnumberDay $ change aliasesOverlay / snapshotFallback only — UI must recompute via getDailyChangeDo not trust blindlyahdc
day_change_pct / aliasesnumberDay % aliasesSameSameSameahdp; raw dailyChgPct
_ah_price / _ah_change*numberEXT overlayOverlay when !marketOpenEXT movers rowCleared during RTH; crypto excludedHeadline price
_rth_session_closenumberClient merge lock of RTH closeFrontend mergeHeadline outside RTH—prev_close
_quote_receipt_tsnumberClient alias of q_tsOverlaygetPriceReceiptAgeMsNever use poll t_price_updated_at
_price_value_tsnumberClient alias of p_tsOverlayFreshness—_price_updated_at
_price_updated_atnumberMax of blob/updated + receipt stampsOverlayAge labelsNot the sole freshness gatescored_at

Rule: getDailyChange(t) in react-app/shared-price-utils.js is the only allowed daily-change computation for UI. Prefer (headlinePrice − prevClose).

4.2 Proprietary / model fields (redacted for Member + anon)

NameTypeMeaningOwner/writerReadersNotes
rank / score / dynamicScore / conviction / entry_qualitynumberRanking / convictionScoringPro+ UIIn PROPRIETARY_SNAPSHOT_FIELDS
sl / tp / tp1..3 / targets / …number / objStops & targetsScoring / planPro+Redacted for free/anon
kanban_stage / trade_plan / regime_forecaststring / objStage + planScoringRails—
_breakout_watch / breakoutobjBreakout watch badgeScoringUIField contract tested vs worker
_news_summaryobj/stringNews stamp from D1Scoring cronRank context—
_journeyobjJourney phasesScoringJourney UIRedacted Members
investor_score / breakdownnumber / objLong-term scoreInvestor computeInvestor pageVia investor KV more than /timed/all
tf_techmulti-TF objMulti-TF tech bundleScoringCharts / STLarge; missing W/M → backfill
rootStrategyobjMode / confluenceScoringVerdict—
_redactedboolean trueSnapshot stripped for tierredactTickerSnapshotClientsPresence means prices+scores removed

Live price field set stripped together with proprietary set for unentitled tiers — see LIVE_PRICE_SNAPSHOT_FIELDS / PROPRIETARY_SNAPSHOT_FIELDS in worker/api.js.

5. D1 tables (core)

Database: timed-trading-ledger (prod). Schemas are mostly lazy CREATE TABLE IF NOT EXISTS; worker/d1-schema.sql is the documented baseline.

5.1 Trades / paper / ledger

NameType/shape (key columns)MeaningOwner/writerReadersFreshness / invariantsDo not confuse with
tradestrade_id PK; ticker, direction, entry_*/exit_*, status, trimmed_pct, pnl*, setup_*, …Short-term model / paper tradesTrade simulation / kanbanPortfolio, autopsy, coverage, CIOLive rows typically run_id null/emptybacktest_run_trades; investor_positions
trades.shares / notionalREALSize fieldsBackfill / entry writersAccount summary, Size columnDDL site TBDOptions DT contracts
trade_eventsevent_id PK; trade_id, type, price, qty_pct_*Trade lifecycle eventsSimulationAutopsy / ledger rebuildUnique (trade_id, type, ts)Mirror order attempts
positionsposition_id PK; ticker, direction, status, qty, cost_basis, SL/TPExecution adapter position rowsSimulation / syncCatch-up, share backfillposition_id often == trade_idinvestor_positions; model_position
account_ledgerledger_id; mode (trader/investor/day_trade); cash_delta; balanceCash + realized P&L booksLedger writers per bookPortfolio equity curvesDay Trader sleeve uses mode=day_trade + $25k startOption DT actions only in KV ring
data_audit_logaudit_id; op, scope, caller, rows_affectedForensic log of destructive opsBest-effort helpersOps forensicsNever throws into caller pathBroker audit rings
alertsalert_id; ticker, side, rank, discord_sent, payload_jsonAlert ledger / dedupeAlert pipelineDiscord status / dedupeUnique ticker+tsDiscord webhook embeds

5.2 Investor

NameKey columnsMeaningOwner/writerReadersNotes
investor_positionsid PK; ticker, status, shares, cost_basis, avg_entry, peak_price, thesis*, …Long-term bookInvestor compute / DCA / rebalanceInvestor UI, mirror, peak healpeak_price must be SELECTed or MFE trim understates
investor_lotsid; position_id; action; shares; price; value; ts; reasonLot log (buys/sells)SamePnL / monthly; chunked fetch (≤80 ids / IN)D1 100-bind cap

5.3 Universe / candles / captures

NameKey columnsMeaningOwner/writerReadersNotes
ticker_indexticker PK; first/last_seenUniverse membershipOnboard / scoringRegistry, dead-weightEvery Selected name needs sector + candles + score
ticker_latestticker PK; ts; kanban_stage; payload_jsonD1 fallback cache of latest payloadScoring tail sync/timed/all fallbackFingerprint must not store full payload in isolate memory
ticker_candles(ticker, tf, ts) PK; ohlcv; sessionMulti-TF OHLCVBar cron / live sync / backfillCharts, scoring, peak healNever unbounded GROUP BY
timed_trail(ticker, ts) PK; scores + payload_jsonHistorical ingest trailIngestReplay / time-travelKeyset-page large scans
ingest_receiptsreceipt_id PK; ticker, ts, payload_hashIdempotent raw webhook receiptsIngestDedup / forensics—
ticker_news(discovery module)News factsnews-trackerScoring _news_summary—
ticker_profiles / sector_profilesprofile rowsFundamentals / sectorOnboardRank context—

5.4 Broker mirror / intents

NameKey columnsMeaningOwner/writerReadersFreshness / invariantsDo not confuse with
model_positionposition_id PK; lane; signal_id; qty; status; seqEntangled-mirror model positionMirror kernelConverge / coverageSleeve qty derived from fillsPaper KV book
model_leg(position_id, seq); event; remaining_afterModel leg eventsKernelReconstruct remainingUnique (position_id, event, remaining_after)trade_events
mirror_sleeve(position_id, account_id); status; divergence_reasonPer-account sleeveKernelConvergebroker_account_id is join key across tenantsRing row
mirror_order_attemptclient_order_id PK; filled_qty; status; reasonEvery account order attempt before sendKernel / bridgeCoverageNever truncate client_order_id entropybridge:client:recent
mirror_dispatch_outbox(position_id, seq); status pendingDurable reduce dispatchKernelCron + converge drainPhase-2 queue precursorBroker intents
broker_intentsid PK; trade_id; side; qty; status pending; order_jsonDeferred reducer places that did not placerecordBrokerIntentDrain cron / healTerminal outcomes not stored as pendingMirror attempts (placed path)

Manifest / sync columns such as broker_remaining_qty, sync_drift_count live on broker-mirror tables — full equity manifest table name TBD (see skills/broker-bridge.md).

5.5 Briefs / CIO / learning

NameMeaningOwnerNotes
daily_briefsMorning/evening brief content + prediction levelsDaily brief cronClaim KV before OpenAI
daily_market_snapshotsPer-date macro snapshotBrief—
market_eventsEcon calendar incl. FOMCBrief / FSDCurated FOMC snap; purge horizon-bound
ai_cio_decisionsCIO approve/reject + outcomesCIO serviceFilter is_replay=0 for live stats
learning_proposalsLoop-2 proposalsLearningSee skills/learning-loops.md
decision_recordsDecision auditDecision records module—

Many research/backtest tables exist — omitted here; accuracy over completeness.

6. Session concepts

NameTypeMeaningOwnerReadersInvariantsDo not confuse with
RTHsessionNY regular hours (~09:30–16:00 ET; half-days 13:00)isNyRegularMarketOpen() / market-calendarFeed writers, overlay, UICalendar must match worker + frontendExtended hours
EXT / AHsessionPre/post regular sessionFeed when !RTHEXT movers rowHidden during RTH; persists when closedHeadline p
PREsession04:00–09:30 ET weekdayClient helpersTick day-change gatingPRE tick dayChg can be gap vs prev closeRTH day %
Crypto 24/7symbolsBTCUSD, ETHUSDFeed + UI—No EXT row; excluded from equity value-stale accountingEquity AH fields
Value-stale excludesetSPX, VIX, NDX, … + cryptofeed-outputsHealthFutures/indices use other lanesEquity universe

7. Entitlement tiers

Code tierUser meaningLive pricesProprietary scores / SL/TPUI gate
adminAdmin / API key locallyYesYes_ttIsPro true (admin)
proPaying Pro or VIP (VIP collapsed → pro)YesYeswindow._ttIsPro
freeMember (signed in, never paid) — not a product “free plan”NoNo_ttIsPro false
anonNot signed inNoNofalse
NameMeaningOwnerNotes
canAccessLivePrices(tier)tier ∈ {admin, pro}worker/api.jsGates /timed/prices, ws-ticket, unredacted /timed/all
redactTickerMapForTierStrips live + proprietary fields; sets _redacted:trueAPI assemblyCache keys include tier bucket
Footer attribution“Market data powered by Twelve Data”FrontendLicensing — required

8. Discord / digest / alert fields

8.1 Transport

NameMeaningOwnerNotes
Lane tradeModel trade lifecycle → DISCORD_WEBHOOK_URLnotifyDiscordDefault lane
Lane generalBriefs / intel → DISCORD_GENERAL_WEBHOOK_URLSameFalls back to trade if unset (logged)
Lane systemOps / cron failures → DISCORD_SYSTEM_WEBHOOK_URLSameUsername suffix • Ops
DISCORD_ENABLEMust be "true"EnvOtherwise skipped
Embed limitstitle <256, field.value <1024, total <6000Discord API400 on bust — check worker logs

8.2 D1 alerts row

See Section 5.1 — discord_sent, discord_status, discord_error, payload_json, dedupe_day.

8.3 Representative embed payloads

KindTypical fieldsLane
Cron failuretitle Cron Failure: {op}, error textsystem
Weekly investor digestMarket Health, Portfolio Summary, Stage Changes, Top Accumulation, Sector Rotationgeneral
Investor zone / thesisticker, Long Term Score, Confidence, RS Rank, Zone Type, Signals, optional AI CIO guidancetrade
Investor open / add / trimShares, Price, Value, Stage, Scoretrade
Broker coverage clean/failtitle BROKER COVERAGE · …system
Daily briefMarkdown/content from daily_briefsgeneral

Exact field lists for every trade embed variant: TBD (see worker/alerts.js + discord helpers).

9. Related health / watch fields

NameLocationMeaning
valueStaleCount / valueStaleSymbols/timed/healthWriter-independent count from timed:prices rows
price_value_freshnessCron tombstone / DiscordPages when ≥40 symbols >20m stale in RTH/preopen
deployedSha / workerRole/timed/health, /timed/versionDeploy verification

10. Biggest gaps still TBD

  1. Full trades column inventory in prod — shares / notional / run_id / trim_price and other ALTERs used in queries but not all present in d1-schema.sql CREATE; confirm with PRAGMA table_info(trades) on prod.
  2. Equity broker manifest table / KV schema — broker_remaining_qty, sync_drift_count, suppress flags; exact storage object not fully traced (skills/broker-bridge.md).
  3. Complete Discord trade open/close embed field map — investor + digest covered; ST entry/exit and options DT embeds need a dedicated pass.
  4. Exhaustive KV key catalog — dozens of timed:opt-dt:*, coo:*, bridge:*, investor stage keys; only operationally critical ones listed.
  5. Research/backtest/calibration D1 surface — intentionally deferred.
  6. timed:latest payload field encyclopedia — tf_tech alone is large; document incrementally via snapshot/rescore skills.

Approximate dictionary entries: ~95. Source: docs/data-dictionary.md.