class v5 harness: the class-walk case under the v5 object (v4 floor 0, v3 never: every epoch before the flip is class 4), a fork-binary override for the node lane's pair build; the page carries the node lane's branch list and the decide() fix
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
ea3a76e4c4
commit
0a5abe0634
4 changed files with 13 additions and 3 deletions
|
|
@ -267,6 +267,7 @@ Every item of this page that has no code, no test or no measurement yet, with th
|
|||
| The generator and verifier (igneum-pow): `V5_CLASS`, generator 5, blake2b, the state leaves and the leaf XOR, the emitters' leaf buffer, `--state`, the pinned packs, the known-failed tests | done; on the frozen sub-version 3 base (ca3-v4-amend 017e7037 merged 18:5x UK, the source rule keyed with the state flag aside, 67 unit and 39 integration tests on build-2 before the merge, the suite re-running on it now) | this lane | 0 |
|
||||
| The +0.2 ms per warp cost against the 10 ms gate | measured on igneum-build-1's reference core (section 7: +0.28 cold, +0.20 average, both classes under 10 ms loaded); NOT yet on one M5 Max core as the order asks (the Mac rule: one Metal or macOS run at a time under the lock) | this lane | 1 |
|
||||
| The node side: the state commitment into the derivation, the per-epoch capture, the lock-free stream cache, the provider, the refusal, `igneum_getPowStateLeaves`, the signal rule and the floor, the RPC fields, the miner's fetch | done on the fork; rebased onto release-0.3.23-node at 19:0x UK (v5 pinned to object byte 6, counted exactly; byte 7 is v4 sub-version 3); the suites on build-2 owed on the rebased fork | this lane | 1 |
|
||||
| The node lane's class-v5-node-wire, the whole list (22:2x UK): 7737ebd9 the snapshot wire's epoch streams; 6d827c5d the day-state witness in the pruning proof; 40c03806 the stale-chip kaspa-pow test; b1680b57 decide(); ee26af39 and 29aecfab the IBD catch-up across the flip; a3b2049d the relay flow holds off a v5 state-wait block (no strike, no N6 memory); 9ad1d9c6 the node holds its own mining during a catch-up; f0c56f50 the catch-up anchors on the highest validated honest header. The 0.3.24 line carrying them with the heights, tags and chain id by height: v5-object-0323 c8f9b383; the object commit waits on the restart step's PASS on pair 4 | done by the node lane | node lane | 0 |
|
||||
| The stateless and stale-chip rule as a test, known-failed first | done: `a_stateless_hasher_is_wrong_on_every_item` (igneum-pow), `class_v5_refuses_without_state_and_refreshes_the_leaves_per_epoch` (kaspa-pow), the harness's stale miner (66 of 66 rejected) and stateless node | this lane | 0 |
|
||||
| The digest-compat rule for the new field | done: `program_class_v5_activation_daa` enters the digest only once set (the 0.3.15 rule; the params test covers the override file); the 60x file carries it at never | this lane | 0 |
|
||||
| The hot-set cache rule (AP-F8-1, 1.067x bound) | inherited by merge from sub-version 3 (the dataflow freshness rule, the shared-operand rule, the 256 cap and the last resort); the bound itself is the attack-pass lane's F8 gate on the v5 stream | attack-pass lane (a3832b1c3b274b310) for the gate; this lane for the v5 pack export it reads | 2 |
|
||||
|
|
@ -283,7 +284,7 @@ Every item of this page that has no code, no test or no measurement yet, with th
|
|||
| The pool protocol's per-epoch state fetch | NO code | pool lane | 2 |
|
||||
| The day-state witness in the pruning-proof format | DONE by the node lane (19:5x UK): class-v5-node-wire 6d827c5d on both mirrors. The witness is the state root after each class v5 epoch's seed block, `EpochSeedHeader.stateRoot = 3` beside the epoch seed header (empty before class v5, so the old wire parses both ways), `PruningProofStateRoots` on the proof metadata; the prover reads each class v5 seed block's root from the installed provider (`DayStateProvider::state_root(block)`, one addition to the kaspa-pow trait, default decodes the stream) or from a witness it took; the verifier's `ProofSeeds::from_witnesses_with_roots` refuses a class v5 epoch whose seed header has no root (the known-failed shape) and a root for an epoch with no header; `check_header` on DayStateUnavailable for a class v5 header accepts it as trusted data when the proof carries the epoch's witness, else refuses naming the missing witness; the importer installs the (seed block, root) pairs through `install_day_state_witnesses`; the executor's `install_epoch_streams` holds a stream for a block it has no record of to that witness (section 5's rule, both conditions). Suites on build-2 on the commit: kaspa-consensus 122, igneum-exec 44, kaspa-p2p-flows 37, kaspa-p2p-lib 20, kaspa-pow 18 | node lane | 0 |
|
||||
| The acceptance bound on a program's hot-set share (section 14, main's order 19:5x UK) | DONE: (c''') `MIN_DISTINCT_RATIO_V5 = 0.995` under the state flag (ab6f980b), known-failed first on seed 100767, the census read (21:03 UK): 2.435 percent of sub-version 3 accepted programs under the floor, attempts mean 2.174 to 2.248, 0 class v5 programs under it; the design reading of 0 clean rejections was wrong and the page says so | this lane | 0 |
|
||||
| The class walk under the v5 object (`class_signal.rs decide()`: epochs under the window resolve to v3 regardless of the v4 floor once v5 is enabled; the v5-fasttime lane's reading 20:0x UK) | OPEN, the node lane's: a known-failed test with v4 from genesis and the v5 object set must read v4 at epoch 0; this lane's harness gains the same case (v4 floor 0, v3 never) once the fork has the fix | node lane (fork), this lane (harness case) | 2 |
|
||||
| The class walk under the v5 object (`class_signal.rs decide()`: epochs under the window resolved to v3 regardless of the v4 floor once v5 was enabled; the v5-fasttime lane's reading 20:0x UK) | FIXED by the node lane: b1680b57 on class-v5-node-wire, `unfull_window_base(epoch)` takes the floor's class for an epoch whose seed block lies under the signal window, never a bare v3, with the known-failed test `an_epoch_under_the_window_takes_its_floors_class_not_a_bare_v3`; read live by the fast-time lane on pairs 959b57c9 and 63524e28 (prelude e0:v4 e1:v4). This lane's harness case added (`--v4-floor 0 --v3-activation never`, check `epochs_under_the_window_take_the_floors_class`), to run on the pair build (FORK_BIN) | node lane (fork), this lane (harness case) | 0 |
|
||||
| The shadow-block-write residual of section 14 (the three milder concentrations at 1.26x to 1.45x, Devnet 3's first program among them) | OPEN: a draw rule on the shadow block's last write to a load's source (mul, mulhi, sub of the same register), known-failed first on fce15bf61030be57's site 0, with its after-fraction census; not in tonight's object (the chip value is under the AP-F8-1 bound by two orders); adv-mixer-2's AP-F4-1 lever (redraw when the FPGA LUT cost is 205 or less, a 2-adder mul, or all rotations equal; about 22 days per 100 years redrawn) is the second independent statement of the same mechanism, its census owed on the class v5 generator | this lane | 3 |
|
||||
| AP-F4-1 in the agreed form (attack-pass lane and adv-mixer-2 reconciled, 22:0x UK) | DONE in the post-freeze commit: the rule is `A = 64 + sum(w32(MUL_i) - 1)` at most 205 rejects (the median 226; w32 over bit positions 0 to 31, the first census's position-32 carry digit dropped, 231 to 226), any MUL with w32 at most 3 rejects (k >= 1), the eight ROT all equal rejects; a rejected block is redrawn whole from the continuing stream. It replaces "NAF sum under 163 (cost under 211), four distinct rotations". Known-failed first on the day both censuses name, chain day 29,337 (2050-04-28, 1.113x). Tail: 5.69e-4 of days, 15 days a century; nothing to a chip or a GPU | this lane | 0 |
|
||||
| Class v5's verified last resort (adv-accept-3's finding aa359962: sub-version 3's `last_resort_v4` fails the rule on 223 of 2,500 seeds, 209 by part (a), and is handed to the chain unchecked; unreachable at 4.6e-44 per epoch) | DONE in the post-freeze commit: `last_resort_v5` = the rewrite, then `repair_stale_loads` (a stale load re-sourced to the lowest register written since its last load, walked to a fixpoint), then the whole rule, over a 256-candidate scan from the cap; the unchecked fallback past the scan sits under 1e-300. Known-failed first on adv3/steer/2 (`class_v5_last_resort_is_verified_known_failed_adv3_steer_2`). The record: sub-version 3's last resort is unreachable and unverified (the hash lane's AP-F8-1 entry); class v5's is verified by that test | this lane | 0 |
|
||||
|
|
|
|||
|
|
@ -17,6 +17,10 @@
|
|||
// seed's v4 id; the stateless node's miner accepts 0 blocks after the flip; 0 rejected
|
||||
// --signal 6,6,6 --floor never --expect no-flip the object off: byte 6 counts as v4 only
|
||||
// --signal 7,7,7 --floor 600 --expect floor nobody signals v5: it flips at the floor (epoch 10) and not before
|
||||
// --signal 6,6,6 --expect flip --v4-floor 0 --v3-activation never the class walk under the v5 object: v4 from genesis
|
||||
// (Devnet 3's shape), every epoch before the flip reads class 4 (the node lane's decide()
|
||||
// fix b1680b57; without it the epochs under the window read a bare v3 and a Devnet 3 node
|
||||
// with the object set would refuse day one)
|
||||
// --signal 6,6,6 --expect flip --stale 2 proof of following's known-failed case: miner 2 keeps the first stream it
|
||||
// fetched (--freeze-state); from the epoch after the flip every block it mines is
|
||||
// rejected (accepted after the first refresh 0, rejected above 0); PASS means the
|
||||
|
|
@ -389,6 +393,10 @@ if (EXPECT === 'flip') {
|
|||
signal_line_on_every_node_same_epoch: signalEpochs.every(e => e != null) && new Set(signalEpochs).size === 1 && signalEpochs[0] === (firstV4 && firstV4.epoch),
|
||||
signal_share_at_or_above_threshold: signalShares.every(s => s != null && s >= 9500),
|
||||
blocks_on_both_sides: before.length > 0 && after.length > 0,
|
||||
// the class walk under the v5 object (the v5-fasttime lane's reading, 7 October 2026, 20:0x UK; the node lane's fix
|
||||
// b1680b57 on class-v5-node-wire): with the v4 floor at 0 and v3 never, every epoch before the flip is class 4, never a
|
||||
// bare v3 for the epochs whose seed block lies under the signal window (the known-failed shape read e0:v3 e1:v3 e2:v4)
|
||||
epochs_under_the_window_take_the_floors_class: !(V4_FLOOR === 0 && V3_ACTIVATION == null) || [...epochs.entries()].filter(([e]) => firstV4 == null || +e < firstV4.epoch).every(([, v]) => v.class === 4),
|
||||
// the rows whose stream the executor still held at the end (the last three epochs) must match the CLI; at least two of them
|
||||
v5_ids_equal_the_cli_v5_id: idRows.filter(r => r.state_root != null).length >= 2 && idRows.filter(r => r.state_root != null).every(r => r.cli_v5 != null && r.cli_v5 === r.miners_id && r.miners === 3),
|
||||
v5_ids_differ_from_the_same_seed_v4_id: idRows.length > 0 && idRows.every(r => r.cli_v4 != null && r.cli_v4 !== r.miners_id),
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ touch "$REMOTE_ROOT/infra/fast-time/class-v5-signal.mjs" "$REMOTE_ROOT/infra/fas
|
|||
mkdir -p "$REMOTE_LOG"
|
||||
cd "$REMOTE_ROOT"
|
||||
IGNEUM_V5_BASE="$BASE" IGNEUM_V5_TMP="/tmp/igneum-fast-time-v5s-$CASE" \
|
||||
IGNEUM_V5_BIN="$REMOTE_ROOT/vendor/igneum-node-class-v5/target/release" \
|
||||
IGNEUM_V5_BIN="${IGNEUM_V5_BIN:-$REMOTE_ROOT/vendor/igneum-node-class-v5/target/release}" \
|
||||
IGNEUM_POW="$REMOTE_ROOT/igneum-pow/target/release/igneum-pow" \
|
||||
node infra/fast-time/class-v5-signal.mjs "$@" > "$REMOTE_LOG/$CASE.log" 2>&1
|
||||
rc=$?
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ echo "harness-remote: case $CASE on $HOST: node $REMOTE_ROOT/infra/fast-time/cla
|
|||
rsync -a -e "ssh -i $KEY" "$ROOT/infra/fast-time/class-v5-signal.mjs" "$ROOT/infra/fast-time/override-60x.json" "$HOST:$REMOTE_ROOT/infra/fast-time/"
|
||||
rsync -a -e "ssh -i $KEY" "$ROOT/tools/class-v5/harness-box.sh" "$HOST:$REMOTE_ROOT/tools/class-v5/"
|
||||
# the box side is a script run by path (tools/class-v5/harness-box.sh), not an ssh command string
|
||||
ssh -i "$KEY" "$HOST" "$REMOTE_ROOT/tools/class-v5/harness-box.sh" "$REMOTE_ROOT" "$REMOTE_LOG" "$CASE" "$BASE" $ARGS || true
|
||||
# FORK_BIN=<dir on the box> points the harness at another fork build (the node lane's pair build for a fix not yet on class-v5-node)
|
||||
ssh -i "$KEY" "$HOST" "IGNEUM_V5_BIN=${FORK_BIN:-} $REMOTE_ROOT/tools/class-v5/harness-box.sh" "$REMOTE_ROOT" "$REMOTE_LOG" "$CASE" "$BASE" $ARGS || true
|
||||
rsync -a -e "ssh -i $KEY" "$HOST:$REMOTE_LOG/$CASE.log" "$HOST:$REMOTE_LOG/$CASE.json" "$OUT/" 2>/dev/null || true
|
||||
grep -E "SUMMARY|FAILED CHECK|PROGRAM ID|CLASS SWITCH" "$OUT/$CASE.log" || tail -20 "$OUT/$CASE.log"
|
||||
|
|
|
|||
Loading…
Reference in a new issue