Merge pull request #10170 from TheMrZZ/fix/furnace-loaded-cooking-total

🤖 Agent: a loaded furnace keeps its saved cooking total until the item finishes, and a hopper or dropper filling the empty input slot restarts the cooking as setItem does (kacpherek's point); furnace_loaded_total and furnace_output_components pass.
This commit is contained in:
Ludovic Marie authored and GitHub committed 2026-11-07 06:15:34 +01:00
commit 5a83184c7e
5 files changed
+512 -3

No files matched your search

+63 -3
View File
@@ -78,9 +78,6 @@ impl FurnaceCooking for Furnace {
if lit || has_fuel && has_ingredient {
if let Some(ingredient) = self.items[0].clone() {
if let Some(recipe) = recipes.cook(self.kind.recipe_type(), &ingredient) {
if self.cooking_timer == 0 {
self.cooking_total = total_time(recipe.time, self.speed);
}
let max = items.get(&recipe.result.item).map_or(64, |i| i.max_stack);
let can_burn = match &self.items[2] {
None => true,
@@ -250,6 +247,69 @@ mod tests {
(items, recipes, providers)
}
#[test]
fn loaded_totals_survive_until_actual_completion() {
let (items, recipes, providers) = data("loaded-total");
assert_eq!(
recipes
.cook(
FurnaceKind::Furnace.recipe_type(),
&ItemStack::new("test:ore", 3)
)
.unwrap()
.time,
200
);
// Fresh Java's five-case Game fixture independently admits the loaded
// zero (including a missing saved field), five and normal totals.
for (total, timer, completion) in [(0, 0, 1), (5, 0, 5), (200, 0, 200), (5, 1, 4)] {
let mut f = Furnace {
kind: FurnaceKind::Furnace,
items: [Some(ItemStack::new("test:ore", 3)), None, None],
lit_remaining: 20,
lit_total: 20,
cooking_timer: timer,
cooking_total: total,
speed: 1.0,
recipes_used: HashMap::new(),
};
for elapsed in 1..=6 {
let mut drops = Vec::new();
assert!(!f.idle());
assert_eq!(f.tick(&recipes, &items, &providers, &mut drops), None);
assert!(drops.is_empty());
assert_eq!((f.lit_remaining, f.lit_total), (20 - elapsed, 20));
assert!(f.items[1].is_none());
let complete = elapsed >= completion;
assert_eq!(
f.items[0].as_ref().unwrap().count,
if complete { 2 } else { 3 },
"loaded {total}/{timer}, tick {elapsed}"
);
assert_eq!(
f.items[2].as_ref().map(|s| (&*s.item, s.count)),
if complete {
Some(("test:ingot", 1))
} else {
None
}
);
assert_eq!(f.cooking_total, if complete { 200 } else { total });
assert_eq!(
f.cooking_timer,
if complete {
elapsed - completion
} else {
timer + elapsed
}
);
}
// A changed input still goes through setItem's independent reset.
f.set_input(&recipes, Some(ItemStack::new("test:ingot", 1)));
assert_eq!((f.cooking_timer, f.cooking_total), (0, 200));
}
}
#[test]
fn cooking_requires_output_components_and_capacity() {
let (items, recipes, providers) = data("output-components");
@@ -646,6 +646,7 @@ impl Game<'_> {
let was_empty = c.is_empty(view);
let max = c.max_stack(&stack);
let mut success = false;
let mut filled_empty = false;
let Some(target) = self.slot_mut_at(view, slot) else {
return (Some(stack), false);
};
@@ -663,6 +664,7 @@ impl Game<'_> {
});
stack.count = 0;
success = true;
filled_empty = true;
}
Some(current)
// HopperBlockEntity.canMergeItems
@@ -676,6 +678,17 @@ impl Game<'_> {
}
Some(_) => {}
}
// tryMoveInItem's setItem on an empty slot: AbstractFurnaceBlockEntity.setItem restarts
// the cooking for a new input (a merge only grows the stack, and keeps it).
let recipes = world_recipes!(self);
if filled_empty
&& let Some((pos, 0)) = view.locate(slot)
&& let Some(BlockEntity::Furnace(furnace)) = self.world.block_entities.get_mut(&pos)
{
use horizon_client::furnace::FurnaceCooking;
let input = furnace.items[0].take();
furnace.set_input(recipes, input);
}
if success && was_empty && view.kind == Kind::Hopper {
let dest = view.parts[0].0;
let from_ticked = from_hopper.and_then(|p| self.hoppers.get(&p).map(|h| h.ticked));
+263
View File
@@ -0,0 +1,263 @@
# Loaded furnace cooking totals
`AbstractFurnaceBlockEntity.loadAdditional` loads a missing total as zero.
`serverTick` increments the loaded spent value, compares it with the stored total,
and only after completion replaces the total with the recipe duration. Changing
an input separately updates its duration through `setItem`. H119 repairs only
the unconditional early reset in `FurnaceCooking::tick`.
The actorless real Game/Java fixture loads five lit furnaces with remaining/total
burn20, raw_iron3 and no fuel. Cases are missing/zero/five/200 total at spent0,
and five at spent1. It observes cumulative0/1/4/5/6 actual ticks. Every observation
has positive loaded, floor, furnace id/coordinates and lit-state guards, complete
slot values, spent/total, remaining/total burn and exact relative clock deltas.
Fresh pinned Java26.3 admits first completion at1 for missing/zero, at5 for
five/spent0, and at4 for five/spent1. The 200 control does not complete. Input and
output counts and the post-completion200 duration are checked independently.
## Predeclared comparison
Runtime source is `ff4b4b17bd02bc7a5e7994bbf630c662805172e8`.
The canonical342 script SHA-256 is
`7a6fa274b80333ff2050d702ef7e7b2f95c4ca4598aa8afa270db9a59b46653e`;
fresh Java reference is
`83da0fd40a30d970d8e0522672691baa4238503f94a0bc3738ba0670af74dc56`.
The untouched actual Game matches **300/342**:42 state observations fail across
missing16/zero16/five10. Both controls pass. The native capture independently
regenerates and requires byte-identical Java reference bytes.
The original full373 remains executable and unchanged, script SHA-256
`34e0946661c581b208f231f95024fd3f5314fa5e65ae4bc09c7879c3b169986a`.
Its frozen fresh Java reference is
`8fd31c23900a40c08655034050c27f629eee1ef1a16020ccd17b894c7012374a`.
Its untouched result is **300/373**, a mixed diagnostic rather than73 H119 defects.
Exactly31 labels are outside canonical342: the25
`{missing,zero,five,normal,started}-{0,1,4,5,6}-full-tag` labels and the six
`clock-start` / `{0,1,4,5,6}-clock-raw` labels. All commands still execute and their
actual traces remain raw. Full373 compares their complete records separately.
The25 whole-tag presentations have the existing H191 insertion-order seam;
12 also contain H119 state differences, whose fields remain strictly covered by
retained scalar/slot reads. The six absolute startup-clock values differ across
engines; all actual relative deltas remain strict. No full373, whole-tag or raw
absolute-clock equality claim is made. No formatter or clock repair is included.
The initial369-record draft omitted the required frozen-world step command and
used the wrong tick-count property. Its full script/reference/raw output is
retained as a rejected clock admission, not furnace failure evidence.
## Run
With prepared26.3 resources, use separate output folders for every capture:
```sh
python3 tools/test_furnace_loaded_total_parity.py --reference-only --work-dir .local/h119/java
python3 tools/test_furnace_loaded_total_parity.py --binary /absolute/path/to/game \
--work-dir .local/h119/native --reference .local/h119/java/vanilla.jsonl
```
For the complete original diagnostic add `--full-diagnostic`. Its `--reference`
can name the frozen full373 reference; new Java admission output is retained
separately, including its exact absolute clocks. The wrapper compares complete
raw JSON records without the shared runner's presentation masks or tolerances.
Reports include every expected/actual difference and both reference hashes.
## Fixed state and supplementary bookkeeping
The unchanged342 script/reference pair passes **342/342** with the three-line
repair. The identical resource-free real `FurnaceCooking::tick` regression fails
old at zero/tick1 (input3 instead of2) and passes fixed. All six furnace helper
tests pass, including idle and fuel remainder controls. Changed-input duration
and successful-completion duration updates remain intact.
`RecipesUsed` is checked by a separate predeclared25-record program, not a
changed342 denominator. Labels are
`{missing,zero,five,normal,started}-{0,1,4,5,6}-recipes-used`, script SHA-256
`f34bf350f1880f24145601106c42a36b9b89a2578b399e09647751a839617b23`,
fresh Java reference SHA-256
`c0a58afa324cae82a67fd419c64de70f817c6d288e77d8d875339e3822567eb5`.
All original setup/clock commands still execute, with complete actual traces.
Fresh Java validates their admissions plus exact maps: empty is success/result0;
completed is `{"minecraft:iron_ingot_from_smelting_raw_iron": 1}` with Int count
and success/result1. The first callback hypothesis (empty-map result1) is retained
as a rejected admission; the executed25 script itself was unchanged by correcting
that expectation before qualified pairs.
Use `--recipes-used-only` for this independent program, with the same reference
workflow above. The wrapper validates actual setup/identity/load/burn/relative
clock admissions and both passing controls from complete ordered trace records.
There is no XP payout or recipe bookkeeping policy repair.
The separately declared bookkeeping pair matches **15/25 → 25/25**, with
byte-identical fresh Java reference bytes. These are independent342 and25 gates;
there is no combined raw-equality claim. Full373 is **300/373 → 342/373**. Its
remaining31 records are exactly the25 H191 whole-tag presentations and six raw
absolute clock observations; no373-green claim is made.
## Full diagnostic residuals
The tables quote exact resolved message text and callbacks for every complete
record difference. Complete styled-span records remain in each executable
fixture's `strict-report.json`; canonical342 and supplementary25 compare those
complete records strictly. No diagnostic text is normalized by the comparator.
### Untouched full373: 300/373
| Label | Expected | Actual | Classification |
| --- | --- | --- | --- |
| `clock-start` | `{"messages":["The game time is 301 tick(s)"],"results":[[true,301]]}` | `{"messages":["The game time is 0 tick(s)"],"results":[[true,0]]}` | Unequal raw startup clocks; elapsed clocks pass |
| `0-clock-raw` | `{"messages":["The game time is 301 tick(s)"],"results":[[true,301]]}` | `{"messages":["The game time is 0 tick(s)"],"results":[[true,0]]}` | Unequal raw startup clocks; elapsed clocks pass |
| `missing-0-full-tag` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 2, y: 100, cooking_total_time: 0, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 2, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 0, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation only |
| `zero-0-full-tag` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 4, y: 100, cooking_total_time: 0, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 4, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 0, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation only |
| `five-0-full-tag` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 6, y: 100, cooking_total_time: 5, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 6, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 5, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation only |
| `normal-0-full-tag` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 8, y: 100, cooking_total_time: 200, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 8, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation only |
| `started-0-full-tag` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 10, y: 100, cooking_total_time: 5, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 10, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 5, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation only |
| `1-clock-raw` | `{"messages":["The game time is 302 tick(s)"],"results":[[true,302]]}` | `{"messages":["The game time is 1 tick(s)"],"results":[[true,1]]}` | Unequal raw startup clocks; elapsed clocks pass |
| `missing-1-full-tag` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 2, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 2, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
| `missing-1-all-slots` | `{"messages":["2, 100, 2 has the following block data: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}]"],"results":[[true,2]]}` | `{"messages":["2, 100, 2 has the following block data: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}]"],"results":[[true,1]]}` | H119 completion state |
| `missing-1-cooking_time_spent` | `{"messages":["2, 100, 2 has the following block data: 0"],"results":[[true,0]]}` | `{"messages":["2, 100, 2 has the following block data: 1"],"results":[[true,1]]}` | H119 completion state |
| `missing-1-input` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
| `missing-1-output` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
| `zero-1-full-tag` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 4, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 4, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
| `zero-1-all-slots` | `{"messages":["4, 100, 2 has the following block data: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}]"],"results":[[true,2]]}` | `{"messages":["4, 100, 2 has the following block data: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}]"],"results":[[true,1]]}` | H119 completion state |
| `zero-1-cooking_time_spent` | `{"messages":["4, 100, 2 has the following block data: 0"],"results":[[true,0]]}` | `{"messages":["4, 100, 2 has the following block data: 1"],"results":[[true,1]]}` | H119 completion state |
| `zero-1-input` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
| `zero-1-output` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
| `five-1-full-tag` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 6, y: 100, cooking_total_time: 5, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 6, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
| `five-1-cooking_total_time` | `{"messages":["6, 100, 2 has the following block data: 5"],"results":[[true,5]]}` | `{"messages":["6, 100, 2 has the following block data: 200"],"results":[[true,200]]}` | H119 completion state |
| `normal-1-full-tag` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 8, y: 100, cooking_total_time: 200, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 8, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation only |
| `started-1-full-tag` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 2, speed_multiplier: 1.0f, x: 10, y: 100, cooking_total_time: 5, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 2, speed_multiplier: 1.0f, x: 10, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 5, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation only |
| `4-clock-raw` | `{"messages":["The game time is 305 tick(s)"],"results":[[true,305]]}` | `{"messages":["The game time is 4 tick(s)"],"results":[[true,4]]}` | Unequal raw startup clocks; elapsed clocks pass |
| `missing-4-full-tag` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 3, speed_multiplier: 1.0f, x: 2, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 2, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
| `missing-4-all-slots` | `{"messages":["2, 100, 2 has the following block data: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}]"],"results":[[true,2]]}` | `{"messages":["2, 100, 2 has the following block data: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}]"],"results":[[true,1]]}` | H119 completion state |
| `missing-4-cooking_time_spent` | `{"messages":["2, 100, 2 has the following block data: 3"],"results":[[true,3]]}` | `{"messages":["2, 100, 2 has the following block data: 4"],"results":[[true,4]]}` | H119 completion state |
| `missing-4-input` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
| `missing-4-output` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
| `zero-4-full-tag` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 3, speed_multiplier: 1.0f, x: 4, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 4, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
| `zero-4-all-slots` | `{"messages":["4, 100, 2 has the following block data: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}]"],"results":[[true,2]]}` | `{"messages":["4, 100, 2 has the following block data: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}]"],"results":[[true,1]]}` | H119 completion state |
| `zero-4-cooking_time_spent` | `{"messages":["4, 100, 2 has the following block data: 3"],"results":[[true,3]]}` | `{"messages":["4, 100, 2 has the following block data: 4"],"results":[[true,4]]}` | H119 completion state |
| `zero-4-input` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
| `zero-4-output` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
| `five-4-full-tag` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 6, y: 100, cooking_total_time: 5, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 6, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
| `five-4-cooking_total_time` | `{"messages":["6, 100, 2 has the following block data: 5"],"results":[[true,5]]}` | `{"messages":["6, 100, 2 has the following block data: 200"],"results":[[true,200]]}` | H119 completion state |
| `normal-4-full-tag` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 8, y: 100, cooking_total_time: 200, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 8, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation only |
| `started-4-full-tag` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 10, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 10, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation only |
| `5-clock-raw` | `{"messages":["The game time is 306 tick(s)"],"results":[[true,306]]}` | `{"messages":["The game time is 5 tick(s)"],"results":[[true,5]]}` | Unequal raw startup clocks; elapsed clocks pass |
| `missing-5-full-tag` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 2, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 2, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
| `missing-5-all-slots` | `{"messages":["2, 100, 2 has the following block data: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}]"],"results":[[true,2]]}` | `{"messages":["2, 100, 2 has the following block data: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}]"],"results":[[true,1]]}` | H119 completion state |
| `missing-5-cooking_time_spent` | `{"messages":["2, 100, 2 has the following block data: 4"],"results":[[true,4]]}` | `{"messages":["2, 100, 2 has the following block data: 5"],"results":[[true,5]]}` | H119 completion state |
| `missing-5-input` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
| `missing-5-output` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
| `zero-5-full-tag` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 4, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 4, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
| `zero-5-all-slots` | `{"messages":["4, 100, 2 has the following block data: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}]"],"results":[[true,2]]}` | `{"messages":["4, 100, 2 has the following block data: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}]"],"results":[[true,1]]}` | H119 completion state |
| `zero-5-cooking_time_spent` | `{"messages":["4, 100, 2 has the following block data: 4"],"results":[[true,4]]}` | `{"messages":["4, 100, 2 has the following block data: 5"],"results":[[true,5]]}` | H119 completion state |
| `zero-5-input` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
| `zero-5-output` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
| `five-5-full-tag` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 6, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 6, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
| `five-5-all-slots` | `{"messages":["6, 100, 2 has the following block data: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}]"],"results":[[true,2]]}` | `{"messages":["6, 100, 2 has the following block data: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}]"],"results":[[true,1]]}` | H119 completion state |
| `five-5-cooking_time_spent` | `{"messages":["6, 100, 2 has the following block data: 0"],"results":[[true,0]]}` | `{"messages":["6, 100, 2 has the following block data: 5"],"results":[[true,5]]}` | H119 completion state |
| `five-5-input` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
| `five-5-output` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
| `normal-5-full-tag` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 8, y: 100, cooking_total_time: 200, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 8, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation only |
| `started-5-full-tag` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 10, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 10, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation only |
| `6-clock-raw` | `{"messages":["The game time is 307 tick(s)"],"results":[[true,307]]}` | `{"messages":["The game time is 6 tick(s)"],"results":[[true,6]]}` | Unequal raw startup clocks; elapsed clocks pass |
| `missing-6-full-tag` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 2, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 6, speed_multiplier: 1.0f, x: 2, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
| `missing-6-all-slots` | `{"messages":["2, 100, 2 has the following block data: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}]"],"results":[[true,2]]}` | `{"messages":["2, 100, 2 has the following block data: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}]"],"results":[[true,1]]}` | H119 completion state |
| `missing-6-cooking_time_spent` | `{"messages":["2, 100, 2 has the following block data: 5"],"results":[[true,5]]}` | `{"messages":["2, 100, 2 has the following block data: 6"],"results":[[true,6]]}` | H119 completion state |
| `missing-6-input` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
| `missing-6-output` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
| `zero-6-full-tag` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 4, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 6, speed_multiplier: 1.0f, x: 4, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
| `zero-6-all-slots` | `{"messages":["4, 100, 2 has the following block data: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}]"],"results":[[true,2]]}` | `{"messages":["4, 100, 2 has the following block data: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}]"],"results":[[true,1]]}` | H119 completion state |
| `zero-6-cooking_time_spent` | `{"messages":["4, 100, 2 has the following block data: 5"],"results":[[true,5]]}` | `{"messages":["4, 100, 2 has the following block data: 6"],"results":[[true,6]]}` | H119 completion state |
| `zero-6-input` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
| `zero-6-output` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
| `five-6-full-tag` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 6, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 6, speed_multiplier: 1.0f, x: 6, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation + H119 state (strict independent field reads) |
| `five-6-all-slots` | `{"messages":["6, 100, 2 has the following block data: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}]"],"results":[[true,2]]}` | `{"messages":["6, 100, 2 has the following block data: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}]"],"results":[[true,1]]}` | H119 completion state |
| `five-6-cooking_time_spent` | `{"messages":["6, 100, 2 has the following block data: 1"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: 6"],"results":[[true,6]]}` | H119 completion state |
| `five-6-input` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
| `five-6-output` | `{"messages":["Test passed. Count: 1"],"results":[[true,1]]}` | `{"messages":["Test failed"],"results":[[false,0]]}` | H119 completion state |
| `normal-6-full-tag` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 6, speed_multiplier: 1.0f, x: 8, y: 100, cooking_total_time: 200, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 6, speed_multiplier: 1.0f, x: 8, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation only |
| `started-6-full-tag` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 2, speed_multiplier: 1.0f, x: 10, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 2, speed_multiplier: 1.0f, x: 10, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation only |
### Fixed full373: 342/373
| Label | Expected | Actual | Classification |
| --- | --- | --- | --- |
| `clock-start` | `{"messages":["The game time is 301 tick(s)"],"results":[[true,301]]}` | `{"messages":["The game time is 0 tick(s)"],"results":[[true,0]]}` | Unequal raw startup clocks; elapsed clocks pass |
| `0-clock-raw` | `{"messages":["The game time is 301 tick(s)"],"results":[[true,301]]}` | `{"messages":["The game time is 0 tick(s)"],"results":[[true,0]]}` | Unequal raw startup clocks; elapsed clocks pass |
| `missing-0-full-tag` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 2, y: 100, cooking_total_time: 0, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 2, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 0, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
| `zero-0-full-tag` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 4, y: 100, cooking_total_time: 0, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 4, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 0, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
| `five-0-full-tag` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 6, y: 100, cooking_total_time: 5, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 6, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 5, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
| `normal-0-full-tag` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 8, y: 100, cooking_total_time: 200, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 8, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
| `started-0-full-tag` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 10, y: 100, cooking_total_time: 5, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 10, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 5, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 20, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
| `1-clock-raw` | `{"messages":["The game time is 302 tick(s)"],"results":[[true,302]]}` | `{"messages":["The game time is 1 tick(s)"],"results":[[true,1]]}` | Unequal raw startup clocks; elapsed clocks pass |
| `missing-1-full-tag` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 2, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 2, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
| `zero-1-full-tag` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 4, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 4, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
| `five-1-full-tag` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 6, y: 100, cooking_total_time: 5, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 6, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 5, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
| `normal-1-full-tag` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 8, y: 100, cooking_total_time: 200, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 8, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
| `started-1-full-tag` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 2, speed_multiplier: 1.0f, x: 10, y: 100, cooking_total_time: 5, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 2, speed_multiplier: 1.0f, x: 10, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 5, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 19, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
| `4-clock-raw` | `{"messages":["The game time is 305 tick(s)"],"results":[[true,305]]}` | `{"messages":["The game time is 4 tick(s)"],"results":[[true,4]]}` | Unequal raw startup clocks; elapsed clocks pass |
| `missing-4-full-tag` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 3, speed_multiplier: 1.0f, x: 2, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 3, speed_multiplier: 1.0f, x: 2, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
| `zero-4-full-tag` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 3, speed_multiplier: 1.0f, x: 4, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 3, speed_multiplier: 1.0f, x: 4, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
| `five-4-full-tag` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 6, y: 100, cooking_total_time: 5, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 6, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 5, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
| `normal-4-full-tag` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 8, y: 100, cooking_total_time: 200, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 8, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
| `started-4-full-tag` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 10, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 10, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 16, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
| `5-clock-raw` | `{"messages":["The game time is 306 tick(s)"],"results":[[true,306]]}` | `{"messages":["The game time is 5 tick(s)"],"results":[[true,5]]}` | Unequal raw startup clocks; elapsed clocks pass |
| `missing-5-full-tag` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 2, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 2, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
| `zero-5-full-tag` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 4, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 4, speed_multiplier: 1.0f, x: 4, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
| `five-5-full-tag` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 6, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 0, speed_multiplier: 1.0f, x: 6, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
| `normal-5-full-tag` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 8, y: 100, cooking_total_time: 200, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 8, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
| `started-5-full-tag` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 10, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 10, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 15, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
| `6-clock-raw` | `{"messages":["The game time is 307 tick(s)"],"results":[[true,307]]}` | `{"messages":["The game time is 6 tick(s)"],"results":[[true,6]]}` | Unequal raw startup clocks; elapsed clocks pass |
| `missing-6-full-tag` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 2, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 2, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
| `zero-6-full-tag` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 4, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 5, speed_multiplier: 1.0f, x: 4, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
| `five-6-full-tag` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 6, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 1, speed_multiplier: 1.0f, x: 6, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
| `normal-6-full-tag` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 6, speed_multiplier: 1.0f, x: 8, y: 100, cooking_total_time: 200, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {}}"],"results":[[true,1]]}` | `{"messages":["8, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 6, speed_multiplier: 1.0f, x: 8, y: 100, Items: [{count: 3, Slot: 0b, id: \"minecraft:raw_iron\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {}}"],"results":[[true,1]]}` | H191 presentation |
| `started-6-full-tag` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 2, speed_multiplier: 1.0f, x: 10, y: 100, cooking_total_time: 200, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | `{"messages":["10, 100, 2 has the following block data: {lit_total_time: 20, components: {}, cooking_time_spent: 2, speed_multiplier: 1.0f, x: 10, y: 100, Items: [{count: 2, Slot: 0b, id: \"minecraft:raw_iron\"}, {count: 1, Slot: 2b, id: \"minecraft:iron_ingot\"}], cooking_total_time: 200, z: 2, id: \"minecraft:furnace\", lit_time_remaining: 14, RecipesUsed: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}}"],"results":[[true,1]]}` | H191 presentation |
### Untouched supplementary25: 15/25
| Label | Expected | Actual | Classification |
| --- | --- | --- | --- |
| `missing-1-recipes-used` | `{"messages":["2, 100, 2 has the following block data: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {}"],"results":[[true,0]]}` | H119 completion state |
| `zero-1-recipes-used` | `{"messages":["4, 100, 2 has the following block data: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {}"],"results":[[true,0]]}` | H119 completion state |
| `missing-4-recipes-used` | `{"messages":["2, 100, 2 has the following block data: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {}"],"results":[[true,0]]}` | H119 completion state |
| `zero-4-recipes-used` | `{"messages":["4, 100, 2 has the following block data: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {}"],"results":[[true,0]]}` | H119 completion state |
| `missing-5-recipes-used` | `{"messages":["2, 100, 2 has the following block data: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {}"],"results":[[true,0]]}` | H119 completion state |
| `zero-5-recipes-used` | `{"messages":["4, 100, 2 has the following block data: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {}"],"results":[[true,0]]}` | H119 completion state |
| `five-5-recipes-used` | `{"messages":["6, 100, 2 has the following block data: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {}"],"results":[[true,0]]}` | H119 completion state |
| `missing-6-recipes-used` | `{"messages":["2, 100, 2 has the following block data: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}"],"results":[[true,1]]}` | `{"messages":["2, 100, 2 has the following block data: {}"],"results":[[true,0]]}` | H119 completion state |
| `zero-6-recipes-used` | `{"messages":["4, 100, 2 has the following block data: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}"],"results":[[true,1]]}` | `{"messages":["4, 100, 2 has the following block data: {}"],"results":[[true,0]]}` | H119 completion state |
| `five-6-recipes-used` | `{"messages":["6, 100, 2 has the following block data: {\"minecraft:iron_ingot_from_smelting_raw_iron\": 1}"],"results":[[true,1]]}` | `{"messages":["6, 100, 2 has the following block data: {}"],"results":[[true,0]]}` | H119 completion state |
## Actual absolute clock observations
The frozen full373 expected reference starts at301. Every contemporaneous fresh
Java and native value remains unmodified in the raw records/traces; the observed
starts/ends below are engine-specific, not equalized or subtracted in those
records. The retained canonical score operations separately prove elapsed0/1/4/5/6.
| Capture | Fresh Java start/end | Native start/end |
| --- | --- | --- |
| `java-canonical342` | 305/311 | not run |
| `old-canonical342` | 317/323 | 0/6 |
| `fixed-canonical342` | 301/307 | 0/6 |
| `java-used25-v2` | 317/323 | not run |
| `old-used25` | 317/323 | 0/6 |
| `fixed-used25` | 317/323 | 0/6 |
| `old-full373` | 305/311 | 0/6 |
| `fixed-full373` | 317/323 | 0/6 |
## Local readiness
All six furnace helper tests pass. Full readiness passes formatting, workspace/
headless Clippy, doc tests and public-tree checks:1,877 Rust tests pass; the sole
`entities::drop_motion_tests::drops_match_vanillas_motion_bit_for_bit` failure is
identically reproduced by the archived untouched binary (one-bit Z difference
at37.5/-21.25). Python686 has four unchanged packaging failures/one skip: the ARM
mock-release installer and Bash3.2 optional-archive masks0/1/2. No related code is
changed. Final evidence-only additions receive repeated whitespace/public checks.
Main was actually pulled through`f2f95dad8`; scoped furnace/tick/codec files remain
unchanged. Runtime claims remain qualified to the paired`ff4b4b17b` base.
+102
View File
@@ -0,0 +1,102 @@
"""Five loaded furnace totals, observed at cumulative 0/1/4/5/6 real ticks."""
CASES = [('missing', None, 0), ('zero', 0, 0), ('five', 5, 0),
('normal', 200, 0), ('started', 5, 1)]
def loaded_totals():
ops = []
def cmd(text, label, result=None):
row = {'op': 'cmd', 'cmd': text, 'label': label}
if result is not None:
row['expect_result'] = result
ops.append(row)
cmd('/tick freeze', 'freeze')
for rule, value in [('spawn_mobs', 'false'), ('advance_time', 'false'), ('random_tick_speed', '0')]:
cmd(f'/gamerule {rule} {value}', 'rule-'+rule)
cmd('/forceload add 0 0', 'force', 1)
ops.append({'op': 'settle', 'required_chunks': [[0, 0]]})
cmd('/fill 0 99 0 15 99 15 stone', 'floor', 256)
cmd('/fill 0 100 0 15 105 15 air', 'air')
cmd('/scoreboard objectives add h119 dummy', 'objective')
cmd('/execute store result score start h119 run time query gametime', 'clock-start')
for i, (name, total, spent) in enumerate(CASES):
x = 2 + i * 2
for y, block in [(99, 'stone'), (100, 'air'), (101, 'air')]:
cmd(f'/execute if block {x} {y} 2 {block}', name+f'-setup-{y}', 1)
extra = '' if total is None else f',cooking_total_time:{total}'
tag = ('{lit_time_remaining:20,lit_total_time:20,'
f'cooking_time_spent:{spent}{extra},'
'Items:[{Slot:0b,id:"minecraft:raw_iron",count:3}]}')
cmd(f'/setblock {x} 100 2 minecraft:furnace[lit=true]{tag}', name+'-load', 1)
previous = 0
for elapsed in [0, 1, 4, 5, 6]:
if elapsed:
cmd(f'/tick step {elapsed-previous}', f'{elapsed}-step', 1)
ops.append({'op': 'tick', 'n': elapsed-previous})
previous = elapsed
cmd('/execute store result score now h119 run time query gametime', f'{elapsed}-clock-raw')
cmd('/scoreboard players operation now h119 -= start h119', f'{elapsed}-clock-delta-op', elapsed)
cmd('/scoreboard players get now h119', f'{elapsed}-clock-delta', elapsed)
for i, (name, supplied, initial) in enumerate(CASES):
x = 2 + i * 2
at = f'{x} 100 2'
key = f'{name}-{elapsed}'
# These are hypotheses admitted independently by fresh Java before
# either native capture; they are never used to update a furnace.
first = 1 if supplied in (None, 0) else supplied-initial
completed = elapsed >= first
spent = elapsed-first if completed else elapsed+initial
total = 200 if completed else (supplied or 0)
cmd(f'/execute if loaded {at}', key+'-loaded', 1)
cmd(f'/execute if block {x} 99 2 stone', key+'-floor', 1)
cmd(f'/execute if block {at} minecraft:furnace[lit=true]', key+'-lit', 1)
cmd(f'/execute if data block {at} {{id:"minecraft:furnace",x:{x},y:100,z:2}}', key+'-identity', 1)
cmd(f'/data get block {at}', key+'-full-tag')
cmd(f'/data get block {at} Items', key+'-all-slots')
for field, expected in [('cooking_time_spent', spent), ('cooking_total_time', total),
('lit_time_remaining', 20-elapsed), ('lit_total_time', 20)]:
cmd(f'/data get block {at} {field}', key+'-'+field, expected)
cmd(f'/execute if data block {at} {{Items:[{{Slot:0b,id:"minecraft:raw_iron",count:{2 if completed else 3}}}]}}', key+'-input', 1)
cmd(f'/execute unless data block {at} Items[{{Slot:1b}}]', key+'-no-fuel', 1)
if completed:
cmd(f'/execute if data block {at} {{Items:[{{Slot:2b,id:"minecraft:iron_ingot",count:1}}]}}', key+'-output', 1)
else:
cmd(f'/execute unless data block {at} Items[{{Slot:2b}}]', key+'-no-output', 1)
return ops
# Authorized before canonical paired captures. Full373 remains unchanged.
DIAGNOSTIC_LABELS = frozenset(
[f'{name}-{tick}-full-tag' for name, _, _ in CASES for tick in [0, 1, 4, 5, 6]]
+ ['clock-start'] + [f'{tick}-clock-raw' for tick in [0, 1, 4, 5, 6]])
def selected_totals(full=False):
ops = loaded_totals()
if not full:
for op in ops:
if op.get('label') in DIAGNOSTIC_LABELS:
# Commands still execute, with actual trace bodies retained.
# Full diagnostic compares their complete records separately.
op.update(record=False, trace=True)
return ops
def recipes_used_totals():
"""Separate25 reads; all original actions/guards still run and are traced."""
out = []
for op in loaded_totals():
if op['op'] == 'cmd':
op.update(record=False, trace=True)
out.append(op)
label = op.get('label', '')
if label.endswith('-all-slots'):
name, elapsed, *_ = label.split('-')
elapsed = int(elapsed)
i, (_, total, spent) = next((i, c) for i, c in enumerate(CASES) if c[0]==name)
first = 1 if total in (None, 0) else total-spent
value = '{"minecraft:iron_ingot_from_smelting_raw_iron": 1}' if elapsed >= first else '{}'
x = 2+i*2
out.append({'op': 'cmd', 'cmd': f'/data get block {x} 100 2 RecipesUsed',
'label': f'{name}-{elapsed}-recipes-used', 'trace': True,
'expect_result': int(elapsed >= first), 'expected_text': f'{x}, 100, 2 has the following block data: {value}'})
return out
+71
View File
@@ -0,0 +1,71 @@
#!/usr/bin/env python3
"""Real Game/Java loaded-furnace ticks; compare every complete raw record."""
import hashlib
import json
from pathlib import Path
import sys
import test_command_exec_parity as driver
from furnace_loaded_total_corpus import selected_totals, recipes_used_totals
def used_admissions(build, ops, native=False):
side = 'rust' if native else 'java'
rows = [json.loads(line.split('command trace: ', 1)[1])
for line in (build/(side+'.log')).read_text().splitlines() if 'command trace: ' in line]
commands = [op for op in ops if op['op']=='cmd']
assert len(rows)==len(commands), ('complete actual trace', side, len(rows), len(commands))
(build/(side+'-trace.json')).write_text(json.dumps(rows, indent=2)+'\n')
for op, row in zip(commands, rows):
assert row['cmd']==op['cmd'], ('trace command identity', op, row)
parts = op['label'].split('-')
subject = parts[0] in {'missing','zero','five','normal','started'}
common = any(op['label'].endswith('-'+field) for field in
['loaded','floor','lit','identity','no-fuel','lit_time_remaining','lit_total_time'])
admit = not native or not subject or parts[0] in {'normal','started'} or parts[1] in {'0','setup','load'} or common
if admit and 'expect_result' in op:
assert row['results']==[[True, op['expect_result']]], (side, 'actual guard', op, row)
if not native and 'expected_text' in op:
assert [''.join(span[0] for span in message) for message in row['messages']]==[op['expected_text']], ('typed RecipesUsed', op, row)
if __name__ == '__main__':
used = '--recipes-used-only' in sys.argv
if used: sys.argv.remove('--recipes-used-only')
full = '--full-diagnostic' in sys.argv
assert not (used and full), 'choose one diagnostic program'
if full: sys.argv.remove('--full-diagnostic')
reference = None
if '--reference' in sys.argv:
at = sys.argv.index('--reference')
reference = Path(sys.argv[at+1]).resolve()
del sys.argv[at:at+2]
if '--work-dir' not in sys.argv:
sys.argv += ['--work-dir', str(driver.lab.LOCAL/'furnace-loaded-total-parity')]
build = Path(sys.argv[sys.argv.index('--work-dir')+1]).resolve()
ops = recipes_used_totals() if used else selected_totals(full)
driver.corpus_module.groups = lambda: [('loaded furnace cooking totals', ops)]
# The shared runner retains its own report; this wrapper always additionally
# compares untouched complete JSON records, without its presentation masks.
sys.argv.append('--allow-gaps')
driver.main()
if used: used_admissions(build, ops)
if '--reference-only' not in sys.argv:
source = reference or build/'vanilla.jsonl'
if reference and not full:
assert source.read_bytes() == (build/'vanilla.jsonl').read_bytes(), 'fresh Java canonical reference bytes changed'
java = [json.loads(s) for s in source.read_text().splitlines()]
native = [json.loads(s) for s in (build/'rust.jsonl').read_text().splitlines()]
if used: used_admissions(build, ops, native=True)
recorded = [op for op in ops if op['op']=='cmd' and op.get('record', True)]
assert len(java)==len(native)==len(recorded), 'complete record count'
differences = [{'label': op['label'], 'expected': a, 'actual': b}
for op, a, b in zip(recorded, java, native) if a != b]
report = {'records': len(java), 'passed': len(java)-len(differences),
'comparison': 'all declared complete raw JSON records; no masks/tolerances',
'reference_sha256': hashlib.sha256(source.read_bytes()).hexdigest(),
'fresh_java_sha256': hashlib.sha256((build/'vanilla.jsonl').read_bytes()).hexdigest(),
'full_diagnostic': full,
'differences': differences}
(build/'strict-report.json').write_text(json.dumps(report, indent=2)+'\n')
print(f'Strict raw records: {report["passed"]}/{report["records"]}')
if differences:
raise SystemExit(1)