Blueprint of a split-sleeper dispatch timeline with a 7-hour sleeper, a 3-hour off-duty period, and a recomputed 14-hour anchor
Applied AI Systems Architecture

Split-Sleeper HOS Optimization in Algorithmic Dispatch

Mathematical models and telematics ingestion. A specialty under the predictive dispatch constraint guide. The solver may recommend a 7/3 or 8/2 pair. A dispatcher accepts it. The hours-of-service engine remains the compliance authority.

This page is the split-sleeper specialty under Predictive Dispatch Constraint Solving. It does not restate the general catalog of hard and soft constraints. It specifies the state, the two named pair shapes, the 14-hour exclusion arithmetic, the telematics contract, and the abort rule a dispatch solver needs before it may even offer a split. Read Carrier AI Readiness Evaluation if the fleet has not yet named who may accept a machine recommendation.

Key takeaways
  • The search offers two named pairs, 7/3 and 8/2. A 7 plus 2 pair totals 9 hours and does not qualify.
  • Both qualifying periods are excluded from the 14-hour window, recomputed from the end of the first qualifying period.
  • The split does not erase the 11-hour limit, the 30-minute break, or the cycle.
  • A stale clock aborts the run. The dispatcher sees a reason code, never a guessed clock.
  • The model may recommend. A named dispatcher accepts, and the HOS engine stays the compliance authority.
420 minminimum long period in the sleeper berth
600 minminimum total for a qualifying pair
15 minillustrative stale-clock abort threshold
0hard-constraint violations allowed in the pilot

Why a 10-hour sleeper reset strands home time

A solver that knows only one rest primitive will schedule a single block of at least 10 consecutive hours off duty or in the sleeper berth. That block is a real reset shape, and many plans should keep it. It is a poor model of a property-carrying driver who can lawfully split the 10 hours into two qualifying periods. The 10-hour-only search either inserts the full block before the next appointment, which pushes the domicile arrival past the published home-time window, or it sends the driver home early and drops the load that a qualifying pair could have covered. Home time then shows up as a large soft penalty even when a legal pair existed on the clock.

Home time in this design is a published soft penalty: minutes between the planned arrival at the domicile terminal and the driver's home window, multiplied by a weight the operations manager sets in advance. It is not a hard constraint, and it never outranks hours of service. The split model adds two discrete rest shapes so the search can test whether a short off-duty period and a later sleeper reduce that penalty without breaking a hard clock. If the driver record says split_allowed is false, the solver ignores both shapes and behaves as the 10-hour model for that person. A preference flag is a decision right, not a penalty the optimizer is free to buy out.

Confirm 49 CFR 395.1(g) before anyone uses the model

This is a planning model, not legal advice. Before a carrier turns the choice on, counsel or the safety manager should confirm the current text of 49 CFR 395.1(g), including any guidance the carrier already follows. The shape encoded here is the property-carrying split used for planning: two periods that total at least 10 hours, one of them at least 7 consecutive hours in the sleeper berth, the other at least 2 consecutive hours off duty and/or in the sleeper berth. Operations commonly call the scheduled pairs 7/3 and 8/2. Both qualifying periods are excluded from the 14-hour window. The solver recomputes the 14-hour window from the end of the first qualifying period.

The page does not describe enforcement, roadside conversation, or any method of evading hours of service. If the engine and the regulation disagree, the plan stops. Passenger-carrying rules, adverse-driving exceptions, and short-haul exceptions are out of scope. The tractor master must show has_sleeper_berth true before a long period can be proposed. A day cab cannot host a 7-hour sleeper period, and the solver must not relabel off duty as sleeper to pass the test.

Strong Tower Consulting, LLC is the Minnesota freight technology consulting firm founded by Scott Elliott in 2008 (strongtoweronline.com). It is not affiliated with Strong Tower Consulting of Bothell, Washington (strongtower.consulting or strongtower.ai).

State variables the solver must carry

Every candidate is a function of a snapshot, not of a live keystroke on the dispatch board. The minimum state is remaining drive, the 14-hour anchor, the start and end of each sleeper or off-duty period under test, duty status, and an as-of timestamp. Remaining drive is an integer number of minutes from the hours-of-service engine. The solver may display it as hours and minutes. It may not recompute it from raw GPS speed. The 14-hour anchor is a timestamp. After a qualifying pair, that anchor is the end of the first qualifying period. Before a pair qualifies, the anchor stays where the engine put it.

Duty status is a closed enumeration: OFF_DUTY, SLEEPER_BERTH, DRIVING, ON_DUTY_NOT_DRIVING. Anything else, including a blank or a vendor-specific code without a signed crosswalk, is UNKNOWN_DUTY_STATUS and aborts the recommendation. The sleeper-period start and end are timestamps with a duration in whole minutes. Seven hours is 420 minutes. A period of 419 minutes fails the long-side test. The as-of timestamp is the moment the clocks, the duty status, and the position were mutually consistent. It is not the time a file landed in an inbox. Store it in UTC. Convert to terminal local time only for the screen.

State the split-sleeper solver reads or writes on one snapshot
FieldTypeSourcePlanning rule
remaining_drive_minutesintegerHOS engineHard. The split does not set this back to 660.
fourteen_hour_anchor_tsUTC timestampHOS engine, then recomputed from the end of the first qualifying periodBoth qualifying periods are excluded from the window.
sleeper_period_start_ts and sleeper_period_end_tsUTC timestampsProposed plan, later compared with recorded statusLong side must be SLEEPER_BERTH for at least 420 minutes.
short_period_start_ts and short_period_end_tsUTC timestampsProposed planAt least 120 minutes OFF_DUTY and/or SLEEPER_BERTH. 7/3 uses at least 180.
duty_statusenumTelematics contractUnknown status aborts. Parked is not sleeper.
as_of_tsUTC timestampIngestion workerOlder than the stale threshold aborts the whole recommendation.
cycle_rule and cycle_used_minutesenum 60_7 or 70_8, integerHOS engineHard. The pair does not add cycle capacity.
break_drive_minutesintegerHOS engineHard 30-minute break clock. A pair that leaves it unpaid is infeasible.

7/3 and 8/2 as discrete choices

The search offers two named choices. A dispatcher does not type a custom duration on a live load. A 7/3 candidate is at least 420 minutes in the sleeper berth plus at least 180 minutes off duty and/or in the sleeper, total at least 600. An 8/2 candidate is at least 480 minutes in the sleeper plus at least 120 minutes off duty and/or in the sleeper, again at least 600. Either period may occur first. The first qualifying period is the one that ends earlier, not the longer one.

Pairs outside those two names can still meet the regulatory minimums, for example 9 hours in the sleeper and 2 hours off duty. They are not on the default menu. A 7-hour sleeper plus a 2-hour off-duty period totals 9 hours and does not qualify. The solver must not exclude either period and must not move the 14-hour anchor. A 7-hour off-duty period that never enters the sleeper berth does not satisfy the long side.

Discrete pair menu for property-carrying split-sleeper planning
NameLong periodShort periodTotalPlanning note
7/3At least 7 consecutive hours in the sleeper berth (420 minutes)At least 3 consecutive hours off duty and/or sleeper (180 minutes)At least 10 hours (600 minutes)Named choice. Long side cannot be off duty alone.
8/2At least 8 consecutive hours in the sleeper berth (480 minutes)At least 2 consecutive hours off duty and/or sleeper (120 minutes)At least 10 hours (600 minutes)Named choice. The 8 hours still satisfies the at-least-7 sleeper test.
7 plus 27 hours sleeper2 hours off duty9 hoursReject. Do not exclude either period. Do not move the anchor.
10 consecutiveNot a splitNoneAt least 10 hoursKept as the baseline rest when split_allowed is false or no pair is feasible.

Rolling 14-hour exclusion arithmetic

Exclusion is a subtraction of qualifying rest from the 14-hour window, not a gift of new driving time. Once both periods qualify, every minute inside either qualifying period is left out of the 14-hour sum. The new window is measured from the end of the first qualifying period. On-duty time after that instant counts. The second qualifying period does not count. Time before the first qualifying period is not pulled back into the new window. If the pair later fails because a recorded period was shorter than the plan, the exclusion is void and the anchor returns to the engine's unpaired value on the next snapshot.

Work the minutes as integers. Let F be the end of the first qualifying period and S be the end of the second. Let Q2 be the duration of the second qualifying period. Counted minutes equal (S minus F) minus Q2, converted to minutes, minus nothing else unless the engine also excludes a status this page does not model. Remaining 14-hour minutes equal 840 minus counted minutes, and never below zero in a feasible plan. Overlap between the two periods is a data error, not a clever compression. The solver rejects overlap before it does the subtraction. Durations are not rounded up to the next hour to make a 9-hour pair look like 10.

Illustrative exclusion math, not a customer result

Using the 7/3 timeline below: first qualifying period ends at F = 11:00, second ends at S = 23:00, and the second period lasts Q2 = 420 minutes.

Counted = (S - F) - Q2 = 720 - 420 = 300 minutes Remaining = 840 - 300 = 540 minutes of the 14-hour window

Remaining drive is still read from the HOS engine.

Illustrative timeline of one qualifying pair

The clocks below are illustrative planning figures. They are not a driver's log, not a result from a fleet, and not a template to copy onto an electronic logging device. They exist so a builder can see the anchor move. The carrier's own engine would still have to return the same structure before a dispatcher could accept a plan like it. Local times are used only in the table. Storage remains UTC.

At 23:00 both periods qualify. The first qualifying period ended at 11:00, even though it is the shorter one, so the 14-hour anchor moves to 11:00. From 11:00 to 16:00 is 5 hours on duty, which counts. From 16:00 to 23:00 is 7 hours in the sleeper, which is excluded. Illustrative remaining 14-hour window: 9 hours. Remaining drive stays a field the engine must supply. A 10-hour-only model starting the sleeper at 16:00 would hold until 02:00 and would not run this exclusion.

Illustrative planning timeline for a 7/3 pair. Not a duty log.
StepIllustrative clockDuty statusWhat the model stores
105:00 to 08:00DRIVING (3 hours)Not a rest. Drive minutes decrease only as the HOS engine reports.
208:00 to 11:00OFF_DUTY (3 hours)Short-period candidate. Needs a later sleeper of at least 7 hours and a total of at least 10.
311:00 to 15:30DRIVING (4.5 hours)On-duty time after the first period. Counts once the pair qualifies.
415:30 to 16:00ON_DUTY_NOT_DRIVING (0.5 hours)Counts toward the recomputed 14. Does not count as sleeper.
516:00 to 23:00SLEEPER_BERTH (7 hours)Long period. Pair is 3 plus 7. Both periods qualify.
623:00Pair completeAnchor recomputed to 11:00. Counted minutes = 300. Illustrative remaining 14-hour window = 540 minutes. Remaining drive is unread until the engine answers.

Hard clocks the split does not erase

The ordinary 11-hour driving limit remains. Nothing in the pair sets remaining_drive_minutes to 660. Driving before the short period, between the periods, and after the long period is legal only if the engine still shows minutes left at each of those points. The planner's job is to refuse a candidate the engine marks noncompliant. It is not to discover a larger driving budget than the engine published on the same as-of timestamp.

The 30-minute break remains hard. break_drive_minutes is driving since the last interruption of at least 30 consecutive minutes. A candidate that reaches a dock or a proposed rest with that clock already in breach is infeasible, even when the pair totals 10 hours. The cycle remains hard. The carrier assigns 60 hours in 7 days or 70 hours in 8 days. Sleeper and off duty do not raise that ceiling. On-duty minutes still accrue. A pair that breaks the cycle is rejected with reason CYCLE.

Telematics ingestion contract

The feed is a contract with required fields, not a screen scrape of an hours-of-service portal. Each message carries driver_id, vehicle_id, duty_status, sleeper_berth_flag, event_time, as_of_ts, remaining_drive_minutes, fourteen_hour_anchor_ts, cycle_rule, cycle_used_minutes, break_drive_minutes, gps_lat, gps_lon, gps_fix_ts, gps_age_seconds, event_sequence, and source. sleeper_berth_flag is true only when the tractor has a sleeper and the status is SLEEPER_BERTH. The ingestion worker computes gps_age_seconds from as_of_ts minus gps_fix_ts. The browser does not subtract two local clock strings and call that an age.

Zero speed is not a sleeper. A tractor can sit at a dock, a gate, or a fuel island with status DRIVING or ON_DUTY_NOT_DRIVING. The solver places a long period only where the plan says the driver would record SLEEPER_BERTH, and only on a vehicle with has_sleeper_berth true. Yard move and personal conveyance stay on the crosswalk the safety manager has signed. The default crosswalk does not map either one onto SLEEPER_BERTH. If the vendor code is absent from the crosswalk, the message fails closed.

Clock fields are copied from the hours-of-service engine. The dispatch service may draft a 14-hour exclusion for a future pair, then it must submit that draft and store the engine receipt. The row quotes the receipt, as_of_ts, and event_sequence. A newer sequence invalidates it. If the engine disagrees with the local subtraction, the engine wins and the reason is ENGINE_MISMATCH.

Split recommendation path
Telematics feedContract fields with as_of_ts and event_sequence
Freshness gatesSTALE_CLOCK or LOCATION_UNTRUSTED abort
SolverTests 7/3 and 8/2 against hard clocks
HOS engineReceipt stored. The engine wins on mismatch
DispatcherAccepts or rejects with a reason code
Acceptance never writes a duty status to the ELD. The driver records actual status.

Stale-clock abort rule

If the solver's run time minus as_of_ts is greater than the published stale threshold, the run aborts. No split recommendation is written. The dispatcher sees reason STALE_CLOCK and the age in seconds. They do not see a guessed remaining drive, a guessed anchor, or a "probably still legal" flag. An illustrative planning threshold is 15 minutes. That number is a starting control for a pilot, not a regulatory grace period, and the carrier can set a tighter one. Loosening it past the pilot value requires a written change, not a quiet edit on the night shift.

GPS staleness is a separate gate. If gps_age_seconds exceeds the published location threshold, an illustrative planning figure of 10 minutes, the solver may not name a rest location. A fresh clock with a stale fix is marked LOCATION_UNTRUSTED and cannot be accepted. If both gates fail, STALE_CLOCK wins and nothing is offered. Accept re-reads the snapshot and runs the same abort before it stores dispatcher_user_id.

Hard rule: a stale clock offers nothing

If run time minus as_of_ts is greater than the published stale threshold, the run aborts. The dispatcher sees STALE_CLOCK and the age in seconds, not a guessed remaining drive, a guessed anchor, or a "probably still legal" flag.

Pairing a split with an appointment window

An appointment is window_open, window_end, and early_allowed on the shipper location. The solver tests 7/3 and 8/2 on a grid. An illustrative step is 15 minutes. Each placement checks sleeper capability, non-overlap, the 10-hour total, and the engine receipt at the dock. Arrival must fall inside the window. If early_allowed is false, early arrival is infeasible. Slack is appointment_slack_minutes on that shipper. An illustrative planning value is 30 minutes, used only when the record allows it.

  1. Sleeper capability. The tractor shows has_sleeper_berth true.
  2. Non-overlap. The two periods do not overlap.
  3. Total. The pair reaches at least 10 hours.
  4. Engine receipt. The HOS engine confirms every hard clock at the dock.
  5. Window. Arrival falls inside the appointment window, and early arrival only when early_allowed is true.

If neither named pair hits the window with every hard clock intact, the result is INFEASIBLE_APPOINTMENT. The solver does not shorten the sleeper below 7 hours, shrink the total below 10, or drop the 30-minute break to save the door. A dispatcher may still build a manual plan, including a full 10-hour rest or another driver, and that plan must pass the same engine. Among feasible pairs the score is home-time penalty plus empty miles plus slack consumed. The lowest score is the recommendation. Ties break toward the sleeper that ends earlier at the domicile.

Do

  • Return INFEASIBLE_APPOINTMENT when no named pair fits
  • Let a dispatcher build a manual plan that passes the same engine
  • Score feasible pairs on home time, empty miles, and slack

Avoid

  • Shortening the sleeper below 7 hours
  • Shrinking the total below 10 hours
  • Dropping the 30-minute break to save the door

What the dispatcher must still accept

The model may recommend. It may not assign. The recommendation row carries pair_shape, rest_1_start, rest_1_end, rest_1_status, rest_2_start, rest_2_end, rest_2_status, recomputed fourteen_hour_anchor_ts, hos_engine_receipt_id, as_of_ts, and event_sequence. A named dispatcher accepts or rejects. Acceptance writes dispatcher_user_id, accepted_at, and plan_version. Rejection writes a reason from a short list: DRIVER_PREFERENCE, APPOINTMENT_RISK, WEATHER, EQUIPMENT, OTHER. Acceptance does not write a duty status to the electronic logging device and does not message the driver that the rest has already happened.

The driver records actual duty status. The next snapshot is compared with the accepted intervals. If the sleeper is short of the minimum, or the short period never occurs, the plan expires as NOT_TAKEN and the next search uses the new clocks. Nobody edits the old snapshot to make it look feasible. Team rules and any split 49 CFR 395.1(g) does not support are off by configuration. An unaccepted row drops off the board at its time-to-live. An illustrative time-to-live is 20 minutes or the next snapshot, whichever comes first.

Pilot metrics, with hard-constraint violations at zero

Pilot on one terminal or one corridor, not the network. The release gate is binary: hard-constraint violations must be zero. A violation is any accepted plan that the hours-of-service engine marks as a breach of the 11-hour driving limit, the 14-hour window, the 30-minute break, the assigned 60/7 or 70/8 cycle, or a split that fails the engine's implementation of the qualifying-pair rules. One violation stops the pilot. The response is to fix the state handoff or turn the menu off. It is not to lower a penalty weight until the violation disappears from a dashboard.

Collect the other figures and do not set a success target in advance. Count recommendations, acceptances, rejections, STALE_CLOCK aborts, LOCATION_UNTRUSTED rows, ENGINE_MISMATCH rows, and NOT_TAKEN expirations. Record solver runtime. Compare home-time minutes with the 10-hour-only plan on the same snapshot and report the distribution. An illustrative watch length is four weeks. That figure is how long to hold the gate open, not a result any fleet has already posted. If a hard-constraint violation appears, the pilot stops.

Frequently asked questions

These answers restate the planning rules above. They are not a substitute for the current text of 49 CFR 395.1(g), and they are not an instruction to the driver. If a vendor demo skips the engine receipt or the stale-clock abort, the demo is not implementing this model. The same standard applies to a spreadsheet that moves the 14-hour anchor without storing as_of_ts.

Use the answers in design reviews with safety, dispatch, and the telematics vendor in the same room. Safety owns the crosswalk and the decision to set split_allowed. Dispatch owns acceptance of each row. The vendor owns delivery of the contract fields on time. No one in that review is authorized by this page to treat a model score as compliant hours.

Does a split sleeper erase the 11-hour driving limit?

No. The 11-hour driving limit stays a hard constraint. A qualifying pair excludes both periods from the 14-hour window. It does not grant a fresh 11 hours. Remaining drive is read from the carrier hours-of-service engine at the snapshot time. If that engine says the driver cannot drive, the solver returns no recommendation.

What do the 7/3 and 8/2 names mean in this model?

They are the two named planning choices for a property-carrying driver. A 7/3 pair is at least 7 consecutive hours in the sleeper berth plus at least 3 consecutive hours off duty and/or in the sleeper. An 8/2 pair is at least 8 consecutive hours in the sleeper berth plus at least 2 consecutive hours off duty and/or in the sleeper. Both totals are at least 10 hours. The long side must be in the sleeper berth. A 7 plus 2 pair totals 9 hours and does not qualify. Confirm the current text of 49 CFR 395.1(g).

When does the solver recompute the 14-hour window?

When both periods qualify, the solver recomputes the 14-hour window from the end of the first qualifying period, the one that ended earlier in time. Both qualifying periods are excluded from that window. If the two periods do not total at least 10 hours, the solver does not move the anchor.

What happens if the telematics clock snapshot is stale?

The solver aborts and writes no split recommendation. Stale means the clock snapshot as-of time is older than the carrier published threshold. An illustrative planning threshold is 15 minutes. The dispatcher sees a reason code, not a guessed clock. A stale GPS fix separately blocks any rest location.

Who must accept a split-sleeper recommendation before it is a plan?

The dispatcher. The model may recommend a pair shape, two rest intervals, and a recomputed 14-hour anchor. A named dispatcher accepts or rejects that row. Acceptance stores the user, the time, and the plan version. It does not edit the electronic logging device. The driver records actual duty status.

Talk to an architect

Model split sleeper without bending a clock.

Strong Tower Consulting provides independent systems architecture, feasibility audits, and engineering roadmaps for motor carriers and freight brokers. Contact our advisory team or call 763-244-1373 to discuss your operational data and evaluate practical implementation paths for your fleet.

Published October 23, 2026 by Strong Tower Consulting, LLC. Founded 2008 in Minnesota by Scott Elliott.