Admin SOP — Phase 1 Labor Controls

Read-Only Reference

Internal standard operating procedure for configuring, monitoring, and interpreting labor controls during the Phase 1 pilot period. Do not deviate from this guide while the pilot is active.

1. How to Identify a Pilot-Ready Job

A job is eligible for the pilot labor tracking program when all ten of the following are true:

  1. Status is scheduled or in_progress
  2. Property address is confirmed and complete
  3. approved_labor_hours is set (non-null, > 0)
  4. approved_crew_size is set (≥ 1)
  5. crew_lead_id is assigned
  6. assigned_supervisor_id is assigned
  7. At least one JobAssignment exists with status accepted
  8. required_photo_types has at least before and after selected
  9. At least one JobTask exists for the job
  10. Scheduled start date is within the next 14 days
Use the Pilot Readiness Card in the Job Labor Controls tab to see a live checklist for any specific job.
2. When to Set approved_labor_hours

Set approved_labor_hours before the crew is dispatched, ideally when the job transitions to approved_to_schedule or scheduled.

Source of estimate
Use the total labor_hours from the active Estimate line items as the starting point.
Adjustment rule
Add 10–15% buffer for access delays or hidden conditions on older homes.
Minimum value
Never set below 1.0 hour. If truly a 30-min job, set 1.0 and note the reason.
After job starts
Only increase via a LaborBudgetApproval request. Never manually reduce once time is being tracked.
Locking
Set labor_budget_locked = true after the crew clocks in for the first time to prevent accidental changes.
3. How to Choose approved_crew_size

This is the maximum simultaneous headcount approved for the job at any given time, not the total number of workers across all visits.

Solo task (handyman, inspection)
1
Standard repair job
2
Multi-trade or complex scope
2–3, with supervisor sign-off
Full renovation / large scope
3–4, requires written justification in job notes
Exceeding this limit
Triggers overstaffing_flag on the time entry and creates an AttendanceException. Time is still preserved — do not delete the entry.
If a second crew member arrives and crew size would be exceeded, the supervisor must either deny entry or immediately update approved_crew_size with a note before the worker clocks in.
4. How to Set crew_lead_id and assigned_supervisor_id
crew_lead_id
The on-site worker responsible for coordinating the crew, uploading photos, and submitting the field report. Must have is_crew_lead = true on their EmployeeProfile.
assigned_supervisor_id
The admin or staff member who receives labor alerts, reviews the daily hygiene dashboard for this job, and approves LaborBudgetApproval requests.
Both required
A job cannot be marked pilot-ready without both fields populated.
Changes mid-job
Allowed, but note the change in job notes_internal with the date and reason.
5. Which required_photo_types to Use

Select from: arrival, before, progress, after, completion, trade_specific.

Standard repair (any trade):
before
after
Multi-day or multi-phase job:
before
progress
after
Manufactured home:
arrival
before
after
completion
Roofing / structural / exterior:
before
progress
after
trade_specific
Estimate-only / site visit:
arrival
Phase 1: missing photos show as warnings only. They are not blocking clock-out. Do not instruct workers that they are optional — they are expected.
6. What Supervisors Review Daily in the Labor Hygiene Dashboard

Open the Labor Hygiene Dashboard each morning before dispatch and each evening after crews clock out. Review these categories in order:

  1. Missing payroll hours — entries that are clocked out but have no total_hours. These must be corrected before end-of-week payroll.
  2. Missing GPS — entries where clock_in_location_status is "unavailable". Follow up with the employee to confirm their location at clock-in.
  3. No lunch recorded — entries longer than 5 hours with no lunch_start. Confirm with the employee and set lunch_supervisor_override if lunch genuinely did not occur.
  4. Missing field reports — jobs with no DailyFieldReport for the prior work day. Contact the crew lead.
  5. No photos on active jobs — jobs in_progress with zero JobPhoto records. Follow up before the job closes.
  6. Unlinked assignments — employees clocked into jobs with no JobAssignment. Determine if self-dispatch occurred and document it.
7. How to Interpret Labor Status Values
on_track

Budget consumption below 75%. No action needed.

watch

75–89% consumed. Supervisor notified. Review scope and remaining work. Prepare to request additional hours if needed.

over_budget

90–99% consumed. Supervisor notified. Crew should continue working — do not pause the job. Submit a LaborBudgetApproval request immediately.

approval_required

100%+ consumed. A LaborBudgetApproval record has been auto-created. Admin must review and approve or deny additional hours. Time entries continue to be recorded regardless of status.

Labor status is recalculated by the recalculateJobLaborBudget automation each time a TimeEntry is saved. It does not update in real-time on screen — refresh the page to see the latest value.
8. What NOT to Do Yet (Phase 1 Boundaries)
Do not block clock-in based on GPS mismatch. GPS is informational only.
Do not block clock-out based on missing photos. Photo warnings are advisory.
Do not automatically deduct pay or modify total_hours based on labor status.
Do not use labor_status to trigger closeout blocking or invoice holds.
Do not activate bonus or commission calculations tied to labor efficiency.
Do not enable strict second-job blocking at the clock-in level.
Do not use the missed_lunch_flag to automatically modify payroll_hours_recorded.
Do not start Phase 2 closeout gate enforcement without a separate admin sign-off.
Phase 1 Pilot — Internal Use Only. Last updated May 2026.