tryassay 0.28.2 → 0.30.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 (93) hide show
  1. package/dist/cli.js +10 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/assess.js +4 -2
  4. package/dist/commands/assess.js.map +1 -1
  5. package/dist/commands/generate.js +1 -0
  6. package/dist/commands/generate.js.map +1 -1
  7. package/dist/commands/harvest.d.ts +9 -0
  8. package/dist/commands/harvest.js +76 -0
  9. package/dist/commands/harvest.js.map +1 -0
  10. package/dist/lib/__tests__/learned-rules.test.d.ts +1 -0
  11. package/dist/lib/__tests__/learned-rules.test.js +260 -0
  12. package/dist/lib/__tests__/learned-rules.test.js.map +1 -0
  13. package/dist/lib/__tests__/pr-harvester-types.test.d.ts +1 -0
  14. package/dist/lib/__tests__/pr-harvester-types.test.js +43 -0
  15. package/dist/lib/__tests__/pr-harvester-types.test.js.map +1 -0
  16. package/dist/lib/__tests__/pr-harvester.test.d.ts +1 -0
  17. package/dist/lib/__tests__/pr-harvester.test.js +341 -0
  18. package/dist/lib/__tests__/pr-harvester.test.js.map +1 -0
  19. package/dist/lib/__tests__/rule-harvester.test.d.ts +1 -0
  20. package/dist/lib/__tests__/rule-harvester.test.js +526 -0
  21. package/dist/lib/__tests__/rule-harvester.test.js.map +1 -0
  22. package/dist/lib/claim-extractor.d.ts +1 -0
  23. package/dist/lib/claim-extractor.js +116 -15
  24. package/dist/lib/claim-extractor.js.map +1 -1
  25. package/dist/lib/code-verifier.d.ts +12 -1
  26. package/dist/lib/code-verifier.js +155 -12
  27. package/dist/lib/code-verifier.js.map +1 -1
  28. package/dist/lib/learned-rules/category-map.d.ts +28 -0
  29. package/dist/lib/learned-rules/category-map.js +110 -0
  30. package/dist/lib/learned-rules/category-map.js.map +1 -0
  31. package/dist/lib/learned-rules/index.d.ts +105 -0
  32. package/dist/lib/learned-rules/index.js +198 -0
  33. package/dist/lib/learned-rules/index.js.map +1 -0
  34. package/dist/lib/learned-rules/learned-catalog.d.ts +62 -0
  35. package/dist/lib/learned-rules/learned-catalog.js +161 -0
  36. package/dist/lib/learned-rules/learned-catalog.js.map +1 -0
  37. package/dist/lib/learned-rules/pattern-extractor.d.ts +25 -0
  38. package/dist/lib/learned-rules/pattern-extractor.js +351 -0
  39. package/dist/lib/learned-rules/pattern-extractor.js.map +1 -0
  40. package/dist/lib/learned-rules/rule-codifier.d.ts +41 -0
  41. package/dist/lib/learned-rules/rule-codifier.js +138 -0
  42. package/dist/lib/learned-rules/rule-codifier.js.map +1 -0
  43. package/dist/lib/learned-rules/starter-catalog.d.ts +16 -0
  44. package/dist/lib/learned-rules/starter-catalog.js +402 -0
  45. package/dist/lib/learned-rules/starter-catalog.js.map +1 -0
  46. package/dist/lib/learned-rules/types.d.ts +196 -0
  47. package/dist/lib/learned-rules/types.js +9 -0
  48. package/dist/lib/learned-rules/types.js.map +1 -0
  49. package/dist/lib/learned-rules/validation-harness.d.ts +26 -0
  50. package/dist/lib/learned-rules/validation-harness.js +260 -0
  51. package/dist/lib/learned-rules/validation-harness.js.map +1 -0
  52. package/dist/lib/llm-provider.d.ts +7 -0
  53. package/dist/lib/llm-provider.js +99 -6
  54. package/dist/lib/llm-provider.js.map +1 -1
  55. package/dist/lib/rule-harvester/diff-parser.d.ts +9 -0
  56. package/dist/lib/rule-harvester/diff-parser.js +77 -0
  57. package/dist/lib/rule-harvester/diff-parser.js.map +1 -0
  58. package/dist/lib/rule-harvester/file-selector.d.ts +10 -0
  59. package/dist/lib/rule-harvester/file-selector.js +59 -0
  60. package/dist/lib/rule-harvester/file-selector.js.map +1 -0
  61. package/dist/lib/rule-harvester/ground-truth.d.ts +19 -0
  62. package/dist/lib/rule-harvester/ground-truth.js +156 -0
  63. package/dist/lib/rule-harvester/ground-truth.js.map +1 -0
  64. package/dist/lib/rule-harvester/harvest.d.ts +26 -0
  65. package/dist/lib/rule-harvester/harvest.js +307 -0
  66. package/dist/lib/rule-harvester/harvest.js.map +1 -0
  67. package/dist/lib/rule-harvester/pr-discovery.d.ts +49 -0
  68. package/dist/lib/rule-harvester/pr-discovery.js +168 -0
  69. package/dist/lib/rule-harvester/pr-discovery.js.map +1 -0
  70. package/dist/lib/rule-harvester/pr-harvest.d.ts +53 -0
  71. package/dist/lib/rule-harvester/pr-harvest.js +326 -0
  72. package/dist/lib/rule-harvester/pr-harvest.js.map +1 -0
  73. package/dist/lib/rule-harvester/progress.d.ts +13 -0
  74. package/dist/lib/rule-harvester/progress.js +50 -0
  75. package/dist/lib/rule-harvester/progress.js.map +1 -0
  76. package/dist/lib/rule-harvester/reporter.d.ts +35 -0
  77. package/dist/lib/rule-harvester/reporter.js +46 -0
  78. package/dist/lib/rule-harvester/reporter.js.map +1 -0
  79. package/dist/lib/rule-harvester/rule-generalizer.d.ts +25 -0
  80. package/dist/lib/rule-harvester/rule-generalizer.js +135 -0
  81. package/dist/lib/rule-harvester/rule-generalizer.js.map +1 -0
  82. package/dist/lib/rule-harvester/scanner.d.ts +20 -0
  83. package/dist/lib/rule-harvester/scanner.js +37 -0
  84. package/dist/lib/rule-harvester/scanner.js.map +1 -0
  85. package/dist/runtime/types.d.ts +1 -1
  86. package/dist/sdk/forward-verify.d.ts +3 -1
  87. package/dist/sdk/forward-verify.js +68 -5
  88. package/dist/sdk/forward-verify.js.map +1 -1
  89. package/dist/sdk/index.d.ts +1 -1
  90. package/dist/sdk/index.js +7 -5
  91. package/dist/sdk/index.js.map +1 -1
  92. package/dist/sdk/types.d.ts +21 -0
  93. package/package.json +1 -1
@@ -0,0 +1,35 @@
1
+ export interface ScanFileResult {
2
+ repo: string;
3
+ filePath: string;
4
+ claimsExtracted: number;
5
+ confirmed: number;
6
+ rulesLearned: number;
7
+ rulesRejected: number;
8
+ rulesDuplicate: number;
9
+ unmatchedCategories: string[];
10
+ durationMs: number;
11
+ }
12
+ export interface RunReport {
13
+ timestamp: string;
14
+ model: string;
15
+ reposScanned: number;
16
+ filesScanned: number;
17
+ claimsExtracted: number;
18
+ findingsConfirmed: number;
19
+ rulesLearned: number;
20
+ rulesRejected: number;
21
+ rulesDuplicate: number;
22
+ unmatchedCategories: Record<string, number>;
23
+ durationMinutes: number;
24
+ catalogSize: {
25
+ total: number;
26
+ promoted: number;
27
+ rejected: number;
28
+ };
29
+ }
30
+ export declare function createRunReport(fileResults: ScanFileResult[], model: string, catalogSize: {
31
+ total: number;
32
+ promoted: number;
33
+ rejected: number;
34
+ }): RunReport;
35
+ export declare function saveRunReport(runsDir: string, report: RunReport): Promise<string>;
@@ -0,0 +1,46 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ export function createRunReport(fileResults, model, catalogSize) {
4
+ const uniqueRepos = new Set(fileResults.map((r) => r.repo));
5
+ let claimsExtracted = 0;
6
+ let findingsConfirmed = 0;
7
+ let rulesLearned = 0;
8
+ let rulesRejected = 0;
9
+ let rulesDuplicate = 0;
10
+ let totalDurationMs = 0;
11
+ const unmatchedCategories = {};
12
+ for (const result of fileResults) {
13
+ claimsExtracted += result.claimsExtracted;
14
+ findingsConfirmed += result.confirmed;
15
+ rulesLearned += result.rulesLearned;
16
+ rulesRejected += result.rulesRejected;
17
+ rulesDuplicate += result.rulesDuplicate;
18
+ totalDurationMs += result.durationMs;
19
+ for (const category of result.unmatchedCategories) {
20
+ unmatchedCategories[category] = (unmatchedCategories[category] ?? 0) + 1;
21
+ }
22
+ }
23
+ return {
24
+ timestamp: new Date().toISOString(),
25
+ model,
26
+ reposScanned: uniqueRepos.size,
27
+ filesScanned: fileResults.length,
28
+ claimsExtracted,
29
+ findingsConfirmed,
30
+ rulesLearned,
31
+ rulesRejected,
32
+ rulesDuplicate,
33
+ unmatchedCategories,
34
+ durationMinutes: totalDurationMs / 60_000,
35
+ catalogSize,
36
+ };
37
+ }
38
+ export async function saveRunReport(runsDir, report) {
39
+ await mkdir(runsDir, { recursive: true });
40
+ // Replace : and . with - to make a safe filename
41
+ const safeName = report.timestamp.replace(/[:.]/g, '-');
42
+ const filePath = join(runsDir, `${safeName}.json`);
43
+ await writeFile(filePath, JSON.stringify(report, null, 2), 'utf-8');
44
+ return filePath;
45
+ }
46
+ //# sourceMappingURL=reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../../src/lib/rule-harvester/reporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA6BjC,MAAM,UAAU,eAAe,CAC7B,WAA6B,EAC7B,KAAa,EACb,WAAkE;IAElE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAE5D,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,MAAM,mBAAmB,GAA2B,EAAE,CAAC;IAEvD,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QACjC,eAAe,IAAI,MAAM,CAAC,eAAe,CAAC;QAC1C,iBAAiB,IAAI,MAAM,CAAC,SAAS,CAAC;QACtC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC;QACpC,aAAa,IAAI,MAAM,CAAC,aAAa,CAAC;QACtC,cAAc,IAAI,MAAM,CAAC,cAAc,CAAC;QACxC,eAAe,IAAI,MAAM,CAAC,UAAU,CAAC;QAErC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAClD,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,KAAK;QACL,YAAY,EAAE,WAAW,CAAC,IAAI;QAC9B,YAAY,EAAE,WAAW,CAAC,MAAM;QAChC,eAAe;QACf,iBAAiB;QACjB,YAAY;QACZ,aAAa;QACb,cAAc;QACd,mBAAmB;QACnB,eAAe,EAAE,eAAe,GAAG,MAAM;QACzC,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe,EAAE,MAAiB;IACpE,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,iDAAiD;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;IAEnD,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAEpE,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Rule Generalizer — Uses LLM to generalize PR diff hunks into reusable
3
+ * code quality rules for the Assay catalog.
4
+ *
5
+ * Given a before/after diff hunk (and optional reviewer comment), the LLM
6
+ * produces a GeneralizedRule with detection regex, fix description, severity,
7
+ * and provenance. The rule is then mapped to an ExtractedPattern for catalog
8
+ * ingestion.
9
+ */
10
+ import type { DiffHunk, GeneralizedRule } from '../learned-rules/types.js';
11
+ import type { ExtractedPattern } from '../learned-rules/types.js';
12
+ /**
13
+ * Build the user prompt for the LLM generalization call.
14
+ */
15
+ export declare function buildGeneralizationPrompt(hunk: DiffHunk, repo: string, prNumber: number, prTitle: string, reviewComment?: string): string;
16
+ /**
17
+ * Call the LLM to generalize a diff hunk into a reusable rule.
18
+ * Returns null if the hunk is too context-specific, parse fails,
19
+ * or all retries are exhausted.
20
+ */
21
+ export declare function generalizeHunk(hunk: DiffHunk, repo: string, prNumber: number, prTitle: string, reviewComment?: string): Promise<GeneralizedRule | null>;
22
+ /**
23
+ * Map a GeneralizedRule to an ExtractedPattern for catalog ingestion.
24
+ */
25
+ export declare function mapToExtractedPattern(rule: GeneralizedRule, patternId: string): ExtractedPattern;
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Rule Generalizer — Uses LLM to generalize PR diff hunks into reusable
3
+ * code quality rules for the Assay catalog.
4
+ *
5
+ * Given a before/after diff hunk (and optional reviewer comment), the LLM
6
+ * produces a GeneralizedRule with detection regex, fix description, severity,
7
+ * and provenance. The rule is then mapped to an ExtractedPattern for catalog
8
+ * ingestion.
9
+ */
10
+ import { getProvider } from '../llm-provider.js';
11
+ import { normalizeCategory } from '../learned-rules/category-map.js';
12
+ const SYSTEM_PROMPT = `You are a code quality pattern extractor. Given a before/after code diff from a merged PR, generalize the fix into a reusable detection rule.
13
+
14
+ Respond with a JSON object (no markdown, no explanation) with these fields:
15
+ - category: string — bug category (e.g., "null-safety", "error-handling", "type-safety", "security", "performance")
16
+ - severity: "low" | "medium" | "high" | "critical"
17
+ - description: string — human-readable description of the pattern
18
+ - detection: { pattern: string (regex), language: string }
19
+ - fix: { description: string, pattern: string (regex replacement) }
20
+ - fileGlob: string — glob for files to scan (e.g., "**/*.ts")
21
+ - matchBehavior: "presence_is_bad" | "absence_is_bad"
22
+ - evidenceTemplate: string — template using {match}, {file}, {line}
23
+
24
+ If the change is too context-specific to generalize (e.g., a variable rename, config tweak, or purely cosmetic), respond with: {"skip": true}
25
+
26
+ Respond with JSON only.`;
27
+ /**
28
+ * Build the user prompt for the LLM generalization call.
29
+ */
30
+ export function buildGeneralizationPrompt(hunk, repo, prNumber, prTitle, reviewComment) {
31
+ const before = hunk.removedLines.join('\n');
32
+ const after = hunk.addedLines.join('\n');
33
+ const ctx = hunk.context.length > 0
34
+ ? `\nSurrounding context:\n${hunk.context.join('\n')}`
35
+ : '';
36
+ let prompt = `Repository: ${repo}
37
+ PR #${prNumber}: ${prTitle}
38
+ File: ${hunk.file} (line ${hunk.startLine})
39
+
40
+ Before:
41
+ ${before}
42
+
43
+ After:
44
+ ${after}${ctx}`;
45
+ if (reviewComment) {
46
+ prompt += `\n\nReviewer comment:\n${reviewComment}`;
47
+ }
48
+ return prompt;
49
+ }
50
+ /**
51
+ * Call the LLM to generalize a diff hunk into a reusable rule.
52
+ * Returns null if the hunk is too context-specific, parse fails,
53
+ * or all retries are exhausted.
54
+ */
55
+ export async function generalizeHunk(hunk, repo, prNumber, prTitle, reviewComment) {
56
+ const provider = getProvider();
57
+ const model = process.env.ASSAY_OLLAMA_MODEL ?? 'qwen3.5:122b';
58
+ const userPrompt = buildGeneralizationPrompt(hunk, repo, prNumber, prTitle, reviewComment);
59
+ const MAX_RETRIES = 3;
60
+ const BASE_DELAY_MS = 2000;
61
+ for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
62
+ try {
63
+ const result = await Promise.race([
64
+ provider.complete({
65
+ model,
66
+ systemPrompt: SYSTEM_PROMPT,
67
+ userPrompt,
68
+ maxTokens: 2000,
69
+ }),
70
+ new Promise((_, reject) => setTimeout(() => reject(new Error('LLM timeout')), 60_000)),
71
+ ]);
72
+ const parsed = JSON.parse(result.content);
73
+ // Skip response — hunk is too context-specific
74
+ if (parsed.skip)
75
+ return null;
76
+ // Validate required fields
77
+ if (!parsed.category ||
78
+ !parsed.description ||
79
+ !parsed.detection?.pattern ||
80
+ !parsed.detection?.language) {
81
+ throw new Error('Missing required fields in LLM response');
82
+ }
83
+ const rule = {
84
+ category: parsed.category,
85
+ severity: parsed.severity ?? 'medium',
86
+ description: parsed.description,
87
+ detection: {
88
+ pattern: parsed.detection.pattern,
89
+ language: parsed.detection.language,
90
+ },
91
+ fix: {
92
+ description: parsed.fix?.description ?? '',
93
+ pattern: parsed.fix?.pattern ?? '',
94
+ },
95
+ fileGlob: parsed.fileGlob ?? '',
96
+ matchBehavior: parsed.matchBehavior ?? 'presence_is_bad',
97
+ evidenceTemplate: parsed.evidenceTemplate ?? '{match} in {file}',
98
+ provenance: {
99
+ repo,
100
+ pr: prNumber,
101
+ file: hunk.file,
102
+ ...(reviewComment ? { reviewComment } : {}),
103
+ },
104
+ };
105
+ return rule;
106
+ }
107
+ catch {
108
+ // Exponential backoff before retry
109
+ if (attempt < MAX_RETRIES - 1) {
110
+ await new Promise((resolve) => setTimeout(resolve, BASE_DELAY_MS * Math.pow(2, attempt)));
111
+ }
112
+ }
113
+ }
114
+ return null;
115
+ }
116
+ /**
117
+ * Map a GeneralizedRule to an ExtractedPattern for catalog ingestion.
118
+ */
119
+ export function mapToExtractedPattern(rule, patternId) {
120
+ // Coerce 'low' to 'medium' — ExtractedPattern doesn't support 'low'
121
+ const severity = rule.severity === 'low' ? 'medium' : rule.severity;
122
+ return {
123
+ id: patternId,
124
+ description: rule.description,
125
+ kind: 'regex',
126
+ languages: [rule.detection.language],
127
+ regexPattern: rule.detection.pattern,
128
+ fileGlob: rule.fileGlob || '**/*.{ts,tsx,js,jsx}',
129
+ matchBehavior: rule.matchBehavior,
130
+ claimCategory: normalizeCategory(rule.category),
131
+ severity,
132
+ evidenceTemplate: rule.evidenceTemplate,
133
+ };
134
+ }
135
+ //# sourceMappingURL=rule-generalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-generalizer.js","sourceRoot":"","sources":["../../../src/lib/rule-harvester/rule-generalizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { CodeClaim, ClaimVerification } from '../../sdk/types.js';
2
+ export interface ScanFailure {
3
+ claimId: string;
4
+ category: string;
5
+ severity: string;
6
+ description: string;
7
+ assertion: string;
8
+ reasoning: string;
9
+ method: 'formal' | 'llm';
10
+ }
11
+ export interface ScanResult {
12
+ totalClaims: number;
13
+ failures: ScanFailure[];
14
+ }
15
+ export declare function buildScanResult(claims: CodeClaim[], verifications: ClaimVerification[]): ScanResult;
16
+ export declare function scanFile(code: string, language: string): Promise<{
17
+ result: ScanResult;
18
+ claims: CodeClaim[];
19
+ verifications: ClaimVerification[];
20
+ }>;
@@ -0,0 +1,37 @@
1
+ import { extractCodeClaims, verifyCodeClaims, applyFormalVerification, } from '../../sdk/forward-verify.js';
2
+ export function buildScanResult(claims, verifications) {
3
+ const claimById = new Map(claims.map((c) => [c.id, c]));
4
+ const failures = verifications
5
+ .filter((v) => v.verdict === 'FAIL' || v.verdict === 'PARTIAL')
6
+ .map((v) => {
7
+ const claim = claimById.get(v.claimId);
8
+ return {
9
+ claimId: v.claimId,
10
+ category: claim?.category ?? 'unknown',
11
+ severity: claim?.severity ?? 'unknown',
12
+ description: claim?.description ?? '',
13
+ assertion: claim?.assertion ?? '',
14
+ reasoning: v.reasoning,
15
+ method: v.method,
16
+ };
17
+ });
18
+ return { totalClaims: claims.length, failures };
19
+ }
20
+ export async function scanFile(code, language) {
21
+ const { claims } = await extractCodeClaims(code, language);
22
+ if (claims.length === 0) {
23
+ return {
24
+ result: { totalClaims: 0, failures: [] },
25
+ claims: [],
26
+ verifications: [],
27
+ };
28
+ }
29
+ const { verifications: llmVerifications } = await verifyCodeClaims(code, language, claims);
30
+ const { verifications } = applyFormalVerification(code, language, claims, llmVerifications);
31
+ return {
32
+ result: buildScanResult(claims, verifications),
33
+ claims,
34
+ verifications,
35
+ };
36
+ }
37
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../src/lib/rule-harvester/scanner.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AAiBrC,MAAM,UAAU,eAAe,CAC7B,MAAmB,EACnB,aAAkC;IAElC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAoB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3E,MAAM,QAAQ,GAAkB,aAAa;SAC1C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC;SAC9D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO;YACL,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,QAAQ,EAAE,KAAK,EAAE,QAAQ,IAAI,SAAS;YACtC,QAAQ,EAAE,KAAK,EAAE,QAAQ,IAAI,SAAS;YACtC,WAAW,EAAE,KAAK,EAAE,WAAW,IAAI,EAAE;YACrC,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE;YACjC,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,MAAM,EAAE,CAAC,CAAC,MAAM;SACjB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAY,EACZ,QAAgB;IAMhB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE3D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;YACxC,MAAM,EAAE,EAAE;YACV,aAAa,EAAE,EAAE;SAClB,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE3F,MAAM,EAAE,aAAa,EAAE,GAAG,uBAAuB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAE5F,OAAO;QACL,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,aAAa,CAAC;QAC9C,MAAM;QACN,aAAa;KACd,CAAC;AACJ,CAAC"}
@@ -1792,7 +1792,7 @@ export interface PromptGuardResult {
1792
1792
  }
1793
1793
  export type TaskCategory = 'scaffolding' | 'code_generation' | 'verification' | 'planning' | 'repair' | 'testing';
1794
1794
  export type ModelTier = 'fast' | 'standard' | 'advanced';
1795
- export type LLMProviderType = 'api' | 'cli';
1795
+ export type LLMProviderType = 'api' | 'cli' | 'ollama';
1796
1796
  export interface LLMCompletionOptions {
1797
1797
  readonly model: string;
1798
1798
  readonly systemPrompt: string;
@@ -1,3 +1,4 @@
1
+ import { ScanSession } from '../lib/learned-rules/index.js';
1
2
  import type { CodeClaim, ClaimVerification, FormalStats, VerificationResult } from './types.js';
2
3
  export declare function extractCodeClaims(code: string, language: string, context?: string): Promise<{
3
4
  claims: CodeClaim[];
@@ -13,7 +14,8 @@ export declare function applyFormalVerification(code: string, language: string,
13
14
  verifications: ClaimVerification[];
14
15
  formalStats: FormalStats;
15
16
  };
16
- export declare function forwardVerify(code: string, language: string, context?: string): Promise<{
17
+ export { ScanSession, type ScanSessionStats } from '../lib/learned-rules/index.js';
18
+ export declare function forwardVerify(code: string, language: string, context?: string, session?: ScanSession): Promise<{
17
19
  result: VerificationResult;
18
20
  inputTokens: number;
19
21
  outputTokens: number;
@@ -1,6 +1,7 @@
1
1
  import { MODEL } from '../lib/anthropic.js';
2
2
  import { getProvider } from '../lib/llm-provider.js';
3
3
  import { runFormalVerification, } from '../lib/formal-verifier.js';
4
+ import { runLearnedRules, learnFromFinding, } from '../lib/learned-rules/index.js';
4
5
  // ── System Prompts (ported from api/v1/forward.ts) ───────────
5
6
  const EXTRACTION_SYSTEM = `You are a code quality auditor. Given source code, extract every testable claim the code makes about its behavior.
6
7
 
@@ -191,7 +192,9 @@ export function applyFormalVerification(code, language, claims, llmVerifications
191
192
  return { verifications, formalStats };
192
193
  }
193
194
  // ── Orchestrator ─────────────────────────────────────────────
194
- export async function forwardVerify(code, language, context) {
195
+ // Re-export ScanSession so SDK callers can create one across multiple verify calls
196
+ export { ScanSession } from '../lib/learned-rules/index.js';
197
+ export async function forwardVerify(code, language, context, session) {
195
198
  let totalIn = 0;
196
199
  let totalOut = 0;
197
200
  // Phase 1: Extract claims
@@ -204,18 +207,78 @@ export async function forwardVerify(code, language, context) {
204
207
  totalOut += verifyOut;
205
208
  // Phase 2.5: Formal verification with override
206
209
  const { verifications, formalStats } = applyFormalVerification(code, language, claims, llmVerifications);
210
+ // Phase 2.75: Run learned rules (self-expanding formal verification)
211
+ // If a ScanSession is provided, record this file and pass it through
212
+ // so noisy rules (>30% fire rate after 5+ files) get suppressed.
213
+ if (session)
214
+ session.recordFile();
215
+ let learnedRuleFindings = [];
216
+ try {
217
+ learnedRuleFindings = await runLearnedRules(process.cwd(), code, language, session);
218
+ }
219
+ catch {
220
+ // Learned rules are additive — failures don't block the pipeline
221
+ }
222
+ // Phase 2.8: Feed confirmed failures back to the learning system
223
+ // (async, non-blocking — doesn't slow down the current scan)
224
+ const confirmedFailures = verifications.filter(v => v.verdict === 'FAIL' && v.method === 'formal');
225
+ if (confirmedFailures.length > 0) {
226
+ for (const failure of confirmedFailures) {
227
+ const matchingClaim = claims.find(c => c.id === failure.claimId);
228
+ if (!matchingClaim)
229
+ continue;
230
+ learnFromFinding(process.cwd(), {
231
+ claim: {
232
+ id: matchingClaim.id,
233
+ category: matchingClaim.category,
234
+ severity: matchingClaim.severity,
235
+ description: matchingClaim.description,
236
+ assertion: matchingClaim.assertion,
237
+ },
238
+ verification: {
239
+ verdict: 'FAIL',
240
+ reasoning: failure.reasoning,
241
+ },
242
+ code,
243
+ language,
244
+ filePath: 'unknown', // File path not available at this level
245
+ }).catch(() => { });
246
+ }
247
+ }
207
248
  const passed = verifications.filter(v => v.verdict === 'PASS').length;
208
249
  const failed = verifications.filter(v => v.verdict === 'FAIL').length;
209
250
  const partial = verifications.filter(v => v.verdict === 'PARTIAL').length;
251
+ // Include learned rule findings in the total count
252
+ const learnedFailed = learnedRuleFindings.length;
253
+ // Compute formal coverage ratio — the key 10x roadmap metric.
254
+ // "Formal" = deterministic formal verifier (method: 'formal') + learned rules.
255
+ // "LLM" = everything else (method: 'llm' without formal override).
256
+ const formalFromVerifier = verifications.filter(v => v.method === 'formal').length;
257
+ const formalClaimsVerified = formalFromVerifier + learnedFailed;
258
+ const totalClaimsProcessed = verifications.length + learnedFailed;
259
+ const llmClaimsVerified = totalClaimsProcessed - formalClaimsVerified;
260
+ const formalCoverage = {
261
+ formalClaimsVerified,
262
+ llmClaimsVerified,
263
+ totalClaims: totalClaimsProcessed,
264
+ formalPercent: totalClaimsProcessed > 0
265
+ ? Math.round((formalClaimsVerified / totalClaimsProcessed) * 1000) / 10
266
+ : 0,
267
+ };
210
268
  const result = {
211
269
  claims,
212
270
  verifications,
213
- formalStats,
271
+ formalStats: {
272
+ ...formalStats,
273
+ learnedRuleFindings: learnedFailed,
274
+ ...(session ? { noiseFilter: session.stats() } : {}),
275
+ },
276
+ formalCoverage,
214
277
  passed,
215
- failed,
278
+ failed: failed + learnedFailed,
216
279
  partial,
217
- total: verifications.length,
218
- allPassed: failed === 0 && partial === 0,
280
+ total: verifications.length + learnedFailed,
281
+ allPassed: failed === 0 && partial === 0 && learnedFailed === 0,
219
282
  };
220
283
  return { result, inputTokens: totalIn, outputTokens: totalOut };
221
284
  }
@@ -1 +1 @@
1
- {"version":3,"file":"forward-verify.js","sourceRoot":"","sources":["../../src/sdk/forward-verify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"forward-verify.js","sourceRoot":"","sources":["../../src/sdk/forward-verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EACL,qBAAqB,GAGtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,eAAe,EACf,gBAAgB,GAIjB,MAAM,+BAA+B,CAAC;AAUvC,gEAAgE;AAEhE,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;8CAqBoB,CAAC;AAE/C,MAAM,mBAAmB,GAAG;;;;;;;;;;;;oBAYR,CAAC;AAErB,gEAAgE;AAEhE,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,YAAY,KAAK,CAAC,CAAC;YAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,SAAS,KAAK,CAAC,CAAC;QAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,SAAS,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IAClE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,gEAAgE;AAEhE,SAAS,kBAAkB,CAAC,KAAgB;IAC1C,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,IAAI;KACf,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,GAA4B,EAAE,KAAa;IACjE,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzE,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAErE,MAAM,eAAe,GAAG,CAAC,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,aAAa,CAAU,CAAC;IAC1H,MAAM,eAAe,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAU,CAAC;IAEvE,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,QAA0C,CAAC;QACvF,CAAC,CAAE,GAAG,CAAC,QAAkC;QACzC,CAAC,CAAC,aAAa,CAAC;IAElB,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,QAA0C,CAAC;QACvF,CAAC,CAAE,GAAG,CAAC,QAAkC;QACzC,CAAC,CAAC,QAAQ,CAAC;IAEb,OAAO;QACL,EAAE,EAAE,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;QACvF,QAAQ;QACR,QAAQ;QACR,WAAW,EAAG,GAAG,CAAC,WAAsB,CAAC,IAAI,EAAE;QAC/C,SAAS,EAAG,GAAG,CAAC,SAAoB,CAAC,IAAI,EAAE;KAC5C,CAAC;AACJ,CAAC;AAED,SAAS,sCAAsC,CAC7C,CAAsB;IAEtB,OAAO;QACL,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,OAAO,EAAE,CAAC,CAAC,OAAuB;QAClC,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,MAAM,EAAE,CAAC,CAAC,CAAC,mBAAmB,IAAI,KAAK,CAAqB;QAC5D,cAAc,EAAE,CAAC,CAAC,eAAe;YAC/B,CAAC,CAAC;gBACE,kBAAkB,EAAE,CAAC,CAAC,eAAe,CAAC,oBAAoC;gBAC1E,aAAa,EAAE,CAAC,CAAC,eAAe,CAAC,cAAc;gBAC/C,MAAM,EAAE,CAAC,CAAC,eAAe,CAAC,MAAM;aACjC;YACH,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,gEAAgE;AAEhE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAY,EACZ,QAAgB,EAChB,OAAgB;IAEhB,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC,QAAQ,CAAC;QAC5C,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,MAAM;QACjB,YAAY,EAAE,iBAAiB;QAC/B,UAAU,EAAE,aAAa,QAAQ,cAAc,IAAI,GAAG,YAAY,EAAE;KACrE,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC;IAE9B,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC,CAA4B,EAAE,CAAC,CAAC,CAAC;QACzE,IAAI,KAAK;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,OAAO;QACL,MAAM;QACN,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,CAAC;QACtC,YAAY,EAAE,QAAQ,CAAC,YAAY,IAAI,CAAC;KACzC,CAAC;AACJ,CAAC;AAED,gEAAgE;AAEhE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAY,EACZ,QAAgB,EAChB,MAAmB;IAEnB,MAAM,SAAS,GAAG,MAAM;SACrB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,WAAW,kBAAkB,CAAC,CAAC,SAAS,EAAE,CAAC;SAClG,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC,QAAQ,CAAC;QAC5C,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,MAAM;QACjB,YAAY,EAAE,mBAAmB;QACjC,UAAU,EAAE,aAAa,QAAQ,cAAc,IAAI,0BAA0B,SAAS,EAAE;KACzF,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC;IAE9B,MAAM,gBAAgB,GAAG,cAAc,CAAC,IAAI,CAAmC,CAAC;IAChF,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAEzD,MAAM,aAAa,GAAwB,gBAAgB;SACxD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC;SAC7E,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;SACjD,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACT,OAAO,EAAE,CAAC,CAAC,OAAiB;QAC5B,OAAO,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAiB;QAC1F,SAAS,EAAG,CAAC,CAAC,SAAoB,CAAC,IAAI,EAAE;QACzC,MAAM,EAAE,KAAc;KACvB,CAAC,CAAC,CAAC;IAEN,OAAO;QACL,aAAa;QACb,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,CAAC;QACtC,YAAY,EAAE,QAAQ,CAAC,YAAY,IAAI,CAAC;KACzC,CAAC;AACJ,CAAC;AAED,gEAAgE;AAEhE,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,QAAgB,EAChB,MAAmB,EACnB,gBAAqC;IAErC,+BAA+B;IAC/B,MAAM,aAAa,GAAmB,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACrE,MAAM,oBAAoB,GAA0B,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7E,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,mBAAmB,EAAE,CAAC,CAAC,MAAM;KAC9B,CAAC,CAAC,CAAC;IAEJ,0BAA0B;IAC1B,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,oBAAoB,CAAC,CAAC;IAE1F,+BAA+B;IAC/B,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACvF,MAAM,WAAW,GAAgB;QAC/B,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,iBAAiB;QAChD,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY;QACtC,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa;QACzC,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,gBAAgB;KAC/C,CAAC;IAEF,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC;AACxC,CAAC;AAED,gEAAgE;AAEhE,mFAAmF;AACnF,OAAO,EAAE,WAAW,EAAyB,MAAM,+BAA+B,CAAC;AAEnF,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,QAAgB,EAChB,OAAgB,EAChB,OAAqB;IAErB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,0BAA0B;IAC1B,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,GAChE,MAAM,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,IAAI,SAAS,CAAC;IACrB,QAAQ,IAAI,UAAU,CAAC;IAEvB,4BAA4B;IAC5B,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,GACvF,MAAM,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,OAAO,IAAI,QAAQ,CAAC;IACpB,QAAQ,IAAI,SAAS,CAAC;IAEtB,+CAA+C;IAC/C,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,GAClC,uBAAuB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAEpE,qEAAqE;IACrE,qEAAqE;IACrE,iEAAiE;IACjE,IAAI,OAAO;QAAE,OAAO,CAAC,UAAU,EAAE,CAAC;IAClC,IAAI,mBAAmB,GAAyB,EAAE,CAAC;IACnD,IAAI,CAAC;QACH,mBAAmB,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;IACnE,CAAC;IAED,iEAAiE;IACjE,6DAA6D;IAC7D,MAAM,iBAAiB,GAAG,aAAa,CAAC,MAAM,CAC5C,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,CACnD,CAAC;IACF,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;YACxC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;YACjE,IAAI,CAAC,aAAa;gBAAE,SAAS;YAC7B,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE;gBAC9B,KAAK,EAAE;oBACL,EAAE,EAAE,aAAa,CAAC,EAAE;oBACpB,QAAQ,EAAE,aAAa,CAAC,QAAQ;oBAChC,QAAQ,EAAE,aAAa,CAAC,QAAQ;oBAChC,WAAW,EAAE,aAAa,CAAC,WAAW;oBACtC,SAAS,EAAE,aAAa,CAAC,SAAS;iBACnC;gBACD,YAAY,EAAE;oBACZ,OAAO,EAAE,MAAM;oBACf,SAAS,EAAE,OAAO,CAAC,SAAS;iBAC7B;gBACD,IAAI;gBACJ,QAAQ;gBACR,QAAQ,EAAE,SAAS,EAAE,wCAAwC;aAC9D,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAA+B,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACtE,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACtE,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IAE1E,mDAAmD;IACnD,MAAM,aAAa,GAAG,mBAAmB,CAAC,MAAM,CAAC;IAEjD,8DAA8D;IAC9D,+EAA+E;IAC/E,mEAAmE;IACnE,MAAM,kBAAkB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IACnF,MAAM,oBAAoB,GAAG,kBAAkB,GAAG,aAAa,CAAC;IAChE,MAAM,oBAAoB,GAAG,aAAa,CAAC,MAAM,GAAG,aAAa,CAAC;IAClE,MAAM,iBAAiB,GAAG,oBAAoB,GAAG,oBAAoB,CAAC;IACtE,MAAM,cAAc,GAAmB;QACrC,oBAAoB;QACpB,iBAAiB;QACjB,WAAW,EAAE,oBAAoB;QACjC,aAAa,EAAE,oBAAoB,GAAG,CAAC;YACrC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,oBAAoB,GAAG,oBAAoB,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE;YACvE,CAAC,CAAC,CAAC;KACN,CAAC;IAEF,MAAM,MAAM,GAAuB;QACjC,MAAM;QACN,aAAa;QACb,WAAW,EAAE;YACX,GAAG,WAAW;YACd,mBAAmB,EAAE,aAAa;YAClC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrD;QACD,cAAc;QACd,MAAM;QACN,MAAM,EAAE,MAAM,GAAG,aAAa;QAC9B,OAAO;QACP,KAAK,EAAE,aAAa,CAAC,MAAM,GAAG,aAAa;QAC3C,SAAS,EAAE,MAAM,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC;KAChE,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;AAClE,CAAC"}
@@ -5,4 +5,4 @@ export declare class AssaySDK {
5
5
  generate(options: GenerateOptions): Promise<VerifiedCode>;
6
6
  verify(options: VerifyOptions): Promise<VerificationResult>;
7
7
  }
8
- export type { AssaySDKConfig, GenerateOptions, VerifyOptions, VerifiedCode, VerificationResult, CodeClaim, ClaimVerdict, ClaimVerification, FormalStats, ProgressEvent, } from './types.js';
8
+ export type { AssaySDKConfig, GenerateOptions, VerifyOptions, VerifiedCode, VerificationResult, CodeClaim, ClaimVerdict, ClaimVerification, FormalStats, FormalCoverage, ProgressEvent, } from './types.js';
package/dist/sdk/index.js CHANGED
@@ -3,18 +3,20 @@ import { forwardVerify } from './forward-verify.js';
3
3
  export class AssaySDK {
4
4
  config;
5
5
  constructor(config) {
6
+ const isOllama = process.env.ASSAY_LLM_PROVIDER === 'ollama' || !!process.env.ASSAY_OLLAMA_MODEL;
6
7
  const apiKey = config?.anthropicApiKey ?? process.env.ANTHROPIC_API_KEY;
7
- if (!apiKey) {
8
- throw new Error('ANTHROPIC_API_KEY is required. Pass it as anthropicApiKey in config or set the ANTHROPIC_API_KEY environment variable.');
8
+ if (!apiKey && !isOllama) {
9
+ throw new Error('ANTHROPIC_API_KEY is required. Pass it as anthropicApiKey in config or set the ANTHROPIC_API_KEY environment variable.\n' +
10
+ 'Or set ASSAY_LLM_PROVIDER=ollama to use a local model via Ollama.');
9
11
  }
10
12
  this.config = {
11
13
  ...config,
12
- anthropicApiKey: apiKey,
13
- model: config?.model ?? 'claude-sonnet-4-5-20250929',
14
+ anthropicApiKey: apiKey ?? '',
15
+ model: config?.model ?? (isOllama ? (process.env.ASSAY_OLLAMA_MODEL ?? 'qwen3.5:9b') : 'claude-sonnet-4-5-20250929'),
14
16
  maxIterations: config?.maxIterations ?? 3,
15
17
  };
16
18
  // Set env var so downstream lib functions pick it up
17
- if (!process.env.ANTHROPIC_API_KEY) {
19
+ if (apiKey && !process.env.ANTHROPIC_API_KEY) {
18
20
  process.env.ANTHROPIC_API_KEY = apiKey;
19
21
  }
20
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AASpD,MAAM,OAAO,QAAQ;IACX,MAAM,CAA6E;IAE3F,YAAY,MAAuB;QACjC,MAAM,MAAM,GAAG,MAAM,EAAE,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACxE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,wHAAwH,CACzH,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,MAAM;YACT,eAAe,EAAE,MAAM;YACvB,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,4BAA4B;YACpD,aAAa,EAAE,MAAM,EAAE,aAAa,IAAI,CAAC;SAC1C,CAAC;QAEF,qDAAqD;QACrD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,MAAM,CAAC;QACzC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAwB;QACrC,OAAO,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAsB;QACjC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACxF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AASpD,MAAM,OAAO,QAAQ;IACX,MAAM,CAA6E;IAE3F,YAAY,MAAuB;QACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACjG,MAAM,MAAM,GAAG,MAAM,EAAE,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAExE,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,0HAA0H;gBAC1H,mEAAmE,CACpE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,MAAM;YACT,eAAe,EAAE,MAAM,IAAI,EAAE;YAC7B,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC;YACpH,aAAa,EAAE,MAAM,EAAE,aAAa,IAAI,CAAC;SAC1C,CAAC;QAEF,qDAAqD;QACrD,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,MAAM,CAAC;QACzC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAwB;QACrC,OAAO,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAsB;QACjC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACxF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -45,11 +45,32 @@ export interface FormalStats {
45
45
  llmVerified: number;
46
46
  disagreements: number;
47
47
  formalOverrides: number;
48
+ /** Findings from auto-generated learned rules (Phase 1 self-expanding). */
49
+ learnedRuleFindings?: number;
50
+ /** Noise filter stats from the ScanSession, if one was provided. */
51
+ noiseFilter?: {
52
+ filesScanned: number;
53
+ suppressedRules: string[];
54
+ fireCounts: Record<string, number>;
55
+ };
56
+ }
57
+ /** Tracks the LLM/formal verification ratio — the key metric for the 10x roadmap. */
58
+ export interface FormalCoverage {
59
+ /** Claims verified by formal verifier or learned rules (deterministic). */
60
+ formalClaimsVerified: number;
61
+ /** Claims verified only by LLM (non-deterministic). */
62
+ llmClaimsVerified: number;
63
+ /** Total claims processed. */
64
+ totalClaims: number;
65
+ /** Percentage of claims verified formally: (formalClaimsVerified / totalClaims) * 100. */
66
+ formalPercent: number;
48
67
  }
49
68
  export interface VerificationResult {
50
69
  claims: CodeClaim[];
51
70
  verifications: ClaimVerification[];
52
71
  formalStats: FormalStats;
72
+ /** LLM/formal ratio tracking — measures progress toward 15/85 target. */
73
+ formalCoverage: FormalCoverage;
53
74
  passed: number;
54
75
  failed: number;
55
76
  partial: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tryassay",
3
- "version": "0.28.2",
3
+ "version": "0.30.1",
4
4
  "description": "AI code verification CLI — find bugs that tests miss, linters ignore, and code review overlooks",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",