Map

Acceptance Criteria IDs (ACIDs)

Wiki conceptspec-driven-developmentacceptance-criteriaai-coding โ†ณ show in map Markdown
title
Acceptance Criteria IDs (ACIDs)
type
concept
summary
Stable numeric tags on requirements that agents reference back from code and tests, turning the spec into a navigable index of where requirements live
tags
spec-driven-development, acceptance-criteria, ai-coding
created
2026-05-03
updated
2026-05-16

Acceptance Criteria IDs are short stable identifiers attached to each item in a list of acceptance criteria โ€” AUTH-1, AUTH-2-1, ENG-3 โ€” used as bidirectional anchors between the spec and the code, tests, and review notes that satisfy them. Coined in the specsmaxxing post on acai.sh, where the convention emerged when a subagent unilaterally started numbering requirements and referencing them in inline comments.

The pattern is older than the name โ€” Gherkin scenarios, EARS-formatted requirements, and aerospace-style traceability matrices all produce something like ACIDs. What's new in 2026 is using them as the pivot point between LLM-generated code and a human-curated spec, with tooling that tracks "acceptance coverage" the way coverage tools track "test coverage."

The shape

A spec organized by ACIDs has three properties:

  1. Stable numbering. Each requirement gets an ID that doesn't change when other requirements are added, reordered, or removed. Components or sections (AUTH, BILLING, ENG) namespace them; numbers within a section are append-only.
  2. Code-side references. Implementations cite the ACID they satisfy, typically as inline comments โ€” // AUTH-1 โ€” though anything the tooling can grep for works.
  3. State tracking. Each ACID has a status: drafted, assigned, in-progress, completed, accepted, rejected, deprecated. State lives outside the source file (the acai.sh dashboard is one design; a JSON sidecar or git-notes layer would be another).

Hierarchical sub-IDs (AUTH-2-1) handle "this requirement has a clarifying sub-requirement." Adjacent metadata (AUTH-2-note) carries cross-references and design rationale without polluting the requirement text.

Why it works for LLM-assisted code

Three properties matter once an agent is writing the implementation:

  • Reviewability shifts from files to requirements. Instead of reading a 600-line PR file-by-file, you check off ACIDs and ask "is the code that claims to satisfy AUTH-3 actually doing that?" The reviewer's mental model and the reviewable artifact match.
  • Re-prompting becomes mechanical. "Implement AUTH-2-1" is a tighter prompt than "make sure tokens are validated correctly." The spec is the prompt; iteration loops back to the spec rather than to free-form follow-ups in chat.
  • Coverage gaps are visible. ACIDs without code references are unimplemented; ACIDs without test references are unverified. This is a cheap, deterministic check that doesn't depend on the LLM grading itself.

The tight coupling between spec and code that ACIDs introduce is the thing the specsmaxxing author initially flinched at โ€” every spec change forces a code refactor. The reframe is that this is the discipline you wanted: if the spec changes and the code doesn't follow, the spec was just decoration.

Why it works for humans too

ACIDs predate LLMs by decades. Aerospace and medical-device development use requirement traceability โ€” every line of safety-critical code traces back to a numbered requirement, and audit tooling enforces it. ISO 26262 (automotive), DO-178C (avionics), IEC 62304 (medical software) all assume this convention. The novelty in the LLM-coding context isn't the technique; it's that the cost of maintaining the traceability has collapsed because the agent does the bookkeeping.

Tradeoffs the specsmaxxing piece calls out

  • Re-alignment cost. Renaming an ACID or reordering numbering breaks all code references. deprecated and replaced_by flags inside the spec are one mitigation; treating ACIDs as never-reused (append-only) is another.
  • Granularity discipline. Specs at "API endpoint accepts JSON" granularity produce useful ACIDs; specs at "button is blue" granularity produce noise. The acai.sh advice is to keep ACIDs to behavior and constraints โ€” leave UI nail-polish out.
  • Format lock-in. Once code comments reference ACIDs by ID, the spec format becomes load-bearing. Switching from feature.yaml to OpenSpec or EARS without a migration script orphans every reference.

Adjacent conventions

  • EARS syntax (Easy Approach to Requirements Syntax) โ€” a constrained natural-language format ("When <trigger>, the <system> shall <response>"). Compatible with ACIDs but separate; EARS is about how to phrase a requirement, ACIDs are about how to address one.
  • Gherkin (Given/When/Then) โ€” same shape: addressable scenarios that test code references back to. ACIDs generalize this past the test-frame-only context.
  • Issue tracker IDs โ€” JIRA-1234 referenced in commit messages is the same idea at a coarser granularity. ACIDs operate inside a single feature spec rather than across a whole project.
  • TODO comments with ticket links โ€” informal, lossy version of the same pattern. ACIDs differ in being part of the spec rather than annotations on code.

Tools in this space

  • acai โ€” feature.yaml + CLI + dashboard; the canonical implementation as of 2026.
  • GitHub SpecKit โ€” different shape (vibe-coding-with-prompts), no ACID concept.
  • OpenSpec, Kiro, Traycer.ai โ€” covered in the specsmaxxing comparison; varying degrees of structure.

See also