Launch documentation

Docs

One claim. Your sources. A private, verifiable jury record.

Overview

A Thrice check asks a jury of AI models to assess one exact claim against the source excerpts you submit. It records an evidence-bound answer, not a guarantee of truth or independent source authentication.

  1. Paste a claim and sources. Supply the exact wording, source titles, HTTPS URLs and verbatim excerpts.
  2. Encrypt in your browser. The browser verifies intake attestation before sealing the package to its encryption key.
  3. Pay from $0.10 USDG. Inspect the actual quote, save your recovery file and confirm payment.
  4. Wait for three AI jurors. Each runs through attested secure hardware and confidential inference.
  5. Read your private verdict. Your device decrypts the answer and checks it against the on-chain answer hash.

The paid protocol is enabled by the live deployment configuration. The separate invitation research form is labeled unattested research; its results and privacy guarantees differ from the encrypted paid flow.

Using the Check page

Open Check a claim and use the confidential paid review. If deployment configuration is pending, payment is unavailable. Write one testable statement with its date, scope and relevant qualifications.

Claim and source fields

Provide 1–5 sources. Each needs a title, an HTTPS URL without embedded credentials, and a nonempty exact excerpt. URLs are metadata: this flow does not fetch them. Keep excerpts verbatim and include nearby context.

Claim
Up to 4,000 UTF-8 bytes.
Source title and URL
Up to 2,048 UTF-8 bytes each.
Each excerpt
Up to 18,000 UTF-8 bytes.
All excerpts
Up to 64,000 UTF-8 bytes combined.
Complete package
Up to 80,000 UTF-8 bytes, including the SDK's field framing and metadata.

Bytes are not characters: non-ASCII text can use multiple bytes per character. The browser also caps the claim and metadata fields by character count; byte validation governs submission.

Wallet and payment

Connect an Ethereum-compatible browser wallet on Robinhood Chain, chain ID 4663. Pay in USDG and keep ETH for separate network gas. Preparation uploads encrypted content and produces a quote; it does not collect payment.

The Check page reads the quote from the escrow contract. Quotes expire after five minutes and are rechecked before payment. Approve the exact USDG allowance, then confirm the query transaction; an existing nonzero allowance may need a reset first.

Save the recovery file

Download the private recovery file before paying. It contains the query ID, deployment identifiers, salt and result decryption key. Keep it private and backed up: someone with the file can decrypt your result. The page keeps secrets in memory and the downloaded file, so closing it without a backup can lose access.

Use Resume from private recovery file to read the file locally and resume waiting. The file is not uploaded. Recovered queries cannot be paid again. After an interrupted submission, check the saved query ID rather than making another payment.

Waiting and reading the result

Timing depends on wallet confirmation, the network and inference retries. The internal 60-claim evaluation recorded a 22-second median for the launch panel; that is an evaluation measurement, not a production latency promise. The Check page polls for up to 180 seconds per wait attempt. An unresolved wait can be resumed and does not mean the paid query has expired.

A verified result displays a verdict label and confirmation that the private answer matched the chain hash. HUNG displays no claim outcome. The current paid page shows the verified label; developers can decrypt the full private result through the SDK to inspect its answer and field-level agreement. Do not mistake the research form's per-juror findings or share links for a paid protocol receipt.

Verdicts and the launch jury

Supported

The submitted evidence supports the exact claim.

Contradicted

The submitted evidence conflicts with the exact claim.

Insufficient evidence

The submitted material does not establish the claim or its opposite.

Missing context

Omitted qualifications or context materially change the interpretation.

The exact SDK values are supported, contradicted, insufficient_evidence and missing_context.

The launch jury is Qwen 3.6, Gemma 4 and GPT-OSS 120B. All three must return valid, matching answers. Two agreeing jurors are insufficient. Disagreement, missing responses or invalid evidence can produce HUNG: no outcome is presented.

Jurors must quote evidence verbatim for every answer, including insufficient evidence. Quotes are checked against the submitted document. An exact quote establishes that the passage was present; it does not establish that the source is authentic or the inference correct.

Fees and refunds

The short N3 tier starts at $0.10 in USDG before gas: $0.08 in juror fees and a $0.02 protocol fee. Longer evidence packages can raise the quote. The contract calculates each seat's fee from its class base plus a per-input-tier charge; the protocol fee is the greater of its minimum and 20% of juror fees.

On a verdict

Non-timed-out juror seats are paid and the protocol fee is charged. An insufficient-evidence or missing-context verdict is still a completed, chargeable verdict. Governance can reserve a share of the protocol fee for future human panels (the contract default is 25%; with panels off at launch, that share may be set to zero). The remainder goes to staking or a governance-configured review recipient. No reserve setting makes human appeals available at launch.

On HUNG

Responding jurors retain their fees. The protocol fee and timed-out seats' fees are refunded. For the short $0.10 tier with all three jurors responding but disagreeing, $0.08 is charged and $0.02 is refunded.

Unanswered checks and expiry

An OPEN or SEALED paid query can be expired after its one-hour deadline by calling QueryEscrow.expire(queryId) on chain. This refunds the remaining escrow to the recorded refund recipient. It requires an expiry transaction: the passage of time alone does not move funds. The orchestrator can submit that transaction while operating, but this is not a guaranteed automatic refund.

HUNG has already been settled and is not eligible for that OPEN/SEALED expiry path. The paid flow has no cancellation refund after opening. Network gas is separate and is not refunded by the escrow.

Privacy and trust model

The launch protocol uses Intel TDX confidential VMs through Phala dstack. Before upload, the browser checks a remote-attestation quote and binds the intake encryption key to the configured identity and pinned measurement. Juror and consensus identities are also governed by on-chain registration and attestation policy. The launch intake, juror and consensus services share one confidential VM; separate keys and model families do not imply separate hardware or operators.

Each juror uses attested confidential inference through Phala ACI. Verification binds the requested model, workload and request/response receipts; plain external API output is not a substitute for that verification.

Plaintext is processed inside the approved intake, juror, consensus and inference workloads. Under the TEE assumptions, infrastructure operators outside those workloads cannot read that plaintext. They can still observe request timing, sizes, public wallet transactions and operational metadata, and can affect availability.

Persistent private content is sealed ciphertext; chain and database records contain hashes, commitments, signatures and public protocol metadata, not the private claim or plaintext answer. The result is encrypted to your locally held key. This is content confidentiality, not transaction anonymity.

Production timing telemetry is content-free: query identifiers, model identifiers, elapsed time and bounded status/error codes. It excludes claims, source excerpts, prompts, answers and secrets. Confidentiality depends on the measured software, hardware, attestation collateral, approved measurements and provider verification. A compromised browser or recovery file remains outside that protection.

On-chain protocol

Mainnet contract addresses are published at launch. Read /config.json for the live public configuration, including enabled status, chain, core contract addresses and pinned intake identity. This document does not invent deployment addresses.

QueryEscrow
Quotes, collects USDG, opens and seals queries, pays jurors, settles results and refunds eligible escrow.
JurorRegistry
Tracks juror keys, operator identities, classes, approved measurements and attestation validity.
Verdicts
Checks authorized consensus and juror signatures; records the verdict, answer hash and evidence commitments.
ReceiptAnchor
Records Merkle roots for signed receipts so a receipt can be checked against an on-chain anchor.
Timelock
Governs configuration changes with a launch delay of 60 seconds. Governance can change the delay; it is not an immutable security window.
Guardian
Can pause new query openings. Settlement and payouts can continue; unpausing requires governance.

The launch jury is initially team-operated. Attestation and signatures make execution inspectable; they do not imply an open or decentralized operator network.

For developers

The TypeScript SDK starts from a configured client with a production quote verifier, the approved intake measurement and the chain deployment (chain: { deployment, publicClient }); preparing, asking and decrypting refuse to run without it. Supply your connected viem wallet; never embed wallet secrets or use mock attestation in production.

This minimal helper prepares a private check without a wallet transaction. The sender is provided by the caller.

import { prepareClaimReview } from "@thrice/sdk";

export async function prepareExample(client, sender) {
  return prepareClaimReview(client, {
    claim: "The release includes offline mode.",
    evidence: [{
      title: "Release notes",
      url: "https://example.com/release-notes",
      excerpt: "The release includes offline mode.",
    }],
    sender,
    n: 3,
    pay: { path: "usdg" },
  });
}

Inspect prepared.prepared.quote and prepared.prepared.tx. Preparation verifies intake, encrypts the package, checks the intake's signed grant, computes the query ID locally and reads the price from QueryEscrow.quote; it sends no wallet transaction. For submission, the exported call is askClaimReview(client, input, wallet). Arrange USDG allowance separately: the SDK's ask helper sends the query transaction, while the Check page manages exact token approval.

Retain the returned secrets ({ salt, resultPrivateKey }) locally. waitForClaimReview(client, queryId, secrets, options?) waits for the verdict and decrypts the private result, accepting the answer only against the on-chain verdict. Its status and agreement metadata are labeled gateway-reported.

Use client.decryptPrivateResult(verdictId, { queryId, salt, resultPrivateKey }) for the private answer and field-level agreement (it reads the verdict from the Verdicts contract, not the gateway), and client.verifyReceipt(verdictId, { checkAnchorOnChain: true }) for signed receipt verification with a configured chain public client.

Truth Layer tools (research preview)

The Truth Layer page publishes how the invitation research pilot answers: the abstention scoreboard (how often the three jurors were not unanimous, so the answer was unresolved), daily canary queries with known answers, and shadow verdicts on disputed prediction markets. These tools use the same unattested research pilot as the research form on the Check page, not the encrypted paid protocol.

verify over HTTP

POST /api/truth/verify on this site, with Authorization: Bearer <invitation token> and a JSON body { "claim": "…", "sourceUrls": ["https://…"], "publish": false }. The claim must be 8–4,000 characters; up to five https source URLs are optional. One call researches and reviews the claim, usually within two minutes, and returns verdict (SUPPORTED, CONTRADICTED, MISSING_CONTEXT, INSUFFICIENT_EVIDENCE or UNRESOLVED), agreement, each juror's findings with cited quotes and source URLs, the sources read, limitations and the deterministic integrityHash, which binds the record's contents and is not a signature. With "publish": true it also returns recordUrl, a public page with the full record (source text blanked).

curl -X POST {origin}/api/truth/verify \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"claim": "Thrice canary test batch 7 contains 12 blue tiles.",
       "sourceUrls": ["{origin}/truth/canary-sheet/v2/"]}'

Errors use JSON { "error": { "code", "message" } }: 401 for a missing or refused token, 400 for an invalid request, 429 when a per-token rate limit or the pilot's daily limit is reached (BUSY includes Retry-After), 503 when the pilot is not configured and 502 when research fails. The claim and URLs are sent to search and AI model services.

MCP

The same check is an MCP tool. Add {origin}/api/truth/mcp as a remote server (Streamable HTTP, JSON responses, no event stream) with the header Authorization: Bearer <invitation token>. It offers verify (arguments claim, optional sourceUrls and publish; the result's structuredContent has the same fields as the HTTP response), scoreboard and canaries.

{
  "mcpServers": {
    "thrice": {
      "type": "http",
      "url": "{origin}/api/truth/mcp",
      "headers": { "Authorization": "Bearer ${API_TOKEN}" }
    }
  }
}

Pre-trade claim gate

The SDK's createClaimGate turns a verdict into a policy hook an agent's rulebook can require: no trade on a news item unless the jury says SUPPORTED. It fails closed: an error, timeout, rate limit, UNRESOLVED, a non-unanimous agreement or too few cited sources all deny the action. The policy sets the verdicts that allow it (default ["SUPPORTED"]), the minimum number of cited sources and, optionally, hosts one cited source must be on, such as the exchange's or issuer's own domain.

import { createClaimGate } from "@thrice/sdk";

const gate = createClaimGate({
  token: process.env.API_TOKEN,
  policy: { allow: ["SUPPORTED"], requireCitedHosts: ["exchange.example"] },
});

// No trade on a news item unless the jury says SUPPORTED.
await gate.guard(
  { claim: "Exchange X lists TOKEN for spot trading as of 5 October 2026.",
    sourceUrls: [newsItem.url] },
  () => placeOrder(),
);

Agents that use MCP can carry the same rule as a line in their instructions: before acting on a news item, call verify on the claim it makes; act only if the verdict is SUPPORTED; otherwise do nothing and report the verdict. A check takes one to two minutes, so gate decisions that can wait, not quotes. Verdicts are evidence-bound research results, not investment advice.

Telegram bot

When the bot is switched on, the Truth Layer page links to it. Reply /verify to a message, or send /verify followed by a claim and up to five https links. The bot replies with a verdict card and publishes the full record only if the person who asked taps Publish full record. Each chat has a daily limit.

Not available at launch

Launch offers a three-model jury only. Human panel escalation, appeals and jury sizes other than three are not available. The contracts and SDK include broader protocol capabilities; their presence in code is not a launch availability promise.

Frequently asked questions

Does Thrice fetch or authenticate my source URLs?

No. In a paid check, URLs are submitted metadata. Jurors review your exact excerpts. You are responsible for source selection, attribution and completeness.

Does unanimous agreement prove the claim?

No. Different model families can share biases and all be wrong. Inspect the source material and the scope of the claim.

Is HUNG the same as insufficient evidence?

No. Insufficient evidence is one of the four chargeable answers when all three valid jurors agree. HUNG means the jury could not produce the required consensus and no answer is shown.

What if I close the page or a wait times out?

Load the private recovery file and resume waiting on the same query. Check whether payment reached the chain before preparing another check. The 180-second browser wait is separate from the one-hour on-chain deadline.

Can the team recover my private key?

The paid page keeps the result key on your device and in your recovery file. There is no operator key-recovery feature. Preserve the file if you need later access.

Is the invitation research form confidential?

It is labeled unattested research and uses a separate external-processing flow. Its integrity hash is not a TEE attestation, on-chain receipt or end-to-end confidentiality proof.

Where can I check deployment details?

Use the live public configuration and the addresses published at launch. Read the whitepaper for the architecture and its trust assumptions.

Glossary

Check / query
A claim and submitted evidence package assessed through the paid protocol.
N3
A jury with three seats; all three must agree at launch.
HUNG
A settled round without the required valid agreement; no claim outcome.
Attestation
Hardware-backed evidence about a workload's measured identity and bound keys.
Pinned measurement
The approved workload measurement the client expects when verifying attestation.
TEE
A trusted execution environment protecting workload memory under hardware and software assumptions.
Answer hash
A cryptographic commitment checked against the decrypted answer; not proof of truth.
Escrow
USDG held by the contract until settlement or eligible expiry.
Receipt
A signed execution record that can be included in an on-chain Merkle-root anchor.
SUBMITTED
User-supplied evidence provenance; no independent fetching or authentication.