Because they used a signed integer type for rep, therefore it's not capped at 0.
(And hypothesizing that because of lazyness and simplicity rep substraction performs just a substraction instead of a capped substraction).
rep := rep + -penalty;
rep := (rep + -penalty > 1) ? rep + -penalty : 1;
Here using a simple substraction has the advantage of easier detection of arithmetic overflow. But I doubt it's using raw/machine numeric types. Because it's Ruby - I guess it auto promotes to arbitrary precision. But it was supposed to be C#. There are raw/machine numeric types in C#.
I don't think the Q was about technical details.
I agree. However, in the particular case of Codidact1, many current - interim? - design decisions are tightly intimate with the corresponding technical implication, because they actually predate Codidact2 itself, in some cases by many years. I could guess therefore, some of those might been taken probably with simplicity in mind.
1: This Codidact occurrence, you can read as Qpixel.
2: Codidact in the broad sense. Post-"Dear Stack Exchange, Inc.,".