Documentation / Ship / Evaluation release contract
Release and prove the evaluation contract¶
VAANI 1.0.0rc32 is the published private release containing the LiveKit text
evaluation contract merged in #109. Its authenticated publication, clean
private-registry install, and credentialed synthetic LiveKit text attempt are
recorded in
rc32-evaluation-release.json.
The deterministic local gate remains separate and does not certify those
operational observations by itself.
vaani-evals remains a separately packaged consumer and VAANI has no dependency
on it. The supported production-distribution seam is deliberately bounded to
run_livekit_worker(..., evaluation_evidence=True), server-authored job
metadata, the two text topics, and the finalized evidence wire record described
in Results and evidence.
Authorization and correlation¶
Only a trusted dispatch backend may author
job.metadata.vaani_evaluation_evidence. It binds an opaque correlation ID to
the evaluator's consumer_identity. VAANI accepts text and end control only
from that identity after it becomes the PrimaryParticipant, and publishes
evidence only to the same identity. The evaluator should allocate exactly one
disposable consumer per attempt: its first valid correlated record is terminal,
and later replay is rejected.
Local and remote workers use the same topics and payloads:
vaani.evaluation.text.v1carries one participant utterance per LiveKit text stream;vaani.control.v1accepts only the exact graceful-end document;vaani.evaluation.evidence.v1returns chunk envelopes followed by a commit.
The receiver must verify the envelope schema, bounds, expiry, record digest,
canonical CallResult digest, and expected correlation ID before accepting the
record. Room data with a participant sender identity is not server-authored
evidence and must be rejected.
Timeout, redaction, and failure semantics¶
The existing result_publication_seconds deadline bounds serialization and
LiveKit delivery after Closure. Its absolute UTC expiry is repeated in every
chunk and commit. A receiver accepts a commit only before that expiry; a timeout
or missing commit leaves no accepted record and cannot change the sealed
CallResult.
The record contains the configured transcript capture, normalized tool and lifecycle evidence, timing and usage ledgers, and the finalized Judge report. It never contains credentials or bot-private objects. Errors expose normalized, redacted provider diagnostics, not raw provider exceptions or payloads. Tool arguments/results and consumer Judge evidence remain subject to the bot's explicit audit and evidence allow-lists.
Treat a room connection, dispatch, authorization, expiry, packet, or evidence delivery problem as an infrastructure failure. Treat a successfully received finalized result that violates the scenario expectation as a product failure. Do not turn absence of evidence into a product verdict, and do not turn a failed scenario into an infrastructure incident merely because the base call completed.
All evaluation calls and tools must use synthetic, fake, or sandbox data and destinations. Production customer data and production side effects are outside this contract.
Deterministic clean-wheel gate¶
From a clean checkout, build rc32 and run the disposable consumer against the built wheel:
uv build --wheel --sdist --out-dir /tmp/vaani-rc32-dist .
python scripts/evaluation_release.py deterministic-proof \
--wheel /tmp/vaani-rc32-dist/vaani-1.0.0rc32-py3-none-any.whl \
--source-commit "$(git rev-parse HEAD)" \
--output /tmp/vaani-rc32-deterministic-proof.json
python scripts/evaluation_release.py check \
--evidence /tmp/vaani-rc32-deterministic-proof.json \
--expected-version 1.0.0rc32
The gate installs the wheel bytes non-editably with no local-path dependency,
removes PYTHONPATH, imports VAANI only from the isolated install target, and
runs the real worker, Assistant, tool, lifecycle, finalization, and LiveKit text
bridge. LiveKit service and provider boundaries are deterministic fakes. The
proof therefore does not certify private publication, registry authentication,
provider credentials, or a hosted LiveKit room.
The wheel file is the artifact under test; it is not an editable or local-path
dependency declared by the installed environment.
The deterministic scenario requires participant and agent transcript items, a
returned synthetic lookup_ticket tool, a CLOSED lifecycle, timing events,
observed usage entries, and the complete Judge report. The bundled basic profile
does not configure a Judge, so its honest finalized status is NOT_CONFIGURED;
an operational scenario may configure a Judge and must record the status it
actually receives.
Credentialed operational gates¶
To reproduce or supersede the recorded operational proof, copy
rc32-evaluation-release.template.json
outside the source tree and replace every placeholder from direct observations:
- Record the immutable source commit, uploaded wheel and sdist filenames, and SHA-256 digests. Download them again from the authenticated private registry and verify the bytes.
- In a new environment, install the exact registry artifact without editable or local-path dependencies. Record installed distribution metadata and archive provenance.
- Dispatch one synthetic credentialed LiveKit text attempt, receive the
finalized evidence as the bound identity, and retain the full correlated
record plus the Base64-encoded exact canonical
CallResultbytes. Use only fake/sandbox tools. - Change all three operational gate states to
passed, setcredentialed_livekit_servicetotrue, remove the template notice, and validate the completed file:
python scripts/evaluation_release.py check \
--evidence /secure/evidence/rc32-evaluation-release.json \
--expected-version 1.0.0rc32 \
--require-operational
The checked-in rc32 record passes that command. Any future version or attempt must repeat the gates from direct evidence; never relabel the deterministic proof or a historical call as current credentialed evidence.