From f3a98cd291b8d9f16274ffb04e7883eb34e557f8 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Tue, 6 Oct 2026 08:05:04 +0000 Subject: [PATCH] proving v1 harness: --fresh-rule (default never keeps the known-failed line; set, case 3 expects a fresh record accepted while the previous segment is pending and freshAdmissible true) Co-Authored-By: Claude Fable 5.1 --- tools/proving-v1/net.mjs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tools/proving-v1/net.mjs b/tools/proving-v1/net.mjs index 6ba403324..ae36027e3 100644 --- a/tools/proving-v1/net.mjs +++ b/tools/proving-v1/net.mjs @@ -37,6 +37,10 @@ const args = process.argv.slice(2); const flag = (name, dflt) => { const i = args.indexOf(name); return i >= 0 && args[i + 1] !== undefined ? +args[i + 1] : dflt; }; const SECS = flag('--secs', 1200); const V0 = 60, V1 = flag('--v1', 120), SEG = flag('--segment', 4), UNPROVEN = flag('--unproven', 60), SHARE_BPS = 1000; +// --fresh-rule : the fresh-record rule switch (6 October 2026); default never (the 0.3.11 rule), so case 3 keeps +// its known-failed line; with --fresh-rule 0 a fresh record after a PENDING segment is accepted (the new rule) and +// case 2's refusal after a PROVEN one still stands +const FRESH_RULE = process.argv.includes('--fresh-rule') ? Number(process.argv[process.argv.indexOf('--fresh-rule') + 1]) : null; const started = []; const t0 = Date.now(); const since = () => ((Date.now() - t0) / 1000).toFixed(1); @@ -56,6 +60,7 @@ let overrideText = readFileSync(FILE, 'utf8') .replace(/"proving_v1_segment_blocks":\s*\d+/, `"proving_v1_segment_blocks": ${SEG}`) .replace(/"proving_v1_unproven_daa":\s*\d+/, `"proving_v1_unproven_daa": ${UNPROVEN}`) .replace(/"proving_v1_aggregator_share_bps":\s*\d+/, `"proving_v1_aggregator_share_bps": ${SHARE_BPS}`) + .replace(/"proving_v1_fresh_rule_daa":\s*\d+/, FRESH_RULE === null ? '"proving_v1_fresh_rule_daa": 18446744073709551615' : `"proving_v1_fresh_rule_daa": ${FRESH_RULE}`) .replace(/"skip_proof_of_work":\s*(true|false)/, '"skip_proof_of_work": true'); for (const re of [/"skip_proof_of_work": true/, new RegExp(`"proving_v1_activation_daa": ${V1}`), new RegExp(`"proving_v1_segment_blocks": ${SEG}`), new RegExp(`"proving_v1_unproven_daa": ${UNPROVEN}`)]) if (!re.test(overrideText)) throw new Error(`override edit failed: ${re}`); writeFileSync(override, overrideText); @@ -211,7 +216,13 @@ try { const lastHash3 = stmt3early.blocks[stmt3early.blocks.length - 1].hash; const fresh3 = signSegment(seg3[0], seg3[1], lastHash3, stmt3early.publicValuesFresh, 'seg3-fresh'); const subEarly = await n0.eth('igneum_submitSegmentRecord', [{ record: fresh3.record, proof: fresh3.proof }]); - check('known-failed: segment 3 cannot start a fresh chain while segment 2 is pending', subEarly.accepted === false && /pending until DAA/.test(subEarly.reason), subEarly); + if (FRESH_RULE === null) { + check('known-failed: segment 3 cannot start a fresh chain while segment 2 is pending', subEarly.accepted === false && /pending until DAA/.test(subEarly.reason), subEarly); + } else { + check('fresh-record rule: segment 3 starts a fresh chain while segment 2 is pending', subEarly.accepted === true, subEarly); + const stmt3now = await n0.eth('igneum_getSegmentStatement', ['0x' + seg3[0].toString(16)]); + check('fresh-record rule: the statement reports the fresh record admissible', stmt3now.freshAdmissible === true, { freshAdmissible: stmt3now.freshAdmissible }); + } await waitDaa(n0, deadline2 + 2, 'past segment 2 deadline'); const stmt2late = await n0.eth('igneum_getSegmentStatement', ['0x' + seg2[0].toString(16)]); check('known-failed: segment 2 is unproven after its deadline', stmt2late.status.status === 'unproven', stmt2late.status);