# `Snodo.Compliance`
[🔗](https://github.com/joshrotenberg/snodo/blob/v0.1.0/lib/snodo/compliance.ex#L1)

Honest, machine-readable evidence inventory for the implemented MCP slice.

Internal contract checks, unsupported surfaces, unmeasured surfaces, and
official conformance results remain separate buckets. Passing the internal
contract never becomes an official conformance score.

# `internal_contracts`

```elixir
@spec internal_contracts() :: [String.t()]
```

Returns the canonical IDs that the internal contract suite must evidence.

# `report`

```elixir
@spec report(Snodo.Protocol.Profile.t(), keyword()) :: map()
```

Builds the evidence report for the `2026-07-28` profile.

`profile` must have version `"2026-07-28"`, such as
`Snodo.Protocol.V2026_07_28.profile()`. The report is a string-keyed map
with `"protocolProfile"` (the profile's manifest), `"evidence"`
(`"internalPass"`, `"unsupported"`, `"unmeasured"`, and `"officialPass"`),
and `"officialServerConformance"` (the frozen result of the official
conformance run). `mix snodo.contract --format json` prints this map.

Options:

  * `:internal_pass` - the internal contract IDs whose evidence passed,
    each from `internal_contracts/0` and listed once. Defaults to `[]`.
    Any other value raises `ArgumentError`.

# `to_markdown`

```elixir
@spec to_markdown(map()) :: String.t()
```

Renders a `report/2` map as a short Markdown summary, as
`mix snodo.contract --format markdown` prints it.

# `verify_requirements_manifest!`

```elixir
@spec verify_requirements_manifest!(Path.t()) :: :ok
```

Verifies the pinned frozen requirement artifact and its server inventory.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
