> ## 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.

# Signal reference

> Look up every current finding ID, its evidence family, its possible tiers, and the separate concealment indicators.

The tenant verdict API returns projected findings in `signals`. Each finding has this shape:

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

Use `id`, `tier`, and `family` as structured fields. Treat `headline` and `detail` as prose. Read the tier from each finding instead of assigning one from the ID. Four IDs can use different tiers under different conditions.

The current catalogue has 44 finding IDs across six evidence families. The catalogue also has three concealment-only IDs that never change the verdict.

## Network geometry

| ID                        | Possible tier | What it reports                                                                                                         |
| ------------------------- | ------------- | ----------------------------------------------------------------------------------------------------------------------- |
| `geo.claims-no-location`  | `weak`        | The timezone claim provides an offset but no location for an RTT comparison.                                            |
| `geo.rtt-below-vacuum`    | `composite`   | Measured handshake RTT is below the vacuum floor for the claimed timezone and edge.                                     |
| `geo.rtt-below-fibre`     | `composite`   | Measured handshake RTT is above the vacuum floor but below the fibre floor.                                             |
| `geo.rtt-far-above-floor` | `weak`        | Measured RTT exceeds the rule's ratio to the reference-point fibre RTT and its additive slack above that same baseline. |

Geometry derives a conservative lower distance bound to the claimed timezone from an enclosing radius and a safety-margined bounding box. It does not treat the reference point as the exact client location.

## Transport stack

| ID                             | Possible tier | What it reports                                                                               |
| ------------------------------ | ------------- | --------------------------------------------------------------------------------------------- |
| `stack.os-contradiction`       | `composite`   | Captured TCP SYN properties identify an OS family that conflicts with the browser's OS claim. |
| `stack.mtu`                    | `weak`        | The SYN MSS supplies an estimated path MTU.                                                   |
| `wire.client-malformed-frames` | `weak`        | The packet sensor saw malformed IP or TCP frames attributed to the client address.            |

## Transport reachability

| ID                               | Possible tier | What it reports                                                                                                    |
| -------------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------ |
| `reach.no-quic-attempt`          | `composite`   | A supported browser had a server-measured HTTP/3 opportunity on port 443, but the edge saw no parsed QUIC attempt. |
| `reach.quic-shape-only`          | `weak`        | A datagram parsed as QUIC, but the edge did not recover a ClientHello.                                             |
| `reach.quic-same-address-only`   | `weak`        | QUIC arrived from the same address without a nonce-confirmed session join.                                         |
| `reach.quic-underpadded-initial` | `composite`   | A nonce-confirmed QUIC Initial was shorter than the 1,200-byte minimum.                                            |

Any parsed QUIC attempt suppresses `reach.no-quic-attempt`, including shape-only evidence. A same-address match does not authorize rules that require a confirmed join.

## TLS construction

| ID                                         | Possible tier              | What it reports                                                                                                                             |
| ------------------------------------------ | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `tls.no-grease`                            | `composite`, `conditional` | A TCP ClientHello has no GREASE. A Chromium claim makes the finding composite; no declared browser engine makes it conditional.             |
| `tls.no-h2-alpn`                           | `composite`, `conditional` | A TCP ClientHello omits `h2`. A declared browser engine makes the finding composite; no declared engine makes it conditional.               |
| `tls.pre-1.3`                              | `composite`, `weak`        | A TCP ClientHello does not offer TLS 1.3. A declared browser engine makes the finding composite; no declared engine makes it weak.          |
| `tls.group-disagreement-across-transports` | `composite`                | Nonce-confirmed Chromium TCP and QUIC hellos disagree on supported groups or key-share groups.                                              |
| `tls.group-disagreement-unclassified`      | `weak`                     | Nonce-confirmed TCP and QUIC hellos disagree on groups, but the client does not supply the Chromium context required by the composite rule. |

The TCP construction rules do not apply their GREASE, `h2`, or TLS-version expectations to a QUIC-only ClientHello.

## HTTP construction

| ID                                        | Possible tier       | What it reports                                                                                                                                                    |
| ----------------------------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `http.h2-stack-contradicts-tls`           | `composite`         | GREASE-bearing TLS and a Go `net/http2` preface appear on one connection.                                                                                          |
| `http.missing-client-hints`               | `composite`         | A supported Chromium User-Agent omits the default `Sec-CH-UA` header set.                                                                                          |
| `http.client-hints-on-non-chromium`       | `composite`         | A Gecko or WebKit User-Agent arrives with Chromium's default client-hint header set.                                                                               |
| `http.h2-fingerprint`                     | `weak`              | The edge records HTTP/2 settings, window, priority, and pseudo-header-order evidence.                                                                              |
| `http.headers`                            | `weak`              | The edge records request-header names and whether wire order was available.                                                                                        |
| `identity.chromium-brand-on-non-chromium` | `composite`         | `navigator.userAgentData.brands` contains the literal `Chromium` brand while the User-Agent names Gecko or WebKit.                                                 |
| `identity.ua-disagreement`                | `composite`, `weak` | A request User-Agent disagrees with `navigator.userAgent` on engine, OS, or major version. A disagreement only between page and collector request headers is weak. |
| `identity.measurement-declined`           | `absolute`          | A completed collector request contains no measurement, usable declaration, or reported error. This is a refusal finding.                                           |
| `identity.measurement-withheld`           | `absolute`          | The payload has declarations but omits all usable probe results without accounting for every probe failure. This is a refusal finding.                             |
| `identity.measurement-unusable`           | `conditional`       | The collector or every measured probe reports failure, leaving no usable measured result.                                                                          |
| `identity.measurement-partial`            | `conditional`       | At least one measured probe returned data, while another required probe returned neither data nor a failure status.                                                |
| `identity.never-returned`                 | `weak`              | The page request exists, the return grace elapsed, and no collector payload arrived.                                                                               |

The two absolute refusal IDs are `identity.measurement-declined` and `identity.measurement-withheld`. A non-refusal absolute finding still takes precedence when both kinds are present.

## Compute

| ID                                   | Possible tier | What it reports                                                                                                                   |
| ------------------------------------ | ------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `gpu.throughput-software-class`      | `composite`   | Measured GPU work is software-class relative to measured CPU work, while the renderer claim does not identify software rendering. |
| `gpu.realm-disagreement`             | `composite`   | Page and worker realms report different non-coarsened, non-software GPU renderers.                                                |
| `gpu.gl-caps-contradict-backend`     | `composite`   | Reported GL limits conflict with the named ANGLE backend.                                                                         |
| `gpu.gl-limit-contradicts-driver`    | `absolute`    | Direct allocation succeeds beyond a reported GL limit or fails at that reported limit.                                            |
| `gpu.renderer-os-contradiction`      | `composite`   | The renderer names a platform-specific driver that conflicts with the declared platform.                                          |
| `gpu.below-claimed-model`            | `conditional` | Measured GPU throughput is below the current reference band for the claimed renderer class.                                       |
| `compute.clock-below-any-desktop`    | `composite`   | Calibrated integer timing falls below the current desktop clock threshold for a supported architecture.                           |
| `compute.thread-scaling-inversion`   | `composite`   | Worker throughput falls past the rule threshold as worker count increases.                                                        |
| `compute.cores-below-claim`          | `composite`   | The measured parallel curve plateaus below the reported logical-processor count.                                                  |
| `compute.cores-exceed-claim`         | `composite`   | Outside Apple WebKit, validated parallel scaling exceeds the reported logical-processor count and noise allowance.                |
| `compute.cores-above-engine-ceiling` | `composite`   | Apple WebKit reports a processor count above its current output ceiling.                                                          |
| `compute.deep-memory-latency`        | `weak`        | The 1 MiB dependent-access timing exceeds the rule's reference threshold.                                                         |
| `compute.apple-l1-spill`             | `weak`        | The measured cache-boundary ratio conflicts with the Apple-silicon claim.                                                         |
| `compute.timing-jitter`              | `weak`        | Repeated CPU timing has relative spread above the rule's idle threshold.                                                          |
| `compute.frame-cadence-recorded`     | `weak`        | The collector returned usable frame cadence measurements.                                                                         |
| `identity.canvas-noise-injected`     | `weak`        | Repeated same-scene canvas renders returned different hashes.                                                                     |

`gpu.below-claimed-model` is a conditional population comparison. It is not a within-session invariant and cannot make a verdict conclusive.

## Concealment-only IDs

These IDs appear in the full concealment report, not as verdict-bearing findings merely because the indicator fired.

| ID                             | What it reports                                                                                               |
| ------------------------------ | ------------------------------------------------------------------------------------------------------------- |
| `net.datacenter-egress`        | Network metadata classifies the connecting address as hosting, cloud, or content-network space.               |
| `path.tunnelled-mtu`           | The estimated path MTU is at or below the current tunnel-sized threshold. The report does not assign a cause. |
| `client.resist-fingerprinting` | Browser claims match the current Firefox `privacy.resistFingerprinting` signature.                            |

The concealment report can also repeat selected finding IDs as path context. Concealment indicators and network classification do not change the verdict.

## Tier effect

| Tier          | Verdict effect                                                                                                  |
| ------------- | --------------------------------------------------------------------------------------------------------------- |
| `absolute`    | Conclusive alone. Refusal IDs produce `refused`; other absolute findings produce `contradicted`.                |
| `composite`   | Produces `disputed` in one family. Composite findings in at least two distinct families produce `contradicted`. |
| `conditional` | Can produce `disputed`. It does not corroborate a composite finding.                                            |
| `weak`        | Adds context and never changes the verdict.                                                                     |

Several findings in one family still count as one family. See [Verdicts and coverage](/concepts/verdicts-and-coverage) for precedence and family status.


## Related topics

- [Verdicts and coverage](/concepts/verdicts-and-coverage.md)
- [Tenant verdict schema](/api/verdict-schema.md)
- [Collector reference](/integration/collector.md)
- [Tenant verdict endpoint](/api/verdict-endpoint.md)
- [Heretic documentation](/index.md)
