# Python
__pycache__/
*.py[cod]
*.egg-info/
build/
dist/
.venv/
.mypy_cache/
.ruff_cache/
.pytest_cache/
.coverage
htmlcov/

# Secrets and per-installation state. A profile's baton.yaml is meant to be
# committed (to a *private* repo); the credentials beside it never are.
.env
*.env
!.env.example
secrets/
state/
data/
*.db

# Only the sample profile is public. Even with credentials externalized to
# env vars, a real profile's yaml still carries real learner names (contact
# aliases) and real page references — it belongs to the private overlay,
# never to this public repo.
profiles/*
!profiles/example/

# Editor / OS
.DS_Store
*.swp
.idea/
.vscode/

# Never commit these: they are what made the original workspace impossible to
# open-source without a scrubbing pass.
*.bak
*.bak.*
*.orig
tmp/

# Sidecar lock files from the atomic-write layer. They are transient and
# occasionally survive a killed process; they must never be committed.
*.lock

# Local-only review workspace. This repo is public; the review notes track
# known defects before they are fixed and stay on the machine.
/review/

# Local-only work briefs. These carry raw session transcripts with real
# learner names and page links — the reason they never reach this repo.
/briefs/

# `tools/callgraph.py` writes its graph beside itself. It is a snapshot of the
# code it was run against, stale the moment anything changes, and regenerated
# in a second — a build output, not a source file.
callgraph.json

# Screenshots dropped at the repo root by browser-driven sessions, and the
# Playwright MCP scratch directory that produces them. Nothing here is a
# project asset; a real doc image would live under docs/ and stay tracked.
.playwright-mcp/
/*.png

# Test-fixture media. Real lesson clips (~1 GB, real learner names) never
# belong in a public repo. The bytes live outside this repo, under the
# OpenClaw data mount; `tests/fixtures-staging-videos` and `tests/fixtures/`
# are only doorways to it (symlink / future copies) — ignored here so a
# stray `git add -A` can never stage them.
tests/fixtures/
tests/fixtures-staging-videos

# Same arrangement for the mock learner's clips (2026-09-01): the bytes live
# beside the other test assets under the OpenClaw mount, and this is only the
# doorway. Filmed for testing rather than recovered from a real lesson, so the
# reason is size and provenance rather than privacy, but it stays out of git
# either way. `~/studio-baton-private/bin/restore-test-clips` puts them back
# on Drive after a run trashes them.
tests/fixtures-test-learner
