Fission-AI/OpenSpec · error · Error
The change specs changed while archive was awaiting…
Error message
The change specs changed while archive was awaiting confirmation.
What it means
Thrown after the confirmation prompt when the set of spec updates recomputed from the change directory differs in size from the set prepared before the prompt. Means the change's delta files themselves changed (added or removed spec deltas) while waiting for confirmation, so the pre-prompt proposal no longer matches the change's actual content and must not be applied.
Solutions
- Re-run the archive after the change specs stabilize
- Review the deltas that changed and confirm they are intentional
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at src/core/archive.ts:1531 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of Fission-AI/OpenSpec@6926ccb18a (2026-08-25).
Data as JSON: /api/errors/1f891143c776a7c4.
Report an issue: GitHub.
Appendix: source
Thrown at src/core/archive.ts:1531
// The confirmation may stay open while another editor changes a main
// spec. Never apply the proposal built before the prompt to a newer
// baseline: in particular, a stale retirement decision must not
// delete a requirement added while the prompt was waiting.
if (prepareError === undefined) {
try {
const currentRetirementMarker = readRetireCapabilitiesMarker(changeDir);
if (
currentRetirementMarker.declared !== retirementMarker.declared ||
currentRetirementMarker.invalidReason !== retirementMarker.invalidReason
) {
throw new Error(
`The ${METADATA_FILENAME} retirement authorization changed while archive was awaiting confirmation.`
);
}
const currentUpdates = await findSpecUpdates(changeDir, mainSpecsDir);
const currentById = new Map(currentUpdates.map((update) => [update.id, update]));
if (currentUpdates.length !== prepared.length) {
throw new Error('The change specs changed while archive was awaiting confirmation.');
}
for (const proposed of prepared) {
const current = currentById.get(proposed.update.id);
if (!current) {
throw new Error(
`The delta for '${proposed.update.id}' changed while archive was awaiting confirmation.`
);
}
if (
(await fingerprintPath(current.source)) !== proposed.sourceFingerprint ||
(await fingerprintPath(current.target)) !== proposed.targetFingerprint
) {
throw new Error(
`Spec inputs for '${proposed.update.id}' changed while archive was awaiting confirmation. ` +
'No files were changed; review the new content and rerun.'
);
}
const rebuilt = await buildUpdatedSpec(current, changeName!, { silent: true });View on GitHub (pinned to 6926ccb18a)