JSON export and agent format¶
OSS IQ has two machine-readable outputs: the JSON file ossiq export writes, and the compact
decision that --format agent and the MCP tools return. Part of the
reference.
You have |
Go to |
|---|---|
A key at the root of the export |
|
A field on a package entry |
|
A field that is missing from your export |
|
An entry in a |
|
A |
|
An MCP tool to call |
In both outputs, null means the value could not be measured. It never means “no risk”.
JSON export¶
ossiq export writes one .json file. Its options are in
Commands. To gate CI on it, see the
GitHub Actions tutorial.
Profiles¶
Profile |
Written by |
Carries |
Schema |
|---|---|---|---|
Standard |
|
Every direct dependency, the transitive packages that need attention, and the fields needed to decide what to do |
|
Full |
|
Every transitive package, the dependency tree, provenance URLs and the raw upstream signals |
metadata.profile names the profile. The schema files list every field; the tables on this page
say what each one means. A field marked (--full) appears in the full profile only.
Schema versions¶
--schema-version pins the document to one version. The default is the latest, 1.6.
Version |
Adds |
|---|---|
|
|
|
A document pinned to 1.5 omits every field 1.6 added. For what stays stable across
versions, see Stability guarantees.
Root object¶
Key |
Contents |
|---|---|
|
|
|
|
|
The runtime that engine requirements were checked against: |
|
Counts: packages by role, |
|
Array of |
|
Array of |
|
Array of |
|
Declared dependencies the scan left out, each with |
|
Constraint-widening opportunities for a project without a lockfile |
|
Names of packages whose manifest entry and lockfile entry disagree. Regenerate the lockfile before you act on their recommendation |
|
Peers installed out of reach, and how |
|
( |
|
( |
Package fields¶
Every entry in production_packages and development_packages is a PackageMetrics object.
Transitive entries carry most of the same fields.
Identity and drift fields¶
Field |
Meaning |
|---|---|
|
Canonical registry name |
|
Name the manifest uses, when it is an npm alias; otherwise |
|
The package is a development or optional dependency |
|
Version resolved in the lockfile |
|
Newest version the registry publishes |
|
Days between the publish dates of the installed and the latest version |
|
Releases published between the installed and the latest version |
|
( |
|
PyPI extras requested, for example |
|
( |
Recommendation fields¶
Field |
Meaning |
|---|---|
|
Version the solver recommends. |
|
Version ladder rung the recommendation came from: |
|
|
|
The label the What’s Next column and the HTML report show. |
|
The update strategy verdict: |
|
Newest version the declared range admits. Equal to |
|
Newest version on the installed major line, under the same rule |
|
Newest version, on the installed major or a later one, with no known module-system or API break |
|
Newest version that code on the installed module system can still load, whatever the runtime |
|
Releases that would have been recommended but were held back, each with |
|
What the recommended update does to transitive packages: |
Compatibility fields¶
These describe the recommended version.
Field |
Meaning |
|---|---|
|
Module format of the installed version: |
|
Module format of the recommended version. npm only |
|
What the scan’s runtime means for loading the package’s ESM-only releases from CommonJS code |
|
Why the recommended version is flagged as a known break, for example |
|
Runtime the recommended version requires, for example |
|
|
Constraint fields¶
Field |
Meaning |
|---|---|
|
|
|
|
|
Version specifier your manifest declares. |
|
( |
|
( |
|
( |
A report from before v1.2 has no constraint_type. The HTML report’s Explorer then falls back
to the specifier: a bare version such as 1.2.3 counts as PINNED, and a specifier that
contains < counts as NARROWED.
Lifecycle fields¶
Field |
Meaning |
|---|---|
|
The installed version is a pre-release |
|
The installed version was yanked or unpublished |
|
The installed version, or the whole package, is deprecated or archived |
|
The whole package was removed from the registry (npm only) |
|
The registry’s verdict on the whole package: |
|
The maintainer’s note (npm) or the index’s stated reason (PyPI), verbatim. It often names the replacement |
Security and maintenance fields¶
Field |
Meaning |
|---|---|
|
Known vulnerabilities in the installed version. See CVE fields |
|
Highest EPSS score among the package’s CVEs |
|
Whether installing the version executes code, and what indicated it |
|
Advisory verdict of the triage matrix: |
|
Most probable state: |
|
P(abandoned) + P(deprecated), the value that feeds triage |
|
End-of-life markers found for the package, and the replacement they name |
|
The upstream repository is archived |
|
( |
|
( |
|
( |
|
( |
Repository stability explains the maintenance fields.
Peer fields (npm)¶
Field |
Meaning |
|---|---|
|
Peers the package declares that nothing installed where the package looks satisfies. Each has |
|
How |
Both are empty for PyPI projects. See Unresolved peers.
Transitive entries¶
A TransitivePackageMetrics entry differs from PackageMetrics in these ways:
It adds
required_by: the direct dependencies whose subtree installs the package. These are the manifest entries to change to move it. The full profile also addsid, which tree nodes reference.It leaves out
dependency_name,dependency_path,version_constraint,version_constraint_declared,constraint_type,extras,breaking_change,recommended_from_rung,requires_constraint_widening,update_transitive_impactsandstrategy. In the full profile,dependency_treeholds the paths and constraints.It omits a field that could not be determined, where a direct entry carries
null.
CVE fields¶
Field |
Meaning |
|---|---|
|
Primary identifier: a CVE, GHSA or OSV ID |
|
All aliases for the vulnerability |
|
|
|
Description of the vulnerability |
|
Affected intervals in the registry’s own syntax, for example |
|
Releases that close an affected interval. Empty when no fix is published |
|
Days a fix has been available |
|
EPSS exploitation probability, 0 to 1 |
|
URL of the upstream advisory |
|
( |
|
( |
A CVE on a transitive package appears on its entry in transitive_packages. required_by
names the direct dependencies that pull the package in.
Agent format¶
ossiq status --format agent and ossiq info --format agent print a compact JSON decision in
place of the console report. ossiq update-context always prints one. The
MCP tools return the same shapes. To set an agent up, see
Coding agents.
next_action¶
Every decision leads with a next_action string.
Decision |
From |
Values |
|---|---|---|
Add |
|
|
Update, on each entry |
|
A What’s Next label, or |
Update, at the top level |
|
The most urgent entry label, or |
do not install covers a package its registry deprecated, archived or quarantined, and a
deprecated release you asked for by version. reasons quotes the registry’s note.
An update entry’s label can differ from next_action in the JSON export, because the agent
format escalates two cases:
A CVE that the recommended version does not clear reads
Check for the Fix.An installed version that is gone from the registry, with nothing else due, reads
Find alternative.
Update entries¶
The updates list has one entry for each direct dependency.
Field |
Meaning |
|---|---|
|
The installed version and the target |
|
The version ladder |
|
|
|
|
|
Why the tier let the package move |
|
The triage verdict ( |
|
The package’s CVEs, each with its |
|
npm only. Peers the package cannot load, whatever its |
The decision also carries update_strategy, and on npm peer_repairs when a copy that
satisfies the range is installed out of reach. Each repair has the package and
suggested_constraint that apply adds to the manifest, is_dev_dependency, the requirers,
and the family_moves. unresolved_peers and peer_repairs are omitted when empty. Run
ossiq plan to review a repair and ossiq apply to make it.
Runtime¶
Engine requirements are checked against the runtime the project runs on.
Caller |
Where the runtime comes from |
|---|---|
MCP tools |
The required |
CLI |
A probe of the installed runtime ( |
Either way, the version is held to the floor the project declares. engine_context_source reads
provided when a stated version binds.
OSS IQ also reads the project’s own version pin: .nvmrc, .node-version, .tool-versions,
mise.toml, volta.node, .python-version or .venv/pyvenv.cfg. A pin that disagrees with the
runtime is reported as runtime_context.runtime_mismatch, and as a warning in status.
update-context comparison¶
ossiq update-context and ossiq_update_context also return comparison, which judges the
target you asked about against OSS IQ’s own recommendation:
Field |
Meaning |
|---|---|
|
|
|
Why the verdict is what it is |
|
The version to take instead |
MCP tools¶
ossiq mcp serves three read-only tools. Every tool requires runtime
(see Runtime).
Tool |
Answers |
Required |
Optional |
|---|---|---|---|
|
Should the agent add this package? |
|
|
|
Which direct dependencies should move, and to what? |
|
|
|
What breaks between the installed version and this target? |
|
|
Nothing changes in the project until you run ossiq apply and confirm.