tryassay 0.34.0 → 0.35.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 (133) hide show
  1. package/dist/bayesian/__tests__/bas-calculator.test.d.ts +1 -0
  2. package/dist/bayesian/__tests__/bas-calculator.test.js +63 -0
  3. package/dist/bayesian/__tests__/bas-calculator.test.js.map +1 -0
  4. package/dist/bayesian/__tests__/structural-entropy.test.d.ts +1 -0
  5. package/dist/bayesian/__tests__/structural-entropy.test.js +21 -0
  6. package/dist/bayesian/__tests__/structural-entropy.test.js.map +1 -0
  7. package/dist/bayesian/bas-calculator.d.ts +41 -0
  8. package/dist/bayesian/bas-calculator.js +198 -0
  9. package/dist/bayesian/bas-calculator.js.map +1 -0
  10. package/dist/bayesian/index.d.ts +3 -0
  11. package/dist/bayesian/index.js +3 -0
  12. package/dist/bayesian/index.js.map +1 -0
  13. package/dist/bayesian/structural-entropy.d.ts +12 -0
  14. package/dist/bayesian/structural-entropy.js +37 -0
  15. package/dist/bayesian/structural-entropy.js.map +1 -0
  16. package/dist/bayesian/types.d.ts +37 -0
  17. package/dist/bayesian/types.js +6 -0
  18. package/dist/bayesian/types.js.map +1 -0
  19. package/dist/cli.js +28 -0
  20. package/dist/cli.js.map +1 -1
  21. package/dist/commands/__tests__/assess-formal.test.d.ts +1 -0
  22. package/dist/commands/__tests__/assess-formal.test.js +72 -0
  23. package/dist/commands/__tests__/assess-formal.test.js.map +1 -0
  24. package/dist/commands/activate.d.ts +1 -0
  25. package/dist/commands/activate.js +48 -0
  26. package/dist/commands/activate.js.map +1 -0
  27. package/dist/commands/assess.js +100 -5
  28. package/dist/commands/assess.js.map +1 -1
  29. package/dist/commands/bas-score.d.ts +13 -0
  30. package/dist/commands/bas-score.js +310 -0
  31. package/dist/commands/bas-score.js.map +1 -0
  32. package/dist/commands/bounty-watch.js.map +1 -1
  33. package/dist/commands/hunt.js +32 -0
  34. package/dist/commands/hunt.js.map +1 -1
  35. package/dist/commands/runtime.js +11 -10
  36. package/dist/commands/runtime.js.map +1 -1
  37. package/dist/commands/stream-verify.d.ts +16 -0
  38. package/dist/commands/stream-verify.js +228 -0
  39. package/dist/commands/stream-verify.js.map +1 -0
  40. package/dist/commands/watch.js.map +1 -1
  41. package/dist/hunt/__tests__/deep-dive.test.js.map +1 -1
  42. package/dist/hunt/__tests__/e2e.test.js.map +1 -1
  43. package/dist/hunt/__tests__/finding-to-template.test.js +10 -1
  44. package/dist/hunt/__tests__/finding-to-template.test.js.map +1 -1
  45. package/dist/hunt/__tests__/orchestrator.test.js.map +1 -1
  46. package/dist/hunt/__tests__/templates.test.js +2 -2
  47. package/dist/hunt/__tests__/triage.test.js.map +1 -1
  48. package/dist/hunt/deep-dive.js +7 -7
  49. package/dist/hunt/deep-dive.js.map +1 -1
  50. package/dist/hunt/parse-utils.d.ts +1 -1
  51. package/dist/hunt/state.js.map +1 -1
  52. package/dist/hunt/templates/injection.js +1 -1
  53. package/dist/hunt/templates/injection.js.map +1 -1
  54. package/dist/hunt/triage.js +5 -5
  55. package/dist/hunt/triage.js.map +1 -1
  56. package/dist/lib/__tests__/arithmetic-quick-test.js +10 -9
  57. package/dist/lib/__tests__/arithmetic-quick-test.js.map +1 -1
  58. package/dist/lib/__tests__/arithmetic-real-llm-test.js +8 -8
  59. package/dist/lib/__tests__/arithmetic-real-llm-test.js.map +1 -1
  60. package/dist/lib/__tests__/formal-verifier-api-misuse.test.js +4 -3
  61. package/dist/lib/__tests__/formal-verifier-api-misuse.test.js.map +1 -1
  62. package/dist/lib/__tests__/formal-verifier-behavioral.test.d.ts +18 -0
  63. package/dist/lib/__tests__/formal-verifier-behavioral.test.js +576 -0
  64. package/dist/lib/__tests__/formal-verifier-behavioral.test.js.map +1 -0
  65. package/dist/lib/__tests__/formal-verifier-claimless-async.test.d.ts +1 -0
  66. package/dist/lib/__tests__/formal-verifier-claimless-async.test.js +154 -0
  67. package/dist/lib/__tests__/formal-verifier-claimless-async.test.js.map +1 -0
  68. package/dist/lib/__tests__/formal-verifier-claimless-quality.test.d.ts +1 -0
  69. package/dist/lib/__tests__/formal-verifier-claimless-quality.test.js +121 -0
  70. package/dist/lib/__tests__/formal-verifier-claimless-quality.test.js.map +1 -0
  71. package/dist/lib/__tests__/formal-verifier-claimless-realworld.test.d.ts +1 -0
  72. package/dist/lib/__tests__/formal-verifier-claimless-realworld.test.js +119 -0
  73. package/dist/lib/__tests__/formal-verifier-claimless-realworld.test.js.map +1 -0
  74. package/dist/lib/__tests__/formal-verifier-claimless.test.d.ts +1 -0
  75. package/dist/lib/__tests__/formal-verifier-claimless.test.js +667 -0
  76. package/dist/lib/__tests__/formal-verifier-claimless.test.js.map +1 -0
  77. package/dist/lib/__tests__/mr-gsm8k-benchmark.js +6 -6
  78. package/dist/lib/__tests__/mr-gsm8k-benchmark.js.map +1 -1
  79. package/dist/lib/__tests__/pr-harvester.test.js.map +1 -1
  80. package/dist/lib/assessment-reporter.d.ts +1 -1
  81. package/dist/lib/assessment-reporter.js +2 -1
  82. package/dist/lib/assessment-reporter.js.map +1 -1
  83. package/dist/lib/chain-analyzer.d.ts +4 -3
  84. package/dist/lib/chain-analyzer.js.map +1 -1
  85. package/dist/lib/formal-verifier.d.ts +20 -1
  86. package/dist/lib/formal-verifier.js +1182 -24
  87. package/dist/lib/formal-verifier.js.map +1 -1
  88. package/dist/lib/issue-reporter.d.ts +2 -1
  89. package/dist/lib/issue-reporter.js.map +1 -1
  90. package/dist/lib/remediation-generator.js.map +1 -1
  91. package/dist/lib/report-generator.js.map +1 -1
  92. package/dist/lib/rule-harvester/ground-truth.js +13 -2
  93. package/dist/lib/rule-harvester/ground-truth.js.map +1 -1
  94. package/dist/lib/rule-harvester/scanner.d.ts +1 -1
  95. package/dist/lib/user-config.d.ts +1 -0
  96. package/dist/lib/user-config.js.map +1 -1
  97. package/dist/realtime/__tests__/entropy-detector.test.d.ts +1 -0
  98. package/dist/realtime/__tests__/entropy-detector.test.js +200 -0
  99. package/dist/realtime/__tests__/entropy-detector.test.js.map +1 -0
  100. package/dist/realtime/__tests__/entropy-live-demo.d.ts +1 -0
  101. package/dist/realtime/__tests__/entropy-live-demo.js +103 -0
  102. package/dist/realtime/__tests__/entropy-live-demo.js.map +1 -0
  103. package/dist/realtime/__tests__/entropy-live.d.ts +8 -0
  104. package/dist/realtime/__tests__/entropy-live.js +114 -0
  105. package/dist/realtime/__tests__/entropy-live.js.map +1 -0
  106. package/dist/realtime/__tests__/streaming-checks.test.js +3 -4
  107. package/dist/realtime/__tests__/streaming-checks.test.js.map +1 -1
  108. package/dist/realtime/entropy-detector.d.ts +143 -0
  109. package/dist/realtime/entropy-detector.js +504 -0
  110. package/dist/realtime/entropy-detector.js.map +1 -0
  111. package/dist/realtime/mcp-server.d.ts +7 -1
  112. package/dist/realtime/mcp-server.js +378 -2
  113. package/dist/realtime/mcp-server.js.map +1 -1
  114. package/dist/realtime/stream-interceptor.d.ts +28 -0
  115. package/dist/realtime/stream-interceptor.js +204 -0
  116. package/dist/realtime/stream-interceptor.js.map +1 -1
  117. package/dist/realtime/streaming-checks.js +28 -0
  118. package/dist/realtime/streaming-checks.js.map +1 -1
  119. package/dist/realtime/streaming-verifier.d.ts +45 -0
  120. package/dist/realtime/streaming-verifier.js +98 -5
  121. package/dist/realtime/streaming-verifier.js.map +1 -1
  122. package/dist/realtime/types.d.ts +56 -0
  123. package/dist/runtime/agents/research-agent.js +10 -1
  124. package/dist/runtime/agents/research-agent.js.map +1 -1
  125. package/dist/runtime/agents/test-agent.js +10 -7
  126. package/dist/runtime/agents/test-agent.js.map +1 -1
  127. package/dist/runtime/composition-verifier.js +13 -3
  128. package/dist/runtime/composition-verifier.js.map +1 -1
  129. package/dist/runtime/fs-helpers.js.map +1 -1
  130. package/dist/runtime/prompt-safety-analyzer.js.map +1 -1
  131. package/dist/sdk/verified-generate.js.map +1 -1
  132. package/dist/types.d.ts +14 -0
  133. package/package.json +3 -2
@@ -0,0 +1,576 @@
1
+ /**
2
+ * Behavioral Claim Type Tests — new formal check types for behavioral claims.
3
+ *
4
+ * Tests for:
5
+ * - feature_presence: detects feature-related terms in code
6
+ * - data_handling: detects data storage/processing patterns
7
+ * - configuration_check: detects configuration patterns
8
+ * - capacity_limit: detects capacity/limit constants
9
+ * - security_control: detects security mechanisms
10
+ * - compliance_check: detects compliance-related patterns
11
+ * - connectivity_check: detects connection/integration patterns
12
+ * - pricing_billing: detects pricing/payment patterns
13
+ * - role_access: detects role/permission patterns
14
+ * - media_processing: detects media processing patterns
15
+ * - subjective_quality: always PASSes (defers to LLM)
16
+ * - requirement_constraint: detects requirement enforcement patterns
17
+ */
18
+ import { describe, it, expect } from 'vitest';
19
+ import { runFormalVerification } from '../formal-verifier.js';
20
+ function makeClaim(overrides = {}) {
21
+ return {
22
+ id: 'test-claim-1',
23
+ category: 'correctness',
24
+ severity: 'medium',
25
+ description: overrides.description ?? 'test claim',
26
+ assertion: overrides.assertion ?? 'test assertion',
27
+ ...overrides,
28
+ };
29
+ }
30
+ function makeLLMVerification(claimId, verdict = 'PASS') {
31
+ return {
32
+ claimId,
33
+ verdict,
34
+ reasoning: 'LLM says it looks correct',
35
+ };
36
+ }
37
+ describe('feature_presence', () => {
38
+ it('PASS: code contains feature-related terms', () => {
39
+ const claim = makeClaim({
40
+ description: 'The Service provides analytics dashboard with charts',
41
+ assertion: 'Analytics dashboard is provided',
42
+ });
43
+ const code = `
44
+ function renderDashboard() {
45
+ const analytics = getAnalytics();
46
+ const charts = buildCharts(analytics);
47
+ return { dashboard: charts };
48
+ }
49
+ `;
50
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
51
+ expect(verifications[0].verdict).toBe('PASS');
52
+ expect(verifications[0].verification_method).toBe('formal');
53
+ });
54
+ it('classifies "supports" claims as feature_presence', () => {
55
+ const claim = makeClaim({
56
+ description: 'The app supports push notifications',
57
+ assertion: 'Push notifications are supported',
58
+ });
59
+ const code = 'function placeholder() {}';
60
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
61
+ expect(verifications[0].verification_method).toBe('formal');
62
+ });
63
+ });
64
+ describe('data_handling', () => {
65
+ it('PASS: code has database operations', () => {
66
+ const claim = makeClaim({
67
+ description: 'Customer data is stored securely in the database',
68
+ assertion: 'Data is stored in database',
69
+ });
70
+ const code = `
71
+ import { db } from './database';
72
+ async function saveCustomer(data: CustomerData) {
73
+ return db.insert('customers', data);
74
+ }
75
+ `;
76
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
77
+ expect(verifications[0].verdict).toBe('PASS');
78
+ expect(verifications[0].verification_method).toBe('formal');
79
+ });
80
+ it('FAIL: code has no data handling patterns', () => {
81
+ const claim = makeClaim({
82
+ description: 'Customer data is stored securely in the database',
83
+ assertion: 'Data is stored in database',
84
+ });
85
+ const code = 'const x = 1 + 2;';
86
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id, 'PASS')]);
87
+ expect(verifications[0].verdict).toBe('FAIL');
88
+ });
89
+ it('classifies "retained" claims as data_handling', () => {
90
+ const claim = makeClaim({
91
+ description: 'Audit logs are retained for 12 months',
92
+ assertion: 'Logs are retained',
93
+ });
94
+ const code = 'function placeholder() {}';
95
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
96
+ expect(verifications[0].verification_method).toBe('formal');
97
+ });
98
+ });
99
+ describe('security_control', () => {
100
+ it('PASS: code has authentication library', () => {
101
+ const claim = makeClaim({
102
+ category: 'security',
103
+ description: 'Users authenticate via JWT tokens',
104
+ assertion: 'JWT authentication is implemented',
105
+ });
106
+ const code = `
107
+ import jwt from 'jsonwebtoken';
108
+ function verifyToken(token: string) {
109
+ return jwt.verify(token, process.env.JWT_SECRET);
110
+ }
111
+ `;
112
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
113
+ expect(verifications[0].verdict).toBe('PASS');
114
+ expect(verifications[0].verification_method).toBe('formal');
115
+ });
116
+ it('classifies SSO claims as security_control', () => {
117
+ const claim = makeClaim({
118
+ category: 'security',
119
+ description: 'SSO supports Okta as an identity provider',
120
+ assertion: 'Okta SSO is supported',
121
+ });
122
+ const code = 'function placeholder() {}';
123
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
124
+ expect(verifications[0].verification_method).toBe('formal');
125
+ });
126
+ });
127
+ describe('capacity_limit', () => {
128
+ it('PASS: code has limit constants', () => {
129
+ const claim = makeClaim({
130
+ description: 'Starter plan supports up to 3 devices',
131
+ assertion: 'Device limit is 3',
132
+ });
133
+ const code = `
134
+ const MAX_DEVICES = 3;
135
+ function canAddDevice(currentCount: number) {
136
+ return currentCount < MAX_DEVICES;
137
+ }
138
+ `;
139
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
140
+ expect(verifications[0].verdict).toBe('PASS');
141
+ expect(verifications[0].verification_method).toBe('formal');
142
+ });
143
+ });
144
+ describe('configuration_check', () => {
145
+ it('PASS: code has config objects', () => {
146
+ const claim = makeClaim({
147
+ description: 'Display duration is configurable per playlist',
148
+ assertion: 'Duration is configurable',
149
+ });
150
+ const code = `
151
+ const config = {
152
+ displayDuration: 5000,
153
+ transition: 'fade',
154
+ };
155
+ `;
156
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
157
+ expect(verifications[0].verdict).toBe('PASS');
158
+ expect(verifications[0].verification_method).toBe('formal');
159
+ });
160
+ });
161
+ describe('compliance_check', () => {
162
+ it('PASS: code has GDPR-related patterns', () => {
163
+ const claim = makeClaim({
164
+ category: 'security',
165
+ description: 'The Service is designed to comply with GDPR',
166
+ assertion: 'GDPR compliance is implemented',
167
+ });
168
+ const code = `
169
+ async function deleteUserData(userId: string) {
170
+ await db.delete('users', userId);
171
+ await audit.log('gdpr_deletion', userId);
172
+ }
173
+ `;
174
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
175
+ expect(verifications[0].verdict).toBe('PASS');
176
+ expect(verifications[0].verification_method).toBe('formal');
177
+ });
178
+ });
179
+ describe('connectivity_check', () => {
180
+ it('PASS: code has WebSocket patterns', () => {
181
+ const claim = makeClaim({
182
+ description: 'Each Device connects via a persistent WebSocket connection',
183
+ assertion: 'WebSocket connection is used',
184
+ });
185
+ const code = `
186
+ const ws = new WebSocket('wss://api.example.com');
187
+ ws.on('message', handleMessage);
188
+ `;
189
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
190
+ expect(verifications[0].verdict).toBe('PASS');
191
+ expect(verifications[0].verification_method).toBe('formal');
192
+ });
193
+ });
194
+ describe('pricing_billing', () => {
195
+ it('classifies pricing claims correctly', () => {
196
+ const claim = makeClaim({
197
+ description: 'Starter plan costs $79/month',
198
+ assertion: 'Price is $79/month',
199
+ });
200
+ const code = 'const STARTER_PRICE = 79;';
201
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
202
+ expect(verifications[0].verification_method).toBe('formal');
203
+ });
204
+ });
205
+ describe('role_access', () => {
206
+ it('PASS: code has role definitions', () => {
207
+ const claim = makeClaim({
208
+ description: 'Admin role has full access excluding billing',
209
+ assertion: 'Admin role access is defined',
210
+ });
211
+ const code = `
212
+ const ROLES = {
213
+ admin: { canEdit: true, canDelete: true, canBill: false },
214
+ viewer: { canEdit: false, canDelete: false, canBill: false },
215
+ };
216
+ `;
217
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
218
+ expect(verifications[0].verdict).toBe('PASS');
219
+ expect(verifications[0].verification_method).toBe('formal');
220
+ });
221
+ });
222
+ describe('media_processing', () => {
223
+ it('PASS: code has image processing', () => {
224
+ const claim = makeClaim({
225
+ description: 'Photo is resized and optimized for display resolution',
226
+ assertion: 'Photos are resized',
227
+ });
228
+ const code = `
229
+ import sharp from 'sharp';
230
+ async function processImage(buffer: Buffer) {
231
+ return sharp(buffer).resize(1080, 1080).jpeg({ quality: 80 }).toBuffer();
232
+ }
233
+ `;
234
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
235
+ expect(verifications[0].verdict).toBe('PASS');
236
+ expect(verifications[0].verification_method).toBe('formal');
237
+ });
238
+ });
239
+ describe('subjective_quality', () => {
240
+ it('always PASSes — defers to code review', () => {
241
+ const claim = makeClaim({
242
+ description: 'The codebase follows best practices',
243
+ assertion: 'Best practices are followed',
244
+ });
245
+ const code = 'const x = 1;';
246
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
247
+ expect(verifications[0].verdict).toBe('PASS');
248
+ expect(verifications[0].verification_method).toBe('formal');
249
+ expect(verifications[0].reasoning).toContain('Subjective');
250
+ });
251
+ });
252
+ describe('requirement_constraint', () => {
253
+ it('classifies "must" claims correctly', () => {
254
+ const claim = makeClaim({
255
+ description: 'Customers must create an account by providing a valid email address',
256
+ assertion: 'Account creation requires email',
257
+ });
258
+ const code = 'function placeholder() {}';
259
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
260
+ expect(verifications[0].verification_method).toBe('formal');
261
+ });
262
+ it('classifies "is not sold" claims correctly', () => {
263
+ const claim = makeClaim({
264
+ category: 'security',
265
+ description: 'End User data is not sold to any third party',
266
+ assertion: 'Data is not sold',
267
+ });
268
+ const code = 'function placeholder() {}';
269
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
270
+ expect(verifications[0].verification_method).toBe('formal');
271
+ });
272
+ it('PASS: code has constraint enforcement', () => {
273
+ const claim = makeClaim({
274
+ description: 'Password must meet minimum security requirements (minimum 12 characters)',
275
+ assertion: 'Password has minimum length',
276
+ });
277
+ const code = `
278
+ function validatePassword(password: string) {
279
+ if (password.length < 12) {
280
+ throw new Error('Password must be at least 12 characters');
281
+ }
282
+ }
283
+ `;
284
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
285
+ expect(verifications[0].verdict).toBe('PASS');
286
+ expect(verifications[0].verification_method).toBe('formal');
287
+ });
288
+ });
289
+ describe('classification priority', () => {
290
+ it('error_handling takes priority over feature_presence for "provides error handling"', () => {
291
+ const claim = makeClaim({
292
+ description: 'The module provides error handling for all API calls',
293
+ assertion: 'Error handling is provided',
294
+ });
295
+ const code = `
296
+ try {
297
+ await fetch('/api/data');
298
+ } catch (error) {
299
+ console.error(error);
300
+ }
301
+ `;
302
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
303
+ expect(verifications[0].verdict).toBe('PASS');
304
+ expect(verifications[0].reasoning).toContain('Error handling found');
305
+ });
306
+ it('security_control takes priority over feature_presence for "supports OAuth"', () => {
307
+ const claim = makeClaim({
308
+ category: 'security',
309
+ description: 'The system supports OAuth 2.0 authentication',
310
+ assertion: 'OAuth authentication is supported',
311
+ });
312
+ const code = `
313
+ import passport from 'passport';
314
+ const oauth = passport.authenticate('oauth2');
315
+ `;
316
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
317
+ expect(verifications[0].verdict).toBe('PASS');
318
+ expect(verifications[0].reasoning).toContain('Security controls found');
319
+ });
320
+ it('data_handling takes priority over feature_presence for "provides data export"', () => {
321
+ const claim = makeClaim({
322
+ description: 'The service provides data export functionality',
323
+ assertion: 'Data export is available',
324
+ });
325
+ const code = `
326
+ function exportData(format: string) {
327
+ const data = db.query('SELECT * FROM users');
328
+ return JSON.stringify(data);
329
+ }
330
+ `;
331
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
332
+ expect(verifications[0].verdict).toBe('PASS');
333
+ expect(verifications[0].reasoning).toContain('Data handling found');
334
+ });
335
+ it('role_access takes priority over pricing_billing for "access excluding billing"', () => {
336
+ const claim = makeClaim({
337
+ description: 'Admin role has full access excluding billing',
338
+ assertion: 'Admin role access is defined',
339
+ });
340
+ const code = `
341
+ const roles = {
342
+ admin: { permissions: ['read', 'write', 'delete'], billing: false },
343
+ };
344
+ `;
345
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
346
+ expect(verifications[0].verdict).toBe('PASS');
347
+ expect(verifications[0].reasoning).toContain('Role/access');
348
+ });
349
+ it('undefined_reference takes priority over arithmetic for "references variable for calculations"', () => {
350
+ const claim = makeClaim({
351
+ description: 'references variable Math for calculations',
352
+ assertion: 'Math is used',
353
+ });
354
+ const code = `
355
+ const x = 4;
356
+ const y = 9;
357
+ const z = Math.sqrt(y);
358
+ const result = x + z;
359
+ `;
360
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id)]);
361
+ expect(verifications[0].verdict).toBe('PASS');
362
+ expect(verifications[0].reasoning).toContain('built-in');
363
+ });
364
+ });
365
+ describe('behavioral checker FAIL cases', () => {
366
+ it('security_control: FAIL when code has no security patterns', () => {
367
+ const claim = makeClaim({
368
+ category: 'security',
369
+ description: 'Users authenticate via JWT tokens',
370
+ assertion: 'JWT authentication is implemented',
371
+ });
372
+ const code = 'const x = 1 + 2;';
373
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id, 'PASS')]);
374
+ expect(verifications[0].verdict).toBe('FAIL');
375
+ });
376
+ it('connectivity_check: FAIL when code has no connection patterns', () => {
377
+ const claim = makeClaim({
378
+ description: 'Each Device connects via a persistent WebSocket connection',
379
+ assertion: 'WebSocket connection is used',
380
+ });
381
+ const code = 'const x = 1 + 2;';
382
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id, 'PASS')]);
383
+ expect(verifications[0].verdict).toBe('FAIL');
384
+ });
385
+ it('compliance_check: FAIL when code has no compliance patterns', () => {
386
+ const claim = makeClaim({
387
+ category: 'security',
388
+ description: 'The Service is designed to comply with GDPR',
389
+ assertion: 'GDPR compliance is implemented',
390
+ });
391
+ const code = 'const x = 1 + 2;';
392
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id, 'PASS')]);
393
+ expect(verifications[0].verdict).toBe('FAIL');
394
+ });
395
+ it('capacity_limit: FAIL when code has no limit patterns', () => {
396
+ const claim = makeClaim({
397
+ description: 'Starter plan supports up to 3 devices',
398
+ assertion: 'Device limit is 3',
399
+ });
400
+ const code = 'const x = 1 + 2;';
401
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id, 'PASS')]);
402
+ expect(verifications[0].verdict).toBe('FAIL');
403
+ });
404
+ it('configuration_check: FAIL when code has no config patterns', () => {
405
+ const claim = makeClaim({
406
+ description: 'Display duration is configurable per playlist',
407
+ assertion: 'Duration is configurable',
408
+ });
409
+ const code = 'const x = 1 + 2;';
410
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id, 'PASS')]);
411
+ expect(verifications[0].verdict).toBe('FAIL');
412
+ });
413
+ it('media_processing: FAIL when code has no media patterns', () => {
414
+ const claim = makeClaim({
415
+ description: 'Photo is resized and optimized for display resolution',
416
+ assertion: 'Photos are resized',
417
+ });
418
+ const code = 'const x = 1 + 2;';
419
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id, 'PASS')]);
420
+ expect(verifications[0].verdict).toBe('FAIL');
421
+ });
422
+ it('pricing_billing: FAIL when code has no pricing patterns', () => {
423
+ const claim = makeClaim({
424
+ description: 'Starter plan costs $79/month',
425
+ assertion: 'Price is $79/month',
426
+ });
427
+ const code = 'const x = 1 + 2;';
428
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id, 'PASS')]);
429
+ expect(verifications[0].verdict).toBe('FAIL');
430
+ });
431
+ it('role_access: FAIL when code has no role patterns', () => {
432
+ const claim = makeClaim({
433
+ description: 'Viewer role has read-only dashboard access',
434
+ assertion: 'Viewer role is defined',
435
+ });
436
+ const code = 'const x = 1 + 2;';
437
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id, 'PASS')]);
438
+ expect(verifications[0].verdict).toBe('FAIL');
439
+ });
440
+ it('requirement_constraint: FAIL when code has no constraint patterns', () => {
441
+ const claim = makeClaim({
442
+ description: 'Password must meet minimum security requirements (minimum 12 characters)',
443
+ assertion: 'Password has minimum length',
444
+ });
445
+ const code = 'const x = 1 + 2;';
446
+ const { verifications } = runFormalVerification(code, 'typescript', [claim], [makeLLMVerification(claim.id, 'PASS')]);
447
+ expect(verifications[0].verdict).toBe('FAIL');
448
+ });
449
+ });
450
+ describe('multi-language error handling', () => {
451
+ it('PASS: Go error handling with err != nil', () => {
452
+ const claim = makeClaim({
453
+ description: 'The function handles errors gracefully',
454
+ assertion: 'Errors are handled',
455
+ });
456
+ const code = `
457
+ func readFile(path string) ([]byte, error) {
458
+ data, err := os.ReadFile(path)
459
+ if err != nil {
460
+ return nil, fmt.Errorf("failed to read: %w", err)
461
+ }
462
+ return data, nil
463
+ }
464
+ `;
465
+ const { verifications } = runFormalVerification(code, 'go', [claim], [makeLLMVerification(claim.id)]);
466
+ expect(verifications[0].verdict).toBe('PASS');
467
+ expect(verifications[0].reasoning).toContain('if err != nil');
468
+ });
469
+ it('PASS: Rust error handling with ? operator', () => {
470
+ const claim = makeClaim({
471
+ description: 'The function handles errors with Result types',
472
+ assertion: 'Errors are handled via Result',
473
+ });
474
+ const code = `
475
+ fn read_config(path: &str) -> Result<Config, Box<dyn Error>> {
476
+ let content = fs::read_to_string(path)?;
477
+ let config: Config = serde_json::from_str(&content)?;
478
+ Ok(config)
479
+ }
480
+ `;
481
+ const { verifications } = runFormalVerification(code, 'rust', [claim], [makeLLMVerification(claim.id)]);
482
+ expect(verifications[0].verdict).toBe('PASS');
483
+ expect(verifications[0].reasoning).toContain('? operator');
484
+ });
485
+ it('PASS: Python error handling with try/except', () => {
486
+ const claim = makeClaim({
487
+ description: 'The function catches exceptions properly',
488
+ assertion: 'Exceptions are caught',
489
+ });
490
+ const code = `
491
+ def parse_data(raw):
492
+ try:
493
+ return json.loads(raw)
494
+ except json.JSONDecodeError as e:
495
+ logging.error(f"Failed to parse: {e}")
496
+ return None
497
+ `;
498
+ const { verifications } = runFormalVerification(code, 'python', [claim], [makeLLMVerification(claim.id)]);
499
+ expect(verifications[0].verdict).toBe('PASS');
500
+ expect(verifications[0].reasoning).toContain('try/except');
501
+ });
502
+ });
503
+ describe('multi-language null handling', () => {
504
+ it('PASS: Rust Option handling with if let Some', () => {
505
+ const claim = makeClaim({
506
+ description: 'Handles null values using Option type',
507
+ assertion: 'Null values are handled',
508
+ });
509
+ const code = `
510
+ fn get_name(user: &Option<User>) -> String {
511
+ if let Some(u) = user {
512
+ u.name.clone()
513
+ } else {
514
+ String::from("unknown")
515
+ }
516
+ }
517
+ `;
518
+ const { verifications } = runFormalVerification(code, 'rust', [claim], [makeLLMVerification(claim.id)]);
519
+ expect(verifications[0].verdict).toBe('PASS');
520
+ expect(verifications[0].reasoning).toContain('if let Some');
521
+ });
522
+ it('PASS: Go nil check', () => {
523
+ const claim = makeClaim({
524
+ description: 'Checks for null pointer before use',
525
+ assertion: 'Null check is performed',
526
+ });
527
+ const code = `
528
+ func process(data *Data) error {
529
+ if data == nil {
530
+ return errors.New("data is nil")
531
+ }
532
+ return data.Process()
533
+ }
534
+ `;
535
+ const { verifications } = runFormalVerification(code, 'go', [claim], [makeLLMVerification(claim.id)]);
536
+ expect(verifications[0].verdict).toBe('PASS');
537
+ expect(verifications[0].reasoning).toContain('nil check');
538
+ });
539
+ });
540
+ describe('multi-language type annotations', () => {
541
+ it('PASS: Go typed function', () => {
542
+ const claim = makeClaim({
543
+ description: 'All function parameters have type annotations',
544
+ assertion: 'Parameters are typed',
545
+ });
546
+ const code = `
547
+ func calculateTotal(items []Item, taxRate float64) (float64, error) {
548
+ var total float64
549
+ for _, item := range items {
550
+ total += item.Price
551
+ }
552
+ return total * (1 + taxRate), nil
553
+ }
554
+ `;
555
+ const { verifications } = runFormalVerification(code, 'go', [claim], [makeLLMVerification(claim.id)]);
556
+ expect(verifications[0].verdict).toBe('PASS');
557
+ expect(verifications[0].reasoning).toContain('typed function');
558
+ });
559
+ it('PASS: Rust typed function with generics', () => {
560
+ const claim = makeClaim({
561
+ description: 'Return types are explicitly declared',
562
+ assertion: 'Return types exist',
563
+ });
564
+ const code = `
565
+ fn parse_items<T: FromStr>(input: &str) -> Vec<T> {
566
+ input.split(',')
567
+ .filter_map(|s| s.trim().parse().ok())
568
+ .collect()
569
+ }
570
+ `;
571
+ const { verifications } = runFormalVerification(code, 'rust', [claim], [makeLLMVerification(claim.id)]);
572
+ expect(verifications[0].verdict).toBe('PASS');
573
+ expect(verifications[0].reasoning).toContain('typed function');
574
+ });
575
+ });
576
+ //# sourceMappingURL=formal-verifier-behavioral.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formal-verifier-behavioral.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/formal-verifier-behavioral.test.ts"],"names":[],"mappings":"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"}