- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.51to15.10.54. See the reachability analysis changelog for engine changes.
-
--base-commit-shanow sets the range changed-file detection reads, so a manifest changed anywhere between that commit and HEAD triggers a comparison. Previously only a recognized GitHub, GitLab, Bitbucket, or Buildkite pull request read a full range, and every other run saw the current commit alone. -
A base commit that cannot be resolved in the checkout now warns instead of narrowing the comparison to a single commit.
-
A full scan reports its findings as repository findings rather than new ones, and labels its link
Report Url. The summary states why the counts do not affect the exit code. -
Removed and replaced packages with a namespace no longer render a duplicated purl in the dependency overview comment.
-
The 200-character cap on the commit message now applies to the value read from the repository, not only to
--commit-message. A truncated message ends in...and the truncation is reported at INFO. -
A full scan refused for its size (HTTP 413, 414 or 431) now distinguishes possible upload-size and request-metadata causes and reports what to shorten.
--ignore-commit-filesis documented as forcing a comparison, which is what it does. The CLI reference and--helpdescribed it as forcing a full scan.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.48to15.10.51. See the reachability analysis changelog for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.46to15.10.48. See the reachability analysis changelog for engine changes.
- Bumped
gitpythonfrom3.1.59to3.1.62(CVE-2026-87817, CVE-2026-87818, CVE-2026-87819) and the transitivesoupsievepin from2.8.4to2.9.2(GHSA-gjv8-xp57-g29c, GHSA-j934-xhv5-fg8f). - Normalized the
gitpythonrequirement to its lowercase PEP 503 name.
pip-auditmoved out of the Unit Tests workflow into a new Dependency Audit workflow that also runs daily, so advisories published against unchanged pins are reported on their own schedule rather than on the next push.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.45to15.10.46. See the reachability analysis changelog for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.44to15.10.45. See the reachability analysis changelog for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.43to15.10.44. See the reachability analysis changelog for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.41to15.10.43. See the reachability analysis changelog for engine changes.
- The native console alert table now includes a
Patched Versioncolumn, populated fromprops.firstPatchedVersionIdentifierwhen the API provides it. - GitHub pull request and GitLab merge request security comments now show the patched version in each applicable alert's details.
- Pull request numbers are detected from standard GitHub Actions, GitLab CI,
and Azure Pipelines environments when
--pr-numberis not supplied. An explicitly supplied value, including0, remains authoritative. - The Buildkite workflow and CI/CD guide now forward
BUILDKITE_PULL_REQUESTexplicitly and document provider selection for Dashboard PR association. With--integration githubor--integration gitlab, the repository slug and host for the link are read fromBUILDKITE_REPO, covering self-hosted installations. --scm githuband--scm gitlabnow imply the matching scan integration unless--integrationis explicitly supplied.- Diff scans include the detected pull request or merge request URL as their external link, allowing Dashboard reports to retain their CI change context. Re-running a comparison over an already-compared scan pair now applies the link to the existing diff scan instead of leaving that report unassociated.
- A
--pr-numbervalue that is not a positive integer is now normalized to0before the GitHub adapter reads it, so Buildkite'sfalseon a branch build no longer makes that build look like a pull request event.
- With
--scm githubor--scm gitlab, only pull request and merge request events create diff scans. Every other pipeline, including default-branch pushes, creates a full scan. The detected event type is authoritative:--enable-diffand--ignore-commit-filesno longer opt an SCM branch run into comparison mode. - Those runs no longer set a blocking exit code. A full scan has no baseline, so
it cannot distinguish newly introduced alerts from pre-existing ones; the CLI
now behaves as if
--disable-blockingwas supplied, matching how it already treats a run with no supported manifest files. Pull request and merge request pipelines are unaffected and still block. --generate-licenseand--legal-format fossafetch the package list on this path, so attribution files generated from a branch pipeline are complete rather than empty.- Console-only full scans link to the Socket report and state that findings were not fetched for console output instead of presenting an empty local alert list as "No issues found."
- License enrichment keeps the package namespace in PURL requests and response matching, so scoped npm packages and namespaced Maven packages receive their license details.
- An ignore command suppresses a security alert, but the CLI honored one from any commenter, including a drive-by comment from someone with no access to the repository. Commands are now accepted only from an author with write access.
- On GitHub this is read from the effective repository permission and cached per
commenter for the run. Write, maintain, or admin access is required; relationship
labels such as
MEMBERandCOLLABORATORare not treated as permissions. - A 404 from GitHub's collaborator-permission endpoint is treated as a definitive
denial rather than an unreadable permission, so the default
enforcepolicy does not honor ignore commands from users outside the repository. - GitLab notes carry no equivalent field, so project membership is read once per
run (only when an ignore command is present) and Developer or above is required.
If that lookup cannot be answered — a
CI_JOB_TOKENgenerally cannot read the members API — the command is still honored and a warning names the author, so enabling this does not silently break pipelines that relied on ignore commands. Use aGITLAB_TOKENwith API read access to get enforcement. - A rejected command is logged and is also absent from the ignore telemetry, which records what was acted on. No acknowledgement reaction is added to a comment that was not honored.
--ignore-authorizationselects the policy:enforce(default) requires write access and honors the command with a warning where the provider cannot report it,strictrejects it in that case instead, andoffperforms no check.
- When a GitLab token's type cannot be inferred from its shape, the CLI guesses
between Bearer and PRIVATE-TOKEN and retries once under the other scheme on a
401. That retry never happened: the retry caught
requests.exceptions.HTTPError, but the HTTP client translates every request error intoAPIFailurefirst, so a misclassified token failed the run instead of falling back. - API failures raised by the CLI's HTTP client now carry their HTTP status code.
Without it a 401 was indistinguishable from any other failure, and
is_transient_errorcould not classify one either. - The CLI's
APIFailurenow subclasses the SDK exception of the same name. They were independent types, so anexcept APIFailureimporting the SDK's — which is what every handler insocketsecurity.coredoes — did not catch a failure raised by the HTTP client.
- Per-alert ignore instructions now use ecosystem-qualified package names and
accept scoped packages while remaining compatible with older bare-name replies.
A leading npm scope is no longer mistaken for an ecosystem, so
ignore @types/node@*no longer also ignores the package namednode. - Ignore telemetry uses the same package matcher as alert suppression, so legacy bare-name commands generate an event for the alert they suppress.
- Dependency overviews preserve added, updated, removed, and replaced package classifications instead of presenting updates as new dependencies. Added and updated rows keep their diff badge; removed and replaced, which have no published badge, use a text label.
- Shared security comment copy no longer describes GitLab merge request output as Socket for GitHub.
- Updating a security comment in the legacy table format no longer raises on a
malformed row. Each row was unpacked through four consecutive splits with no
bounds checks, so a cell carrying an extra
|, a package cell that is not a markdown link, or a name with no version ended the run before it reported status — and a scoped package name in Socket's own table was enough to trigger it. Rows are now parsed defensively, and a row that cannot be read keeps its alert reported. Ignore commands for a scoped package are accepted there in both the ecosystem-qualified and bare forms. - Server URLs read from
GITHUB_SERVER_URLandCI_SERVER_URLare validated as http(s) URLs before being composed into a diff scan's external link, matching the check already applied to the other repository URLs read from CI. - Repository-derived values are escaped before they are rendered into a pull request or merge request comment. Manifest paths and sources are file paths from the scanned repository, and alert text comes from the API; neither is markup the CLI authored, so both are now escaped at the point they are interpolated. The alert markers can no longer be terminated early by a package name. Slack, Jira and console output are unchanged, since none of them render HTML.
- Full-scan package identities and Socket links now preserve namespaced packages when the SDK returns enum-backed ecosystem values.
- Namespaced package links separate the namespace from the name instead of concatenating them, so Maven links no longer fuse groupId and artifactId into a single unresolvable path segment. A namespaced package whose namespace is missing now logs a warning rather than emitting a broken link silently.
- GitLab dependency-scanning reports emit CVE and GHSA identifiers from current API fields while remaining compatible with legacy CVE data.
- GitLab report findings record the manifest they came from when the package's
introducing chain is unavailable, instead of reporting the location as
unknown, and report whether a dependency is direct from the package record rather than inferring it from a dependency-path string that is never produced. --base-commit-shadegrades to the nearest scanned ancestor of the requested commit instead of failing the run, and logs which commit was used and how far back it is. Squash merges, rebases, and multi-commit pushes all leave a merge base unscanned even when default-branch scanning is configured correctly. The lookup follows paginated scan history and the run still fails when no scanned ancestor is reachable or the exact-commit lookup itself fails.- Implicit diff baselines are selected from the same workspace, scan type, repository, and default branch, including when no workspace is supplied. A baseline lookup that fails is reported as an API error instead of resolving to an empty baseline, and temporary scans are skipped when selecting one.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.40to15.10.41. See the reachability analysis changelog for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.39to15.10.40. See the reachability analysis changelog for engine changes.
- Added aggregate scan configuration, manifest-count, baseline-selection, and fallback diagnostics without listing submitted manifest paths.
- Clarified monorepo scan scoping, workspace flags, CI path filters, and timeout behavior, with a changed-workspace GitHub Actions example.
- Bumped the pinned SDK (
socketdev) from3.5.0to3.6.0. Its package-type enum gained ten members —alpm,chrome,clawhub,edge-extension,firefox-extension,qpkg,socket,swid,vscodeandvscode-extension— so artifacts of those types are now reported under their own type instead of falling back tounknown.
- Full-scan and streamed-diff API failures now use the configured infrastructure error exit code instead of the security-finding exit code.
- The Slack reachability formatter keyed every severity lookup on
medium, but the API sendsmiddle. A mid-severity finding therefore missed all of them at once: it was not counted, so the summary always readMedium: 0; it was excluded fromtotal_findings, which can drive the "and N more" count negative; and it sorted at the default order of 4, belowlow, so it was the first thing truncated when the Slack block limit was reached. - Severity is now normalized to one spelling when an alert is read, matching how the GitLab and PR-comment paths already handle both forms. The findings themselves were always listed; only the counts, ordering and truncation were wrong.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.36to15.10.39. See the Coana changelogs for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.32to15.10.36. See the Coana changelogs for engine changes.
- Scans with no supported manifest files uploaded a zero-byte
.socket.facts.jsonplaceholder. The API cannot parse that, and answers by adding ageneric/invalid-socket-facts@1.0.0artifact to the scan, which the CLI then reported as a new blocking package with no manifest file and no introducing dependency — failing the run and, on pull requests, leaving a security comment that could not be acted on. The placeholder is now an empty but well-formed facts document. - When the API does report
generic/invalid-socket-facts(a diagnostic for a facts file it could not parse, not a real dependency), the CLI now excludes it from scan results and logs a warning instead. It no longer blocks a run, appears in reports, or triggers a pull request comment. - Each placeholder is written to its own temporary directory. Two CLI runs sharing a temporary directory previously used the same path and could remove each other's placeholder mid-upload.
- Optional sections that rendered as empty, such as the ignore instructions
suppressed by
--disable-ignore, left a whitespace-only line in the alerts table. That line closed the surrounding HTML block, and the indented</blockquote></details>tags after it were rendered as a literal code block. Generated comment markup now omits blank lines and stays under the indentation that starts a code block. - Alert descriptions, suggestions and license findings are collapsed onto a single line so multi-line API text cannot break the table markup either.
- When a pull request has no alerts left to report, the security comment is replaced with a short confirmation instead of keeping the "Caution" banner above a table with no rows. This happens both when a later commit resolves every alert and when every alert is ignored by comment. The comment marker is preserved, so a commit that reintroduces an alert updates the same comment rather than posting a second one.
@SocketSecurity ignore-allnow applies to comments written by CLI versions before 2.0.55, which use the older Markdown alerts table. The check was made once per ignore command, and an ignore-all comment produces none, so no rows were removed.
- Both flags were checked only after testing whether a comment of that type was
already on the pull request, so they suppressed the first post and then
updated that comment on every later run.
--disable-security-issuein particular kept refreshing an existing comment with the full alerts table. - The flags now mean the CLI does not manage that comment at all. An existing comment is left untouched rather than being rewritten, since a body claiming no alerts would be inaccurate when reporting is merely switched off.
- The decision moved into
should_write_comment()so it is covered directly by tests.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.28to15.10.32. See the Coana changelogs for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.27to15.10.28. See the Coana changelogs for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.25to15.10.27. See the Coana changelogs for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.23to15.10.25. See the Coana changelogs for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.16to15.10.23. See the Coana changelogs for engine changes.
- Manifest discovery now uses one filesystem walk per scan root and prunes excluded directories before descent.
- Pull request scans use local Git refs first and fetch only missing history. Buildkite pull request metadata is now supported directly.
- Supported manifest patterns are cached per invocation, and discovered manifests are reused during scan creation.
- Added timings for initialization, Git operations, changed-file detection, pattern lookup, and manifest discovery.
- Scan comparisons omit unchanged artifacts unless an enabled output needs them.
- Diff scans poll more frequently and log identifiers and timing details for easier troubleshooting.
- Documented the
diff-scans:create,diff-scans:listandfull-scans:listtoken scopes required by the optimized comparison path.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.13to15.10.16. See the Coana changelogs for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.4to15.10.13. See the Coana changelogs for engine changes.
- Bumped
GitPythonfrom3.1.57to3.1.59, picking up the security fixes released in GitPython 3.1.58 and 3.1.59. None of the affected GitPython APIs are used by this CLI.
Core.get_sbom_datanow raisesAPIFailurewhen the full-scan stream fetch fails, so the run exits through the CLI's API-error handling (exit code 3 by default;--disable-blockingstill exits 0) instead of writing empty GitLab dependency-scanning, license, and SARIF reports.- The underlying stream-parse failure was fixed in
socketdev3.4.2 (already pinned to3.5.0): unrecognized purl types such asgenericnow resolve instead of raising, and individual unparseable artifacts are skipped rather than failing the whole response.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.3to15.10.4. See the Coana changelogs for engine changes.
- Bumped pinned runtime dependencies (
beautifulsoup44.15.0,markdown3.10.3). - Pinned the
testanddevdependency groups to exact versions, extending the exact-pinning policy introduced in 2.6.0 to all dependency groups. - Updated GitHub Actions used in CI workflows. No effect on the installed CLI.
- Diff mode no longer holds a single idle HTTP connection open while the API
computes the scan comparison. The CLI now creates a diff-scan resource
(
POST /orgs/{org}/diff-scans/from-ids) and pollsGET /orgs/{org}/diff-scans/{id}?cached=truewith short, bounded requests until the comparison is ready (HTTP 200 instead of 202). This fixes intermittentConnection reset by peerfailures on the final comparison step when scans take several minutes to compare and network middleboxes (e.g. Azure NAT gateways, which default to a 4-minute TCP idle timeout) reap the idle connection. - Duplicate scan pairs are resolved after an HTTP 409 and then polled through the same cached endpoint. This avoids automatically following the API's 302 duplicate redirect with an uncached, potentially long-lived GET request.
- The change is transparent: no flags or workflow changes are needed. If the
org API token is missing the
diff-scans:create,diff-scans:listorfull-scans:listscopes — or the new flow fails for any other reason — the CLI logs a warning and falls back to the legacy streaming comparison. - Requires the pinned
socketdev==3.5.0SDK.
- Pinned every runtime dependency in
pyproject.tomlto an exact version; several were previously unpinned or open ranges. - Replaced the
bs4shim package with a direct, pinnedbeautifulsoup4dependency (the shim provided no version control over the actual library). - Pinned the bundled
socketdevSDK to3.5.0(previously>=3.3.0,<4.0.0). - Docker images now install Python dependencies from the committed
uv.lockwith pip hash verification (--require-hashes), so image builds no longer resolve dependency versions from PyPI at build time.pip checkvalidates the environment after install. - Pinned the
hatchlingbuild backend and theuvbinary used in the Dockerfile.
- Reachability e2e runs that report success with no alerted components in the facts file are retried up to three times as a suspected transient backend failure. After retries, only the known zero-project backend signature is classified as inconclusive — any other empty result still fails — and e2e jobs upload their logs and reports as diagnostics on failure.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.2to15.10.3. See the Coana changelogs for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.10.0to15.10.2. See the Coana changelogs for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.9.6to15.10.0. See the Coana changelogs for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.9.5to15.9.6. See the Coana changelogs for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.9.4to15.9.5. See the Coana changelogs for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.9.2to15.9.4. See the Coana changelogs for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.9.1to15.9.2. See the Coana changelogs for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.9.0to15.9.1. See the Coana changelogs for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.8.8to15.9.0. See the Coana changelogs for engine changes.
- New mutually exclusive flags to control which full scan a diff is compared
against, instead of always using the repository's latest head scan:
--base-scan-id <id>diffs against that full scan ID verbatim.--base-commit-sha <sha>diffs against the most recent full scan created from that commit — e.g. the PR's merge base fromgit merge-base origin/main HEAD— so PR diffs are not polluted by default-branch commits the PR never branched from.
- A
--base-commit-shawith no matching full scan is a hard error (exit code 3, or--exit-code-on-api-error; exit 0 with--disable-blocking) rather than a silent fallback to the head scan, since diffing against the wrong baseline misreports which alerts a PR introduces. - Both flags are also settable via
--configfiles (base_scan_id,base_commit_sha). - Requirement:
--base-commit-shalooks up an existing scan — it does not create one. Using it requires CI to runsocketclion every commit that lands on the default branch; see the "Diffing against the merge base" note indocs/cli-reference.mdfor the failure modes and a backfill pattern.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.8.5to15.8.8. See the Coana changelogs for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.8.4to15.8.5. See the Coana changelogs for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.8.1to15.8.4. See the Coana changelogs for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.6.7to15.8.1. See the Coana changelogs for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.6.1to15.6.7. See the Coana changelogs for engine changes.
- Bumped the pinned reachability engine (
@coana-tech/cli) from15.5.9to15.6.1. See the Coana changelogs for engine changes.
- Bumped the pinned
@coana-tech/cliversion to15.5.9(previously15.5.7).
- Reachability analysis types are referred to by their full names instead of the
"Tier 1/2/3" numbering: Full application reachability (formerly Tier 1),
Precomputed reachability (formerly Tier 2), and Dependency reachability
(formerly Tier 3). This updates
--helptext, command output, log messages, and docs only — wire-format values such as thesocket_tier1scan type are unchanged for backward compatibility. See the reachability section indocs/cli-reference.mdfor the old→new name mapping. - Bumped the pinned
@coana-tech/cliversion to15.5.7.
- The reachability launcher is now tuned via a single
SOCKET_CLI_COANA_LAUNCHERenvironment variable (mirroring the Socket Node CLI):auto(default when unset; trynpxfirst, fall back tonpm install+nodeon launcher-level failures),npm-install(skipnpxentirely), ornpx(never fall back). An unrecognized value logs a warning and behaves asauto. - The legacy
SOCKET_CLI_COANA_FORCE_NPM_INSTALLandSOCKET_CLI_COANA_DISABLE_NPM_FALLBACKvariables remain supported for back-compat whenSOCKET_CLI_COANA_LAUNCHERis unset, but are deprecated and no longer documented.
--reach-analysis-timeoutnow accepts a duration with an optional unit suffix —s,morh(e.g.90s,10m,1h).--reach-analysis-memory-limitnow accepts a size with an optional unit suffix —MBorGB, case-insensitive (e.g.512MB,8GB). The value is passed through verbatim to the reachability engine (@coana-tech/cli), which owns parsing and validation, so error messages come from a single source of truth.- Backward compatible: a bare number is still accepted (seconds for the timeout, MB for the memory limit), exactly as before. This legacy form is no longer documented but keeps working.
- Bumped the pinned
@coana-tech/cliversion to15.5.0, which ships the unit parser.
- New
--include-dirsflag (comma-separated directory names) that re-includes directories the CLI excludes from manifest discovery by default. The default exclude list (node_modules,bower_components,jspm_packages,__pycache__,.venv,venv,build,dist,.tox,.mypy_cache,.pytest_cache,*.egg-info,vendor) is a sane default, but some projects keep manifest files under those names — e.g.build/requirements.txt. Pass--include-dirs build,distto scan them. Names are matched against any path segment, mirroring how the default exclude list is applied. --include-module-foldersnow functions as documented: it re-includes the JS/TS module folders (node_modules,bower_components,jspm_packages) as a group. Previously the flag was accepted but had no effect.
- New
--upload-logsflag (default off). When set, each CLI invocation registers a run, reports a per-run status (in_progress/success/failure/cancelled), and uploads a transcript of its own log output to the Socket backend for that run, visible in the Socket admin views. The transcript is captured regardless of the local--enable-debugstate; the existing terminal verbosity is unchanged. - New
--no-upload-logsflag (mutually exclusive with--upload-logs) explicitly opts the run out of uploading logs, even when an org-level override would otherwise enable it. Use this when you need a guaranteed no-upload guarantee (e.g. legal/consent reasons). - The Socket backend can also force-enable streaming for specific orgs in the absence of an explicit opt-out. The feature is best-effort — registration or upload failures silently degrade and never block the scan.
- The full-scan upload (
POST /orgs/<org>/full-scans) now retries transient gateway/connection failures — HTTP 502/503/504/408, dropped or reset connections, and request timeouts — up to 3 total attempts with increasing waits (~10s, then ~30s, plus jitter). Such failures are intermittent and a retried upload almost always succeeds. In these failure modes the server never finished reading the request body, so no scan was created and a retry does not duplicate one; in the rare case where a gateway timeout races a request the server later completes, the extra scan is benign and superseded by the retried one (as if the CLI had run twice). Non-transient errors (400/401/403/404/429 and error payloads) are never retried. Each retry logs a warning explaining what failed and when the next attempt happens. - Requires
socketdev>=3.3.0: the SDK now records the HTTP status code on the exceptions it raises and owns the transient-vs-deterministic classification (APIFailure.is_transient_error()), so the CLI no longer parses status codes out of exception message text.
- Reachability analysis now runs a fixed
@coana-tech/cliversion pinned to this CLI release (15.3.24) vianpx, instead of silently pulling the latest published version on every run. Engine version changes now ride with the Socket Python CLI release (standardpipupgrade), giving advance notice of analysis-engine changes. - The CLI no longer runs
npm install -g @coana-tech/cli; an existing global install is left untouched (never auto-updated or downgraded). - Opt into always-newest with
--reach-version latest; pin an explicit version with--reach-version <semver>(unchanged). - Runs the engine via
npx --yes --force(the same flags the Socket Node CLI passes for coana);--yesskips npx's interactive install prompt so non-interactive/CI runs don't hang. - Added an
npm install+nodefallback for when thenpxlauncher is missing or fails before the engine starts. The installed engine is cached per version for the process lifetime (installs once). Tunable viaSOCKET_CLI_COANA_FORCE_NPM_INSTALL(use the fallback as the primary path) andSOCKET_CLI_COANA_DISABLE_NPM_FALLBACK(never fall back).nodeis now part of the up-front prerequisite check. Also stripsnpm_package_*env vars before spawning the engine to avoidE2BIGin large monorepos.
- Documented the
uvand Enterprise-plan prerequisites the CLI enforces before running reachability (exit code 3 if unmet), and clarified that per-ecosystem build toolchains (JDK / .NET / Go / a compatible Python interpreter) are checked by the analysis engine at runtime, not pre-checked by the CLI. - Corrected the
--reach-min-severityvalues toinfo, low, moderate, high, critical. - Documented the previously-undocumented reachability flags:
--reach-enable-analysis-splitting,--reach-detailed-analysis-log-file,--reach-lazy-mode, and--reach-use-only-pregenerated-sboms. - Clarified that
--only-facts-filesubmits only the facts file when creating the full scan (it does not require a pre-existing scan). - Documentation-only; no functional code changes.
- Picks up
socketdev 3.2.1. - No CLI logic changes.
- Picks up
socketdev 3.2.0, which addsOTHER = "other"toSocketCategoryso the backend'sotheralert category no longer trips the "Unknown SocketCategory" warning fallback (SDK PR #85). - No CLI logic changes.
- New
--exclude-pathsflag (comma-separated globs) that excludes matching paths from BOTH SCA manifest discovery and reachability analysis. Patterns are scan-root-relative anchored globs (*does not cross/,**does), matching the Node CLI's behavior. - Pattern validation rejects unsupported forms (negation, absolute paths,
..traversal, and match-everything patterns). Patterns may be supplied on the CLI as a comma-separated string or via a--configfile list. --reach-exclude-pathsis now deprecated in favor of--exclude-paths. It still works (and is unioned into the Coana--exclude-dirsargument) but is marked deprecated in--helpand warns at runtime.
- New
--reach-disable-external-tool-checksflag (passes--disable-external-tool-checksto the Coana CLI). - New
--reach-debugflag to enable Coana debug output (--debug) independently of the global--enable-debug. - Node-style
--reach-analysis-timeoutand--reach-analysis-memory-limitare now the primary flag names; the previous--reach-timeout/--reach-memory-limitcontinue to work as hidden aliases. - The Coana subprocess now receives
SOCKET_CLI_VERSIONandSOCKET_CALLER_USER_AGENTso calls are attributed to the Python CLI. Proxies continue to work via the inheritedHTTPS_PROXY/HTTP_PROXYenvironment variables, which Coana reads itself. SOCKET_REPO_NAME/SOCKET_BRANCH_NAMEare no longer forwarded to Coana when the repo and branch are the default sentinels, avoiding cross-run reachability cache-bucket collisions.- Tier 1 reachability finalize now retries with exponential backoff instead of giving up on the first transient error.
- The
socketdev/cliDocker image now bundles pyenv (pinned tov2.7.1) along with the Alpine build dependencies needed to compile CPython from source, so the image can build/install arbitrary Python versions on demand. - The CLI itself is unchanged — this release only affects the published Docker image.
- Full-scan diff requests now always set
include_license_details=false, keeping large diff responses smaller and avoiding truncation crashes on large repos. - Soft breaking change for flag-scripted use:
--exclude-license-detailsstill controls the dashboard report URL, but no longer affects the internal diff request. Its--helptext has been updated to reflect the narrower scope. - License artifact output is unchanged:
--generate-licensecontinues to fetch license details from the dedicated PURL endpoint. - Requires
socketdev>=3.1.2.
The reachability facts file (.socket.facts.json) is now brotli-compressed before it is
uploaded as part of a full scan. The Socket API transparently decompresses any multipart
part named exactly .socket.facts.json.br and stores it as plain .socket.facts.json, so
the stored result is unchanged — but the on-the-wire payload shrinks dramatically (a
~262 MB facts file compresses to roughly 15–30 MB).
This fixes large tier‑1 reachability scans that previously failed when the uncompressed facts file exceeded the API's per‑file upload size cap (surfaced to the CLI as an HTTP 4xx/“502”, leaving the scan stuck with no report).
Details:
- Compression happens at the upload boundary (
Core.create_full_scan); the file on disk is left untouched, so local consumers (SARIF/JSON output, tier‑1 finalize, alert selection) continue to read the plain.socket.facts.json. - Only a file whose basename is exactly
.socket.facts.jsonis compressed (the API matches that exact name). A custom--reach-output-filename is uploaded uncompressed, as before. - Empty baseline-scan placeholder files are not compressed.
- Compression never blocks an upload: if it fails for any reason it falls back to uploading
the plain file, and a partially-written
.socket.facts.json.bris removed rather than left behind in the target directory. - Adds a
brotli(CPython) /brotlicffi(PyPy) dependency.
- Added
--exit-code-on-api-errorso CI can distinguish API / infrastructure failures from blocking security findings. The default remains3; the flag only changes behavior when set explicitly. --disable-blockingstill takes precedence and exits0for all outcomes.
--commit-messagevalues longer than 200 characters are now truncated before being sent to the API, preventing HTTP 413 errors from oversized query parameters.
- Infrastructure errors now emit Buildkite log section markers when
BUILDKITE=true, making those failures easier to find in Buildkite logs.
--timeoutis now honored end-to-end: it was only applied to the localCliClient, but the full-scan diff comparison uses the Socket SDK instance, which was constructed without the CLI timeout and defaulted to 1200s.--exclude-license-detailsnow propagates to the full-scan diff comparison request (it was only applied to full-scan params / report URLs before).
- Bundled twelve Dependabot dependency updates:
urllib3,gitpython,python-dotenv,pytest,uv,cryptography,pygments,requests, andidna(main app), plusaxios,requests, andflask(e2e fixtures).idna3.11 → 3.15 includes the fix for CVE-2026-45409. - Added
.github/dependabot.ymlwith grouped weekly updates, a 7-day cooldown, and e2e fixtures excluded. - Added a
dependabot-reviewworkflow that runs Socket Firewall (sfw) install checks on Dependabot PRs with no API token required. - Added a
uv.lockdrift check, an import smoke test, andpip-auditto the test workflow; skipped e2e tests on Dependabot PRs. - Tidied
.gitignoreand backfilled missing CHANGELOG entries for2.2.81,2.2.85,2.2.86,2.2.88,2.2.89,2.2.91, and2.2.92.
- Fixed dependency-overview rendering for unmapped alert types: alert types the SDK
has no metadata for now fall back to a humanized Title-Cased label (e.g.
gptDidYouMean-> "Possible typosquat attack (GPT)",SQLInjection-> "SQL Injection") instead of surfacing the raw camelCase identifier.
- Added legal/compliance artifact presets (
--legal) and FOSSA-compatible output shapes (--legal-format fossa) for license and SBOM reporting.
- Migrated license enrichment PURL lookup to the org-scoped endpoint (
POST /v0/orgs/{slug}/purl) from the deprecated global endpoint (POST /v0/purl).
- Added
uv.lockto the version-incrementation CI check so apyproject.toml/__init__.pyversion bump without a matching lockfile sync no longer slips through. - Updated the local Python pre-commit hook to keep
uv.lockin sync withpyproject.tomlandsocketsecurity/__init__.pyversion changes automatically.
- Added
bun.lock,bun.lockb, andvlt-lock.jsonto the recognized manifest files for Socket scanning, with matching unit-test coverage.
- Bumped
socketdevto>=3.0.33,<4.0.0to pick up the SDK fix for unknown alert categories (the SDK previously crashed while deserializing diff alerts when the API returned a category like"other"). - Normalized diff artifacts with
score=Noneto an empty score map in the CLI model layer; PR-comment dependency-overview rendering no longer crashes on missing or partial score data. - Defaulted missing badge values to a valid
100%fallback rather than producing invalid badge URLs.
- Added four hidden
--reach-continue-on-*flags in preparation for Coana CLI v15:--reach-continue-on-analysis-errors,--reach-continue-on-install-errors,--reach-continue-on-missing-lock-files,--reach-continue-on-no-source-files. Each forwards to the matching Coana flag and opts out of one of Coana v15's new halt-by-default behaviors. No-op against today's default Coana version; will take effect automatically once Coana v15 becomes the default.
- Fixed branch detection in detached-HEAD CI checkouts. When
git name-rev --name-only HEADreturned an output with a suffix operator (e.g.remotes/origin/master~1,master^0), the~N/^Nwas previously passed through as the branch name and rejected by the Socket API as an invalid Git ref. The suffix is now stripped before the prefix split, producing the bare branch name.
- Fixed GitLab security report schema compliance: corrected schema validation errors so Socket-produced reports parse cleanly under GitLab's dependency-scanning ingestion.
- Populated scan alert data in the GitLab security report so previously-empty alert sections now carry the expected findings.
- Hardened GitHub Actions workflows.
- Fixed broken links on PyPI page.
- Updated minimum required Python version.
- Tweaked CI checks.
- Fixed reachability filtering.
- Added config file support.
- Fixed
has_manifest_filesfailing to match root-level manifest files.
- Added SARIF file output support.
- Improved reachability filtering.
- Fixed
workspaceflag regression by updating SDK dependency.
- Added
--workspaceflag to CLI args. - Added GitLab branch protection flag.
- Added e2e tests for full scans and full scans with reachability.
- Bumped dependencies:
cryptography,virtualenv,filelock,urllib3.
- Added
straceto the Docker image for debugging purposes.
- Set the scan to
'socket_tier1'when using the--reachflag. This ensures Tier 1 scans are properly integrated into the organization-wide alerts.
- Added
--reach-enable-analysis-splittingflag to enable analysis splitting (disabled by default). - Added
--reach-detailed-analysis-log-fileflag to print detailed analysis log file path. - Added
--reach-lazy-modeflag to enable lazy mode for reachability analysis. - Changed default behavior: analysis splitting is now disabled by default. The old
--reach-disable-analysis-splittingflag is kept as a hidden no-op for backwards compatibility.
- Included PyPy in the Docker image.
- Fixed Dockerfile to set
GOROOTto/usr/lib/gowhen using system Go (GO_VERSION=system) instead of always using/usr/local/go.
- Removed process timeout from reachability analysis subprocess. Timeouts are now only passed to the Coana CLI via the
--analysis-timeoutflag.