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 <noreply@anthropic.com>
This commit is contained in:
igneum-labs 2026-10-07 10:09:28 +00:00
parent e4a433e016
commit 8d9d685981

View file

@ -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);