Skip to content

v1.0.0

Choose a tag to compare

@github-actions github-actions released this 04 Nov 14:38
· 398 commits to main since this release
7934822

First stable release. A real run or incident becomes a verified fixture with attest capture; pull-request CI replays the agent's real code against it with zero model calls and returns pass, fail or not evaluated (with a reason) to a policy gate, in Python and TypeScript. The release candidates added each piece: honest verdicts and install integrity (rc.1), trace checks, behavior contracts and judge budgets (rc.2), capture, replay, world fixtures and pull-request annotations (rc.3), agent-facing CLI, MCP server and mutation testing (rc.4), TypeScript parity, framework capture through OpenTelemetry and the offline failure viewer (rc.5). The refund-desk demo walks the whole workflow with make walkthrough. Changes since rc.5:

Changed

  • Install instructions in the README, the Python SDK README (the PyPI page), the guides and the attest skill's migration reference use attest-ai>=1.0.0 and @attest-ai/core@>=1.0.0 / @attest-ai/vitest@>=1.0.0 (with vitest@^4) instead of the release-candidate floors; with 1.0.0 published, a bare install resolves to it. The annotations guide's example pins pr-annotate@v1.0.0. @attest-ai/vitest declares the peer @attest-ai/core >=1.0.0 (was >=1.0.0-rc), so it no longer installs next to a release-candidate core with a different engine version. The PyPI classifier is Development Status :: 5 - Production/Stable.

Fixed

  • attest capture never reports a false green. A capture exits 1 (not verified, naming every cause that holds) when a drafted contract failed, the trace check failed, --expect-fail drafted nothing, or nothing was drafted while the command exited non-zero or a replay-capable capture recorded no model call. Before, a command that exited non-zero with no reachable model printed verified: every drafted contract passes with zero drafted contracts and exited 0. A non-zero exit whose drafted contracts all pass still verifies (exit 0, the code recorded). attest trace check warns on a not-verified fixture with the same causes.
  • A healthy run with nothing to draft a contract from (no tool call, structured output or cost) has the new outcome nothing_to_verify: the fixture is written with verified: false, attest capture exits 0 and prints captured: nothing to verify (no tool call, structured output or cost); replay-only fixture, no test drafted, and no test is drafted. attest capture --json and --result-file gain outcome (verified | not_verified | nothing_to_verify; proto/attest/v1/cli/capture.schema.json, with valid and invalid fixtures). Python record() and TypeScript record() return verified=False with outcome="nothing_to_verify" instead of raising, and still raise CaptureError for not_verified. The committed judge fixtures were re-recorded and no longer claim verified: true with no contracts.
  • Re-capturing the same scripted run writes the same trace.conversation_id: clock-derived conversation ids (trace.conversation_id, the gen_ai.conversation.id span attribute) are templated to {{conversation_N}}. The capture guide now names what still differs between captures instead of promising identical fixtures: raw span ids in turns[].from_agent (OpenAI Agents), LangChain message and lc_run-- ids in LangSmith strings, and the Claude Code session id in metadata.user_id of the recorded request (Claude Agent SDK), which is part of the replay key's params.

Published components

Component Status
Engine binaries and checksums (this release) published
PyPI attest-ai==1.0.0 published
npm @attest-ai/core@1.0.0 published
npm @attest-ai/vitest@1.0.0 published
Website sync dispatched (release-sync to attest-framework/attest-framework.github.io)