The Finding Contract
A Tier 2 agent writes a Finding to vsa-{stage}-avx-findings. The Finding carries the evidence, provenance, and timestamps that Tier 1 needs to narrate accurately and that operators need to audit the reasoning after the fact.
| Field | Type | Semantics |
|---|---|---|
|
|
String ( |
Stable UUID, set on creation. Preserved across in-place updates. The persistent identity for cross-system audit. |
|
|
SHA-256 hex |
The stable identity of a persistent condition on a scope. Computed from |
|
|
String |
Which agent module produced this Finding. For example, |
|
|
String (semantic version) |
The exact version that produced this Finding. Immutable after write. |
|
|
Object |
Exactly one of |
|
|
|
Customer-visible urgency. Derived from the triage classifier for safety Findings; set by the agent for all others. The broker reads severity as the primary channel-selection signal. By default, only |
|
|
ISO-8601 UTC |
When the agent’s reasoning completed. Tier 1 narrates "as of …" using this value. |
|
|
ISO-8601 UTC |
When this Finding leaves the active query window. Each agent sets its own freshness TTL. Expired Findings are invisible to queries but retained for audit. |
|
|
|
The agent’s confidence in its reasoning. Tier 1 adjusts narration tone accordingly. |
|
|
String (enum) |
The logical category: |
|
|
String (≤120 chars) |
Human-readable title. Rendered as the card headline and as the push notification body. The flywheel agents and the cost agent write it with the LLM; the other Fleet Intelligence agents fill a fixed template, and their model writes only |
|
|
String (Markdown) |
LLM-generated explanation with evidence citations. Rendered in the card drawer and narrated by Tier 1 on drill-down. |
|
|
Array of objects |
Every input signal and intermediate result that produced this Finding. Each entry carries |
|
|
SHA-256 hex |
Hash of the canonical input rows for this execution attempt. Scoped to retry-safety within a single run. Two attempts with the same hash are treated as duplicates. |
|
|
Integer |
Zero when the deterministic fallback ran; positive when the LLM path ran. Tier 1 uses this to distinguish agent reasoning from system-computed signals. |
|
|
Float |
Per-Finding inference cost. Zero when the deterministic path ran. Aggregated for cost monitoring. |
|
|
String (verbatim) |
Populated only when the Finding surfaces a monetary figure. Contains the exact disclosure text that Tier 1 narrates and the app displays. No paraphrase. See Deterministic Seams and Guards. |
|
|
Array of objects |
Appended on every in-place update. Each entry records |
Why the contracts are structured this way
Evidence is what separates a Finding from an assertion. Without evidence[], an operator cannot determine why the agent reached a conclusion. Without computed_at and expires_at, Tier 1 cannot tell the owner how fresh the reasoning is. Without finding_key, a persistent tire-wear condition accumulates redundant rows instead of updating in place.
The inputs_hash field only prevents two concurrent execution attempts from writing duplicate rows within the same run. It does not determine whether a condition is new or persistent; finding_key does that.
Finding lifecycle
-
Emission — The agent validates the schema, computes
finding_key, and either updates the existing open row or writes a new one. -
Delivery — The broker stream-processes the write from a DynamoDB stream on the table. It evaluates consent, rate limits, cardinality cap, and feedback demotion. It decides whether the Finding produces an in-app card only, or a card and an APNs push.
-
Narration — When the owner opens the card or starts a Tier 1 session, the agent narrates
headline,detail, anddisclosure_txt(where present) without editorializing. -
Action — The owner approves or dismisses. Approval creates an Action row and routes it to the executor. Dismissal sets
Action.status = dismissed, records feedback in the broker’s demotion table, and closes the card. -
Expiry — At
expires_at, the Finding leaves the active query window. The artifact row is retained.