Skip to content

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 update

AER 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.

  • agents
  • developer tooling
  • validation
  • release engineering

Contact

Let's build something that ships.

Open to conversations about senior and staff frontend work, AI application engineering, and hard product problems. The fastest route is email.

© 2026 Abdallah Arslan · Atlanta, GA · Remote

React 19 · TypeScript · Tailwind · WebGL · d dark mode · ⌘K commands