EdgeDepth Research MCP Server
@edgedepth/research-mcp is the official, research-only Model Context Protocol server for EdgeDepth, a market microstructure search engine over recorded Binance USDT-M crypto perpetuals. Use it from ChatGPT, Claude, Cursor, Codex, or any MCP client to find every verified occurrence of a market condition, inspect forward outcomes across the complete matched set, read an unconditional same-scope reference, and open replay-linked evidence.
Every result includes counts with denominators and a reproducibility key. Same key, same bytes.
Website · Search the market · REST API documentation · MCP setup guide · Learning hub
Why use EdgeDepth Research?
- Search recorded market microstructure: query a closed, versioned feature registry covering order flow, order-book depth and cost to trade, capture provenance, price action, volatility, funding, open interest, positioning, candle formations, liquidations and liquidation shelves.
- Keep the denominator: every count reports the eligible population and exclusions behind it. Missing data is absent, never silently changed to zero.
- Measure outcomes without lookahead selection: forward returns, MFE, and MAE are computed over all occurrences. Outcome fields cannot be used as filters.
- Compare matched and baseline populations: deterministic cohort results put the matched distribution beside every other eligible predicate-false bucket.
- Audit and replay the evidence: results carry a reproducibility key, and representative occurrences include authenticated web handoffs to the exact recorded market moment.
- Stay research-only: no tool trades, modifies alerts or publishes reports. The private Radar admin pilot can save account-owned hypotheses with the separate optional
research:hypotheses permission. A fresh scan, cohort, or stratified computation can consume research allowance units; the annotations state that side effect explicitly.
Choose a connection
The package exposes one tool core through two transports:
- Hosted MCP (recommended): connect to
https://mcp.edgedepth.com/mcp over Streamable HTTP and authorize once in your browser. No API key to copy.
- Local stdio: run
npx -y @edgedepth/research-mcp with an EdgeDepth API key.
Connect
Claude Desktop
In Settings > Connectors > Add custom connector, enter:
https://mcp.edgedepth.com/mcp
Complete the EdgeDepth browser authorization prompt.
Cursor (~/.cursor/mcp.json)
{
"mcpServers": {
"edgedepth-research": {
"url": "https://mcp.edgedepth.com/mcp"
}
}
}
Codex (~/.codex/config.toml)
[mcp_servers.edgedepth]
url = "https://mcp.edgedepth.com/mcp"
Then run:
codex mcp login edgedepth
Remove any old bearer_token_env_var line before using browser OAuth.
Local stdio with npx
Create a key on the EdgeDepth Developer page, then add:
{
"mcpServers": {
"edgedepth-research": {
"command": "npx",
"args": ["-y", "@edgedepth/research-mcp"],
"env": {
"EDGEDEPTH_API_KEY": "edk_live_YOUR_KEY"
}
}
}
}
Local stdio requires Node.js 20 or newer. Use the research:read key scope for recorded-data tools and add research:interpret only when you need the free interpret_prose proposal step.
Result projection (agent context economy)
Scan-family results are large: a universe scan's canonical bytes run to
hundreds of kilobytes, most of it page rows carrying every recorded feature,
the zero and long-tail entries of counts_by_symbol, and empty threshold
rungs. That overflows a client's tool-result budget before it answers anything.
run_scan, next_page and run_cohort therefore return a stated
projection by default. Display derivations and removals are stated with the
exact way to recover detail. Default run_scan adds the compact text view described
below; full_outcomes: true, next_page and run_cohort keep this detailed projection:
- occurrence rows are trimmed to
rows (default 3) and each kept row keeps the
setup fields its own evidence block names - full_rows: true restores the
whole vector;
- the per-occurrence
outcomes map keeps the entries for the rows that remain;
counts_by_symbol keeps the top entries by match count, and says how many
instruments and matches were omitted;
- the outcome ladders are replaced by a paired answer block: for each metric,
present, absent and the selected rungs' integer counts pass through
verbatim, with rate, the unconditional baseline_rate over the same
symbols and window, and their ratio as lift stated beside them. The
selection is fixed in advance (gte 0.01, gte 0.02, lte -0.01,
lte -0.02), drops rungs that separate nothing, and adds the single rung
carrying the largest lift among those holding at least 30 occurrences,
marked kept_for. full_outcomes: true returns every rung and the per-rung
histogram, on the matched set and the reference separately.
Full-population counts, outcome denominators, absent tallies, predicate_coverage,
representatives, the page cursor and reproducibility key stay intact. The request
document is never rewritten, so the canonical query hash and the credit charged
are exactly what you asked for. full_counts: true returns the engine's
verbatim canonical bytes with no projection at all. ETags are
projection-scoped: an ETag held for one projection can never revalidate as a
different one.
list_features takes the same treatment on request: search, feature_ids
and compact return one feature family instead of the whole grammar, with the
closed parts (operators, windows, sequence rules, limits, error codes) intact.
Prompts and resources
The server publishes worked prompts, which compatible clients surface as
pickable commands: test_a_claim, liquidation_cascade_bounce,
investigate_symbol, what_preceded_moves_like_this, does_it_confirm and how_common_is_it (the free
prevalence path). Each one encodes the same answer contract: ground the
grammar, propose the exact definition, wait for confirmation, then report with
denominators, the reference, the reproducibility key and a replay handoff.
The grammar registry is also served as a resource, edgedepth://research/grammar,
so a client can attach it once instead of calling list_features every session.
Recommended agent workflow
- For setup-first questions, interpret prose in the host and call
prepare_study with structured scope, predicates and outcome. It reuses the web validator and measure contract, validates current instrument membership and returns an unrun canonical definition plus a fresh allowance estimate. No external LLM is used. Preserve user_stated, semantic_translation (top 10% means rank >= 0.9) and model_assumed separately; only the latter denotes an invented proposal. Use interpret_prose unchanged as the raw-prose fallback. Use compact list_features for uncommon fields or validation repair, not every question.
- Call
list_instruments only when you need to check the manifest-derived universe, coverage, and provenance. Its result carries the human market page in the same way, https://edgedepth.com/research/symbols/<symbol>, for a market still being recorded; a delisted market in the universe has no page, so offer that link rather than promising it.
- Show one short proposal: condition, exact markets and dates/time zone, outcome definition and horizon, and metering. Interpretation is free; fresh computations can consume allowance. Label every unprovided value as a proposed assumption using chip provenance. Resolve unsupported fragments and ask only questions that materially change the study. Keep exact JSON and diagnostics inspectable in tool details, available on request.
- Wait for explicit human approval, then pass the same document to
run_scan. Changes require a new proposal and confirmation. The exact-document API does not store a proposal ID or a human approval receipt; client consent is required, and a model-supplied flag is not proof. On the supporting web release (b68c744 or later), returned rq workbench links load editable proposals and wait for Run; navigation never authorizes computation.
- Answer the question first, preserving zero-match and inconclusive findings. Give matched/eligible counts, coverage exclusions, present/absent outcomes, both directions at the agreed horizon, and overlap/selection limitations. Read rates from
outcomes_summary, which covers all occurrences. Page rows are examples, never the denominator. Each rung already carries its matched count and rate, the unconditional rate, and their ratio as lift: quote those, and quote the count beside the rate. No lift means no reference was available or the unconditional rate was zero; neither licenses estimating one.
- Read the appended unconditional same-scope reference when available. It is not matched, comparable, or a causal control.
- Return the full reproducibility key with the answer and one relevant next action: a returned replay, a changed assumption, or an existing report. General saved studies and alerts remain web actions; private Radar hypotheses use the optional workflow below. Each handoff states how far back it sits; replay reach is a per-account entitlement, so an old moment can be refused at the web surface even though the occurrence is real. Use
next_page only with a cursor returned by the API.
Example instruction for an MCP client:
Did elevated VPIN and one-sided buying tend to precede a rise? Propose a precise
study before running anything. Label any suggested thresholds, markets, dates
and outcome definition so I can approve or change them.
The user does not need tool names, feature IDs or JSON. The client translates the
confirmed proposal into the existing exact-document call.
Outcome-first and pointed-move workflow
For an outcome-first question, use outcome_first after agreeing the target and
scope. Preserve touched-within (reached) versus close-at-end (finished),
direction, size and horizon. Do not pass the outcome to the setup interpreter or
substitute the worked example. The target grammar is available at
edgedepth://research/outcome-first.
Report the population and both counted shares for each displayed reading. Help
the person choose one reading, retrieve its setup_first_rerun with full_rows: true on the unchanged request, and confirm that exact setup before run_scan.
Pass the original target as run_scan.measure outside the unchanged document:
kind: "touch" for reached, "close" for finished, plus the agreed direction,
fractional magnitude and horizon. The returned workbench link keeps that display
choice and remains an unrun draft. This does not alter the scan/cache key. The local selected-outcome addition below preserves the exact reading separately from closing-return exploration.
Read the original outcome target from the complete matched-set summary; request
full_outcomes if the projection omitted its rung. An unavailable rung is stated,
never replaced by the default horizon. The two reads have different denominators.
A same-period rerun remains exploratory; freeze the condition and use a separate
period before claiming validation.
A named moment can be inspected with snapshot_at; commonality compares multiple
supplied moments. The screenshot path below adds bounded explicit close-range investigation and the existing
detector geometry. Automatic move selection is not exposed through MCP. Historical marker browsing and general volume-tier resolution are not MCP
capabilities yet. The local resolve_scope addition below supplies explicit sector resolution after its web release. list_instruments supplies coverage and instrument provenance,
not sector membership. Use resolve_scope for recorded sector membership when available; otherwise use an exact supplied roster;
never invent group members or a numeric price. Replay handoffs open the web surface
and remain subject to the person's coverage and entitlement.
| Tool | What it does |
|---|
list_features | Returns the closed grammar registry: feature ids, types, ranges, operators, windows, sequence rules, limits, and error codes. search, feature_ids and compact narrow it. |
list_instruments | Returns the research universe and coverage. The default is a compact summary; use symbols: [...] for selected full records or full: true for the verbatim canonical universe. |
prepare_study | Free deterministic structured preparation, provenance and allowance estimate. Requires the web /prepare release first. |
interpret_prose | Turns prose into a proposed query document. It does not execute the query. Optional time_zone accepts an IANA time zone for calendar planning. |
run_scan | Executes a research_query.v2 document and returns result bytes with counts, denominators, outcomes, the unconditional same-scope reference, and the reproducibility key. Projected by default (rows, full_rows, full_counts). |
next_page | Continues a prior scan with its opaque cursor. Never construct cursors manually. |
ground_screenshots | Resolves host-extracted screenshot coordinates against recorded candle closes and coverage, retaining uncertainty and deduplicating event views. Free. |
investigate_move | Reads the existing lead-up and optional recorded detector geometry for a grounded event, and optionally prepares exact unrun setup documents. Free read; historical entitlement applies. |
snapshot_at | Reads registry feature values, window aggregates, and fired rules as of a recorded moment. |
base_rate | Counts matches and eligible buckets for one clause over a window. |
commonality | Finds the deterministic intersection across multiple moments with selection-bias caveats included. |
get_report | Retrieves a published report by its 8-character canonical hash. |
run_cohort | Compares what followed every match with what followed every other eligible predicate-false bucket. |
run_stratified | Partitions one matched population at its existing anchors into split-true, split-false, and split-absent outcome summaries. |
outcome_first | Starts from the MOVE instead of the setup: names an outcome (size, direction, horizon) and reports what the record was doing at five fixed offsets before every realised move like it. Each row carries two counted shares, the share before these moves and the share across every eligible minute in the same scope, plus the setup-first rerun that re-tests it the other way round. A descriptive read, never a rule search: a row is not a rule, a candidate or a finding, and the row order is display order. A scope with too few realised moves is refused with its counts and four adjustments, and a refusal spends nothing. Projected by default (rows, full_rows). |
No tool can trade, change market state or publish. Only the private hypothesis tools modify account research history, with separate permission. run_scan, run_cohort, run_stratified and outcome_first are annotated as metered computations because a fresh call can irreversibly consume an allowance unit. The other recorded-data tools are closed-world reads. interpret_prose is a free read that uses the configured external language interpreter.
Private Radar hypothesis workflow (local addition)
Requires the supporting web release, its optional API-key scope migration and
Radar admin access. Web precedes MCP. Existing grants and keys gain no permission;
request research:hypotheses alongside research:read and authorize a new grant,
or explicitly select the hypothesis option when creating a key. Ordinary accounts
remain denied. This is not a public release or hosted acceptance claim.
get_hypothesis: original observation (event), your saved record (id), or
your list (neither). full: true restores all receipt bodies. Reads run nothing.
prepare_hypothesis: exact editable draft, four requests, revision, plan hash
and an allowance estimate. No save, computation or approval is implied.
save_hypothesis: explicit private save at the known revision; existing source
and attempts stay immutable. Save Test/Keep/Reject without dropping failures.
run_hypothesis: after human approval of the exact proposal, freeze all four
requests and run the first. Use the returned continuation serially for the
remaining requests under that same approval. Stop when it is absent. After an
ambiguous timeout, read the saved history; running/unknown work is never retried.
Both web and MCP use one account history. Counts come from native whole-result
summaries. A+B is primary; A/B are diagnostics against the same input-eligible
population, including matches. Samples can contain supporting and contradictory
cases but never supply the denominator. One Binance USDT perpetual, six supported
numeric fields; population also permits native daily price/OI crossings after
its backend release. Outcome is +5% MFE within four hours, before costs/fills.
Development is at most 31 days, separated by seven full days from reserved
evaluation; anchors end by September 11, 2026. Reserved evaluation is never run.
The server retains definitions, failures, response bytes, HTTP/allowance headers
and reproducibility keys. Default output projects examples and omits raw receipts,
with recovery stated. Imported browser evidence stays labeled caller-supplied.
Storage and concurrency errors stop further work; reopening never computes.
Existing metering remains: API computations can each consume allowance, cached
work is free; the session UI retains its existing population-scan meter.
Research contract
- Validation failures pass through as
422 {"errors":[{"code":"...","message":"..."}]}.
- Transport failures use the
{"error","code"} envelope.
- Contract codes are machine-actionable. For errors such as
UNSUPPORTED_FEATURE or OUTCOME_IN_PREDICATE, call list_features, repair the document, and retry.
- Deterministic tools are exact-document, UTC-only tools.
interpret_prose may use a time zone to plan dates, but run_scan, run_cohort, and base_rate never reinterpret calendar language.
- Reruns and ETag
304 Not Modified revalidations are free. list_instruments ETags are scoped to the requested summary, symbol projection, or full representation.
- Interpretation is free and never debits the scan allowance. An unavailable scan allowance returns neutral
402 RESEARCH_ALLOWANCE_EXHAUSTED metadata without a checkout link.
REST API and documentation
The MCP server is a thin, deterministic interface to the public EdgeDepth Research API:
The default REST base used by the stdio package is https://app.edgedepth.com/api/v1/research.
Environment
Local stdio
| Variable | Default | Purpose |
|---|
EDGEDEPTH_API_KEY | None | Required for stdio tool calls. |
EDGEDEPTH_API_BASE | https://app.edgedepth.com/api/v1/research | Optional REST API base override. |
Hosted server operators
| Variable | Default | Purpose |
|---|
EDGEDEPTH_OAUTH_EXCHANGE_URL | http://127.0.0.1:3002/api/mcp/oauth/exchange | OAuth access-token exchange endpoint. |
MCP_INTERNAL_SECRET | None | Required internal assertion secret; must match the web app. |
PORT | 3003 | HTTP listen port. |
HOST | 127.0.0.1 | HTTP listen host. |
Authentication and security
The hosted server uses browser OAuth. It validates opaque access tokens, exchanges them for separate short-lived internal assertions, and never passes the OAuth access token to the REST API. The MCP server is stateless and stores no user credentials.
Compatible clients rotate refresh tokens silently while the connection remains active. Review or revoke access at EdgeDepth Connected Apps.
API keys remain available for scripts, local stdio, and MCP clients without browser OAuth. Treat an edk_live_... key as a secret and never commit it to source control.
Develop
npm install
npm run build
npm test
npm run typecheck
TypeScript builds to dist/. Example nginx locations, systemd hardening, and operator environment values live under deploy/. Production deployment and npm publishing remain operator actions.
- edgedepth-terminal (AGPL): the open-source C++/WASM orderflow terminal. Replay-linked evidence from research results opens the exact recorded market moment in it, and it self-hosts with one docker compose command.
- edgedepth-gateway (MIT): a Go bridge from Binance's public streams to the terminal's wire format, for running the terminal on live data without an account.
License
MIT
Inline scan evidence
Supported MCP Apps hosts can display a comparison and recorded-distribution card
from run_scan. The card receives only complete-result forward-return summaries,
coverage, exact query/key and metering in tool-result _meta. This data is hidden
from the model in ChatGPT; the existing text projection is unchanged. No raw page
observations are used to make distributions, no fitted curves are invented, and
no additional requests or allowance consumption occur when changing chart views.
Reference distributions are compared only when their bin edges align. Empty bins,
open tails, missing outcomes and zero/one-observation states remain visible.
Horizon and move-size controls are display choices over already-computed outcomes,
not changes to the approved query. The card opens on the stated outcome; without one, it prefers 24h and a
labelled exploratory move supported by at least 30 occurrences when available.
Exact study/evidence details expand inside the card; text-only hosts receive
the compact scan response. The HTML resource has no network dependencies or mutations.
This is a developer-connector update, not an automatic official V1 rescan.
Screenshot-led investigation (local implementation; release required)
Attach charts to a vision-capable host and use investigate_screenshots. The host
reads the images; the server receives screenshot_observation.v1 facts through
ground_screenshots. The contract is edgedepth://research/screenshots. No second
image model or automatic attachment access is used.
Grounding is free for every authenticated tier. It checks explicit minute-close
boundaries against recorded Binance futures candles and manifest bounds, retains
visible/inferred/user/missing provenance, and deduplicates exact event views.
Unclear dates, zones, inferred boundaries, conflicting coordinates and overlapping
examples need one clarification. No default date, venue substitution or nearby
move search occurs. Wick tick timing and unsupported drawings are not matched.
investigate_move rechecks the event and reuses the web's five lead-up offsets,
recorded detector evidence and setup-combination builder. It consumes no allowance;
historical snapshots retain their existing entitlement. Optional exact study scope
and target return unrun setup_first_rerun documents, an allowance estimate and an
editable workbench link. The default response omits duplicate source snapshots and detector candle bars,
with full_sources: true restoring the complete bytes. All reading values, exact
setup documents, source metadata, gaps and parity stay inspectable; a free re-read
may see a newer revision. Population counts and forward rates still require the existing
outcome_first or run_scan, after a concrete proposal and explicit human approval.
The exact target stays separate from the setup predicate. Selected winning examples
and same-period reruns remain exploratory; use a separate period before validation.
Replay coverage and entitlement remain independent of research history.
Deploy the web's /api/v1/research/investigate/ground, /investigate and /evidence
routes before releasing these MCP tools. The workbench on web b68c744 loads rq
as an editable proposal and waits for Run. Do not use the new proposal links with older releases that execute on arrival.
Historical-marker and named-collection MCP parity remain separate work. The returned
estimate is for each prepared setup, not a general quote endpoint.
Local deterministic tests exercise extracted observations and authenticated handlers
with fixtures. They are not image-model or vision-host acceptance. Follow the
test/screenshot-host-acceptance.md cases in an actual vision-capable host before
claiming that upload-to-investigation works end to end.
Release 0.8.0
Adds explicit screenshot grounding and move investigation, with compact source
projection by default and full_sources: true when the complete evidence is needed.
The host reads the images; the MCP validates structured observations and exact
recorded coordinates. Ambiguity requests clarification rather than inventing a move.
Saved scans, cohorts, comparisons and outcome-first studies remain readable when
allowance is exhausted. The web uses dedicated engine cache-read routes; a missing
result cannot start a new computation. A cache is revision-bound and may be evicted,
so this is not a promise of permanent result storage. General replay access depends
on the recorded date, market and plan; research links do not confer an event grant.
Host preparation and compact reports (local; release required)
prepare_study accepts scope (symbols, offset-qualified from/to, provenance),
setup (field/operator/value/provenance) and outcome (reached/finished, direction,
fractional magnitude, horizon, provenance). Source metadata stays separate from
the hashed query. Screenshot anchors must be visible or user supplied; uncertain
times need clarification. Retrieve EdgeDepth readings with snapshot_at first.
Qualitative rules remain model_assumed until the person approves the proposal.
The server validates host claims, but cannot verify what the host actually saw.
get_report defaults to a stated, fixed 1h overview with source counts and stored
integrity status. It does not claim to revalidate the pin. full:true restores
complete stored bytes, including all outcomes and definitions. This selection
is not a saved requested measurement. Public report reads remain free.
Deploy web before MCP. No production latency or vision-host acceptance is
implied by local deterministic tests.
Research journey continuity (local, release required)
Deploy web /api/v1/research/scope before this MCP build. resolve_scope uses
recorded sector tags and the same resolver as the web move-first door, filtered
to confirmed Binance crypto linear perpetuals. It returns the exact roster and
per-market history; missing/ambiguous/thin/oversized populations stay blocked.
There is no automatic widening. Membership is current recorded classification,
not point-in-time membership, and history does not prove feature completeness.
run_scan.measure now adds selected_outcome.v1 alongside canonical bytes,
including the exact selected full-population count, opposite direction and
unconditional reference. Zero counts remain visible, zero denominators have no
rate, and unavailable metrics or rungs are never substituted. The inline view leads with that same reading and opens its horizon and move
controls on the exact measurement. Its histogram always labels closing returns;
the path ladder separately labels MFE/MAE touches. Existing reports keep their fixed, stated overview.
Similarity is exploratory proximity on stated dimensions. Monitoring requires
exact satisfaction of a versioned supported predicate, not identical historical
numbers. A discovered threshold must be labelled proposed, frozen before a
separate-period evaluation, and any tuning disclosed. No similarity-to-alert
conversion, trading-rule evaluator or automated forward-test readiness verdict
is added. Saving and monitoring use the private web handoff and explicit
confirmation. An alert reports condition satisfaction, not a repeat prediction.
Optional trade-rule test (0.9.0, hosted release pending)
Use run_trade_test only after a separate explicit proposal and human approval.
It wraps the exact record population in trade_query.v1 with all trade_rules.v1
parameters and string-valued source_measurement provenance. Default proposals:
1% stop, no fixed target, 2% close-ratcheted trail, 240 minute bars, 6 basis points
fee and 10 basis points slippage per side, skipping same-market signals until
exit. Choose long/short explicitly. These are editable assumptions, not optimal
parameters. Limits are 31 days, 100 explicit markets and 5,000 signals.
Entry is the next minute open. Gap stops fill at the worse open, and stop wins
if stop and target occur in one bar. Trails update from completed closes and
apply from the next bar. Missing opens/price bars are unavailable; no prior-close
substitution. Bucket ends are interval labels, not exact fill timestamps.
Read wins, losses, average win/loss and expectancy from the complete trade
summary, never from MFE or page rows. Returns include fees/slippage but omit
funding and other execution costs; they are not fully net or portfolio returns.
Keep the original question, selected_measure JSON, measurement version, query
hash, dataset revision and source investigation in source_measurement. Web saves
and downloads retain the result. Alerts remain separate setup recurrences.
Backend and web releases must precede the MCP. Old periods without an open
column return TRADE_OPENS_UNAVAILABLE without computation or debit. New schema
rows can still be missing and are counted individually. No npm/registry
publication is authorized by the hosted release.
Trade results default to the complete summary and first ten chronological journal
examples. full_trades:true restores all canonical bytes. Projection-specific ETags
prevent revalidation across these display modes; neither mode changes the rules,
complete-result counts, reproducibility key or computation charge.
Stored investigation evidence (local, pending release)
get_investigation_bundle reads an existing SHA256 bundle ID through the same
API as the web. Compact output retains exact event/as-of bounds, source receipts,
metrics, deterministic observations, contradictory evidence and missing analyses;
full: true restores pinned input observations. No model, scan, allowance debit
or publication occurs. Missing comparable populations stay unavailable and use
the existing exact-study approval flow when requested. Backend and web readers
and explicitly reviewed artifacts must be provisioned before this tool can read
a bundle; this change does not enable a publishing job.
Single-venue Hyperliquid research (2026-09-15, local)
The first cross-venue replication slice adds exchange=hl to API v1 universe
reads and exchange: "hl" to MCP list_instruments. Omission remains Binance.
Exact record documents select HL with ["identity.exchange", "eq", "hl"] and
recorded lowercase IDs such as btc. Only one venue is permitted per document;
run paired definitions separately over verified overlapping feature coverage.
Binance canonical hashes, default scope and result bytes remain unchanged.
Daily/consolidated reads, query/baseline/cohort/prevalence/stratified/trade wrappers,
page setup hydration and revision checks follow the selected venue. Missing
features stay absent. HL metadata not established by manifests stays unknown.
HL live monitoring and replay/workbench handoffs are unavailable in this slice.
Outcome-first, snapshot, prose preparation, named scopes and UI venue selection
remain separate gates; do not infer HL support there from record validation.
Delivery order is backend, web API/validator, then MCP. No source extraction,
dataset promotion, capture change or production release occurred. Local BTC
September 12 proof and continuation owner are in the task hub's canonical
tasks/research-cross-venue-replication.md and outputs/cross-venue-20260915/.
run_scan, run_cohort and run_stratified share a network-free widget. Carry
prepare_study.summary verbatim in optional study_summary, outside the exact
query document. Older callers receive a faithful clause-and-scope heading. The
headline retains the stated outcome, occurrence count and symbols scanned.
Optional measure sets kind, direction, magnitude and horizon. Without it, the
widget starts at 24h when available and chooses the largest closing-return rung
above 1% with at least 30 occurrences in either direction. If none qualifies,
it shows the distribution and asks the reader to select a move. This display
choice is not evidence of significance. All controls read completed result bytes.
A result-at-a-glance section leads with a plain-language sentence using the
exact selected outcome's count, observed denominator and rate. It reports
missing outcomes, an exact reference comparison in percentage points when
available, and why a comparison is unavailable otherwise. Touch outcomes keep
the warning that both directions can occur and their ordering is unknown; this
is descriptive evidence, not a success or confidence score. Without a stated
outcome, the summary shows both closing directions and labels the view exploratory.
Changing the horizon or move labels the summary as exploration. Return to stated
outcome restores those two controls without a request. Stratified summaries name
the viewed group. Both directions, exact reference counts and lift remain in an
expandable breakdown; the histogram and path ladder remain visible. Wording is
deterministic from completed counts, with no new model call or engine computation.
The histogram retains all recorded buckets. Hover, focus or tap highlights one
band in mint and keeps its exact counts/rates in the readout below the chart.
The chart is one Tab stop; Left/Right step through bands and Home/End reach the
tails. Selection also works for empty bands and makes no request. All counts
remain in the expandable table. An aligned reference is overlaid; the compact
MFE/MAE ladder uses the same horizon. Missing references show their reason; lift
is shown only with both exact rates and a nonzero reference rate. Cohorts label
the predicate-false comparison accurately; stratified views retain all three
groups, including missing split readings, without inventing a reference.
Rejected documents display their HTTP state, codes and messages separately from
hosts that omit chart evidence. No engine, research_query.v2, canonical bytes,
projection, authentication or billing behavior changes. Release and actual
Claude-host acceptance remain pending James's go.
Compact scan text (local, release required)
Default run_scan text leads with the agreed outcome, both directions, counted
population and limitations. It shows the exact agreed outcome and opposite direction (exploratory rungs at
24h when unspecified), keeping all horizons' present/absent counts. The top three
matching markets and one example row remain (rows requests more); neither is the denominator.
Long reference-scope rosters also carry a labelled receipt. Long string in
lists become explicitly non-executable query_preview receipts:
count, SHA256 of UTF-8 JSON of the sorted list (duplicates retained), and the first
five sorted values. Repeated row evidence references the same list hash. Example
outcomes keep the displayed horizon, including its bucket-presence counts. UTC
daily match counts become monthly sums with first/last matching day and the peak
day (earliest tie). Match dates are not an effective feature-availability window;
this response does not contain predicate first-data dates.
Exact workbench URLs longer than 2,000 characters are explicitly omitted in compact
text. No hash-only URL or persistent definition lookup is promised. The original
approved tool input remains exact; full_counts: true restores the canonical
result, full definition, daily counts and complete handoff. full_outcomes: true
restores the detailed outcome view. The widget retains complete evidence. No engine
request, canonical hash, metering or baseline budget changes. Text-format and horizon
changes have distinct projection ETags. Cohort, stratified and continuation text
retain their existing projections in this bounded follow-up.
Saved interpretation of a move (2026-10-03, local)
get_investigation_assessment({id, edition?}) reads the existing released assessment
used by investigation pages and channel drafts. The publication id comes from a
/research/investigate/publication/<id> link. This is distinct from the SHA256 bundle
id accepted by get_investigation_bundle. The result retains the exact market,
window/as-of, mode, evidence references, gaps, comparison availability and edition.
A pinned edition that changed returns 409; corrected evidence returns 410. Stop and
reopen the publication; never silently apply another edition to the original question.
Private drafts are not exposed. This read uses research:read, spends no study
allowance and does not generate an assessment or call a model. The host may interpret
its evidence, preserving uncertainty; a cited measurement is not proof of causality.
Deploy the web /api/v1/research/investigation-assessment reader before this tool.