@@ -491,14 +491,25 @@ func stripPointersAndOAIGen(opts *FlattenOpts) error {
491491// pointer and name resolution again.
492492func stripOAIGen (opts * FlattenOpts ) (bool , error ) {
493493 debugLog ("stripOAIGen" )
494+ // Ensure the spec analysis is fresh, as previous steps (namePointers, etc.) might have modified refs.
495+ opts .Spec .reload ()
496+
494497 replacedWithComplex := false
495498
496499 // figure out referers of OAIGen definitions (doing it before the ref start mutating)
497- for _ , r := range opts .flattenContext .newRefs {
500+ // Sort keys to ensure deterministic processing order
501+ sortedKeys := make ([]string , 0 , len (opts .flattenContext .newRefs ))
502+ for k := range opts .flattenContext .newRefs {
503+ sortedKeys = append (sortedKeys , k )
504+ }
505+ sort .Strings (sortedKeys )
506+
507+ for _ , k := range sortedKeys {
508+ r := opts .flattenContext .newRefs [k ]
498509 updateRefParents (opts .Spec .references .allRefs , r )
499510 }
500511
501- for k := range opts . flattenContext . newRefs {
512+ for _ , k := range sortedKeys {
502513 r := opts .flattenContext .newRefs [k ]
503514 debugLog ("newRefs[%s]: isOAIGen: %t, resolved: %t, name: %s, path:%s, #parents: %d, parents: %v, ref: %s" ,
504515 k , r .isOAIGen , r .resolved , r .newName , r .path , len (r .parents ), r .parents , r .schema .Ref .String ())
@@ -580,14 +591,35 @@ func stripOAIGenForRef(opts *FlattenOpts, k string, r *newRef) (bool, error) {
580591 replacedWithComplex = true
581592 }
582593 }
594+
595+ // update parents of the target ref (pr[0]) if it is also a newRef (OAIGen)
596+ // This ensures that if the target is later deleted/merged, it knows about these new referers.
597+ for _ , nr := range opts .flattenContext .newRefs {
598+ if nr .path == pr [0 ] && nr .isOAIGen && ! nr .resolved {
599+ for _ , p := range pr [1 :] {
600+ if ! slices .Contains (nr .parents , p ) {
601+ nr .parents = append (nr .parents , p )
602+ }
603+ }
604+ break
605+ }
606+ }
583607 }
584608
585609 // remove OAIGen definition
586610 debugLog ("removing definition %s" , path .Base (r .path ))
587611 delete (opts .Swagger ().Definitions , path .Base (r .path ))
588612
589613 // propagate changes in ref index for keys which have this one as a parent
590- for kk , value := range opts .flattenContext .newRefs {
614+ // Sort keys to ensure deterministic update order
615+ propagateKeys := make ([]string , 0 , len (opts .flattenContext .newRefs ))
616+ for k := range opts .flattenContext .newRefs {
617+ propagateKeys = append (propagateKeys , k )
618+ }
619+ sort .Strings (propagateKeys )
620+
621+ for _ , kk := range propagateKeys {
622+ value := opts .flattenContext .newRefs [kk ]
591623 if kk == k || ! value .isOAIGen || value .resolved {
592624 continue
593625 }
0 commit comments