Session timer audit: distinguish 40 elapsed minutes from 30 active minutes
Published — UTC

A session from 19:00 to 19:40 lasts 40 minutes by the clock. If it contains a ten-minute pause, a separately defined active-time total may be 30 minutes. Neither number is wrong when its definition is retained.
Record the intervals instead of guessing from a timer
This original example has three intervals on the same date and in the same timezone:
| Interval | Classification | Duration |
|---|---|---|
| 19:00–19:12 | Active in this example | 12 minutes |
| 19:12–19:22 | Pause | 10 minutes |
| 19:22–19:40 | Active in this example | 18 minutes |

Elapsed time is 12 + 10 + 18 = 40 minutes. Defined active time is 12 + 18 = 30. Dividing spending by one duration and labelling it with the other changes the reported rate without changing any transactions.
A timer’s unit is not its reset policy
A game timer may continue through a pause, restart on reconnection or show time since a particular event. Do not assume one of those behaviours. Keep the observed label, start time and any restart event alongside its value.
Python’s duration documentation distinguishes duration arithmetic from date/time objects. The example here deliberately uses one date and offset; cross-midnight or different-offset records need the complete timestamps before subtraction.
Use the boundary you actually chose
A personal stop time based on the wall clock is not extended automatically because a record contains paused minutes. If an accepted round remains unsettled, record that state separately; it is not a reason to erase the original boundary or begin another round.
The same spending produces two different rates
If confirmed spending is 12 units during the original interval, it is 12 ÷ 40 = 0.30 unit per elapsed minute, or 12 ÷ 30 = 0.40 per defined active minute. Neither rate changes the 12-unit total. Label the denominator and keep the transaction boundary identical; a rate without that definition is not comparable with another report.
Two open windows can overlap
Suppose window A is active from 19:00 to 19:20 and window B from 19:10 to 19:30. Adding their durations gives 40 window-minutes. The time during which at least one window is active is only 30 minutes, because the ten-minute overlap is counted once. Both measures can be useful, but only the union of the intervals measures elapsed time with any activity. The number of open windows does not make a clock run twice as long.
Midnight and offsets need full timestamps
From 23:50 on one date to 00:10 on the next is 20 minutes, not a negative duration. In another example, 19:00+08:00 and 12:00+00:00 on the same date are one hour apart: the first timestamp corresponds to 11:00 UTC. Subtracting the displayed clock numbers without their offsets would give the wrong interval.
When the record cannot establish activity
A connected browser tab is not evidence that every second was active play. Use the chosen event definition and recorded intervals; if the pause end is missing, leave the affected duration unresolved. Store full start and end timestamps, timezone offsets, classification and any overlap policy. This makes a timer discrepancy reviewable while preserving the originally chosen stop time.