Scanner analyzers API

GET /api/v1/scanner/analyzers provides the Console with a truthful analyzer catalog. Its runtime source is Scanner Worker’s canonical signed-plugin probe-report.json, shared read-only with Scanner WebService through the existing scanner-plugin-scratch volume. Tenant enablement is overlaid from the Scanner settings repository.

Authorization and tenancy

Response

{
  "source": "scanner-worker-probe-report",
  "sourceStatus": "available",
  "observedAt": "2026-07-16T19:00:00Z",
  "analyzers": [
    {
      "id": "stellaops.scanner.plugin.ruby",
      "kind": "language",
      "ecosystem": "ruby",
      "enabled": true,
      "disabledByTenant": false,
      "health": "healthy",
      "probeOutcome": "responded",
      "profile": "base",
      "required": true,
      "lastSuccessfulProbeAt": "2026-07-16T19:00:00Z"
    }
  ]
}

Rows are sorted by signed manifest ID. kind is os, language, or unknown; ecosystem is derived from the Scanner signed-bundle ID convention. enabled means the bundle was admitted and loaded and is not disabled by the current tenant. Health and tenant enablement are independent: a healthy analyzer can be disabled for one tenant.

Health is a direct projection, not a synthesized grade:

Worker probe evidencehealthlastSuccessfulProbeAt
Required acceptance fields true and outcome respondedhealthyReport generatedAt
Outcome rejected or failedunhealthynull
notMounted, disabled, loaded without a response, unknown, or no report rowunknownnull

probeOutcome preserves the canonical machine state: unknown, notMounted, disabled, rejected, loaded, responded, or failed.

The Scanner does not currently persist analyzer-level last successful scan execution. The API therefore publishes the evidenced lastSuccessfulProbeAt and does not invent lastSuccessfulRunAt.

Missing or invalid Worker evidence

If the report file is absent, unreadable, malformed, or larger than the configured bounded read size, the endpoint returns 200 with sourceStatus: "unavailable", null observedAt, and no runtime-derived rows. Tenant-disabled IDs remain visible as enabled: false, disabledByTenant: true, and health: "unknown", allowing an operator to reverse a setting even while Worker evidence is unavailable.

Configuration section: scanner:analyzers:readModel.