Status
Every tool below ships behind the agent-surface feature flag, which is seeded off. The contract is published first, by design: the server that serves these tools is held to a text that already exists.
The contract
- Read-only, by design. No tool places, changes or cancels an order, sets an alert, edits a watchlist, signs in or buys anything. The copilot that runs today is held to the same allowlist, in code and in tests.
- Every number carries its source: which vendor served it, when, how old it was, and whether it was live, delayed, stale or simulated.
- Every refusal carries its reason. A tool that declines an input says why, in a sentence, rather than returning an empty or invented value.
- No tool makes a recommendation. Tools describe bars, arithmetic and records; the same lint that reads the product’s copy for advice vocabulary reads a tool’s prose.
- Licensed vendor rows stay inside the display boundary the licence allows. Public-domain filings (SEC EDGAR) are served to anyone and cited by accession number.
- A symbol is a listing identity, not a bare ticker. A recycled ticker is a different company wearing a used name.
Tools
read_chart · behind a flag
Return the bars for one listing at one interval, with any registry indicators evaluated on them.
Inputs
- symbol · string · a listing identity as the product resolves it
- interval · string · one of the chart’s candle sizes (1m … 1y)
- bars · integer · how many bars back from the newest; capped per read
- studies · { id, params }[] · indicator ids from the registry, with optional parameters
Outputs
- bars · OHLCV[] · oldest to newest; the newest bar flagged as forming when it is
- studies · { id, points }[] · values aligned to bar time; warm-up bars omitted, not padded
Provenance on every answer
- source · string · the vendor that served the bars, named
- served_at · ISO-8601 · when the answer was assembled
- age_seconds · number · how old the newest bar was at served_at
- mode · live | delayed | stale | simulated · the status line’s own vocabulary
- repaint · per study · the registry’s repaint class for each study, as /docs/indicators prints it
Refuses, with the reason, when
- the symbol does not resolve to a listing
- the interval is not one the chart offers
- a study id is not in the indicator registry
- the bars requested exceed the per-read cap
- the rows are licensed for internal use and the caller is outside the display boundary
- the caller has exceeded the per-address rate limit (answers 429 with retry-after)
Today · The same bars and quotes are readable over HTTP at /api/ohlcv/{symbol}?tf=…&limit=… and /api/quote/{symbol}, with the vendor named in the payload; the indicator arithmetic runs in the browser.
audit_backtest · behind a flag
Say what a backtest result is worth once the number of attempts behind it is stated.
Inputs
- returns · number[] · periodic returns, or an equity curve the tool differences
- n_trials · integer · how many variants were tried; mandatory
- periods_per_year · integer · defaults to 252 for daily bars
- blocks · integer · optional: the split count for the probability of backtest overfitting
Outputs
- sharpe_and_deflated_sharpe · pair · always together; a Sharpe is returned only with its deflated value and the trial count
- expected_max_sharpe_no_skill · number · what luck alone hands the best of n_trials
- minimum_backtest_length_years · number · how much history a search that size needs to mean anything
- minimum_track_record_length · number · how long the result has to hold up live
- pbo · number · probability of backtest overfitting by combinatorially symmetric cross-validation
- serial_correlation_adjustment · object · Lo’s correction, with the autocorrelations it read
- forensics · string[] · the marks on the curve worth explaining
Provenance on every answer
- method · citation[] · the published formulas each number comes from
- engine_port · string · the version of the arithmetic, a port pinned against vectors minted by the research engine
- input_hash · hex · so the answer can be tied to exactly the series it was computed on
Refuses, with the reason, when
- n_trials is missing — a backtest is not evidence until you say how many you ran
- fewer observations than the statistic needs (the minimums are declared in the arithmetic)
- a non-finite value in the series
- a constant series, whose variance is degenerate rather than zero
Today · /audit runs this arithmetic in the browser (src/lib/overfit.ts), with no endpoint by design, so a curve pasted there stays on the reader’s machine.
preregister · behind a flag
Seal a hypothesis and its predicted result before the result exists, in an append-only record.
Inputs
- hypothesis · string · what is being claimed, in words
- predicted · object · the metric and the range it is predicted to land in
- universe · string[] · the listings the claim is about
- window · { from, to } · the dates the claim covers
- trial_budget · integer · how many variants the search is allowed before the claim counts as re-posed
Outputs
- record_id · string · the sealed record
- content_hash · hex · over the canonical form of the registration
- sealed_at · ISO-8601 · the server’s time, not the caller’s
- chain_position · integer · its place in the caller’s hash-chained ledger
Provenance on every answer
- ledger · per-user, append-only, hash-chained · the same ledger the research vault uses
- previous_hash · hex · the link that makes an edit to history detectable
Refuses, with the reason, when
- the caller is not authenticated — a registration belongs to someone
- the window ends before the registration is sealed: a claim dated after its result is not a prediction
- any edit to a sealed record; the ledger appends and never rewrites
Today · Signed-in users have the pre-registration vault and the research ledger at /research (POST /api/research/prereg and /api/research/trials); agent authentication ships with the flag.
null_benchmark · behind a flag
Return what luck alone would hand the best of n attempts, so a result can be read against it.
Inputs
- n_trials · integer · how many configurations were tried
- years · number · the span the result covers
- periods_per_year · integer · defaults to 252
- target_sharpe · number · optional; the level the history-needed answer is computed for (defaults to 1.0)
Outputs
- expected_max_sharpe · number · the best no-skill Sharpe expected from a search that size
- history_needed_years · number · how much history separates that search from skill at target_sharpe
Provenance on every answer
- method · citation · Bailey and López de Prado (2014); the minimum backtest length from Bailey, Borwein, López de Prado and Zhu (2014)
- assumption · string · trials are treated as independent, which is conservative — correlated searches have a lower true maximum
Refuses, with the reason, when
- n_trials below one, or not an integer
- years at or below zero
- a non-finite input
Today · /audit prints this table at render, computed by the same functions the auditor runs on (expectedMaxSharpe, minimumBacktestLengthYears).
Read-only surfaces you can call today
Each entry names the file in the repository that serves it. An agent that reads these reads the same payloads the product’s own pages read.
- /llms.txt · the machine-readable index of this productpublic/llms.txt
- /api/ohlcv/{symbol}?tf=1day&limit=500 · bars for one symbol at one interval, vendor named, per-address rate limitsrc/app/api/ohlcv/[ticker]/route.ts
- /api/quote/{symbol} · the latest quote with its source and timesrc/app/api/quote/[ticker]/route.ts
- /api/vendors · the vendor fallback chain and when it was last checkedsrc/app/api/vendors/route.ts
- /api/fundamentals/{symbol} · filed fundamentals from SEC EDGAR, cited by accession numbersrc/app/api/fundamentals/[ticker]/route.ts
- /docs/indicators/{id} · what each registry indicator computes and assumes, whether it repaints, and what lies outside its inputssrc/app/docs/indicators/[id]/page.tsx
- /docs/patterns/{id} · the rule each candlestick shape and chart formation is detected bysrc/app/docs/patterns/[id]/page.tsx
- /docs/refusals · the research campaign’s selectivity census: the pre-registered bar and the countssrc/app/docs/refusals/page.tsx