@clear-capabilities/agentic-security-scanner 0.156.0 → 0.157.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.
package/CHANGELOG.md CHANGED
@@ -9,6 +9,32 @@
9
9
  > make the history less accurate, not more.
10
10
 
11
11
 
12
+ ## 0.157.1 - `ci` summary adds up; Haskell and Nix/NixOS shown in the language table, the npm README and the manifests
13
+
14
+ One scanner fix, otherwise documentation and metadata.
15
+
16
+ - **`agentic-security ci` prints every severity.** The summary line tallied `info` findings but never printed them, so a scan with info findings showed a total that did not equal the listed counts (the README example read 45 findings beside counts summing to 33). The line now ends `· N info`, and `test/ci.test.js` pins that the printed counts sum to the total and match `findings.json`. The README, `docs/guides/ci-setup.md` and `docs/walkthroughs/assurance-modes.md` examples were re-captured from a real run of the demo app (44 findings: 3 critical, 6 high, 7 medium, 16 low, 12 info).
17
+
18
+ - **README language table** lists Haskell and Nix/NixOS beside the nine first-class languages, linking to their guides and to the per-capability support record.
19
+ - **The npm package has a README.** `scanner/README.md` is new (the package page was empty); it states the supported languages, that both are scanned statically, and the limits of the measurement.
20
+ - **Manifests.** `haskell`, `nix` and `nixos` keywords on the plugin and marketplace manifests, and a Haskell/Nix line in the scanner package description.
21
+
22
+ This entry makes no claim about how many requirements are verified: that number is derived from the controller's evidence for the exact tree it ran on, and this release has not had a new controller pass.
23
+
24
+ ## 0.157.0 - hosted verification for the suites that need Nix or NixOS
25
+
26
+ NIX-011 needs `nix` and NIX-012 needs a booted NixOS, which a developer's laptop often lacks, so the loop controller could only ever report them as blocked. This release lets the controller run them on a GitHub-hosted runner and record the outcome as evidence, bound to the exact commit.
27
+
28
+ - **Hosted-CI executor** (`scripts/loop-engineering/lib/remote.mjs`, `.github/workflows/verify-remote.yml`). A suite whose profile entry has a `remote` block runs on a hosted runner when the required tool is missing locally. The controller refuses unless the tree is clean and HEAD is the tip of a pushed branch, dispatches the committed workflow with the commit, the requirement, the watch globs and a nonce, finds ITS run by the nonce, requires the runner's digest of the watched files to equal its own (the runner uses `scripts/loop-engineering/digest.mjs`, the controller's own code), reads per-leg TAP, and requires every leg to pass every criterion. Evidence is labelled `controller+hosted-ci` with the run id, artifact digest and a limitation line; it is never presented as a local run. Dispatch and download are retried a few times on a reset connection (GitHub resets one now and then); a real error is not retried. A failed run, a wrong commit or digest, a missing leg or file, a hash mismatch or a skipped test fails closed; if the preflight cannot be met the requirement is blocked, not passed.
29
+ - **NixOS guests.** The NIX-012 suite runs under a TAP reporter inside each guest and the output is copied out. NIX-012 has two legs: an x86_64 guest on KVM, and an aarch64 guest emulated in software on the x86_64 host (the criterion allows "actual tested emulation"; arm runners have no KVM). The test driver's fixed five-minute shell wait is stretched for the emulated guest, and the guest test asserts `uname -m`, so a leg's name cannot be a false label.
30
+ - **Docs.** `docs/guides/loop-engineering.md` has a "Hosted verification" section stating what the mode requires and what it trusts (GitHub's account of what ran, and the committed workflow).
31
+
32
+ - **The executor never blocks the controller and survives sleep.** Its `gh` and `git` calls are asynchronous (a synchronous call froze the controller's heartbeat for as long as GitHub took to answer), and every deadline uses a monotonic clock, so a machine that sleeps cannot expire a ten-minute wait before the process has polled once (a real failure seen during this release's own verification).
33
+ - **The status says which requirements were verified remotely.** `docs/completion-status.json` now records the hosted-verified requirements (run id, URL, commit, legs) and the README status block says so, so "all verified" is never read as "all verified on this machine".
34
+ - **The model-spend cap gates model work only.** The controller checked its $50 model budget at the top of its loop, so a run that had spent it could not even re-validate stale evidence or run the final phase, neither of which uses the model. The cap is unchanged and still refuses any further worker attempt; the wall-clock and attempt budgets still gate everything.
35
+
36
+ This entry deliberately says nothing about how many requirements are verified: that number is derived from the controller's evidence and is in `docs/completion-status.json` and the README status block.
37
+
12
38
  ## 0.156.0 - the three below-target rows fixed, measured on a fresh unseen set
13
39
 
14
40
  0.155.0 reported Haskell SAST recall (79.2%), Haskell taint precision (77.8%) and Nix config-sast precision (86.1%) below target on shapes the templates did not contain, while the frozen holdout said 100%. Each gap was read against the code and fixed in the engine, not in the scoring.
package/README.md ADDED
@@ -0,0 +1,22 @@
1
+ # @clear-capabilities/agentic-security-scanner
2
+
3
+ The scan engine behind the [agentic-security](https://github.com/Clear-Capabilities/agentic-security) Claude Code plugin: SAST, SCA with function-level reachability and CISA KEV, secrets, IaC, prompt-injection and MCP/agent-tool audit, auth/authZ analysis, SBOM/AI-BOM, and compliance evidence.
4
+
5
+ ```bash
6
+ npx @clear-capabilities/agentic-security-scanner scan .
7
+ ```
8
+
9
+ ## Languages
10
+
11
+ JavaScript/TypeScript, Python, Java, Kotlin, Go, Ruby, PHP, C#, Rust, **Haskell** and **Nix/NixOS**.
12
+
13
+ - **Haskell** (`.hs`, `.lhs`, `.hs-boot`, `.hsc`, Cabal and Stack): SAST, taint, web routes and auth, privacy lineage, dependency inventory and SBOM, verified fixes.
14
+ - **Nix and NixOS** (`.nix`, flakes, NixOS and Home Manager modules): effective-configuration analysis, host hardening, secrets and build-trust checks, dependency inventory and SBOM, verified fixes.
15
+
16
+ Both are scanned with no compiler, no `nix` binary and no network. Each capability is reported **supported** only from measured evidence of its own kind, and **blocked** when it needs a tool the measurement did not have; the corpus behind the figures is synthetic, so they describe robustness over those shapes, not arbitrary real-world code. Read the [Haskell guide](https://github.com/Clear-Capabilities/agentic-security/blob/main/docs/guides/haskell.md), the [Nix and NixOS guide](https://github.com/Clear-Capabilities/agentic-security/blob/main/docs/guides/nix-nixos.md), [installing on NixOS](https://github.com/Clear-Capabilities/agentic-security/blob/main/docs/guides/nixos-install.md) and the [support record](https://github.com/Clear-Capabilities/agentic-security/blob/main/docs/language-support.md).
17
+
18
+ The repository's Nix flake packages the scanner with `agentic-security`, `agentic-security-mcp` and `agentic-security-lsp` binaries, and ships NixOS VM tests (`checks.<system>.nixos-host`).
19
+
20
+ ## More
21
+
22
+ Full documentation, the plugin, and the IDE integrations are in the [repository README](https://github.com/Clear-Capabilities/agentic-security#readme). License: PolyForm Internal Use 1.0.0.
@@ -1373,7 +1373,7 @@ async function cmdCi(args) {
1373
1373
  ? `[ci] ⚠ scan-health=${_health.status} — ${(_health.conditions || [])[0] || 'analysis did not complete cleanly'}${(_health.conditions || []).length > 1 ? ` (+${_health.conditions.length - 1} more)` : ''}\n`
1374
1374
  : `[ci] scan-health=${_health && _health.status ? _health.status : 'unknown'}\n`;
1375
1375
  process.stderr.write(
1376
- `[ci] ${findings.length} findings — ${sev.critical} critical · ${sev.high} high · ${sev.medium} medium · ${sev.low} low\n` +
1376
+ `[ci] ${findings.length} findings — ${sev.critical} critical · ${sev.high} high · ${sev.medium} medium · ${sev.low} low · ${sev.info} info\n` +
1377
1377
  _healthLine +
1378
1378
  (_canWriteCi
1379
1379
  ? `[ci] artifacts: .agentic-security/findings.{json,sarif,junit.xml}\n`