@@ -91,6 +91,7 @@ class ChallengePhaseHelper {
9191 timelineTemplateId
9292 ) ;
9393 const { phaseDefinitionMap } = await this . getPhaseDefinitionsAndMap ( ) ;
94+ const challengePhaseIds = new Set ( _ . map ( challengePhases , "phaseId" ) ) ;
9495
9596 // Ensure deterministic processing order based on the timeline template sequence
9697 // DB returns phases ordered by dates, which can cause "fixedStartDate" logic below
@@ -107,9 +108,18 @@ class ChallengePhaseHelper {
107108 const phaseFromTemplate = timelineTemplateMap . get ( phase . phaseId ) ;
108109 const phaseDefinition = phaseDefinitionMap . get ( phase . phaseId ) ;
109110 const newPhase = _ . find ( newPhases , ( p ) => p . phaseId === phase . phaseId ) ;
111+ const templatePredecessor = _ . get ( phaseFromTemplate , "predecessor" ) ;
112+ // Prefer template predecessor only when that phase exists on the challenge, otherwise keep the stored link.
113+ const resolvedPredecessor = _ . isNil ( phaseFromTemplate )
114+ ? phase . predecessor
115+ : _ . isNil ( templatePredecessor )
116+ ? null
117+ : challengePhaseIds . has ( templatePredecessor )
118+ ? templatePredecessor
119+ : phase . predecessor ;
110120 const updatedPhase = {
111121 ...phase ,
112- predecessor : phaseFromTemplate && phaseFromTemplate . predecessor ,
122+ predecessor : resolvedPredecessor ,
113123 description : phaseDefinition . description ,
114124 } ;
115125 if ( updatedPhase . name === "Post-Mortem" ) {
@@ -157,6 +167,9 @@ class ChallengePhaseHelper {
157167 const predecessorPhase = _ . find ( updatedPhases , {
158168 phaseId : phase . predecessor ,
159169 } ) ;
170+ if ( _ . isNil ( predecessorPhase ) ) {
171+ continue ;
172+ }
160173 if ( phase . name === "Iterative Review" ) {
161174 if ( ! iterativeReviewSet ) {
162175 if ( _ . isNil ( phase . actualStartDate ) ) {
0 commit comments