# Branch 🌿 ## CI Impact 🔀 The branch prefix MUST match the type of change. The [PR workflow](pull-request.md) uses it to classify the scope and decide which CI pipeline to run. | Branch prefix | Scope | Matching files | CI behavior | |---|---|---|---| | `agent` | Changes to agent instructions or prompts | `AGENTS.md`, `roles//AGENTS.md`, `docs/agents/*` | Skips [orchestrator](../../../../.github/workflows/call-orchestrator.yml), finishes green through the lightweight scope gate. | | `documentation` | Documentation-only changes | `**/*.md`, `**/*.rst` (outside agent paths) | Skips [orchestrator](../../../../.github/workflows/call-orchestrator.yml), finishes green through the lightweight scope gate. | | `feature` | New features or enhancements | `*` | Runs the full [orchestrator](../../../../.github/workflows/call-orchestrator.yml) pipeline. | | `fix` | Bug fixes | `*` | Runs the full [orchestrator](../../../../.github/workflows/call-orchestrator.yml) pipeline. | | `update` | Automated or maintenance updates | `*` | Runs the full [orchestrator](../../../../.github/workflows/call-orchestrator.yml) pipeline. | | `chore` | Maintenance, dependency, and tooling updates (incl. branches created by [cron-update.yml](../../../../.github/workflows/cron-update.yml)) | `*` | Runs the full [orchestrator](../../../../.github/workflows/call-orchestrator.yml) pipeline. | | `alert-autofix` | Automated alert-triggered fixes | `*` | Runs the full [orchestrator](../../../../.github/workflows/call-orchestrator.yml) pipeline. | | `dependabot` | Automated dependency updates | `*` | Runs the full [orchestrator](../../../../.github/workflows/call-orchestrator.yml) pipeline. | ## Enforcement 🔒 The [PR workflow](pull-request.md) fails its validation run when the branch prefix does not match the PR scope. The ruleset on `main` does not require that run to pass, see [branch.md](../../tools/github/branch/security.md) for the rules it enforces. The naming conventions below are additionally checked locally by the lint test [test_branch_name.py](../../../../tests/lint/repository/naming/test_branch_name.py), which fails `make test-lint` when the checked-out branch uses an unknown prefix (e.g. `feat/` instead of `feature/`) or a non-kebab-case description. ## Naming Conventions 🏷️ The description MUST use `kebab-case` (lowercase words separated by hyphens) and SHOULD be short enough to read at a glance. The full branch name MUST follow one of the patterns below, depending on whether the change targets a specific role or is general: | Case | Pattern | Example | |---|---|---| | General feature | `feature/` | `feature/ldap-integration` | | Role feature | `feature//` | `feature/web-app-matomo/ldap-integration` | | General fix | `fix//` | `fix/dns-resolution/taiga-123` | | Role fix | `fix///` | `fix/web-app-matomo/login-redirect/taiga-789` | | General update | `update/` | `update/docker-image-versions` | | Chore | `chore/` | `chore/update-docker-image-versions` | | Alert autofix | `alert-autofix-` | `alert-autofix-261` | | Documentation | `documentation/` | `documentation/contributing-setup` | | Agent | `agent/` | `agent/improve-commit-instructions` | | Dependabot | `dependabot//` | `dependabot/pip/requests-2.32.0` | `feature`, `update`, `documentation`, and `agent` branches MUST NOT reference a ticket ID. `alert-autofix` branches reference the alert ID instead of a ticket ID. `dependabot` branches are created automatically and MUST NOT be renamed.