Engine 19.0.0rc597 · Reader 9.0.0rc656 · Development snapshot
Recorded work time is the clock time covered by one person's admitted work records. Ghost Observatory combines intervals recorded by systems, reported by the person or left unclassified. Where two records cover the same time, that time contributes once to person_days.work_sec.
The interval-union calculation
Let Ij be each work interval the Engine can place on this person's clock, clipped to the relevant day and window. Let |I| mean its length in seconds.
W = |⋃j Ij|
O = Σj |Ij| − W
work_sec. Add the separate interval lengths and subtract that combined coverage to obtain O, stored as overlap_sec. This excess includes overlaps within a source and across sources.Time stated without an admissible clock position is stored separately in unplaced_sec. A duration can support an interval that the source actually locates; it cannot by itself establish an invented start and end. Source-specific fields such as system_recorded_sec and self_reported_sec each hold their own interval union. Those unions can overlap. The combined work_sec counts that shared clock time once while preserving the separate source measures. Screen observations contribute to screen_observed_sec, outside that work total.
Two one-hour records cover 90 minutes
On one UTC day, a system records work from 09:00 to 10:00, while a person reports work from 09:30 to 10:30. A desktop record covers 10:30 to 11:00 as screen time. Another record states five minutes of work without a clock position.
| Quantity | Seconds | Meaning |
|---|---|---|
work_sec | 5,400 | 09:00–10:30, counted once |
overlap_sec | 1,800 | 09:30–10:00 appears in both work records |
system_and_reported_sec | 1,800 | The clock interval both source classes cover |
system_only_sec | 1,800 | 09:00–09:30 |
reported_only_sec | 1,800 | 10:00–10:30 |
screen_observed_sec | 1,800 | Desktop screen coverage, separate from work |
unplaced_sec | 300 | The five minutes without a clock position |
Each work source reports 3,600 seconds, but their combined coverage is 5,400 seconds. Adding the source totals would count the shared half-hour twice. The five unplaced minutes and the desktop screen interval remain separate quantities. Screen coverage can include idle time and does not establish work activity.
Comparing with a schedule
If the person's planned hours are 09:00–10:00, scheduled_sec is 3,600 and outside_schedule_sec is 1,800. Reader displays 100 × 5,400 ÷ 3,600 = 150.0% of planned time. That percentage is presentation arithmetic over recorded work and scheduled hours. It describes source coverage, not all work actually done, productivity or measured capacity utilization.
Schedules come from an explicitly assigned employee calendar, or the sole declared organization calendar. An event's team label does not assign a calendar. Unavailable or incomplete schedule evidence withholds the comparison; the Engine does not treat every uncovered hour as overtime.
Days, populations and missing values
Work intervals are split at local-day boundaries in run.timezone. person_days contains dated rows and whole-window rows with work_date = NULL. Whole-window rows also account for undated evidence. Use the matching grain rather than adding a window total to its day rows.
Work time is published on person rows. An unknown amount in a relevant work record can make the day's pooled work, overlap and unplaced values NULL; required unknown components also affect the window total. No work records means NULL work time. It does not mean the person did no work. Source-agreement fields require both source classes and known amounts. There is no statistical sample-size floor for these interval lengths.
Where Reader shows the calculation
People → Work time per day, #people/rhythm, shows person/day coverage. People → Work time vs planned, #people/schedule, shows schedules, recorded time, outside-schedule time and source agreement. Reader reads the published totals; filtering to one person does not derive new totals from the visible bars.
Published results
These measures describe the published person_days results in the stated development snapshot. Keep the evidence class and eligible population visible when comparing recorded time.