11import { describe , it , expect } from 'vitest' ;
2- import { resolvePlanningStage , type PlanningStageMetadata } from './planning-stage' ;
2+ import {
3+ resolvePlanningStage ,
4+ type PlanningStageMetadata ,
5+ type PlanningStage ,
6+ } from './planning-stage' ;
37import type { ClarificationMetadata } from './clarification-gate' ;
48
59// ---------------------------------------------------------------------------
@@ -54,16 +58,16 @@ describe('planning-stage', () => {
5458 expect ( result . currentStage ) . toBe ( 'discover' ) ;
5559 } ) ;
5660
57- it ( 'routes clear prompt directly to plan (skip discover + design )' , ( ) => {
61+ it ( 'routes clear prompt to discover (staged default, no skip )' , ( ) => {
5862 const result = resolvePlanningStage ( clearClarification ( ) ) ;
5963
60- expect ( result . currentStage ) . toBe ( 'plan ' ) ;
64+ expect ( result . currentStage ) . toBe ( 'discover ' ) ;
6165 } ) ;
6266
63- it ( 'routes budget-exhausted prompt to plan ' , ( ) => {
67+ it ( 'routes budget-exhausted prompt to discover (staged default) ' , ( ) => {
6468 const result = resolvePlanningStage ( budgetExhaustedClarification ( ) ) ;
6569
66- expect ( result . currentStage ) . toBe ( 'plan ' ) ;
70+ expect ( result . currentStage ) . toBe ( 'discover ' ) ;
6771 } ) ;
6872
6973 it ( 'routes explicit stageHint=design to design' , ( ) => {
@@ -113,7 +117,9 @@ describe('planning-stage', () => {
113117 } ) ;
114118
115119 it ( 'has a description for plan stage' , ( ) => {
116- const result = resolvePlanningStage ( clearClarification ( ) ) ;
120+ const result = resolvePlanningStage ( clearClarification ( ) , {
121+ stageHint : 'plan' ,
122+ } ) ;
117123
118124 expect ( result . stageDescription ) . toContain ( 'Plan' ) ;
119125 expect ( result . stageDescription ) . toContain ( 'implementation' ) ;
@@ -140,7 +146,9 @@ describe('planning-stage', () => {
140146 } ) ;
141147
142148 it ( 'plan → nextStage is undefined (terminal)' , ( ) => {
143- const result = resolvePlanningStage ( clearClarification ( ) ) ;
149+ const result = resolvePlanningStage ( clearClarification ( ) , {
150+ stageHint : 'plan' ,
151+ } ) ;
144152
145153 expect ( result . nextStage ) . toBeUndefined ( ) ;
146154 } ) ;
@@ -168,7 +176,9 @@ describe('planning-stage', () => {
168176 } ) ;
169177
170178 it ( 'has no transition hint for plan stage (terminal)' , ( ) => {
171- const result = resolvePlanningStage ( clearClarification ( ) ) ;
179+ const result = resolvePlanningStage ( clearClarification ( ) , {
180+ stageHint : 'plan' ,
181+ } ) ;
172182
173183 expect ( result . stageTransitionHint ) . toBeUndefined ( ) ;
174184 } ) ;
@@ -194,7 +204,9 @@ describe('planning-stage', () => {
194204 } ) ;
195205
196206 it ( 'recommends technical-planner for plan' , ( ) => {
197- const result = resolvePlanningStage ( clearClarification ( ) ) ;
207+ const result = resolvePlanningStage ( clearClarification ( ) , {
208+ stageHint : 'plan' ,
209+ } ) ;
198210
199211 expect ( result . recommendedAgent ) . toBe ( 'technical-planner' ) ;
200212 } ) ;
@@ -220,26 +232,47 @@ describe('planning-stage', () => {
220232 } ) ;
221233
222234 it ( 'recommends writing-plans skill for plan' , ( ) => {
223- const result = resolvePlanningStage ( clearClarification ( ) ) ;
235+ const result = resolvePlanningStage ( clearClarification ( ) , {
236+ stageHint : 'plan' ,
237+ } ) ;
224238
225239 expect ( result . recommendedSkill ) . toBe ( 'writing-plans' ) ;
226240 } ) ;
227241 } ) ;
228242
229243 // ------------------------------------------------------------------
230- // Backward compatibility
244+ // Staged default behavior
231245 // ------------------------------------------------------------------
232246
233- describe ( 'backward compatibility ' , ( ) => {
234- it ( 'clear prompt produces planReady + plan stage with no intermediate steps ' , ( ) => {
247+ describe ( 'staged default behavior ' , ( ) => {
248+ it ( 'clear prompt starts at discover with design as next stage ' , ( ) => {
235249 const clarification = clearClarification ( ) ;
236250 const result = resolvePlanningStage ( clarification ) ;
237251
252+ expect ( result . currentStage ) . toBe ( 'discover' ) ;
253+ expect ( result . nextStage ) . toBe ( 'design' ) ;
254+ expect ( result . stageTransitionHint ) . toBeTruthy ( ) ;
255+ } ) ;
256+
257+ it ( 'stageHint=plan still jumps directly to plan (caller override)' , ( ) => {
258+ const result = resolvePlanningStage ( clearClarification ( ) , {
259+ stageHint : 'plan' ,
260+ } ) ;
261+
238262 expect ( result . currentStage ) . toBe ( 'plan' ) ;
239263 expect ( result . nextStage ) . toBeUndefined ( ) ;
240264 expect ( result . stageTransitionHint ) . toBeUndefined ( ) ;
241265 } ) ;
242266
267+ it ( 'stageHint=design advances to design (caller override)' , ( ) => {
268+ const result = resolvePlanningStage ( clearClarification ( ) , {
269+ stageHint : 'design' ,
270+ } ) ;
271+
272+ expect ( result . currentStage ) . toBe ( 'design' ) ;
273+ expect ( result . nextStage ) . toBe ( 'plan' ) ;
274+ } ) ;
275+
243276 it ( 'all fields are present in the return type' , ( ) => {
244277 const result : PlanningStageMetadata = resolvePlanningStage ( ambiguousClarification ( ) ) ;
245278
@@ -251,5 +284,45 @@ describe('planning-stage', () => {
251284 expect ( result ) . toHaveProperty ( 'recommendedSkill' ) ;
252285 } ) ;
253286 } ) ;
287+
288+ // ------------------------------------------------------------------
289+ // Stage progression metadata
290+ // ------------------------------------------------------------------
291+
292+ describe ( 'stageProgression' , ( ) => {
293+ it ( 'discover stage shows no completed, discover current, design+plan remaining' , ( ) => {
294+ const result = resolvePlanningStage ( ambiguousClarification ( ) ) ;
295+
296+ expect ( result . stageProgression ) . toEqual ( {
297+ completedStages : [ ] ,
298+ currentStage : 'discover' ,
299+ remainingStages : [ 'design' , 'plan' ] ,
300+ } ) ;
301+ } ) ;
302+
303+ it ( 'design stage shows discover completed, design current, plan remaining' , ( ) => {
304+ const result = resolvePlanningStage ( clearClarification ( ) , {
305+ stageHint : 'design' ,
306+ } ) ;
307+
308+ expect ( result . stageProgression ) . toEqual ( {
309+ completedStages : [ 'discover' ] ,
310+ currentStage : 'design' ,
311+ remainingStages : [ 'plan' ] ,
312+ } ) ;
313+ } ) ;
314+
315+ it ( 'plan stage shows discover+design completed, plan current, no remaining' , ( ) => {
316+ const result = resolvePlanningStage ( clearClarification ( ) , {
317+ stageHint : 'plan' ,
318+ } ) ;
319+
320+ expect ( result . stageProgression ) . toEqual ( {
321+ completedStages : [ 'discover' , 'design' ] ,
322+ currentStage : 'plan' ,
323+ remainingStages : [ ] ,
324+ } ) ;
325+ } ) ;
326+ } ) ;
254327 } ) ;
255328} ) ;
0 commit comments