Skip to content

Continuous Integration Contract

The workflows under .github/workflows/ are active at the repository root. They never check out another source repository: ssh-wrapper==0.1.0 is resolved only from the hash-locked published dependency graph.

CI grants read-only contents permission by default, pins every external action to a full commit SHA, and persists no checkout credentials. The quality job runs make ci with Python 3.14; that aggregate also executes the complete suite in the disposable Python 3.13 compatibility image. Pull requests receive dependency review. The same reviewed configuration drives that GitHub check and the blocking local five-environment license gate inside make ci; the local gate resolves every package version only from the generated locks and rejects an exception whose package is no longer present. CodeQL receives security-events: write only in its own job. The automatic live job runs with Python 3.14 only after quality succeeds, uses a newly generated identity, and also exercises the isolated production launcher. Separate Ubuntu 26.04 jobs build and smoke standalone Linux executables natively on amd64 and arm64. Hardware-token tests remain operator controlled.

The documentation workflow renders and audits the complete site on relevant pull requests and main pushes. Pull requests receive no Pages credentials or artifact deployment. Only the direct-main deploy job receives pages: write and id-token: write, and it publishes the exact site produced by the audited build job.

Dependency submission and release run only on trusted direct pushes to main. Their write permissions are scoped to the single job that submits the validated dependency graph or publishes the exact release. The release caller preserves the exact executables produced by those CI jobs; the publication job downloads rather than rebuilds them.

A separate pull_request_target metadata workflow runs only when a pull request changes CHANGELOG.md. It checks out trusted main code, reads the exact head changelog through the GitHub API as bounded inert data, and updates only one marker-delimited section of the pull-request body. Manual text outside that section is preserved. The workflow re-reads the body immediately before writing and refuses to overwrite a concurrent edit; it never checks out or executes pull-request code and is the only workflow granted pull-requests: write.