@clear-capabilities/agentic-security-scanner 0.74.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1580 -0
- package/bin/.agentic-security/findings.json +1577 -0
- package/bin/.agentic-security/last-scan.json +1577 -0
- package/bin/.agentic-security/last-scan.json.sig +1 -0
- package/bin/.agentic-security/scan-history.json +465 -0
- package/bin/.agentic-security/streak.json +25 -0
- package/bin/agentic-security-audit.js +198 -0
- package/bin/agentic-security-consistency.js +80 -0
- package/bin/agentic-security-diff.js +136 -0
- package/bin/agentic-security-lsp.js +12 -0
- package/bin/agentic-security-mcp.js +40 -0
- package/bin/agentic-security-rule.js +153 -0
- package/bin/agentic-security.js +1683 -0
- package/dist/117.index.js +207 -0
- package/dist/178.index.js +250 -0
- package/dist/218.index.js +793 -0
- package/dist/227.index.js +192 -0
- package/dist/301.index.js +167 -0
- package/dist/384.index.js +18 -0
- package/dist/476.index.js +126 -0
- package/dist/513.index.js +373 -0
- package/dist/520.index.js +13 -0
- package/dist/601.index.js +1038 -0
- package/dist/634.index.js +1892 -0
- package/dist/637.index.js +216 -0
- package/dist/660.index.js +131 -0
- package/dist/675.index.js +451 -0
- package/dist/826.index.js +188 -0
- package/dist/830.index.js +133 -0
- package/dist/agentic-security.mjs +272 -0
- package/dist/agentic-security.mjs.sha256 +1 -0
- package/dist/calibration-seed.json +27 -0
- package/package.json +77 -0
- package/src/.agentic-security/findings.json +80844 -0
- package/src/.agentic-security/last-scan.json +80844 -0
- package/src/.agentic-security/last-scan.json.sig +1 -0
- package/src/.agentic-security/scan-history.json +8408 -0
- package/src/.agentic-security/streak.json +26 -0
- package/src/badge.js +188 -0
- package/src/compare.js +203 -0
- package/src/dataflow/.agentic-security/findings.json +3487 -0
- package/src/dataflow/.agentic-security/last-scan.json +3487 -0
- package/src/dataflow/.agentic-security/last-scan.json.sig +1 -0
- package/src/dataflow/.agentic-security/scan-history.json +735 -0
- package/src/dataflow/.agentic-security/streak.json +24 -0
- package/src/dataflow/CLAUDE.md +38 -0
- package/src/dataflow/access-paths.js +172 -0
- package/src/dataflow/async-sequencing.js +177 -0
- package/src/dataflow/backward.js +201 -0
- package/src/dataflow/catalog-expanded.js +485 -0
- package/src/dataflow/catalog.js +659 -0
- package/src/dataflow/cross-repo.js +219 -0
- package/src/dataflow/engine.js +588 -0
- package/src/dataflow/exception-flow.js +116 -0
- package/src/dataflow/exploit-prover.js +187 -0
- package/src/dataflow/higher-order.js +221 -0
- package/src/dataflow/ifds.js +347 -0
- package/src/dataflow/implicit-flow.js +129 -0
- package/src/dataflow/incremental.js +229 -0
- package/src/dataflow/index.js +181 -0
- package/src/dataflow/numeric-domain.js +192 -0
- package/src/dataflow/path-feasibility.js +114 -0
- package/src/dataflow/points-to.js +337 -0
- package/src/dataflow/polyglot.js +190 -0
- package/src/dataflow/proven-clean.js +159 -0
- package/src/dataflow/receiver-context.js +76 -0
- package/src/dataflow/sanitizer-proof.js +154 -0
- package/src/dataflow/soft-taint.js +140 -0
- package/src/dataflow/string-domain.js +234 -0
- package/src/dataflow/stub-aware-filter.js +100 -0
- package/src/dataflow/summaries.js +132 -0
- package/src/dataflow/symbolic-exec.js +238 -0
- package/src/dataflow/tabulation.js +135 -0
- package/src/engine.js +7763 -0
- package/src/history-scan.js +229 -0
- package/src/index.js +3 -0
- package/src/integrations/.agentic-security/findings.json +1504 -0
- package/src/integrations/.agentic-security/last-scan.json +1504 -0
- package/src/integrations/.agentic-security/scan-history.json +40 -0
- package/src/integrations/.agentic-security/streak.json +21 -0
- package/src/integrations/index.js +321 -0
- package/src/integrations/tickets.js +200 -0
- package/src/ir/.agentic-security/findings.json +3036 -0
- package/src/ir/.agentic-security/last-scan.json +3036 -0
- package/src/ir/.agentic-security/last-scan.json.sig +1 -0
- package/src/ir/.agentic-security/scan-history.json +364 -0
- package/src/ir/.agentic-security/streak.json +23 -0
- package/src/ir/CLAUDE.md +172 -0
- package/src/ir/callgraph.js +73 -0
- package/src/ir/class-hierarchy.js +195 -0
- package/src/ir/index.js +152 -0
- package/src/ir/parser-cs.js +260 -0
- package/src/ir/parser-java.js +286 -0
- package/src/ir/parser-js.js +413 -0
- package/src/ir/parser-kt.js +258 -0
- package/src/ir/parser-py-cst.js +136 -0
- package/src/ir/parser-py.helper.py +501 -0
- package/src/ir/parser-py.js +312 -0
- package/src/ir/ssa.js +315 -0
- package/src/ir/type-stubs.js +288 -0
- package/src/leaderboard.js +152 -0
- package/src/llm-validator/.agentic-security/findings.json +1891 -0
- package/src/llm-validator/.agentic-security/last-scan.json +1891 -0
- package/src/llm-validator/.agentic-security/last-scan.json.sig +1 -0
- package/src/llm-validator/.agentic-security/scan-history.json +168 -0
- package/src/llm-validator/.agentic-security/streak.json +20 -0
- package/src/llm-validator/consistency.js +141 -0
- package/src/llm-validator/index.js +437 -0
- package/src/lsp/.agentic-security/findings.json +28 -0
- package/src/lsp/.agentic-security/last-scan.json +28 -0
- package/src/lsp/.agentic-security/scan-history.json +79 -0
- package/src/lsp/.agentic-security/streak.json +22 -0
- package/src/lsp/server.js +275 -0
- package/src/mcp/.agentic-security/findings.json +8358 -0
- package/src/mcp/.agentic-security/last-scan.json +8358 -0
- package/src/mcp/.agentic-security/last-scan.json.sig +1 -0
- package/src/mcp/.agentic-security/scan-history.json +1125 -0
- package/src/mcp/.agentic-security/streak.json +22 -0
- package/src/mcp/CLAUDE.md +54 -0
- package/src/mcp/audit.js +136 -0
- package/src/mcp/redact.js +75 -0
- package/src/mcp/server.js +158 -0
- package/src/mcp/stdio.js +83 -0
- package/src/mcp/tools.js +940 -0
- package/src/mcp/validate.js +49 -0
- package/src/personality.js +164 -0
- package/src/poc-video.js +239 -0
- package/src/posture/.agentic-security/findings.json +51239 -0
- package/src/posture/.agentic-security/last-scan.json +51239 -0
- package/src/posture/.agentic-security/last-scan.json.sig +1 -0
- package/src/posture/.agentic-security/scan-history.json +5557 -0
- package/src/posture/.agentic-security/streak.json +24 -0
- package/src/posture/CLAUDE.md +42 -0
- package/src/posture/adversarial-self-test.js +114 -0
- package/src/posture/adversary-agent.js +204 -0
- package/src/posture/agents-memory.js +135 -0
- package/src/posture/ai-code-fingerprint.js +171 -0
- package/src/posture/aibom.js +284 -0
- package/src/posture/api-inventory.js +96 -0
- package/src/posture/attack-playbooks.js +305 -0
- package/src/posture/auditor-agent.js +115 -0
- package/src/posture/auth-posture-import.js +135 -0
- package/src/posture/baseline-compare.js +114 -0
- package/src/posture/blast-radius.js +836 -0
- package/src/posture/bounty-prediction.js +141 -0
- package/src/posture/business-logic.js +239 -0
- package/src/posture/calibration-drift.js +93 -0
- package/src/posture/calibration-seed.json +27 -0
- package/src/posture/calibration.js +204 -0
- package/src/posture/clustering.js +75 -0
- package/src/posture/concurrency-checker.js +265 -0
- package/src/posture/confidence.js +65 -0
- package/src/posture/container-runtime.js +149 -0
- package/src/posture/counterfactual.js +109 -0
- package/src/posture/cross-lang-graphql.js +165 -0
- package/src/posture/cross-lang-grpc.js +166 -0
- package/src/posture/cross-lang-meta.js +101 -0
- package/src/posture/cross-lang-openapi.js +187 -0
- package/src/posture/cross-lang-orm.js +153 -0
- package/src/posture/cross-lang-queues.js +210 -0
- package/src/posture/crown-jewels.js +110 -0
- package/src/posture/custom-rules.js +361 -0
- package/src/posture/cve-alert-daemon.js +433 -0
- package/src/posture/cve-lookup.js +129 -0
- package/src/posture/dead-code.js +430 -0
- package/src/posture/defender-agent.js +158 -0
- package/src/posture/deploy-platform.js +204 -0
- package/src/posture/detector-fuzz.js +61 -0
- package/src/posture/deterministic.js +99 -0
- package/src/posture/drift.js +165 -0
- package/src/posture/epss.js +156 -0
- package/src/posture/exploitability-probability.js +212 -0
- package/src/posture/exploitability.js +121 -0
- package/src/posture/feature-flags.js +110 -0
- package/src/posture/finding-defaults.js +132 -0
- package/src/posture/fix-history.js +411 -0
- package/src/posture/fix-plan.js +121 -0
- package/src/posture/fix-verify-loop.js +157 -0
- package/src/posture/fix-verify.js +130 -0
- package/src/posture/flow-narration.js +105 -0
- package/src/posture/grader-calibration.js +156 -0
- package/src/posture/harness-discovery.js +113 -0
- package/src/posture/holdout-eval.js +144 -0
- package/src/posture/iac-reachability.js +163 -0
- package/src/posture/iam-policy.js +128 -0
- package/src/posture/integrity.js +97 -0
- package/src/posture/learning.js +166 -0
- package/src/posture/license-policy.js +109 -0
- package/src/posture/llm-redteam-prompts.js +418 -0
- package/src/posture/llm-redteam.js +303 -0
- package/src/posture/material-change.js +163 -0
- package/src/posture/mitigation-composite.js +55 -0
- package/src/posture/mttr.js +91 -0
- package/src/posture/network-policy-import.js +126 -0
- package/src/posture/path-predicates.js +99 -0
- package/src/posture/persona-prioritization.js +153 -0
- package/src/posture/poc-cwe-map.js +51 -0
- package/src/posture/poc-generator.js +500 -0
- package/src/posture/policy-gate.js +174 -0
- package/src/posture/pre-incident-archaeology.js +110 -0
- package/src/posture/profile.js +93 -0
- package/src/posture/reachability-filter.js +42 -0
- package/src/posture/regression-test-gen.js +200 -0
- package/src/posture/reverse-blast-radius.js +110 -0
- package/src/posture/router.js +109 -0
- package/src/posture/rule-overrides.js +198 -0
- package/src/posture/rule-pack-signing.js +209 -0
- package/src/posture/rule-packs.js +143 -0
- package/src/posture/rule-synthesis.js +108 -0
- package/src/posture/ruleset-version.js +71 -0
- package/src/posture/sbom.js +129 -0
- package/src/posture/schema-aware-bridge.js +207 -0
- package/src/posture/security-trend.js +87 -0
- package/src/posture/semantic-clone.js +114 -0
- package/src/posture/specification-mining.js +170 -0
- package/src/posture/stable-id.js +75 -0
- package/src/posture/stack-playbook.js +229 -0
- package/src/posture/streak.js +249 -0
- package/src/posture/suppressions.js +135 -0
- package/src/posture/telemetry-ingest.js +112 -0
- package/src/posture/threat-model.js +145 -0
- package/src/posture/three-agent-pipeline.js +74 -0
- package/src/posture/triage.js +146 -0
- package/src/posture/trust-boundary-diagram.js +115 -0
- package/src/posture/type-narrowing.js +129 -0
- package/src/posture/validator-metrics.js +179 -0
- package/src/posture/verifier-ephemeral.js +118 -0
- package/src/posture/verifier-target.js +147 -0
- package/src/posture/verifier.js +257 -0
- package/src/posture/version.js +75 -0
- package/src/posture/waf-ingest.js +200 -0
- package/src/posture/why-fired.js +141 -0
- package/src/pr-comment.js +172 -0
- package/src/pr-delta.js +198 -0
- package/src/report/.agentic-security/findings.json +79 -0
- package/src/report/.agentic-security/last-scan.json +79 -0
- package/src/report/.agentic-security/last-scan.json.sig +1 -0
- package/src/report/.agentic-security/scan-history.json +332 -0
- package/src/report/.agentic-security/streak.json +23 -0
- package/src/report/index.js +1136 -0
- package/src/report/mascot.js +42 -0
- package/src/runScan.js +141 -0
- package/src/sast/.agentic-security/findings.json +5051 -0
- package/src/sast/.agentic-security/last-scan.json +5051 -0
- package/src/sast/.agentic-security/last-scan.json.sig +1 -0
- package/src/sast/.agentic-security/scan-history.json +788 -0
- package/src/sast/.agentic-security/streak.json +23 -0
- package/src/sast/CLAUDE.md +39 -0
- package/src/sast/_comment-strip.js +46 -0
- package/src/sast/agent-tool-escalation.js +131 -0
- package/src/sast/auth-provider.js +171 -0
- package/src/sast/authz.js +236 -0
- package/src/sast/bench-shape/.agentic-security/findings.json +28 -0
- package/src/sast/bench-shape/.agentic-security/last-scan.json +28 -0
- package/src/sast/bench-shape/.agentic-security/scan-history.json +24 -0
- package/src/sast/bench-shape/.agentic-security/streak.json +22 -0
- package/src/sast/bench-shape/index.js +62 -0
- package/src/sast/claude-hook-injection.js +199 -0
- package/src/sast/claude-md-prompt-injection.js +170 -0
- package/src/sast/claude-settings.js +165 -0
- package/src/sast/client-side.js +149 -0
- package/src/sast/cpp-bench-extras.js +122 -0
- package/src/sast/cpp-dataflow.js +430 -0
- package/src/sast/cpp.js +248 -0
- package/src/sast/csharp.js +152 -0
- package/src/sast/csrf.js +82 -0
- package/src/sast/dart-flutter.js +173 -0
- package/src/sast/db-rls.js +147 -0
- package/src/sast/db-taint.js +215 -0
- package/src/sast/defi-deep.js +242 -0
- package/src/sast/deserialization-gadgets.js +113 -0
- package/src/sast/django-hardening.js +230 -0
- package/src/sast/env-hygiene.js +125 -0
- package/src/sast/fastapi-hardening.js +145 -0
- package/src/sast/go-extended.js +84 -0
- package/src/sast/host-header.js +106 -0
- package/src/sast/index.js +17 -0
- package/src/sast/java-ast-folding.js +561 -0
- package/src/sast/java-bench-extras.js +708 -0
- package/src/sast/java-collection-passthrough.js +178 -0
- package/src/sast/java-constant-fold.js +244 -0
- package/src/sast/java-deserialization.js +125 -0
- package/src/sast/jndi.js +104 -0
- package/src/sast/juliet-shape.js +324 -0
- package/src/sast/jwt-exp.js +104 -0
- package/src/sast/kotlin.js +82 -0
- package/src/sast/laravel-hardening.js +198 -0
- package/src/sast/ldap-injection.js +100 -0
- package/src/sast/llm-owasp.js +465 -0
- package/src/sast/llm-stored-prompt.js +103 -0
- package/src/sast/llm-trading-agent.js +161 -0
- package/src/sast/llm.js +308 -0
- package/src/sast/logic.js +140 -0
- package/src/sast/mass-assignment.js +101 -0
- package/src/sast/mcp-audit.js +242 -0
- package/src/sast/mobile-manifest.js +195 -0
- package/src/sast/model-load.js +164 -0
- package/src/sast/mutation-xss.js +87 -0
- package/src/sast/nosql-injection.js +82 -0
- package/src/sast/open-redirect.js +119 -0
- package/src/sast/php.js +91 -0
- package/src/sast/pipeline.js +122 -0
- package/src/sast/primary-cwe-java.js +155 -0
- package/src/sast/prompt-firewall.js +151 -0
- package/src/sast/prompt-template.js +157 -0
- package/src/sast/prototype-pollution.js +112 -0
- package/src/sast/python-sinks.js +195 -0
- package/src/sast/quarkus-hardening.js +102 -0
- package/src/sast/rag-poisoning.js +118 -0
- package/src/sast/rate-limit.js +128 -0
- package/src/sast/response-splitting.js +138 -0
- package/src/sast/ruby.js +108 -0
- package/src/sast/rust.js +105 -0
- package/src/sast/solidity.js +167 -0
- package/src/sast/springboot-hardening.js +186 -0
- package/src/sast/ssrf-cloud-metadata.js +80 -0
- package/src/sast/ssti.js +116 -0
- package/src/sast/swift.js +162 -0
- package/src/sast/toctou.js +95 -0
- package/src/sast/webhook.js +101 -0
- package/src/sast/xpath-injection.js +51 -0
- package/src/sast/xxe.js +140 -0
- package/src/sast/zip-slip.js +200 -0
- package/src/sca/base-images.json +45 -0
- package/src/sca/container.js +107 -0
- package/src/sca/dep-confusion.js +134 -0
- package/src/sca/index.js +6 -0
- package/src/sca/popular-packages.json +41 -0
- package/src/sca/sarif-ingest.js +187 -0
- package/src/sca/vuln-function-hints.json +89 -0
- package/src/secrets/index.js +4 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
4c7773244a54b5c390324ea1d7302921511d2ac2526cebc27cf16deff479564f
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"timestamp": "2026-05-18T17:45:05.442Z",
|
|
4
|
+
"label": "scan",
|
|
5
|
+
"total": 4,
|
|
6
|
+
"critical": 0,
|
|
7
|
+
"high": 1,
|
|
8
|
+
"medium": 3,
|
|
9
|
+
"low": 0,
|
|
10
|
+
"kev": 0,
|
|
11
|
+
"ids": [
|
|
12
|
+
"prompt-tpl:index.js:30:Prompt_Template__user_input_interpolated_into_prompt_string_",
|
|
13
|
+
"struct:index.js:80:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
14
|
+
"struct:index.js:81:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
15
|
+
"struct:index.js:87:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)"
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"timestamp": "2026-05-18T21:57:42.021Z",
|
|
20
|
+
"label": "scan",
|
|
21
|
+
"total": 4,
|
|
22
|
+
"critical": 0,
|
|
23
|
+
"high": 1,
|
|
24
|
+
"medium": 3,
|
|
25
|
+
"low": 0,
|
|
26
|
+
"kev": 0,
|
|
27
|
+
"ids": [
|
|
28
|
+
"prompt-tpl:index.js:55:Prompt_Template__user_input_interpolated_into_prompt_string_",
|
|
29
|
+
"struct:index.js:114:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
30
|
+
"struct:index.js:115:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
31
|
+
"struct:index.js:121:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)"
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"timestamp": "2026-05-18T22:28:47.440Z",
|
|
36
|
+
"label": "scan",
|
|
37
|
+
"total": 4,
|
|
38
|
+
"critical": 0,
|
|
39
|
+
"high": 1,
|
|
40
|
+
"medium": 3,
|
|
41
|
+
"low": 0,
|
|
42
|
+
"kev": 0,
|
|
43
|
+
"ids": [
|
|
44
|
+
"prompt-tpl:index.js:55:Prompt_Template__user_input_interpolated_into_prompt_string_",
|
|
45
|
+
"struct:index.js:114:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
46
|
+
"struct:index.js:115:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
47
|
+
"struct:index.js:121:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)"
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"timestamp": "2026-05-18T22:29:03.014Z",
|
|
52
|
+
"label": "scan",
|
|
53
|
+
"total": 4,
|
|
54
|
+
"critical": 0,
|
|
55
|
+
"high": 1,
|
|
56
|
+
"medium": 3,
|
|
57
|
+
"low": 0,
|
|
58
|
+
"kev": 0,
|
|
59
|
+
"ids": [
|
|
60
|
+
"prompt-tpl:index.js:55:Prompt_Template__user_input_interpolated_into_prompt_string_",
|
|
61
|
+
"struct:index.js:114:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
62
|
+
"struct:index.js:115:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
63
|
+
"struct:index.js:121:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)"
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"timestamp": "2026-05-18T22:29:18.932Z",
|
|
68
|
+
"label": "scan",
|
|
69
|
+
"total": 4,
|
|
70
|
+
"critical": 0,
|
|
71
|
+
"high": 1,
|
|
72
|
+
"medium": 3,
|
|
73
|
+
"low": 0,
|
|
74
|
+
"kev": 0,
|
|
75
|
+
"ids": [
|
|
76
|
+
"prompt-tpl:index.js:55:Prompt_Template__user_input_interpolated_into_prompt_string_",
|
|
77
|
+
"struct:index.js:114:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
78
|
+
"struct:index.js:115:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
79
|
+
"struct:index.js:121:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)"
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"timestamp": "2026-05-18T23:16:38.135Z",
|
|
84
|
+
"label": "scan",
|
|
85
|
+
"total": 4,
|
|
86
|
+
"critical": 0,
|
|
87
|
+
"high": 1,
|
|
88
|
+
"medium": 3,
|
|
89
|
+
"low": 0,
|
|
90
|
+
"kev": 0,
|
|
91
|
+
"ids": [
|
|
92
|
+
"prompt-tpl:index.js:55:Prompt_Template__user_input_interpolated_into_prompt_string_",
|
|
93
|
+
"struct:index.js:114:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
94
|
+
"struct:index.js:115:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
95
|
+
"struct:index.js:121:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)"
|
|
96
|
+
]
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"timestamp": "2026-05-18T23:16:47.744Z",
|
|
100
|
+
"label": "scan",
|
|
101
|
+
"total": 4,
|
|
102
|
+
"critical": 0,
|
|
103
|
+
"high": 1,
|
|
104
|
+
"medium": 3,
|
|
105
|
+
"low": 0,
|
|
106
|
+
"kev": 0,
|
|
107
|
+
"ids": [
|
|
108
|
+
"prompt-tpl:index.js:55:Prompt_Template__user_input_interpolated_into_prompt_string_",
|
|
109
|
+
"struct:index.js:114:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
110
|
+
"struct:index.js:115:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
111
|
+
"struct:index.js:121:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)"
|
|
112
|
+
]
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"timestamp": "2026-05-19T00:12:15.461Z",
|
|
116
|
+
"label": "scan",
|
|
117
|
+
"total": 4,
|
|
118
|
+
"critical": 0,
|
|
119
|
+
"high": 1,
|
|
120
|
+
"medium": 3,
|
|
121
|
+
"low": 0,
|
|
122
|
+
"kev": 0,
|
|
123
|
+
"ids": [
|
|
124
|
+
"prompt-tpl:index.js:57:Prompt_Template__user_input_interpolated_into_prompt_string_",
|
|
125
|
+
"struct:index.js:116:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
126
|
+
"struct:index.js:117:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
127
|
+
"struct:index.js:123:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)"
|
|
128
|
+
]
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"timestamp": "2026-05-19T22:20:17.395Z",
|
|
132
|
+
"label": "scan",
|
|
133
|
+
"total": 7,
|
|
134
|
+
"critical": 0,
|
|
135
|
+
"high": 1,
|
|
136
|
+
"medium": 6,
|
|
137
|
+
"low": 0,
|
|
138
|
+
"kev": 0,
|
|
139
|
+
"ids": [
|
|
140
|
+
"prompt-tpl:index.js:57:Prompt_Template__user_input_interpolated_into_prompt_string_",
|
|
141
|
+
"struct:consistency.js:66:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
142
|
+
"struct:consistency.js:67:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
143
|
+
"struct:index.js:116:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
144
|
+
"struct:index.js:117:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
145
|
+
"struct:index.js:123:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
146
|
+
"toctou-fs:index.js:116"
|
|
147
|
+
]
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"timestamp": "2026-05-20T12:29:43.775Z",
|
|
151
|
+
"label": "scan",
|
|
152
|
+
"total": 7,
|
|
153
|
+
"critical": 0,
|
|
154
|
+
"high": 1,
|
|
155
|
+
"medium": 6,
|
|
156
|
+
"low": 0,
|
|
157
|
+
"kev": 0,
|
|
158
|
+
"ids": [
|
|
159
|
+
"prompt-tpl:index.js:57:Prompt_Template__user_input_interpolated_into_prompt_string_",
|
|
160
|
+
"struct:consistency.js:66:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
161
|
+
"struct:consistency.js:67:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
162
|
+
"struct:index.js:116:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
163
|
+
"struct:index.js:117:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
164
|
+
"struct:index.js:123:Synchronous_Blocking_I/O_(DoS_Risk_in_Server_Context)",
|
|
165
|
+
"toctou-fs:index.js:116"
|
|
166
|
+
]
|
|
167
|
+
}
|
|
168
|
+
]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"firstScanDate": "2026-05-18T17:45:05.477Z",
|
|
3
|
+
"lastScanDate": "2026-05-20T12:29:43.794Z",
|
|
4
|
+
"totalScans": 10,
|
|
5
|
+
"daysCleanCritical": 3,
|
|
6
|
+
"lastCleanDate": "2026-05-20",
|
|
7
|
+
"lastCriticalDate": null,
|
|
8
|
+
"hasEverHadCritical": false,
|
|
9
|
+
"bestDaysCleanCritical": 3,
|
|
10
|
+
"totalFindingsAtFirstScan": 6,
|
|
11
|
+
"totalFindingsAtLastScan": 9,
|
|
12
|
+
"totalFixesInferred": 0,
|
|
13
|
+
"lastGrade": "A-",
|
|
14
|
+
"bestGrade": "A-",
|
|
15
|
+
"launchCheckPassedAt": null,
|
|
16
|
+
"achievements": [
|
|
17
|
+
"first-scan"
|
|
18
|
+
],
|
|
19
|
+
"previousGrade": "A-"
|
|
20
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// Pass^k consistency harness for the LLM validator.
|
|
2
|
+
//
|
|
3
|
+
// The validator is the only LLM in the production code path. Its verdicts
|
|
4
|
+
// (accept / reject / escalate) feed back into which findings ship. If it
|
|
5
|
+
// returns different verdicts on the same finding across runs, the customer
|
|
6
|
+
// sees inconsistent reports — and we'd never know unless we measured.
|
|
7
|
+
//
|
|
8
|
+
// This module runs the validator N times against a fixed set of findings,
|
|
9
|
+
// records each trial's verdict per finding, and reports:
|
|
10
|
+
// - pass@k: probability that at least one of k trials gave verdict X
|
|
11
|
+
// - pass^k: probability that ALL k trials gave the SAME verdict
|
|
12
|
+
// - per-finding consistency rate
|
|
13
|
+
// - cache-key consistency: do cached runs match initial runs?
|
|
14
|
+
//
|
|
15
|
+
// "If your agent has a 75% per-trial success rate and you run 3 trials, the
|
|
16
|
+
// probability of passing all three is (0.75)³ ≈ 42%."
|
|
17
|
+
// — Anthropic on demystifying evals for AI agents
|
|
18
|
+
//
|
|
19
|
+
// The validator's caching is invalidated for each trial by varying the
|
|
20
|
+
// challenge nonce; this gives an honest cold-cache pass^k. To measure the
|
|
21
|
+
// warm-cache equivalent, set `useCache: true`.
|
|
22
|
+
|
|
23
|
+
import * as fs from 'node:fs';
|
|
24
|
+
import * as path from 'node:path';
|
|
25
|
+
import { validateOne } from './index.js';
|
|
26
|
+
|
|
27
|
+
// Build a deterministic test finding from the project's last-scan.json,
|
|
28
|
+
// or accept a hand-crafted one. Returns a clone safe to mutate per trial.
|
|
29
|
+
export function makeTrialFinding(template) {
|
|
30
|
+
return JSON.parse(JSON.stringify(template));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Run `trials` independent passes of `validateOne` on each finding. Returns
|
|
34
|
+
// a structured report. Caller is responsible for AGENTIC_SECURITY_LLM_VALIDATE
|
|
35
|
+
// / AGENTIC_SECURITY_LLM_ENDPOINT being set; if they aren't, the result will
|
|
36
|
+
// show every trial verdict as "unvalidated" — which is still a valid signal
|
|
37
|
+
// (the harness ran cleanly; the validator is simply off).
|
|
38
|
+
export async function measureConsistency({
|
|
39
|
+
findings,
|
|
40
|
+
fileContents = {},
|
|
41
|
+
scanRoot,
|
|
42
|
+
trials = 5,
|
|
43
|
+
useCache = false,
|
|
44
|
+
} = {}) {
|
|
45
|
+
if (!Array.isArray(findings) || findings.length === 0) {
|
|
46
|
+
return { ok: false, reason: 'no-findings-supplied' };
|
|
47
|
+
}
|
|
48
|
+
if (!Number.isInteger(trials) || trials < 2 || trials > 50) {
|
|
49
|
+
return { ok: false, reason: 'trials-out-of-range' };
|
|
50
|
+
}
|
|
51
|
+
// For cold-cache mode, delete each finding's cache entry between trials.
|
|
52
|
+
// We do this by NOT setting a cache dir per trial — easier: each trial
|
|
53
|
+
// gets a fresh tmp scanRoot for the cache.
|
|
54
|
+
const perFinding = new Map(); // findingId → { verdicts: [], confidences: [] }
|
|
55
|
+
for (const f of findings) perFinding.set(f.id || f.stableId || 'unknown', { verdicts: [], confidences: [], reasons: [] });
|
|
56
|
+
|
|
57
|
+
for (let t = 0; t < trials; t++) {
|
|
58
|
+
for (const finding of findings) {
|
|
59
|
+
const trial = makeTrialFinding(finding);
|
|
60
|
+
// If useCache is false, we want each trial to bypass the cache; we
|
|
61
|
+
// simulate by mutating the finding's file in a way the cache key
|
|
62
|
+
// hashes over. Simpler: clear the per-scanRoot cache before each trial.
|
|
63
|
+
if (!useCache && scanRoot) {
|
|
64
|
+
try {
|
|
65
|
+
const cacheDir = path.join(scanRoot, '.agentic-security', 'llm-cache');
|
|
66
|
+
if (fs.existsSync(cacheDir)) {
|
|
67
|
+
for (const e of fs.readdirSync(cacheDir)) fs.unlinkSync(path.join(cacheDir, e));
|
|
68
|
+
}
|
|
69
|
+
} catch { /* best-effort */ }
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
await validateOne(trial, fileContents, scanRoot);
|
|
73
|
+
} catch (e) {
|
|
74
|
+
trial.validator_verdict = 'error';
|
|
75
|
+
trial._validatorError = String((e && e.message) || e);
|
|
76
|
+
}
|
|
77
|
+
const key = finding.id || finding.stableId || 'unknown';
|
|
78
|
+
const slot = perFinding.get(key);
|
|
79
|
+
slot.verdicts.push(trial.validator_verdict || 'unset');
|
|
80
|
+
slot.confidences.push(typeof trial.llm_confidence === 'number' ? trial.llm_confidence : null);
|
|
81
|
+
slot.reasons.push(trial._validatorError || null);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Score per-finding consistency.
|
|
86
|
+
const findingReports = [];
|
|
87
|
+
let stableCount = 0;
|
|
88
|
+
for (const [id, slot] of perFinding) {
|
|
89
|
+
const counts = {};
|
|
90
|
+
for (const v of slot.verdicts) counts[v] = (counts[v] || 0) + 1;
|
|
91
|
+
const dominant = Object.entries(counts).sort((a, b) => b[1] - a[1])[0];
|
|
92
|
+
const stable = dominant[1] === trials;
|
|
93
|
+
if (stable) stableCount++;
|
|
94
|
+
findingReports.push({
|
|
95
|
+
id,
|
|
96
|
+
verdicts: slot.verdicts,
|
|
97
|
+
dominantVerdict: dominant[0],
|
|
98
|
+
dominantRate: dominant[1] / trials,
|
|
99
|
+
stable,
|
|
100
|
+
confidenceMean: _mean(slot.confidences),
|
|
101
|
+
confidenceStdev: _stdev(slot.confidences),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
const passK = stableCount / perFinding.size;
|
|
105
|
+
|
|
106
|
+
return {
|
|
107
|
+
ok: true,
|
|
108
|
+
trials,
|
|
109
|
+
findingCount: perFinding.size,
|
|
110
|
+
passK_unanimous: passK, // pass^k where the bar is "all k agree"
|
|
111
|
+
findings: findingReports,
|
|
112
|
+
when: new Date().toISOString(),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function _mean(arr) {
|
|
117
|
+
const v = arr.filter(x => typeof x === 'number');
|
|
118
|
+
if (!v.length) return null;
|
|
119
|
+
return v.reduce((a, c) => a + c, 0) / v.length;
|
|
120
|
+
}
|
|
121
|
+
function _stdev(arr) {
|
|
122
|
+
const v = arr.filter(x => typeof x === 'number');
|
|
123
|
+
if (v.length < 2) return null;
|
|
124
|
+
const m = _mean(v);
|
|
125
|
+
const sq = v.reduce((a, c) => a + (c - m) * (c - m), 0) / (v.length - 1);
|
|
126
|
+
return Math.sqrt(sq);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Render a one-screen summary for CLI.
|
|
130
|
+
export function summarize(report) {
|
|
131
|
+
if (!report || !report.ok) return `consistency: ${report?.reason || 'unknown error'}`;
|
|
132
|
+
const lines = [];
|
|
133
|
+
lines.push(`llm-validator consistency — trials=${report.trials}, findings=${report.findingCount}`);
|
|
134
|
+
lines.push(` pass^${report.trials} (unanimous): ${(report.passK_unanimous * 100).toFixed(1)}%`);
|
|
135
|
+
lines.push('');
|
|
136
|
+
for (const f of report.findings) {
|
|
137
|
+
lines.push(` · ${String(f.id).slice(0, 40).padEnd(40)} ${f.stable ? 'STABLE' : 'FLAPS'} ${f.dominantVerdict} (${(f.dominantRate*100).toFixed(0)}%) conf=${f.confidenceMean?.toFixed(2) ?? 'n/a'}±${f.confidenceStdev?.toFixed(2) ?? 'n/a'}`);
|
|
138
|
+
if (!f.stable) lines.push(` verdicts: [${f.verdicts.join(', ')}]`);
|
|
139
|
+
}
|
|
140
|
+
return lines.join('\n');
|
|
141
|
+
}
|