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,117 @@
|
|
|
1
|
+
// Registered mutant harness for the v3 formal-verify suite — the suite carries its own proof.
|
|
2
|
+
// Mirrors tests/formal-verify-v4.mutants.mjs and tests/v5-institute-fixes.mutants.mjs: each family is a
|
|
3
|
+
// SINGLE content-anchored mutation of the v3 preset (no line numbers), the suite runs through the
|
|
4
|
+
// V3_PLUGIN seam, child runs are bounded (a timeout is a HANG, never a pass), and skipped families are
|
|
5
|
+
// printed and counted. Exit criterion: every family reddens BY NAME; ALL MUTANTS RED AS REQUIRED.
|
|
6
|
+
// Run: node tests/formal-verify-v3.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-v3'
|
|
15
|
+
const MAIN = PRESET + '.js'
|
|
16
|
+
const SUITE = 'tests/formal-verify-v3.test.mjs'
|
|
17
|
+
const ENV = 'V3_PLUGIN'
|
|
18
|
+
// Measured: the v3 formal-verify suite is ~40 s per child run; MUTANT_CHILD_TIMEOUT_MS overrides it.
|
|
19
|
+
const CHILD_TIMEOUT_MS = Number(process.env.MUTANT_CHILD_TIMEOUT_MS || 300000)
|
|
20
|
+
const TIMES = []
|
|
21
|
+
const hangs = []
|
|
22
|
+
const skipped = []
|
|
23
|
+
function copyGraph(file, dest) {
|
|
24
|
+
const src = join(REPO, PRESET, file)
|
|
25
|
+
copyFileSync(src, join(dest, file))
|
|
26
|
+
for (const m of readFileSync(src, 'utf8').matchAll(/from\s+'(\.\/[A-Za-z0-9_.-]+\.js)'/g)) {
|
|
27
|
+
const dep = m[1].slice(2)
|
|
28
|
+
if (!readdirSync(dest).includes(dep)) copyGraph(dep, dest)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function runFamily(f) {
|
|
32
|
+
const dest = join(tmpdir(), 'v3fv-mut-' + Math.random().toString(36).slice(2, 10))
|
|
33
|
+
mkdirSync(dest, { recursive: true })
|
|
34
|
+
copyGraph(MAIN, dest)
|
|
35
|
+
const target = join(dest, f.editFile || MAIN)
|
|
36
|
+
const before = readFileSync(target, 'utf8')
|
|
37
|
+
const n = before.split(f.from).length - 1
|
|
38
|
+
const okCount = f.lastOnly || f.all ? n >= 1 : n === 1
|
|
39
|
+
if (!okCount) {
|
|
40
|
+
skipped.push(f.name + ' (anchor x' + n + ')')
|
|
41
|
+
console.error(' SKIP - ' + f.name + ' (anchor x' + n + ')')
|
|
42
|
+
rmSync(dest, { recursive: true, force: true })
|
|
43
|
+
return false
|
|
44
|
+
}
|
|
45
|
+
const mutated = before.split(f.from).join(f.to)
|
|
46
|
+
writeFileSync(target, mutated, 'utf8')
|
|
47
|
+
try { execFileSync(process.execPath, ['--check', target], { stdio: 'pipe' }) }
|
|
48
|
+
catch (e) {
|
|
49
|
+
writeFileSync(target, before, 'utf8')
|
|
50
|
+
skipped.push(f.name + ' (mutation did not compile)')
|
|
51
|
+
console.error(' SKIP - ' + f.name + ' (mutation did not compile; restored)')
|
|
52
|
+
rmSync(dest, { recursive: true, force: true })
|
|
53
|
+
return false
|
|
54
|
+
}
|
|
55
|
+
const t0 = Date.now()
|
|
56
|
+
let out = ''
|
|
57
|
+
let code = 0
|
|
58
|
+
let hang = false
|
|
59
|
+
try {
|
|
60
|
+
out = execFileSync(process.execPath, [SUITE], {
|
|
61
|
+
cwd: REPO, encoding: 'utf8', timeout: CHILD_TIMEOUT_MS, killSignal: 'SIGKILL',
|
|
62
|
+
env: Object.assign({}, process.env, { [ENV]: join(dest, MAIN) }),
|
|
63
|
+
})
|
|
64
|
+
} catch (e) {
|
|
65
|
+
if (e && (e.killed || e.signal === 'SIGKILL')) hang = true
|
|
66
|
+
code = (e && e.status) || 1
|
|
67
|
+
out = String((e && e.stdout) || '') + String((e && e.stderr) || '')
|
|
68
|
+
}
|
|
69
|
+
const ms = Date.now() - t0
|
|
70
|
+
TIMES.push([f.name, ms])
|
|
71
|
+
if (hang) hangs.push(f.name + '(' + Math.round(ms / 1000) + 's)')
|
|
72
|
+
const named = out.split(/\r?\n/).filter((l) => /^\s*(FAIL - | {2}- )/.test(l) && f.expect.test(l)).map((l) => l.trim())
|
|
73
|
+
const ok = !hang && code !== 0 && named.length > 0
|
|
74
|
+
console.log((hang ? ' HANG - ' : (ok ? ' ok - ' : ' FAIL - ')) + f.name + ' [' + ms + 'ms]' + (named.length ? ' :: ' + named[0].slice(0, 150) : ' :: no named red (exit=' + code + ')'))
|
|
75
|
+
rmSync(dest, { recursive: true, force: true })
|
|
76
|
+
return ok
|
|
77
|
+
}
|
|
78
|
+
// MEASURED BOUNDARY (V3-G2): at this revision NO strictly count-preserving mutant exists for the
|
|
79
|
+
// re-eligible-SLOT-set assertion. Reason (measured in-product): a re-verification creates a FRESH
|
|
80
|
+
// task with `children: []` and `round: 1` (vibe-math-v3.js:2164) and the slot index comes from
|
|
81
|
+
// `const index = t.children.length` (:2172), so any fixed index offset shifts round one too and the
|
|
82
|
+
// two slot sets stay equal. The only mutant that reddens it therefore also changes the COUNT - it is
|
|
83
|
+
// labelled NOT COUNT-PRESERVING below, and it is landed because the assertion itself is the semantic
|
|
84
|
+
// unit (a re-verification that re-armed different slots satisfies the old count).
|
|
85
|
+
//
|
|
86
|
+
// TWO CANDIDATE MUTANTS WERE THEN MEASURED - BOTH REJECTED (so no V3-G2 family is shipped):
|
|
87
|
+
// (i) the ruled shape (children: [] inherits the previous children) is INERT: the concluded verify
|
|
88
|
+
// task is already deleted when the new one is built, so `tasks['verify:'+rId]` is undefined and
|
|
89
|
+
// the expression degrades to `[]` => the suite ran to exit 0 with NO named red (a mutant that
|
|
90
|
+
// changes nothing proves nothing);
|
|
91
|
+
// (ii) the broad form (verifier backfill disabled entirely) made the suite exceed the 300 s child
|
|
92
|
+
// cap => classified as a HANG, which is not a valid red either.
|
|
93
|
+
// => RECORDED BOUNDARY: at this revision the re-eligible-SLOT-set assertion ships WITHOUT a
|
|
94
|
+
// discriminating mutant (measured, not assumed). The assertion itself is landed and green.
|
|
95
|
+
|
|
96
|
+
const FAMILIES = [
|
|
97
|
+
{
|
|
98
|
+
// V3-G1: every verifier spawn for one object is stamped with the SAME slot index, so two "independent
|
|
99
|
+
// reviews" are really two copies of one slot. The fired-verifier COUNT stays 2 (the old assertion
|
|
100
|
+
// passes); the distinct-slot assertion is what catches it.
|
|
101
|
+
name: 'V3-G1: every review is stamped with the same slot index (count still 2)',
|
|
102
|
+
from: "'verifier:' + t.rId + ':' + index",
|
|
103
|
+
to: "'verifier:' + t.rId + ':0'",
|
|
104
|
+
expect: /V3-G1 .*DISTINCT verifier slots/,
|
|
105
|
+
},
|
|
106
|
+
]
|
|
107
|
+
let red = 0
|
|
108
|
+
for (const f of FAMILIES) { const ok = runFamily(f); if (ok) red++ }
|
|
109
|
+
const totalMs = TIMES.reduce((a, t) => a + t[1], 0)
|
|
110
|
+
console.log('')
|
|
111
|
+
console.log('mutant families reddening the v3 formal-verify suite by name: ' + red + '/' + FAMILIES.length)
|
|
112
|
+
console.log('timings (per family): ' + TIMES.map((t) => String(t[0]).split(':')[0] + '=' + t[1] + 'ms').join(' '))
|
|
113
|
+
console.log('TOTAL WALL TIME (all families + setup): ' + totalMs + 'ms (' + Math.round(totalMs / 1000) + 's)')
|
|
114
|
+
console.log('hangs=[' + hangs.join(' | ') + ']')
|
|
115
|
+
console.log('skipped=[' + skipped.join(' | ') + ']')
|
|
116
|
+
if (red !== FAMILIES.length || skipped.length || hangs.length) process.exit(1)
|
|
117
|
+
console.log('ALL MUTANTS RED AS REQUIRED')
|