From ef8f22caba516585e7d8d741f0369a51e3286afd Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Wed, 18 Mar 2026 12:06:24 +0900 Subject: [PATCH] fix(boulder-state): treat plans without checkboxes as incomplete (fixes #2648) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GPT/Gemini Prometheus plans sometimes lack markdown checkboxes. Previously getPlanProgress() returned isComplete=true for 0/0, causing /start-work to skip Atlas execution. Now total=0 correctly returns isComplete=false so start-work detects the invalid plan format. 🤖 Generated with assistance of [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode) Co-Authored-By: Claude Opus 4.6 --- src/features/boulder-state/storage.test.ts | 4 ++-- src/features/boulder-state/storage.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/features/boulder-state/storage.test.ts b/src/features/boulder-state/storage.test.ts index e52174cef..a624773b2 100644 --- a/src/features/boulder-state/storage.test.ts +++ b/src/features/boulder-state/storage.test.ts @@ -351,7 +351,7 @@ describe("boulder-state", () => { expect(progress.isComplete).toBe(true) }) - test("should return isComplete true for empty plan", () => { + test("should return isComplete false for plan with content but no checkboxes", () => { // given - plan with no checkboxes const planPath = join(TEST_DIR, "empty-plan.md") writeFileSync(planPath, "# Plan\nNo tasks here") @@ -361,7 +361,7 @@ describe("boulder-state", () => { // then expect(progress.total).toBe(0) - expect(progress.isComplete).toBe(true) + expect(progress.isComplete).toBe(false) }) test("should handle non-existent file", () => { diff --git a/src/features/boulder-state/storage.ts b/src/features/boulder-state/storage.ts index c9ac83993..fd4a2d094 100644 --- a/src/features/boulder-state/storage.ts +++ b/src/features/boulder-state/storage.ts @@ -133,7 +133,7 @@ export function getPlanProgress(planPath: string): PlanProgress { return { total, completed, - isComplete: total === 0 || completed === total, + isComplete: total > 0 && completed === total, } } catch { return { total: 0, completed: 0, isComplete: true }