Trace Diagnosis With CLI
provon diagnose runs Provon's built-in diagnostic Rules against a trace source. It is designed for coding agents, cloud jobs, CI artifacts, exported production traces, and persiste
On this page Browse sections
trace source -> deterministic signals -> optional Agent adjudication -> FindingsThe command does not start or configure a model runtime. The calling Agent supplies semantic judgment through a hash-bound structured response.
The CLI can run on a developer machine, in CI, in a container, or as a cloud job. source describes
the evidence input available to that process; it does not describe where diagnosis executes.
Execution Boundary#
Source-based diagnosis:
- does not require a Provon API key;
- does not upload the source;
- does not persist a Finding;
- does not create a GitHub issue;
- does not modify the repository or source files.
It returns evidence-backed Finding objects to stdout. Server-side Rule Runs and the Findings inbox remain a separate remote workflow.
Supported Inputs#
provon diagnose <source>source can be:
| Source | Accepted evidence |
|---|---|
| Transcript file | Claude Code, Codex, or Pi persisted session |
| Transcript directory | Recursively discovered supported Agent sessions |
| OTLP JSON file | Standard resourceSpans or trace request envelope |
| OTLP protobuf file | Binary trace export request |
| Provon span JSON or JSONL | Canonical normalized OTelSpan records |
| Provon trace bundle | Directory containing spans.jsonl from traces export |
- |
Standard input |
Input formats:
auto
transcript
otlp-json
otlp-protobuf
provon-spansAutomatic detection is the default:
provon diagnose ./trace-evidence
provon diagnose ~/.claude/projects/example/session.jsonl
provon diagnose ./otlp-traces.json
provon diagnose ./traces.pbOverride detection when stdin or an ambiguous extension is involved:
cat ./spans.jsonl | provon diagnose - --input-format provon-spans
provon diagnose ./capture.bin --input-format otlp-protobufThe same trace/span identity appearing more than once is deduplicated before diagnosis.
Rule Selection#
By default, all five built-in Rules run:
runtime-reliability
tool-correctness
task-fulfillment
answer-grounding
conversation-healthSelect one or more Rules by repeating --rule:
provon diagnose ./trace-evidence \
--rule runtime-reliability \
--rule tool-correctnessOverride publication thresholds for this execution:
provon diagnose ./trace-evidence \
--min-score 0.5 \
--min-confidence 0.7Both values must be between 0 and 1.
Deterministic-Only Mode#
provon diagnose ./trace-evidence --deterministic-onlyThis mode:
- returns only Findings supported without semantic adjudication;
- emits no adjudication request;
- makes no model call;
- is predictable for CI and high-volume screening;
- intentionally has lower recall for grounding, fulfillment, and causal questions.
Do not treat --deterministic-only as equivalent to complete diagnosis.
Signal Adjudication#
Without --deterministic-only, the first pass can return:
{
"ok": true,
"data": {
"status": "needs_adjudication",
"findings": [],
"adjudicationRequests": [
{
"schemaVersion": "provon-signal-adjudication-v1",
"diagnosisInputHash": "...",
"instructions": "...",
"evidenceBrief": "...",
"signals": [],
"evidence": [],
"responseContract": {}
}
]
},
"warnings": [],
"nextActions": [
{
"label": "Finalize with current Agent adjudication",
"command": "provon diagnose ./trace-evidence --adjudication-response <response.json>"
}
]
}The request contains the only candidates the Agent may confirm. The Agent must judge whether each candidate is:
- a genuine fault;
- the earliest uncorrected cause;
- not corrected or compensated for by a later step.
It must not invent a new candidate or use trace IDs, span IDs, conversation IDs, or timestamps as
the signalSignature.
Response Shape#
Create one response per diagnosisInputHash. The response can be a single object or a
responses envelope:
{
"responses": [
{
"schemaVersion": "provon-signal-adjudication-v1",
"diagnosisInputHash": "copy-from-the-request",
"outcome": "failed",
"confidence": 0.92,
"signals": [
{
"failureModeKind": "goal_not_completed",
"signalSignature": "copy-a-candidate-signature",
"severity": "high",
"confidence": 0.9,
"title": "Required verification was skipped",
"summary": "The agent claimed completion without running the required verification.",
"rootCauseSummary": "The first uncorrected fault is the omitted verification step.",
"suggestedFix": "Run and report the required verification before claiming completion.",
"failedActor": "implementation-agent",
"causeStep": "Claimed completion before verification",
"causeStepIndex": 8,
"genuineFault": true,
"earliestUncorrected": true,
"notCorrected": true,
"causalCheckReason": "No later step performed or compensated for the verification."
}
]
}
]
}Use values from the request's supplied signals. A response with an unknown failure mode or non-matching signal signature cannot confirm that candidate.
Run the same diagnosis again with the response:
provon diagnose ./trace-evidence \
--adjudication-response ./adjudication-response.jsonThe command recomputes the diagnosis input and requires the response hash to match. A changed trace, Rule, threshold, or evidence projection invalidates stale adjudication.
Output#
Every successful CLI command returns an { ok, data, warnings, nextActions } envelope.
data contains:
| Field | Meaning |
|---|---|
status |
completed or needs_adjudication |
source |
Resolved path, detected format, and loaded files |
summary |
Span, trace, conversation, Rule, Finding, and rejection counts |
traceIds |
Distinct trace IDs in the input |
findings |
Promoted Findings returned by this execution |
adjudicationRequests |
Pending hash-bound requests |
Parse and rejected-record messages appear in the envelope's warnings. When adjudication is
required, nextActions includes the follow-up command.
Use --include-candidates to inspect promoted, suppressed, pending, and adjudication-rejected
candidates:
provon diagnose ./trace-evidence --include-candidatesThis is useful for tuning thresholds and understanding why a signal did not become a Finding.
CI Pattern#
provon diagnose ./artifacts/agent-trace.jsonl \
--input-format provon-spans \
--deterministic-only \
--min-score 0.5 \
--min-confidence 0.7CI should consume the structured JSON result rather than scrape human text. Decide explicitly which severities or Finding counts fail the job; Provon does not impose a repository-specific gate.
Evidence Requirements#
Diagnosis needs more than valid OTLP:
- a stable conversation boundary;
- the user's goal and constraints;
- ordered model, tool, retrieval, and participant activity;
- tool arguments, results, failures, and retries;
- a terminal answer or explicit non-completion;
- trace and span IDs for evidence references.
When the input contains spans but no diagnosable trajectory, the command fails with
diagnose.no_trajectories.