PolicyChecks

Projects that follow the best practices below can voluntarily self-certify and show that they've achieved an Open Source Security Foundation (OpenSSF) best practices badge.

There is no set of practices that can guarantee that software will never have defects or vulnerabilities; even formal methods can fail if the specifications or assumptions are wrong. Nor is there any set of practices that can guarantee that a project will sustain a healthy and well-functioning development community. However, following best practices can help improve the results of projects. For example, some practices enable multi-person review before release, which can both help find otherwise hard-to-find technical vulnerabilities and help build trust and a desire for repeated interaction among developers from different companies. To earn a badge, all MUST and MUST NOT criteria must be met, all SHOULD criteria must be met OR be unmet with justification, and all SUGGESTED criteria must be met OR unmet (we want them considered at least). If you want to enter justification text as a generic comment, instead of being a rationale that the situation is acceptable, start the text block with '//' followed by a space. Feedback is welcome via the GitHub site as issues or pull requests There is also a mailing list for general discussion.

We gladly provide the information in several locales, however, if there is any conflict or inconsistency between the translations, the English version is the authoritative version.
If this is your project, please show your baseline badge status on your project page! The baseline badge status looks like this: Baseline badge level for project 14356 is baseline-1 Here is how to embed the baseline badge:
You can show your baseline badge status by embedding this in your markdown file:
[![OpenSSF Baseline](https://www.bestpractices.dev/projects/14356/baseline)](https://www.bestpractices.dev/projects/14356)
or by embedding this in your HTML:
<a href="https://www.bestpractices.dev/projects/14356"><img src="https://www.bestpractices.dev/projects/14356/baseline"></a>


These are the Baseline Level 1 criteria. These are criteria version v2026.08.28.

Baseline Series: Baseline Level 1 Baseline Level 2 Baseline Level 3

        

 Basics

  • General

    Note that other projects may use the same name.

    A badge service backed by a GitHub app that requests repository Administration: Read permissions, and so is able to report on a repository's settings, providing a convenient way for maintainers to demonstrate publicly that best practices are enforced as policies at the repo configuration level

    Please use SPDX license expression format; examples include "Apache-2.0", "BSD-2-Clause", "BSD-3-Clause", "GPL-2.0+", "LGPL-3.0+", "MIT", and "(BSD-2-Clause OR Ruby)". Do not include single quotes or double quotes.
    If there is more than one language, list them as comma-separated values (spaces optional) and sort them from most to least used. If there is a long list, please list at least the first three most common ones. If there is no language (e.g., this is a documentation-only or test-only project), use the single character "-". Please use a conventional capitalization for each language, e.g., "JavaScript".
    The Common Platform Enumeration (CPE) is a structured naming scheme for information technology systems, software, and packages. It is used in a number of systems and databases when reporting vulnerabilities.

 Controls 24/24 ●

  • Controls


    When a user attempts to read or modify a sensitive resource in the project's authoritative repository, the system MUST require the user to complete a multi-factor authentication process. [OSPS-AC-01.01]
    Enforce multi-factor authentication for the project's version control system, requiring collaborators to provide a second form of authentication when accessing sensitive data or modifying repository settings. Passkeys are acceptable for this control.

    The reponomics organization requires two-factor authentication for all members (GET /orgs/reponomics returns two_factor_requirement_enabled: true). The authoritative repository github.com/reponomics/PolicyChecks is owned by that organization, so every account able to read or modify sensitive resources must complete multi-factor authentication. The requirement covers outside collaborators as well as members.



    When a new collaborator is added, the version control system MUST require manual permission assignment, or restrict the collaborator permissions to the lowest available privileges by default. [OSPS-AC-02.01]
    Most public version control systems are configured in this manner. Ensure the project's version control system always assigns the lowest available permissions to collaborators by default when added, granting additional permissions only when necessary.

    A role must be assigned explicitly when a collaborator is added to the repository. Organization membership confers no elevated permission: the organization's base repository permission is read (GET /orgs/reponomics returns default_repository_permission: "read"), and because this repository is public, that base permission confers exactly the access an anonymous user already has. Every collaborator with write access holds an explicit grant.



    When a direct commit is attempted on the project's primary branch, an enforcement mechanism MUST prevent the change from being applied. [OSPS-AC-03.01]
    If the VCS is centralized, set branch protection on the primary branch in the project's VCS. Alternatively, use a decentralized approach, like the Linux kernel's, where changes are first proposed in another repository, and merging changes into the primary repository requires a specific separate act.

    The "protect-main" ruleset applies to the default branch with enforcement active and includes a pull_request rule, so commits cannot be applied directly to main and must arrive through a pull request. The ruleset defines no bypass actors, so no one can circumvent it, including repository admins and organization owners. It additionally enforces linear history, blocks non-fast-forward updates, and requires signed commits.



    When an attempt is made to delete the project's primary branch, the version control system MUST treat this as a sensitive activity and require explicit confirmation of intent. [OSPS-AC-03.02]
    Set branch protection on the primary branch in the project's version control system to prevent deletion.

    The "protect-main" ruleset includes a deletion rule applying to the default branch, so deleting main is blocked outright rather than merely confirmed. No actor can bypass the ruleset, including repository admins and organization owners.



    When a CI/CD pipeline operates on untrusted metadata, those parameters MUST be sanitized and validated prior to use in the pipeline. [OSPS-BR-01.01]
    CI/CD pipelines should sanitize (quote, escape or exit on expected values) all metadata inputs which correspond to untrusted sources. This includes data such as branch names, commit messages, tags, pull request titles, and author information.

    No untrusted metadata reaches a shell in the project's GitHub Actions workflows. Branch names, commit messages, tags, pull-request titles, and author information are never interpolated into a run: block. Where a workflow needs the branch name, it reads the ${GITHUB_REF_NAME} environment variable inside double quotes rather than a ${{ }} expansion. The only ${{ }} expansions appearing inside run: blocks are github.server_url and github.repository, both GitHub-controlled values. The workflow that validates pull-request titles passes the title to a SHA-pinned action through the GitHub API and never into a shell. The Cloudflare Workers Builds deployment pipeline runs fixed literal commands with no metadata interpolation.



    When a CI/CD pipeline operates on untrusted code snapshots, it MUST prevent access to privileged CI/CD credentials and assets. [OSPS-BR-01.03]
    CI/CD pipelines should isolate untrusted code snapshots from privileged credentials and assets. In particular, projects should be careful to ensure that workflows which build or execute code prior to review by a collaborator do not have access to CI/CD credentials.

    Neither of the project's two CI/CD pipelines exposes privileged credentials to unreviewed code. The only workflow triggered by pull_request_target, .github/workflows/semantic-pr.yml, checks out no pull-request code, runs no project code, and is limited to permissions: pull-requests: read. The only workflow holding privileged credentials, release-please.yml, is triggered exclusively by push to main and workflow_dispatch, so it never operates on an unreviewed code snapshot. ci.yml does execute pull-request code but references no secrets, and because the repository is public, fork pull-request tokens are downgraded to read-only and are given no secrets. The repository's default workflow token permission is read, and all actions are pinned to full-length commit SHAs. Production deployment runs through Cloudflare Workers Builds, documented in docs/operations.md; fork pull requests build there only after explicit admin approval, so untrusted code is reviewed by a collaborator before it can run with access to deploy credentials.



    When the project lists a URI as an official project channel, that URI MUST be exclusively delivered using encrypted channels. [OSPS-BR-03.01]
    Configure the project's websites and version control systems to use encrypted channels such as SSH or HTTPS for data transmission. Ensure all tools and domains referenced in project documentation can only be accessed via encrypted channels.

    The project's official channels are the source repository at https://github.com/reponomics/PolicyChecks and the badge service at https://policychecks.reponomics.org, and both are reachable only over encrypted channels. A plain-HTTP request to the service returns 301 to the https:// origin, and responses carry strict-transport-security: max-age=86400. Badge endpoints return HTTP/2 200 over TLS with a valid certificate chain; the service root returns 404 by design, as the service exposes no landing page.



    When the project lists a URI as an official distribution channel, that channel MUST be protected from adversary-in-the-middle attacks using cryptographically authenticated channels. [OSPS-BR-03.02]
    Artifacts distributed by the project should be distributed through channels which ensure integrity and authenticity. Use of HTTPS for downloads, signed releases, or distribution through trusted package managers are all acceptable methods to protect against adversary-in-the-middle attacks.

    The project distributes through GitHub Releases (https://github.com/reponomics/PolicyChecks/releases), served exclusively over HTTPS, and through the hosted service, which is TLS-only with HTTP redirecting to HTTPS and HSTS set. The package is marked private: true in package.json and is not published to any registry. Every release tag commit carries a valid signature (verification.verified: true), and immutable releases are enabled (GET /repos/reponomics/PolicyChecks/immutable-releases returns enabled: true), so published release assets and tags cannot be altered after publication.



    The project MUST prevent the unintentional storage of unencrypted sensitive data, such as secrets and credentials, in the version control system. [OSPS-BR-07.01]
    Configure .gitignore or equivalent to exclude files that may contain sensitive information. Use pre-commit hooks and automated scanning tools to detect and prevent the inclusion of sensitive data in commits.

    .gitignore excludes .env, .env.* (with an explicit !.env.example exception), and *.private-key.pem. .env.example contains blank placeholders and non-secret local defaults only. Secret scanning, push protection, non-provider pattern scanning, and validity checks are all enabled on the repository, so a secret is blocked at push time rather than merely detected afterward. Runtime secrets are held in the deployed Worker's settings rather than in build variables, and docs/operations.md documents credential storage.



    When the project has made a release, the project documentation MUST include user guides for all basic functionality. [OSPS-DO-01.01]
    Create user guides or documentation for all basic functionality of the project, explaining how to install, configure, and use the project's features. If there are any known dangerous or destructive actions available, include highly-visible warnings.

    The README documents what the service does, how it works, and how to use it (badge table, endpoint reference, examples); additional docs live in https://github.com/reponomics/PolicyChecks/tree/main/docs [documentation_basics]



    When the project has made a release, the project documentation MUST include a guide for reporting defects. [OSPS-DO-02.01]
    It is recommended that projects use their VCS default issue tracker. If an external source is used, ensure that the project documentation and contributing guide clearly and visibly explain how to use the reporting system. It is recommended that project documentation also sets expectations for how defects will be triaged and resolved.

    The project has made releases, so this control applies. SUPPORT.md contains a "Service Issues" section directing defect reports to the GitHub issue tracker and enumerating what belongs there, states that public issues are preferred and why, routes repository-specific questions to support@reponomics.org, and directs security reports to SECURITY.md instead. CONTRIBUTING.md independently states that issues may be opened to report a bug. GitHub Issues is enabled (has_issues: true).



    The project MUST have one or more mechanisms for public discussions about proposed changes and usage obstacles. [OSPS-GV-02.01]
    Establish one or more mechanisms for public discussions within the project, such as mailing lists, instant messaging, or issue trackers, to facilitate open communication and feedback.

    Both GitHub Issues and GitHub Discussions are enabled on the repository (GET /repos/reponomics/PolicyChecks returns has_issues: true and has_discussions: true). CONTRIBUTING.md directs contributors to open an issue to request a feature or report a bug, and to start a Discussion thread to engage other users on a topic; it further asks that proposed feature changes be raised in an issue first so they can be discussed publicly before implementation.



    The project documentation MUST include an explanation of the contribution process, or clearly state that public contributions are not accepted [OSPS-GV-03.01]
    Create a CONTRIBUTING.md or CONTRIBUTING/ directory to outline the contribution process including the steps for submitting changes, and engaging with the project maintainers.

    CONTRIBUTING.md at the repository root explains the contribution process: how to raise an issue or Discussion, the expectation that feature proposals are discussed before a PR, the types of contributions accepted (including project-specific criteria for proposing new badges), repository policies governing submissions (signed commits, PR-only changes to main, conventional-commit PR titles, running npm run check, resolving failing checks, including tests), and local development setup. https://github.com/reponomics/PolicyChecks/blob/main/CONTRIBUTING.md



    The license for the source code MUST meet the OSI Open Source Definition or the FSF Free Software Definition. [OSPS-LE-02.01]
    Add a LICENSE file to the project's repo with a license that is an approved license by the Open Source Initiative (OSI), or a free license as approved by the Free Software Foundation (FSF). Examples of such licenses include the MIT, BSD 2-clause, BSD 3-clause revised, Apache 2.0, Lesser GNU General Public License (LGPL), and the GNU General Public License (GPL). Releasing to the public domain meets this control if there are no other encumbrances such as patents.

    The source code is licensed under the MIT license, which is OSI-approved and FSF free. Confirmed by the LICENSE file at the repository root, the "license": "MIT" field in package.json, and GitHub's own license detection (GET /repos/reponomics/PolicyChecks returns license.spdx_id: MIT).



    The license for the released software assets MUST meet the OSI Open Source Definition or the FSF Free Software Definition. [OSPS-LE-02.02]
    If a different license is included with released software assets, ensure it is an approved license by the Open Source Initiative (OSI), or a free license as approved by the Free Software Foundation (FSF). Examples of such licenses include the MIT, BSD 2-clause, BSD 3-clause revised, Apache 2.0, Lesser GNU General Public License (LGPL), and the GNU General Public License (GPL). Note that the license for the released software assets may be different than the source code.

    The released software assets carry no separate license. The releases publish no separate assets, so the only released artifacts are the source archives generated for each tag, governed by the same MIT license as the source code. Those archives contain LICENSE at their root. MIT is OSI-approved and FSF free.



    The license for the source code MUST be maintained in the corresponding repository's LICENSE file, COPYING file, LICENSES/ directory, or LICENSE/ directory. [OSPS-LE-03.01]
    Include the project's source code license in the project's LICENSE file, COPYING file, LICENSES/ directory, or LICENSE/ directory to provide visibility and clarity on the licensing terms. The filename MAY have an extension. If the project has multiple repositories, ensure that each repository includes the license file.

    The MIT license text is maintained in the LICENSE file at the root of the repository: https://github.com/reponomics/PolicyChecks/blob/main/LICENSE. The project has a single repository, so there is no additional repository requiring its own license file.



    The license for the released software assets MUST be included in the released source code, or in a LICENSE file, COPYING file, or LICENSE/ directory alongside the corresponding release assets. [OSPS-LE-03.02]
    Include the project's released software assets license in the released source code, or in a LICENSE file, COPYING file, or LICENSE/ directory alongside the corresponding release assets to provide visibility and clarity on the licensing terms. The filename MAY have an extension. If the project has multiple repositories, ensure that each repository includes the license file.

    The releases publish no separate assets, so the released software assets are the source archives generated for each tag. Those archives include the MIT license at the archive root; nothing in the repository's export configuration removes it.



    The project's source code repository MUST be publicly readable at a static URL. [OSPS-QA-01.01]
    Use a common VCS such as GitHub, GitLab, or Bitbucket. Ensure the repository is publicly readable. Avoid duplication or mirroring of repositories unless highly visible documentation clarifies the primary source. Avoid frequent changes to the repository that would impact the repository URL. Ensure the repository is public.

    The source repository is publicly readable at the static URL https://github.com/reponomics/PolicyChecks. GET /repos/reponomics/PolicyChecks returns private: false, visibility: "public", archived: false. It is hosted on GitHub.



    The version control system MUST contain a publicly readable record of all changes made, who made the changes, and when the changes were made. [OSPS-QA-01.02]
    Use a common VCS such as GitHub, GitLab, or Bitbucket to maintain a publicly readable commit history. Avoid squashing or rewriting commits in a way that would obscure the author of any commits.

    The full git history is publicly readable and records the author name, email, and date of every commit. History rewriting on the primary branch is blocked: the "protect-main" ruleset enforces required_linear_history, non_fast_forward, and required_signatures with no bypass actors, so force-pushes and rewrites to main are rejected. Because linear history is required, merges are limited to squash and rebase. Squash merging collapses a branch's individual commits, but authorship is preserved through it, and the history on main attributes work to both maintainers and external contributors.



    When the package management system supports it, the source code repository MUST contain a dependency list that accounts for the direct language dependencies. [OSPS-QA-02.01]
    This may take the form of a package manager or language dependency file that enumerates all direct dependencies such as package.json, Gemfile, or go.mod.

    npm supports dependency manifests, and the repository contains package.json enumerating all direct language dependencies, alongside package-lock.json pinning the fully resolved transitive tree. CONTRIBUTING.md directs contributors to install from the lockfile with npm ci and to use npm install only when intentionally updating dependencies and committing the resulting lockfile change.



    Projects with multiple repositories MUST document a list of codebases that are part of the project. [OSPS-QA-04.01]
    Document any additional subproject code repositories produced by the project and compiled into a release. This documentation should include the status and intent of the respective codebase.

    PolicyChecks is a single codebase in a single repository - the Cloudflare worker entry point lives in-repo at cloudflare/policychecks-worker.ts. No subproject repository is produced or compiled into a release, so there is no list of constituent codebases to document.



    The version control system MUST NOT contain generated executable artifacts. [OSPS-QA-05.01]
    Remove generated executable artifacts in the project's version control system. It is recommended that any scenario where a generated executable artifact appears critical to a process such as testing, it should be instead be generated at build time or stored separately and fetched during a specific well-documented pipeline step.

    No generated executable artifact is tracked; file --mime over every tracked file returns no executables. Build and coverage outputs are excluded from version control: .gitignore covers dist/, build/, out/, coverage/, and node_modules/, and none of those paths is tracked. Exactly one tracked file carries the executable bit, .husky/pre-commit, a short hand-written shell hook rather than a generated artifact. The worker is generated at build time by npm run build (tsconfig.build.json).



    The version control system MUST NOT contain unreviewable binary artifacts. [OSPS-QA-05.02]
    Do not add any unreviewable binary artifacts to the project's version control system. This includes executable application binaries, library files, and similar artifacts. It does not include assets such as graphical images, sound or music files, and similar content typically stored in a binary format.

    The only binary files tracked are PNG images under docs/assets/ - project banners and documentation screenshots. Graphical images are outside this control's scope. No executable application binaries, library files, or comparable unreviewable artifacts are tracked.



    The project documentation MUST contain security contacts. [OSPS-VM-02.01]
    Create a security.md (or similarly-named) file that contains security contacts for the project.

    SECURITY.md at the repository root publishes the project's security contacts: a GitHub Private Vulnerability Reporting link (https://github.com/reponomics/PolicyChecks/security/advisories/new) as the primary channel and security@reponomics.org as a fallback, together with a stated 14-day maximum for follow-up. SUPPORT.md cross-references it and explicitly directs security issues away from public issues and the general support address.



You can use tools and AI systems to propose changes via a simple URL, such as https://www.bestpractices.dev/en/projects/14356/choose/edit?osps_ac_01_01_status=Met&osps_ac_01_01_justification=GitHub+enforced. See our automation proposals system for how to do that. This data is available under the Community Data License Agreement – Permissive, Version 2.0 (CDLA-Permissive-2.0). This means that a Data Recipient may share the Data, with or without modifications, so long as the Data Recipient makes available the text of this agreement with the shared Data. Please credit Really Him and the OpenSSF Best Practices badge contributors.

Project badge entry owned by: Really Him.
Entry created on 2026-08-29 13:30:53 UTC, last updated on 2026-09-03 22:11:17 UTC. Last achieved passing badge on 2026-08-29 16:42:55 UTC.