# Contributing and releasing The rules below are enforced by GitHub where they can be (a ruleset on `main`, required CI) and expected everywhere else. They apply to the maintainer and to Claude Code alike. ## How changes land `main` is protected: no direct pushes, no force pushes, no deletion. Every change is a pull request, squash-merged, with the `check` and `image-smoke` jobs green. A release is one such PR: the version bump. Only collaborators can push branches or merge. Outsiders can open a PR from a fork; its CI run waits for a collaborator to approve it, and a fork PR can never publish an image or a release. Dependabot (`.github/dependabot.yml`) opens a few `skip-changelog` PRs a week: npm, GitHub Actions and the Docker base image. Version updates are only proposed 7 days after the release (`cooldown`); security updates come at once. They are merged by hand like any other PR, as a batch once `check` and `image-smoke` are green: ```bash gh pr list --author app/dependabot gh pr merge --squash --delete-branch # for each one that passed ``` Read a major version bump like an outside PR first: what could it break that the tests don't reach (the components have no automated tests)? Dependencies are pinned, so a fix only reaches users in a release: cut a patch release after merging a security update (or one that fixes a Dependabot alert) or a new Docker base image. Other bumps can wait for the next release. ```bash git switch -c # never work on main # edit, commit git push -u origin HEAD gh pr create --fill --label