Generated release notes fail when they treat narrative bullets as contracts that users can follow during an upgrade. A model can inventory commits, paths, and symbols, but it cannot honestly promise a migration path. This workflow keeps those jobs in separate files and rejects changelog text that smuggles unsigned promises. The useful split is mechanical rather than stylistic. Compile a facts file from git history and public symbols, then let a reviewer own every upgrade claim in a second fil...