Changelog
All notable changes to Attest are documented here. Versions follow Semantic Versioning.
v0.7.0 — 2026-02-27
Section titled “v0.7.0 — 2026-02-27”Production Hardening — test coverage, TS CLI, documentation
Features
Section titled “Features”- Go engine test coverage — Integration tests for
evaluate_batch,submit_plugin_result, andshutdownJSON-RPC methods. Coverage for concurrent request handling, schema compiler cache, and trace validation. - TypeScript CLI —
npx attest initscaffolds a vitest-based test project with@attest-ai/coreand@attest-ai/vitestpre-configured. - TypeScript examples — Four ported examples (quickstart, openai-adapter, schema-assertions, content-assertions) in the
attest-examplesrepo. - Documentation site — Updated changelog, configuration reference, migration guide (v0.5 to v0.6), and SDK reference pages covering all v0.5–v0.7 features.
Testing
Section titled “Testing”- Engine: integration tests for all JSON-RPC methods, concurrent request handling, error paths
- Python SDK:
ExpectChain.plugin(),aggregate_latency_under(),all_tools_called()assertion tests - TypeScript SDK: plugin system, continuous eval runner, branded types, discriminated union specs
Upgrade
Section titled “Upgrade”# Pythonuv add attest-ai@latest
# TypeScriptpnpm add @attest-ai/core@latest @attest-ai/vitest@latestv0.6.1 — 2026-02-26
Section titled “v0.6.1 — 2026-02-26”TypeScript Parity — full feature alignment with Python SDK
Features
Section titled “Features”- Discriminated union specs —
Steptype uses akinddiscriminant (llm_call | tool_call | retrieval | agent_call) for exhaustiveswitchhandling without type guards. - Branded types —
TraceId,AssertionId,AgentIdnewtypes prevent string mixing at compile time. - Plugin system (TS) —
PluginRegistryandAttestPlugininterface for registering custom assertion plugins in TypeScript. Matches the Pythonattest.pluginsentry point API. - Continuous eval (TS) —
ContinuousEvalRunner,Sampler, andAlertDispatcherported from Python. Supports sampling strategies and alerting via webhooks. - LangChain.js adapter —
@attest-ai/core/adapters/langchaincaptures traces from LangChain.js agents with automatic callback instrumentation. - TraceAdapter type safety — Adapter
traceFromResponse()return type isTrace(notunknown), enabling end-to-end type inference. - CJS dual output — tsup-based build produces both ESM and CommonJS bundles.
package.jsonexports map resolves the correct format automatically. - Python TraceTree analytics —
TraceTree.summary()returns aggregate metrics (total cost, tokens, latency, agent count, max depth) across the full delegation tree.
Breaking Changes
Section titled “Breaking Changes”- Adapter API rename —
capture()is replaced bytraceFromResponse()on all TypeScript adapters. The old name is removed (no deprecation shim). - CJS consumers — If you previously used a bundler workaround for ESM-only
@attest-ai/core, remove it. The package now ships dual ESM/CJS.
Upgrade
Section titled “Upgrade”pnpm add @attest-ai/core@latest @attest-ai/vitest@latestv0.6.0 — 2026-02-25
Section titled “v0.6.0 — 2026-02-25”Performance — engine-only optimizations
Features
Section titled “Features”- Schema compiler cache — JSON Schema compilation results are cached per-schema hash. Eliminates recompilation on repeated
evaluate_batchcalls with the same schema. - Trace validation optimization — Trace validation short-circuits on first error in non-verbose mode, reducing per-evaluation overhead.
- SQL query optimizations — History store queries use covering indexes for
list_resultsanddrift_query. Batch inserts use prepared statements. - Prepared statement pooling — Frequently-used SQL statements are prepared once and reused across evaluations.
- Result pagination —
list_resultssupportslimit/offsetfor large history stores. - segmentio/encoding — JSON codec switched from
encoding/jsontosegmentio/encoding/jsonfor ~2x faster marshal/unmarshal on evaluation payloads.
- Engine-only release. No SDK changes. Update the engine binary via
ATTEST_ENGINE_PATHor let auto-download fetch the new version.
v0.5.1 — 2026-02-24
Section titled “v0.5.1 — 2026-02-24”Robustness — timeouts, bounded resources, new assertions
Features
Section titled “Features”- Budget tracking —
BudgetTrackerenforces per-evaluation cost limits. SetATTEST_BUDGET_MAX_COSTto cap total spend across judge and embedding assertions. - Concurrent request support — Engine handles multiple
evaluate_batchrequests concurrently with per-request isolation. - Configurable judge cache — Judge response cache size is configurable via
ATTEST_JUDGE_CACHE_MAX_MB(default: 100 MB). Cache eviction uses LRU. - History retention policy —
ATTEST_HISTORY_MAX_ROWSandATTEST_HISTORY_MAX_AGE_DAYScontrol automatic cleanup of old evaluation results. - Engine read timeout —
ATTEST_ENGINE_TIMEOUT(default: 30s) prevents SDK hangs when the engine process stalls. - Bounded continuous eval queue —
ATTEST_CONTINUOUS_QUEUE_SIZE(default: 1000) caps the evaluation queue. Overflow uses backpressure instead of unbounded growth. - ExpectChain.plugin() — Chain custom plugin assertions alongside built-in ones:
expect(result).output_contains("ok").plugin("my_plugin", config). - Simulation mode (TS) —
ATTEST_SIMULATION=1works in the TypeScript SDK, returning deterministic mock results without an engine process.
- Engine read timeout — SDK no longer hangs indefinitely if the engine process crashes or stalls mid-response.
- History store cleanup — Unbounded row growth in SQLite history is now capped by retention policy.
Environment Variables
Section titled “Environment Variables”| Variable | Purpose | Default |
|---|---|---|
ATTEST_BUDGET_MAX_COST | Maximum USD spend per evaluation | unset (unlimited) |
ATTEST_JUDGE_CACHE_MAX_MB | Judge response LRU cache size | 100 |
ATTEST_HISTORY_MAX_ROWS | Maximum rows in history store | 10000 |
ATTEST_HISTORY_MAX_AGE_DAYS | Auto-delete results older than N days | 90 |
ATTEST_ENGINE_TIMEOUT | Engine response timeout (seconds) | 30 |
ATTEST_CONTINUOUS_QUEUE_SIZE | Continuous eval queue capacity | 1000 |
Upgrade
Section titled “Upgrade”# Pythonuv add attest-ai@latest
# TypeScriptpnpm add @attest-ai/core@latestv0.5.0 — 2026-02-23
Section titled “v0.5.0 — 2026-02-23”Correctness & Safety — adapter fixes, engine hardening
Engine Fixes
Section titled “Engine Fixes”- submit_plugin_result — Implement the previously-stubbed
submit_plugin_resultJSON-RPC method. Plugin evaluations now round-trip correctly through the engine. - Trace ID validation — Engine rejects traces with missing or malformed
trace_idfields instead of silently accepting them. - Step type validation — Unknown step types (
kindfield) return a typed error instead of being silently dropped. - Assertion ID uniqueness — Engine enforces unique assertion IDs within a batch. Duplicate IDs return an error.
- Error response codes — All engine errors use spec-compliant JSON-RPC error codes (
-32600to-32603). - Shutdown draining —
shutdownwaits for in-flight evaluations to complete (5s timeout) before exiting.
Adapter Fixes
Section titled “Adapter Fixes”- OpenAI — Tool call arguments are parsed from JSON string to object. Previously,
function.argumentswas passed as a raw string, causing schema assertions on tool args to fail. - Ollama — Empty tool call arrays are normalized to
undefinedinstead of[]. Prevents phantom “0 tool calls” in trace summaries. - Gemini — Token count extraction reads
usage_metadata.total_token_count(was missing, reported as 0). - LangChain — Callback handler implements full
BaseCallbackHandlerprotocol includingignore_chat_modelandignore_retriever. - Anthropic — System prompt is captured as a separate step when present.
TypeScript Fixes
Section titled “TypeScript Fixes”- delegate() —
parent_trace_idis now set correctly on child traces, fixing brokenTraceTreetraversal for multi-agent scenarios.
Testing
Section titled “Testing”- Adapter integration tests — Each adapter has a dedicated test suite verifying trace capture, token counting, and tool call extraction.
Upgrade
Section titled “Upgrade”# Pythonuv add attest-ai@latest
# TypeScriptpnpm add @attest-ai/core@latestv0.4.2 — 2026-02-22
Section titled “v0.4.2 — 2026-02-22”SDK patch release — adapter fixes and async compatibility
- LangChain adapter — Add missing callback protocol attributes (
ignore_agent,ignore_retry,raise_error) required by LangChain’sBaseCallbackHandlerinterface. Handle LangGraphAIMessageandToolMessageoutput formats so traces capture tool-call responses correctly. - expect() DSL — Accept
Tracedirectly in addition toAgentResult. Auto-wraps intoAgentResultfor manual adapter workflows that build traces viaTraceBuilderwithout going through a provider adapter. - Plugin fixture — Run the engine event loop in a background daemon thread with
run_coroutine_threadsafe()bridge. FixesFuture attached to a different looperrors when pytest-asyncio tests (e.g., google-adk) call into the engine from a separate event loop.
Upgrade
Section titled “Upgrade”uv add attest-ai@latest- No engine changes. The Go engine binary remains at v0.4.0.
ENGINE_VERSIONis unchanged; auto-download continues to fetch v0.4.0 binaries.
v0.4.1 — 2026-02-21
Section titled “v0.4.1 — 2026-02-21”SDK patch release — engine auto-download
Features
Section titled “Features”-
Engine auto-download — Both Python and TypeScript SDKs now automatically download the
attest-enginebinary from GitHub Releases on first use. No manual binary setup required afteruv add attest-aiorpnpm add @attest-ai/core. -
SHA256 verification — Downloaded binaries are verified against
checksums-sha256.txtfrom the release. Checksum mismatch aborts the download with a clear error. -
Version-pinned cache — Binaries are cached at
~/.attest/bin/with a.engine-versionmarker. SDK version mismatch triggers automatic re-download. -
Discovery chain — Engine binary resolution follows a predictable order:
ATTEST_ENGINE_PATH env var→ PATH lookup→ ~/.attest/bin/ (shared cache, version-checked)→ ../../bin/ (monorepo dev layout)→ ./bin/ (local)→ auto-download from GitHub Releases→ actionable error message -
Opt-out — Set
ATTEST_ENGINE_NO_DOWNLOAD=1to disable network access. The error message explains alternative installation methods.
- pytest plugin —
pytest.skip()replaced withpytest.fail()when the engine binary is missing. With auto-download in place, silent skipping is no longer appropriate; real errors are now surfaced. - TypeScript VERSION — Corrected from
0.3.0to0.4.1.
- Examples moved — All example projects relocated to
attest-framework/attest-examplesfor independent versioning. A redirect README remains in the main repo.
Install / Upgrade
Section titled “Install / Upgrade”Python
Section titled “Python”uv add attest-aiTypeScript
Section titled “TypeScript”pnpm add @attest-ai/coreEnvironment Variables
Section titled “Environment Variables”| Variable | Purpose | Default |
|---|---|---|
ATTEST_ENGINE_PATH | Absolute path to engine binary — skips all discovery | unset |
ATTEST_ENGINE_NO_DOWNLOAD | 1 / true / yes disables auto-download | unset (enabled) |
v0.4.0 — 2026-02-20
Section titled “v0.4.0 — 2026-02-20”Production & Polish
- Result history with SQLite storage
- Drift detection (σ-based statistical thresholds)
- Continuous eval runner with sampling and alerting
- Plugin system (
attest.pluginsentry point group) - CrewAI adapter (11 adapters total)
- CLI
initandvalidatecommands - MkDocs documentation site
v0.3.0 — 2026-02-20
Section titled “v0.3.0 — 2026-02-20”Simulation & Multi-Agent
- Layers 7-8: simulation runtime, multi-agent testing
- TypeScript SDK (first npm publish:
@attest-ai/core,@attest-ai/vitest) - Framework adapters: LangChain, Google ADK, LlamaIndex
v0.2.0 — 2026-02-19
Section titled “v0.2.0 — 2026-02-19”Semantic & Judge Layers
- Layers 5-6: ONNX local embeddings, LLM-as-judge
- Soft failure support
- OTel adapter
setup-attestGitHub Action
v0.1.0
Section titled “v0.1.0”Foundation
- Layers 1-4: schema validation, cost/performance, trace structure, content validation
- Python SDK with pytest plugin
- 4 provider adapters: OpenAI, Anthropic, Gemini, Ollama
- PyPI + GitHub release