From 8d9d6859810cf4762ad82a00659a8d30a0de7799 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 10:09:28 +0000 Subject: [PATCH] Counter ASIC 3.0 gates (hash): the source rule keys on the class with the shadow's pass count set aside (the node lane's line: era present, the V4_SHADOW_INSTRS block, the base equal to V4_CLASS without era and shadow), so every rung of the latency ladder draws under it; of_load_class compared the pass count and left every rung but 27 on the old draw (the fork's ladder test, 10:06Z). The reps-0 packs and their ids do not move (re-export byte-identical) Co-Authored-By: Claude Fable 5.1 --- igneum-pow/src/generator.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/igneum-pow/src/generator.rs b/igneum-pow/src/generator.rs index f6db262c..13ac517a 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);