From 5c7ec95344bf03849ad7ec2efdf4c8990b0d618e Mon Sep 17 00:00:00 2001 From: John Dvorak Date: Fri, 31 Jul 2026 14:27:13 -0700 Subject: [PATCH] js-rigor: extend fuzzer campaign to 6 config kinds (intersection, defeasible) Confirms min-intersection and when*unless defeasible semantics hold under fuzzed config transitions and mutation bursts. --- tests/rigor/fuzzer-mutation-needles.test.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/tests/rigor/fuzzer-mutation-needles.test.js b/tests/rigor/fuzzer-mutation-needles.test.js index 171aa46..aa3065d 100644 --- a/tests/rigor/fuzzer-mutation-needles.test.js +++ b/tests/rigor/fuzzer-mutation-needles.test.js @@ -23,7 +23,7 @@ import { Arbiter } from '../../src/index.js'; const NODES = 6; const nodeKey = (id) => (id < 2 ? `u:${id}` : id === 2 ? 'g:0' : `doc:${id - 3}`); -const KINDS = ['direct', 'chain', 'union', 'exclusion']; +const KINDS = ['direct', 'chain', 'union', 'exclusion', 'intersection', 'defeasible']; const CONFIGS = { direct: { type: 'direct', relation: 'owner' }, chain: { @@ -46,6 +46,18 @@ const CONFIGS = { { type: 'direct', relation: 'owner' }, { type: 'chain', steps: [{ relation: 'member_of', direction: 'out' }, { relation: 'reads', direction: 'out' }] } ] + }, + intersection: { + intersection: { + rules: [ + { type: 'direct', relation: 'owner' }, + { type: 'chain', steps: [{ relation: 'member_of', direction: 'out' }, { relation: 'reads', direction: 'out' }] } + ] + } + }, + defeasible: { + when: { type: 'direct', relation: 'owner' }, + unless: { type: 'chain', steps: [{ relation: 'member_of', direction: 'out' }, { relation: 'reads', direction: 'out' }] } } }; @@ -64,6 +76,8 @@ function mirrorCheck(tuples, kind, src, rel, dst) { if (kind === 'chain') return chainBest; if (kind === 'union') return Math.max(direct, chainBest); if (kind === 'exclusion') return direct * (1 - chainBest); + if (kind === 'intersection') return Math.min(direct, chainBest); + if (kind === 'defeasible') return direct * (1 - chainBest); return 0; }