# `BoundedAuthorityProtocol.ContentAssertion.V1`
[🔗](https://github.com/baselabs/bounded_authority_protocol/blob/v1.0.0/lib/bounded_authority_protocol/content_assertion/v1.ex#L1)

Explicit standalone content-assertion profile: signatures bind exact content digests,
caller-supplied context and a bounded window. Verification never grants authority.
The caller owns content semantics, trusted key selection, replay and durable lineage state.

# `assemble_compact`

```elixir
@spec assemble_compact(BoundedAuthorityProtocol.V1.SigningInput.t(), binary()) ::
  {:ok, binary()} | {:error, :invalid}
```

Assembles and revalidates this profile at the maximum bounds.

# `assemble_compact`

```elixir
@spec assemble_compact(
  BoundedAuthorityProtocol.V1.SigningInput.t(),
  binary(),
  BoundedAuthorityProtocol.V1.Bounds.t() | map()
) :: {:ok, binary()} | {:error, :invalid}
```

Assembles and revalidates this profile under tightened bounds.

Since 0.9.0, assembly also refuses, with `{:error, :invalid}`, a
signature that no conforming signer emits: an Ed25519 signature whose `S` is not below the group
order or whose `R` is non-canonical or of small order (erratum 3). It never rewrites the
signature bytes it accepts.

# `assertion_digest`

```elixir
@spec assertion_digest(binary(), BoundedAuthorityProtocol.V1.Bounds.t() | map()) ::
  {:ok, binary()} | {:error, :invalid}
```

Hashes exact profile-parseable compact bytes; establishes no signature or trust.

# `assertion_signing_input`

```elixir
@spec assertion_signing_input(
  BoundedAuthorityProtocol.ContentAssertion.V1.ContentAssertion.t(),
  BoundedAuthorityProtocol.V1.Bounds.t() | map()
) :: {:ok, BoundedAuthorityProtocol.V1.SigningInput.t()} | {:error, :invalid}
```

Produces deterministic signing bytes for this closed profile.

# `content_digest`

```elixir
@spec content_digest(binary(), BoundedAuthorityProtocol.V1.Bounds.t() | map()) ::
  {:ok, binary()} | {:error, :invalid}
```

Hashes nonempty exact content bytes in the fixed content domain; never parses them.

# `decode_assertion`

```elixir
@spec decode_assertion(binary(), BoundedAuthorityProtocol.V1.Bounds.t() | map()) ::
  {:ok,
   BoundedAuthorityProtocol.ContentAssertion.V1.DecodedContentAssertion.t()}
  | {:error, :invalid}
```

Decodes bounded fields without evaluating the signature or trust.

# `verify_assertion`

```elixir
@spec verify_assertion(
  binary(),
  BoundedAuthorityProtocol.ContentAssertion.V1.ExpectedContentAssertion.t()
) ::
  {:ok, BoundedAuthorityProtocol.ContentAssertion.V1.ContentAssertionFacts.t()}
  | {:error, :invalid}
```

Verifies against explicit public trust, complete expected context and time.

# `verify_successor`

```elixir
@spec verify_successor(
  BoundedAuthorityProtocol.ContentAssertion.V1.ContentAssertionFacts.t(),
  BoundedAuthorityProtocol.ContentAssertion.V1.ContentAssertionFacts.t(),
  BoundedAuthorityProtocol.V1.Bounds.t() | map()
) :: :ok | {:error, :invalid}
```

Checks pairwise lineage facts; caller owns their provenance, current trust and high-water state.

---

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