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.
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);