TRUSTIVAN has five objects. Everything in the API and the dashboard is one of them, or a view over them. The shape is deliberate. Collapsing any pair of them loses something that cannot be reconstructed later:

The path through them

A scan does not produce a fresh list. It is reconciled against the findings that already exist on the asset: a finding the scan sees again keeps its row, its identity and every decision recorded against it; one the scan no longer sees is resolved by absence; one that was resolved and is seen again is reopened. That reconciliation is the whole of the finding lifecycle.

Why identity comes first

Every other property in this document depends on one thing: that the finding in tonight’s scan is recognisably the same finding as the one somebody triaged last month. A scanner has no notion of that. Run one twice and you get two reports with no link between them. TRUSTIVAN derives a fingerprint from the content of a finding — which advisory, which package, which install path — and deliberately excludes everything that changes while the issue does not: severity, line numbers, the installed version, the engine that found it. That is what makes the decision record durable, and it is covered in Findings and identity.

Why decisions are recorded rather than derived

Two of these objects are append-only, and for the same reason. A finding event records what happened, not what is true now. The current status of a finding is one column; how it got there is a table nothing in the application can rewrite. A verdict records a decision that was made, not one that could be made now. Re-running a March policy evaluation in December against a re-rated CVE and an updated advisory database would produce a different answer — which is the correct answer for December and a fiction about March. So the March answer is stored, along with the immutable policy version that produced it and the full reasoning behind it. See Policies and verdicts.

What is tenant-scoped, and how

Every one of these objects belongs to an organisation, and every query that touches one is scoped to it by construction rather than by convention. The mechanism — a Scope value a handler cannot forge, and a data layer that will not compile without one — is described in Tenancy and isolation.

Where to go next