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.
Files changed (153) hide show
  1. package/LICENSE +21 -21
  2. package/README.en.md +682 -681
  3. package/README.md +683 -682
  4. package/cordis.patch.yml +112 -16
  5. package/docs/AUDIT-CHECKLIST.md +755 -518
  6. package/docs/COMPAT-AUDIT-ROUND2.md +354 -328
  7. package/docs/COMPAT-AUDIT-ROUND3.md +154 -154
  8. package/docs/audit-methodology.md +93 -0
  9. package/docs/final-paper.md +172 -172
  10. package/docs/formal-verification.md +613 -588
  11. package/docs/generate_framework_diagram_v2.py +114 -114
  12. package/docs/generate_framework_diagram_v3.py +127 -127
  13. package/docs/math-computation.md +195 -187
  14. package/docs/parameter-schema.md +37 -0
  15. package/docs/release-notes/README.en.md +2 -0
  16. package/docs/release-notes/README.md +2 -0
  17. package/docs/release-notes/RELEASE-NOTES-2.0.22.md +112 -112
  18. package/docs/release-notes/RELEASE-NOTES-2.1.0.md +143 -143
  19. package/docs/release-notes/RELEASE-NOTES-2.2.0.md +266 -266
  20. package/docs/release-notes/RELEASE-NOTES-2.2.1.md +43 -43
  21. package/docs/release-notes/RELEASE-NOTES-2.2.2.md +88 -88
  22. package/docs/release-notes/RELEASE-NOTES-2.3.0.md +207 -207
  23. package/docs/release-notes/RELEASE-NOTES-2.3.1.md +134 -134
  24. package/docs/release-notes/RELEASE-NOTES-2.3.10.md +105 -105
  25. package/docs/release-notes/RELEASE-NOTES-2.3.11.md +57 -57
  26. package/docs/release-notes/RELEASE-NOTES-2.3.12.md +80 -80
  27. package/docs/release-notes/RELEASE-NOTES-2.3.2.md +145 -145
  28. package/docs/release-notes/RELEASE-NOTES-2.3.3.md +115 -115
  29. package/docs/release-notes/RELEASE-NOTES-2.3.4.md +69 -69
  30. package/docs/release-notes/RELEASE-NOTES-2.3.5.md +63 -63
  31. package/docs/release-notes/RELEASE-NOTES-2.3.6.md +66 -66
  32. package/docs/release-notes/RELEASE-NOTES-2.3.7.md +59 -59
  33. package/docs/release-notes/RELEASE-NOTES-2.3.8.md +45 -45
  34. package/docs/release-notes/RELEASE-NOTES-2.3.9.md +70 -70
  35. package/docs/release-notes/RELEASE-NOTES-2.7.2.en.md +2 -2
  36. package/docs/release-notes/RELEASE-NOTES-2.7.2.md +3 -3
  37. package/docs/release-notes/RELEASE-NOTES-2.7.3.en.md +67 -0
  38. package/docs/release-notes/RELEASE-NOTES-2.7.3.md +67 -0
  39. package/docs/release-notes/RELEASE-NOTES-2.8.0.en.md +65 -0
  40. package/docs/release-notes/RELEASE-NOTES-2.8.0.md +65 -0
  41. package/docs/release-notes/TEMPLATE.md +6 -0
  42. package/docs/release-playbook.md +103 -0
  43. package/docs/slv-playbook.md +117 -0
  44. package/docs/status-report-fields.md +167 -0
  45. package/docs/test-timing.md +158 -154
  46. package/docs//346/236/266/346/236/204/345/233/276.md +77 -77
  47. package/installer.js +793 -783
  48. package/package.json +260 -203
  49. package/prompt-corpus-persona/persona-corpus.json +9 -9
  50. package/prompt-corpus-persona/persona-corpus.md +225 -33
  51. package/prompt-corpus-v2/formal-verify-v2.json +295 -115
  52. package/prompt-corpus-v2/formal-verify-v2.md +2290 -282
  53. package/prompt-corpus-v3/formal-verify-v3.json +112 -112
  54. package/prompt-corpus-v3/formal-verify-v3.md +227 -143
  55. package/prompt-corpus-v4/formal-verify-v4.json +18 -18
  56. package/prompt-corpus-v4/formal-verify-v4.md +49 -44
  57. package/prompt-corpus-v5/prompt-corpus-v5.json +82 -82
  58. package/prompt-corpus-v5/prompt-corpus-v5.md +573 -207
  59. package/scripts/clean-temp.mjs +234 -0
  60. package/scripts/update-doc-counts.mjs +71 -0
  61. package/tests/audit-artifact-docs.mjs +72 -0
  62. package/tests/audit-artifact-docs.mutants.mjs +58 -0
  63. package/tests/audit-engine-faces.mjs +298 -0
  64. package/tests/audit-formal-sensitivity.mjs +345 -342
  65. package/tests/audit-installer-assertions.mutants.mjs +63 -0
  66. package/tests/audit-installer-compat.test.mjs +256 -208
  67. package/tests/audit-installer-policy.test.mjs +41 -8
  68. package/tests/audit-math-computation-contract.mjs +64 -8
  69. package/tests/audit-math-computation-contract.mutants.mjs +106 -0
  70. package/tests/audit-math-computation-parity.mjs +164 -3
  71. package/tests/audit-math-computation-sensitivity.mjs +5 -3
  72. package/tests/audit-package-membership.mjs +57 -0
  73. package/tests/audit-package-membership.mutants.mjs +28 -0
  74. package/tests/audit-participant-set-parity.mjs +160 -0
  75. package/tests/audit-path-discipline.mjs +83 -0
  76. package/tests/audit-path-discipline.mutants.mjs +51 -0
  77. package/tests/audit-persona-sensitivity.mjs +323 -309
  78. package/tests/audit-persona-surface.mutants.mjs +69 -0
  79. package/tests/audit-persona-surface.test.mjs +431 -390
  80. package/tests/audit-prompt-duplication.mjs +143 -0
  81. package/tests/audit-prompt-duplication.mutants.mjs +51 -0
  82. package/tests/audit-prompt-invariants.mjs +589 -508
  83. package/tests/audit-readme-bilingual.test.mjs +152 -0
  84. package/tests/audit-readme-counts.mjs +95 -0
  85. package/tests/audit-readme-counts.mutants.mjs +52 -0
  86. package/tests/audit-registration.mjs +78 -0
  87. package/tests/audit-spec-traceability.mjs +193 -193
  88. package/tests/audit-status-report-fields.mjs +172 -0
  89. package/tests/audit-status-report-fields.mutants.mjs +64 -0
  90. package/tests/audit-v3-registration-parity.mjs +156 -0
  91. package/tests/audit-v5-integrity.mjs +795 -508
  92. package/tests/audit-v5-lean-abstention.mjs +392 -0
  93. package/tests/audit-v5-lean-abstention.mutants.mjs +106 -0
  94. package/tests/audit-v5-prompt-duplication.mjs +88 -0
  95. package/tests/audit-v5-prompt-duplication.mutants.mjs +34 -0
  96. package/tests/audit-v5-sensitivity.mjs +433 -427
  97. package/tests/e2e-identity-a6.mutants.mjs +65 -0
  98. package/tests/e2e-v5-round2.test.mjs +2453 -1981
  99. package/tests/formal-verify-v2.test.mjs +1778 -1724
  100. package/tests/formal-verify-v3.mutants.mjs +117 -0
  101. package/tests/formal-verify-v3.test.mjs +1724 -1671
  102. package/tests/formal-verify-v4.mutants.mjs +152 -0
  103. package/tests/formal-verify-v4.test.mjs +2114 -1574
  104. package/tests/formal-verify-v5.test.mjs +790 -724
  105. package/tests/helpers/doc-counts-format.mjs +41 -0
  106. package/tests/helpers/math-computation-fake-seam.mjs +4 -0
  107. package/tests/math-computation-a1.mutants.mjs +72 -0
  108. package/tests/math-computation-archive-rerun.mutants.mjs +65 -0
  109. package/tests/math-computation-discovery.mutants.mjs +76 -0
  110. package/tests/math-computation-shared.test.mjs +392 -6
  111. package/tests/math-computation-v2.test.mjs +779 -0
  112. package/tests/math-computation-v3.test.mjs +771 -0
  113. package/tests/math-computation-v4.mutants.mjs +133 -0
  114. package/tests/math-computation-v4.test.mjs +739 -0
  115. package/tests/prompt-v5-integrity.test.mjs +1291 -1280
  116. package/tests/run-tests.mjs +393 -202
  117. package/tests/run-tests.mutants.mjs +70 -0
  118. package/tests/selfdrive-v5.mjs +560 -508
  119. package/tests/selfdrive-v5.mutants.mjs +132 -0
  120. package/tests/temp-hygiene.mutants.mjs +80 -0
  121. package/tests/v2-fix-probes.mutants.mjs +104 -0
  122. package/tests/v2-fix-probes.test.mjs +1040 -0
  123. package/tests/v2-list-agents-and-next-step.mutants.mjs +106 -0
  124. package/tests/v2v3-interrupt.mutants.mjs +111 -0
  125. package/tests/v3-fix-probes.mutants.mjs +99 -0
  126. package/tests/v3-fix-probes.test.mjs +892 -0
  127. package/tests/v4-final-paper.mutants.mjs +108 -0
  128. package/tests/v5-institute-fixes.mutants.mjs +218 -0
  129. package/vibe-math-v2/agent.cordis.yml +378 -322
  130. package/vibe-math-v2/math-computation.js +144 -53
  131. package/vibe-math-v2/math-engines.js +12 -12
  132. package/vibe-math-v2/preset.yml +2 -2
  133. package/vibe-math-v2/v2/347/232/204/351/242/235/345/244/226/350/246/201/346/261/202.txt +21 -21
  134. package/vibe-math-v2/vibe-math-v2.js +5097 -4755
  135. package/vibe-math-v2//345/256/236/347/216/260/346/226/271/346/241/210.md +491 -487
  136. package/vibe-math-v3/agent.cordis.yml +422 -356
  137. package/vibe-math-v3/math-computation.js +144 -53
  138. package/vibe-math-v3/math-engines.js +12 -12
  139. package/vibe-math-v3/preset.yml +2 -2
  140. package/vibe-math-v3/vibe-math-v3.js +6235 -5873
  141. package/vibe-math-v3//345/256/236/347/216/260/346/226/271/346/241/210.md +649 -649
  142. package/vibe-math-v4/agent.cordis.yml +438 -402
  143. package/vibe-math-v4/math-computation.js +144 -53
  144. package/vibe-math-v4/math-engines.js +12 -12
  145. package/vibe-math-v4/preset.yml +2 -2
  146. package/vibe-math-v4/vibe-math-v4.js +4490 -4269
  147. package/vibe-math-v4//345/256/236/347/216/260/346/226/271/346/241/210.md +1015 -1013
  148. package/vibe-math-v5/agent.cordis.yml +46 -12
  149. package/vibe-math-v5/math-computation.js +144 -53
  150. package/vibe-math-v5/math-engines.js +12 -12
  151. package/vibe-math-v5/vibe-math-v5.js +1266 -229
  152. package/vibe-math-v5//345/256/236/347/216/260/346/226/271/346/241/210.md +1728 -1660
  153. 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')