Question: What is the best way to go through a database of my games and have the computer generate a FEN string as well as the next move any time I make an error greater than, say, a minor piece loss?

I've looked at SCID a bit and am not sure if I can do it there. I also doubt I could do it with stockfish on the command line. Pointers?

Answer: 
You may want to do it yourself. Please take a look at a PGN annotation project on Github:

* <https://github.com/fsmosca/chess-artist>

The source code is easy to follow.

* To get the engine evaluation, you have:

> 
> engBestMove, engBestScore, complexityNumber, moveChanges, pvLine = self.GetSearchScoreBeforeMove(gameNode.board().fen(), side)
> 
> 
> 

* To check whether a move you play is a blunder:

> 
> if abs(engBestScore) > 3.0:
> 
> 
> 

* To print FEN:

> 
> fen = gameNode.board().fen()
> 
> 
> 

* To print FEN and whatever you want to the console, follow the implementation in:

> 
> def WriteNotation(self, side, fmvn, sanMove, bookMove, posScore,
>  isGameOver, engMove, engScore, complexityNumber,
>  moveChanges, pvLine, threatMove):
> 
> 
>
You can count on crafty. Its annotate or annotateh command, allows you to 
automatically comment games with variations. You can specify wich side to 
analyze; how much difference on engine evaluation (after/before) will trigger an annotation an also the time invested analyzing each position. 

After that, SCID, Chesspad, Compoches or any other software for visualizing 
pgn gamescores will allow you to review your game and most important than 
Anki, to anotate your thoughts.

Here I reproduce the pertinent fragment from a help doc about crafty commands:

```
annotate | annotateh <filename> <colors | name> <moves> <margin> <time>

```

This command is used to annotate (make comments in) a game that has already 
been played; annotate produces a file with the .can extension added to the 
original name. This file will contain pure ascii information from the 
annotation pass.

The annotateh command will produce an htm file.