Integrations

Three native interfaces. Zero new dashboards to learn.

Data teams live in SQL, dbt and CI, not in a vendor console. Every EvalQA capability is reachable from a command line, a stored procedure or a telemetry exporter, and the console exists only for the humans who adjudicate.

Last updated 13 September 2026 · Protocol v9.3

Status, honestly
  • LiveThe qabit adapter and its hosted console are in production use today.
  • PrototypeThe evalqa CLI is the Day-30 deliverable of the 90-day programme; the commands below are its specification, and the Day-60 gate requires it to be running in a design partner’s weekly dbt CI.
  • PrototypeThe EVALQA_RUN stored procedure is specified for the Snowflake wedge and is exercised in the first sprints; the interface below is the contract we are building to.

1. The evalqa Python CLI

Runs the invariant suite from any CI runner against a Snowflake staging branch, a Databricks SQL warehouse or a local sandbox. Exits non-zero when a Sev-1 is confirmed, so a merge can be gated on it. Requires only the scoped runner role; the binary is signed with Sigstore/Cosign and verifies itself before it runs anything.

# .github/workflows/assurance.yml — illustrative
- name: Verify agent SQL against the suite
  run: |
    pip install evalqa
    evalqa verify --cosign             # checks the runner's own signature
    evalqa run --suite finance \
               --branch "${{ github.head_ref }}" \
               --consequence tier-1 \
               --evidence mode-1-local \
               --fail-on sev-1
  env:
    SNOWFLAKE_ROLE: EVALQA_RUNNER
    EVALQA_TOKEN:   ${{ secrets.EVALQA_TOKEN }}   # nonce + notary only; no data

Useful subcommands:

CommandWhat it does
evalqa extractReads dbt manifest.json and INFORMATION_SCHEMA; writes a metadata pack (no table contents) for invariant synthesis.
evalqa synthSynthesises the standard relational invariants from the metadata pack; prints how many were generated and how long it took, so the Day-30 gate is measurable.
evalqa commitHashes the challenge suite and records the commitment with the notary before execution.
evalqa runExecutes with risk-adaptive sequential trials; writes the signed bundle to your stage or bucket.
evalqa adjudicateOpens the console for INDETERMINATE and Sev-1 items; never needed for a clean run.
evalqa verify <sha256>Same check as /verify, from the terminal.

2. The Snowflake native stored procedure

For teams that want nothing outside the Snowflake account: EVALQA_RUN is installed in a schema you own and executes the whole evaluation in your compute. The only outbound calls are the 15-minute nonce and the manifest hash. Details, privileges and an install script are on the Snowflake page.

CALL EVALQA_RUN(
  suite       => 'finance',
  consequence => 'TIER_1',
  evidence    => 'MODE_1_LOCAL',
  nonce       => :nonce
);

3. The qabit OpenTelemetry adapter

qabit is our open-source client: an MIT-licensed OpenTelemetry adapter and the packaging for the evalqa CLI. It streams runtime agent spans — the natural-language prompt hash, the generated SQL hash, tool calls and their parameters, latency — so the agent can be observed in service, not only on the test bench. It is deliberately small: the operating plan sized it as “a tiny OTel/CLI adapter”, not a product.

# pip install qabit
from qabit import instrument
instrument(service="finance-agent", tenant="acme",
           export="hashes")   # "hashes" (default) | "sanitized" (Mode 2, opt-in)

4. The telemetry payload schema (v9.3)

Every assurance event, whether produced by the CLI, the stored procedure or the adapter, conforms to evalqa.schema.json. Required fields are listed; everything is hashes, enums, booleans and counts.

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "EvalQATelemetryPayload_v9_3",
  "required": ["assurance_event_id", "tenant_id", "timestamp", "agent_id",
               "evidence_mode", "evidence_assurance_level",
               "challenge_commitment_sha256", "nonce",
               "invariant_results", "dual_signature"],
  "properties": {
    "evidence_mode":            { "enum": ["MODE_1_LOCAL", "MODE_2_SANITIZED", "MODE_3_HOSTED_VDI"] },
    "evidence_assurance_level": { "enum": ["EAL-1", "EAL-2", "EAL-3", "EAL-4"] },
    "runner_provenance":        { "required": ["build_version", "cosign_verified"] },
    "invariant_results": { "items": { "required": ["invariant_id", "status"],
      "properties": { "status": { "enum": ["PASSED", "VIOLATED", "INDETERMINATE"] },
                      "repeated_trial_count": { "type": "integer" },
                      "failure_frequency":    { "type": "number" } } } },
    "dual_signature": { "required": ["customer_tenant_sig", "evalqa_witness_sig"] }
  }
}

5. Which one to use

You want to…UseEvidence mode
Block a pull request that introduces a Sev-1evalqa CLI in CIMode 1
Keep everything inside the Snowflake account, no CI runner involvedEVALQA_RUN stored procedureMode 1
See what the agent does in production, week to weekqabit adapter → consoleMode 1 (hashes) or Mode 2 (opt-in)
Have an external expert review a regulated schemaConsole inside your VDIMode 3

Book a readiness review → Evidence modes & EALs