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." ^0Python (deterministic transpilation)
pythontarget_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)
texttarget : 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