---
title: Your first verdict
description: How to read the izri/quality check and the sticky pull-request comment, and what passing and failing actually mean.
order: 30
---

# Your first verdict

Your PR now has an `izri/quality` check. This page explains what it is telling you.

## Where the verdict appears

Izri publishes to two surfaces, both driven by the same underlying report:

- **The check run.** `izri/quality` is the umbrella. Each signal that ran appears as its own child check — `izri/scope`, `izri/tests`, and so on. This is the surface branch protection reads.
- **The sticky comment.** One comment on the PR, edited in place on every subsequent push rather than appended. You get the current verdict, not a scroll of stale ones.

Both update on every push to the head branch.

## Reading the umbrella

The umbrella resolves to one of three states:

| State | Meaning |
| --- | --- |
| `passing` | No hard rule fired, and the soft composite cleared the threshold. |
| `failing` | A hard rule fired, or the composite fell below threshold. |
| `unknown` | Not enough signal to judge — usually a delta still in flight, or every child skipped. |

`unknown` is not a pass. If you require the check in branch protection, treat it as "wait", not "go".

## Reading a signal

Each child reports independently and can be in a state the umbrella is not:

| Child state | Meaning |
| --- | --- |
| `passing` | Ran, found nothing blocking. |
| `failing` | Ran, found something that fails this signal. |
| `pending` | Queued or still running. |
| `error` | The analyzer itself crashed. This is a hard rule — it fails the umbrella rather than being silently ignored. |
| `skipped` | Not applicable to this diff, or not enabled on your plan. |

`skipped` is the one to internalize: a backend-only diff skips `izri/visual`, and that is a healthy verdict, not a gap. The composite redistributes weight across the signals that actually ran, so a skipped signal doesn't drag your score down.

## When a signal fails

Failures come in two flavors, and the difference decides whether you're blocked.

**Hard rules fail the umbrella outright**, regardless of every other signal:

- a change in a forbidden category for the PR's declared type
- a diff that no test exercised at all
- any analyzer that crashed

**Everything else is a soft signal** feeding a weighted composite that must reach **70**. Scope alignment, test pass rate, diff coverage, and visual delta each contribute; a mediocre score on one can be carried by the others.

Some findings never block at all. `sensitive_path` is emitted at `info` — it is a "look here" hint pointing at something worth a human glance, not a gate. `pr_type_mismatch` is `warn`. Only `error`-severity findings block by default.

So a failing umbrella means one of exactly two things: a hard rule fired, or the composite came in under 70. The check output tells you which.

## Next steps

- [The four signals](/docs/signals/overview) — every weight and hard rule in one table.
- [Verdicts and exit codes](/docs/reference/verdicts-and-exit-codes) — how this maps to CI exit codes.
- [Troubleshooting](/docs/reference/troubleshooting) — when the verdict isn't what you expected.
