# Planning and internal docs
compose-lint-plan.md

# Agent / AI assistant configuration.
# AGENTS.md and CLAUDE.md are tracked (CLAUDE.md is a symlink to AGENTS.md for
# tools that still look for the legacy name). Memory, session, and local
# agent-runner state lives under .claude/ and stays untracked.
.claude/

# Python bytecode
__pycache__/
*.py[cod]
*$py.class
*.pyo

# Distribution / packaging
dist/
build/
*.egg-info/
*.egg
src/*.egg-info/

# Virtual environments
.venv/
venv/
ENV/

# IDE / editor
.vscode/
.idea/
*.swp
*.swo
*~
.project
.settings/

# Testing / coverage
.pytest_cache/
.coverage
# `parallel = true` writes one data file per process; the patch-coverage
# gate and CONTRIBUTING's local recipe both ask for the XML report.
.coverage.*
coverage.xml
htmlcov/
.tox/
.nox/

# Type checking
.mypy_cache/
.dmypy.json

# Ruff
.ruff_cache/

# Mutation testing (mutmut working dir)
mutants/
.mutmut-stats/

# uv's project-mode lockfile, written as a side effect of the `uv run` in
# docs/mutation-testing.md. Untracked on purpose: the tracked locks are the
# four requirements*.lock files that CI regenerates and byte-diffs, and a
# committed uv.lock would hand Renovate's pep621 manager a second lockfile
# for the same [project] deps — the duplicate-PR failure the disabled poetry
# manager already documents in .github/renovate.json.
uv.lock

# Environment / secrets
.env
.env.*
!.env.example

# OS files
.DS_Store
Thumbs.db

# Build isolation
*.spec

# Raw VHS renders; the committed assets are docs/assets/demo{,-fix}.gif
scripts/demo/demo.gif
scripts/demo/fix.gif

# Overlay half of the SARIF ingestion probe (#631). Untracked on purpose: the
# question the probe answers is whether Code Scanning keeps a result whose
# artifactLocation names a file absent from the repository, which is the normal
# state of a compose.override.yml. Committing it would remove the condition
# under test.
tests/smoke/overlay/compose.override.yml
