Skip to content

TrustBench (Attested Evals)

Copy page

TrustBench runs a benchmark against a Divinci-registered model assistant and signs the result with a platform Ed25519 key. The output is a TrustRun manifest: a JSON document stating what was run, against which model, with which harness, and what came out — signed such that a third party can check it without asking Divinci anything.

The point is the last part. An eval score you publish is a claim; a signed manifest is a claim someone else can independently check. Verification runs offline, against a public key registry, using an MIT-licensed package with no Divinci dependencies — so “trust us” is never part of the chain.

Terminal window
divinci trust benchmarks list # what's available
divinci trust run <benchmark> --model <assistantId>
divinci trust list # your runs

trust run submits the run and polls to completion. Useful flags:

FlagEffect
--model <assistantId>Required. The Divinci assistant tool id under test
--publicPublish to the public registry. Default is private
--no-waitReturn the run id immediately instead of polling
--timeout <seconds>Polling timeout, default 600
--whitelabel <id>Ownership context
--output jsonMachine-readable output

Over the API directly:

Terminal window
curl -X POST https://api.divinci.app/v1/trustbench/runs \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"benchmarkId":"<id>","modelAssistantId":"<assistantId>","visibility":"private"}'
curl https://api.divinci.app/v1/trustbench/runs/$RUN_ID \
-H "Authorization: Bearer $TOKEN"

Two modes, and the difference matters:

Terminal window
divinci trust verify <run-id> # LOCAL — offline, independent
divinci trust verify <run-id> --remote # server-side; works on private runs
divinci trust verify <run-id> --strict # warnings become failures

Local is the default, and it is the one that means something. It fetches the public manifest and outputs, then verifies them offline against the well-known key registry — the same thing an outside party would do. --remote asks Divinci whether Divinci’s own signature is good, which is useful for a private run you own but proves nothing to a sceptic.

The verifier is published as @divinci-ai/trustbench-verifier — MIT, pure TypeScript, no Divinci-internal dependencies, and it runs in browsers, Node, Workers, and Deno.

import { verify } from "@divinci-ai/trustbench-verifier";
const result = await verify(manifest, {
outputs, // optional: raw outputs file → checks results.outputsHash
benchmarkContent, // optional: raw task spec → checks benchmark.contentHash
});
if (!result.verified) console.error(result.errors);

verify() returns a breakdown rather than a bare boolean, and the tri-state fields are the part to read carefully:

FieldMeaning
verifiedOverall pass — true only if every gating check passed
signatureValidThe manifest body was signed by a known platform key
outputsHashMatchestrue / false, or null if you passed no outputs
benchmarkContentHashMatchestrue / false, or null if you passed no spec
signedByThe key id that signed it
errors, warningsDetail; --strict promotes warnings to failures

A v1 manifest (version: "1.0.0") carries a runId, createdAt/completedAt, and five blocks:

BlockHolds
benchmarkWhich benchmark, its contentHash, and the author’s signature
modelThe assistant under test and its provider
harnessWhich harness executed it, and its version
executionHow the run was carried out
resultsScores, plus outputsHash over the outputs file
signatures[]One or more Ed25519 blocks — keyId, publicKey, signature

The signatures array is excluded from the signed body before signing, so a manifest signs everything except its own signatures. Signing is over RFC-8785-style canonical JSON, which is what lets an independent implementation in another language reach byte-identical bytes and check the same signature.

Public artifacts for a published run:

GET /v1/trustbench/public/runs/:id/manifest
GET /v1/trustbench/public/runs/:id/outputs
GET /.well-known/trustbench-keys.json ← the public key registry

Each environment has its own keypairtbp-prod-001 signs production, tbp-staging-001 signs staging — so a staging manifest is deliberately not verifiable against production keys. The registry entry for each carries validFrom, validUntil, and a deprecated flag.

Rotation appends a new key and marks the old one deprecated rather than removing it, so manifests signed under a retired key stay verifiable offline forever. That property is the reason a manifest is worth publishing at all: a citation that expires when a key rotates is not a citation.

  • A verified: true with two nulls is a weak result. It says the manifest is authentic, not that the numbers describe the artifacts in front of you.
  • --remote is not independent verification. It is Divinci checking its own signature. Fine for your own private run; worthless as evidence to a third party.
  • Private runs have no public manifest. The public endpoints will not serve one, so a collaborator cannot verify a run you have not published.
  • The benchmark’s contentHash pins the spec, not the dataset behind it. Verifying it proves the published task spec was the one run.
  • Environments do not cross-verify. Staging keys sign staging manifests only.

Three of the platform benchmarks are the shared adversarial corpus, reported as a severity-weighted attack success rate (lower is better):

SlugIsolates
divinci-redteam-core-v1All 32 probes across seven attack classes
divinci-redteam-rag-injection-v1Indirect injection via retrieved content only
divinci-redteam-prompt-leak-v1System-prompt extraction, fully canary-graded

To probe your deployed release (your prompt, your moderation, your RAG) rather than a registered model assistant, use the workspace Red Teaming surface. Same probes, different leak detector — your real prompt instead of a planted canary.

  • Red Teaming — the same corpus, run against a deployed release
  • QA Suites — Divinci’s internal scoring and regression harness, which is a different tool: QA is for your iteration loop, TrustBench is for claims you publish
  • Arena — A/B comparison between variants