[stickies-v](https://bitcoin.stackexchange.com/users/129640/stickies-v) pointed out in a comment that the code calculating the progress increase per hour is in [`ModalOverlay::tipUpdate()`](https://github.com/bitcoin/bitcoin/blob/ce3b75690d10426e97d087ca600140a19bf180b7/src/qt/modaloverlay.cpp#L90-L117).

Basically, it does as would be expected to find the percent change of a quantity:

1. Milliseconds elapsed between first and sample blocks:<br>
**Δt = t_FirstBlock - t_SampleBlock**

2. How many milliseconds faster the sample block processed than the first block:<br>
**Δprogress = t_FirstBlockProcess - t_SampleBlockProcess**

3. Gives:<br>
**(% progress per hour) = Δprogress / (Δt × 1000 × 3600)**,

where (1000 × 3600) = milliseconds in 1 hour.

<sup>Actually, Δt and Δprogress are both negative numbers, but their ratio in step 3 above is positive.</sup>