Corporate Governance & Affiliation: Strong Tower Consulting, LLC and Exspeedite LLC are separately organized sister companies under common ownership. Established under Minnesota law in 2008, Strong Tower Consulting maintains continuous senior trademark priority across all logistics systems architecture and advisory engagements. For direct technical inquiry, contact the office at
763-244-1373.
Regulatory Compliance Algorithms & Cyber-Physical Security for Enterprise Commercial Fleets
Split-Sleeper HOS, Chameleon Carrier Graph Resolution, and FSMA Cold Chain Audit Defense
Strong Tower Consulting, LLC
Minnesota | Founded 2008 | Scott Elliott, Founder & CEO
Senior Transportation Systems Architecture & Logistics Regulatory Engineering
Published October 2026
Executive Summary
Motor carriers, intermodal operators, refrigerated fleets, and freight brokerages lose money in four places that look unrelated but share one root cause: a regulation or a counterparty is treated as a paperwork problem when it is really a computation problem.
| Problem | What it costs | The computation underneath |
| Split-sleeper hours of service | Violations, out-of-service orders, stranded drivers, lost legal hours | A finite state machine with a moving anchor point |
| Chameleon, stolen-identity, and ghost carriers | Cargo theft, double brokering, uninsured loads, broker liability | Entity resolution and risk propagation on a graph |
| Reefer cargo rejection claims | Paid claims on loads that were never out of temperature | Heat transfer physics plus tamper-evident records |
| Chassis splits, LFD, and per diem | Demurrage, detention, and ramp fees that were never the cargo interest's fault | Bipartite matching plus clock-stop accounting |
This paper gives a complete, independent architecture for each problem: formal models, proofs of the properties that matter, reference algorithms, data schemas, and diagrams. Each chapter stands alone, and each can be implemented incrementally.
Relationship disclosure. Strong Tower Consulting, LLC and Exspeedite LLC are separately organized sister companies under common ownership.
How to read this paper
- Chapters 1 and 4 are optimization and state-tracking problems. Read them if you run dispatch, safety, or drayage.
- Chapter 2 is a data and risk problem. Read it if you onboard carriers or tender freight.
- Chapter 3 is a physics and evidence problem. Read it if you haul temperature-controlled freight.
- Proofs are included where a property is load-bearing for compliance. If you only want the architecture, skip the "Proof" blocks.
Reference architecture (all chapters)
+--------------------------------------------+
| EVIDENCE & DECISION LAYER |
| rules engine | scoring | dossier builder |
+----------------------+---------------------+
|
+----------------+-----------------+-----------------+----------------+
| | | | |
+------+-------+ +------+-------+ +-------+------+ +--------+-------+
| CH1: HOS FSM | | CH2: CARRIER | | CH3: COLD | | CH4: INTERMODAL|
| duty events | | IDENTITY | | CHAIN VAULT | | MATCH + CLOCK |
| ELD stream | | GRAPH | | sensor chain | | gate/EDI feeds |
+------+-------+ +------+-------+ +-------+------+ +--------+-------+
| | | |
+------+----------------+-----------------+-----------------+--------+
| IMMUTABLE EVENT LOG (hash chained) |
+---------------------------------------------------------------------+
CHAPTER 1: FMCSA 49 CFR § 395.1(g) Split-Sleeper Berth State Machine
1.1 What the rule does, in plain English
A property-carrying driver normally gets a 14-hour driving window that starts at the first on-duty moment after 10 consecutive hours off, and an 11-hour driving limit inside it. The sleeper berth provision lets a driver break the 10 hours into two qualifying rest periods instead. When two such periods are paired, the time in them stops counting against the 14-hour window, and the window and driving counters are recalculated from the end of the first period of the pair.
The rule has three moving parts, and every implementation error we see traces to one of them:
• Which rest periods qualify, and which pairs are valid.
• When the pairing is evaluated: only when the second period completes. Until then, the driver is on a provisional clock.
• What gets recalculated when the pair completes, and what stays untouched (for example the 60/70-hour cycle).
1.2 Notation
All times are in seconds on a continuous timeline in the driver's home terminal time zone. H = 3600.
s(t) | Duty status at time t, one of OFF, SB, ON, D (driving) |
ρ | A run: a maximal contiguous interval where s ∈ {OFF, SB} |
λ(ρ) | Longest contiguous SB sub-interval inside ρ |
a | Window anchor (start of the 14-hour window), or ⊥ if no window is open |
x | Excluded time: length of the second period of the last valid pair, else 0 |
π | Pending run: the last completed qualifying run, or ⊥ |
d11 | Official driving time counted toward the 11-hour limit |
g | Driving accumulated since the end of the pending run π |
d8 | Driving since the last 30-minute interruption |
1.3 Qualifying periods and the pairing predicate
A run ρ is qualifying if ℓ(ρ) ≥ 2H.
A run is long-eligible if λ(ρ) ≥ 7H (at least 7 consecutive hours in the sleeper berth).
A run with ℓ(ρ) ≥ 10H is a full reset and needs no pairing.
Two adjacent qualifying runs (π, ρ) form a valid pair when
valid(π, ρ) := ℓ(π) + ℓ(ρ) ≥ 10H
AND ( long(π) AND ℓ(ρ) ≥ 2H OR long(ρ) AND ℓ(π) ≥ 2H )
The order does not matter: the long period may come first or second.
The named splits are points on one frontier
Let L be the long period and S the short period. The pairing predicate says L ≥ 7, S ≥ 2, and L + S ≥ 10 (hours). The minimum short period for a given long period is
S*(L) = max( 2 , 10 - L ) for L ≥ 7
| Name | Long period | Short period | Sum | Valid? |
| 8/2 | 8.0 h SB | 2.0 h | 10.0 | Yes (S*(8) = 2) |
| 7/3 | 7.0 h SB | 3.0 h | 10.0 | Yes (S*(7) = 3) |
| 7.5/2.5 | 7.5 h SB | 2.5 h | 10.0 | Yes (S*(7.5) = 2.5) |
| 7/2.5 | 7.0 h SB | 2.5 h | 9.5 | No (sum below 10) |
| 6.9/3.1 | 6.9 h SB | 3.1 h | 10.0 | No (long period under 7 h SB) |
So 7.5/2.5 is not a separate provision. It is a point on the frontier S*(L), and an engine that hard-codes only 8/2 and 7/3 will wrongly reject legal intermediate pairs. Implement the predicate, not a lookup table.
1.4 The finite state machine
State
Σ = ( a, x, π, d11, g, d8 ) with a ∈ ℝ ∪ {⊥}, x ≥ 0, π ∈ Runs ∪ {⊥}
Initial state after a full reset: Σ₀ = (⊥, 0, ⊥, 0, 0, 0).
Events
Events fire when a duty segment is closed. Non-duty segments are merged into runs; a run is closed at the moment the driver goes ON or D.
| Event | Fires when | Effect on Σ |
DUTY_START(t) | First ON or D after a reset, with a = ⊥ | a ← t |
DRIVE(Δ) | A driving segment of length Δ ends | d11 += Δ, g += Δ, d8 += Δ |
ON_SEG(Δ) | An on-duty non-driving segment ends | If Δ ≥ 0.5H then d8 ← 0 |
RUN_CLOSE(ρ) | A run ends because duty resumes | See transition table below |
Transition function for RUN_CLOSE(ρ)
| R0 | ℓ(ρ) ≥ 0.5H | d8 ← 0 (applies in addition to the cases below) |
| R1 Full reset | ℓ(ρ) ≥ 10H | Σ ← Σ₀ |
| R2 Too short | ℓ(ρ) < 2H | No further change (time counts inside the window) |
| R3 Valid pair | ℓ(ρ) ≥ 2H, π ≠ ⊥, valid(π, ρ) | a ← e(π), x ← ℓ(ρ), d11 ← g, then π ← ρ, g ← 0 |
| R4 Qualifying, no pair | ℓ(ρ) ≥ 2H, otherwise | π ← ρ, g ← 0 (anchor, x, and d11 unchanged) |
Case R3 is the recalculation. The old pending run π is consumed as the first period, ρ becomes the excluded period, and ρ immediately becomes the pending run for the next pairing. That last step is what makes chained splits work (a 2-hour period that completes one pair is also the first period of the next).
Legality predicate
Driving at time t is legal iff
d11 < 11H AND (a = ⊥ OR t < a + 14H + x) AND d8 < 8H
The middle term is the pause-exclusion formulation: the deadline is pushed out by exactly the length of the excluded period.
State diagram
stateDiagram-v2
[*] --> Reset
Reset --> Working: DUTY_START, a = t
Working --> InRun: status becomes OFF or SB
InRun --> Working: run closes, length under 2h (R2)
InRun --> PendingOpen: run closes, 2h or more, no valid pair (R4)
InRun --> Paired: run closes, valid pair (R3)
InRun --> Reset: run closes, 10h or more (R1)
PendingOpen --> Working: duty continues, a and x unchanged
Paired --> Working: a = end of first period, x = second length
Working --> Working: DRIVE and ON events update d11, g, d8
PendingOpen and Paired are not extra storage states in the implementation. They are labels for the value of π and whether (a, x) changed at the last RUN_CLOSE.
1.5 The mathematics of the 14-hour window
Closed form
Let C14(t) be the window time consumed at t. With anchor a and excluded time x,
C14(t) = (t - a) - x for t ≥ a (x applies only after the second period completes)
Remaining window R14(t) = 14H - C14(t)
Deadline δ = a + 14H + x
Pause formulation
Equivalently define a clock-running indicator r(u) ∈ {0, 1} that is 0 on the excluded run and 1 elsewhere. Then C14(t) = ∫ from a to t of r(u) du. The clock "pauses" for the length of the second period.
Anchor recalculation
At RUN_CLOSE(ρ) with a valid pair, the anchor jumps backward in the sense of the timeline relative to where an unpaired clock would sit: it moves to e(π), the end of the first period. Everything before e(π) stops counting. This is why a pair can turn a nearly exhausted provisional window into a fresh one.
Theorem 1 (Pause equivalence)
For t ≥ e(ρ) after a valid pair (π, ρ), the elapsed-minus-excluded formula and the paused-clock integral give the same C14(t).
Proof. The run ρ occupies an interval of length ℓ(ρ) = x inside [e(π), t], because ρ begins after π ends. The indicator r is 0 on that interval and 1 elsewhere in [a, t] with a = e(π). Hence ∫ r = (t - a) - x. ∎
Theorem 2 (Monotone extension)
Completing a valid pair never moves the 14-hour deadline earlier than the provisional deadline held just before the second period began. In fact the deadline moves later by at least ℓ(ρ).
Proof. Let the provisional state before the pair completes be (a, x) with deadline δ = a + 14H + x, and let the new state be (a', x') = (e(π), ℓ(ρ)) with δ' = e(π) + 14H + ℓ(ρ). We show e(π) ≥ a + x. There are three cases for how π arose.
π was itself the second period of an earlier valid pair (π₀, π). Then a = e(π₀) and x = ℓ(π). Since π starts after π₀ ends, e(π) = start(π) + ℓ(π) ≥ e(π₀) + ℓ(π) = a + x.
π was never paired. Then x = 0. The anchor a is a duty start that occurred before π began, so a ≤ start(π) ≤ e(π), giving e(π) ≥ a + x.
a = ⊥. No window was open, so there is no provisional deadline to move earlier.
In the first two cases δ' = e(π) + 14H + ℓ(ρ) ≥ a + x + 14H + ℓ(ρ) = δ + ℓ(ρ) ≥ δ. ∎
Operational meaning. A safety system can never be harmed by pairing evaluation. It can only discover more available hours. This justifies computing a provisional view in real time and a corrected view at pair completion.
Theorem 3 (Sustained throughput bound)
In any long chain of valid consecutive pairs, the long-run fraction of time spent on duty or driving is at most 7/12, equivalent to 14 working hours per 24-hour day.
Proof. Let the chain be P₁, w₁, P₂, w₂, …, where Pᵢ are qualifying runs and wᵢ is the total on-duty and non-qualifying time between Pᵢ and Pᵢ₊₁. Consider the moment just before Pᵢ₊₁ begins. The pair (Pᵢ₋₁, Pᵢ) is complete, so a = e(Pᵢ₋₁) and x = ℓ(Pᵢ). Elapsed time since a is wᵢ₋₁ + ℓ(Pᵢ) + wᵢ, so
C14 = wᵢ₋₁ + wᵢ ≤ 14H (legality requires the window not be exceeded)
Every consecutive pair of work blocks therefore satisfies wᵢ₋₁ + wᵢ ≤ 14H. Summing over n consecutive blocks gives 2·Σw ≤ 14H·n, so Σw ≤ 7H·n. Each adjacent pair of rest periods is valid, so ℓ(Pᵢ) + ℓ(Pᵢ₊₁) ≥ 10H, and summing gives 2·Σℓ ≥ 10H·n, so Σℓ ≥ 5H·n. The work fraction Σw / (Σw + Σℓ) increases in Σw and decreases in Σℓ, so it is at most 7n / (7n + 5n) = 7/12. ∎
Operational meaning. Split-sleeper is a scheduling flexibility tool, not a source of extra sustained hours. The engine should be used to route a driver around a closed receiver or a bad traffic window, not to promise more miles per week. The same inequality is what a dispatcher optimizer can use as a feasibility cut.
Interaction with the other limits
| Limit | Behavior with a split |
| 11-hour driving | d11 restarts from driving since the end of the first period when the pair completes |
| 30-minute interruption | Any non-driving period of at least 30 minutes resets d8, including both split periods |
| 60/70-hour cycle | Unaffected by pairing. On-duty time accumulates as normal |
| 34-hour restart | Independent. A restart also satisfies the reset case |
| Adverse driving and short-haul exceptions | Modeled as modifiers on the 14H and 11H constants, not on the FSM structure |
1.6 Reference algorithm
Single pass, O(n) over the ELD event stream, constant memory.
from dataclasses import dataclass, field
from enum import Enum
from typing import Optional, List
H = 3600.0
class S(Enum):
OFF = 0; SB = 1; ON = 2; D = 3
@dataclass
class Run:
start: float
end: float
sb_max: float # longest contiguous SB sub-run
@property
def length(self): return self.end - self.start
@property
def is_long(self): return self.sb_max >= 7 * H
@dataclass
class State:
a: Optional[float] = None # window anchor
x: float = 0.0 # excluded second-period length
pending: Optional[Run] = None # last completed qualifying run
d11: float = 0.0
g: float = 0.0
d8: float = 0.0
def valid(p: Run, r: Run) -> bool:
return (p.length + r.length >= 10 * H and
((p.is_long and r.length >= 2 * H) or
(r.is_long and p.length >= 2 * H)))
def close_run(st: State, r: Run) -> None:
L = r.length
if L >= 0.5 * H:
st.d8 = 0.0
if L >= 10 * H: # R1: full reset
st.a, st.x, st.pending = None, 0.0, None
st.d11 = st.g = 0.0
return
if L < 2 * H: # R2: not qualifying
return
p = st.pending
if p is not None and valid(p, r): # R3: valid pair
st.a = p.end
st.x = L
st.d11 = st.g # driving between the two periods
st.pending = r # R3 and R4: r is the next pending run
st.g = 0.0
def process(segments) -> List[str]:
"""segments: time ordered (status, start, end), adjacent same-status merged."""
st, violations = State(), []
run: Optional[Run] = None
for status, t0, t1 in segments:
if status in (S.OFF, S.SB):
if run is None:
run = Run(t0, t1, (t1 - t0) if status == S.SB else 0.0)
run._cur_sb = (t1 - t0) if status == S.SB else 0.0
else:
run.end = t1
cur = getattr(run, "_cur_sb", 0.0)
cur = cur + (t1 - t0) if status == S.SB else 0.0
run._cur_sb = cur
run.sb_max = max(run.sb_max, cur)
continue
if run is not None:
close_run(st, run); run = None
if st.a is None:
st.a = t0
dur = t1 - t0
if status == S.D:
st.d11 += dur; st.g += dur; st.d8 += dur
if st.d11 > 11 * H: violations.append(f"11h exceeded at {t1}")
if t1 > st.a + 14 * H + st.x: violations.append(f"14h window exceeded at {t1}")
if st.d8 > 8 * H: violations.append(f"8h without break at {t1}")
elif dur >= 0.5 * H:
st.d8 = 0.0
return violations
1.7 Worked traces
All three traces start after a full reset. a is the window anchor, δ the deadline.
Trace A: 8/2
| Time | Status | Event | a | x | Deadline δ | d11 |
| 06:00 | ON | DUTY_START | 06:00 | 0 | 20:00 | 0 |
| 06:00 to 10:00 | D | 4 h driving | 06:00 | 0 | 20:00 | 4 h |
| 10:00 to 18:00 | SB | 8 h run, closes 18:00: long, no pending, R4 | 06:00 | 0 | 20:00 | 4 h |
| 18:00 to 20:00 | D | 2 h driving (g = 2) | 06:00 | 0 | 20:00 | 6 h |
| 20:00 to 22:00 | SB | 2 h run closes 22:00: valid, 8 + 2 = 10, R3 | 18:00 | 2 h | 10:00 next day | 2 h |
At 22:00 the driver has 12 hours of window and 9 hours of driving remaining. The driver had to begin the 2-hour period at or before 20:00, the provisional deadline.
Trace B: 7/3 (short period first)
| Time | Status | Event | a | x | Deadline δ | d11 |
| 06:00 to 12:00 | D | 6 h driving | 06:00 | 0 | 20:00 | 6 h |
| 12:00 to 15:00 | OFF | 3 h run, qualifying, R4 (short period pending) | 06:00 | 0 | 20:00 | 6 h |
| 15:00 to 18:00 | D | 3 h driving (g = 3) | 06:00 | 0 | 20:00 | 9 h |
| 18:00 to 01:00 | SB | 7 h run closes 01:00: long, valid, 3 + 7 = 10, R3 | 15:00 | 7 h | 12:00 next day | 3 h |
Note the recalculation: driving before 15:00 stops counting once the pair completes.
Trace C: 7.5/2.5
| Time | Status | Event | a | x | Deadline δ | d11 |
| 05:00 to 09:00 | D | 4 h driving | 05:00 | 0 | 19:00 | 4 h |
| 09:00 to 16:30 | SB | 7.5 h run, long, R4 | 05:00 | 0 | 19:00 | 4 h |
| 16:30 to 19:00 | D | 2.5 h driving (g = 2.5) | 05:00 | 0 | 19:00 | 6.5 h |
| 19:00 to 21:30 | OFF | 2.5 h run closes 21:30: valid, 7.5 + 2.5 = 10, R3 | 16:30 | 2.5 h | 09:00 next day | 2.5 h |
1.8 Verification strategy
• Property tests for Theorems 1 to 3: random duty sequences, asserting that pair completion never moves the deadline earlier, and that the chained throughput bound holds.
• Golden vectors: the three traces above plus boundary cases (7:00:00 exactly, 6:59:59, 2:00:00 exactly, 9:59:59 total).
• Differential testing against ELD output files from certified devices over real fleet data; log every disagreement with the rule case (R1 to R4) that fired.
• Provisional vs final view: display provisional hours in real time, and re-emit corrected hours at each RUN_CLOSE so dispatch and the driver never see different numbers.
1.9 Deployment architecture
ELD / telematics --> normalizer --> segment merger --> HOS FSM --> hours-remaining API
| |
v v
violation ledger dispatch planner
(hash chained) (feasibility cuts
from Theorem 3)
The normalizer maps the event types in the ELD data file specification onto {OFF, SB, ON, D}, resolves personal conveyance and yard move flags, and flags unassigned driving. The planner calls the FSM in "what-if" mode to test candidate stop sequences before they are tendered.
Strong Tower Consulting provides independent systems architecture, feasibility audits, and engineering roadmaps for motor carriers and freight brokers. Call 763-244-1373 to evaluate practical implementation paths for your fleet.
CHAPTER 2: Fraudulent Chameleon Carrier FMCSA Graph Entity Resolution
2.1 The threat model
Onboarding fraud in freight comes in three shapes. They need different evidence, but one graph catches all three.
| Typology | What the fraudster does | What stays the same |
| Chameleon / reincarnated carrier | Shuts down or loses authority, then reopens under a new DOT and MC number | Principals, addresses, phone numbers, equipment (VINs), insurance agents, bank accounts |
| Identity theft | Impersonates a legitimate carrier: spoofed website, look-alike email domain, changed contact data on the registration record | The target's real DOT and MC numbers; what changes is the contact channel and remit-to details |
| Ghost carrier | Registers an entity with little or no real operation to bid on loads, then double-brokers or steals the freight | Nothing real: no inspections, no equipment, implausible capacity |
The defense is the same in each case: resolve identities across records, then measure how close a new applicant sits to known bad entities.
2.2 Graph schema
Node types
Carrier | dot, mc, scac, legal_name_norm, status, authority_granted, authority_revoked, power_units, drivers |
Principal | name_norm, name_phonetic, role, person_key (salted hash of stable identifiers) |
Address | canonical_street, city, state, zip, type (physical, mailing, registered agent), commodity_flag |
VOIP | e164, line_type, provider, ported_at, first_seen |
VIN | vin, decoded_make, decoded_year, body_class |
Policy | insurer, policy_no_hash, agent_id, effective, cancelled, filing_type |
Edge types
SHARED_IP | Carrier to Carrier | Registration sessions or portal logins from the same IP, ASN block, or device fingerprint within a time bound | Onboarding portal telemetry |
REHYDRATED_DOT | Carrier (new) to Carrier (old) | New entity is statistically the same operation as an old one that lost authority or was shut down | Derived (Section 2.4) |
COMMON_BENEFICIARY | Carrier to Carrier | Same remit-to account, factor, payee, or insurance beneficiary behind both | Banking and factoring data, policy records |
PRINCIPAL_OF | Principal to Carrier | Named officer, owner, or contact | MCS-150, state filings |
LOCATED_AT | Carrier to Address | Registered or operating address | MCS-150, state filings |
USES_PHONE | Carrier to VOIP | Phone on registration or packet | Registration, onboarding packet |
OPERATES_VIN | Carrier to VIN | Equipment tied to the carrier | Insurance schedules, inspections, registrations |
INSURED_BY | Carrier to Policy | Active or historical coverage | FMCSA insurance filings, certificates |
graph LR
C1[Carrier A<br/>DOT revoked] -- PRINCIPAL_OF --- P1[Principal]
C2[Carrier B<br/>new DOT] -- PRINCIPAL_OF --- P1
C1 -- LOCATED_AT --- A1[Address]
C2 -- LOCATED_AT --- A1
C1 -- OPERATES_VIN --- V1[VIN]
C2 -- OPERATES_VIN --- V1
C2 -- USES_PHONE --- T1[VOIP]
C3[Carrier C<br/>applicant] -- USES_PHONE --- T1
C3 -- SHARED_IP --- C2
C2 -- REHYDRATED_DOT --> C1
C3 -- COMMON_BENEFICIARY --- C2
Example queries (property graph, Cypher style)
// Applicant shares equipment with an entity that lost authority within 24 months
MATCH (new:Carrier {dot: $dot})-[:OPERATES_VIN]->(v:VIN)<-[:OPERATES_VIN]-(old:Carrier)
WHERE old.status IN ['REVOKED','OUT_OF_SERVICE','INACTIVE_ADVERSE']
AND old.authority_revoked > date() - duration('P24M')
RETURN old.dot, collect(v.vin) AS shared_vins, count(v) AS n
// Two hops: applicant -> principal -> carrier -> address
MATCH p=(new:Carrier {dot:$dot})<-[:PRINCIPAL_OF]-(pr:Principal)
-[:PRINCIPAL_OF]->(other:Carrier)-[:LOCATED_AT]->(a:Address)
WHERE other.dot <> new.dot AND a.commodity_flag = false
RETURN other.dot, other.status, a.canonical_street
2.3 Entity resolution
Step 1: Normalize and block
- Names: uppercase, strip punctuation and legal suffixes (LLC, INC, TRUCKING, TRANSPORT, EXPRESS), expand abbreviations, compute phonetic codes.
- Addresses: standardize to a postal canonical form, geocode, and flag commodity addresses (registered-agent offices, virtual offices, mail drops, truck stops).
- Phones: look up line type (landline, mobile, non-fixed VoIP), carrier, and port history.
- Blocking keys:
zip3 + phonetic(name), canonical address, principal phonetic + state, VIN, phone. Blocking keeps pair comparison near linear.
Step 2: Fellegi-Sunter weights with value rarity
For each attribute k compare two records u and v.
m_k = P(agree on k | same entity)
f_k(z) = population frequency of the shared value z
w_k = log2( m_k / f_k(z) ) if they agree on z
w_k = log2( (1 - m_k) / (1 - f_k(z)) ) if they disagree
W(u,v) = Σ_k w_k
P(match) = 1 / ( 1 + 2^-( W + log2 prior_odds ) )
Because f_k(z) is the frequency of the specific shared value, agreement on a rare value is worth a lot and agreement on a common value is worth almost nothing. Two carriers at a registered-agent address in a state where thousands of entities use it produce f ≈ 0.02 and a small weight. Two carriers with the same 17-character VIN produce f ≈ 10⁻⁹ and an enormous one. This is the inverse-document-frequency idea applied to identity.
To avoid double counting correlated attributes (an address and a phone that both come from the same business card), group correlated attributes and take the maximum weight within a group rather than the sum.
Step 3: Edge confidence
p_e = P(match) becomes the confidence on the derived edge. Matching is done to a threshold τ_edge (start near 0.6) and re-tuned from labeled outcomes.
2.4 Deriving REHYDRATED_DOT
A new carrier n and an old carrier o with adverse history are linked when independent evidence of continuity accumulates.
For each evidence channel i in {principal, address, phone, VIN set, policy/agent, bank/payee, device/IP}:
p_i = match probability from Section 2.3
g_i = temporal gate = exp( -Δt / T_i ) (Δt = gap between old exit and new entry)
Evidence score S(n,o) = 1 - Π_i ( 1 - p_i · g_i ) (noisy-OR)
Severity sev(o) ∈ [0,1] from the old entity's history:
revoked for safety or insurance = 1.0
out-of-service order = 0.9
inactive after adverse events = 0.6
voluntary clean exit = 0.1
Edge weight ω(n,o) = S(n,o) · sev(o)
Create edge if S(n,o) ≥ τ_edge
The VIN channel deserves a continuity measure beyond exact equality. With V(n) and V(o) the sets of VINs seen on each entity,
Jaccard(n,o) = |V(n) ∩ V(o)| / |V(n) ∪ V(o)|
p_VIN = 1 - (1 - q)^|V(n) ∩ V(o)| (q = per-VIN continuity probability, near 0.9)
Each shared VIN is nearly independent evidence of operational continuity because sharing a physical truck is much rarer than sharing an address.
2.5 Scoring algorithm
Risk seeds and propagation
Let s₀(v) ∈ [0,1] be known-bad evidence on a node: revoked authority, out-of-service order, confirmed double brokering, cargo theft finding, fraud chargeback. Let W be the weighted adjacency matrix where each edge weight is ω_type · p_e, and let P be its row-normalized form so each row sums to at most 1.
Risk propagation is personalized PageRank with restart toward the seeds:
r = (1 - α) s₀ + α Pᵀ r with damping α in (0,1), typically 0.5 to 0.7
r = (1 - α) ( I - α Pᵀ )⁻¹ s₀
Theorem 4 (Well-posedness and convergence)
For 0 < α < 1, the fixed point exists, is unique, is non-negative, and the iteration r⁽ᵏ⁺¹⁾ = (1-α) s₀ + α Pᵀ r⁽ᵏ⁾ converges geometrically from any start.
Proof. The map T(r) = (1-α) s₀ + α Pᵀ r is affine. Under the induced 1-norm, ‖αPᵀ‖₁ = α · max column sum of Pᵀ, which equals α times the maximum row sum of P, at most α < 1. So T is a contraction, and the Banach fixed-point theorem gives a unique fixed point with ‖r⁽ᵏ⁾ - r*‖ ≤ αᵏ ‖r⁽⁰⁾ - r*‖. Non-negativity follows because (I - αPᵀ)⁻¹ = Σ αᵏ (Pᵀ)ᵏ is a convergent series of non-negative matrices. ∎
Theorem 5 (Hub dilution)
A commodity node of degree k (for example a registered-agent address) passes at most α · r(h) / k of its risk to each neighbor, so shared common addresses cannot flood the graph with false risk.
Proof. Row normalization gives each outgoing edge of h weight at most 1/k when edge weights are equal, and at most ω_max / Σ ω in general. Each neighbor therefore receives at most α · r(h) / k (up to the weight ratio). Because k is large for commodity nodes and the edge weights already carry the value-rarity weights of Section 2.3, the contribution vanishes as k grows. ∎
Direct-feature risk and final score
Graph risk is combined with first-party evidence by noisy-OR so independent signals compound without exceeding 1.
R = 1 - ( 1 - r_graph ) · Π_j ( 1 - p_j ) over triggered direct features j
The probabilities p_j below are starting priors to be calibrated against your own labeled outcomes.
| Direct feature | Typology | Starting p_j |
| Contact email or phone changed on the registration record within 30 days of applying | Identity theft | 0.35 |
| Packet phone is not the phone on the federal registration record | Identity theft | 0.30 |
| Email domain registered under 90 days, or look-alike of the carrier's real domain | Identity theft | 0.40 |
| Non-fixed VoIP number as the primary phone | Ghost, chameleon | 0.15 |
| Authority under 90 days old with requested volume above plausible capacity | Ghost | 0.25 |
| Zero roadside inspections with power units above 5 | Ghost | 0.20 |
| Remit-to account changed within 14 days of first tender | Identity theft | 0.45 |
| Insurance certificate from an agent not matching the filed agent | Identity theft | 0.30 |
| UIIA status or SCAC inconsistent with the DOT on file (intermodal applicants) | Ghost, chameleon | 0.25 |
| Secretary of State filing shows formation after the old entity's revocation, same officers | Chameleon | 0.40 |
Capacity plausibility check. With U declared power units, weekly loaded miles M requested must satisfy M ≤ U · M_max, where M_max is a physical bound (for example 3,000 to 3,500 miles per unit per week for solo drivers). A carrier requesting M far above the bound is a capacity ghost.
Decision tiers
| Below 0.20 | Auto-approve with standard monitoring |
| 0.20 to 0.50 | Step-up: callback to the number on the federal record, document upload, micro-deposit verification |
| 0.50 to 0.80 | Hold for analyst review with the evidence subgraph attached |
| 0.80 and above | Decline, with the specific edges and features that drove the score recorded |
Every action stores the evidence subgraph (the nodes and edges that raised the score) so the decision is explainable to the applicant, to insurers, and in any later dispute.
2.6 Data sources and fusion
| Source | What it contributes |
| FMCSA SAFER company snapshot and licensing and insurance data | Authority status and history, power units, drivers, mileage, insurance filings, operating classification |
| FMCSA registration records and change history | Contact, address, and principal data, and when it changed |
| Roadside inspection and crash history | Operational reality, VIN and carrier linkage |
| UIIA and the intermodal interchange provider network | Whether the carrier is a recognized intermodal participant, SCAC and equipment interchange standing |
| Secretary of State corporate filings | Formation dates, officers, registered agent, dissolutions, name changes |
| Postal and geocoding services | Canonical addresses and commodity-address flags |
| Telephony lookups | Line type, port history, carrier |
| Vehicle decoding (public VIN decoders) | Make, year, body class, plausibility against declared equipment |
| Onboarding portal telemetry | IP, ASN, device fingerprint, session timing |
| Banking and factoring validation | Account ownership validation and payee overlap |
2.7 Pipeline
flowchart LR
A[Applicant packet] --> B[Normalize and block]
B --> C[Fellegi-Sunter match<br/>with value rarity]
C --> D[Derive edges:<br/>REHYDRATED_DOT, SHARED_IP,<br/>COMMON_BENEFICIARY]
D --> E[Propagate risk<br/>personalized PageRank]
E --> F[Fuse with direct<br/>features, noisy-OR]
F --> G{Tier}
G -->|low| H[Approve]
G -->|mid| I[Step-up verification]
G -->|high| J[Analyst hold<br/>evidence subgraph]
G -->|critical| K[Decline with reasons]
I --> F
J --> L[Outcome labels]
H --> L
K --> L
L --> M[Recalibrate weights and priors]
2.8 Operations and fairness controls
- Cluster view. Run community detection (Leiden or Louvain) on the thresholded graph weekly. A cluster in which several members have adverse histories is a standing watchlist for any new applicant that links into it.
- Human review for adverse action. Scores route applicants; people decide. The evidence subgraph supports that decision and the explanation to the applicant.
- Backtesting. Replay historical onboardings and measure precision at each tier, time-to-detection, and stability of rankings when edge thresholds shift.
- Callback protocol. Verify any contact change by calling the number on the federal registration record, never the number on the packet.
- Data hygiene. Use salted hashes for personal identifiers and for bank and policy numbers. Keep the graph free of data that is not needed for the match.
Strong Tower Consulting provides independent systems architecture, feasibility audits, and engineering roadmaps for motor carriers and freight brokers. Call 763-244-1373 to evaluate practical implementation paths for your fleet.
CHAPTER 3: Refrigerated FSMA 204 Tamper-Proof Cold Chain Audit Vault
3.1 The problem
A receiver rejects a trailer of produce, protein, or dairy and cites a temperature reading. The carrier then faces a cargo claim under the Carmack Amendment (49 U.S.C. § 14706). The facts that decide the claim are usually these:
• What was the product core temperature at pickup, and did the shipper pre-cool the load?
• What did the unit do between pickup and delivery: setpoint, mode, defrost cycles, door events?
• What was the product core temperature (not just air temperature) over time?
• Can any of these records be shown to be unaltered since they were created?
A carrier with only a return-air chart can answer the second question and nothing else, and the receiver's probe reading at the dock tends to win. This chapter builds the records and the physics that answer all four.
Regulatory context
- Carmack Amendment: the claimant makes a prima facie case by showing delivery in good condition, arrival in damaged condition, and the amount of damages. The carrier then bears the burden of showing it was free from negligence and that the damage resulted from a recognized exception (for example act of the shipper or inherent vice of the goods).
- FSMA Section 204 traceability rule (21 CFR Part 1, Subpart S): requires key data elements (KDEs) at critical tracking events (CTEs) for foods on the Food Traceability List, with records provided to FDA as an electronic sortable spreadsheet within 24 hours on request. The compliance date was extended by FDA to July 20, 2028. Confirm the current date before planning.
- Sanitary Transportation of Human and Animal Food rule (21 CFR Part 1, Subpart O): carriers must keep records of temperature specifications and operations, and shippers must specify them.
Carriers that generate Shipping and Receiving CTE-grade data now support every shipper and receiver customer, and they build the evidence record for cargo claims at the same time.
3.2 Evidence architecture
SENSORS (per trailer) EDGE RECORDER VAULT
+-------------------------+ +--------------------------+ +----------------------+
| return air probe | | secure element (keys) | | append-only storage |
| supply air probe | -----> | monotonic counter |---->| (write once, read |
| product pulp probes x N | | hash chain + Merkle root | | many, object lock) |
| reefer unit mode, set- | | local signing | +----------+-----------+
| point, defrost flag | | store-and-forward buffer | |
| door and reefer events | +--------------------------+ v
| GPS and time source | +----------------------+
+-------------------------+ | independent time |
| anchor (RFC 3161) |
+----------+-----------+
v
+----------------------+
| DOSSIER BUILDER |
| thermal model, PDF, |
| manifest, verifier |
+----------------------+
Sensor set
| Return air and supply air | What the refrigeration unit is doing |
| Pulp probes (two or more per load: e.g. front/top and rear/bottom) | Ground truth for product temperature, and the boundary condition for the thermal model |
| Setpoint, unit mode (cool, heat, defrost, null, off), alarms | Shows compliance with the shipper's instruction |
| Door open and close | Explains air excursions |
| GPS and speed | Location, dwell at shippers and receivers |
| Pickup and delivery attestations | Probe readings, photos, signatures with timestamps |
3.3 Cryptographic logging
Record chain
Every sample is a record rᵢ = (device_id, seq, t_device, counter, payload). The chain value is
h₀ = H( device_id || trip_id || genesis_nonce )
hᵢ = H( hᵢ₋₁ || encode(rᵢ) ) H = SHA-256
Every N records (for example every 15 minutes) the device builds a Merkle tree over the records in the block, signs the root together with the last chain value:
block_sig = Sign_sk( merkle_root || hᵢ || block_index || counter || t_device )
The signing key sk lives in a secure element on the recorder and never leaves it. The public key is registered to the device in the vault at commissioning.
Independent time
At least once per hour (and at trip start and end) the block signature hash is submitted to a trusted timestamp authority using the RFC 3161 protocol. The returned token proves the block existed no later than that time. A second anchor is written to write-once storage with object-lock retention. Two independent anchors make backdating impractical.
Gap and tamper detection
| Edit a record | Chain value hᵢ for all later records no longer verifies; Merkle proof fails |
| Delete a record | seq gap; chain break; counter gap |
| Insert a record | Chain break; Merkle proof fails |
| Replace a whole block with a forged one | Signature fails (no sk); timestamp token mismatch |
| Clock rollback or fast-forward | Monotonic counter and RFC 3161 token disagree with t_device |
| Device swap | Registered public key does not match |
| Radio dead zone | Records are buffered and signed at creation time; they upload later with the original signatures |
Theorem 6 (Tamper evidence)
If SHA-256 is collision-resistant and the signing scheme is existentially unforgeable, then any modification, deletion, insertion, or reordering of records in a signed and timestamped block is detected by an independent verifier who holds only the public key, the records, and the timestamp token, except with negligible probability.
Proof sketch. Suppose an adversary produces records r' differing from the signed records r yet verifying under the same signed root. Either merkle_root(r') = merkle_root(r), which with differing leaves yields a SHA-256 collision, or the adversary produced a valid signature on a different root without sk, contradicting unforgeability. Chain-continuity covers cross-block edits: a changed record changes hᵢ and every later value, and the later signed blocks already commit to the original hᵢ. Backdating requires a forged timestamp token, which requires compromising the timestamp authority. The probability of a collision found by a generic attack is bounded by about 2⁻¹²⁸ (birthday bound for a 256-bit hash). ∎
Key management
Per-device keys generated in the secure element, rotated on a schedule, revoked on device loss, with a published revocation list in the vault. Firmware that handles keys is signed, and boot attestation values are recorded in the first block of each trip.
3.4 Thermal inertia mathematics
Return air is not product temperature. The sensor that the refrigeration unit controls responds in seconds to minutes. A pallet of produce responds in hours. A defrost cycle, a door opening, or a brief setpoint change can swing return air by several degrees without moving the core by a fraction of a degree. The model below makes that difference computable.
Lumped-capacitance model
For a load with mass m, specific heat c_p, effective surface heat transfer coefficient h, effective area A, and ambient (air) temperature T_a(t):
m · c_p · dT_p/dt = h · A · ( T_a(t) - T_p(t) ) + Q_r(T_p)
τ = m · c_p / ( h · A ) thermal time constant
dT_p/dt = ( T_a - T_p ) / τ + Q_r / ( m · c_p )
Q_r is respiration heat for fresh produce (a rising function of temperature) and zero for frozen or processed goods.
Exact solution, piecewise-constant ambient
Over a sample interval Δ with ambient held constant at T_a[k] (and Q_r held at its start value), the exact update is
T_p[k+1] = T_a[k] + ( T_p[k] - T_a[k] ) · e^(-Δ/τ) + τ · q_k · ( 1 - e^(-Δ/τ) )
q_k = Q_r( T_p[k] ) / ( m · c_p )
This is exact for the model, with no discretization error from step size, so the estimator is stable for any sample rate.
Validity of the lumped model
The model is valid when the Biot number Bi = h · L_c / k_p is below about 0.1, where L_c is the characteristic length of the product and k_p its thermal conductivity. For palletized cartons, the air-gap and packaging resistance dominate, and Bi is small in effect. For dense or bulk product (large blocks, frozen cases, bulk bins) use a two-node model (air to package to core):
d/dt [T_pkg] = [ -(1/τ₁ + 1/τ₂) 1/τ₂ ] [T_pkg] + [ 1/τ₁ ] T_a
[T_core] [ 1/τ₃ -1/τ₃ ] [T_core] [ 0 ]
where τ₁ is air-to-package, τ₂ package-to-core, and τ₃ core-to-package. The discrete update uses the matrix exponential.
Theorem 7 (Excursion bound)
Suppose the product starts at core temperature T₀, and the ambient air stays within [T_set - δ₋, T_set + δ₊] except during an excursion of duration d with ambient at most T_set + Δ_x (with Δ_x ≥ δ₊). If the product is at or below T_set when the excursion begins, then the core temperature at the end of the excursion exceeds T_set by at most Δ_x · ( 1 - e^(-d/τ) ).
Proof. Take the excursion ambient T_a ≤ T_set + Δ_x and initial T_p(0) ≤ T_set. Define y = T_p - T_set. Then dy/dt = (T_a - T_set - y)/τ ≤ (Δ_x - y)/τ. Comparison with the solution of the equality y' = (Δ_x - y)/τ, y(0) = 0, gives y(d) ≤ Δ_x (1 - e^{-d/τ}). Because the right side of the differential inequality is increasing in T_a and decreasing in y, the comparison principle applies. ∎
Worked example: defrost and door events
A mixed produce load has τ = 10 h (a measured value for tightly packed pallets in cartons; range in practice is roughly 4 to 24 hours depending on pack and airflow).
| Event | Ambient excursion Δ_x | Duration d | Maximum core rise Δ_x (1 - e^(-d/τ)) |
| Defrost cycle | +8 °C | 30 min | 8 × (1 - e^(-0.05)) = 0.39 °C |
| Door open at dock | +12 °C | 20 min | 12 × (1 - e^(-0.033)) = 0.39 °C |
| Unit failure, repaired | +15 °C | 2 h | 15 × (1 - e^(-0.2)) = 2.72 °C |
| Extended failure | +15 °C | 6 h | 15 × (1 - e^(-0.6)) = 6.77 °C |
A return-air log shows a spike of 8 to 15 °C in each row. The core responds by under half a degree in the first two. That is the gap between what the air probe shows and what the product experienced.
Periodic disturbance attenuation
For a sinusoidal ambient disturbance of amplitude A and period P (for example regular defrost cycles), the steady-state core amplitude is
A_core = A / sqrt( 1 + ( 2π τ / P )² )
With τ = 10 h, P = 6 h, A = 4 °C: 2πτ/P = 10.47, so A_core ≈ 0.38 °C, an attenuation of about 90 percent.
Parameter estimation and uncertainty
• At loading, record pulp probe readings alongside air readings, and fit τ by least squares on the first several hours (ln of the normalized gap (T_p - T_a) is linear in t with slope -1/τ when ambient is steady).
• Use a Kalman filter on T_p with the pulp probes as measurements and the model above as dynamics, so probe noise and short dropouts do not create phantom excursions.
• Report a band, not a line. For forcing above the product temperature, the response is monotone in τ: larger τ means a slower rise. So evaluate the model at τ_low and τ_high from the fit confidence interval to produce an envelope; for more complex forcing use Monte Carlo sampling over τ.
Excursion metrics
For limit T_lim and estimated core temperature T̂_p(t):
Time above limit E_t = ∫ 1[ T̂_p(t) > T_lim ] dt
Degree-hours above E_d = ∫ max( 0, T̂_p(t) - T_lim ) dt
Worst-case (envelope) E_d⁺ evaluated on the upper envelope
A load for which E_d⁺ = 0 has a mathematically supported claim that the product never exceeded the limit even if the air did.
3.5 The court-ready dossier
The dossier is a self-verifying package. Each piece is designed to meet an evidentiary need that the other side will probe.
Contents
| 1. Shipment identity | BOL, load number, shipper and receiver, origin and destination, KDE-aligned lot and quantity data | Ties the data to the freight in dispute |
| 2. Instructions | Shipper's setpoint and pre-cool instruction, rate confirmation excerpt | Shows what the carrier was told to do |
| 3. Pickup state | Pulp probe readings and photos at loading, load temperature, trailer pre-cool log, signatures | The boundary condition and shipper responsibility |
| 4. Unit log | Setpoint, mode, defrost events, alarms across the trip | Shows the unit did what it was told |
| 5. Air temperatures | Return and supply series | The data a receiver usually sees |
| 6. Product model | Estimated core temperature with envelope, parameters, fit quality, excursion metrics | The physics that connects air to product |
| 7. Door and location events | Dwell times, door opens, geofence events | Explains excursions, ties them to third parties |
| 8. Delivery state | Receiver probe readings and photos, rejection reason, any conflicting readings, probe calibration data | Tests the rejection claim |
| 9. Custody and integrity | Chain of custody table, public keys, block signatures, timestamp tokens, hash manifest | Authentication |
| 10. Verifier | A standalone script and instructions for an independent party to recompute every hash and check every signature | Reproducibility |
| 11. Method statement | Model equations, assumptions, validation results, known error bounds | Support for expert testimony |
Mapping to the Carmack framework
| Legal question | Dossier answer |
| Was the cargo delivered to the carrier in good condition? | Section 3: pickup pulp temperature and shipper pre-cool state |
| Did the cargo arrive damaged? | Section 6 and 8: modeled and measured core state against the receiver's claim |
| Was the carrier free from negligence? | Section 4: setpoint compliance, alarms handled, maintenance records |
| Is there a recognized exception? | Section 3 and 7: shipper-caused conditions (warm load, wrong setpoint instruction, blocked airflow), or inherent condition of the goods |
| How much is actually at stake? | Section 6: excursion metrics tied to a specific shelf-life or quality threshold |
Evidence-admissibility design
The package is built to satisfy the usual foundation requirements, and the carrier's counsel decides how to present it:
- Business records. Routine, contemporaneous, system-generated logs maintained in the regular course of business (Federal Rule of Evidence 803(6)), with a custodian certification (FRE 902(11)).
- Machine-generated data. A qualified person's certification that copies from electronic devices and systems were verified by hash comparison (FRE 902(13) and 902(14)).
- Authentication of a process. The verifier and method statement document how the system produces accurate results (FRE 901(b)(9)).
- Summaries. Charts and tables are derived from, and traceable back to, the underlying records (FRE 1006).
- Expert testimony. The thermal model is a published first-order heat transfer model, validated against pulp probe data, with a stated error rate, which supports the usual reliability inquiry (FRE 702).
Producing the dossier
trip ends --> assemble blocks + tokens --> verify chain --> fit model --> envelope --> render PDF
| |
v v
integrity report hash manifest (SHA-256 of every file)
|
timestamp the manifest, store in vault
The manifest hash is itself timestamped, so the dossier as delivered to the other party can be tied to a fixed moment.
3.6 Operating model
- Shipper onboarding: capture each shipper's pre-cool and loading temperature instructions in a structured form, so Section 2 is generated automatically.
- Real-time alerts are driven by the modeled core temperature and its envelope, not just return air. This cuts false alarms from defrost and door events and catches slow drifts that return air hides.
- Claim triage: when a rejection arrives, the dossier is assembled in minutes, and the excursion metrics decide whether to contest, settle, or counter with a shipper-responsibility notice.
- Retention matches the longest claim and FDA record window your customers require, with legal-hold flags that override deletion.
Strong Tower Consulting provides independent systems architecture, feasibility audits, and engineering roadmaps for motor carriers and freight brokers. Call 763-244-1373 to evaluate practical implementation paths for your fleet.
CHAPTER 4: Automated Intermodal Chassis Split & LFD Demurrage Mitigation
4.1 The operating problem
A drayage truck at a marine terminal makes gate moves. Each gate move costs time, fuel, and driver hours. Two kinds of waste dominate:
• Single-mission turns. A truck delivers an export, leaves empty, then returns later for an import. A dual-mission turn does both in one visit: the truck arrives with an export container mounted on its chassis, the terminal grounds that container, then loads an import container onto the same chassis, and the truck leaves with the import.
• Chassis splits. The container is at the terminal and the chassis must come from a pool yard elsewhere, which forces an extra stop and extra deadhead.
Layered on top is the clock. Each import container has a last free day (LFD). After it, ocean carrier and terminal demurrage accrues, and for rail containers the railroad's ramp storage or per diem. Detention and chassis rental accrue while equipment is out. Many of these charges are billed for days on which the cargo interest could not actually retrieve or return the container.
4.2 Dual-mission turns as bipartite matching
Model
- Left set
E = {e₁, …, eₘ}: exports mounted on chassis, arriving at the terminal.
- Right set
J = {j₁, …, jₙ}: imports grounded in the stack, awaiting pickup.
- A pair
(eᵢ, jₖ) is an edge if the dual-mission turn is feasible.
Feasibility constraints
| Chassis compatibility | The chassis carrying eᵢ can carry jₖ: length (20, 40, 45), gooseneck or tri-axle requirement, overweight needs, reefer genset or power needs |
| Equipment ownership | Ocean carrier and pool rules permit that chassis with that container line, and the terminal accepts it |
| Time windows | Export delivery window and cutoff for eᵢ and pickup appointment and LFD for jₖ overlap: arrive(eᵢ) + turn_time ≤ latest_pickup(jₖ) |
| Terminal rules | Same terminal, same gate type, and dual transactions allowed for the commodity and container types |
| Hazmat and customs | Compatible and released: the import is available, with no unresolved hold |
| Driver and hours | The assigned driver has hours remaining, as computed by the Chapter 1 engine |
Edge weight
The weight is the savings from the dual turn versus doing the two moves separately, plus a risk term for imports near their LFD.
w(eᵢ, jₖ) = [ C_alone(eᵢ) + C_alone(jₖ) - C_chain(eᵢ, jₖ) ] + λ · U(jₖ, tᵢₖ)
C_* = operating cost: deadhead miles, driver time, fuel, gate fees, chassis days
U(j,t) = avoided demurrage and per diem
= Φ_j( t_alt(j) ) - Φ_j( t )
Φ_j(t) = cumulative tariff charge on container j if picked up at time t
t_alt = the next feasible pickup time if j is not matched now
Because tariffs escalate with days past LFD, Φ_j is convex, so an import already past LFD earns a large U for every day of delay avoided. That makes the matcher prefer urgent imports without a hand-written priority rule.
Optimization problem
maximize Σ w(eᵢ, jₖ) · x_ik
subject to Σₖ x_ik ≤ 1 for each export i
Σᵢ x_ik ≤ 1 for each import k
x_ik ∈ {0,1}, x_ik = 0 where (i,k) is infeasible
Unmatched exports and imports are served as single-mission moves at their standalone cost, which is already folded into w through C_alone.
Theorem 8 (Integrality and polynomial solvability)
The linear relaxation of the problem has an integral optimal solution, and it can be found in O(n³) time by the Hungarian algorithm.
Proof. The constraint matrix is the vertex-edge incidence matrix of a bipartite graph, which is totally unimodular: every square submatrix has determinant in {-1, 0, 1}. A linear program over a polytope {x : Ax ≤ b, x ≥ 0} with A totally unimodular and b integral has integral vertices, so the simplex method or any vertex-finding method returns a 0-1 solution. The Kuhn-Munkres (Hungarian) algorithm solves the equivalent assignment problem on the square-padded matrix in O(n³). ∎
Why greedy fails
Take two exports and two imports with savings (dollars):
j1 j2
e1 100 90
e2 90 10
Greedy takes the largest edge (e1, j1) = 100, which forces (e2, j2) = 10, for a total of 110. The optimum is (e1, j2) + (e2, j1) = 90 + 90 = 180. Dispatchers who match by "best single pair first" leave roughly 40 percent on the table in this example, and the gap grows with problem size.
Rolling-horizon operation
Arrivals and releases are continuous, so the matcher runs on a rolling horizon:
• Every few minutes, build the graph from trucks within a radius of the terminal, exports with appointments in the next window, and available imports.
• Solve the assignment.
• Commit only edges that expire inside the next horizon, and release the rest to re-optimize. This keeps the plan stable while preserving flexibility.
• Add a small stability bonus ε on edges that were in the previous solution, to prevent churn from tiny weight changes.
4.3 Chassis split as a flow problem
The chassis pool adds capacity and location. Model it as a min-cost flow:
source --> chassis pool yards (capacity = chassis on hand, by type)
--> pickup move nodes (import container j requires a chassis of type T_j)
--> dual-mission links (export chassis released at the terminal is reused for import j)
--> sink
arc costs = deadhead miles to the pool yard + chassis day-rate + pool dwell fees
reuse arc cost = 0 (the chassis never leaves the terminal)
A dual-mission match creates a zero-cost chassis reuse arc, which removes the pool trip entirely. The flow formulation lets the optimizer decide when it is cheaper to take a split (pool pickup) for an urgent container than to wait for a dual match.
flowchart LR
S((Source)) --> P1[Pool yard A<br/>cap by type]
S --> P2[Pool yard B]
P1 -->|deadhead cost| J1[Import j1]
P2 -->|deadhead cost| J2[Import j2]
E1[Export e1<br/>chassis mounted] -->|cost 0 reuse| J1
E2[Export e2<br/>chassis mounted] -->|cost 0 reuse| J2
J1 --> T((Sink))
J2 --> T
4.4 LFD clock mathematics and clock-stop accounting
The retrievability indicator
The cargo interest can only be charged for time when it was practically able to retrieve the container. Define
u(t) = 1 if all of the following hold at time t:
- container released and available (no unresolved hold)
- terminal gate open and operating
- a pickup appointment slot was available to the carrier
- a compatible chassis was obtainable
- the container was physically accessible in the yard
= 0 otherwise
Each factor comes from a recorded data feed (Section 4.5). The indicator u(t) partitions time into chargeable and non-chargeable intervals.
Recomputed last free day
Let F be the free days allowed, K(d) ∈ {0,1} the tariff's calendar rule (for example excluding weekends and holidays), and θ ∈ (0,1] the fraction of the terminal's operating hours on day d during which u = 1 for the day to count. Define a day counter
c(d) = K(d) · 1[ coverage(d) ≥ θ ] with coverage(d) = (hours with u=1 on day d) / (terminal operating hours on day d)
LFD' = min { D : Σ_{d = d₀ to D} c(d) ≥ F }
The parameter θ encodes the dispute position (a strict reading uses θ = 1, meaning a day counts only if the container was retrievable all operating hours, and a lenient reading counts a day with any retrievability). Both are recorded in the dossier so the argument is explicit.
Theorem 9 (Clock-stop monotonicity)
For any retrievability indicator u, LFD' ≥ LFD, and the recomputed charge is no greater than the billed charge.
Proof. By construction c(d) ≤ K(d) pointwise, with equality when u ≡ 1 on operating hours. The tariff's original LFD is min { D : Σ K(d) ≥ F }. Since Σ c(d) ≤ Σ K(d) for every D, the recomputed sum reaches F no earlier, so LFD' ≥ LFD. For charges, let rate(k) be the nondecreasing daily rate for the k-th chargeable day after LFD. Moving the start of chargeable days from LFD to LFD' removes the earliest billed days, and every remaining day is assigned an index no larger than before. Because rate is nondecreasing, each remaining term does not increase, so the total does not increase. ∎
Disputed amount
Fee_billed = Σ_{k = 1 to n_b} rate(k)
Fee_recomp = Σ_{k = 1 to n_r} rate(k) n_r = max(0, return_day - LFD')
Dispute = Fee_billed - Fee_recomp ≥ 0
4.5 Automated evidence generation under OSRA-22
Regulatory background
The Ocean Shipping Reform Act of 2022 (Pub. L. 117-146) and the Federal Maritime Commission's rules built on it govern demurrage and detention billing by ocean common carriers and marine terminal operators. In summary, the billing rule (46 CFR Part 541) requires timely invoices that carry specified minimum content, gives the billed party a window to dispute, requires the billing party to answer within a fixed period, and ties collectability to compliance. The FMC's interpretive rule on demurrage and detention (46 CFR Part 545) states the incentive principle: charges exist to encourage prompt movement of cargo and return of equipment, so they serve little purpose when the cargo interest cannot retrieve or return the container. Confirm the current text and periods for your trade lane.
Rail ramp storage and per diem are governed by railroad tariffs and the applicable rail regulatory framework rather than the FMC billing rule. The same clock-stop engine runs against the railroad's tariff definitions, and the evidence package carries that tariff in place of the FMC citations.
Clock-stop event taxonomy
| CS1 | Terminal closed, holiday, weather shutdown, labor action | Terminal notices, port status feeds, archived web pages |
| CS2 | No appointment available to the carrier | Appointment system availability logs and screenshots with timestamps |
| CS3 | Chassis unavailable at terminal or pool | Pool inventory feeds, failed pickup attempts, dispatch logs |
| CS4 | Container not released or on hold | Release status feeds, EDI status messages |
| CS5 | Gate system or terminal operating system outage | Terminal notices, gate transaction gaps |
| CS6 | Container inaccessible in stack | Terminal operating system status, terminal communications |
| CS7 | Empty return location closed or at capacity | Empty receiving rules and notices, gate rejection records |
| CS8 | Truck waiting inside the terminal beyond normal turn time | GPS geofence dwell, gate in and out timestamps |
Data inputs
- Gate-in and gate-out transactions and terminal operations status messages (for example EDI 322 and related EDI 315 and 214 status messages)
- Appointment records and availability snapshots taken at the times the carrier tried to book
- Driver GPS and geofence dwell
- Dispatch and communication logs
- Terminal and ocean carrier notices archived with timestamps
- Invoice and tariff documents as received
Pipeline
flowchart TD
A[Container list with LFD and tariff] --> B[Collect feeds:<br/>gate, appointment, GPS, status, notices]
B --> C[Hash and timestamp each artifact]
C --> D[Compute u t and coverage per day]
D --> E[Recompute LFD prime and fee]
E --> F[Check invoice compliance:<br/>timeliness, content, billed party]
F --> G[Assemble dispute package]
G --> H{Deadline check}
H -->|within dispute window| I[Submit with exhibits]
H -->|window closing| J[Escalate to owner]
I --> K[Track response clock]
K --> L[Learn outcomes, adjust theta and exhibits]
Invoice compliance checks
The generator tests each invoice against the rule's elements and records pass or fail with the evidence:
| Timeliness | Invoice date within the allowed number of days after the charge was incurred |
| Content | Required fields present (the container identifiers, dates, charge basis, tariff reference, dispute contacts) |
| Billed party | The entity billed is a proper billed party under the rule and the underlying contract |
| Dispute window | The date computed from receipt, with the deadline tracked |
| Response clock | The date the billing party's response is due, with escalation if missed |
Dispute package
• Cover letter with the legal basis and a request for specific relief.
• Timeline of container events with source references.
• Clock-stop table: each interval where u = 0, its code (CS1 to CS8), and the exhibit that proves it.
• Recomputed LFD and fee, with both θ readings if relevant.
• Invoice compliance findings.
• Exhibit index with SHA-256 hashes, capture timestamps, and a verifier.
Example manifest fragment:
{
"container": "ABCD1234567",
"tariff": "carrier-tariff-id",
"billed": {"lfd": "2026-10-09", "days": 6, "amount": 2150.00},
"recomputed": {"lfd_prime": "2026-10-13", "days": 2, "amount": 400.00, "theta": 1.0},
"clock_stops": [
{"code": "CS2", "from": "2026-10-09T08:00", "to": "2026-10-11T17:00",
"exhibit": "appt-availability-snapshots.pdf",
"sha256": "9f2c...e1"},
{"code": "CS3", "from": "2026-10-12T06:00", "to": "2026-10-12T15:00",
"exhibit": "pool-inventory-and-dispatch-log.pdf",
"sha256": "41ba...07"}
],
"dispute_amount": 1750.00
}
Prevention beats dispute
The same engine runs forward. For each import, it predicts retrievability windows from appointment supply and terminal advisories, and feeds the matcher's urgency term U. A container with a likely closure or appointment drought before its LFD gets priority in matching, and the dispatcher sees the risk date early enough to act. The dispute pipeline collects the evidence in the background for the days where prevention was not possible.
4.6 Key performance indicators
| Dual-turn rate | Dual-mission turns divided by total terminal gate visits |
| Empty deadhead miles per container | Total bobtail and empty-chassis miles divided by containers moved |
| Split avoidance rate | Containers moved without a pool-yard detour |
| LFD hit rate | Imports picked up on or before LFD |
| Fee recovery rate | Dollars recovered divided by dollars disputed |
| Dispute cycle time | Days from invoice receipt to resolution |
Strong Tower Consulting provides independent systems architecture, feasibility audits, and engineering roadmaps for motor carriers and freight brokers. Call 763-244-1373 to evaluate practical implementation paths for your fleet.
Implementation Roadmap
| 1. Assessment | 1 to 3 | Data inventory, ELD and TMS feed review, gap analysis against each chapter's models |
| 2. Core engines | 4 to 12 | HOS state machine in shadow mode, carrier graph with first edge set, event-log hashing |
| 3. Evidence layer | 8 to 16 | Reefer vault and dossier builder, clock-stop evidence collectors |
| 4. Optimization | 12 to 20 | Dual-mission matcher in advisory mode, rolling-horizon tuning |
| 5. Production | 20 onward | Cutover by fleet segment, monitoring, quarterly recalibration |
Each phase ends with measurable acceptance criteria: zero disagreements with certified ELD output after rule-case triage (Chapter 1), tier precision targets on replayed onboardings (Chapter 2), a verified dossier for every sampled trip (Chapter 3), and measured deadhead and fee recovery against baseline (Chapter 4).
Regulatory References
Regulatory citations in this paper reflect their text at publication. Rule text, compliance dates, and agency guidance change, so confirm the current eCFR text and agency notices when you implement.
- 49 CFR Part 395, including § 395.1(g) (sleeper berth provisions) and Subpart B (electronic logging devices)
- 49 U.S.C. § 14706 (Carmack Amendment)
- 21 CFR Part 1, Subpart S (food traceability) and Subpart O (sanitary transportation of human and animal food)
- Ocean Shipping Reform Act of 2022, Pub. L. 117-146
- 46 CFR Part 541 (demurrage and detention billing) and 46 CFR Part 545 (interpretive rules)
- Federal Rules of Evidence 702, 803(6), 901, 902(11), 902(13), 902(14), 1006
- RFC 3161 (Internet X.509 Public Key Infrastructure Time-Stamp Protocol)
About Strong Tower Consulting, LLC. Strong Tower Consulting, LLC is a Minnesota firm founded in 2008 by Scott Elliott, with more than 18 years of freight transportation systems engineering. The firm provides independent systems architecture, feasibility audits, and engineering roadmaps for motor carriers, intermodal operators, refrigerated fleets, and freight brokerages. Strong Tower Consulting, LLC and Exspeedite LLC are separately organized sister companies under common ownership.
Strong Tower Consulting provides independent systems architecture, feasibility audits, and engineering roadmaps for motor carriers and freight brokers. Call 763-244-1373 to evaluate practical implementation paths for your fleet.
Consult with Principal Systems Architect Scott Elliott
Engage Strong Tower Consulting for vendor-neutral transportation systems architecture, high-scale data engineering, and proprietary constraint solvers.
Call (763) 244-1373