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,133 @@
|
|
|
1
|
+
// Registered mutant harness for the v4 math-computation WIRING suite — the suite's header documents the
|
|
2
|
+
// five mutants it "must kill"; this file makes that claim executable.
|
|
3
|
+
//
|
|
4
|
+
// F3 NOTE (measured, 2026-xx, `git rev-parse HEAD` at the time of the fix): the header's original M1
|
|
5
|
+
// anchor was STALE - it said "drop 'cli' from DEFAULT_PARAMS.mathEngines (or defaultOn)", but
|
|
6
|
+
// · v4's DEFAULT_PARAMS has no literal engine list (it is `MATH_PARAM_DEFAULTS.mathEngines.slice()`),
|
|
7
|
+
// · the real list is `MATH_ENGINE_ORDER` in `vibe-math-v4/math-engines.js:12`,
|
|
8
|
+
// · and `defaultOn` does not exist anywhere in the tree (a phantom identifier).
|
|
9
|
+
// The header text is corrected accordingly, and the anchor below is the real site. Also measured: a
|
|
10
|
+
// first measurement pointed the seam at the mutated MODULE (`math-engines.js`) and the suite died with
|
|
11
|
+
// "apply is not a function" => `fails=0` was a measurement bug, not a product finding; a mutant must
|
|
12
|
+
// always be fed through the seam pointing at the PLUGIN file.
|
|
13
|
+
//
|
|
14
|
+
// Usage: node tests/math-computation-v4.mutants.mjs
|
|
15
|
+
import { readFileSync, writeFileSync, mkdirSync, copyFileSync, rmSync, readdirSync } from 'node:fs'
|
|
16
|
+
import { execFileSync } from 'node:child_process'
|
|
17
|
+
import { dirname, join } from 'node:path'
|
|
18
|
+
import { tmpdir } from 'node:os'
|
|
19
|
+
import { fileURLToPath } from 'node:url'
|
|
20
|
+
const HERE = dirname(fileURLToPath(import.meta.url))
|
|
21
|
+
const REPO = join(HERE, '..')
|
|
22
|
+
const PRESET = 'vibe-math-v4'
|
|
23
|
+
const MAIN = PRESET + '.js'
|
|
24
|
+
const SUITE = 'tests/math-computation-v4.test.mjs'
|
|
25
|
+
const ENV = 'V4_PLUGIN'
|
|
26
|
+
const CHILD_TIMEOUT_MS = Number(process.env.MUTANT_CHILD_TIMEOUT_MS || 300000)
|
|
27
|
+
const TIMES = []
|
|
28
|
+
const hangs = []
|
|
29
|
+
const skipped = []
|
|
30
|
+
function copyGraph(file, dest) {
|
|
31
|
+
const src = join(REPO, PRESET, file)
|
|
32
|
+
copyFileSync(src, join(dest, file))
|
|
33
|
+
for (const m of readFileSync(src, 'utf8').matchAll(/from\s+'(\.\/[A-Za-z0-9_.-]+\.js)'/g)) {
|
|
34
|
+
const dep = m[1].slice(2)
|
|
35
|
+
if (!readdirSync(dest).includes(dep)) copyGraph(dep, dest)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function runFamily(f) {
|
|
39
|
+
const dest = join(tmpdir(), 'v4math-mut-' + Math.random().toString(36).slice(2, 10))
|
|
40
|
+
mkdirSync(dest, { recursive: true })
|
|
41
|
+
copyGraph(MAIN, dest)
|
|
42
|
+
const target = join(dest, f.editFile || MAIN)
|
|
43
|
+
const before = readFileSync(target, 'utf8')
|
|
44
|
+
let mutated = null
|
|
45
|
+
if (f.fromRe) {
|
|
46
|
+
const re = new RegExp(f.fromRe)
|
|
47
|
+
const m = re.exec(before)
|
|
48
|
+
if (!m) { skipped.push(f.name + ' (regex missed)'); console.error(' SKIP - ' + f.name + ' (regex missed)'); rmSync(dest, { recursive: true, force: true }); return false }
|
|
49
|
+
mutated = before.replace(re, f.to)
|
|
50
|
+
} else {
|
|
51
|
+
const n = before.split(f.from).length - 1
|
|
52
|
+
if (n !== 1) { skipped.push(f.name + ' (anchor x' + n + ')'); console.error(' SKIP - ' + f.name + ' (anchor x' + n + ')'); rmSync(dest, { recursive: true, force: true }); return false }
|
|
53
|
+
mutated = before.replace(f.from, f.to)
|
|
54
|
+
}
|
|
55
|
+
writeFileSync(target, mutated, 'utf8')
|
|
56
|
+
try { execFileSync(process.execPath, ['--check', target], { stdio: 'pipe' }) }
|
|
57
|
+
catch (e) {
|
|
58
|
+
writeFileSync(target, before, 'utf8')
|
|
59
|
+
skipped.push(f.name + ' (mutation did not compile)')
|
|
60
|
+
console.error(' SKIP - ' + f.name + ' (mutation did not compile; restored)')
|
|
61
|
+
rmSync(dest, { recursive: true, force: true })
|
|
62
|
+
return false
|
|
63
|
+
}
|
|
64
|
+
const t0 = Date.now()
|
|
65
|
+
let out = ''
|
|
66
|
+
let code = 0
|
|
67
|
+
let hang = false
|
|
68
|
+
try {
|
|
69
|
+
// ALWAYS point the seam at the PLUGIN file, even when the mutated file is a dependency (measured
|
|
70
|
+
// trap: pointing it at math-engines.js made the suite die with "apply is not a function").
|
|
71
|
+
out = execFileSync(process.execPath, [SUITE], {
|
|
72
|
+
cwd: REPO, encoding: 'utf8', timeout: CHILD_TIMEOUT_MS, killSignal: 'SIGKILL',
|
|
73
|
+
env: Object.assign({}, process.env, { [ENV]: join(dest, MAIN) }),
|
|
74
|
+
})
|
|
75
|
+
} catch (e) {
|
|
76
|
+
if (e && (e.killed || e.signal === 'SIGKILL')) hang = true
|
|
77
|
+
code = (e && e.status) || 1
|
|
78
|
+
out = String((e && e.stdout) || '') + String((e && e.stderr) || '')
|
|
79
|
+
}
|
|
80
|
+
const ms = Date.now() - t0
|
|
81
|
+
TIMES.push([f.name, ms])
|
|
82
|
+
if (hang) hangs.push(f.name + '(' + Math.round(ms / 1000) + 's)')
|
|
83
|
+
const named = out.split(/\r?\n/).filter((l) => /^\s*(FAIL - | {2}- )/.test(l) && f.expect.test(l)).map((l) => l.trim())
|
|
84
|
+
const ok = !hang && code !== 0 && named.length > 0
|
|
85
|
+
console.log((hang ? ' HANG - ' : (ok ? ' ok - ' : ' FAIL - ')) + f.name + ' [' + ms + 'ms]' + (named.length ? ' :: ' + named[0].slice(0, 150) : ' :: no named red (exit=' + code + ')'))
|
|
86
|
+
rmSync(dest, { recursive: true, force: true })
|
|
87
|
+
return ok
|
|
88
|
+
}
|
|
89
|
+
const FAMILIES = [
|
|
90
|
+
{
|
|
91
|
+
// The header's M1, with the CORRECTED site (math-engines.js, not DEFAULT_PARAMS.mathEngines).
|
|
92
|
+
name: 'M1 default-engines-dropped: cli removed from MATH_ENGINE_ORDER',
|
|
93
|
+
editFile: 'math-engines.js',
|
|
94
|
+
from: "export const MATH_ENGINE_ORDER = ['python', 'r', 'octave', 'julia', 'matlab', 'maple', 'wolfram', 'cli']",
|
|
95
|
+
to: "export const MATH_ENGINE_ORDER = ['python', 'r', 'octave', 'julia', 'matlab', 'maple', 'wolfram']",
|
|
96
|
+
expect: /engine=cli runs with the DEFAULT parameters/,
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'M2 typed-still-shell: the availability line is forced to typed+shell',
|
|
100
|
+
from: "mathAvailabilityLine(probe,'zh',params.mathMode)",
|
|
101
|
+
to: "mathAvailabilityLine(probe,'zh','typed+shell')",
|
|
102
|
+
expect: /mathMode=typed injects NO shell-fallback sentence/,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: 'M3 timeout-no-kill: the timeout path no longer terminates the handle',
|
|
106
|
+
fromRe: "killedByUs=true(\\s*)try \\{ if\\(typeof handle\\.terminate==='function'\\) handle\\.terminate\\(\\) \\} catch\\(e\\)\\{ /\\* best effort \\*/ \\}",
|
|
107
|
+
to: 'killedByUs=true$1try { if(false) handle.terminate() } catch(e){ /* best effort */ }',
|
|
108
|
+
expect: /the timeout path really called handle\.terminate\(\)/,
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: 'M4 registration-dropped: the tool is registered under a different name',
|
|
112
|
+
from: 'registerTool(mathToolFace.name, mathToolFace.description',
|
|
113
|
+
to: "registerTool(mathToolFace.name + '_x', mathToolFace.description",
|
|
114
|
+
expect: /math_computation is registered exactly once/,
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
name: 'M5 params-not-normalized: normalizeParam returns the raw value',
|
|
118
|
+
from: 'function normalizeParam(k, v){',
|
|
119
|
+
to: 'function normalizeParam(k, v){ return v // MUTANT: raw',
|
|
120
|
+
expect: /mathTimeoutMs=5 was clamped by the shared normalizer|an unknown mathMode degrades to typed\+shell/,
|
|
121
|
+
},
|
|
122
|
+
]
|
|
123
|
+
let red = 0
|
|
124
|
+
for (const f of FAMILIES) { const ok = runFamily(f); if (ok) red++ }
|
|
125
|
+
const totalMs = TIMES.reduce((a, t) => a + t[1], 0)
|
|
126
|
+
console.log('')
|
|
127
|
+
console.log('mutant families reddening the v4 math-computation wiring suite by name: ' + red + '/' + FAMILIES.length)
|
|
128
|
+
console.log('timings (per family): ' + TIMES.map((t) => String(t[0]).split(':')[0] + '=' + t[1] + 'ms').join(' '))
|
|
129
|
+
console.log('TOTAL WALL TIME (all families + setup): ' + totalMs + 'ms (' + Math.round(totalMs / 1000) + 's)')
|
|
130
|
+
console.log('hangs=[' + hangs.join(' | ') + ']')
|
|
131
|
+
console.log('skipped=[' + skipped.join(' | ') + ']')
|
|
132
|
+
if (red !== FAMILIES.length || skipped.length || hangs.length) process.exit(1)
|
|
133
|
+
console.log('ALL MUTANTS RED AS REQUIRED')
|