A zero exit code is not evidence: what changed in AER 3.1
3 min read
AER 3.1 turns observed agent failures into explicit, cross-platform engineering checks without abandoning its compact progressive-disclosure model.
A zero exit code proves that a process ended. It does not prove that the process inspected the intended files, exercised the requested workflow, or established the state it was supposed to establish. AER 3.1.0 makes that distinction explicit.
The benchmark found a proof gap
The release began with a one-observation-per-cell benchmark of AER 3.0.1. It found concrete cases where utilities completed without checking the intended files and where UI validation proved structure instead of the requested workflow. That sample is enough to identify defects; it is not enough to estimate a general treatment effect.
I treated those observations as regression targets. The goal was not to add more prose. It was to make checks state what they actually evaluated, expand the surfaces they can inspect, and require evidence of the requested state transition.
Checks now say what happened
A skipped, malformed, or out-of-scope check can no longer present itself as an ordinary pass. Tools now distinguish APPLICABLE-PASS, ADVISORY, NOT-APPLICABLE, and ERROR, and exit code zero is only one part of the evidence.
- file-size-guard.mjs now works as a CLI and as documented hook input compatible with Codex, while remaining advisory by default.
- contrast-check.mjs accepts named batch input, reports exact pairs, uses deterministic exit codes, explains reruns, and states its scope limits.
- slop-scan.mjs handles root-level HTML and JavaScript, source trees, explicit files, roots, and globs, excludes generated artifacts, and returns category plus file:line evidence.
- Validation must assert the requested state transition; exit code zero by itself is not proof.
UI evidence is three separate claims
Visual quality, functional behavior, and accessibility are different claims. A screenshot can support the first while proving almost nothing about the other two. AER 3.1 separates them so one green artifact cannot stand in for the full interface.
- Visual composition and the requested form factor.
- Functional and responsive behavior.
- Accessibility, safety, focus, motion, contrast, and recovery.
The functional evidence now includes desktop and narrow-mobile invariants: no page-level overflow, reachable navigation, honest controls, keyboard behavior, focus return, and a visible workflow outcome. Greenfield validation must also enumerate untracked output so a clean diff cannot hide an entire untracked implementation.
Prototype guidance without dogma
For a simple single-screen prototype, AER now recommends native HTML, CSS, and JavaScript unless a framework provides a concrete benefit. That is not an anti-framework rule. Maintained, stateful, or extensible applications still justify frameworks; the point is to stop paying complexity rent before the application needs it.
What stayed intact
The strongest existing guidance remains: safe rendering, corrupt-storage recovery, keyboard equivalents, focus management, reduced motion, contrast, recovery paths, and progressive disclosure. The release changes weak checks and ambiguous evidence without expanding the compact kernel into a wall of instructions.
How 3.1.0 was validated
- 44 deterministic release tests.
- 24 provider-free research tests with zero model calls.
- Linux and Windows release jobs.
- CodeQL analysis.
- 87-file source validation.
- 36 runtime load plans.
- Fresh-build distribution consistency.
- Packed global-install smoke testing.
Both Claude Code and Codex distributions were regenerated from the canonical source. The npm package is current at @aaarslan/aer@3.1.0. The v3.1.0 Git tag exists, but the GitHub Release must be created separately before the releases channel is described as complete.
This is an evidence-informed and deterministically validated release, not a comparative efficacy result. The paid repeated randomized A/B study has been designed but not run, so I am not claiming that 3.1 is statistically proven better than 3.0.1.
Upgrade
npm install --global @aaarslan/aer@latest
aer update --dry-run
aer updateAER requires Node.js 24 or newer. Existing manual invocations of file-size-guard.py and slop-scan.sh should move to their .mjs replacements. The implementation and migration details are in PR #8; the project card links to the merged work and current npm package.