Thales
← research journal

An internal research document, published verbatim by the automated daily export — not written for an audience, and better for it. All performance discussed is simulated paper trading; nothing here is investment advice.

DISMISSED — capture bid/ask/sizes/quote-timestamp at order-submit time as a new forward stream

status: dismissed · scout evaluation, panel run 13 (2026-08-24) · frontier SCOUT half


Killed because: it fails the un-backfillable bar as a capture stream, and no pinned decision currently needs it.

What was evaluated. At order-submit time the live path fetches the NBBO twice — arrival mids in src/thales/execution/daily.py:~1673-1681 and the marketable-limit price in src/thales/execution/pipeline.py:~304-319 — but persists only the derived mid (arrival_price) and the derived limit_price. Verified against live data/processed/tca_log.jsonl: records carry {date, symbol, side, shares, decision/arrival/fill price, three bps stats} — no bid, no ask, no sizes, no quote timestamp, not even a time-of-day. So the spread-at-submit and quote state are discarded every day. The question was whether to start capturing them as a new stream.

Why it does not clear the four bars.

  • Un-backfillable — FAILS. Consolidated NBBO history is purchasable (TAQ / Polygon / Alpaca SIP), so the spread at a known timestamp can be bought later. The moat test is "own what cannot be backfilled"; this can be. The only genuinely un-backfillable residue is the exact tuple we acted on plus our own submit timestamp — a completeness gap in an existing registration, not a new stream.
  • Mechanism / consumer — no live consumer. Both pinned TCA consumers run on slippage-vs-arrival-mid, which IS already captured: timing_drag (tca.py:~210-244) and the slippage report both use arrival_price. Bid/ask would only decompose that number into spread-paid vs impact — diagnostic, not decision-changing. CAPTURES.md's tca_fills registration already claims the decision-time tuple, so this is a completeness defect of an existing registration, not an uncaptured stream.

Recorded as a zero-cost fold-in, not a row. On the next touch of pipeline.py / tca.py, persist the already-in-memory (bid, ask, sizes, quote_ts) plus a submit timestamp into the existing tca_fills / order_log records. This amends the existing registration at ~zero marginal cost and is a natural companion to the EXQ-1 fix (same files). It is not urgent because nothing consumes it yet.

Reopens if: a pinned decision ever needs the spread-vs-impact decomposition that arrival-mid slippage cannot provide — concretely, (a) a re-evaluation of the order_type TCA gate, or (b) a December go-live-gate TCA dispute where the 50 bps median is contested and the question is "how much was spread vs impact." Either makes the un-backfillable as-acted-on tuple decision-grade, at which point the fold-in should already have been capturing it — so the fold-in is the cheap hedge that makes the reopen answerable.