# How shift validation works

**For:** Manager
**You'll need:** Nothing.

When you assign a person, drag a shift, or hover one on the calendar, {{ app_name }} runs a battery of checks and surfaces issues as badges, tooltips, and (in strict mode) save blockers. This article walks through what's checked, the three severity levels, and where each issue surfaces.

## The three severity levels

Every check produces an issue with one of three severities:

- **Error** (also called **'blocking'**) — a hard violation. Examples: the person has no MLP entry for this position at this location, or the assignment would push them over a daily-hours cap. In strict mode, the form refuses to save.
- **Warning** — a soft violation worth flagging but not blocking. Examples: the assignment crosses a recommended (not enforced) rest break, or the person is on Mode B availability with no covering block.
- **Info** — informational. Examples: this is the person's first shift this week, or the position is at minimum (not maximum) headcount.

## What gets checked

The checks fall into five families:

- **MLP eligibility** — does this person have an MLP entry for the shift's (location, position) pair? If not, they don't appear in the candidate list at all.
- **Skill requirements** — does the person hold every skill the position requires, with a non-expired certification where required?
- **Availability** — for people on **'Set availability'** (Mode B), is there an availability block covering the shift? Unavailable blocks and confirmed leave count against this. People on Mode A are never gated.
- **Work-rule limits** — daily hours cap, weekly hours cap, rest-between-shifts, consecutive-day limit, overtime tier thresholds. Driven by the {doc}`work rule </rules-and-compliance/work-rules/index>` resolved for the assignment (see {doc}`/rules-and-compliance/work-rules/work-rule-resolution`).
- **Break rules** — does the shift trigger a required break? Are paid / unpaid windows correct? Driven by the location's {doc}`break rules </rules-and-compliance/break-rules/index>`.

Headcount thresholds (minimum, target, maximum) on the {doc}`position </set-up-your-company/positions/index>` are also surfaced — both **under-min** and **over-max** produce blocking errors; target is informational.

## Where issues surface

The same issue can show up in several places:

- **Eligibility badges in the assignment dropdown** — each candidate row shows a red icon for blocking errors and a yellow icon for warnings. See {doc}`eligibility-badges`.
- **Calendar hover tooltip** — hovering a shift block shows a list of every active issue, grouped by person.
- **Coverage cell tooltip** — on the {doc}`coverage grid </plan-schedules/coverage/index>`, each cell tooltip lists the issues that gap the staffing for that hour.
- **Save blocker** — when you save a shift form in strict mode, blocking errors stop the save and render under the field that caused them.

## Tune what you see

Two personal settings control how loud validation is. The defaults are reasonable for most planners; tune them once you know which issues are noise for your team.

- **'Tooltip validation level'** — the threshold for what shows up on hover. **'Error'** shows only blocking errors; **'Warning'** adds warnings; **'Info'** shows everything.
- **'Shift validation level'** — the threshold for what blocks saving. Same three options.

Both live on {doc}`/settings-and-admin/personal-settings/calendar-preferences`. They are per-user, not per-company.

## Verify it worked

Open a shift, click **'Add person'**, and look for the badge column. Hover an assigned shift on the calendar — the tooltip should list any issues. Open {doc}`/settings-and-admin/personal-settings/calendar-preferences` and toggle the validation level; the next page load reflects the new threshold.

## Related

- {doc}`eligibility-badges`
- {doc}`assign-from-the-eligible-pool`
- {doc}`/plan-schedules/coverage/read-the-severity-tooltip`
- {doc}`/settings-and-admin/personal-settings/calendar-preferences`
- {doc}`/troubleshooting/i-cant-assign-a-person`
