Safety ratings
Methodology
Automated checks of public signals as of the date shown. Not a security audit, certification or endorsement, and not a statement about the people who maintain the project. Signals can be incomplete or out of date; each check shows its evidence and source so anyone can verify it.
Check version: rs-safety-checks-1.0. No AI is used in scoring; the same facts always give the same score. Rulebook hash: c02a6c4ba968afe595111beff541daa0c215ec8ee41ca81329a8c06c23108886.
Score
score = round(100 × points earned ÷ points available). Checks marked not_applicable (no lockfile, no Scorecard result, not an MCP server) are removed from both sides, so a project is never marked down for a signal that does not apply to it.
Bands: Strong public signals (85+), Good public signals (70+), Moderate public signals (50+), Limited public signals (0+).
Checks
- License present (OSI-approved) (10 points): OSI-approved SPDX id detected by GitHub: full points. A license file GitHub cannot match to an OSI id: half. None: zero.
- Security policy (SECURITY.md) (8 points): SECURITY.md (or .rst/.txt) in the repository root, the .github folder or the docs folder: full points.
- Known advisories in pinned dependencies (OSV) (15 points): Pinned versions from top-level lockfiles (npm, pnpm, yarn, PyPI requirements/poetry/uv, Cargo, Go) queried against OSV. 0 packages with advisories: full; 1–2: two thirds; 3–9: one third; 10+: zero. No lockfile: not applicable.
- OpenSSF Scorecard (12 points): Published OpenSSF Scorecard score ÷ 10 × max. No published result: not applicable.
- Signed releases or build provenance (8 points): Any of: SLSA generator, GitHub artifact attestations, Sigstore/cosign, npm --provenance, PyPI trusted publishing in workflows, or signature/attestation/SBOM assets on the last 5 releases: full points.
- Continuous integration present (8 points): Any GitHub Actions workflow or other CI config: full points. Not applicable to small content-only repositories (no lockfile and no detected language, or 25 files or fewer).
- Credential-pattern scan (12 points): Bounded scan (root and one-deep text files, ≤60 files <200KB, plus workflows) for well-known credential formats, and credential-like file names outside test/example paths. No match: full points. A match is reported as 'possible' with path and pattern name only.
- Pinned dependencies (9 points): Lockfile present: 4. Third-party GitHub Actions pinned to commit SHAs (≥80%: 3, ≥30%: 1.5; no third-party actions with a lockfile: 3). Dependabot or Renovate config: 2. Not applicable to small content-only repositories.
- Maintainer activity (10 points): Last commit ≤30 days before the check: 6, ≤90: 4, ≤365: 2. Distinct commit authors in the prior 90 days ≥3: 4, 2: 2. Archived: zero.
- MCP: tool permissions, access scope and injection notes (8 points): MCP servers only. Tool annotations (readOnlyHint) found by GitHub code search: 3. README describes access scope (allowed directories, allowlist, read-only, sandbox, permissions, scope): 3. README addresses prompt injection or untrusted input: 2.
Data sources
- GitHub REST API (public repository metadata, file tree, releases, commits, code search)
- raw.githubusercontent.com (public files at the default branch head)
- OSV.dev querybatch (open vulnerability database)
- OpenSSF Scorecard API (api.securityscorecards.dev)
Open sweep collector (collector_version on each rating). It stores file paths and pattern names only, never file contents or matched secret values.
Ledger
Every rating is sealed on the Rightshold ledger as entry type safety.rating (stream safety_ratings) with its as_of date, check_version, score and rating_sha256. Re-checks add new entries; old ones are never edited. Verify at https://www.rightshold.com/v1/ledger.
Maintainers (free)
- Request a re-check: POST https://www.rightshold.com/v1/safety-ratings/{owner}/{repo}/recheck {"contact":"optional","message":"optional"}
- Send a response: POST https://www.rightshold.com/v1/safety-ratings/{owner}/{repo}/recheck {"kind":"response","message":"…","contact":"optional"}
- Embed a badge: https://www.rightshold.com/v1/safety-ratings/{owner}/{repo}/badge.svg (Markdown: `[](https://www.rightshold.com/safety-ratings/OWNER/REPO)`)
