Case 906

The lead time doubled and the reorder point did not

the_lead_time_doubled_and_the_reorder_point_did_not.eml - A warehouse reorders whenever stock falls to a reorder point, the point was set exactly to cover demand during the supplier's lead time, and every reorder fires on time. What happens to that point when the supplier's lead time changes is computed below.

ok: true — round-trip fixpoint reached (python1 == python2)updated 2026-09-18

EML

eml
# Self-authored for the EML case corpus (no external origin). A warehouse
# reorders whenever stock falls to a reorder point, the point was set exactly to
# cover demand during the supplier's lead time, and every reorder fires on time.
# What happens to that point when the supplier's lead time changes is computed
# below.
#
# The rule is careful. Daily demand is the real average; the reorder point is
# exactly daily demand times the lead time; the reorder fires the moment stock
# touches the point; and the intent is exactly 'never run out while waiting for
# the supplier'.
#
# The supplier's lead time doubled from five days to ten and the reorder point
# stayed at five days of demand, so every cycle now runs dry for five days
# before the order lands.

100 => daily_demand
5 => lead_time_days_the_point_was_set_for
10 => lead_time_days_now

daily_demand * lead_time_days_the_point_was_set_for => reorder_point
daily_demand * lead_time_days_now => demand_while_waiting_now
demand_while_waiting_now - reorder_point => units_short_each_cycle
int(units_short_each_cycle / daily_demand) => days_out_of_stock_each_cycle
int(units_short_each_cycle * 10000 / demand_while_waiting_now) => waiting_demand_uncovered_per_myriad

"daily demand                    : " + str(daily_demand) ^0
"lead time the point was set for : " + str(lead_time_days_the_point_was_set_for) + " days" ^0
"reorder point                   : " + str(reorder_point) + " units" ^0
"" ^0
"lead time now                   : " + str(lead_time_days_now) + " days" ^0
"demand while waiting, now       : " + str(demand_while_waiting_now) + " units" ^0
"units short each cycle          : " + str(units_short_each_cycle) ^0
"days out of stock each cycle    : " + str(days_out_of_stock_each_cycle) ^0
"waiting demand uncovered        : " + str(waiting_demand_uncovered_per_myriad) + " per ten thousand" ^0
"" ^0

# ---- what the rule verified ----

"the reorder rule" ^0
"  demand : the real daily average" ^0
"  point : exactly demand times lead time, " + str(reorder_point) ^0
"  trigger : fires the moment stock touches the point" ^0
"  intent : never run out while waiting for the supplier" ^0
"  reorders that fired late : 0" ^0
"  verdict : EVERY REORDER FIRED AT EXACTLY 500" ^0
"" ^0
"  firing exactly at the point every time is the part done" ^0
"  right here, and it is why the order is always placed" ^0
"  with " + str(reorder_point) + " units still on the shelf" ^0
"" ^0

# ---- what the point covers ----

"demand during the wait" ^0
"  what the point is : the demand expected between ordering" ^0
"    and receiving" ^0
"  what it was sized for : " + str(lead_time_days_the_point_was_set_for) + " days, " + str(reorder_point) + " units" ^0
"  what the wait is now : " + str(lead_time_days_now) + " days, " + str(demand_while_waiting_now) + " units" ^0
"  so the shelf empties : after " + str(lead_time_days_the_point_was_set_for) + " days, with " + str(days_out_of_stock_each_cycle) + " days of" ^0
"    the wait still to go" ^0
"  the trigger : is still exact; the number it triggers on is" ^0
"    about a supplier that no longer exists" ^0
"" ^0

# ---- what the warehouse got ----

"each cycle" ^0
"  order placed : on time, at " + str(reorder_point) ^0
"  order received : " + str(lead_time_days_now) + " days later" ^0
"  days with nothing to sell : " + str(days_out_of_stock_each_cycle) ^0
"  is the trigger late : no; it is exact" ^0
"  is the point still the lead-time demand : no; the lead" ^0
"    time moved and the point did not" ^0
"" ^0

# ---- null control ----

# The same rule with the reorder point recomputed from the supplier's current
# lead time (or a safety stock sized for lead-time variation).
500 => nc_point_set_for_the_old_lead_time
1000 => nc_point_set_for_the_current_lead_time
0 => nc_days_out_of_stock_with_the_current_point

"null control - recompute the point from the current lead time" ^0
"  reorder point, old lead time : " + str(nc_point_set_for_the_old_lead_time) ^0
"  reorder point, current lead time : " + str(nc_point_set_for_the_current_lead_time) ^0
"  days out of stock with the current point : " + str(nc_days_out_of_stock_with_the_current_point) ^0
"  no demand and no trigger changed; the point stopped" ^0
"  describing a wait that had already doubled" ^0
"" ^0

# ---- the rule ----

"what a fire-at-the-reorder-point rule guarantees" ^0
"  the order is placed with exactly the point's units left :" ^0
"    exactly, real demand, exact trigger" ^0
"  the shelf lasts until the order arrives : not addressed;" ^0
"    the point covers " + str(lead_time_days_the_point_was_set_for) + " days and the supplier now takes " + str(lead_time_days_now) + "," ^0
"    so each cycle runs dry for " + str(days_out_of_stock_each_cycle) + " days" ^0
"" ^0

"a threshold set from a delay is a claim about the delay, and the delay is" ^0
"outside the warehouse; when it moves, the trigger still fires exactly on a" ^0
"number that now means half the wait, and exactness is no help against a" ^0
"number that has stopped being true" ^0
"" ^0

"Every reorder fires exactly at " + str(reorder_point) + " - the trigger is precise. But the point was" ^0
"sized for a " + str(lead_time_days_the_point_was_set_for) + "-day wait and the supplier now takes " + str(lead_time_days_now) + ", so each cycle is " + str(units_short_each_cycle) ^0
"units short and " + str(days_out_of_stock_each_cycle) + " days empty, " + str(waiting_demand_uncovered_per_myriad) + " per ten thousand of the waiting demand" ^0
"uncovered, until the point is recomputed from the lead time as it is now." ^0

Python (deterministic transpilation)

python
daily_demand = 100
lead_time_days_the_point_was_set_for = 5
lead_time_days_now = 10
reorder_point = daily_demand * lead_time_days_the_point_was_set_for
demand_while_waiting_now = daily_demand * lead_time_days_now
units_short_each_cycle = demand_while_waiting_now - reorder_point
days_out_of_stock_each_cycle = int(units_short_each_cycle / daily_demand)
waiting_demand_uncovered_per_myriad = int(units_short_each_cycle * 10000 / demand_while_waiting_now)
print("daily demand                    : " + str(daily_demand))
print("lead time the point was set for : " + str(lead_time_days_the_point_was_set_for) + " days")
print("reorder point                   : " + str(reorder_point) + " units")
print("")
print("lead time now                   : " + str(lead_time_days_now) + " days")
print("demand while waiting, now       : " + str(demand_while_waiting_now) + " units")
print("units short each cycle          : " + str(units_short_each_cycle))
print("days out of stock each cycle    : " + str(days_out_of_stock_each_cycle))
print("waiting demand uncovered        : " + str(waiting_demand_uncovered_per_myriad) + " per ten thousand")
print("")
print("the reorder rule")
print("  demand : the real daily average")
print("  point : exactly demand times lead time, " + str(reorder_point))
print("  trigger : fires the moment stock touches the point")
print("  intent : never run out while waiting for the supplier")
print("  reorders that fired late : 0")
print("  verdict : EVERY REORDER FIRED AT EXACTLY 500")
print("")
print("  firing exactly at the point every time is the part done")
print("  right here, and it is why the order is always placed")
print("  with " + str(reorder_point) + " units still on the shelf")
print("")
print("demand during the wait")
print("  what the point is : the demand expected between ordering")
print("    and receiving")
print("  what it was sized for : " + str(lead_time_days_the_point_was_set_for) + " days, " + str(reorder_point) + " units")
print("  what the wait is now : " + str(lead_time_days_now) + " days, " + str(demand_while_waiting_now) + " units")
print("  so the shelf empties : after " + str(lead_time_days_the_point_was_set_for) + " days, with " + str(days_out_of_stock_each_cycle) + " days of")
print("    the wait still to go")
print("  the trigger : is still exact; the number it triggers on is")
print("    about a supplier that no longer exists")
print("")
print("each cycle")
print("  order placed : on time, at " + str(reorder_point))
print("  order received : " + str(lead_time_days_now) + " days later")
print("  days with nothing to sell : " + str(days_out_of_stock_each_cycle))
print("  is the trigger late : no; it is exact")
print("  is the point still the lead-time demand : no; the lead")
print("    time moved and the point did not")
print("")
nc_point_set_for_the_old_lead_time = 500
nc_point_set_for_the_current_lead_time = 1000
nc_days_out_of_stock_with_the_current_point = 0
print("null control - recompute the point from the current lead time")
print("  reorder point, old lead time : " + str(nc_point_set_for_the_old_lead_time))
print("  reorder point, current lead time : " + str(nc_point_set_for_the_current_lead_time))
print("  days out of stock with the current point : " + str(nc_days_out_of_stock_with_the_current_point))
print("  no demand and no trigger changed; the point stopped")
print("  describing a wait that had already doubled")
print("")
print("what a fire-at-the-reorder-point rule guarantees")
print("  the order is placed with exactly the point's units left :")
print("    exactly, real demand, exact trigger")
print("  the shelf lasts until the order arrives : not addressed;")
print("    the point covers " + str(lead_time_days_the_point_was_set_for) + " days and the supplier now takes " + str(lead_time_days_now) + ",")
print("    so each cycle runs dry for " + str(days_out_of_stock_each_cycle) + " days")
print("")
print("a threshold set from a delay is a claim about the delay, and the delay is")
print("outside the warehouse; when it moves, the trigger still fires exactly on a")
print("number that now means half the wait, and exactness is no help against a")
print("number that has stopped being true")
print("")
print("Every reorder fires exactly at " + str(reorder_point) + " - the trigger is precise. But the point was")
print("sized for a " + str(lead_time_days_the_point_was_set_for) + "-day wait and the supplier now takes " + str(lead_time_days_now) + ", so each cycle is " + str(units_short_each_cycle))
print("units short and " + str(days_out_of_stock_each_cycle) + " days empty, " + str(waiting_demand_uncovered_per_myriad) + " per ten thousand of the waiting demand")
print("uncovered, until the point is recomputed from the lead time as it is now.")

stdout (executed)

text
daily demand                    : 100
lead time the point was set for : 5 days
reorder point                   : 500 units

lead time now                   : 10 days
demand while waiting, now       : 1000 units
units short each cycle          : 500
days out of stock each cycle    : 5
waiting demand uncovered        : 5000 per ten thousand

the reorder rule
  demand : the real daily average
  point : exactly demand times lead time, 500
  trigger : fires the moment stock touches the point
  intent : never run out while waiting for the supplier
  reorders that fired late : 0
  verdict : EVERY REORDER FIRED AT EXACTLY 500

  firing exactly at the point every time is the part done
  right here, and it is why the order is always placed
  with 500 units still on the shelf

demand during the wait
  what the point is : the demand expected between ordering
    and receiving
  what it was sized for : 5 days, 500 units
  what the wait is now : 10 days, 1000 units
  so the shelf empties : after 5 days, with 5 days of
    the wait still to go
  the trigger : is still exact; the number it triggers on is
    about a supplier that no longer exists

each cycle
  order placed : on time, at 500
  order received : 10 days later
  days with nothing to sell : 5
  is the trigger late : no; it is exact
  is the point still the lead-time demand : no; the lead
    time moved and the point did not

null control - recompute the point from the current lead time
  reorder point, old lead time : 500
  reorder point, current lead time : 1000
  days out of stock with the current point : 0
  no demand and no trigger changed; the point stopped
  describing a wait that had already doubled

what a fire-at-the-reorder-point rule guarantees
  the order is placed with exactly the point's units left :
    exactly, real demand, exact trigger
  the shelf lasts until the order arrives : not addressed;
    the point covers 5 days and the supplier now takes 10,
    so each cycle runs dry for 5 days

a threshold set from a delay is a claim about the delay, and the delay is
outside the warehouse; when it moves, the trigger still fires exactly on a
number that now means half the wait, and exactness is no help against a
number that has stopped being true

Every reorder fires exactly at 500 - the trigger is precise. But the point was
sized for a 5-day wait and the supplier now takes 10, so each cycle is 500
units short and 5 days empty, 5000 per ten thousand of the waiting demand
uncovered, until the point is recomputed from the lead time as it is now.

Trace event types

eml:run:starteml:assigneml:outputeml:run:done