Web interface

CANARY Web Console

A lightweight web UI for scoring Jenkins plugins and exploring ML-based advisory risk.

Plugin scoring

Score a plugin

Review the CANARY score, rationale, and supporting evidence.

Core workflow
Resolved model: baseline_6m

AI explanation

Explain this score

Bring your own AI

Copy the prompt below and paste it into Claude, ChatGPT, or any other AI assistant. You control what gets shared.

Show / edit raw prompt

"Explain now" uses the server API key (max 3/hr). "Open in" buttons use your own account with no limits. AI-generated explanations are provided for informational purposes only, may contain inaccuracies or omissions, and should not be relied upon as authoritative security guidance.

CANARY score

Advisory risk score

Select a model

Select an algorithm, feature set, and evaluation strategy on the left.

Honest track record

Where scm-api ranked before each window

Activity-recency clocks + Contributor dynamics · Logistic Regression, embargoed rolling backtest: the rank this plugin held among every scored plugin at each forecast date, using only what was knowable then. Shaded months are the pre-registered holdout.

Recorded, not re-scored

Scored at 32 forecast dates; on average in the top 5.1% of plugins (top 1.9% across the holdout). No advisory followed any of those dates within 180 days.

out-of-time holdout0255075100top 20%2023-052023-092024-012024-052024-092025-012025-052025-092025-122023-05 · rank 57 of 2053 · 97th percentile · score 0.738 no advisory within 180 days2023-06 · rank 62 of 2053 · 97th percentile · score 0.737 no advisory within 180 days2023-07 · rank 66 of 2053 · 97th percentile · score 0.741 no advisory within 180 days2023-08 · rank 91 of 2053 · 96th percentile · score 0.720 no advisory within 180 days2023-09 · rank 160 of 2053 · 92th percentile · score 0.695 no advisory within 180 days2023-10 · rank 172 of 2053 · 92th percentile · score 0.691 no advisory within 180 days2023-11 · rank 106 of 2053 · 95th percentile · score 0.707 no advisory within 180 days2023-12 · rank 113 of 2053 · 95th percentile · score 0.700 no advisory within 180 days2024-01 · rank 179 of 2053 · 91th percentile · score 0.670 no advisory within 180 days2024-02 · rank 106 of 2053 · 95th percentile · score 0.694 no advisory within 180 days2024-03 · rank 125 of 2053 · 94th percentile · score 0.683 no advisory within 180 days2024-04 · rank 94 of 2053 · 95th percentile · score 0.700 no advisory within 180 days2024-05 · rank 92 of 2053 · 96th percentile · score 0.692 no advisory within 180 days2024-06 · rank 124 of 2053 · 94th percentile · score 0.671 no advisory within 180 days2024-07 · rank 126 of 2053 · 94th percentile · score 0.666 no advisory within 180 days2024-08 · rank 137 of 2053 · 93th percentile · score 0.665 no advisory within 180 days2024-09 · rank 165 of 2053 · 92th percentile · score 0.643 no advisory within 180 days2024-10 · rank 116 of 2053 · 94th percentile · score 0.670 no advisory within 180 days2024-11 · rank 249 of 2053 · 88th percentile · score 0.622 no advisory within 180 days2024-12 · rank 254 of 2053 · 88th percentile · score 0.620 no advisory within 180 days2025-01 · rank 169 of 2053 · 92th percentile · score 0.647 no advisory within 180 days2025-02 · rank 126 of 2053 · 94th percentile · score 0.656 no advisory within 180 days2025-03 · rank 51 of 2053 · 98th percentile · score 0.692 no advisory within 180 days2025-04 · rank 83 of 2053 · 96th percentile · score 0.660 no advisory within 180 days2025-05 · rank 69 of 2053 · 97th percentile · score 0.658 no advisory within 180 days2025-06 · rank 66 of 2053 · 97th percentile · score 0.665 no advisory within 180 days2025-07 · rank 72 of 2053 · 97th percentile · score 0.660 no advisory within 180 days2025-08 · rank 38 of 2053 · 98th percentile · score 0.705 no advisory within 180 days2025-09 · rank 46 of 2053 · 98th percentile · score 0.686 no advisory within 180 days2025-10 · rank 38 of 2053 · 98th percentile · score 0.698 no advisory within 180 days2025-11 · rank 21 of 2053 · 99th percentile · score 0.710 no advisory within 180 days2025-12 · rank 24 of 2053 · 99th percentile · score 0.724 no advisory within 180 daysadvisory followed within 180 daysno advisory in window
Holdout monthScoreRankShare of panelWhat followed
2025-0766.0%72 of 2,053top 3.5%none within 180 days
2025-0870.5%38 of 2,053top 1.8%none within 180 days
2025-0968.6%46 of 2,053top 2.2%none within 180 days
2025-1069.8%38 of 2,053top 1.8%none within 180 days
2025-1171.0%21 of 2,053top 0.97%none within 180 days
2025-1272.4%24 of 2,053top 1.1%none within 180 days

Risk context

Supporting signals

Maintenance history, governance, and dependency risk indicators for this plugin.

Key risk signals

  • No advisories found in local dataset.
  • Latest release: 2026-02-04.
  • Requires Jenkins core 2.504.3.
  • Last commit: February 5, 2026 — live data from GitHub.
  • No SECURITY.md — vulnerability reporting process undocumented (+3).
  • No Dependabot or GitHub Actions detected — limited automated maintenance (+3).
  • Dependency risk: 1 of 3 dep(s) have advisories.
  • Plugin health score 100/100 — acceptable maintenance posture.
Feature details (34 keys)
{
  "advisory_count": 0,
  "latest_advisory_date": null,
  "days_since_latest_advisory": null,
  "advisory_within_90d": 0,
  "advisory_within_365d": 0,
  "had_advisory_within_365d": false,
  "max_cvss_base_score_observed": null,
  "max_cvss_severity_label_observed": null,
  "swh_present": true,
  "swh_days_since_last_commit": 1.3,
  "swh_commit_count": 11211,
  "swh_has_security_md": false,
  "swh_has_dependabot": false,
  "swh_has_github_actions": false,
  "swh_has_tests_directory": true,
  "swh_has_changelog": true,
  "swh_security_fix_commit_count": 455,
  "has_plugin_snapshot": true,
  "required_core": "2.504.3",
  "dependency_count": 3,
  "security_warning_count": 0,
  "active_security_warning_count": 0,
  "release_timestamp": "2026-02-04T22:56:48+00:00",
  "days_since_release": 231,
  "dependency_plugins": [
    "asm-api",
    "commons-lang3-api",
    "structs"
  ],
  "dependency_total": 3,
  "dependency_risk_points": 2,
  "dependency_risk_summary": {
    "deps_with_any_advisory": 1,
    "deps_with_recent_advisory_365d": 0,
    "deps_with_active_warning": 0,
    "worst_dep_max_cvss": null,
    "worst_dep_id": null,
    "worst_dep_latest_advisory_date": null
  },
  "dependency_missing_data": {
    "snapshot_missing": 0,
    "advisories_missing": 0,
    "healthscore_missing": 0
  },
  "dependency_details_top": [
    {
      "plugin_id": "structs",
      "advisory_count": 1,
      "latest_advisory_date": "2024-06-26",
      "recent_advisory_365d": false,
      "max_cvss": null,
      "security_warning_count": 1,
      "active_security_warning_count": 0,
      "healthscore": 100,
      "risk_points": 2,
      "reasons": [
        "1 advisories (+2)."
      ]
    }
  ],
  "healthscore_value": 100,
  "healthscore_date": "2026-02-05T14:32:38.748203Z",
  "healthscore_collected_at": "2026-02-28T16:43:20+00:00",
  "score_components": {
    "advisory_history": 0,
    "advisory_severity": 0,
    "staleness": 0,
    "active_warnings": 0,
    "governance": 6,
    "dependency": 0,
    "health_score": 0,
    "security_sensitivity": 0
  }
}
JSON payload
{
  "plugin": "scm-api",
  "score": 6,
  "reasons": [
    "No advisories found in local dataset.",
    "Latest release: 2026-02-04.",
    "Requires Jenkins core 2.504.3.",
    "Recent commit activity (1 days ago) suggests active maintenance.",
    "No SECURITY.md — vulnerability reporting process undocumented (+3).",
    "No Dependabot or GitHub Actions detected — limited automated maintenance (+3).",
    "Dependency risk: 1 of 3 dep(s) have advisories.",
    "Plugin health score 100/100 — acceptable maintenance posture."
  ],
  "features": {
    "advisory_count": 0,
    "latest_advisory_date": null,
    "days_since_latest_advisory": null,
    "advisory_within_90d": 0,
    "advisory_within_365d": 0,
    "had_advisory_within_365d": false,
    "max_cvss_base_score_observed": null,
    "max_cvss_severity_label_observed": null,
    "swh_present": true,
    "swh_days_since_last_commit": 1.3,
    "swh_commit_count": 11211,
    "swh_has_security_md": false,
    "swh_has_dependabot": false,
    "swh_has_github_actions": false,
    "swh_has_tests_directory": true,
    "swh_has_changelog": true,
    "swh_security_fix_commit_count": 455,
    "has_plugin_snapshot": true,
    "required_core": "2.504.3",
    "dependency_count": 3,
    "security_warning_count": 0,
    "active_security_warning_count": 0,
    "release_timestamp": "2026-02-04T22:56:48+00:00",
    "days_since_release": 231,
    "dependency_plugins": [
      "asm-api",
      "commons-lang3-api",
      "structs"
    ],
    "dependency_total": 3,
    "dependency_risk_points": 2,
    "dependency_risk_summary": {
      "deps_with_any_advisory": 1,
      "deps_with_recent_advisory_365d": 0,
      "deps_with_active_warning": 0,
      "worst_dep_max_cvss": null,
      "worst_dep_id": null,
      "worst_dep_latest_advisory_date": null
    },
    "dependency_missing_data": {
      "snapshot_missing": 0,
      "advisories_missing": 0,
      "healthscore_missing": 0
    },
    "dependency_details_top": [
      {
        "plugin_id": "structs",
        "advisory_count": 1,
        "latest_advisory_date": "2024-06-26",
        "recent_advisory_365d": false,
        "max_cvss": null,
        "security_warning_count": 1,
        "active_security_warning_count": 0,
        "healthscore": 100,
        "risk_points": 2,
        "reasons": [
          "1 advisories (+2)."
        ]
      }
    ],
    "healthscore_value": 100,
    "healthscore_date": "2026-02-05T14:32:38.748203Z",
    "healthscore_collected_at": "2026-02-28T16:43:20+00:00",
    "score_components": {
      "advisory_history": 0,
      "advisory_severity": 0,
      "staleness": 0,
      "active_warnings": 0,
      "governance": 6,
      "dependency": 0,
      "health_score": 0,
      "security_sensitivity": 0
    }
  }
}