A run with no intent skips the intent step without a reason, so review runs without acceptance criteria and no status, gate, or outcome says so
Version: reproduced live on v1.80.1 (f6441c9) and on v1.79.0 (fc540ac), macOS arm64, agent: claude, each with the release binary and its own NM_HOME and daemon. First seen on v1.75.2 (4debd42); the output is the same on all three.
Summary
no-mistakes axi run requires --intent, but a plain gate push (git push no-mistakes <branch>) is still a supported way to start a run, and it carries no intent unless the intent step finds a matching agent transcript.
When no transcript matches, the intent step returns Skipped: true with no skip reason, and review, test, and the PR continue with no intent.
The only sign is the word skipped in one row of the step table.
It is not in run.automatic_skips (where the automatic pr and ci skips appear with their causes), and the push output, the review gate, and the final outcome do not say that the run had no intent.
runs.intent and runs.intent_source are NULL.
This is the same shape as #969 (automatic PR/CI skips reported as an unqualified pass, fixed by #975), for the step that supplies review's acceptance criteria.
Field case
This first showed up in a real agent-driven delivery on v1.72.0, not in a test.
The agent had been told to pass --intent and had written the intent text to a file beforehand, but the run recorded no intent: runs.intent and runs.intent_source were empty, and its intent step was the only skipped one among 41 runs on that machine.
The run was started from a gate push right after a manual repair of the gate ref. Our reading is that this path started the run without the intent, which fits #402, but no log proves the mechanism.
Review then ran seven rounds. Three of the five round-2 findings were scope findings, where the reviewer had to reconstruct scope itself, for example "the change still carries four components the stated intent does not require".
Nobody noticed until a later audit read the database. Nothing in status, the gates, or the outcome had said that the run had no intent.
Reproduction
- A gated repository with no recent agent transcript for it (for example a fresh repository under
/tmpwith a local bare remote), and a branch with one commit. git push no-mistakes <branch>Output:* Pipeline started/Run no-mistakes to review.- no mention of intent.- After the run finishes:
no-mistakes axi statusandno-mistakes axi logs --step intent.
Observed (v1.80.1)
steps[9]{step,status,findings,duration_ms}:
intent,skipped,0,3426
rebase,completed,0,187
review,completed,0,9079
test,completed,0,13222
document,completed,0,9292
lint,completed,0,20
push,completed,0,251
pr,skipped,0,9
ci,skipped,0,9
automatic_skips[2]{step,reason}:
pr,provider unknown is not supported yet
ci,provider unknown is not supported yet
...
outcome: passed-with-skipsIntent step log:
scanning recent agent transcripts...
no matching agent transcript foundSELECT quote(intent), quote(intent_source) FROM runs WHERE id = '<run id>' returns NULL|NULL.
In step_results, skip_reason is NULL for intent, while pr and ci carry 'provider unknown is not supported yet'.
The same branch contents started with axi run --intent "..." record intent_source = 'agent' and intent,completed.
Here passed-with-skips comes only from the pr and ci skips; with a supported forge the run would report a plain passed.
Source (v1.80.1)
- The no-match path logs and returns a skip with no
SkipReason: internal/pipeline/steps/intent.go#L104-L107. The disabled-in-config, empty-diff, extraction-error, and no-result paths are the same (L62-L66, L108-L126). automaticSkipslists onlyprandci, and only when they carry a skip reason: internal/cli/axi_render.go#L521-L530.
Why it matters
A review with no intent has to reconstruct scope from the diff, so scope findings become guesses, and nothing prompts the person or agent driving the run to restart it with an intent. VISION: "A gate that cannot run completely refuses loudly with guidance; it never degrades silently into a weaker check", and "The author's intent, with its provenance, is part of what review checks the diff against." This report does not ask to make intent mandatory for a plain push; it asks that the missing intent be visible.
Expected
When a run continues without an intent:
- the
intentstep records a skip reason (for exampleno --intent given and no matching agent transcript found, orintent extraction disabled in config), andrun.automatic_skipslists it; - the review gate and the final outcome carry a line that says review ran without an intent;
- optionally, the push hook output prints a one-line warning when a gate push starts a run with no intent.
Related
- #402 - an
--intentgiven after a hook-registered run is dropped without a warning (the silent-drop case; this report is the no-intent case). - #969 / #975 - qualified outcome for automatic
prandciskips. - #876 - configuring transcript roots (same inference path; not about the missing warning).
Source: kunchenguid/no-mistakes