Part 3: Reporting¶
This page answers: what does the layers object in a report actually say?
The report groups findings by evidence category and, for each category, records two independent facts: whether anything was detected, and how far the category could be assessed. Detection, coverage and boundary are defined once in the glossary.
Detection and coverage¶
- Detection is
firedwhen a finding in that category was produced, andnoneotherwise. - Coverage is
completewhen the category was fully exercised,incompletewhen a coverage gap (a truncated diff, an unresolvable value, a partial file) blinded it, andnot_applicablewhen the analysis mode cannot exercise it at all (L8 cross-package correlation in a single-package review).
They are kept separate because a finding must not hide that the same category was also unread, and an unread category must not hide a finding.
Reading the statuses¶
| Category | Detection | Coverage | Meaning |
|---|---|---|---|
| L3 Payload signature | fired | complete | A rule such as R001 matched a changed command shaped like curl ... \| bash. Positive evidence of a known pattern. |
| L3 Payload signature | none | complete | The input was fully available, no rule in this category matched. Not a safety certificate. |
| L1-L4 | any | incomplete | A source= value is computed dynamically or the diff was truncated, so the category was not fully assessed. |
| L8 Campaign correlation | none | not_applicable | A single-package review has no cross-package input; the check did not run. |
L8 is not_applicable only in a single-package review. In a corpus
correlation cycle (full-aur), where the collective G-series pass runs, the
layer is marked exercised and reports complete; an L8 finding in a report
also proves the pass ran.
For one release the object also carries a derived status
(fired/passed/unreadable/not_exercised) that collapses the two
dimensions for back-compat consumers; new consumers should read detection
and coverage.
A worked JSON example¶
A single-package review of a diff that was read in full, whose source= value
was resolved, and which fired R001 would carry the complete profile below.
This one is the truncated variant: the diff was cut short, so every category
that depends on reading the changed text is incomplete (L8 is not applicable
to one package). Detection and coverage move independently, which is the point
of the shape.
"layers": {
"L1": {"name": "Structural coherence", "detection": "none", "coverage": "incomplete", "status": "unreadable", "findings": []},
"L2": {"name": "Readability", "detection": "none", "coverage": "incomplete", "status": "unreadable", "findings": []},
"L3": {"name": "Payload signature", "detection": "fired", "coverage": "incomplete", "status": "fired", "findings": ["R001"]},
"L4": {"name": "Evasion shape", "detection": "none", "coverage": "incomplete", "status": "unreadable", "findings": []},
"L5": {"name": "Behavioral suspicion", "detection": "none", "coverage": "incomplete", "status": "unreadable", "findings": []},
"L6": {"name": "Ecosystem memory", "detection": "none", "coverage": "incomplete", "status": "unreadable", "findings": []},
"L7": {"name": "Known indicators", "detection": "none", "coverage": "incomplete", "status": "unreadable", "findings": []},
"L8": {"name": "Campaign correlation", "detection": "none", "coverage": "not_applicable", "status": "not_exercised", "findings": []}
}
Read it as: a payload-signature check fired (that evidence is real), and at the
same time every text-reading category is incomplete, so its silence is not
evidence. The same run with the whole diff present would show coverage:
"complete" on every row but L8, and status: "passed" wherever detection is
none.
The same profile as a follow-along list, in category order:
L1 Structural coherence unreadable (detection none)
L2 Readability unreadable (detection none)
L3 Payload signature fired (detection fired: R001)
L4 Evasion shape unreadable (detection none)
L5 Behavioral suspicion unreadable (detection none)
L6 Ecosystem memory unreadable (detection none)
L7 Known indicators unreadable (detection none)
L8 Campaign correlation not_exercised (detection none)
The verdict sentence¶
When findings score, the verdict names the fired evidence categories:
This answers "which kinds of evidence produced findings". It does not claim a sequence - a category's label is where the finding was produced, not a stage an attacker reached.
The terminal¶
inspect --verbose prints a single line beside the panel listing the
categories whose status is not passed and the count of boundaries that
forbid a clean verdict - the same projection the JSON carries. For the profile
above:
Layers: L1 unreadable, L2 unreadable, L3 fired, L4 unreadable, L5 unreadable, L6 unreadable, L7 unreadable, L8 not_exercised; 1 boundary(ies) forbid a clean verdict
Every non-passed category is named, so the terminal never shows less than the
JSON. The boundary count moves with the run; only the shape is fixed.
The boundary, beside the layers¶
The layer profile projects findings; the boundary list projects what the
run could not conclude - one object per coverage gap and per W rendering,
each with forbids_clean (see
the security model).
incomplete coverage and a forbids_clean boundary are two views of the same
shortfall, and both travel to every surface.