Houndarr CI conventions

SkillDev tools

Houndarr's CI workflow reference and branch protection. Loads when reading or editing .github/workflows/. Covers the 11 required status checks (exact names matter for branch protection), the additional non-required workflows, the paths-ignore + ci-skip pattern that keeps docs-only PRs green, and the rule against changing required check job names.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Houndarr CI conventions skill

What this skill tells your AI

The instructions your AI receives, as published by av1155/houndarr in .agents/skills/houndarr-ci/SKILL.md and read by ahel’s review.

Required checks (11; branch protection enforced)

Check nameWorkflow fileWhat it runs
Lint (ruff)quality.ymlruff check .
Format (ruff)quality.ymlruff format --check .
Type check (mypy)quality.ymlmypy src/
Test (Python 3.13)tests.ymlpytest -q --tb=short + compile check + --help
Dependency audit (pip-audit)security.ymlpip-audit against requirements.txt + requirements-dev.txt generated on the fly via uv export --frozen from pyproject.toml + uv.lock
SAST (bandit)security.ymlbandit -r src/ -c pyproject.toml
Trivy filesystem scansecurity.ymltrivy fs . (CRITICAL/HIGH with known fix)
Dependency reviewdependency-review.ymlPR dependency diff vs GitHub Advisory Database
Build (no push)docker.ymlMulti-arch Docker build (amd64/arm64), no push
Trivy image scandocker.ymlTrivy scan of built Docker image (CRITICAL/HIGH with known fix)
Security smoke testsecurity-smoke-test.ymlLive container: unauthenticated sweep, CSRF, XFF, rate limiting, API key exposure, container security

The six main workflows (quality, tests, security, dependency-review, docker, security-smoke-test) use paths-ignore: ["docs/**", "**/*.md", "website/**", ".claude/**"]. When a PR touches only those paths, ci-skip.yml provides passing no-op jobs with identical check names so branch protection is satisfied.

Additional workflows (not required checks)

WorkflowTriggerPurpose
version-check.ymlPRs changing VERSION or CHANGELOG.mdValidates VERSION format, CHANGELOG heading match, allowed ### headers, --- separator
release.ymlv* tag pushValidates VERSION == tag, extracts CHANGELOG block, creates GitHub Release
chart.ymlv* tag pushPackages charts/houndarr/ with version from VERSION file, pushes to oci://ghcr.io/av1155/charts
dockerfile-lint.ymlChanges to Dockerfilehadolint Dockerfile
workflow-lint.ymlChanges to .github/workflows/**actionlint via reviewdog
api-snapshot-refresh.ymlWeekly (Monday 10:00 UTC) + manualFetches upstream Radarr/Sonarr/Whisparr/Lidarr/Readarr OpenAPI specs, updates docs/api/ snapshots and tests/test_docs_api.py hashes, opens a PR if changed
pages.ymlPushes to main touching website/**Deploys docs site to GitHub Pages
test-deploy.ymlPRs touching website/**Tests Docusaurus build without deploying
link-check.ymlPRs touching **/*.md, **/*.mdx, lychee.toml + weekly (Monday 08:00 UTC) + manualRuns lychee against every Markdown file to catch broken external links; rules live in lychee.toml
cleanup-actions-cache.ymlDaily (05:00 UTC) + manualPrunes stale GitHub Actions caches

Branch protection on main

  • 11 required status checks (strict; branch must be up to date)
  • PRs required, stale reviews dismissed, conversation resolution required
  • Required approving reviews is 0, so no approval blocks a merge
  • Linear history enforced (no merge commits)
  • No force pushes, no branch deletions
  • Admin enforcement is off. The rules above bind contributors; the maintainer account can push to main and merge past a failing check. The hooks in .claude/settings.json are the real block on direct edits and pushes while on main.
  • CODEOWNERS assigns @av1155 to every file, but code owner review is not a required gate

Don't break this

  • Do not modify the 11 required check job names; branch protection depends on exact name matches.
  • Do not change ci-skip.yml job names without updating branch protection.
  • Keep paths-ignore patterns in sync across the six main workflows.
  • If mypy CI fails with "merge ref not found": push an empty commit to retrigger.
  • Keep every action pinned to a full 40-character commit SHA with the release version as the last token of a trailing comment (uses: owner/repo@<sha> # vX.Y.Z). Dependabot rewrites the SHA and the comment together, but only while the version ends the comment. A tag or branch ref can be repointed by the action owner; a SHA cannot. When pinning by hand, dereference annotated tags to their commit: for those actions git/ref/tags/vN returns a tag object whose SHA the runner cannot resolve.

Signals

GitHub stars
283
Forks
4
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
houndarr-ci
Source
github.com/av1155/houndarr