Skip to content

v1.35.0 ·

The report that said nothing was wrong

aidlc amend refused a Reopens: line that named the phase you were standing in, with "a reopen moves backwards". On inbox-intake-bar, in testing, a one-line criterion fix therefore reopened requirements, design, implementation and testing.

The roadmap item asked for a way to skip the reopen when a correction is confined to the current phase, and pointed at the impact report as evidence. Reading the code and re-running the command on 2026-09-27 turned up three things it did not know.

First, Reopens: none already existed, added eight days before the incident. It records the amendment and reopens nothing. Nothing pointed at it: the error did not mention it and no skill or doc described it.

Second, it was taken on the author's word. No check stood behind it, which is exactly the "skip the reopen on the operator's say-so" path the item ruled out.

Third, the impact report was wrong. It had said no citation of the retired criterion existed outside the requirements, and the item repeated that. In fact the instance's own design.md cited it, and design was a completed phase. The walk resolves a bare criterion id by a cross-instance uniqueness rule, so once a second instance defined the same id, the citation was dropped as ambiguous.

What changed

The first change was not to the reopen rule. A bare id inside an instance's own files now means that instance, because there is no other instance it could mean. Test files keep the stricter rule. Building on the old report would have produced the failure the amendment protocol exists to stop: a completed phase quietly disagreeing with the requirements.

Then aidlc amend checks every reopen against the citations. Any Reopens:, none included, is refused with a new error code, uncovered-citation, if it would leave a completed phase still citing a retired criterion. The refusal names each phase with its count and prints the Reopens: it would accept. No flag skips it, and neither --override nor --confirm does.

Naming the current phase is now legal and means the same as none, since that is what people type when a correction belongs to the phase they are in. --impact ends with a verdict line, --json carries a coverage object, and the suggested reopen never names a phase the write path would refuse. No state format or config key changes.

Why this way

Documenting Reopens: none would have been the cheapest fix. I rejected it because the author's word is the thing a tired operator will give.

The original design forbade the citation walk from choosing what gets reopened, because a destructive write should not depend on scanning prose. That still holds. The walk can now stop a write and never cause one. The worst a false match can do is ask for a wider reopen than needed, which is what every amendment cost before.

The check ran on its own instance: a second amendment tried to reopen too little, was refused, and named the phase it had to reach.

What it changes for you

An amendment that declared Reopens: none while a completed phase still cited the retired id was accepted before and is refused now. That is the point.