Etch

Security

Etch is a signed audit chain for AI agent decisions. This page names the security properties Etch does guarantee, the properties Etch does not guarantee, the adversarial tests that prove the guarantees hold, the conformance vectors any independent implementation can verify against, and the coordinated-disclosure channel. Kept on one URL so a buyer-side security team or regulator can walk the whole posture in one pass.

What Etch guarantees, and what Etch does not

Etch is a stay-pure notary. It proves what happened. It does not decide what should happen next. Every guarantee below is a detection property, not a prevention property.

Threat model

Etch's threat model assumes an insider adversary: the operator themselves may be malicious, may hold the classical Ed25519 signing key, may modify storage on disk, and may serve different history to different clients (split-view). The threat model assumes the adversary cannot forge SLH-DSA signatures without the SLH-DSA private key (envelope-encrypted in KMS, separate custody from Ed25519), cannot recompute SHA-256 collisions on demand, and cannot access previously-observed client pinned heads.

Full threat-model write-up with per-attack property + defense citations lives in the open-source repository at docs/adversarial_analysis.md. Every claim in that doc is locked by a green test in the same repository under tests/test_adversarial.py.

Adversarial benchmark

Two layered adversarial suites lock the threat-model claims to green tests.

Conformance vectors

The Portable Agent Identity v1.0 specification (Zenodo DOI 10.5281/zenodo.22154537, CC-BY-4.0) ships with 9 published conformance vectors under spec/portable-agent-identity/vectors/ in the hosted-service repository. Any independent implementation can prove conformance by parsing every valid vector and rejecting every invalid vector with the reason named in the sibling .meta.json file.

Vector files: spec/portable-agent-identity/vectors. Specification: spec/portable-agent-identity/v1.0.md.

Row-quality report (G3)

Track B v1.1.1 shipped a G3 row-quality report: every verifier run reports the fraction of rows in the chain that carry a weight-bearing field (a field the record's later behavior depends on, not a purely descriptive tag). The report is per-project, computed at verify time from the chain manifest, and surfaced on the auditor-preview page an operator mints for their auditor.

Semantics: ratio = weight_bearing_rows / total_rows. A row is weight-bearing when its stored fields would change a verifier's replay outcome; a row is not weight-bearing when it only decorates the record. The ratio is not a pass/fail metric; it is a legibility metric an auditor uses to decide whether the chain carries enough substance to reconstruct decisions or is mostly descriptive noise. The report freezes to a specific spec version so a chain that verifies today verifies the same way against the same report next year.

Post-quantum stance

Ed25519 will eventually be broken by a sufficiently large quantum computer running Shor's algorithm. Every closed epoch Etch signs today carries a hybrid signature envelope: Ed25519 (classical, fast) alongside SLH-DSA-SHA2-128f (FIPS 205, stateless hash-based, post-quantum). For any epoch signed today, the signature envelope remains valid evidence in a post-quantum world; an adversary who develops quantum capability and steals the operator's Ed25519 key still cannot forge a past head, because the SLH-DSA signature over the same payload would need to be forged too.

This is the "harvest now, decrypt later" defense applied to signatures: sign now with both algorithms, and the historical record survives even if one algorithm is broken later.

Coordinated disclosure

Suspected vulnerabilities: contact channel + PGP fingerprint at /.well-known/security.txt (RFC 9116). Please do not open a public GitHub issue for a vulnerability. Sensitive reports get a private-response acknowledgment within one business day; the policy line and canonical URLs are documented in the same security.txt file. Etch operates a single-maintainer disclosure channel today; scope grows when the team grows.

What Etch is not

Etch does not gate agent actions, sit in the request path, or decide what an agent should do next. Runtime control planes, policy engines, and gateways exist for that. Etch's job is to prove after the fact what did happen, in a form an external auditor, regulator, or insurer can verify without cooperation from the operator.

"We prove, we do not block."