The algorithm is here:

https://github.com/tosdr/edit.tosdr.org/blob/master/app/models/service.rb#L88-L109

Basically, a blocker counts as 3 bad points, and then it's about the balance of number of good points minus number of bad points.
If the balance is below -10, you get an E.
If not but you do have at least one blocker, it's a D.
If you have no blockers and your balance is between -10 and -4, it's C.
If you have no blockers and your balance is above -4 and you have at least one bad point, it's a B.
Only if you have no blockers and no bad points at all, it's an A.