Portal Community

Overall Result Determination

The overall result is determined by the highest-severity finding across all checks:

Highest Finding SeverityOverall ResultImport ActionMarketplace Action
None (zero findings)PASSProceeds normallyListed with green shield badge
Low or Medium onlyWARNProceeds with warning recorded in audit logListed with yellow shield badge; warning count shown
High or CriticalFAILBlocked — package not installed, rollback if partially appliedRejected — not listed; publisher notified

Complete Scan Report Structure

// GET /api/installhub/imports/{importId}/scan-report
// GET /api/marketplace/submissions/{submissionId}/scan-report

{
  "packageId":     "mkt-pkg-a1b2c3",
  "version":       "3.0.0",
  "overallResult": "WARN",
  "scannedAt":     "2026-05-25T14:05:22Z",
  "durationMs":    2847,
  "checkResults": [
    {
      "check":    "ExpressionInjection",
      "result":   "PASS",
      "findings": []
    },
    {
      "check":    "SqlInjection",
      "result":   "PASS",
      "findings": []
    },
    {
      "check":    "DependencyVulnerability",
      "result":   "WARN",
      "findings": [
        {
          "artifactType": "PackageDependency",
          "artifactName": "acme-corp/form-utils",
          "field":        "packageDependencies",
          "value":        "acme-corp/form-utils@1.0.0",
          "rule":         "CVE-2026-12345",
          "severity":     "Medium",
          "message":      "Dependency 'acme-corp/form-utils@1.0.0' has CVE-2026-12345 (CVSS 5.4, Medium). Update to 1.0.1 or later."
        }
      ]
    },
    {
      "check":    "ContentPolicy",
      "result":   "PASS",
      "findings": []
    }
  ],
  "summary": {
    "totalFindings": 1,
    "critical": 0,
    "high":     0,
    "medium":   1,
    "low":      0
  }
}

How WARN Is Presented to Importers

When an import completes with a WARN scan result, the import response includes the scan report and a warning message. The import is not blocked but the warning is permanently recorded in the import audit log:

{
  "status":       "Success",
  "importId":     "imp-f9a2c1e8",
  "scanResult":   "WARN",
  "scanWarnings": 1,
  "scanReportUrl": "/api/installhub/imports/imp-f9a2c1e8/scan-report",
  "message":      "Import completed successfully. 1 security warning was detected — review the scan report before deploying this package in production."
}

How FAIL Is Reported

// Import blocked by FAIL:
{
  "status":      "Failed",
  "stage":       "SecurityScan",
  "scanResult":  "FAIL",
  "error":       "SecurityScanFailed",
  "message":     "Import blocked — security scan returned FAIL. The package was not installed. Review the scan report for details.",
  "rolledBack":  true,
  "scanReportUrl": "/api/installhub/imports/imp-f9a2c1e8/scan-report"
}

Scan Result Persistence

Scan reports are stored permanently as part of the import or submission record. They cannot be deleted or modified after generation. The scan report is available for auditors and security teams through the API and in the InstallHub admin console.

Scan Timeout

The scanner has a maximum execution time of 120 seconds per package. If the scan does not complete within this limit (rare — typically only occurs with very large packages or database connectivity issues), the import is put in a ScanTimeout state and retried automatically up to 3 times before failing with a ScanError result.

{
  "status":  "Failed",
  "stage":   "SecurityScan",
  "error":   "ScanError",
  "message": "Security scan failed after 3 attempts due to scanner service timeout. Contact support if this persists.",
  "supportTicketUrl": "https://support.bizfirstai.com/new"
}