AGENTS.md 5.7 KB

Agent Instructions

Learning from mistakes

  • Whenever you make a mistake and learn from it (pointed out by the user or noticed yourself), record the lesson in AGENTS.md automatically, without being asked, so it isn't repeated.
  • If a mistake recurs although a rule for it already exists, make that rule stricter and more concrete (e.g. a mandatory check before acting) instead of just restating it.
  • When writing or updating AGENTS.md, only add information that isn't already obvious from the repository itself (e.g. Git LFS tracking is visible in .gitattributes and marked on GitHub).

Commit messages

  • Attribution line: Co-Authored-By: Claude <model name> <noreply@anthropic.com> — always include the model name, e.g. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
  • Do not include a Claude-Session: line — the session URL is private.
  • Explain why, not what — don't restate in prose what's already obvious from git diff of the commit (e.g. "add a notice to the README", "update section X").
  • When content is copied or adapted from another repository, reference the sources with full permanent URLs (commit hash + path), e.g. https://github.com/<owner>/<repo>/blob/<sha>/<path>.
  • Don't hard-wrap long lines in commit message bodies — write each paragraph / list item on a single line; git log viewers wrap them automatically.

CHANGELOG

  • Only document user-facing changes (features, bug fixes, removed support).
  • Test tooling changes (e.g. [dev-packages] in Pipfile, Pipfile.lock) are not user-facing → no entry needed.
  • Changes to the container image (Dockerfile, base image, docker-apparmor-profile, docker-compose.yml) are user-facing → document them under a container image / dockerfile: list item, like existing entries.
  • Credit external contributors like existing entries, e.g. ([#123](https://github.com/fphammerle/systemctl-mqtt/pull/123) by Jane Doe (jane@example.com)).
  • Wording for Python version support: declare compatibility with \python3.X`(under ### Added),compatibility with `python3.X`(under### Removed`)

Pull requests

  • Rebase on master before opening a PR.
  • One commit per PR; amend rather than adding new commits.
  • Force-push with --force-with-lease on feature branches.
  • Never force-push to master.
  • Always open a pull request — never push directly to master.
  • Never amend or force-push a branch whose PR is already merged or closed — that rewrites history that's already landed (or been reviewed) and leaves a dangling branch that no longer reflects what merged. For a follow-up change, create a new branch (from current master) and a new PR instead.

CI failures

  • Fix CI failures automatically, iterating until all checks are green — no need to ask first.

Supported Python versions

  • The container image uses the Python version shipped with the Alpine base image in Dockerfile; keep that version within the supported range.
  • Keep the tests matrix in .github/workflows/python.yml, the Programming Language :: Python :: 3.X classifiers and python_requires in setup.py consistent when adding or dropping a Python version.
  • The lowest supported Python version is the lowest one in that matrix.

Files synced with other repositories

  • Files starting with a sync with <url> comment are shared with other repositories. Keep them structurally in sync and mention in the PR description when a change should be ported to the referenced file as well.

GitHub comments that @-mention a bot

  • Commands like @dependabot rebase must reach GitHub as plain text — tool-call composition can silently insert stray characters (e.g. interpunct ·) into @mentions, which stops the bot from recognizing the command. This has happened repeatedly, even with this rule in place, so the following steps are mandatory:
    • Before posting, check that the comment body is plain ASCII and contains no · (U+00B7).
    • Post such comments one at a time, never several in parallel.
    • Immediately after posting, read the comment back from GitHub and compare it character by character with the intended text. Only then post the next one.
    • If the body is wrong, edit the comment to the exact intended text (Dependabot does act on edited comments) and read it back again — don't leave a broken command posted.
  • The same corruption also hits @mentions in PR descriptions and other GitHub text. Don't quote bot commands literally there (describe them instead, e.g. "the Dependabot rebase command"), and read every PR description back after creating or updating it.

Pull request descriptions

  • Don't include the Claude session URL — it's private. A footer containing it may be appended automatically when a PR is created; read the description back and remove it with an update.

Pipfile / dependency management

  • Generate Pipfile.lock on the lowest supported Python version.
  • When a package is a conditional transitive dependency (e.g. dill, typing_extensions) whose pip markers depend on the lock-generation Python version, add it explicitly as a direct dependency in Pipfile (without a version marker) so it installs on all supported Python versions.
  • Dependabot may regenerate Pipfile.lock on a newer Python version, picking dependency versions that dropped support for the lowest supported Python version (e.g. platformdirs requiring python_version >= '3.11'). Fix by re-running pipenv lock on the lowest supported version.
  • When constrained packages (e.g. setuptools, urllib3) need to override transitive resolution, put them in [packages], not [dev-packages].