<!-- auto-generated by tools/generate_state_doc.py — do not edit manually -->
<!-- generated: 2026-05-29T21:50:11Z -->

# Sanna Python SDK — State

## Version

Package: `1.5.0` (source of truth: `src/sanna/version.py`)

## Protocol Constants (`src/sanna/receipt.py`)

| Constant | Value |
|----------|-------|
| `SPEC_VERSION` | `"1.5"` |
| `CHECKS_VERSION` | `"10"` |
| `TOOL_NAME` | `"sanna"` |
| `TOOL_VERSION` | `"1.5.0"` (from `version.py`) |

## Test Files

Count: 133 (`tests/test_*.py` + `tests/reasoning/test_*.py`)

## Source Layout (`src/sanna/`)

```
  cloud/
  enforcement/
  evaluators/
  exporters/
  gateway/
  interceptors/
  mcp/
  reasoning/
  sinks/
  spec/
  templates/
  utils/
  __init__.py
  aarm.py
  anomaly.py
  bundle.py
  cli.py
  constitution.py
  constitution_diff.py
  crypto.py
  drift.py
  fingerprint.py
  hashing.py
  init_constitution.py
  manifest.py
  middleware.py
  receipt.py
  redaction.py
  store.py
  verify.py
  verify_manifest.py
  version.py
```

## Optional Dependencies

- mcp (FastMCP server + gateway)
- opentelemetry (OTel bridge — sanna[otel])

## Latest CHANGELOG Entry

## [Unreleased] -- 2026-05-29 (SAN-745)

### Added

- **`tests/test_escalate_conformance.py`**: cross-SDK escalate-disposition conformance test (Python side). Drives the http + subprocess interceptors with a must_escalate decision in enforce mode and asserts the emitted receipt matches the shared protocol fixture (`spec/fixtures/multi-surface-vectors.json` -> `escalate_disposition_vectors`) and that the action did not execute. The sanna-ts suite asserts the same vector (SAN-745 PR3a).

### Changed

- **`spec` submodule**: bumped to `4b73ec3` (sanna-protocol main) to consume `escalate_disposition_vectors` (SAN-745).

### Why this matters

