Developers New to Kontour? Start with Flow Agents.

v2.13.1npm install -D @kontourai/surface

Surface

make every claim show its evidence, freshness, and gaps

An agent tells your support team a listing is current. A dashboard says the scan passed. Neither one shows when it was last checked, what checked it, or what it couldn't see. Surface is the receipt underneath — the claim, the evidence, when the check runs out, and what's still missing — in an open file anyone can re-check without trusting the tool that produced it.

surface report — summary

$ npx surface report \

    --input node_modules/@kontourai/surface/examples/surface-example-bundle.json \

    --format summary


Kontour Surface report surface-1785016678537

Source: kontour-surface-validation-examples


Claims: 4  (unknown: 1, verified: 2, stale: 1)

Facets: repo-governance.developer-evidence: 1, field-attested-records.public-data: 1,

          fact-resolution.financial-facts: 1, surface.roadmap: 1


High-impact unsupported: none

Stale:    claim.field-attested-records.registration-status

Recompute needed: none

Disputed: none

Claim groups: 0

Transparency gaps: 3

Your first five minutes

Two commands, no account, no config file.

  1. 01

    npm install -D @kontourai/surface

    The example bundles used below ship inside the package. Nothing else to download.

  2. 02

    npx surface report --input node_modules/@kontourai/surface/examples/surface-example-bundle.json --format summary

    Read someone else's receipt. That's the output in the terminal above: four claims, one of them stale, three transparency gaps, and the id of the stale claim so you know which one to chase.

  3. 03

    npx surface console --input …/ci-producer.bundle.json --input …/review-producer.bundle.json --input …/security-producer.bundle.json

    Merge three teams' results into one page. The console prints one line — the address. Open it and you get exactly what's below.

surface console

$ npx surface console \

    --input node_modules/@kontourai/surface/examples/console-multi-producer/ci-producer.bundle.json \

    --input node_modules/@kontourai/surface/examples/console-multi-producer/review-producer.bundle.json \

    --input node_modules/@kontourai/surface/examples/console-multi-producer/security-producer.bundle.json


Surface console running at http://localhost:4242

See it

Three teams reported on the same release. Two of them disagree.

Surface Console merging three producer bundles into one view: five claims, three verified, two needing attention, and a merge collision on the release artifact digest attributed to the colliding producers
CI, code review, and the security scanner each filed what they found; the console merged them into one page. Look at the amber band first: CI and the security scanner reported different content for the same claim — the release artifact's sha256 digest — and Surface names the record it set aside instead of silently dropping it. Two of the five claims have never been checked at all. This is the example that ships in the package; the command above reproduces it.

What Surface answers

The trust questions behind any product answer.

01What does this product claim?
02What evidence supports the claim, and where does it come from?
03Is the verification still current?
04What's missing, stale, or in conflict — and what should happen before anyone acts on it?

Surface Console

See trust state where the work happens.

surface console serves a live view from.surface/runs/latest.json, and each new run updates it. It can also merge multiple producer bundles — repeat --input, as above — into one view, attributing every claim to the producer that filed it and reporting merge collisions instead of dropping them. It runs on your machine: no cloud, no account, nothing to host.

Run history
Switch between past runs in the toolbar to compare claim state before and after a change.
Trust Panel
See the customer-facing view of any claim alongside your full operator context.
Filtered chips
Filter verified claims, claims needing attention, or the whole list while you work through it.
Claim groups
Start from a framework, checklist, or requirement set, then drill into the claims and evidence that decide its status.
Integrity scope
Inspect the source anchor and cryptographic fingerprints behind a verified claim.
Claim detail
Select any claim to inspect its full evidence, status, and gaps without leaving the list.
Transparency gaps
When evidence is missing, private, stale, or conflicting, the gap stays visible beside the claim.

Example use case

A support agent says: "This provider directory listing is current."

The sentence doesn't change. What changes is that the person reading it — or the agent about to act on it — can see where it came from, when it was last checked, how long that check is good for, and the part nobody outside the registry can see. Surface keeps those four things attached to the claim, in a file the reader can open themselves.

claim.provider-directory.current

Source
Registry export, row 1842
Last checked
7 June 2026
Good until
Recheck due in 7 days
Gap
The phone number attestation is private

What's in a receipt

Four words, and you can read any receipt.

A claim is one specific statement — "the registration status on this listing is current." Evidence is what backs it: a test result, a source excerpt, a person signing off. A policy says what would have to be true for that claim to count as checked, and how long the check stays good. A gap is anything the receipt can't show you — evidence that's missing, private, expired, or contradicted. Surface's job is to keep the gap as visible as the claim.

Every claim carries a status derived from those four things. The one worth learning first isstale — it doesn't mean wrong. It means this was checked, the check was good for a set window, and the window has closed. Nobody has to remember that; the status changes on its own. The full vocabulary and all nine statuses →

Signing

You don't have to sign anything to start.

A bundle you generate on your laptop re-derives to the same answer on anyone else's machine. What it doesn't do is prove who produced it — that's L0, unsigned and local, and it's where everyone starts. When provenance starts to matter, CI can sign its own results with a short-lived identity it gets from the CI provider (L1), and an organization can sign with keys it holds itself (L2). Turning the dial up never changes the answer: signing says where a bundle came from, not how it was derived. Surface carries the signing block; the levels themselves are defined in the open spec. How the levels work →

What Surface gives you

Let a customer check the answer

Before someone acts on a recommendation, a report, or an agent's reply, they can open what sits under it: the claim, what backs it, when it was last checked, and what nobody has checked yet.

Write it once, read it everywhere

Your product writes claims and evidence in one shape. People, agents, and other systems all read the same file — you never build a separate trust view for each audience.

One place to work the queue

What has gone stale, what has no evidence behind it, what two producers disagree about. Surface Console opens all of it in a browser on your own machine — no cloud, no account, nothing to host.

Show it to your users

The same trust state, embeddable where your customers already are.

Trust Panel embed

A dependency-free <surface-trust-panel> element drops the customer-facing view of a claim into your own product — the claim, its evidence, freshness, and gaps, without shipping a framework.

Snapshot viewer

Export a derived report and anyone can open it in the hosted viewer — paste or load the JSON; it parses entirely in the browser and never leaves the page.

Open the viewer →

Built with Surface badge

A spec'd badge that links your product to its inspectable trust state — a claim of inspectability that is itself inspectable.

More than a status

What keeps working after day one.

Claims built on other claims

A claim can rest on supporting claims, and its status is capped by the weakest one underneath it. A total cannot read verified while one of its inputs has gone stale or contested.

Asking the source again

A stale claim is not a dead end. Surface ships the verification endpoint a producer stands up at /.well-known/hachure/verify, so anyone holding a claim can ask the system that made it for the current state of exactly the version they are holding. References it does not recognize come back named as unrecognized, never quietly dropped.

Analytics reports

The same report in plain JSON (--format analytics): coverage by producer, the stale queue, the gap rollup — ready to feed a dashboard or an audit export without anyone retyping it.

Agent-queryable (MCP)

Point a coding agent or assistant at npx @kontourai/surface mcp and it can check, before it uses a number, whether that number's evidence is current, missing, or contested. It gets the same answer you would get at the command line, with nothing summarizing it in between.

Waiver validity

When someone signs off on a gap instead of closing it, Surface records who, why, and when — and checks the date. A waiver that has run out stops counting as an approval instead of quietly holding the line green. The approver's name is recorded, not cryptographically verified.

Products built with Surface

Each product keeps its own language — merge readiness, extraction review, gate outcomes — and still writes receipts anyone else's tooling can read. Flow Agents, Veritas, Flow, Survey, Console and Fieldwork all emit their trust records through Surface, so anything built on Kontour reads and writes the open format through one integration point rather than six. Surface is Kontour's implementation of the Hachure open trust format; the spec, its schemas, and the test vectors that define the format are published separately from us, so anyone can write their own implementation and prove it derives the same answers without running any of our code.

Veritas

Merge autonomy for AI-authored code

Turns Repo Standards, evidence checks, boundary crossings, and readiness outcomes into Surface-backed trust state. Veritas users stay in repo-native language while downstream systems can inspect the evidence behind merge readiness.

Explore Veritas →

Your product

Anything that needs product transparency

Public-data records, fact resolution, audit pipelines, fitness tracking, compliance filings, marketplace listings — anywhere a product needs to show the work behind what it asks people and agents to trust.

Build with Surface →

Read the rest