Current limitations

These are outstanding capabilities or decisions, not instructions to reimplement shipped features.

AreaRemaining work or restriction
Futures dataThe oi_based and dsl roll policies have no implementation: engine/roll/oi.go and engine/roll/dsl.go were deleted in GLE-322 (their open-interest and FND/LND inputs never reached the adapter contract). ER5 (GLE-327) then deleted the volume policy, engine/roll, the registry loader and continuous.Build: marketfeed’s served schedule is the only election. Partial-roll scheduling and spread-order execution remain deferred. Engine use of marketfeed’s :cont composite landed through GLE-214’s engine rounds: a run names fut:V:R or fut:V:R:cont:adj=<method> (ER3, GLE-325); back-month (ofs=) composites stay viewer-only, and a declared :cont series stays refused.
Continuous liveContinuous live mode does not exist, and --mode live on a continuous symbol (a bare root or a :cont composite) is refused before any spawn (GLE-228 Decision 7, owner decision 2026-10-04). If built it must follow the served schedule as backtests do (GLE-270), which needs causal publication of the current front’s schedule (O5), and it must populate broker/manifest reconciliation inputs and recover partial rolls.
SessionsContinuous daily/weekly runs consume the feed’s session composites; intraday grids are supported on the plain path and refused on the continuous path. Arbitrary intraday hours/day filtering and partially derived year coverage remain open.
Equity adjustmentsBacktest price adjustment is the feed’s since GLE-328: the engine translates orders and fills by the served cumulative_price_ratio and keeps its own schedule for live mode only. Open: the port of adjuster_boundary_spec_test.go to marketfeed as the served law’s parity spec; the ex-date firing on epoch daily bars closing at the ex midnight (one bar early; TestTeqMidWeekSplit reproduces it); a “mixed-qualifier lineage” hint when two renames collide under one anchor after the re-key; reinvested-dividend execution and alternative merger cost-basis models. Factor-feed reconciliation is superseded (GLE-228 Decision 8). The raw projection divides a settle by the bar’s ratio over a copied BarSession; live mode’s AdjustBar keys by trade date.
Live modeReal-time feed/clock support and the broader reconciliation/CA surface described above.
ReportingMultiple benchmark curves in CSV/HTML and non-primary statistics under a portfolio subset filter.
CachingFreshness fingerprints, TTL/eviction, cross-process single-flight, an in-memory sharing layer and as-of build caching.
ExecutionMargin model, exchange-auction semantics beyond current MOC, and general partial-fill/disconnect/unknown-submit fault simulation.
Research orchestrationParallel run execution, walk-forward scheduling/IS-OOS stitching, multiple-testing correction and portfolio allocation. Per-fold snapshot primitives and reporting already exist.
Protocols and compositionJSONL, Unix-domain sockets, composite data-source routing, Trade Director/filter processes and AI integration tooling remain design proposals.

The original architecture also proposed typed filter chains with individual and batch decisions, global versus per-run scope, deterministic bar barriers, and an audit trail; failure-injection scripts; multi-source warmup/live handoffs; and AI lint/explain/MCP surfaces. Those are not shipped APIs. Detailed prior design rationale is recoverable from the historical architecture document using the commands in documentation history. The next implementation should refresh those designs against the current SDK and engine before treating old interface sketches as contracts.

Scaling opportunities

These estimates come from code inspection, not timed whole-run benchmarks. Profile a run with persistent brackets, a many-run portfolio, and a large multi-series run before quoting throughput gains.

  • OCO matching. The bar and tick loops call groupMembers once per active group, and the helper scans every working order (engine/sim/advance.go). With 1,000 two-leg groups, that is about 2 million group-membership checks per bar or print. A submission-ordered group index would reduce this component to about 2,000 checks, roughly 1,000 times fewer. Whole-run gain depends on how many groups rest and how much time the run spends in matching.
  • Portfolio memory. alignedRuns allocates three float columns and one flag column for every run at every union timestamp, and Combine retains them even when the HTML filter is disabled above 12 runs or output is sampled daily (engine/report/combine.go, engine/report/html.go). Twelve runs at one million timestamps need at least 300 MB for these columns alone, before slice spare capacity, input curves, and the joint curve. Stream the joint curve and retain only sampled columns needed by the filter. At 390 one-minute bars per trading day, daily sampling could shrink this column component about 390 times; total process memory would fall by less because other data remains.
  • Multi-series bar merge. mergeBars concatenates already sorted per-series streams and stable-sorts all bars (engine/backtest.go). A stable k-way merge that preserves series-order ties changes its bound from O(N log N) to O(N log S) for N bars and S series; two series permit a linear merge. Single-series runs already bypass sorting. Profile the merge phase before forecasting a whole-run saving: if it consumes 10% of elapsed time, even removing that cost entirely saves at most 10% of time.