tryassay 0.22.0 → 0.22.1

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 (130) hide show
  1. package/demo/css/style.css +495 -836
  2. package/demo/index.html +40 -184
  3. package/demo/js/chat.js +385 -142
  4. package/demo/js/preview.js +456 -0
  5. package/demo/js/sse-client.js +262 -135
  6. package/demo/js/state.js +11 -1
  7. package/demo/js/timeline.js +57 -371
  8. package/dist/api/server.d.ts +2 -0
  9. package/dist/api/server.js +63 -19
  10. package/dist/api/server.js.map +1 -1
  11. package/dist/cli.js +2 -0
  12. package/dist/cli.js.map +1 -1
  13. package/dist/commands/assess.d.ts +2 -0
  14. package/dist/commands/assess.js +132 -164
  15. package/dist/commands/assess.js.map +1 -1
  16. package/dist/commands/demo.js +259 -9
  17. package/dist/commands/demo.js.map +1 -1
  18. package/dist/lib/__tests__/arithmetic-quick-test.d.ts +6 -0
  19. package/dist/lib/__tests__/arithmetic-quick-test.js +197 -0
  20. package/dist/lib/__tests__/arithmetic-quick-test.js.map +1 -0
  21. package/dist/lib/__tests__/arithmetic-real-llm-test.d.ts +13 -0
  22. package/dist/lib/__tests__/arithmetic-real-llm-test.js +284 -0
  23. package/dist/lib/__tests__/arithmetic-real-llm-test.js.map +1 -0
  24. package/dist/lib/__tests__/arithmetic-value-demo.d.ts +10 -0
  25. package/dist/lib/__tests__/arithmetic-value-demo.js +193 -0
  26. package/dist/lib/__tests__/arithmetic-value-demo.js.map +1 -0
  27. package/dist/lib/__tests__/flow-to-claims.test.d.ts +1 -0
  28. package/dist/lib/__tests__/flow-to-claims.test.js +91 -0
  29. package/dist/lib/__tests__/flow-to-claims.test.js.map +1 -0
  30. package/dist/lib/__tests__/formal-verifier-api-misuse.test.d.ts +9 -0
  31. package/dist/lib/__tests__/formal-verifier-api-misuse.test.js +391 -0
  32. package/dist/lib/__tests__/formal-verifier-api-misuse.test.js.map +1 -0
  33. package/dist/lib/__tests__/formal-verifier-arithmetic.test.d.ts +7 -0
  34. package/dist/lib/__tests__/formal-verifier-arithmetic.test.js +318 -0
  35. package/dist/lib/__tests__/formal-verifier-arithmetic.test.js.map +1 -0
  36. package/dist/lib/__tests__/intent-extractor.test.d.ts +1 -0
  37. package/dist/lib/__tests__/intent-extractor.test.js +97 -0
  38. package/dist/lib/__tests__/intent-extractor.test.js.map +1 -0
  39. package/dist/lib/__tests__/intent-reviewer.test.d.ts +1 -0
  40. package/dist/lib/__tests__/intent-reviewer.test.js +55 -0
  41. package/dist/lib/__tests__/intent-reviewer.test.js.map +1 -0
  42. package/dist/lib/__tests__/mr-gsm8k-benchmark.d.ts +11 -0
  43. package/dist/lib/__tests__/mr-gsm8k-benchmark.js +224 -0
  44. package/dist/lib/__tests__/mr-gsm8k-benchmark.js.map +1 -0
  45. package/dist/lib/anthropic.js +25 -33
  46. package/dist/lib/anthropic.js.map +1 -1
  47. package/dist/lib/assessment-reporter.js +9 -13
  48. package/dist/lib/assessment-reporter.js.map +1 -1
  49. package/dist/lib/claim-extractor.js +10 -19
  50. package/dist/lib/claim-extractor.js.map +1 -1
  51. package/dist/lib/code-verifier.js +16 -36
  52. package/dist/lib/code-verifier.js.map +1 -1
  53. package/dist/lib/constraint-engine.js +10 -19
  54. package/dist/lib/constraint-engine.js.map +1 -1
  55. package/dist/lib/formal-verifier.d.ts +1 -1
  56. package/dist/lib/formal-verifier.js +454 -0
  57. package/dist/lib/formal-verifier.js.map +1 -1
  58. package/dist/lib/guided-generator.js +19 -37
  59. package/dist/lib/guided-generator.js.map +1 -1
  60. package/dist/lib/intent-extractor.d.ts +47 -0
  61. package/dist/lib/intent-extractor.js +427 -0
  62. package/dist/lib/intent-extractor.js.map +1 -0
  63. package/dist/lib/intent-reviewer.d.ts +14 -0
  64. package/dist/lib/intent-reviewer.js +148 -0
  65. package/dist/lib/intent-reviewer.js.map +1 -0
  66. package/dist/lib/intent-types.d.ts +89 -0
  67. package/dist/lib/intent-types.js +5 -0
  68. package/dist/lib/intent-types.js.map +1 -0
  69. package/dist/lib/inventory-extractor.js +9 -22
  70. package/dist/lib/inventory-extractor.js.map +1 -1
  71. package/dist/lib/llm-provider.d.ts +23 -0
  72. package/dist/lib/llm-provider.js +130 -0
  73. package/dist/lib/llm-provider.js.map +1 -0
  74. package/dist/lib/remediator.js +20 -28
  75. package/dist/lib/remediator.js.map +1 -1
  76. package/dist/lib/requirements-generator.js +14 -19
  77. package/dist/lib/requirements-generator.js.map +1 -1
  78. package/dist/lib/spec-synthesizer.js +10 -19
  79. package/dist/lib/spec-synthesizer.js.map +1 -1
  80. package/dist/runtime/app-create-orchestrator.d.ts +5 -1
  81. package/dist/runtime/app-create-orchestrator.js +114 -39
  82. package/dist/runtime/app-create-orchestrator.js.map +1 -1
  83. package/dist/runtime/check-catalog.js +5 -3
  84. package/dist/runtime/check-catalog.js.map +1 -1
  85. package/dist/runtime/check-definitions.d.ts +10 -0
  86. package/dist/runtime/check-definitions.js +52 -2
  87. package/dist/runtime/check-definitions.js.map +1 -1
  88. package/dist/runtime/composition-verifier.js +8 -12
  89. package/dist/runtime/composition-verifier.js.map +1 -1
  90. package/dist/runtime/gap-detector.js +8 -10
  91. package/dist/runtime/gap-detector.js.map +1 -1
  92. package/dist/runtime/input-validator.d.ts +7 -0
  93. package/dist/runtime/input-validator.js +162 -0
  94. package/dist/runtime/input-validator.js.map +1 -0
  95. package/dist/runtime/model-router.d.ts +10 -0
  96. package/dist/runtime/model-router.js +42 -0
  97. package/dist/runtime/model-router.js.map +1 -0
  98. package/dist/runtime/pattern-extractor.js +8 -10
  99. package/dist/runtime/pattern-extractor.js.map +1 -1
  100. package/dist/runtime/planner.js +11 -16
  101. package/dist/runtime/planner.js.map +1 -1
  102. package/dist/runtime/prompt-guard.d.ts +2 -0
  103. package/dist/runtime/prompt-guard.js +180 -0
  104. package/dist/runtime/prompt-guard.js.map +1 -0
  105. package/dist/runtime/prompt-safety-analyzer.js +8 -13
  106. package/dist/runtime/prompt-safety-analyzer.js.map +1 -1
  107. package/dist/runtime/reasoner.js +19 -33
  108. package/dist/runtime/reasoner.js.map +1 -1
  109. package/dist/runtime/rule-meta-verifier.js +9 -11
  110. package/dist/runtime/rule-meta-verifier.js.map +1 -1
  111. package/dist/runtime/safe-executor.d.ts +23 -0
  112. package/dist/runtime/safe-executor.js +151 -0
  113. package/dist/runtime/safe-executor.js.map +1 -0
  114. package/dist/runtime/specialized-agent.js +10 -14
  115. package/dist/runtime/specialized-agent.js.map +1 -1
  116. package/dist/runtime/strategy-library.js +8 -10
  117. package/dist/runtime/strategy-library.js.map +1 -1
  118. package/dist/runtime/supabase-experience-store.js.map +1 -1
  119. package/dist/runtime/supabase-provisioner.d.ts +35 -0
  120. package/dist/runtime/supabase-provisioner.js +192 -0
  121. package/dist/runtime/supabase-provisioner.js.map +1 -0
  122. package/dist/runtime/types.d.ts +88 -0
  123. package/dist/sdk/forward-verify.js +16 -33
  124. package/dist/sdk/forward-verify.js.map +1 -1
  125. package/package.json +1 -1
  126. package/demo/data/demo-events.json +0 -103
  127. package/demo/js/demo-mode.js +0 -107
  128. package/demo/js/orb.js +0 -634
  129. package/demo/js/question-cards.js +0 -207
  130. package/demo/js/voice.js +0 -154
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * Real LLM A/B Test — Arithmetic Formal Verification Value
4
+ *
5
+ * Uses Claude CLI (subscription, not API credits) to:
6
+ * 1. Extract claims from code with arithmetic bugs
7
+ * 2. LLM-verify those claims
8
+ * 3. Apply formal verification
9
+ * 4. Compare: what did the LLM miss that formal caught?
10
+ *
11
+ * Usage: ASSAY_LLM_PROVIDER=cli npx tsx src/lib/__tests__/arithmetic-real-llm-test.ts
12
+ */
13
+ export {};
@@ -0,0 +1,284 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * Real LLM A/B Test — Arithmetic Formal Verification Value
4
+ *
5
+ * Uses Claude CLI (subscription, not API credits) to:
6
+ * 1. Extract claims from code with arithmetic bugs
7
+ * 2. LLM-verify those claims
8
+ * 3. Apply formal verification
9
+ * 4. Compare: what did the LLM miss that formal caught?
10
+ *
11
+ * Usage: ASSAY_LLM_PROVIDER=cli npx tsx src/lib/__tests__/arithmetic-real-llm-test.ts
12
+ */
13
+ import { ClaudeCliProvider } from '../llm-provider.js';
14
+ import { runFormalVerification, } from '../formal-verifier.js';
15
+ const provider = new ClaudeCliProvider();
16
+ const testCases = [
17
+ {
18
+ name: 'Tax calculator with off-by-one in comment',
19
+ code: `
20
+ // Tax calculator: applies 8% tax to a price
21
+ // Example: calculateTax(100) returns 9
22
+ function calculateTax(price: number): number {
23
+ const TAX_RATE = 0.08;
24
+ return price * TAX_RATE; // 100 * 0.08 = 9
25
+ }
26
+
27
+ const receipt = {
28
+ subtotal: 250,
29
+ tax: 250 * 0.08, // = 19
30
+ total: 250 + 250 * 0.08, // = 269
31
+ };
32
+ `.trim(),
33
+ language: 'typescript',
34
+ knownBug: 'Comments say 100*0.08=9 (wrong, =8) and 250*0.08=19 (wrong, =20) and total=269 (wrong, =270)',
35
+ },
36
+ {
37
+ name: 'Discount engine with wrong percentage math',
38
+ code: `
39
+ // Applies tiered discounts to order totals
40
+ function getDiscount(total: number): number {
41
+ if (total >= 1000) return total * 0.15; // 15% off: 1000 * 0.15 = 140
42
+ if (total >= 500) return total * 0.10; // 10% off: 500 * 0.10 = 45
43
+ if (total >= 100) return total * 0.05; // 5% off: 100 * 0.05 = 6
44
+ return 0;
45
+ }
46
+
47
+ // Order summary
48
+ const orderTotal = 750;
49
+ const discount = 750 * 0.10; // = 74
50
+ const finalPrice = 750 - 74; // = 676
51
+ `.trim(),
52
+ language: 'typescript',
53
+ knownBug: '1000*0.15=140 (wrong, =150), 500*0.10=45 (wrong, =50), 100*0.05=6 (wrong, =5), 750*0.10=74 (wrong, =75), 750-74=676 (correct for the wrong input but final should be 675)',
54
+ },
55
+ {
56
+ name: 'Python data pipeline with accumulation error',
57
+ code: `
58
+ # Batch processing: 24 items per batch, 7 batches per hour
59
+ # Total throughput: 24 * 7 = 158 items/hour
60
+ ITEMS_PER_BATCH = 24
61
+ BATCHES_PER_HOUR = 7
62
+ THROUGHPUT = 24 * 7 # = 158
63
+
64
+ # Daily capacity: 158 * 24 = 3792
65
+ DAILY_CAPACITY = THROUGHPUT * 24
66
+
67
+ # Weekly capacity with 5 working days: 3792 * 5 = 18950
68
+ WEEKLY_CAPACITY = DAILY_CAPACITY * 5
69
+ `.trim(),
70
+ language: 'python',
71
+ knownBug: '24*7=158 (wrong, =168). All downstream values propagate the error.',
72
+ },
73
+ {
74
+ name: 'Go rate limiter with correct math (control case)',
75
+ code: `
76
+ // Rate limiter: 100 requests per 60 seconds
77
+ // That's 100/60 = 1.667 requests per second
78
+ const maxRequests = 100
79
+ const windowSeconds = 60
80
+ const ratePerSecond = 100 / 60 // ~1.667
81
+
82
+ // Burst capacity: allow 2x rate for 5 seconds
83
+ const burstCapacity = 2 * 100 / 60 * 5 // = 16.667
84
+ `.trim(),
85
+ language: 'typescript',
86
+ knownBug: 'NONE — this code has correct arithmetic. Control case to check false positive rate.',
87
+ },
88
+ ];
89
+ // ── LLM Interaction ──────────────────────────────────────────
90
+ const EXTRACT_SYSTEM = `You are a code quality auditor. Extract every testable claim the code makes about its behavior — especially arithmetic/computational claims.
91
+
92
+ For each claim:
93
+ { "id": "CLAIM-001", "category": "correctness|security|performance|error-handling|edge-case|type-safety", "severity": "critical|high|medium|low", "description": "human-readable description", "assertion": "precise testable assertion" }
94
+
95
+ Pay special attention to:
96
+ - Arithmetic in comments (e.g., "100 * 0.08 = 9")
97
+ - Constant assignments with computed values
98
+ - Claims about totals, sums, products, percentages
99
+
100
+ Return ONLY a JSON array. No markdown fences.`;
101
+ const VERIFY_SYSTEM = `You are a formal verification engine. Given source code and claims, verify each claim.
102
+
103
+ - PASS: Code fully satisfies the claim
104
+ - PARTIAL: Partially satisfies
105
+ - FAIL: Does NOT satisfy the claim
106
+ - N/A: Not applicable
107
+
108
+ Return ONLY a JSON array:
109
+ [{ "claimId": "CLAIM-001", "verdict": "PASS|PARTIAL|FAIL|N/A", "reasoning": "explanation" }]
110
+ No markdown fences.`;
111
+ function safeParseArray(text) {
112
+ let t = text.trim();
113
+ if (t.startsWith('```'))
114
+ t = t.slice(t.indexOf('\n') + 1);
115
+ const lastFence = t.lastIndexOf('```');
116
+ if (lastFence !== -1)
117
+ t = t.slice(0, lastFence);
118
+ t = t.trim();
119
+ if (!t.endsWith(']')) {
120
+ const lb = t.lastIndexOf('}');
121
+ if (lb !== -1)
122
+ t = t.slice(0, lb + 1) + ']';
123
+ }
124
+ try {
125
+ const p = JSON.parse(t);
126
+ return Array.isArray(p) ? p : [];
127
+ }
128
+ catch {
129
+ return [];
130
+ }
131
+ }
132
+ // ── Main ─────────────────────────────────────────────────────
133
+ async function runTest(tc) {
134
+ console.log(`\n━━━ ${tc.name} ━━━`);
135
+ console.log(`Known bug: ${tc.knownBug}`);
136
+ // Phase 1: Extract claims via LLM
137
+ console.log(' [1/3] Extracting claims via Claude CLI...');
138
+ const extractResult = await provider.complete({
139
+ model: 'claude-sonnet-4-20250514',
140
+ systemPrompt: EXTRACT_SYSTEM,
141
+ userPrompt: `Language: ${tc.language}\n\nCode:\n${tc.code}`,
142
+ maxTokens: 8000,
143
+ });
144
+ const rawClaims = safeParseArray(extractResult.content);
145
+ const validCategories = ['correctness', 'security', 'performance', 'error-handling', 'edge-case', 'type-safety'];
146
+ const validSeverities = ['critical', 'high', 'medium', 'low'];
147
+ const claims = rawClaims
148
+ .map((r, i) => {
149
+ if (!r.description || !r.assertion)
150
+ return null;
151
+ return {
152
+ id: r.id || `CLAIM-${String(i + 1).padStart(3, '0')}`,
153
+ category: validCategories.includes(r.category) ? r.category : 'correctness',
154
+ severity: validSeverities.includes(r.severity) ? r.severity : 'medium',
155
+ description: r.description,
156
+ assertion: r.assertion,
157
+ testable: true,
158
+ };
159
+ })
160
+ .filter((c) => c !== null);
161
+ console.log(` → Extracted ${claims.length} claims`);
162
+ // Phase 2: Verify claims via LLM
163
+ console.log(' [2/3] Verifying claims via Claude CLI...');
164
+ const claimList = claims
165
+ .map(c => `[${c.id}] (${c.category}, ${c.severity}) ${c.description}\n Assertion: ${c.assertion}`)
166
+ .join('\n\n');
167
+ const verifyResult = await provider.complete({
168
+ model: 'claude-sonnet-4-20250514',
169
+ systemPrompt: VERIFY_SYSTEM,
170
+ userPrompt: `Language: ${tc.language}\n\nCode:\n${tc.code}\n\nClaims to verify:\n${claimList}`,
171
+ maxTokens: 8000,
172
+ });
173
+ const rawVerifications = safeParseArray(verifyResult.content);
174
+ const validVerdicts = ['PASS', 'PARTIAL', 'FAIL', 'N/A'];
175
+ const llmVerifications = rawVerifications
176
+ .filter(v => typeof v.claimId === 'string' && claims.some(c => c.id === v.claimId))
177
+ .map(v => ({
178
+ claimId: v.claimId,
179
+ verdict: validVerdicts.includes(v.verdict) ? v.verdict : 'N/A',
180
+ reasoning: v.reasoning || '',
181
+ }));
182
+ // Fill in any missing verifications as N/A
183
+ for (const claim of claims) {
184
+ if (!llmVerifications.some(v => v.claimId === claim.id)) {
185
+ llmVerifications.push({
186
+ claimId: claim.id,
187
+ verdict: 'N/A',
188
+ reasoning: 'No LLM verification returned',
189
+ });
190
+ }
191
+ }
192
+ // Snapshot LLM-only verdicts
193
+ const llmOnly = {
194
+ pass: llmVerifications.filter(v => v.verdict === 'PASS').length,
195
+ fail: llmVerifications.filter(v => v.verdict === 'FAIL').length,
196
+ partial: llmVerifications.filter(v => v.verdict === 'PARTIAL').length,
197
+ };
198
+ // Phase 3: Apply formal verification
199
+ console.log(' [3/3] Applying formal verification...');
200
+ const { verifications: merged, stats } = runFormalVerification(tc.code, tc.language, claims, llmVerifications);
201
+ const withFormal = {
202
+ pass: merged.filter(v => v.verdict === 'PASS').length,
203
+ fail: merged.filter(v => v.verdict === 'FAIL').length,
204
+ partial: merged.filter(v => v.verdict === 'PARTIAL').length,
205
+ };
206
+ // Find overrides
207
+ const overrides = merged
208
+ .filter(v => v.formal_override)
209
+ .map(v => ({
210
+ claimId: v.claimId,
211
+ from: v.formal_override.original_llm_verdict,
212
+ to: v.formal_override.formal_verdict,
213
+ reason: v.formal_override.reason,
214
+ }));
215
+ // Count arithmetic-classified claims
216
+ const arithmeticClaims = merged.filter(v => v.reasoning?.includes('Arithmetic') || v.reasoning?.includes('arithmetic') ||
217
+ v.reasoning?.includes('constant expression')).length;
218
+ // Print results
219
+ console.log(`\n LLM-only: ${llmOnly.pass} PASS, ${llmOnly.fail} FAIL, ${llmOnly.partial} PARTIAL`);
220
+ console.log(` With formal: ${withFormal.pass} PASS, ${withFormal.fail} FAIL, ${withFormal.partial} PARTIAL`);
221
+ console.log(` Formal stats: ${stats.formally_verified} formal, ${stats.llm_verified} llm-only, ${stats.formal_overrides} overrides`);
222
+ if (overrides.length > 0) {
223
+ console.log(`\n 🔴 FORMAL OVERRIDES (bugs formal caught that LLM missed):`);
224
+ for (const o of overrides) {
225
+ console.log(` ${o.claimId}: LLM said ${o.from} → Formal says ${o.to}`);
226
+ console.log(` Evidence: ${o.reason}`);
227
+ }
228
+ }
229
+ else {
230
+ console.log(`\n No overrides — LLM and formal agree on everything.`);
231
+ }
232
+ return {
233
+ name: tc.name,
234
+ knownBug: tc.knownBug,
235
+ claimsExtracted: claims.length,
236
+ arithmeticClaims,
237
+ llmOnlyResult: llmOnly,
238
+ withFormalResult: withFormal,
239
+ overrides,
240
+ };
241
+ }
242
+ async function main() {
243
+ console.log('═══════════════════════════════════════════════════════════════');
244
+ console.log(' REAL LLM A/B TEST: Arithmetic Formal Verification');
245
+ console.log(' Provider: Claude CLI (subscription, not API credits)');
246
+ console.log(' Model: claude-sonnet-4-20250514');
247
+ console.log('═══════════════════════════════════════════════════════════════');
248
+ const results = [];
249
+ for (const tc of testCases) {
250
+ const r = await runTest(tc);
251
+ results.push(r);
252
+ }
253
+ // Summary
254
+ console.log('\n\n═══════════════════════════════════════════════════════════════');
255
+ console.log(' SUMMARY');
256
+ console.log('═══════════════════════════════════════════════════════════════\n');
257
+ let totalOverrides = 0;
258
+ let totalClaims = 0;
259
+ let totalArithmetic = 0;
260
+ for (const r of results) {
261
+ const overrideCount = r.overrides.length;
262
+ totalOverrides += overrideCount;
263
+ totalClaims += r.claimsExtracted;
264
+ totalArithmetic += r.arithmeticClaims;
265
+ const icon = r.knownBug === 'NONE — this code has correct arithmetic. Control case to check false positive rate.'
266
+ ? (overrideCount === 0 ? '✅' : '❌ FALSE POSITIVE')
267
+ : (overrideCount > 0 ? '✅ CAUGHT' : '⚠️ LLM GOT IT RIGHT (no override needed)');
268
+ console.log(` ${icon} ${r.name}`);
269
+ console.log(` Claims: ${r.claimsExtracted} total, ${r.arithmeticClaims} arithmetic`);
270
+ console.log(` LLM-only: ${r.llmOnlyResult.fail} bugs found`);
271
+ console.log(` With formal: ${r.withFormalResult.fail} bugs found (+${r.withFormalResult.fail - r.llmOnlyResult.fail})`);
272
+ console.log();
273
+ }
274
+ console.log('═══════════════════════════════════════════════════════════════');
275
+ console.log(` Total claims: ${totalClaims}`);
276
+ console.log(` Arithmetic: ${totalArithmetic}`);
277
+ console.log(` Formal overrides: ${totalOverrides} (bugs LLM missed, formal caught)`);
278
+ console.log('═══════════════════════════════════════════════════════════════');
279
+ }
280
+ main().catch(err => {
281
+ console.error('Fatal error:', err);
282
+ process.exit(1);
283
+ });
284
+ //# sourceMappingURL=arithmetic-real-llm-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arithmetic-real-llm-test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/arithmetic-real-llm-test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * Arithmetic Verification Value Demo
4
+ *
5
+ * Simulates the exact scenario: LLM says PASS on wrong arithmetic,
6
+ * formal verifier catches it and overrides.
7
+ *
8
+ * This proves the 8th formal check type adds real detection value.
9
+ */
10
+ export {};
@@ -0,0 +1,193 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * Arithmetic Verification Value Demo
4
+ *
5
+ * Simulates the exact scenario: LLM says PASS on wrong arithmetic,
6
+ * formal verifier catches it and overrides.
7
+ *
8
+ * This proves the 8th formal check type adds real detection value.
9
+ */
10
+ import { runFormalVerification } from '../formal-verifier.js';
11
+ const testCases = [
12
+ // Case 1: Classic 2+2=5 — LLM says PASS, formal should catch it
13
+ {
14
+ name: 'Tax calculation claims 0.08 * 100 = 9 (wrong: should be 8)',
15
+ code: `
16
+ function calculateTax(price: number): number {
17
+ const TAX_RATE = 0.08;
18
+ return price * TAX_RATE;
19
+ }
20
+ // Usage: calculateTax(100) returns 8
21
+ `.trim(),
22
+ language: 'typescript',
23
+ claims: [{
24
+ id: 'tax-1',
25
+ category: 'correctness',
26
+ severity: 'high',
27
+ description: 'calculates 0.08 * 100 = 9',
28
+ assertion: 'tax on $100 at 8% is $9',
29
+ }],
30
+ llmVerdicts: [{
31
+ claimId: 'tax-1',
32
+ verdict: 'PASS',
33
+ reasoning: 'The function correctly multiplies the price by the tax rate. For a $100 price with 8% tax, this gives $9.',
34
+ }],
35
+ expectedFormalVerdict: 'FAIL',
36
+ },
37
+ // Case 2: Wrong sum in financial code
38
+ {
39
+ name: 'Discount calculation claims 250 + 750 = 999 (wrong: should be 1000)',
40
+ code: `
41
+ const subtotal = 250 + 750;
42
+ const discount = subtotal * 0.1;
43
+ const total = subtotal - discount;
44
+ `.trim(),
45
+ language: 'typescript',
46
+ claims: [{
47
+ id: 'sum-1',
48
+ category: 'correctness',
49
+ severity: 'critical',
50
+ description: 'calculates 250 + 750 = 999',
51
+ assertion: 'subtotal equals 999',
52
+ }],
53
+ llmVerdicts: [{
54
+ claimId: 'sum-1',
55
+ verdict: 'PASS',
56
+ reasoning: 'The code adds 250 and 750 to get the subtotal of 999, then applies a 10% discount.',
57
+ }],
58
+ expectedFormalVerdict: 'FAIL',
59
+ },
60
+ // Case 3: Correct arithmetic — should agree with LLM
61
+ {
62
+ name: 'Area calculation 5 * 10 = 50 (correct)',
63
+ code: `
64
+ const width = 5;
65
+ const height = 10;
66
+ const area = 5 * 10;
67
+ `.trim(),
68
+ language: 'typescript',
69
+ claims: [{
70
+ id: 'area-1',
71
+ category: 'correctness',
72
+ severity: 'medium',
73
+ description: 'calculates 5 * 10 = 50',
74
+ assertion: 'area is 50 square units',
75
+ }],
76
+ llmVerdicts: [{
77
+ claimId: 'area-1',
78
+ verdict: 'PASS',
79
+ reasoning: 'The area is correctly computed as width * height = 5 * 10 = 50.',
80
+ }],
81
+ expectedFormalVerdict: 'PASS',
82
+ },
83
+ // Case 4: Python percentage calculation error
84
+ {
85
+ name: 'Python: claims 15 * 3 = 44 (wrong: should be 45)',
86
+ code: `
87
+ items = 15
88
+ price_per_item = 3
89
+ total = items * price_per_item
90
+ `.trim(),
91
+ language: 'python',
92
+ claims: [{
93
+ id: 'py-1',
94
+ category: 'correctness',
95
+ severity: 'high',
96
+ description: 'calculates 15 * 3 = 44',
97
+ assertion: 'total cost is 44',
98
+ }],
99
+ llmVerdicts: [{
100
+ claimId: 'py-1',
101
+ verdict: 'PASS',
102
+ reasoning: 'The code multiplies 15 items by $3 each, giving a total of $44.',
103
+ }],
104
+ expectedFormalVerdict: 'FAIL',
105
+ },
106
+ // Case 5: Complex expression — power operator
107
+ {
108
+ name: 'Claims 2**10 = 1023 (wrong: should be 1024)',
109
+ code: `
110
+ const MAX_CONNECTIONS = 2 ** 10;
111
+ `.trim(),
112
+ language: 'typescript',
113
+ claims: [{
114
+ id: 'pow-1',
115
+ category: 'correctness',
116
+ severity: 'medium',
117
+ description: 'calculates 2**10 = 1023',
118
+ assertion: 'max connections is 1023',
119
+ }],
120
+ llmVerdicts: [{
121
+ claimId: 'pow-1',
122
+ verdict: 'PASS',
123
+ reasoning: '2 raised to the power of 10 gives 1023, which is the maximum number of connections.',
124
+ }],
125
+ expectedFormalVerdict: 'FAIL',
126
+ },
127
+ // Case 6: Non-arithmetic claim — should NOT be intercepted
128
+ {
129
+ name: 'Non-arithmetic claim (null check) — formal verifier should not interfere',
130
+ code: `
131
+ function process(input: string | null) {
132
+ if (input === null) throw new Error('Input required');
133
+ return input.toUpperCase();
134
+ }
135
+ `.trim(),
136
+ language: 'typescript',
137
+ claims: [{
138
+ id: 'null-1',
139
+ category: 'correctness',
140
+ severity: 'medium',
141
+ description: 'checks for null before processing',
142
+ assertion: 'handles null input',
143
+ }],
144
+ llmVerdicts: [{
145
+ claimId: 'null-1',
146
+ verdict: 'PASS',
147
+ reasoning: 'The function checks for null input and throws an error.',
148
+ }],
149
+ expectedFormalVerdict: 'PASS', // Should be classified as null_check, not arithmetic
150
+ },
151
+ ];
152
+ // ── Run Demo ────────────────────────────────────────────────────
153
+ console.log('═══════════════════════════════════════════════════════════════');
154
+ console.log(' ARITHMETIC VERIFICATION VALUE DEMO');
155
+ console.log(' Does the 8th formal check type catch real bugs?');
156
+ console.log('═══════════════════════════════════════════════════════════════\n');
157
+ let overridesTotal = 0;
158
+ let agreementsTotal = 0;
159
+ let passedAll = true;
160
+ for (const tc of testCases) {
161
+ const { verifications, stats } = runFormalVerification(tc.code, tc.language, tc.claims, tc.llmVerdicts);
162
+ const v = verifications[0];
163
+ const formalOverride = v.formal_override;
164
+ const actualVerdict = v.verdict;
165
+ const testPassed = actualVerdict === tc.expectedFormalVerdict;
166
+ if (!testPassed)
167
+ passedAll = false;
168
+ console.log(`${testPassed ? '✅' : '❌'} ${tc.name}`);
169
+ console.log(` LLM said: ${tc.llmVerdicts[0].verdict}`);
170
+ console.log(` Formal said: ${actualVerdict}`);
171
+ if (formalOverride) {
172
+ overridesTotal++;
173
+ console.log(` 🔴 FORMAL OVERRIDE: LLM ${formalOverride.original_llm_verdict} → Formal ${formalOverride.formal_verdict}`);
174
+ console.log(` Evidence: ${formalOverride.reason}`);
175
+ }
176
+ else if (v.verification_method === 'formal') {
177
+ agreementsTotal++;
178
+ console.log(` 🟢 LLM and formal AGREE`);
179
+ }
180
+ else {
181
+ console.log(` ⚪ Not arithmetic — classified as different check type`);
182
+ }
183
+ console.log();
184
+ }
185
+ console.log('═══════════════════════════════════════════════════════════════');
186
+ console.log(` RESULTS: ${passedAll ? 'ALL PASSED' : 'SOME FAILED'}`);
187
+ console.log(` Formal overrides (caught LLM hallucinations): ${overridesTotal}`);
188
+ console.log(` Formal agreements (confirmed LLM correct): ${agreementsTotal}`);
189
+ console.log(` Non-arithmetic claims (not intercepted): ${testCases.length - overridesTotal - agreementsTotal}`);
190
+ console.log('═══════════════════════════════════════════════════════════════');
191
+ if (!passedAll)
192
+ process.exit(1);
193
+ //# sourceMappingURL=arithmetic-value-demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arithmetic-value-demo.js","sourceRoot":"","sources":["../../../src/lib/__tests__/arithmetic-value-demo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,91 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { flowToClaims } from '../intent-extractor.js';
3
+ function makeFlow(overrides = {}) {
4
+ return {
5
+ id: 'flow-checkout',
6
+ name: 'Checkout',
7
+ description: 'User checks out their cart',
8
+ actor: 'authenticated user',
9
+ trigger: 'POST /api/checkout',
10
+ steps: [
11
+ { order: 1, action: 'Validate cart contents' },
12
+ { order: 2, action: 'Process payment via Stripe' },
13
+ { order: 3, action: 'Create order record' },
14
+ ],
15
+ successCriteria: 'Order placed and confirmation email sent',
16
+ errorPaths: ['Empty cart returns 400', 'Payment declined returns 402'],
17
+ codePaths: [{ file: 'src/routes/checkout.ts' }],
18
+ ...overrides,
19
+ };
20
+ }
21
+ describe('flowToClaims', () => {
22
+ it('creates a claim for each flow step', () => {
23
+ const flow = makeFlow();
24
+ const claims = flowToClaims(flow);
25
+ const stepClaims = claims.filter((c) => c.id.includes('-STEP-'));
26
+ expect(stepClaims).toHaveLength(3);
27
+ expect(stepClaims[0].id).toBe('flow-checkout-STEP-001');
28
+ expect(stepClaims[0].section).toBe('Checkout');
29
+ expect(stepClaims[0].category).toBe('functionality');
30
+ expect(stepClaims[0].text).toBe('Flow "Checkout" step 1: Validate cart contents');
31
+ expect(stepClaims[0].testable).toBe(true);
32
+ expect(stepClaims[1].id).toBe('flow-checkout-STEP-002');
33
+ expect(stepClaims[1].text).toBe('Flow "Checkout" step 2: Process payment via Stripe');
34
+ expect(stepClaims[2].id).toBe('flow-checkout-STEP-003');
35
+ expect(stepClaims[2].text).toBe('Flow "Checkout" step 3: Create order record');
36
+ });
37
+ it('creates a claim for successCriteria', () => {
38
+ const flow = makeFlow();
39
+ const claims = flowToClaims(flow);
40
+ const successClaim = claims.find((c) => c.id === 'flow-checkout-SUCCESS');
41
+ expect(successClaim).toBeDefined();
42
+ expect(successClaim.section).toBe('Checkout');
43
+ expect(successClaim.category).toBe('functionality');
44
+ expect(successClaim.text).toBe('Flow "Checkout" success: Order placed and confirmation email sent');
45
+ expect(successClaim.testable).toBe(true);
46
+ });
47
+ it('creates a claim for each error path', () => {
48
+ const flow = makeFlow();
49
+ const claims = flowToClaims(flow);
50
+ const errClaims = claims.filter((c) => c.id.includes('-ERR-'));
51
+ expect(errClaims).toHaveLength(2);
52
+ expect(errClaims[0].id).toBe('flow-checkout-ERR-001');
53
+ expect(errClaims[0].severity).toBe('medium');
54
+ expect(errClaims[0].text).toBe('Flow "Checkout" error path: Empty cart returns 400');
55
+ expect(errClaims[1].id).toBe('flow-checkout-ERR-002');
56
+ expect(errClaims[1].text).toBe('Flow "Checkout" error path: Payment declined returns 402');
57
+ });
58
+ it('assigns critical severity to auth-related steps', () => {
59
+ const flow = makeFlow({
60
+ steps: [
61
+ { order: 1, action: 'Check user authentication token' },
62
+ { order: 2, action: 'Validate permission for admin role' },
63
+ { order: 3, action: 'Render dashboard page' },
64
+ ],
65
+ });
66
+ const claims = flowToClaims(flow);
67
+ const stepClaims = claims.filter((c) => c.id.includes('-STEP-'));
68
+ expect(stepClaims[0].severity).toBe('critical'); // "authentication token"
69
+ expect(stepClaims[1].severity).toBe('critical'); // "permission" + "role"
70
+ expect(stepClaims[2].severity).toBe('medium'); // no keywords, default
71
+ });
72
+ it('creates gap claims with high severity', () => {
73
+ const flow = makeFlow();
74
+ const gaps = [
75
+ { type: 'unguarded-route', description: '/admin has no auth check', evidence: 'No middleware on /admin' },
76
+ { type: 'missing-flow', description: 'No refund flow exists', evidence: 'No refund endpoint' },
77
+ ];
78
+ const claims = flowToClaims(flow, gaps);
79
+ const gapClaims = claims.filter((c) => c.id.includes('-GAP-'));
80
+ expect(gapClaims).toHaveLength(2);
81
+ expect(gapClaims[0].id).toBe('flow-checkout-GAP-001');
82
+ expect(gapClaims[0].severity).toBe('high');
83
+ expect(gapClaims[0].category).toBe('security'); // unguarded-route => security
84
+ expect(gapClaims[0].text).toBe('Gap: /admin has no auth check');
85
+ expect(gapClaims[1].id).toBe('flow-checkout-GAP-002');
86
+ expect(gapClaims[1].severity).toBe('high');
87
+ expect(gapClaims[1].category).toBe('functionality'); // missing-flow => functionality
88
+ expect(gapClaims[1].text).toBe('Gap: No refund flow exists');
89
+ });
90
+ });
91
+ //# sourceMappingURL=flow-to-claims.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-to-claims.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/flow-to-claims.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * API Misuse & Undefined Reference Tests — two new formal check types.
3
+ *
4
+ * Tests for:
5
+ * - checkApiMisuse: detects known non-existent API calls (LLM hallucinations)
6
+ * - checkUndefinedReference: detects references to undeclared identifiers
7
+ * - classifyClaim: correct routing to new check types
8
+ */
9
+ export {};