@securecode-ai/mcp 0.5.5 → 0.5.7

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 (186) hide show
  1. package/README.md +52 -12
  2. package/dist/api/types.d.ts +7 -0
  3. package/dist/approval/auditLog.d.ts +1 -1
  4. package/dist/approval/auditLog.js +11 -3
  5. package/dist/approval/auditLog.js.map +1 -1
  6. package/dist/approval/broker.d.ts +7 -2
  7. package/dist/approval/broker.js +239 -110
  8. package/dist/approval/broker.js.map +1 -1
  9. package/dist/approval/policy.d.ts +10 -0
  10. package/dist/approval/policy.js +104 -0
  11. package/dist/approval/policy.js.map +1 -0
  12. package/dist/approval/types.d.ts +11 -2
  13. package/dist/approval/types.js +10 -1
  14. package/dist/approval/types.js.map +1 -1
  15. package/dist/attack/agentScanExecutor.d.ts +35 -1
  16. package/dist/attack/agentScanExecutor.js +405 -76
  17. package/dist/attack/agentScanExecutor.js.map +1 -1
  18. package/dist/attack/agentScanLoop.d.ts +20 -0
  19. package/dist/attack/agentScanLoop.js +1264 -60
  20. package/dist/attack/agentScanLoop.js.map +1 -1
  21. package/dist/attack/agentScanProtocol.d.ts +382 -6
  22. package/dist/attack/agentScanProtocol.js +110 -4
  23. package/dist/attack/agentScanProtocol.js.map +1 -1
  24. package/dist/attack/agentTrace.d.ts +73 -0
  25. package/dist/attack/agentTrace.js +228 -0
  26. package/dist/attack/agentTrace.js.map +1 -0
  27. package/dist/attack/architectureScoutExecutor.d.ts +18 -0
  28. package/dist/attack/architectureScoutExecutor.js +211 -0
  29. package/dist/attack/architectureScoutExecutor.js.map +1 -0
  30. package/dist/attack/architectureScoutLoop.d.ts +36 -0
  31. package/dist/attack/architectureScoutLoop.js +403 -0
  32. package/dist/attack/architectureScoutLoop.js.map +1 -0
  33. package/dist/attack/architectureScoutProtocol.d.ts +209 -0
  34. package/dist/attack/architectureScoutProtocol.js +47 -0
  35. package/dist/attack/architectureScoutProtocol.js.map +1 -0
  36. package/dist/attack/candidateStore.d.ts +95 -0
  37. package/dist/attack/candidateStore.js +231 -0
  38. package/dist/attack/candidateStore.js.map +1 -0
  39. package/dist/attack/evidenceLedger.d.ts +67 -0
  40. package/dist/attack/evidenceLedger.js +192 -0
  41. package/dist/attack/evidenceLedger.js.map +1 -0
  42. package/dist/attack/finishGate.d.ts +62 -0
  43. package/dist/attack/finishGate.js +209 -0
  44. package/dist/attack/finishGate.js.map +1 -0
  45. package/dist/attack/fixCodeMerge.d.ts +27 -0
  46. package/dist/attack/fixCodeMerge.js +42 -0
  47. package/dist/attack/fixCodeMerge.js.map +1 -0
  48. package/dist/attack/fixVerifyLoop.d.ts +55 -0
  49. package/dist/attack/fixVerifyLoop.js +187 -0
  50. package/dist/attack/fixVerifyLoop.js.map +1 -0
  51. package/dist/attack/investigationProfiles.d.ts +36 -0
  52. package/dist/attack/investigationProfiles.js +144 -0
  53. package/dist/attack/investigationProfiles.js.map +1 -0
  54. package/dist/attack/investigationState.d.ts +227 -0
  55. package/dist/attack/investigationState.js +666 -0
  56. package/dist/attack/investigationState.js.map +1 -0
  57. package/dist/attack/mutationOperators.d.ts +22 -0
  58. package/dist/attack/mutationOperators.js +170 -0
  59. package/dist/attack/mutationOperators.js.map +1 -0
  60. package/dist/attack/mutationTest.d.ts +33 -0
  61. package/dist/attack/mutationTest.js +110 -0
  62. package/dist/attack/mutationTest.js.map +1 -0
  63. package/dist/attack/proofGate.d.ts +20 -0
  64. package/dist/attack/proofGate.js +104 -0
  65. package/dist/attack/proofGate.js.map +1 -0
  66. package/dist/attack/proofTypes.d.ts +57 -0
  67. package/dist/attack/proofTypes.js +32 -0
  68. package/dist/attack/proofTypes.js.map +1 -0
  69. package/dist/attack/protocolValidator.d.ts +50 -0
  70. package/dist/attack/protocolValidator.js +427 -0
  71. package/dist/attack/protocolValidator.js.map +1 -0
  72. package/dist/attack/qualityMetrics.d.ts +133 -0
  73. package/dist/attack/qualityMetrics.js +226 -0
  74. package/dist/attack/qualityMetrics.js.map +1 -0
  75. package/dist/attack/scanScheduler.d.ts +52 -0
  76. package/dist/attack/scanScheduler.js +265 -0
  77. package/dist/attack/scanScheduler.js.map +1 -0
  78. package/dist/attack/scanState.d.ts +58 -0
  79. package/dist/attack/scanState.js +102 -0
  80. package/dist/attack/scanState.js.map +1 -0
  81. package/dist/attack/searchIntent.d.ts +16 -0
  82. package/dist/attack/searchIntent.js +57 -0
  83. package/dist/attack/searchIntent.js.map +1 -0
  84. package/dist/attack/verifyLoop.d.ts +43 -0
  85. package/dist/attack/verifyLoop.js +314 -14
  86. package/dist/attack/verifyLoop.js.map +1 -1
  87. package/dist/attack/workItem.d.ts +57 -0
  88. package/dist/attack/workItem.js +225 -0
  89. package/dist/attack/workItem.js.map +1 -0
  90. package/dist/audit/findingReviewQueue.d.ts +109 -0
  91. package/dist/audit/findingReviewQueue.js +335 -0
  92. package/dist/audit/findingReviewQueue.js.map +1 -0
  93. package/dist/audit/scanAuditLog.d.ts +160 -0
  94. package/dist/audit/scanAuditLog.js +404 -0
  95. package/dist/audit/scanAuditLog.js.map +1 -0
  96. package/dist/dependency/dependencyChecker.js +35 -9
  97. package/dist/dependency/dependencyChecker.js.map +1 -1
  98. package/dist/dependency/exploitPriority.d.ts +33 -0
  99. package/dist/dependency/exploitPriority.js +78 -0
  100. package/dist/dependency/exploitPriority.js.map +1 -0
  101. package/dist/dependency/finding.d.ts +16 -0
  102. package/dist/dependency/osvClient.js +2 -0
  103. package/dist/dependency/osvClient.js.map +1 -1
  104. package/dist/dependency/types.d.ts +12 -1
  105. package/dist/mcp/server.js +13 -2
  106. package/dist/mcp/server.js.map +1 -1
  107. package/dist/mcp/tools.d.ts +1 -0
  108. package/dist/mcp/tools.js +127 -6
  109. package/dist/mcp/tools.js.map +1 -1
  110. package/dist/project-map/agentMemory.d.ts +83 -1
  111. package/dist/project-map/agentMemory.js +197 -7
  112. package/dist/project-map/agentMemory.js.map +1 -1
  113. package/dist/project-map/architectureContext.d.ts +202 -0
  114. package/dist/project-map/architectureContext.js +421 -0
  115. package/dist/project-map/architectureContext.js.map +1 -0
  116. package/dist/project-map/blastRadius.d.ts +54 -0
  117. package/dist/project-map/blastRadius.js +196 -0
  118. package/dist/project-map/blastRadius.js.map +1 -0
  119. package/dist/project-map/callGraphExtractor.d.ts +13 -0
  120. package/dist/project-map/callGraphExtractor.js +222 -0
  121. package/dist/project-map/callGraphExtractor.js.map +1 -0
  122. package/dist/project-map/capabilityRegistry.d.ts +46 -0
  123. package/dist/project-map/capabilityRegistry.js +91 -0
  124. package/dist/project-map/capabilityRegistry.js.map +1 -0
  125. package/dist/project-map/findTests.d.ts +29 -0
  126. package/dist/project-map/findTests.js +236 -0
  127. package/dist/project-map/findTests.js.map +1 -0
  128. package/dist/project-map/handlerInventory.d.ts +112 -0
  129. package/dist/project-map/handlerInventory.js +184 -0
  130. package/dist/project-map/handlerInventory.js.map +1 -0
  131. package/dist/project-map/implementationResolver.d.ts +43 -0
  132. package/dist/project-map/implementationResolver.js +217 -0
  133. package/dist/project-map/implementationResolver.js.map +1 -0
  134. package/dist/project-map/mapContext.d.ts +6 -1
  135. package/dist/project-map/mapContext.js +1 -0
  136. package/dist/project-map/mapContext.js.map +1 -1
  137. package/dist/project-map/scanCache.d.ts +57 -3
  138. package/dist/project-map/scanCache.js +61 -2
  139. package/dist/project-map/scanCache.js.map +1 -1
  140. package/dist/project-map/symbolIndex.d.ts +39 -0
  141. package/dist/project-map/symbolIndex.js +385 -0
  142. package/dist/project-map/symbolIndex.js.map +1 -0
  143. package/dist/tooling/agentEvalScoring.d.ts +77 -0
  144. package/dist/tooling/agentEvalScoring.js +140 -0
  145. package/dist/tooling/agentEvalScoring.js.map +1 -0
  146. package/dist/tooling/agentRegression.d.ts +53 -0
  147. package/dist/tooling/agentRegression.js +99 -0
  148. package/dist/tooling/agentRegression.js.map +1 -0
  149. package/dist/tools/agentScan.d.ts +69 -0
  150. package/dist/tools/agentScan.js +702 -43
  151. package/dist/tools/agentScan.js.map +1 -1
  152. package/dist/tools/findingReviewTools.d.ts +22 -0
  153. package/dist/tools/findingReviewTools.js +121 -0
  154. package/dist/tools/findingReviewTools.js.map +1 -0
  155. package/dist/tools/fix.js +1 -1
  156. package/dist/tools/fix.js.map +1 -1
  157. package/dist/tools/map.js +191 -1
  158. package/dist/tools/map.js.map +1 -1
  159. package/dist/tools/runTests.d.ts +2 -0
  160. package/dist/tools/runTests.js +29 -0
  161. package/dist/tools/runTests.js.map +1 -0
  162. package/dist/utils/effectMock.d.ts +1 -0
  163. package/dist/utils/effectMock.js +162 -0
  164. package/dist/utils/effectMock.js.map +1 -0
  165. package/dist/utils/gitContext.d.ts +26 -0
  166. package/dist/utils/gitContext.js +317 -0
  167. package/dist/utils/gitContext.js.map +1 -0
  168. package/dist/utils/localTestRunner.d.ts +57 -2
  169. package/dist/utils/localTestRunner.js +122 -115
  170. package/dist/utils/localTestRunner.js.map +1 -1
  171. package/dist/utils/securityConfig.d.ts +17 -0
  172. package/dist/utils/securityConfig.js +192 -0
  173. package/dist/utils/securityConfig.js.map +1 -0
  174. package/dist/utils/testCommandPolicy.d.ts +36 -0
  175. package/dist/utils/testCommandPolicy.js +252 -0
  176. package/dist/utils/testCommandPolicy.js.map +1 -0
  177. package/dist/utils/testRunner.d.ts +56 -0
  178. package/dist/utils/testRunner.js +246 -0
  179. package/dist/utils/testRunner.js.map +1 -0
  180. package/dist/utils/testSafety.d.ts +40 -2
  181. package/dist/utils/testSafety.js +205 -26
  182. package/dist/utils/testSafety.js.map +1 -1
  183. package/dist/utils/verificationSandbox.d.ts +113 -0
  184. package/dist/utils/verificationSandbox.js +656 -0
  185. package/dist/utils/verificationSandbox.js.map +1 -0
  186. package/package.json +1 -1
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Agent regression gate — compares a new eval result against a stored
3
+ * baseline and fails when precision, recall, or completion rate regresses
4
+ * beyond strict thresholds.
5
+ *
6
+ * Gate rules (per the user's decision: "Strict regression gate"):
7
+ * - precision drop > 0.02 → FAIL
8
+ * - recall drop > 0.02 → FAIL
9
+ * - completion-rate drop > 0.03 → FAIL
10
+ * - fixture/schema mismatch → FAIL
11
+ * - cache version mismatch → FAIL (result was produced by an old prompt)
12
+ * - commit SHA mismatch → FAIL (result was produced on a different commit)
13
+ *
14
+ * Usage:
15
+ * npx tsx tooling/checkAgentRegression.ts --baseline <path> --result <path>
16
+ *
17
+ * The baseline is stored in tooling/agent-testset/baseline.json. It's
18
+ * regenerated when a deliberate quality change is made (run the eval,
19
+ * inspect the new metrics, if they're better or equal, update the baseline).
20
+ */
21
+ import type { AgentEvalMetrics } from './agentEvalScoring';
22
+ export interface AgentEvalReport {
23
+ timestamp: string;
24
+ manifest_version: number;
25
+ fixtureCount: number;
26
+ metrics: AgentEvalMetrics;
27
+ results: any[];
28
+ targets: {
29
+ recall_min: number;
30
+ precision_min: number;
31
+ fpr_max: number;
32
+ completion_rate_min: number;
33
+ };
34
+ pass: boolean;
35
+ cacheVersion?: number;
36
+ commitSha?: string;
37
+ }
38
+ export interface RegressionResult {
39
+ passed: boolean;
40
+ reasons: string[];
41
+ deltas: {
42
+ precisionDelta: number;
43
+ recallDelta: number;
44
+ completionRateDelta: number;
45
+ fprDelta: number;
46
+ };
47
+ baseline: AgentEvalMetrics;
48
+ candidate: AgentEvalMetrics;
49
+ }
50
+ export declare function checkRegression(baseline: AgentEvalReport, candidate: AgentEvalReport, options?: {
51
+ currentSha?: string;
52
+ }): RegressionResult;
53
+ export declare function formatRegressionResult(result: RegressionResult): string;
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ /**
3
+ * Agent regression gate — compares a new eval result against a stored
4
+ * baseline and fails when precision, recall, or completion rate regresses
5
+ * beyond strict thresholds.
6
+ *
7
+ * Gate rules (per the user's decision: "Strict regression gate"):
8
+ * - precision drop > 0.02 → FAIL
9
+ * - recall drop > 0.02 → FAIL
10
+ * - completion-rate drop > 0.03 → FAIL
11
+ * - fixture/schema mismatch → FAIL
12
+ * - cache version mismatch → FAIL (result was produced by an old prompt)
13
+ * - commit SHA mismatch → FAIL (result was produced on a different commit)
14
+ *
15
+ * Usage:
16
+ * npx tsx tooling/checkAgentRegression.ts --baseline <path> --result <path>
17
+ *
18
+ * The baseline is stored in tooling/agent-testset/baseline.json. It's
19
+ * regenerated when a deliberate quality change is made (run the eval,
20
+ * inspect the new metrics, if they're better or equal, update the baseline).
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.checkRegression = checkRegression;
24
+ exports.formatRegressionResult = formatRegressionResult;
25
+ const child_process_1 = require("child_process");
26
+ const scanCache_1 = require("../project-map/scanCache");
27
+ const THRESHOLDS = {
28
+ maxPrecisionDrop: 0.02,
29
+ maxRecallDrop: 0.02,
30
+ maxCompletionRateDrop: 0.03,
31
+ };
32
+ function getCommitSha() {
33
+ try {
34
+ return (0, child_process_1.execSync)('git rev-parse HEAD', { encoding: 'utf8', windowsHide: true }).trim();
35
+ }
36
+ catch {
37
+ return 'unknown';
38
+ }
39
+ }
40
+ function checkRegression(baseline, candidate, options = {}) {
41
+ const reasons = [];
42
+ const b = baseline.metrics;
43
+ const c = candidate.metrics;
44
+ const precisionDelta = c.precision - b.precision;
45
+ const recallDelta = c.recall - b.recall;
46
+ const completionRateDelta = c.completionRate - b.completionRate;
47
+ const fprDelta = c.fpr - b.fpr;
48
+ if (precisionDelta < -THRESHOLDS.maxPrecisionDrop) {
49
+ reasons.push(`Precision dropped by ${Math.abs(precisionDelta).toFixed(4)} (max allowed: ${THRESHOLDS.maxPrecisionDrop}). ${b.precision.toFixed(4)} → ${c.precision.toFixed(4)}`);
50
+ }
51
+ if (recallDelta < -THRESHOLDS.maxRecallDrop) {
52
+ reasons.push(`Recall dropped by ${Math.abs(recallDelta).toFixed(4)} (max allowed: ${THRESHOLDS.maxRecallDrop}). ${b.recall.toFixed(4)} → ${c.recall.toFixed(4)}`);
53
+ }
54
+ if (completionRateDelta < -THRESHOLDS.maxCompletionRateDrop) {
55
+ reasons.push(`Completion rate dropped by ${Math.abs(completionRateDelta).toFixed(4)} (max allowed: ${THRESHOLDS.maxCompletionRateDrop}). ${b.completionRate.toFixed(4)} → ${c.completionRate.toFixed(4)}`);
56
+ }
57
+ if (baseline.fixtureCount !== candidate.fixtureCount) {
58
+ reasons.push(`Fixture count mismatch: baseline has ${baseline.fixtureCount}, candidate has ${candidate.fixtureCount}. Run the eval with the same testset.`);
59
+ }
60
+ if (baseline.manifest_version !== candidate.manifest_version) {
61
+ reasons.push(`Manifest version mismatch: baseline is v${baseline.manifest_version}, candidate is v${candidate.manifest_version}. Update the baseline.`);
62
+ }
63
+ if (candidate.cacheVersion !== undefined && candidate.cacheVersion !== scanCache_1.AGENT_SCAN_CACHE_VERSION) {
64
+ reasons.push(`Cache version mismatch: candidate result was produced with cache version ${candidate.cacheVersion}, but current AGENT_SCAN_CACHE_VERSION is ${scanCache_1.AGENT_SCAN_CACHE_VERSION}. The result is stale — re-run the eval.`);
65
+ }
66
+ const candidateSha = candidate.commitSha;
67
+ const expectedSha = options.currentSha ?? getCommitSha();
68
+ if (candidateSha && candidateSha !== 'unknown' && candidateSha !== expectedSha) {
69
+ reasons.push(`Commit SHA mismatch: candidate result was produced on ${candidateSha.slice(0, 8)}, but current HEAD is ${expectedSha.slice(0, 8)}. Re-run the eval on the current commit.`);
70
+ }
71
+ return {
72
+ passed: reasons.length === 0,
73
+ reasons,
74
+ deltas: { precisionDelta, recallDelta, completionRateDelta, fprDelta },
75
+ baseline: b,
76
+ candidate: c,
77
+ };
78
+ }
79
+ function formatRegressionResult(result) {
80
+ const lines = [];
81
+ const status = result.passed ? 'PASS' : 'FAIL';
82
+ lines.push(`## Regression Gate: ${status}`);
83
+ lines.push('');
84
+ lines.push('| Metric | Baseline | Candidate | Delta | Threshold |');
85
+ lines.push('|--------|----------|-----------|-------|-----------|');
86
+ lines.push(`| Precision | ${result.baseline.precision.toFixed(4)} | ${result.candidate.precision.toFixed(4)} | ${result.deltas.precisionDelta >= 0 ? '+' : ''}${result.deltas.precisionDelta.toFixed(4)} | ≥ -${THRESHOLDS.maxPrecisionDrop} |`);
87
+ lines.push(`| Recall | ${result.baseline.recall.toFixed(4)} | ${result.candidate.recall.toFixed(4)} | ${result.deltas.recallDelta >= 0 ? '+' : ''}${result.deltas.recallDelta.toFixed(4)} | ≥ -${THRESHOLDS.maxRecallDrop} |`);
88
+ lines.push(`| Completion Rate | ${result.baseline.completionRate.toFixed(4)} | ${result.candidate.completionRate.toFixed(4)} | ${result.deltas.completionRateDelta >= 0 ? '+' : ''}${result.deltas.completionRateDelta.toFixed(4)} | ≥ -${THRESHOLDS.maxCompletionRateDrop} |`);
89
+ lines.push(`| FPR | ${result.baseline.fpr.toFixed(4)} | ${result.candidate.fpr.toFixed(4)} | ${result.deltas.fprDelta >= 0 ? '+' : ''}${result.deltas.fprDelta.toFixed(4)} | (info) |`);
90
+ if (result.reasons.length > 0) {
91
+ lines.push('');
92
+ lines.push('### Failure Reasons:');
93
+ for (const r of result.reasons) {
94
+ lines.push(`- ${r}`);
95
+ }
96
+ }
97
+ return lines.join('\n');
98
+ }
99
+ //# sourceMappingURL=agentRegression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentRegression.js","sourceRoot":"","sources":["../../src/tooling/agentRegression.ts"],"names":[],"mappings":"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"}
@@ -16,4 +16,73 @@
16
16
  * 6. Return result with proven stamps
17
17
  */
18
18
  import type { ServerContext } from '../mcp/types';
19
+ import type { AgentScanFinding, VerificationLevel } from '../attack/agentScanProtocol';
20
+ interface ProvenFinding extends AgentScanFinding {
21
+ proven: 'PROVEN' | 'UNPROVEN' | 'INCONCLUSIVE' | 'NOT_REPRODUCIBLE' | 'SKIPPED';
22
+ provenReason?: string;
23
+ evidenceLevel?: string;
24
+ originalConfidence?: number;
25
+ verificationLevel?: VerificationLevel;
26
+ fixStatus?: 'fix-generated' | 'fix-denied' | 'fix-error' | 'fix-verified-closed' | 'fix-still-vulnerable' | 'fix-verification-inconclusive' | 'fix-syntax-invalid';
27
+ fixDeniedReason?: string;
28
+ fixApprovalId?: string;
29
+ /** Sub-verdict from the verify loop — used to map to a review reason. */
30
+ verifySubVerdict?: string;
31
+ /** Human review queue status for INCONCLUSIVE findings. */
32
+ reviewStatus?: 'pending' | 'confirmed' | 'rejected' | 'deferred';
33
+ reviewId?: string;
34
+ /** Result of re-verifying the exploit against the fixed code. */
35
+ fixVerification?: FixVerificationResult;
36
+ /** Structured proof evidence from the proof gate, if the finding was verified. */
37
+ proofEvidence?: import('../attack/proofTypes').ProofEvidence;
38
+ /** Result of the deterministic proof gate evaluation. */
39
+ proofGateResult?: import('../attack/proofTypes').ProofGateResult;
40
+ /** Whether human review is required before acting on this finding. */
41
+ humanReviewRequired?: boolean;
42
+ }
43
+ export interface FixVerificationResult {
44
+ status: 'not-run' | 'closed' | 'still-vulnerable' | 'inconclusive' | 'syntax-invalid' | 'sandbox-unavailable' | 'cancelled';
45
+ reason: string;
46
+ originalVerdict: 'PROVEN' | 'UNPROVEN' | 'INCONCLUSIVE' | 'SKIPPED';
47
+ fixedVerdict?: 'PROVEN' | 'UNPROVEN' | 'INCONCLUSIVE';
48
+ roundsUsed: number;
49
+ fixedCodeHash: string;
50
+ }
19
51
  export declare function toolAgentScan(ctx: ServerContext, args: any): Promise<unknown>;
52
+ /**
53
+ * Explicit confidence-ceiling policy for a finding, based on:
54
+ * - the verify verdict (PROVEN / UNPROVEN / INCONCLUSIVE /
55
+ * NOT_REPRODUCIBLE / SKIPPED)
56
+ * - the language capability tier (deep / standard / fallback)
57
+ * - how many structural evidence tools the agent actually used
58
+ * (trace_flow, check_guard, check_policy)
59
+ *
60
+ * Returns `undefined` for PROVEN (no ceiling — the proof overrules the
61
+ * LLM's belief). For everything else, returns the maximum allowed
62
+ * confidence. The caller takes `Math.min(confidence, ceiling)` so multiple
63
+ * applicable bounds compose correctly — last-write-wins is impossible.
64
+ *
65
+ * Verdict semantics:
66
+ * - PROVEN: exploit test ran and reproduced the vulnerability. Strong
67
+ * evidence. No ceiling; floor at 80.
68
+ * - UNPROVEN: exploit test ran and did NOT reproduce. The finding is
69
+ * likely a false positive. Hard cap at 25.
70
+ * - NOT_REPRODUCIBLE: exploit test ran, but the test setup couldn't
71
+ * trigger the vulnerability (e.g. the path requires a live DB). This
72
+ * is NOT the same as UNPROVEN (which actively disproved) and NOT the
73
+ * same as INCONCLUSIVE (which couldn't even run a test). Treat it as
74
+ * "we tried and couldn't confirm" — cap at 35, tighter than
75
+ * INCONCLUSIVE but looser than UNPROVEN.
76
+ * - INCONCLUSIVE: no test could be generated or the sandbox was
77
+ * unavailable. The finding is unverified — keep the LLM's confidence
78
+ * but cap it based on structural evidence (no tools → ≤40, ≥2 tools
79
+ * → ≤75). Fallback-tier languages get ≤55 across the board.
80
+ * - SKIPPED: low severity, we didn't even try. Same as INCONCLUSIVE.
81
+ */
82
+ export declare function confidenceCeilingForFinding(verdict: ProvenFinding['proven'], capabilityTier: 'deep' | 'standard' | 'fallback', evidenceTools: number): number | undefined;
83
+ /**
84
+ * Apply the confidence clamp to a single finding. Exported for testing
85
+ * so the test imports the real policy, not a copy that can drift.
86
+ */
87
+ export declare function applyConfidenceClamp(original: number, verdict: ProvenFinding['proven'], capabilityTier: 'deep' | 'standard' | 'fallback', evidenceTools: number): number;
88
+ export {};