diff --git a/src/resources/extensions/sf/workflow-helpers.js b/src/resources/extensions/sf/workflow-helpers.js index e3acc68fd..ead7d4bb0 100644 --- a/src/resources/extensions/sf/workflow-helpers.js +++ b/src/resources/extensions/sf/workflow-helpers.js @@ -69,12 +69,16 @@ export async function checkNeedsReassessment(base, mid, _state, _prefs) { const hasIncomplete = slices.some((s) => s.status !== "complete"); if (completedSliceIds.length === 0 || !hasIncomplete) return null; const lastCompleted = completedSliceIds[completedSliceIds.length - 1]; - const assessmentFile = resolveSliceFile( - base, - mid, - lastCompleted, - "ASSESS", - ); + // Try both "ASSESSMENT" (canonical, e.g. S03-ASSESSMENT.md) and + // the legacy "ASSESS" suffix. Without the ASSESSMENT branch the + // dispatcher re-dispatched reassess-roadmap indefinitely because + // resolveFile's pattern (`${idPrefix}-.*-${suffix}.md`) requires + // at least one char before `-ASSESS`, so `S03-ASSESSMENT.md` + // never matched suffix "ASSESS". Witnessed 2026-05-17 on + // M010/S03 — 70+ degenerate iterations. + const assessmentFile = + resolveSliceFile(base, mid, lastCompleted, "ASSESSMENT") ?? + resolveSliceFile(base, mid, lastCompleted, "ASSESS"); if (assessmentFile && existsSync(assessmentFile)) return null; return { sliceId: lastCompleted }; }