Case 970

The thermometer said rare and the plate said medium

the_thermometer_said_rare_and_the_plate_said_medium.eml - A cook wants a large roast at fifty-seven degrees in the centre, medium-rare, probes it with an accurate thermometer, pulls it from the oven the moment the centre reads fifty-seven, rests it, and carves it at sixty-four. Where the extra seven degrees came from after the oven was gone is computed below.

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

EML

eml
# Self-authored for the EML case corpus (no external origin). A cook wants a
# large roast at fifty-seven degrees in the centre, medium-rare, probes it with
# an accurate thermometer, pulls it from the oven the moment the centre reads
# fifty-seven, rests it, and carves it at sixty-four. Where the extra seven
# degrees came from after the oven was gone is computed below.
#
# The reasoning is careful. The thermometer is accurate; it was in the centre;
# fifty-seven is the right target; the roast was out of the oven; and the
# intent was exactly 'stop cooking at fifty-seven'.
#
# The probe reads the coldest point of a joint whose outer layers are far
# hotter, and heat keeps flowing inward from those layers after the oven is
# gone - a large roast climbs another seven degrees or so while it rests - so
# the centre that read fifty-seven finished at sixty-four, and the pull
# temperature that lands on fifty-seven is fifty.

57 => target_centre_c
57 => centre_when_pulled_c
90 => surface_when_pulled_c
7 => carryover_rise_for_a_large_roast_k
60 => medium_begins_at_c

centre_when_pulled_c + carryover_rise_for_a_large_roast_k => centre_after_resting_c
centre_after_resting_c - target_centre_c => degrees_past_the_target_k
centre_after_resting_c - medium_begins_at_c => degrees_into_medium_k
target_centre_c - carryover_rise_for_a_large_roast_k => pull_temperature_that_lands_on_target_c
surface_when_pulled_c - centre_when_pulled_c => gradient_from_surface_to_centre_when_pulled_k
int((surface_when_pulled_c + centre_when_pulled_c) / 2) => rough_mean_temperature_of_the_joint_when_pulled_c
rough_mean_temperature_of_the_joint_when_pulled_c - centre_when_pulled_c => how_far_the_centre_sat_below_the_joints_mean_k

"target                          : " + str(target_centre_c) + " C at the centre, medium-rare" ^0
"pulled when the probe read      : " + str(centre_when_pulled_c) + " C at the centre, " + str(surface_when_pulled_c) + " C at the surface" ^0
"gradient in the joint           : " + str(gradient_from_surface_to_centre_when_pulled_k) + " K from surface to centre" ^0
"rough mean of the joint         : " + str(rough_mean_temperature_of_the_joint_when_pulled_c) + " C, " + str(how_far_the_centre_sat_below_the_joints_mean_k) + " K above the centre" ^0
"" ^0
"carryover while resting         : about " + str(carryover_rise_for_a_large_roast_k) + " K for a joint this size" ^0
"centre after resting            : " + str(centre_after_resting_c) + " C, " + str(degrees_past_the_target_k) + " K past the target, " + str(degrees_into_medium_k) + " K into medium" ^0
"pull temperature for the target : " + str(pull_temperature_that_lands_on_target_c) + " C" ^0
"" ^0

# ---- what the cook verified ----

"the pull-at-target reasoning" ^0
"  thermometer : accurate, in the centre" ^0
"  target : " + str(target_centre_c) + " C, right for medium-rare" ^0
"  action : out of the oven the moment it read " + str(centre_when_pulled_c) ^0
"  intent : stop cooking at " + str(target_centre_c) ^0
"  facts wrong : 0" ^0
"  verdict : OUT OF THE OVEN IS OUT OF THE HEAT" ^0
"" ^0
"  probing the centre with an accurate thermometer is the part" ^0
"  done right here, and it is why " + str(centre_when_pulled_c) + " C really was the coldest" ^0
"  point of the joint at that moment" ^0
"" ^0

# ---- where the extra degrees came from ----

"the joint is its own oven" ^0
"  what the probe reads : the centre, the coldest point" ^0
"  what surrounds it : layers at up to " + str(surface_when_pulled_c) + " C, a " + str(gradient_from_surface_to_centre_when_pulled_k) + " K slope inward" ^0
"  what heat does on a slope : flows down it, oven or no oven" ^0
"  what the rest is : the outer layers giving their surplus to" ^0
"    the centre until the slope flattens, about " + str(carryover_rise_for_a_large_roast_k) + " K here" ^0
"  what the reading meant : not 'done' but 'done in " + str(carryover_rise_for_a_large_roast_k) + " K'" ^0
"  what lands on " + str(target_centre_c) + " : pulling at " + str(pull_temperature_that_lands_on_target_c) + " and letting the joint finish itself" ^0
"" ^0

# ---- what the cook got ----

"the plate" ^0
"  believed : medium-rare, " + str(target_centre_c) + " C" ^0
"  actual : " + str(centre_after_resting_c) + " C, medium, " + str(degrees_past_the_target_k) + " K over" ^0
"  was the thermometer wrong : no; the centre was " + str(centre_when_pulled_c) + " when it said so" ^0
"  was the oven the only heat : no; the roast's own outer layers" ^0
"    held enough to carry the centre another " + str(carryover_rise_for_a_large_roast_k) + " K" ^0
"" ^0

# ---- null control ----

# The same roast pulled at the temperature that rests up to the target instead
# of at the target itself.
64 => nc_centre_at_carving_pulled_at_the_target_c
57 => nc_centre_at_carving_pulled_early_c
7 => nc_degrees_the_early_pull_removes_k

"null control - pull early by the carryover" ^0
"  centre at carving, pulled at the target : " + str(nc_centre_at_carving_pulled_at_the_target_c) + " C" ^0
"  centre at carving, pulled early : " + str(nc_centre_at_carving_pulled_early_c) + " C" ^0
"  degrees the early pull removes : " + str(nc_degrees_the_early_pull_removes_k) ^0
"  no thermometer and no oven changed; the reading was treated" ^0
"  as the start of the rest, not the end of the cooking" ^0
"" ^0

# ---- the rule ----

"what an accurate centre reading of " + str(target_centre_c) + " guarantees" ^0
"  the centre was " + str(centre_when_pulled_c) + " C at that moment : exactly" ^0
"  the centre stays there once the oven is gone : not addressed;" ^0
"    the outer layers are " + str(gradient_from_surface_to_centre_when_pulled_k) + " K hotter and keep feeding the centre," ^0
"    which climbs about " + str(carryover_rise_for_a_large_roast_k) + " K to " + str(centre_after_resting_c) + " while it rests" ^0
"" ^0

"a thermometer reports a point and a roast is a slope; take it out when the" ^0
"point is right and the slope will finish the cooking for you, in the" ^0
"direction you did not want" ^0
"" ^0

"The probe was right: " + str(centre_when_pulled_c) + " C at the centre. But the surface was " + str(surface_when_pulled_c) + ", and heat" ^0
"runs down that slope with or without an oven, so the centre rested up to " + str(centre_after_resting_c) + "," ^0
"" + str(degrees_past_the_target_k) + " K past medium-rare, where pulling at " + str(pull_temperature_that_lands_on_target_c) + " would have finished at " + str(target_centre_c) + ", until the" ^0
"reading is treated as the start of the rest rather than the end of the cooking." ^0

Python (deterministic transpilation)

python
target_centre_c = 57
centre_when_pulled_c = 57
surface_when_pulled_c = 90
carryover_rise_for_a_large_roast_k = 7
medium_begins_at_c = 60
centre_after_resting_c = centre_when_pulled_c + carryover_rise_for_a_large_roast_k
degrees_past_the_target_k = centre_after_resting_c - target_centre_c
degrees_into_medium_k = centre_after_resting_c - medium_begins_at_c
pull_temperature_that_lands_on_target_c = target_centre_c - carryover_rise_for_a_large_roast_k
gradient_from_surface_to_centre_when_pulled_k = surface_when_pulled_c - centre_when_pulled_c
rough_mean_temperature_of_the_joint_when_pulled_c = int((surface_when_pulled_c + centre_when_pulled_c) / 2)
how_far_the_centre_sat_below_the_joints_mean_k = rough_mean_temperature_of_the_joint_when_pulled_c - centre_when_pulled_c
print("target                          : " + str(target_centre_c) + " C at the centre, medium-rare")
print("pulled when the probe read      : " + str(centre_when_pulled_c) + " C at the centre, " + str(surface_when_pulled_c) + " C at the surface")
print("gradient in the joint           : " + str(gradient_from_surface_to_centre_when_pulled_k) + " K from surface to centre")
print("rough mean of the joint         : " + str(rough_mean_temperature_of_the_joint_when_pulled_c) + " C, " + str(how_far_the_centre_sat_below_the_joints_mean_k) + " K above the centre")
print("")
print("carryover while resting         : about " + str(carryover_rise_for_a_large_roast_k) + " K for a joint this size")
print("centre after resting            : " + str(centre_after_resting_c) + " C, " + str(degrees_past_the_target_k) + " K past the target, " + str(degrees_into_medium_k) + " K into medium")
print("pull temperature for the target : " + str(pull_temperature_that_lands_on_target_c) + " C")
print("")
print("the pull-at-target reasoning")
print("  thermometer : accurate, in the centre")
print("  target : " + str(target_centre_c) + " C, right for medium-rare")
print("  action : out of the oven the moment it read " + str(centre_when_pulled_c))
print("  intent : stop cooking at " + str(target_centre_c))
print("  facts wrong : 0")
print("  verdict : OUT OF THE OVEN IS OUT OF THE HEAT")
print("")
print("  probing the centre with an accurate thermometer is the part")
print("  done right here, and it is why " + str(centre_when_pulled_c) + " C really was the coldest")
print("  point of the joint at that moment")
print("")
print("the joint is its own oven")
print("  what the probe reads : the centre, the coldest point")
print("  what surrounds it : layers at up to " + str(surface_when_pulled_c) + " C, a " + str(gradient_from_surface_to_centre_when_pulled_k) + " K slope inward")
print("  what heat does on a slope : flows down it, oven or no oven")
print("  what the rest is : the outer layers giving their surplus to")
print("    the centre until the slope flattens, about " + str(carryover_rise_for_a_large_roast_k) + " K here")
print("  what the reading meant : not 'done' but 'done in " + str(carryover_rise_for_a_large_roast_k) + " K'")
print("  what lands on " + str(target_centre_c) + " : pulling at " + str(pull_temperature_that_lands_on_target_c) + " and letting the joint finish itself")
print("")
print("the plate")
print("  believed : medium-rare, " + str(target_centre_c) + " C")
print("  actual : " + str(centre_after_resting_c) + " C, medium, " + str(degrees_past_the_target_k) + " K over")
print("  was the thermometer wrong : no; the centre was " + str(centre_when_pulled_c) + " when it said so")
print("  was the oven the only heat : no; the roast's own outer layers")
print("    held enough to carry the centre another " + str(carryover_rise_for_a_large_roast_k) + " K")
print("")
nc_centre_at_carving_pulled_at_the_target_c = 64
nc_centre_at_carving_pulled_early_c = 57
nc_degrees_the_early_pull_removes_k = 7
print("null control - pull early by the carryover")
print("  centre at carving, pulled at the target : " + str(nc_centre_at_carving_pulled_at_the_target_c) + " C")
print("  centre at carving, pulled early : " + str(nc_centre_at_carving_pulled_early_c) + " C")
print("  degrees the early pull removes : " + str(nc_degrees_the_early_pull_removes_k))
print("  no thermometer and no oven changed; the reading was treated")
print("  as the start of the rest, not the end of the cooking")
print("")
print("what an accurate centre reading of " + str(target_centre_c) + " guarantees")
print("  the centre was " + str(centre_when_pulled_c) + " C at that moment : exactly")
print("  the centre stays there once the oven is gone : not addressed;")
print("    the outer layers are " + str(gradient_from_surface_to_centre_when_pulled_k) + " K hotter and keep feeding the centre,")
print("    which climbs about " + str(carryover_rise_for_a_large_roast_k) + " K to " + str(centre_after_resting_c) + " while it rests")
print("")
print("a thermometer reports a point and a roast is a slope; take it out when the")
print("point is right and the slope will finish the cooking for you, in the")
print("direction you did not want")
print("")
print("The probe was right: " + str(centre_when_pulled_c) + " C at the centre. But the surface was " + str(surface_when_pulled_c) + ", and heat")
print("runs down that slope with or without an oven, so the centre rested up to " + str(centre_after_resting_c) + ",")
print("" + str(degrees_past_the_target_k) + " K past medium-rare, where pulling at " + str(pull_temperature_that_lands_on_target_c) + " would have finished at " + str(target_centre_c) + ", until the")
print("reading is treated as the start of the rest rather than the end of the cooking.")

stdout (executed)

text
target                          : 57 C at the centre, medium-rare
pulled when the probe read      : 57 C at the centre, 90 C at the surface
gradient in the joint           : 33 K from surface to centre
rough mean of the joint         : 73 C, 16 K above the centre

carryover while resting         : about 7 K for a joint this size
centre after resting            : 64 C, 7 K past the target, 4 K into medium
pull temperature for the target : 50 C

the pull-at-target reasoning
  thermometer : accurate, in the centre
  target : 57 C, right for medium-rare
  action : out of the oven the moment it read 57
  intent : stop cooking at 57
  facts wrong : 0
  verdict : OUT OF THE OVEN IS OUT OF THE HEAT

  probing the centre with an accurate thermometer is the part
  done right here, and it is why 57 C really was the coldest
  point of the joint at that moment

the joint is its own oven
  what the probe reads : the centre, the coldest point
  what surrounds it : layers at up to 90 C, a 33 K slope inward
  what heat does on a slope : flows down it, oven or no oven
  what the rest is : the outer layers giving their surplus to
    the centre until the slope flattens, about 7 K here
  what the reading meant : not 'done' but 'done in 7 K'
  what lands on 57 : pulling at 50 and letting the joint finish itself

the plate
  believed : medium-rare, 57 C
  actual : 64 C, medium, 7 K over
  was the thermometer wrong : no; the centre was 57 when it said so
  was the oven the only heat : no; the roast's own outer layers
    held enough to carry the centre another 7 K

null control - pull early by the carryover
  centre at carving, pulled at the target : 64 C
  centre at carving, pulled early : 57 C
  degrees the early pull removes : 7
  no thermometer and no oven changed; the reading was treated
  as the start of the rest, not the end of the cooking

what an accurate centre reading of 57 guarantees
  the centre was 57 C at that moment : exactly
  the centre stays there once the oven is gone : not addressed;
    the outer layers are 33 K hotter and keep feeding the centre,
    which climbs about 7 K to 64 while it rests

a thermometer reports a point and a roast is a slope; take it out when the
point is right and the slope will finish the cooking for you, in the
direction you did not want

The probe was right: 57 C at the centre. But the surface was 90, and heat
runs down that slope with or without an oven, so the centre rested up to 64,
7 K past medium-rare, where pulling at 50 would have finished at 57, until the
reading is treated as the start of the rest rather than the end of the cooking.

Trace event types

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