diff --git a/igneum-pow/src/generator.rs b/igneum-pow/src/generator.rs index f6db262c7..13ac517a5 100644 --- a/igneum-pow/src/generator.rs +++ b/igneum-pow/src/generator.rs @@ -1242,7 +1242,12 @@ pub fn candidate_from_words_class( // by `or`, `mul` or `mulhi` (an `or`-written source is all-ones with probability (3/4)^32 per read and made the // 153x item of the finding). Keyed on the era-composed V4_CLASS so the generator-2 ladder packs keep their stream; // v2 and v3 take no part. The draw order and the stream are otherwise the same, draw for draw. - let source_rule_v4 = ProgramClass::of_load_class(&class) == Some(ProgramClass::V4) && class.era.is_some(); + // Keyed on the class with the shadow's pass count set aside (the latency ladder draws the same base program at + // every rung: `of_load_class` compares the pass count too and answered None at every rung but 27, found by the + // fork's ladder test, 7 October 2026 10:06Z), the same comparison the fork's "v4 is v3 plus the shadow" test makes. + let source_rule_v4 = class.era.is_some() + && matches!(class.shadow, Some(ShadowClass { instrs: V4_SHADOW_INSTRS, .. })) + && LoadClass { era: None, shadow: None, ..class } == LoadClass { shadow: None, ..V4_CLASS }; let mut fresh = [false; 8]; let mut entropy_kept = [false; 8]; let mut instrs = Vec::with_capacity(INSTR_COUNT);