9. Read the verdicts
Why a question nobody answered must not score as a pass, and how to audit one that did.
Every checking tool most people have used reports two things: a violation, or silence. That works only if silence reliably means “checked, and fine”. It does not. You also get silence from a rule that had nothing to work with, an interface that is not on the board, a datasheet nobody seeded, and a design whose intent was never declared.
Collapse all of those into “pass”, and a review comes back green on a board nobody checked. The outcome vocabulary exists to keep them apart.
The vocabulary ¶
| Outcome | What it means |
|---|---|
pass |
the check ran and found nothing wrong |
fail |
the check ran and found something wrong |
provisional |
it found something, but the data behind it sits below the trust floor |
not-applicable |
the question does not apply to what was loaded |
needs-data |
it would apply, but a datasheet parameter is missing |
needs-design-intent |
it would apply, but nothing declared the intent |
computed-n/a |
the design itself rules the question out |
inconclusive |
the check ran and could not decide |
not-automated |
nothing automated is bound to this item |
Only the first two are verdicts about your board. Everything else is a verdict about the check.
pass is a claim, and a claim needs someone to have looked.
Coverage before results ¶
$ agni review designs/jetson --coverage
# Review coverage: Jetson baseboard design review
Design: `designs/jetson`
**14 of 15 covered**, **13 answered** — 6 pass, 7 fail, 1 n/a; 1 not-automated
| Area | Covered | Pass | Fail | Provisional | Needs-intent | Needs-data | Inconclusive | Computed-n/a | N/A | Not-automated |
|------|---------|------|------|-------------|--------------|------------|--------------|--------------|-----|---------------|
| Power | 5/5 | 2 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Interfaces | 4/4 | 1 | 2 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
| House style | 2/3 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| Board | 1/1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Architecture | 2/2 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| **Total** | 14/15 | 6 | 7 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
Read the two leading numbers before reading anything else. A board with zero failures and a coverage of 4 of 15 has not been reviewed, and the failure count alone would have told you it was perfect.
Covered is how many items a mechanism exists for. Answered is how many the run actually
decided, and it is the stricter of the two. They differ here by one item, I2, the CAN interface. A
profile is bound to it, so it is covered, and the board carries no CAN, so the run had nothing to
decide and the item reads not-applicable. A catalog rule ends up in the same place when the facts
it reads are absent and it cannot run. Rung 11 gates a pipeline on the answered number for exactly
that reason.
Coverage also tells you where to invest. Interfaces carries one n/a for an
absent bus, which is fine and will never improve. House style sits at 2 of 3 because of a genuinely
manual item, which is also fine. Neither is a gap worth working on. A column filling up with
needs-data is a gap worth working on, because seeding a few parts converts it directly into
coverage.
Seven failures is a good sign ¶
This board reports 7 fail out of 15. That looks alarming, but it is the healthiest state on offer. Every one of them names its subjects and its reason, so a reviewer can now finish the conversation about each one. Rung 2’s I2C errors are among them, and so are the test points on nets nobody named, which no shipped rule would ever have raised.
Compare against the board before the tiers were added. Fewer questions were being asked, so some failures could not appear, and others, like the ESD findings on internal connectors, were noise burying the ones that mattered.
If failures go up as you add tiers, the system is working. If failures go up while coverage does not move, worry about that number.
Provisional ¶
Rung 6 left one state to show. Put its first-pass draft of the NTS0102 back over the transcribed file and score the checklist:
$ cp drafts/nts0102gt.first-pass.textproto params/nts0102gt.textproto
$ agni review designs/jetson
**5 pass, 7 fail, 1 n/a, 1 not-automated, 1 provisional (of 15)**
| P4 | no part is operated above its absolute-maximum supply voltage | provisional | supply-exceeds-abs-max: U51 (power-input pin 7 on rail "+5V": nominal 5V exceeds absolute-maximum VCC 3.6V — datasheet "NTS0102 (first pass, not checked against the datasheet)" page 0, "" (mock, confidence 0.3)) |
P4 reads provisional, not fail. The finding is shown in full, and the engine declines to call
it a defect, because every limit behind it carries a confidence below the trust floor.
--ratified-floor sets that floor, 0.9 by default.
Auditing a pass ¶
A pass deserves suspicion, because a pass ends the conversation. There are two specific ways a pass can be hollow.
Some items are bound to an inverted query, one that matches the healthy case rather than the
violation. Such an item passes exactly when it should fail. Read the match: of every query item
and confirm it describes something being wrong.
A rule can also have no members. Take an item bound to a rule that quantifies over a device class. It passes when no component is in that class. That can mean the class was never resolved, rather than that nothing was in it. Rung 7’s note on declaring modules by class is this shape seen from the other side.
In general, you should be able to name the thing every pass looked at. If you cannot, the pass is a guess.
agni check --verdicts makes a rule answer that, with one row per subject and the evidence behind
each pass:
$ agni check --verdicts --rule i2c-pull-up designs/jetson
i2c-pull-up 28 fail, 26 pass
pass /CSI/SCL_CAM0 /CSI/SCL_CAM0 reaches rail /CSI/CSIA_I2C_VCC
through R390
pass /CSI/SCL_CAM1 /CSI/SCL_CAM1 reaches rail /CSI/CSIA_I2C_VCC
through R389
pass /CSI/SCL_CAM2 /CSI/SCL_CAM2 reaches rail /CSI/CSIB_I2C_VCC
through R392
pass /CSI/SCL_CAM3 /CSI/SCL_CAM3 reaches rail /CSI/CSIB_I2C_VCC
through R394
Rows sit under the rule that produced them, worst first. Read the subject as the claim and the sentence beside it as the reason to believe it. If you cannot check a pass’s reason against the design, go and look at that pass.
--verdicts has two limits worth knowing before you rely on it. Some rules report violations
without stating what they examined. Such a rule is labelled “reports violations only”, and its rows
are what it FOUND rather than what it checked. So absence under such a heading is not evidence of
correctness. And a pass can only cite a
value the rule actually measured, so a few rules still pass with a description of their test rather
than a number.
When a check cannot decide ¶
inconclusive is separate from every other non-pass outcome, and it is the subtlest. The check ran,
had its inputs, and still could not reach a verdict, usually because the design is ambiguous in a
way the rule cannot resolve. It is a real answer, “I looked and I cannot tell”, rather than a gap
in your data or your checklist. Sometimes it is the only accurate answer. It belongs in front of a
human rather than being rounded to a pass.
What is not on this list ¶
There is no waived. A finding you have decided to accept is still a finding. The decision to
accept it belongs in your process rather than in the tool’s verdict. If a tool lets you edit a report
into agreement, its reports stop being evidence.
Next ¶
Compare revisions, because the question is usually not “is this board good” but “what changed since the last one”.