Skip to main content

Scoring

When a tracker runs, it produces a scored result — an evidence-based assessment you can act on.

Run Result
{
"score": 7, // 0-10 integer on every completed run
"score_scale": 10,
"insight": "...", // Where the score stands and what it rests on
"score_adjustment_factors": [
{
"name": "Earnings momentum",
"description": "Whether reported and guided earnings are improving",
"finding": "Acme raised its full-year revenue guidance on strong cloud demand.",
"direction": "+",
"tier": "high",
"events": [
{
"statement": "Acme raised its full-year revenue guidance",
"outlets": ["cnbc.com", "reuters.com"],
"quotes": [
{ "text": "Acme raised its full-year guidance on strong cloud demand", "url": "https://www.reuters.com/...", "domain": "reuters.com", "date": "2026-10-02", "as_of": "2026-10-02T13:05:00Z" },
{ "text": "the company lifted its annual revenue outlook", "url": "https://www.cnbc.com/...", "domain": "cnbc.com", "date": "2026-10-02", "as_of": null }
]
}
]
},
{
"name": "Analyst sentiment",
"description": "How analysts' ratings and targets are moving",
"finding": "Two brokers raised their price targets after the guidance.",
"direction": "+",
"tier": "low",
"events": [ ... ]
},
{
"name": "Rate outlook",
"description": "Whether interest-rate expectations help or hurt the stock",
"finding": "The Fed signalled rates stay higher for longer.",
"direction": "-",
"tier": "low",
"events": [ ... ]
}
]
}

Understanding Scores​

Each tracker run produces a score from 0 to 10 and an insight. The score is computed by a fixed rule from a few factors, so you can check it from the factors shown.

Factors​

On a tracker's first run the agent writes its factor list from your setup alone — the instruction and the score meaning, never the evidence: a few broad, non-overlapping drivers of the answer, each with a name and a one-sentence description. The list is kept for the tracker's life and made again only when you change the instruction or the score meaning.

Facts and events​

Each run searches, then records facts: specific, checkable statements, each backed by quotes — whole sentences from their sources, each with its page, its date and, where the source gives one, the time it is as of (as_of). Every quote is checked against the page it came from before it is recorded, so you can open the link and find the sentence.

Facts persist: a fact found last week is still on record this week. Each run keeps the facts that still hold, revises one when a newer source changes it, retires one that no longer holds, and adds what is new. Every fact is placed under the one factor it fits best, and facts reporting the same development are merged into one event, carrying all the outlets that reported it.

The reading​

Each factor is read as a whole, over all its events: a direction (+ raises the score, - lowers it, or neither) and a tier for how strongly it does — min, low, medium or high. A strong tier needs strong support: a factor resting on a single outlet's report is not read at the top tier.

From factors to score​

The score starts at 5, the midpoint. Factors pointing + move it up and factors pointing - move it down, each by more the higher its tier. Each further factor on the same side adds less than the one before, so a pile of factors cannot push a score to the edge on its own. A run with no evidence scores 5.

In the example above, a high and a low factor raise the score and one low factor lowers it, so it lands at 7.

Only a reported outcome takes a score to 0 or 10: when a well-reported event decides the question, the score goes to that end. An open question whose evidence all points one way stays short of the edge.

Score Stability​

Scores are designed to hold when the underlying situation holds:

  • No new information → the factors' events are unchanged, so every factor keeps its reading and the score holds
  • New information → only the factors whose events changed are read again, and the score moves with them
  • Higher reasoning modes → more research and more independent readings per factor, so less movement from run to run

So the score holds because the same events give the same reading — not because the run copied the last score.

When a run cannot produce a score​

A completed run always carries a score. When the infrastructure fails — none of the data sources could be reached, or the model did not answer — a tracker that already has a score republishes it with its factors and sends no notification. A tracker with no score yet fails the run and its quants are refunded.


What a Score Means​

A score is read against the tracker's score meaning, the target you set when you created it. 10 is the far positive end of that target and 0 the far negative end, unless your score meaning defines the axis differently. 5 means the evidence is balanced, or there is none yet.

Every score from 0 to 10 is its own bucket in the distribution charts.


Receiving Results​

There are several ways to stay informed when your trackers produce new results:

MethodDescription
ConsoleView all results in real-time on your tracker's dashboard. Filter by score and date.
EmailGet an email when a run publishes a different score that crosses your alert threshold. Enable per-tracker in notification settings.
WebhooksReceive a run.completed POST request with the score, score_scale and insight, on the same trigger as email. Great for automating workflows.
API PollingUse GET /api/trackers/{id}/runs to fetch results programmatically. Supports sync mode for instant results.

What triggers a notification​

Every run is visible in the Console and through the API. Notifications are narrower on purpose — a threshold alone would email you nightly about a world that has not moved, because the score persists between runs. Three things must all hold:

  1. The run published something new. A failed run, or one that republished the last score, sends nothing.
  2. The score moved. A run can add events while the number stays put; that is worth reading on the page and not worth an email.
  3. The score crosses your threshold: at or below lower_threshold, or at or above upper_threshold, both on 0–10.

A run that made a new factor list — the first run after you change the instruction or the score meaning — sends no alert, because its score is a fresh reading rather than a move.

Webhook payload​

POST to your webhook URL
{
"event_type": "run.completed",
"event_id": "evt_3f9a1c2b4d5e6f70",
"timestamp": "2026-10-02T14:00:38+00:00",
"tracker": { "tracker_id": "trk_a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d", "name": "Acme Outlook" },
"result": {
"result_id": "res_8b7c6d5e4f3a2b10",
"run_id": "run_9f8e7d6c-5a4b-4c3d-2e1f-0a9b8c7d6e5f",
"score": 7,
"score_scale": 10,
"insight": "...",
"created_at": "2026-10-02T14:00:38+00:00"
},
"user_id": "usr_123",
"delivery_attempt": 1
}

Requests carry X-Quantinal-Event-ID and X-Quantinal-Timestamp headers, and X-Quantinal-Signature when your webhook has a signing secret: sha256= followed by the HMAC-SHA256 of the raw request body. Verify it against the body bytes as received, before parsing them. Fetch the run from the API for its factors.

Setting Up Notifications

In the Console, open a tracker → Settings → Notifications to configure email alerts or webhook URLs. You can also set these via the API using notification_config when creating or updating a tracker.