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

Author: zaknaCreated Sep 21, 2026Updated Sep 21, 2026
Labelsbugready-for-pr

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

  1. A gated repository with no recent agent transcript for it (for example a fresh repository under /tmp with a local bare remote), and a branch with one commit.
  2. git push no-mistakes <branch> Output: * Pipeline started / Run no-mistakes to review. - no mention of intent.
  3. After the run finishes: no-mistakes axi status and no-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-skips

Intent step log:

scanning recent agent transcripts...
no matching agent transcript found

SELECT 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)

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 intent step records a skip reason (for example no --intent given and no matching agent transcript found, or intent extraction disabled in config), and run.automatic_skips lists 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 --intent given 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 pr and ci skips.
  • #876 - configuring transcript roots (same inference path; not about the missing warning).