dsh-vibe-math 2.7.2 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.en.md +682 -681
- package/README.md +683 -682
- package/cordis.patch.yml +112 -16
- package/docs/AUDIT-CHECKLIST.md +755 -518
- package/docs/COMPAT-AUDIT-ROUND2.md +354 -328
- package/docs/COMPAT-AUDIT-ROUND3.md +154 -154
- package/docs/audit-methodology.md +93 -0
- package/docs/final-paper.md +172 -172
- package/docs/formal-verification.md +613 -588
- package/docs/generate_framework_diagram_v2.py +114 -114
- package/docs/generate_framework_diagram_v3.py +127 -127
- package/docs/math-computation.md +195 -187
- package/docs/parameter-schema.md +37 -0
- package/docs/release-notes/README.en.md +2 -0
- package/docs/release-notes/README.md +2 -0
- package/docs/release-notes/RELEASE-NOTES-2.0.22.md +112 -112
- package/docs/release-notes/RELEASE-NOTES-2.1.0.md +143 -143
- package/docs/release-notes/RELEASE-NOTES-2.2.0.md +266 -266
- package/docs/release-notes/RELEASE-NOTES-2.2.1.md +43 -43
- package/docs/release-notes/RELEASE-NOTES-2.2.2.md +88 -88
- package/docs/release-notes/RELEASE-NOTES-2.3.0.md +207 -207
- package/docs/release-notes/RELEASE-NOTES-2.3.1.md +134 -134
- package/docs/release-notes/RELEASE-NOTES-2.3.10.md +105 -105
- package/docs/release-notes/RELEASE-NOTES-2.3.11.md +57 -57
- package/docs/release-notes/RELEASE-NOTES-2.3.12.md +80 -80
- package/docs/release-notes/RELEASE-NOTES-2.3.2.md +145 -145
- package/docs/release-notes/RELEASE-NOTES-2.3.3.md +115 -115
- package/docs/release-notes/RELEASE-NOTES-2.3.4.md +69 -69
- package/docs/release-notes/RELEASE-NOTES-2.3.5.md +63 -63
- package/docs/release-notes/RELEASE-NOTES-2.3.6.md +66 -66
- package/docs/release-notes/RELEASE-NOTES-2.3.7.md +59 -59
- package/docs/release-notes/RELEASE-NOTES-2.3.8.md +45 -45
- package/docs/release-notes/RELEASE-NOTES-2.3.9.md +70 -70
- package/docs/release-notes/RELEASE-NOTES-2.7.2.en.md +2 -2
- package/docs/release-notes/RELEASE-NOTES-2.7.2.md +3 -3
- package/docs/release-notes/RELEASE-NOTES-2.7.3.en.md +67 -0
- package/docs/release-notes/RELEASE-NOTES-2.7.3.md +67 -0
- package/docs/release-notes/RELEASE-NOTES-2.8.0.en.md +65 -0
- package/docs/release-notes/RELEASE-NOTES-2.8.0.md +65 -0
- package/docs/release-notes/TEMPLATE.md +6 -0
- package/docs/release-playbook.md +103 -0
- package/docs/slv-playbook.md +117 -0
- package/docs/status-report-fields.md +167 -0
- package/docs/test-timing.md +158 -154
- package/docs//346/236/266/346/236/204/345/233/276.md +77 -77
- package/installer.js +793 -783
- package/package.json +260 -203
- package/prompt-corpus-persona/persona-corpus.json +9 -9
- package/prompt-corpus-persona/persona-corpus.md +225 -33
- package/prompt-corpus-v2/formal-verify-v2.json +295 -115
- package/prompt-corpus-v2/formal-verify-v2.md +2290 -282
- package/prompt-corpus-v3/formal-verify-v3.json +112 -112
- package/prompt-corpus-v3/formal-verify-v3.md +227 -143
- package/prompt-corpus-v4/formal-verify-v4.json +18 -18
- package/prompt-corpus-v4/formal-verify-v4.md +49 -44
- package/prompt-corpus-v5/prompt-corpus-v5.json +82 -82
- package/prompt-corpus-v5/prompt-corpus-v5.md +573 -207
- package/scripts/clean-temp.mjs +234 -0
- package/scripts/update-doc-counts.mjs +71 -0
- package/tests/audit-artifact-docs.mjs +72 -0
- package/tests/audit-artifact-docs.mutants.mjs +58 -0
- package/tests/audit-engine-faces.mjs +298 -0
- package/tests/audit-formal-sensitivity.mjs +345 -342
- package/tests/audit-installer-assertions.mutants.mjs +63 -0
- package/tests/audit-installer-compat.test.mjs +256 -208
- package/tests/audit-installer-policy.test.mjs +41 -8
- package/tests/audit-math-computation-contract.mjs +64 -8
- package/tests/audit-math-computation-contract.mutants.mjs +106 -0
- package/tests/audit-math-computation-parity.mjs +164 -3
- package/tests/audit-math-computation-sensitivity.mjs +5 -3
- package/tests/audit-package-membership.mjs +57 -0
- package/tests/audit-package-membership.mutants.mjs +28 -0
- package/tests/audit-participant-set-parity.mjs +160 -0
- package/tests/audit-path-discipline.mjs +83 -0
- package/tests/audit-path-discipline.mutants.mjs +51 -0
- package/tests/audit-persona-sensitivity.mjs +323 -309
- package/tests/audit-persona-surface.mutants.mjs +69 -0
- package/tests/audit-persona-surface.test.mjs +431 -390
- package/tests/audit-prompt-duplication.mjs +143 -0
- package/tests/audit-prompt-duplication.mutants.mjs +51 -0
- package/tests/audit-prompt-invariants.mjs +589 -508
- package/tests/audit-readme-bilingual.test.mjs +152 -0
- package/tests/audit-readme-counts.mjs +95 -0
- package/tests/audit-readme-counts.mutants.mjs +52 -0
- package/tests/audit-registration.mjs +78 -0
- package/tests/audit-spec-traceability.mjs +193 -193
- package/tests/audit-status-report-fields.mjs +172 -0
- package/tests/audit-status-report-fields.mutants.mjs +64 -0
- package/tests/audit-v3-registration-parity.mjs +156 -0
- package/tests/audit-v5-integrity.mjs +795 -508
- package/tests/audit-v5-lean-abstention.mjs +392 -0
- package/tests/audit-v5-lean-abstention.mutants.mjs +106 -0
- package/tests/audit-v5-prompt-duplication.mjs +88 -0
- package/tests/audit-v5-prompt-duplication.mutants.mjs +34 -0
- package/tests/audit-v5-sensitivity.mjs +433 -427
- package/tests/e2e-identity-a6.mutants.mjs +65 -0
- package/tests/e2e-v5-round2.test.mjs +2453 -1981
- package/tests/formal-verify-v2.test.mjs +1778 -1724
- package/tests/formal-verify-v3.mutants.mjs +117 -0
- package/tests/formal-verify-v3.test.mjs +1724 -1671
- package/tests/formal-verify-v4.mutants.mjs +152 -0
- package/tests/formal-verify-v4.test.mjs +2114 -1574
- package/tests/formal-verify-v5.test.mjs +790 -724
- package/tests/helpers/doc-counts-format.mjs +41 -0
- package/tests/helpers/math-computation-fake-seam.mjs +4 -0
- package/tests/math-computation-a1.mutants.mjs +72 -0
- package/tests/math-computation-archive-rerun.mutants.mjs +65 -0
- package/tests/math-computation-discovery.mutants.mjs +76 -0
- package/tests/math-computation-shared.test.mjs +392 -6
- package/tests/math-computation-v2.test.mjs +779 -0
- package/tests/math-computation-v3.test.mjs +771 -0
- package/tests/math-computation-v4.mutants.mjs +133 -0
- package/tests/math-computation-v4.test.mjs +739 -0
- package/tests/prompt-v5-integrity.test.mjs +1291 -1280
- package/tests/run-tests.mjs +393 -202
- package/tests/run-tests.mutants.mjs +70 -0
- package/tests/selfdrive-v5.mjs +560 -508
- package/tests/selfdrive-v5.mutants.mjs +132 -0
- package/tests/temp-hygiene.mutants.mjs +80 -0
- package/tests/v2-fix-probes.mutants.mjs +104 -0
- package/tests/v2-fix-probes.test.mjs +1040 -0
- package/tests/v2-list-agents-and-next-step.mutants.mjs +106 -0
- package/tests/v2v3-interrupt.mutants.mjs +111 -0
- package/tests/v3-fix-probes.mutants.mjs +99 -0
- package/tests/v3-fix-probes.test.mjs +892 -0
- package/tests/v4-final-paper.mutants.mjs +108 -0
- package/tests/v5-institute-fixes.mutants.mjs +218 -0
- package/vibe-math-v2/agent.cordis.yml +378 -322
- package/vibe-math-v2/math-computation.js +144 -53
- package/vibe-math-v2/math-engines.js +12 -12
- package/vibe-math-v2/preset.yml +2 -2
- package/vibe-math-v2/v2/347/232/204/351/242/235/345/244/226/350/246/201/346/261/202.txt +21 -21
- package/vibe-math-v2/vibe-math-v2.js +5097 -4755
- package/vibe-math-v2//345/256/236/347/216/260/346/226/271/346/241/210.md +491 -487
- package/vibe-math-v3/agent.cordis.yml +422 -356
- package/vibe-math-v3/math-computation.js +144 -53
- package/vibe-math-v3/math-engines.js +12 -12
- package/vibe-math-v3/preset.yml +2 -2
- package/vibe-math-v3/vibe-math-v3.js +6235 -5873
- package/vibe-math-v3//345/256/236/347/216/260/346/226/271/346/241/210.md +649 -649
- package/vibe-math-v4/agent.cordis.yml +438 -402
- package/vibe-math-v4/math-computation.js +144 -53
- package/vibe-math-v4/math-engines.js +12 -12
- package/vibe-math-v4/preset.yml +2 -2
- package/vibe-math-v4/vibe-math-v4.js +4490 -4269
- package/vibe-math-v4//345/256/236/347/216/260/346/226/271/346/241/210.md +1015 -1013
- package/vibe-math-v5/agent.cordis.yml +46 -12
- package/vibe-math-v5/math-computation.js +144 -53
- package/vibe-math-v5/math-engines.js +12 -12
- package/vibe-math-v5/vibe-math-v5.js +1266 -229
- package/vibe-math-v5//345/256/236/347/216/260/346/226/271/346/241/210.md +1728 -1660
- package/vibe-math-v5//346/236/266/346/236/204/345/233/276.md +693 -693
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// Registered mutant harness for the v4 formal-verify suite — the suite carries its own proof.
|
|
2
|
+
// Mirrors tests/v5-institute-fixes.mutants.mjs: each family is a SINGLE content-anchored mutation of the
|
|
3
|
+
// v4 preset (no line numbers), the suite runs through the V4_PLUGIN seam, child runs are bounded (a
|
|
4
|
+
// timeout is a HANG, never a pass), and skipped families are printed and counted.
|
|
5
|
+
// Exit criterion: every family reddens BY NAME; ALL MUTANTS RED AS REQUIRED + exit 0 only then.
|
|
6
|
+
// Run: node tests/formal-verify-v4.mutants.mjs
|
|
7
|
+
import { readFileSync, writeFileSync, mkdirSync, copyFileSync, rmSync, readdirSync } from 'node:fs'
|
|
8
|
+
import { execFileSync } from 'node:child_process'
|
|
9
|
+
import { dirname, join } from 'node:path'
|
|
10
|
+
import { tmpdir } from 'node:os'
|
|
11
|
+
import { fileURLToPath } from 'node:url'
|
|
12
|
+
const HERE = dirname(fileURLToPath(import.meta.url))
|
|
13
|
+
const REPO = join(HERE, '..')
|
|
14
|
+
const PRESET = 'vibe-math-v4'
|
|
15
|
+
const MAIN = PRESET + '.js'
|
|
16
|
+
const SUITE = 'tests/formal-verify-v4.test.mjs'
|
|
17
|
+
const ENV = 'V4_PLUGIN'
|
|
18
|
+
// The formal-verify suite is long, so the default child budget is generous; MUTANT_CHILD_TIMEOUT_MS
|
|
19
|
+
// overrides it.
|
|
20
|
+
const CHILD_TIMEOUT_MS = Number(process.env.MUTANT_CHILD_TIMEOUT_MS || 300000)
|
|
21
|
+
const TIMES = []
|
|
22
|
+
const hangs = []
|
|
23
|
+
const skipped = []
|
|
24
|
+
function copyGraph(file, dest) {
|
|
25
|
+
const src = join(REPO, PRESET, file)
|
|
26
|
+
copyFileSync(src, join(dest, file))
|
|
27
|
+
for (const m of readFileSync(src, 'utf8').matchAll(/from\s+'(\.\/[A-Za-z0-9_.-]+\.js)'/g)) {
|
|
28
|
+
const dep = m[1].slice(2)
|
|
29
|
+
if (!readdirSync(dest).includes(dep)) copyGraph(dep, dest)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function runFamily(f) {
|
|
33
|
+
const dest = join(tmpdir(), 'v4fv-mut-' + Math.random().toString(36).slice(2, 10))
|
|
34
|
+
mkdirSync(dest, { recursive: true })
|
|
35
|
+
copyGraph(MAIN, dest)
|
|
36
|
+
const target = join(dest, f.editFile || MAIN)
|
|
37
|
+
const before = readFileSync(target, 'utf8')
|
|
38
|
+
const n = before.split(f.from).length - 1
|
|
39
|
+
const okCount = f.lastOnly || f.all ? n >= 1 : n === 1
|
|
40
|
+
if (!okCount) {
|
|
41
|
+
skipped.push(f.name + ' (anchor x' + n + ')')
|
|
42
|
+
console.error(' SKIP - ' + f.name + ' (anchor x' + n + ')')
|
|
43
|
+
rmSync(dest, { recursive: true, force: true })
|
|
44
|
+
return false
|
|
45
|
+
}
|
|
46
|
+
const mutated = f.lastOnly
|
|
47
|
+
? (() => { const i = before.lastIndexOf(f.from); return before.slice(0, i) + f.to + before.slice(i + f.from.length) })()
|
|
48
|
+
: before.split(f.from).join(f.to)
|
|
49
|
+
writeFileSync(target, mutated, 'utf8')
|
|
50
|
+
try { execFileSync(process.execPath, ['--check', target], { stdio: 'pipe' }) }
|
|
51
|
+
catch (e) {
|
|
52
|
+
writeFileSync(target, before, 'utf8')
|
|
53
|
+
skipped.push(f.name + ' (mutation did not compile)')
|
|
54
|
+
console.error(' SKIP - ' + f.name + ' (mutation did not compile; restored)')
|
|
55
|
+
rmSync(dest, { recursive: true, force: true })
|
|
56
|
+
return false
|
|
57
|
+
}
|
|
58
|
+
const t0 = Date.now()
|
|
59
|
+
let out = ''
|
|
60
|
+
let code = 0
|
|
61
|
+
let hang = false
|
|
62
|
+
try {
|
|
63
|
+
out = execFileSync(process.execPath, [SUITE], {
|
|
64
|
+
cwd: REPO, encoding: 'utf8', timeout: CHILD_TIMEOUT_MS, killSignal: 'SIGKILL',
|
|
65
|
+
env: Object.assign({}, process.env, { [ENV]: join(dest, MAIN) }),
|
|
66
|
+
})
|
|
67
|
+
} catch (e) {
|
|
68
|
+
if (e && (e.killed || e.signal === 'SIGKILL')) hang = true
|
|
69
|
+
code = (e && e.status) || 1
|
|
70
|
+
out = String((e && e.stdout) || '') + String((e && e.stderr) || '')
|
|
71
|
+
}
|
|
72
|
+
const ms = Date.now() - t0
|
|
73
|
+
TIMES.push([f.name, ms])
|
|
74
|
+
if (hang) hangs.push(f.name + '(' + Math.round(ms / 1000) + 's)')
|
|
75
|
+
const named = out.split(/\r?\n/).filter((l) => /^\s*(FAIL - | {2}- )/.test(l) && f.expect.test(l)).map((l) => l.trim())
|
|
76
|
+
const ok = !hang && code !== 0 && named.length > 0
|
|
77
|
+
console.log((hang ? ' HANG - ' : (ok ? ' ok - ' : ' FAIL - ')) + f.name + ' [' + ms + 'ms]' + (named.length ? ' :: ' + named[0].slice(0, 150) : ' :: no named red (exit=' + code + ')'))
|
|
78
|
+
rmSync(dest, { recursive: true, force: true })
|
|
79
|
+
return ok
|
|
80
|
+
}
|
|
81
|
+
const FAMILIES = [
|
|
82
|
+
{
|
|
83
|
+
// R10-F1: reading `allow` (a permission LIST) as a fence root — this is the branch the no-op path
|
|
84
|
+
// must keep dead, and the red proves case 1b actually reaches the helper with that shape.
|
|
85
|
+
name: 'F-5/1b: treat `allow` as a fence root',
|
|
86
|
+
from: ' else if(p.config && p.config.workspaceRoot !== undefined) pick = p.config.workspaceRoot',
|
|
87
|
+
to: ' else if(p.config && p.config.workspaceRoot !== undefined) pick = p.config.workspaceRoot\n else if(p.allow !== undefined) pick = p.allow',
|
|
88
|
+
expect: /F-5\/1b .*produces NO warning/,
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
// the whole comparison removed: a real drift goes unnamed
|
|
92
|
+
name: 'F-5/ii: the drift comparison is never called',
|
|
93
|
+
from: 'fenceRootDriftNote(p);',
|
|
94
|
+
to: 'void 0;',
|
|
95
|
+
expect: /F-5\/ii the drift is NAMED exactly once/,
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
// containment disabled: agreeing/ancestor roots would warn (the per-session false alarm)
|
|
99
|
+
name: 'F-5/iii+iv: the containment predicate is disabled (always warn)',
|
|
100
|
+
from: ' if(contained) return',
|
|
101
|
+
to: ' if(false) return',
|
|
102
|
+
expect: /F-5\/iv an AGREEING resolved root produces NO warning/,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
// one-shot dropped: the warning repeats on every policy resolution
|
|
106
|
+
name: 'F-5/ii: the one-shot is dropped',
|
|
107
|
+
from: ' if(!warnedFenceDrift){',
|
|
108
|
+
to: ' if(true){',
|
|
109
|
+
expect: /F-5\/ii the drift is NAMED exactly once .*matched=2/,
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
// F-6 site 4: the swallowed compaction failure becomes silent again
|
|
113
|
+
name: 'N15/4: the compaction-failure warning is silenced',
|
|
114
|
+
from: '} catch(e){ if(!warnedCompaction){ warnedCompaction=true;',
|
|
115
|
+
to: '} catch(e){ if(false){ warnedCompaction=true;',
|
|
116
|
+
expect: /N15\/4 realCompact: a failed compaction is NAMED exactly once/,
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
// F-5/1c: the `.` clause of the guard is dropped, so an UNKNOWN session cwd (workspaceRoot() ===
|
|
120
|
+
// ".") is reported as drift even though it is constructively unknown, not drifted.
|
|
121
|
+
name: 'F-5/1c: an unknown session cwd is warned about',
|
|
122
|
+
from: " if(!session || session === '.') return",
|
|
123
|
+
to: ' if(!session) return',
|
|
124
|
+
expect: /F-5\/1c an UNKNOWN session cwd stays SILENT/,
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
// F6-v4: the `.current` marker write fails silently again (its guard is removed).
|
|
128
|
+
name: 'N18: a failed current-project marker write is silent again',
|
|
129
|
+
from: 'if(ok===false && !warnedCurrentProject){',
|
|
130
|
+
to: 'if(false){',
|
|
131
|
+
expect: /N18 the failed .*write is NAMED exactly once/,
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
// ③: the in-function naming is removed again, so a failed index write is silent for all six
|
|
135
|
+
// callers (the measured pre-fix behaviour).
|
|
136
|
+
name: 'N20-3b: a failed index write is silent again',
|
|
137
|
+
from: 'if((_idxLibOk === false || _idxProvedOk === false) && !warnedIndexRebuild){',
|
|
138
|
+
to: 'if(false){',
|
|
139
|
+
expect: /N20-3b a failed index write is NAMED exactly once/
|
|
140
|
+
},
|
|
141
|
+
]
|
|
142
|
+
let red = 0
|
|
143
|
+
for (const f of FAMILIES) { const ok = runFamily(f); if (ok) red++ }
|
|
144
|
+
console.log('')
|
|
145
|
+
console.log('mutant families reddening the v4 formal-verify suite by name: ' + red + '/' + FAMILIES.length)
|
|
146
|
+
console.log('timings: ' + TIMES.map((t) => String(t[0]).split(':')[0] + '=' + t[1] + 'ms').join(' '))
|
|
147
|
+
const totalMs = TIMES.reduce((a, t) => a + t[1], 0)
|
|
148
|
+
console.log('TOTAL WALL TIME (all families + setup): ' + totalMs + 'ms (' + Math.round(totalMs / 1000) + 's)')
|
|
149
|
+
console.log('hangs=[' + hangs.join(' | ') + ']')
|
|
150
|
+
console.log('skipped=[' + skipped.join(' | ') + ']')
|
|
151
|
+
if (red !== FAMILIES.length || skipped.length || hangs.length) process.exit(1)
|
|
152
|
+
console.log('ALL MUTANTS RED AS REQUIRED')
|