Overall I agree with the approach, but just wondering, why do the first point if you are already doing the last two?
> * Use the issue id at the start of every commit message for that issue
> * Use a single branch per issue, whose name also starts with the issue id
>* Use a single PR to merge that branch and close the issue
To me the noise at the start of every message is unnecessary, and given a lot of interfaces only display 80 chars of the message by default, it's not negligible.