968477ea59
PhraseQuery, PhraseSelf and the knowledge branch each wrote the same four steps: call the model, parse the contract, pick whichever of the two errors fired, wrap it with the path name. That is generate() now. Same fallbacks, same errors, same text to the owner. Two silences made visible, log only. A model that parsed cleanly and put an empty string in "response" left no trace: the nudge went out in template Russian and the reminder read its own text out, and nothing recorded that the model had answered with nothing. Both say so now.