Kontour Survey · producer-side trust

Evidence, end to end.

Every "verified" value has a story: where it was observed, what was extracted, what the alternatives were, who reviewed it, and what they decided. Survey is the contract that keeps that story — from raw source to reviewed claim — and projects it into Surface trust reports.

Why producers adopt Survey

The chain stays inspectable

Typed records for sources, extractions, candidates, reviews, proofs, and resolutions — every link from raw material to claim can be re-examined after the fact.

One projection to Surface

buildSurveyTrustBundle turns Survey records into a Surface Trust Bundle. Surface owns claims, evidence, status, and trust reporting from there.

A review workbench you can embed

Framework-neutral UI for ReviewItem queues: current vs proposed values, source evidence, decision controls, and a live Surface preview.

Server-owned apply boundary

Decisions derive from pre-decision snapshots plus persisted events — never browser-computed payloads — with freshness and replay checks built in.

Adversarial rounds on the record

Per-round adversarial-pass records serve as evidence for Flow's route-back gates, so high-stakes review is a measured process, not a vibe.

Boundaries by design

Survey never crawls, parses, ranks, or decides truth. Producers own acquisition and policy; Survey owns the portable record contracts between them and Surface.

The Review Workbench

A example-backed queue rendered by the embeddable workbench: current vs proposed values, source refs and excerpts, decision effect, and the Surface projection preview.

Open the live demo

Survey Review Workbench showing a review queue, current versus proposed values, decision controls, and a Surface preview

One observation, one chain

npm install @kontourai/survey @kontourai/surface
const surveyInput = new SurveyInputBuilder({ source: "example-producer:run-1" })
  .addObservation({
    rawSource:     { kind: "web-page", sourceRef: "https://example.test/listings/123", ... },
    extraction:    { target: "availabilityStatus", value: "AVAILABLE", confidence: 0.92, ... },
    reviewOutcome: { status: "verified", actor: "example-operator", ... },
    claim:         { subjectId: "listing-123", claimType: "public-data.field", ... },
  })
  .build();

const trustBundle = validateTrustBundle(buildSurveyTrustBundle(surveyInput));
const report = buildTrustReport(trustBundle);

Read the record contracts