@@ -188,10 +188,10 @@ func Generate(ctx context.Context, opts GenerateOptions) (*GenerationAccess, err
188188 }
189189
190190 // Track the current generation step for error reporting
191- failedStepMessage := ""
191+ var failedStep * generate. ProgressStep
192192 trackProgress := func (update generate.ProgressUpdate ) {
193193 if update .Step != nil {
194- failedStepMessage = update .Step . Message
194+ failedStep = update .Step
195195 }
196196 // Forward to user-provided callback if present
197197 if opts .StreamableGeneration != nil && opts .StreamableGeneration .OnProgressUpdate != nil {
@@ -276,18 +276,16 @@ func Generate(ctx context.Context, opts GenerateOptions) (*GenerationAccess, err
276276
277277 if len (errs ) > 0 {
278278 for _ , err := range errs {
279- // Check if it's a ConflictsError - render pretty conflict message
280- var conflictErr * merge.ConflictsError
281- if stderrors .As (err , & conflictErr ) {
282- renderConflictsError (logger , conflictErr )
283- // Don't log the generic error for conflicts - we rendered a nice message
284- continue
279+
280+ if pe := handlePersistentEditsError (logger , err ); pe != nil {
281+ return fmt .Errorf ("could not apply persistent edits for %q: %w" , opts .Language , pe )
285282 }
283+
286284 logger .Error ("" , zap .Error (err ))
287285 }
288286
289- if failedStepMessage != "" {
290- return fmt .Errorf ("generation failed for %q during step %q" , opts .Language , failedStepMessage )
287+ if failedStep != nil {
288+ return fmt .Errorf ("generation failed for %q during step %q" , opts .Language , failedStep . Message )
291289 }
292290
293291 return fmt .Errorf ("failed to generate %q" , opts .Language )
@@ -372,6 +370,22 @@ func GetGenLockID(outDir string) *string {
372370 return nil
373371}
374372
373+ // handlePersistentEditsError checks whether err is a persistent-edits failure.
374+ // If it is a ConflictsError, it renders the instructional message before returning it.
375+ // Returns nil if err is not a persistent-edits error.
376+ func handlePersistentEditsError (logger log.Logger , err error ) error {
377+ var conflictErr * merge.ConflictsError
378+ if stderrors .As (err , & conflictErr ) {
379+ renderConflictsError (logger , conflictErr )
380+ return conflictErr
381+ }
382+ var snapshotRefErr * merge.SnapshotRefError
383+ if stderrors .As (err , & snapshotRefErr ) {
384+ return snapshotRefErr
385+ }
386+ return nil
387+ }
388+
375389// renderConflictsError renders a git-status style error message for merge conflicts.
376390func renderConflictsError (logger log.Logger , conflictErr * merge.ConflictsError ) {
377391 // Build file list with "both modified:" prefix like git status
0 commit comments