The transparency choice cuts both ways and is worth stress-testing: when a translated command still fails, the model debugs the bash it wrote while the error text comes from PowerShell it never emitted - cmdlet names and object-pipeline errors that do not match its model of what ran. That can make the retry reasoning worse than an honest failure. Surfacing the translation on failure only (never on success) would keep generation clean while making the error trace coherent. Second, on corpus learning: success by exit status is a weak signal across this particular boundary. grep exits nonzero on no match and scripts branch on that; Select-String succeeds with empty output. A translation can be recorded as SUCCESS while it inverted a branch somewhere downstream. Since you already store provenance, sampling learned entries for semantic equivalence (same matches, same effect) rather than shared exit status would catch that class of poisoning before it compounds.
