Your AI writes PR descriptions from your commit messages. That's the bug. A developer discovered that AI tools generating pull request descriptions from commit messages produce inaccurate summaries because commit messages reflect incomplete intentions while the actual diff shows the complete changes. The engineer built a PR agent that reads the full diff against the base branch instead of commit logs, ensuring the description matches what will actually be merged. TL;DR— Commit messages describe yourintentions. The diff describesreality. They drift apart over the life of a branch, and most AI PR-description tools summarize the wrong one. A good PR agent reads the diff. Here's the design, and a free agent to start from. A reviewer pinged me on a PR last year: "The description says this adds rate limiting, but I'm looking at the diff and it also changes how we hash session tokens. Was that intentional?" It was intentional. I'd done both on the same branch. But my PR description only mentioned the rate limiting — because I'd generated it from my commit messages, and my commit messages were wip , rate limit middleware , fix , fix again , and tweak . The token-hashing change rode in under fix again . The tool that wrote my description faithfully summarized my commits, and my commits faithfully hid half of what I'd actually done. The reviewer caught it. But the whole point of a PR description is that the reviewer shouldn't have to reconstruct the change from the diff themselves. That's the job I was supposed to have done. Here's the core problem with generating PR descriptions from commit messages: a commit message is what you believed you were doing at the moment you typed it. It's written before the change is finished, often mid-thought, frequently as fix or address review comments . It captures intent, badly, at a point in time. The diff against the base branch is different. It's the complete, current, factual statement of what will actually change when this merges. Every renamed function, every altered return shape, every migration, every accidental console.log — all of it is in the diff, and none of it lies, because the diff is the thing being merged. When an AI tool paraphrases your commit messages, it's summarizing a summary — one written hastily, by you, before you were done. Garbage in, plausible-sounding garbage out. The description reads fine. It's just not true. The fix is almost embarrassingly simple to state: have the agent read git diff