22
33[ ![ CI] ( https://github.com/airlock-protocol/airlock/actions/workflows/ci.yml/badge.svg )] ( https://github.com/airlock-protocol/airlock/actions/workflows/ci.yml )
44[ ![ Python 3.11+] ( https://img.shields.io/badge/python-3.11%2B-blue.svg )] ( https://www.python.org/downloads/ )
5- [ ![ License: Apache 2.0 ] ( https://img.shields.io/badge/License-Apache_2.0- blue.svg )] ( https://opensource.org/licenses/Apache-2.0 )
5+ [ ![ License] ( https://img.shields.io/badge/License-Multi--License- blue.svg )] ( #license )
66[ ![ PyPI version] ( https://img.shields.io/pypi/v/airlock-protocol.svg )] ( https://pypi.org/project/airlock-protocol/ )
77[ ![ DCO] ( https://img.shields.io/badge/DCO-required-brightgreen.svg )] ( https://developercertificate.org/ )
88
1212
1313---
1414
15+ ## What's New in v0.2
16+
17+ ### Trust & Security
18+ - ** Trust Tiers** — Progressive trust levels (Unknown -> Challenge-Verified -> Domain-Verified -> VC-Verified) with score ceilings
19+ - ** Proof-of-Work** — SHA-256 Hashcash anti-Sybil protection on handshake
20+ - ** Privacy Mode** — ` local_only ` , ` any ` , ` no_challenge ` modes for GDPR/DPDP compliance
21+ - ** Dual-LLM Evaluation** — Optional cross-validation with conservative agreement
22+ - ** Answer Fingerprinting** — SimHash + SHA-256 bot farm detection
23+ - ** Structured LLM Output** — JSON schema evaluation (no free-text parsing)
24+ - ** Tiered Decay** — Per-tier reputation half-lives with floor protection
25+
26+ See [ CHANGELOG.md] ( CHANGELOG.md ) for the full release notes.
27+
28+ ---
29+
1530## The Problem
1631
1732AI agents are rapidly gaining the ability to communicate with each other autonomously (via protocols like Google A2A and Anthropic MCP). There is no standard mechanism for verifying agent identity, authorization, or trustworthiness. The agent ecosystem is repeating the same mistake email made — building communication without authentication. Email took 20 years to bolt on SPF, DKIM, and DMARC after spam became an existential crisis. The Agentic Airlock builds the trust layer * before* the agent spam crisis hits.
@@ -56,6 +71,8 @@ Resolve → Handshake → Challenge → Verdict → Seal
5671 └─────┴─────────────────────────────────── ┘
5772```
5873
74+ ** v0.2 additions:** Handshake now supports optional ** Proof-of-Work** (SHA-256 Hashcash) for anti-Sybil protection. Agents are assigned a ** Trust Tier** (Unknown/Challenge-Verified/Domain-Verified/VC-Verified) that governs score ceilings and decay rates. ** Privacy Mode** (` local_only ` /` any ` /` no_challenge ` ) allows callers to control data residency for GDPR/DPDP compliance. Challenge evaluation supports ** Dual-LLM** cross-validation with conservative agreement.
75+
5976---
6077
6178## The 5 Phases
@@ -105,7 +122,7 @@ git clone https://github.com/airlock-protocol/airlock.git
105122cd airlock
106123pip install -e " .[dev]"
107124python demo/run_demo.py # 3-agent demo, no external services needed
108- python -m pytest tests/ -v # 313 tests
125+ python -m pytest tests/ -v # 399+ tests
109126```
110127
111128> ** [ → Full Getting Started Guide] ( GETTING_STARTED.md ) **
@@ -154,7 +171,8 @@ When you publish: see **[RELEASING.md](RELEASING.md)** (PyPI OIDC, npm `NPM_TOKE
154171| Method | Endpoint | Description |
155172| --------| ----------| -------------|
156173| ` POST ` | ` /resolve ` | Look up an agent by DID and return its profile |
157- | ` POST ` | ` /handshake ` | Submit a signed ` HandshakeRequest ` for verification |
174+ | ` POST ` | ` /handshake ` | Submit a signed ` HandshakeRequest ` for verification (optional PoW + privacy_mode) |
175+ | ` GET ` | ` /pow-challenge ` | Issue a Proof-of-Work challenge (SHA-256 Hashcash, adaptive difficulty) |
158176| ` POST ` | ` /challenge-response ` | Submit an agent's answer to a semantic challenge |
159177| ` POST ` | ` /register ` | Register an ` AgentProfile ` (DID + capabilities + endpoint) |
160178| ` POST ` | ` /feedback ` | Signed ` SignedFeedbackReport ` (Ed25519 + nonce); see SDKs |
@@ -196,15 +214,26 @@ New agents start at a neutral score of **0.50**.
196214| ` REJECTED ` | ` −0.15 ` (fixed penalty) |
197215| ` DEFERRED ` | ` −0.02 ` (small nudge — ambiguity is a signal) |
198216
217+ ### Trust Tiers (v0.2)
218+
219+ | Tier | Score Ceiling | Decay Half-Life |
220+ | ------| ---------------| -----------------|
221+ | ` UNKNOWN ` | 0.50 | 30 days |
222+ | ` CHALLENGE_VERIFIED ` | 0.70 | 90 days |
223+ | ` DOMAIN_VERIFIED ` | 0.90 | 180 days |
224+ | ` VC_VERIFIED ` | 1.00 | 365 days |
225+
226+ Agents with 10+ interactions have a decay floor of ** 0.60** — established agents never drop back to fully unknown.
227+
199228### Half-Life Decay
200229
201230Scores decay toward neutral (0.50) over time using the standard radioactive decay formula:
202231
203232```
204- decayed = 0.5 + (score − 0.5) × 2^(−elapsed_days / 30 )
233+ decayed = 0.5 + (score − 0.5) × 2^(−elapsed_days / half_life )
205234```
206235
207- An agent that stops interacting gradually becomes "unknown" rather than "suspect" — matching real-world trust intuitions. The half-life is 30 days .
236+ In v0.2, ` half_life ` is tier-specific (see table above) instead of a single global value. An agent that stops interacting gradually becomes "unknown" rather than "suspect" — matching real-world trust intuitions.
208237
209238---
210239
@@ -214,6 +243,7 @@ An agent that stops interacting gradually becomes "unknown" rather than "suspect
214243airlock-protocol/
215244├── airlock/
216245│ ├── config.py # Pydantic settings (env vars with AIRLOCK_ prefix)
246+ │ ├── pow.py # Proof-of-Work (SHA-256 Hashcash, adaptive difficulty)
217247│ ├── crypto/
218248│ │ ├── keys.py # Ed25519 KeyPair + did:key encoding/decoding
219249│ │ ├── signing.py # sign_model / verify_model + canonicalization
@@ -227,28 +257,30 @@ airlock-protocol/
227257│ │ ├── handlers.py # Request handlers (signature gate + event publish)
228258│ │ └── routes.py # FastAPI router + endpoint wiring
229259│ ├── reputation/
230- │ │ ├── scoring.py # Half-life decay + verdict delta computation
260+ │ │ ├── scoring.py # Tiered decay + verdict delta + floor protection
231261│ │ └── store.py # LanceDB-backed TrustScore persistence
232262│ ├── schemas/
233263│ │ ├── challenge.py # ChallengeRequest + ChallengeResponse
234264│ │ ├── envelope.py # MessageEnvelope, TransportAck, TransportNack
235265│ │ ├── events.py # VerificationEvent hierarchy (typed)
236- │ │ ├── handshake.py # HandshakeRequest + HandshakeResponse
266+ │ │ ├── handshake.py # HandshakeRequest + HandshakeResponse (PoW + privacy_mode)
237267│ │ ├── identity.py # AgentDID, AgentProfile, VerifiableCredential
238268│ │ ├── reputation.py # TrustScore schema
239269│ │ ├── session.py # VerificationSession + SessionSeal
270+ │ │ ├── trust_tier.py # TrustTier IntEnum + score ceilings
240271│ │ └── verdict.py # TrustVerdict, AirlockAttestation, CheckResult
241272│ ├── sdk/
242273│ │ ├── client.py # AirlockClient (async httpx wrapper)
243274│ │ └── middleware.py # AirlockMiddleware (protect decorator)
244275│ └── semantic/
245- │ └── challenge.py # LLM-backed challenge generation + evaluation
276+ │ ├── challenge.py # LLM-backed challenge generation + evaluation
277+ │ └── fingerprint.py # SimHash + SHA-256 answer fingerprinting
246278├── integrations/
247279│ └── airlock-mcp/ # MCP stdio server (gateway tools)
248280├── sdks/
249281│ └── typescript/ # npm package `airlock-client` (HTTP + types)
250282├── examples/ # Agent scenarios + demos
251- └── tests/ # Pytest suite (gateway, engine, SDK, A2A, … )
283+ └── tests/ # Pytest suite — 399+ tests (gateway, engine, SDK, A2A, security, property-based )
252284```
253285
254286---
@@ -264,6 +296,9 @@ airlock-protocol/
264296| ** Reputation with memory** | Half-life decay means reputation is time-sensitive — a trusted agent that goes dark eventually becomes "unknown" again |
265297| ** Local-first** | LanceDB is embedded (no server). The entire stack runs on a laptop: ` python demo/run_demo.py ` |
266298| ** A2A compatible** | The ` HandshakeRequest ` schema is designed to wrap Google A2A ` message ` objects |
299+ | ** Progressive trust** | Trust tiers gate score ceilings — LLM-only agents are capped at 0.70; full VC verification unlocks 1.00 |
300+ | ** Privacy-aware** | ` privacy_mode ` lets callers control data residency (` local_only ` keeps all data on the gateway instance) |
301+ | ** Anti-Sybil** | Proof-of-Work on handshake + answer fingerprinting make bot farm attacks economically infeasible |
267302
268303---
269304
@@ -284,7 +319,13 @@ All settings can be configured via environment variables with the `AIRLOCK_` pre
284319
285320## License
286321
287- Apache License 2.0. See [ LICENSE] ( LICENSE ) .
322+ | Component | License |
323+ | -----------| ---------|
324+ | SDKs, crypto, schemas (` sdks/ ` , ` airlock/crypto/ ` , ` airlock/schemas/ ` ) | Apache 2.0 |
325+ | Gateway, engine (` airlock/gateway/ ` , ` airlock/engine/ ` ) | BSL 1.1 (converts to Apache 2.0 on 2030-04-04) |
326+ | Specification (` docs/spec/ ` ) | CC-BY-4.0 |
327+
328+ See [ LICENSE] ( LICENSE ) for details.
288329
289330## Author
290331
0 commit comments