Methodology

How Illuminare turns raw timekeeping data into the figures it reports — every threshold, formula, and default assumption, in the order the pipeline applies them. It applies identically plaintiff-side or defense-side: the system reports what the data shows and leaves interpretation to you.

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.

Versioned

Version 1.0 (v0 draft) · updated July 5, 2026. Increments whenever a threshold, formula, or assumption changes.

A worked example — from punches to premium

Follow one employee across three workdays to see exactly how a raw time punch becomes a meal-period premium — every stage the pipeline applies, in order. Illustrative data; the employee’s average hourly rate is $21.

The three shifts, as recorded

WorkdayRecorded punches
MondayIn 09:00 · Out 13:30
TuesdayIn 08:00 · Meal 11:45–12:15 · Out 15:15
WednesdayIn 06:00 · Meal 1 10:00–10:30 · Meal 2 16:10–16:32 · Out 17:00

Exact minutes — censored, never rounded

Punch times arrive minute-granular — the timekeeping system records to the minute, so the observations are already “censored.” The analysis compares durations exactly and never rounds a time before a legal threshold. Wednesday’s second meal runs 16:10 to 16:32 — 22 minutes — so it is short; a 29-minute break would be short too, never rounded up to 30.

Meal detection — required meals, timeliness, duration

The 5-hour and 10-hour meal triggers are measured on the shift’s elapsed span — clock time from the first clock-in to the final clock-out, including intra-shift gaps. A first meal must commence before the end of the 5th hour, a second before the end of the 10th, each at least 30 minutes.

WorkdayElapsed spanMeals requiredResult
Monday4.5 h0Under 5 hours — no meal required. Compliant.
Tuesday7.25 h1The meal starts 11:45, before the 13:00 deadline, and runs a full 30 minutes — timely and compliant.
Wednesday11 h2Meal 1 is timely (10:00) and 30 minutes. Meal 2 starts 16:10 — after the 16:00 deadline — and runs 22 minutes: late and short. A potential violation.

Premium math — at most one premium per workday

A workday carries at most one meal premium, regardless of how many meals violate. Only Wednesday has a violation, so it carries a single premium — one hour of pay at the $21 rate.

WorkdayMeal premium
Monday$0
Tuesday$0
Wednesday$21
Total$21

Across the three shifts, this employee’s meal-period exposure is $21 — a single premium, from the one workday whose second meal was both late and short.

How your data becomes analyzable

Data processing

  • Time segments — each clock-in/out interval is one segment. Overnight segments split at midnight into two, each carrying its calendar date, so day-bounded rules apply cleanly.
  • Shift clustering — same-day segments for an employee group into work periods; meal and rest requirements are evaluated per work period.
  • Duplicates — exact duplicates on (employee, clock-in, clock-out) are identified and excluded from calculation; counts are reported on the Duplicate Data page.
  • Overlapping punches — when two segments for the same employee overlap in time, the longer is kept and the shorter set aside, so overlapping records never double-count toward a work period.
  • File inclusion — only files marked included-in-analysis feed the figures; per-file inclusion is user-controlled.
  • Timezones — timestamps are read as local, offset-naive times. An explicit UTC offset, if present, is read at its written wall-clock value and set aside — never converted across time zones, which could shift a punch across midnight.
  • Rounding practices are not detected — the analysis evaluates timestamps as recorded; Donohue-style rounded-time presumption detection is not performed in alpha.

Overlapping-punch resolution

When two time segments for the same employee overlap in time, the longer segment is kept and the shorter is set aside. Overlapping records therefore never double-count toward a work period, and the work-period span used for the meal thresholds reflects the longer of the two.

Exact duplicates on (employee, clock-in, clock-out) are handled separately — identified and excluded before overlap resolution — and their counts are reported on the Duplicate Data page.

Minute-level censoring

Timestamps are read at minute resolution — seconds are censored (truncated), not rounded. A threshold comparison then uses the exact minute value, so the analysis never rounds a duration up or down before deciding whether a threshold is met (Donohue).

Concretely: a 29-minute break is short even if it is 29 minutes 59 seconds; a shift that elapses 9 hours 59 minutes requires one meal period, not two. Donohue-style rounded-time presumption detection is a separate practice and is not performed in alpha.

The exposure formula

Potential exposure formula

Meal-period exposure is the sum, over workdays with at least one potential meal violation, of one hour of pay at the case’s average hourly rate:

Σ (workdays with ≥1 meal occurrence) × 1 hr × average hourly rate

  • Premium cap — at most one meal premium per workday regardless of occurrence count, and at most one rest premium per workday as a separate cap (UPS v. Superior Court; § 226.7). Up to two premiums per workday total.
  • Rate source — the case-level average hourly rate, a required input set before analysis. No minimum-wage fallback is applied. The Ferra “regular rate of compensation” adjustment is not computed in alpha — figures use the entered rate as-is.

Average hourly rate assumption

Every per-employee dollar figure — the meal and rest premium amounts and the § 203 daily rate — uses a single average hourly rate, frozen into the run snapshot at run-start. The rate is a required precondition: an analysis cannot run until it is set, and no minimum-wage or other fallback is ever substituted.

Applying one rate across the population is an alpha simplification. A future employee-census upload will supply per-employee rates that refine these figures; the Ferra “regular rate of compensation” adjustment is not computed in alpha.

Penalties

Penalty coverage (alpha) — assumption-based

  • § 226 wage statements — a pay period is treated as deficient when it contains at least one potential meal or rest violation whose premium is assumed unpaid. The assumed-paid share defaults to 0% and is adjustable on the exposure page without re-running the analysis.
  • § 203 waiting time — employees with no recorded shift in the trailing inactivity window (default 28 days from the dataset’s most recent date) are assumed separated; up to 30 days at 8× the average hourly rate. Replaced by actual termination dates when a census upload is provided (post-alpha).
  • Daily overtime / double time — identified from daily hours; weekly overtime is excluded in alpha.

§ 226 wage-statement penalty

A pay period is deficient when it has at least one potential meal or rest violation whose premium is assumed unpaid. The assumed-paid share defaults to 0% (assume none paid) and is adjustable on the exposure page as a display-time lever — it recomputes live and never re-runs the analysis.

Per employee, the penalty is $50 for the first deficient pay period and $100 for each additional, capped at a $4,000 aggregate per employee (Lab. Code § 226(e)):

penalty = LEAST( 50 + 100 × (deficient_pay_periods − 1), 4000 )

The case figure sums this across employees. It is computed in the read layer so the assumed-paid lever recomputes live from the employee grain.

§ 203 waiting-time penalty

An employee with no recorded shift in the trailing inactivity window (default 28 days from the dataset’s most recent date) is assumed separated. “Last observed” is the most recent shift in the uploaded data, used as a reasonable proxy for separation — not a confirmed termination date.

The daily rate is the average hourly rate × 8, accrued up to 30 days per separated employee:

penalty = average_hourly_rate × 8 × days_owed (days_owed ≤ 30)

A future employee-census upload will supply actual separation dates and replace the last-observed proxy.

PAGA base civil penalty

PAGA (the Private Attorneys General Act, Lab. Code § 2699) lets an aggrieved employee recover civil penalties for Labor Code violations. The 2024 reform (AB 2288 / SB 92) repealed the prior $100 / $200 civil-penalty formula. What remains computable from timekeeping data alone is the base civil penalty per deficient pay period — a configurable assumption defaulting to $100. The higher subsequent-violation, malice, and uncured tiers turn on facts not in the timekeeping record (prior notice, willfulness, cure status), so they are disclosed, not computed.

The gross PAGA figure is the base penalty multiplied by the deficient-pay-period count — the same count the § 226 figure is built on, scoped to the 1-year PAGA limitations window (CCP § 340(a)), before any assumed-paid reduction. PAGA has no $4,000 per-employee cap (that is a § 226 rule), so it is a case-level multiply, never folded or capped per employee.

PAGA (base) = base civil penalty per pay period × deficient pay periods (1-year window)

Of any recovered PAGA civil penalty, 75% goes to the Labor & Workforce Development Agency (LWDA) and 25% to the aggrieved employees (Lab. Code § 2699(i)). The split is shown for reference; it does not change the gross figure. The base penalty is a display-time assumption — adjustable without re-running the analysis.

§ 510 overtime & double-time thresholds

California Labor Code § 510 sets the daily hour thresholds at which premium rates apply. The statutory recommended values are the analysis defaults:

  • Daily overtime — hours worked beyond 8 in a workday are overtime (§ 510). The default daily-overtime threshold is 8 hours.
  • Double time — hours worked beyond 12 in a workday are double time (§ 510). The default double-time threshold is 12 hours.
  • Weekly overtime — § 510 also sets a 40-hour weekly overtime threshold; the analysis carries 40 hours as the default. Weekly-overtime exposure is not computed in alpha — daily overtime/double-time identification (in hours) is.

Alpha identifies daily overtime/double-time hours from daily hours per shift; it does not compute an overtime/double-time dollar exposure (the unpaid-premium multiplier and the Ferra regular-rate recompute are deferred).

Statute-of-limitations windows

Statute-of-limitations windows

Each exposure figure is scoped to its claim’s California statute of limitations, measured back from the case filing date. The window is a lookback floor: a pay period is in scope when its end date is on or after the filing date minus the claim’s limitations period. There is no upper bound — pay periods on or after the floor are in scope, including those after the filing date.

  • Meal premiums (§ 226.7) — 4-year window. Pleaded as UCL restitution; the UCL (Bus. & Prof. Code § 17208) carries a flat 4-year limitations period.
  • Rest premiums (§ 226.7) — 4-year window. Same § 226.7 premium basis as meal; inherits the 4-year UCL reach.
  • Wage-statement penalty (§ 226) — 1-year window. A statutory penalty; CCP § 340(a) sets a 1-year limitations period. The penalty is re-counted over the 1-year window and re-capped at $4,000 per employee — never scaled from the all-time figure.
  • Waiting-time penalty (§ 203) — not statute-windowed. Its limitations period keys to the separation date, which the analysis infers from the last observed shift rather than a confirmed termination date, so the figure reflects all separated employees in the dataset.

The windows are a display-time scope applied to the stored pay-period figures. All uploaded data is retained; the filing date can be edited without re-running the analysis.

Citing this methodology.Reference it as “Illuminare Analysis Methodology, version 1.0 (v0 draft)” together with the last-updated date above. The version increments whenever a threshold, formula, or default assumption changes, so a cited figure remains reproducible against the version it was produced under.

Questions about an assumption, an edge case, or a figure you can’t reconcile: hello@illuminare.app.

See the methodology on your own matter.

Upload a timekeeping export and every figure traces back to the sections above.

Request access →