Skip to main content
The settings below are required for main in github.com/justmert/veristar. They make every change go through a reviewed pull request with passing checks, which is the control that stops a single compromised account or a careless push from changing the tracker, the Caddy deny lists or the infrastructure code (threat-model.md).

Current state: not applied, and not enforceable yet

Two things block this today:
  1. Plan. The repository is private and owned by a personal account on GitHub Free. GitHub’s REST documentation states: “Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server.” Checked against the repository on 2026-11-13: gh api repos/justmert/veristar/branches/main/protection answered 403 Upgrade to GitHub Pro or make this repository public to enable this feature. Protection can be applied once the repository is public (planned, needs the owner’s explicit confirmation) or the owner moves to a paid plan.
  2. GitHub Actions fails at startup on this account. Every workflow, even a one-step echo, ends in startup_failure (plan, phase 1 status). Required status checks would then never report success, so every pull request would be blocked. Protection can be applied, but it cannot be enforced meaningfully until the owner fixes GitHub Actions for the account. Until then the checks below are run locally with make ci-local (scripts/ci-local.sh, the same jobs and make targets as ci.yml) and their output is reported by hand. That is not a recorded GitHub run.

Required settings

With one approving review required and administrators included, a merge needs a second person with write access. The owner must add at least one reviewer before applying this, or main can no longer be changed.

Required status checks

GitHub names a check run after the job’s name:, or after the job id when the job has no name:. None of the jobs below sets name:, so the check names are the job ids. Only jobs that run on pull_request can be required; a job that runs only on tags or a schedule never reports on a pull request and would block every merge. Read from .github/workflows/*.yml on 2026-11-13:

Command to apply

Run as the repository owner with a gh token that has admin rights on the repository. The body follows PUT /repos/{owner}/{repo}/branches/{branch}/protection: required_status_checks, enforce_admins, required_pull_request_reviews and restrictions are required fields; dismissal_restrictions is omitted because it is only available for organization-owned repositories; restrictions is null for the same reason.
Optional, signed commits:
The signed-commit endpoint path was not checked against the documentation text in this session; the main PUT body above was. Check the result:

Keeping this current

When a workflow job that runs on pull requests is added, renamed or given a name:, update the table and the checks list above, then apply the command again. A required check that no longer exists blocks every pull request.