Repository navigation
v1.0.0
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
attestskill's migration reference useattest-ai>=1.0.0and@attest-ai/core@>=1.0.0/@attest-ai/vitest@>=1.0.0(withvitest@^4) instead of the release-candidate floors; with 1.0.0 published, a bare install resolves to it. The annotations guide's example pinspr-annotate@v1.0.0.@attest-ai/vitestdeclares 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 isDevelopment Status :: 5 - Production/Stable.
Fixed
attest capturenever 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-faildrafted 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 printedverified: every drafted contract passeswith zero drafted contracts and exited 0. A non-zero exit whose drafted contracts all pass still verifies (exit 0, the code recorded).attest trace checkwarns 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 withverified: false,attest captureexits 0 and printscaptured: nothing to verify (no tool call, structured output or cost); replay-only fixture, no test drafted, and no test is drafted.attest capture --jsonand--result-filegainoutcome(verified|not_verified|nothing_to_verify;proto/attest/v1/cli/capture.schema.json, with valid and invalid fixtures). Pythonrecord()and TypeScriptrecord()returnverified=Falsewithoutcome="nothing_to_verify"instead of raising, and still raiseCaptureErrorfornot_verified. The committed judge fixtures were re-recorded and no longer claimverified: truewith no contracts. - Re-capturing the same scripted run writes the same
trace.conversation_id: clock-derived conversation ids (trace.conversation_id, thegen_ai.conversation.idspan attribute) are templated to{{conversation_N}}. The capture guide now names what still differs between captures instead of promising identical fixtures: raw span ids inturns[].from_agent(OpenAI Agents), LangChain message andlc_run--ids in LangSmith strings, and the Claude Code session id inmetadata.user_idof 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) |