Authored by
Philip Gundy — economist & data scientist, several years in California wage-and-hour litigation analytics at an Am Law 100 firm.
Written to be cited
Every figure traces to a section here — for expert reports, meet-and-confer briefings, and class-certification work.
Current
Updated August 23, 2026 — the date moves whenever a threshold, formula, or assumption changes.
The analysis computes meal and rest premium exposure, the § 226 wage-statement and § 203 waiting-time estimates, the PAGA base civil penalty, and daily overtime/double-time hours. Figures in the current analysis scope exclude: the PAGA higher tiers (the base civil penalty per deficient pay period IS computed — only the subsequent-violation, malice, and uncured tiers are excluded, since they turn on facts not in the timekeeping record — see PAGA under Claims, limitations & penalties), weekly overtime (daily OT/DT identification is included), 6th/7th consecutive-workday premiums, split-shift premiums, reporting-time pay, on-duty meal agreements, multi-rate employees, Donohue rounded-time presumption detection, and industry-specific exemptions.
Every excluded item is listed here so the scope of each figure is explicit.
A worked example — from punches to premium
How these rows were validated, de-duplicated, and grouped into the three shifts below is walked stage by stage on Data processing.
Simulated data: three employees on one workday, 2025-03-03, all clocking in at 08:00 — one shift each, average hourly rate $21. Their punches produce one, two, and two Time Segments, and each stage below shows the columns the analysis computes on those rows.
The Time Segments, row by row
Each clock-in/out pair is one Time Segment. For every segment the analysis computes its length, the total length of the shift it belongs to, and the gap that follows it before the employee’s next segment — a gap below the split-shift threshold keeps the segments in one shift and becomes a meal-break candidate:
| employee_id | clock_in | clock_out | Segment length | Shift duration | Gap (meal break) |
|---|---|---|---|---|---|
| 101 | 08:00 | 13:30 | 5 h 30 m | 5.5 h | — |
| 102 | 08:00 | 11:30 | 3 h 30 m | 7.5 h | 30 m |
| 102 | 12:00 | 15:30 | 3 h 30 m | 7.5 h | — |
| 103 | 08:00 | 13:10 | 5 h 10 m | 8.1 h | 22 m |
| 103 | 13:32 | 16:06 | 2 h 34 m | 8.1 h | — |
The shifts — spans set the meal requirement
Segments group into one shift per employee. Every shift duration here is 5 hours or more (and under 10), so each shift requires exactly one meal period:
| employee_id | Shift start | Shift end | Shift duration | Meal periods required |
|---|---|---|---|---|
| 101 | 08:00 | 13:30 | 5.5 h | 1 |
| 102 | 08:00 | 15:30 | 7.5 h | 1 |
| 103 | 08:00 | 16:06 | 8.1 h | 1 |
Meal detection — each required meal, classified
A required meal is compliant when it begins by 5 hours elapsed and runs at least 30 minutes — compared at exact recorded minutes, never rounded (Donohue). A qualifying shift with no recorded meal is “No meal period recorded”:
| employee_id | Meal period | Meal start | Meal end | Started (elapsed) | Duration | Classification |
|---|---|---|---|---|---|---|
| 101 | 1st | — | — | — | — | Missing |
| 102 | 1st | 11:30 | 12:00 | 3 h 30 m | 30 m | Compliant |
| 103 | 1st | 13:10 | 13:32 | 5 h 10 m | 22 m | Short · Late |
The classification and meal period read exactly as the app’s own meal table renders them (a short-and-late meal is “Short · Late”, with the meal period in its own column). 102 starts under the 5-hour deadline at a full 30 minutes; 103 starts 10 minutes past it and runs 8 minutes short. 101’s shift — over 5 and up to 6 hours with no meal — is additionally flagged Waiver-eligible; the premium stage shows both treatments.
Premium math — the per-workday cap and the waiver setting
A workday carries at most one meal premium regardless of how many meals violate, valued at one hour of pay. Employee 103’s short & late workday carries one. Employee 101’s no-meal workday counts under the default treatment — waivers are assumed not to exist — and is excluded when the case-level waiver setting is on:
default treatment: 2 premium workdays × 1 hour × $21 = $42
waiver setting on: 1 premium workday × 1 hour × $21 = $21
Rest breaks — estimated from the meal record
Rest breaks are rarely punched, so no rest figure is measured — the analysis estimates instead. All three shifts are rest-qualifying (101 owes 1 rest break; 102 and 103 owe 2 each), and under the default mode each employee’s own meal violation rate becomes their rest premium estimate per qualifying shift:
| employee_id | Meal violation rate | Rest-qualifying shifts | Rest premium estimate |
|---|---|---|---|
| 101 | 100.0% | 1 | 1.0 |
| 102 | 0.0% | 1 | 0.0 |
| 103 | 100.0% | 1 | 1.0 |
Rates reflect the default meal treatment (101’s Waiver-eligible shift counted); with the waiver setting on, 101’s rate is 0.0% and the estimate drops to 1.0 workday.
estimated rest exposure = 2 rest premium workdays × 1 hour × $21 = $42
From premium workdays to pay periods
Penalty estimates count pay periods per employee. Each premium workday above sits in its employee’s bi-weekly pay period, and a pay period holding at least one premium workday — its premium assumed unpaid — is deficient. Rest premium workdays drive deficiency the same way (unchanged here, since 101 and 103 already carry meal premiums). Under the default treatment employees 101 and 103 each carry one deficient pay period; with the waiver setting on, only 103 does.
The § 226 schedule, the cap, and the window — an employee with history
Penalty arithmetic needs history, so extend the picture with an employee on the same bi-weekly calendar carrying 52 deficient pay periods across two years of data, of which 26 end inside the 1-year window. The all-time schedule hits the per-employee cap; the windowed figure is re-counted from the 26 in-window pay periods and re-capped — never scaled down from the all-time number:
§ 226, all time — 52 pay periods: $50 + $100 × 51 = $5,150 → capped at $4,000
§ 226, 1-year window — re-counted, 26 pay periods: $50 + $100 × 25 = $2,550
PAGA base, 1-year window — 26 pay periods: $100 × 26 = $2,600
The § 226 and PAGA estimates share the same deficient-pay-period grain but move differently: the assumed-paid share scales the § 226 count and never the PAGA count, while the premium buffer offsets both. § 203 is separate — it keys to assumed separation, not pay periods: an employee whose last shift falls more than 28 days before the dataset’s end would add the full 30-day statutory maximum, $21 × 8 × 30 = $5,040 of waiting-time exposure.
Every case figure is this arithmetic summed across employees — each step reproducible by hand from the counts shown.