@clear-capabilities/agentic-security-scanner 0.193.0 → 0.194.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.
@@ -1 +1 @@
1
- 5d8fb492821f3d892794686f94fddc357697b3e888607cdc87d4cb3aaf6a8563 agentic-security.mjs
1
+ a5effeacf7992589350ec73fb05df4bb43d599890184ab0361f9a6bf76a6505c agentic-security.mjs
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clear-capabilities/agentic-security-scanner",
3
- "version": "0.193.0",
3
+ "version": "0.194.0",
4
4
  "description": "Scanner engine for the agentic-security Claude Code plugin: SAST, SCA with reachability and CISA KEV, secrets, IaC, Haskell and Nix/NixOS, prompt-injection, MCP/agent-tool audit, authZ analysis, SBOM, compliance attestation, and more.",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -79,7 +79,7 @@
79
79
  "ee:runtime-audit": "node ../scripts/engineering-excellence/runtime-audit.mjs",
80
80
  "ee:ir-matrix": "node ../scripts/engineering-excellence/ir-matrix.mjs",
81
81
  "test:loop-real-prd": "node --test ../scripts/loop-engineering/test/loop-real-prd.test.js",
82
- "test:loop": "node --test --test-concurrency=1 ../scripts/loop-engineering/test/loop-manifest.test.js ../scripts/loop-engineering/test/loop-watchdog.test.js ../scripts/loop-engineering/test/loop-background.test.js ../scripts/loop-engineering/test/loop-dashboard.test.js ../scripts/loop-engineering/test/loop-evidence.test.js ../scripts/loop-engineering/test/loop-recovery.test.js ../scripts/loop-engineering/test/loop-remote.test.js ../scripts/loop-engineering/test/loop-runbook.test.js ../scripts/loop-engineering/test/loop-assurance-profile.test.js ../scripts/loop-engineering/test/loop-assurance-runtime.test.js ../scripts/loop-engineering/test/loop-bounds.test.js ../scripts/loop-engineering/test/loop-spend.test.js ../scripts/loop-engineering/test/loop-ci-attest.test.js",
82
+ "test:loop": "node --test --test-concurrency=3 ../scripts/loop-engineering/test/loop-manifest.test.js ../scripts/loop-engineering/test/loop-watchdog.test.js ../scripts/loop-engineering/test/loop-background.test.js ../scripts/loop-engineering/test/loop-dashboard.test.js ../scripts/loop-engineering/test/loop-evidence.test.js ../scripts/loop-engineering/test/loop-recovery.test.js ../scripts/loop-engineering/test/loop-remote.test.js ../scripts/loop-engineering/test/loop-runbook.test.js ../scripts/loop-engineering/test/loop-assurance-profile.test.js ../scripts/loop-engineering/test/loop-assurance-runtime.test.js ../scripts/loop-engineering/test/loop-bounds.test.js ../scripts/loop-engineering/test/loop-spend.test.js ../scripts/loop-engineering/test/loop-ci-attest.test.js",
83
83
  "test:python": "node ../scripts/run-python-tests.mjs",
84
84
  "bench:dag-incremental": "node ../bench/dag-incremental/run.mjs",
85
85
  "test:smoke": "node --test test/smoke.test.js test/demo-app.test.js",
@@ -118,7 +118,7 @@
118
118
  "evaluation": "node ../scripts/evaluation.mjs",
119
119
  "evaluation:synthetic": "node ../scripts/evaluation.mjs synthetic",
120
120
  "test:routing": "node --test test/routing/outcomes.test.js test/routing/economics.test.js test/routing/adapter.test.js test/routing/calibration.test.js test/routing/decide.test.js test/routing/unchanged-when-off.test.js test/routing/shadow.test.js test/routing/promotion.test.js test/routing/drift.test.js test/routing/canary.test.js test/routing/feedback.test.js test/routing/report.test.js",
121
- "test:release-closure": "node --test test/release-closure/closure-plan.test.js test/release-closure/closure-record.test.js test/release-closure/compatibility.test.js test/release-closure/rollout-stages.test.js test/release-closure/migration-readers.test.js test/release-closure/rollback.test.js test/release-closure/wrappers.test.js test/release-closure/final-closure.test.js test/release-closure/final-closure-controller.test.js test/release-closure/runner-hardening.test.js test/release-closure/remote-attestation.test.js",
121
+ "test:release-closure": "node --test test/release-closure/closure-plan.test.js test/release-closure/closure-record.test.js test/release-closure/compatibility.test.js test/release-closure/rollout-stages.test.js test/release-closure/migration-readers.test.js test/release-closure/rollback.test.js test/release-closure/wrappers.test.js test/release-closure/final-closure.test.js test/release-closure/final-closure-controller.test.js test/release-closure/runner-hardening.test.js test/release-closure/remote-attestation.test.js test/release-closure/closure-parallel.test.js",
122
122
  "release:closure:check": "node ../scripts/release-closure.mjs --run",
123
123
  "release:closure:static": "node ../scripts/release-closure.mjs --static",
124
124
  "test:documentation": "node --test test/documentation/drift-check.test.js test/documentation/generated-pages.test.js test/documentation/scope-and-examples.test.js test/documentation/policy-cards.test.js test/documentation/operations-and-review.test.js",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clear-capabilities/agentic-security-scanner",
3
- "version": "0.193.0",
3
+ "version": "0.194.0",
4
4
  "description": "Scanner engine for the agentic-security Claude Code plugin: SAST, SCA with reachability and CISA KEV, secrets, IaC, Haskell and Nix/NixOS, prompt-injection, MCP/agent-tool audit, authZ analysis, SBOM, compliance attestation, and more.",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -79,7 +79,7 @@
79
79
  "ee:runtime-audit": "node ../scripts/engineering-excellence/runtime-audit.mjs",
80
80
  "ee:ir-matrix": "node ../scripts/engineering-excellence/ir-matrix.mjs",
81
81
  "test:loop-real-prd": "node --test ../scripts/loop-engineering/test/loop-real-prd.test.js",
82
- "test:loop": "node --test --test-concurrency=1 ../scripts/loop-engineering/test/loop-manifest.test.js ../scripts/loop-engineering/test/loop-watchdog.test.js ../scripts/loop-engineering/test/loop-background.test.js ../scripts/loop-engineering/test/loop-dashboard.test.js ../scripts/loop-engineering/test/loop-evidence.test.js ../scripts/loop-engineering/test/loop-recovery.test.js ../scripts/loop-engineering/test/loop-remote.test.js ../scripts/loop-engineering/test/loop-runbook.test.js ../scripts/loop-engineering/test/loop-assurance-profile.test.js ../scripts/loop-engineering/test/loop-assurance-runtime.test.js ../scripts/loop-engineering/test/loop-bounds.test.js ../scripts/loop-engineering/test/loop-spend.test.js ../scripts/loop-engineering/test/loop-ci-attest.test.js",
82
+ "test:loop": "node --test --test-concurrency=3 ../scripts/loop-engineering/test/loop-manifest.test.js ../scripts/loop-engineering/test/loop-watchdog.test.js ../scripts/loop-engineering/test/loop-background.test.js ../scripts/loop-engineering/test/loop-dashboard.test.js ../scripts/loop-engineering/test/loop-evidence.test.js ../scripts/loop-engineering/test/loop-recovery.test.js ../scripts/loop-engineering/test/loop-remote.test.js ../scripts/loop-engineering/test/loop-runbook.test.js ../scripts/loop-engineering/test/loop-assurance-profile.test.js ../scripts/loop-engineering/test/loop-assurance-runtime.test.js ../scripts/loop-engineering/test/loop-bounds.test.js ../scripts/loop-engineering/test/loop-spend.test.js ../scripts/loop-engineering/test/loop-ci-attest.test.js",
83
83
  "test:python": "node ../scripts/run-python-tests.mjs",
84
84
  "bench:dag-incremental": "node ../bench/dag-incremental/run.mjs",
85
85
  "test:smoke": "node --test test/smoke.test.js test/demo-app.test.js",
@@ -118,7 +118,7 @@
118
118
  "evaluation": "node ../scripts/evaluation.mjs",
119
119
  "evaluation:synthetic": "node ../scripts/evaluation.mjs synthetic",
120
120
  "test:routing": "node --test test/routing/outcomes.test.js test/routing/economics.test.js test/routing/adapter.test.js test/routing/calibration.test.js test/routing/decide.test.js test/routing/unchanged-when-off.test.js test/routing/shadow.test.js test/routing/promotion.test.js test/routing/drift.test.js test/routing/canary.test.js test/routing/feedback.test.js test/routing/report.test.js",
121
- "test:release-closure": "node --test test/release-closure/closure-plan.test.js test/release-closure/closure-record.test.js test/release-closure/compatibility.test.js test/release-closure/rollout-stages.test.js test/release-closure/migration-readers.test.js test/release-closure/rollback.test.js test/release-closure/wrappers.test.js test/release-closure/final-closure.test.js test/release-closure/final-closure-controller.test.js test/release-closure/runner-hardening.test.js test/release-closure/remote-attestation.test.js",
121
+ "test:release-closure": "node --test test/release-closure/closure-plan.test.js test/release-closure/closure-record.test.js test/release-closure/compatibility.test.js test/release-closure/rollout-stages.test.js test/release-closure/migration-readers.test.js test/release-closure/rollback.test.js test/release-closure/wrappers.test.js test/release-closure/final-closure.test.js test/release-closure/final-closure-controller.test.js test/release-closure/runner-hardening.test.js test/release-closure/remote-attestation.test.js test/release-closure/closure-parallel.test.js",
122
122
  "release:closure:check": "node ../scripts/release-closure.mjs --run",
123
123
  "release:closure:static": "node ../scripts/release-closure.mjs --static",
124
124
  "test:documentation": "node --test test/documentation/drift-check.test.js test/documentation/generated-pages.test.js test/documentation/scope-and-examples.test.js test/documentation/policy-cards.test.js test/documentation/operations-and-review.test.js",
@@ -20,9 +20,10 @@
20
20
  // * Podman is not probed: it is a supported engine name, and no run against it exists.
21
21
  // * macOS is unmeasured. Docker Desktop runs containers in a VM, so bind mounts, uids and file ownership behave differently from the Linux
22
22
  // measurement; no macOS container run has been recorded.
23
- // * The haskell:9 image is wired (CONTAINER_TOOLS, CONTAINER_PATH) but its toolchain layout for a non-root user was never run against a real
24
- // engine; the measurement skips Haskell unless AGENTIC_SECURITY_PROOF_CONTAINER_HASKELL=1 (bench/proof-fabric/measure.mjs). The result file
25
- // names no .NET image either, so the dotnet SDK image is unverified in the same way.
23
+ // * The haskell:9 image: its first real-engine run (0.194.0 pull request) failed with `ghc: not found`, because GHC lives in /opt/ghc/<version>/bin
24
+ // and not /opt/ghc/bin; `containerArgs` now resolves that directory inside the container. Whether the leg then passes is the `proof-container`
25
+ // job's result; the measurement still skips Haskell unless AGENTIC_SECURITY_PROOF_CONTAINER_HASKELL=1 (bench/proof-fabric/measure.mjs). The
26
+ // result file names no .NET image either, so the dotnet SDK image is unverified in the same way.
26
27
  // * A reproducer that needs the loopback callback listener (SSRF) cannot run with `--network none` and is skipped, not measured.
27
28
  import { spawnSync } from 'node:child_process';
28
29
  import { superviseSpawn } from '../../sandbox/supervise.js';
@@ -47,7 +48,11 @@ export function containerArgs({ image, name, hostRoot, argv, env = {}, limits, u
47
48
  '-e', 'HOME=/work', '-e', `PATH=${CONTAINER_PATH}`, '-e', 'CI=1',
48
49
  ];
49
50
  for (const [k, v] of Object.entries(env)) args.push('-e', `${k}=${v}`);
50
- args.push(image, ...argv);
51
+ // The haskell image keeps GHC in a VERSIONED directory (/opt/ghc/<version>/bin, found by the first real-engine Haskell run: `ghc: not found` with an
52
+ // unversioned /opt/ghc/bin on PATH), and the version floats with the tag. The directory is resolved inside the container, after the environment
53
+ // (including a reproducer's own PATH) has been applied, so nothing here depends on which GHC the image carries.
54
+ const inner = /^haskell:/.test(image) ? ['sh', '-c', 'for d in /opt/ghc/*/bin; do PATH="$d:$PATH"; done; export PATH; exec "$@"', 'sh', ...argv] : argv;
55
+ args.push(image, ...inner);
51
56
  return args;
52
57
  }
53
58
 
@@ -158,9 +158,14 @@ export async function runAttempt(reproducer, opts = {}) {
158
158
  const errs = validateReproducer(reproducer);
159
159
  if (errs.length) return done({ status: 'invalid', reasons: errs });
160
160
  const tools = opts.tools ?? hostTools();
161
- const sup = languageSupport(reproducer.lang, tools);
162
- if (!sup.supported) return done({ status: 'unsupported', reasons: [sup.reason] });
163
161
  const env = opts.environment ?? selectEnvironment({ lang: reproducer.lang, requireContainer: opts.requireContainer, preferContainer: opts.preferContainer ?? true, force: opts.force });
162
+ // Which toolchain must exist depends on WHERE the program runs. Inside a container it is the image's (CONTAINER_TOOLS), so the host's toolchain is
163
+ // irrelevant: judging a container run by the host's tools made every Haskell proof `unsupported` on a runner without GHC, however good the image
164
+ // (found by the first hosted container run of the Haskell leg; a developer machine with GHC installed hid it).
165
+ if (env.mode !== 'container') {
166
+ const sup = languageSupport(reproducer.lang, tools);
167
+ if (!sup.supported) return done({ status: 'unsupported', environment: env, reasons: [sup.reason] });
168
+ }
164
169
  if (env.mode === 'unavailable') return done({ status: 'blocked', environment: env, reasons: [env.reason] });
165
170
  const inContainer = env.mode === 'container';
166
171
  if (inContainer && reproducer.network === 'callback') {