> ## Documentation Index
> Fetch the complete documentation index at: https://docs.heretic.tech/llms.txt
> Use this file to discover all available pages before exploring further.

# Tenant verdict schema

> Field reference for version 1 of the tenant verdict API response and its projected assessment data.

This page documents the `200` response from `GET /v1/verdict/{requestId}`. The API returns a projection of assessment schema `10`, not the full edge assessment.

```json theme={null}
{
  "api_version": "1",
  "request_id": "<raw nonce>",
  "verdict": "contradicted",
  "conclusive": true,
  "insufficient_reason": null,
  "refused": false,
  "summary": "...",
  "signals": [],
  "families": [],
  "provenance": {},
  "network": null,
  "identity": null,
  "edge": "waw-01",
  "created_at": 1787700000000,
  "ingested_at": 1787700000120
}
```

## Top-level fields

<ResponseField name="api_version" type="string" required>
  Tenant response contract version. The current value is `"1"`.
</ResponseField>

<ResponseField name="request_id" type="string" required>
  Raw nonce stored by the control plane. It has no `req_` prefix.
</ResponseField>

<ResponseField name="verdict" type="string" required>
  `contradicted`, `refused`, `disputed`, `uncontradicted`, or `insufficient`.
</ResponseField>

<ResponseField name="conclusive" type="boolean" required>
  Whether the categorical ruling rule was met. It is not a probability or a tenant action.
</ResponseField>

<ResponseField name="insufficient_reason" type="string | null" required>
  `sensor-gap`, `awaiting-return`, or `no-return` for an insufficient assessment. Otherwise `null`.
</ResponseField>

<ResponseField name="refused" type="boolean" required>
  `true` when `verdict` is `refused`.
</ResponseField>

<ResponseField name="summary" type="string | null" required>
  Human-readable assessment prose. Do not parse it.
</ResponseField>

<ResponseField name="signals" type="Signal[]" required>
  Projected findings, including weak findings.
</ResponseField>

<ResponseField name="families" type="FamilyReport[]" required>
  Six projected family reports, one for each current evidence family.
</ResponseField>

<ResponseField name="provenance" type="Provenance | null" required>
  Assessment versions and exact edge build.
</ResponseField>

<ResponseField name="network" type="Network | null" required>
  Projected network context without the raw IP address.
</ResponseField>

<ResponseField name="identity" type="Identity | null" required>
  Versioned identity output. Identity is separate from the verdict and never changes it.
</ResponseField>

<ResponseField name="edge" type="string | null" required>
  Name of the edge recorded by ingest.
</ResponseField>

<ResponseField name="created_at" type="integer | null" required>
  Unix milliseconds assigned to the settled projection. The ingest route clamps out-of-range edge values to its arrival time.
</ResponseField>

<ResponseField name="ingested_at" type="integer | null" required>
  Unix milliseconds when the immutable projection was first ingested. Exact retries do not overwrite the settled row.
</ResponseField>

## Verdict fields

| Verdict          | `conclusive` | Rule                                                                                                      |
| ---------------- | -----------: | --------------------------------------------------------------------------------------------------------- |
| `contradicted`   |       `true` | A non-refusal absolute finding fired, or composite findings fired in at least two distinct families.      |
| `refused`        |       `true` | A complete collector submission met an absolute refusal rule and no non-refusal absolute took precedence. |
| `disputed`       |      `false` | One family supplied composite evidence, or a conditional finding fired without a stronger result.         |
| `uncontradicted` |      `false` | Rulable client data joined and no verdict-bearing finding selected another result.                        |
| `insufficient`   |      `false` | Too little transport or client evidence joined.                                                           |

### Insufficient reasons

| Value             | Meaning                                                                               |
| ----------------- | ------------------------------------------------------------------------------------- |
| `sensor-gap`      | The return grace elapsed without transport evidence required by the initial gate.     |
| `awaiting-return` | Required transport or client evidence is absent within the 15-second grace.           |
| `no-return`       | Transport evidence joined, the grace elapsed, and no rulable client payload returned. |

## Signal object

```json theme={null}
{
  "id": "stack.os-contradiction",
  "tier": "composite",
  "family": "transport-stack",
  "headline": "Human-readable finding headline",
  "detail": "Human-readable finding detail"
}
```

<ResponseField name="id" type="string" required>
  Catalogue identifier. See [Signal reference](/reference/signals).
</ResponseField>

<ResponseField name="tier" type="string" required>
  `absolute`, `composite`, `conditional`, or `weak` for this observation.
</ResponseField>

<ResponseField name="family" type="string" required>
  One of the six evidence-family IDs.
</ResponseField>

<ResponseField name="headline" type="string" required>
  Human-readable finding title. Do not parse it.
</ResponseField>

<ResponseField name="detail" type="string" required>
  Human-readable evidence and limits. Do not parse it.
</ResponseField>

The full assessment can add `sensor_admission` to a finding. The tenant projection removes that field before ingest.

## Finding tiers

| Tier          | Verdict effect                                                                                      |
| ------------- | --------------------------------------------------------------------------------------------------- |
| `absolute`    | Conclusive alone. Refusal IDs produce `refused`; other absolute findings produce `contradicted`.    |
| `composite`   | Produces a conclusive contradiction only when another distinct family also has a composite finding. |
| `conditional` | Can produce `disputed`. It does not corroborate a composite finding.                                |
| `weak`        | Adds context and never changes the verdict.                                                         |

Tiers are categorical, not numeric. Distinct-family corroboration does not claim statistical independence.

## Family report

```json theme={null}
{
  "family": "transport-stack",
  "status": "contradicted",
  "highest_tier": "composite",
  "coverage": { "state": "measured" }
}
```

<ResponseField name="family" type="string" required>
  `network-geometry`, `transport-stack`, `transport-reachability`, `tls-construction`, `http-construction`, or `compute`.
</ResponseField>

<ResponseField name="status" type="string" required>
  `contradicted`, `consistent`, or `not-assessed`.
</ResponseField>

<ResponseField name="highest_tier" type="string | null" required>
  Strongest non-weak finding in the family, or `null` when no finding above weak fired.
</ResponseField>

<ResponseField name="coverage" type="object" required>
  Tagged object with `state`. `unavailable` and `not-yet-ruled` also contain a prose `reason`.
</ResponseField>

Coverage shapes are:

```json theme={null}
{ "state": "measured" }
```

```json theme={null}
{
  "state": "unavailable",
  "reason": "human-readable explanation"
}
```

```json theme={null}
{
  "state": "not-yet-ruled",
  "reason": "human-readable explanation"
}
```

| State           | Meaning                                                                                                                     |
| --------------- | --------------------------------------------------------------------------------------------------------------------------- |
| `measured`      | At least one supported rule had usable input. It does not mean every rule ran.                                              |
| `unavailable`   | Required input did not arrive or could not be used.                                                                         |
| `not-yet-ruled` | Input arrived, but the current catalogue could not rule on the state. Sensor impairment can also qualify a family this way. |

A family has status `contradicted` when a non-weak finding fired, including a conditional finding. A measured family with no non-weak finding is `consistent`. Other coverage without a non-weak finding produces `not-assessed`.

The full family report also contains a `signals` array. The tenant projection omits it.

## Provenance

```json theme={null}
{
  "schema": 10,
  "build": "0.0.1+f19fb27",
  "ruleset_revision": 6,
  "compute_probe_version": 2
}
```

| Field                   | Type    | Meaning                                                                |
| ----------------------- | ------- | ---------------------------------------------------------------------- |
| `schema`                | integer | Assessment shape and meaning. Current value `10`.                      |
| `build`                 | string  | Exact edge build that produced the assessment.                         |
| `ruleset_revision`      | integer | Revision of rule thresholds and tier assignments. Current value `6`.   |
| `compute_probe_version` | integer | Nested compute probe version accepted by the rules. Current value `2`. |

## Network

```json theme={null}
{
  "asn": 64500,
  "country": "US",
  "description": "Example network",
  "classification": "access"
}
```

| Field            | Type             | Meaning                                             |
| ---------------- | ---------------- | --------------------------------------------------- |
| `asn`            | integer          | Autonomous system number.                           |
| `country`        | string or `null` | Country from the available network metadata.        |
| `description`    | string           | Human-readable network description.                 |
| `classification` | string           | `hosting`, `access`, `institutional`, or `unknown`. |

Network classification is context and does not change the verdict. The projection omits raw IP, concealment indicators, and unchecked concealment checks.

## Identity

```json theme={null}
{
  "version": 2,
  "instance": "<64 lowercase hex>",
  "machine": "<64 lowercase hex>",
  "tier": {
    "instance": "absolute",
    "machine": "conditional"
  },
  "components": {
    "canvas": "...",
    "raster_gl": "...",
    "audio": "...",
    "gpu": "...",
    "display": "1512x982@2",
    "cores": 8,
    "platform": "MacIntel",
    "timezone": "America/New_York",
    "fonts": "<16 lowercase hex>"
  }
}
```

`instance` is present only when canvas, fixed WebGL raster, or audio supplies an anchor. `machine` is present only when cores, display, and timezone are present. Platform participates in the machine digest when available. Missing IDs and components are omitted inside a non-null identity object.

The IDs are deterministic digests over normalized components, identity version, scope, and a salt derived from the submitted public site key. Key rotation changes them. Compare IDs only within one version and key scope.

They describe matching component material, not people. They do not establish global uniqueness, anonymity, irreversibility, collision freedom, or continuity through every software and hardware change.

## Projection omissions

The tenant response does not include:

* top-level assessment `schema`
* `contradicting_families`
* full `concealment`
* full `sensor`
* per-finding `sensor_admission`
* `geometry`
* family-level `signals`
* full session `record`
* raw IP
* raw claims or the measured payload
* detailed TCP, TLS, HTTP/2, or QUIC records

## Field stability

Use IDs, enums, booleans, versions, provenance, and documented timestamps as structured inputs. Do not parse `summary`, `headline`, `detail`, network descriptions, collector failure reasons, or coverage reasons.


## Related topics

- [Tenant verdict endpoint](/api/verdict-endpoint.md)
- [Verdicts and coverage](/concepts/verdicts-and-coverage.md)
- [Heretic documentation](/index.md)
- [Privacy and retention](/data/privacy-and-retention.md)
- [How Heretic measures](/concepts/how-heretic-measures.md)
