# Environment
.env

# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
env/
venv/
.venv/
*.egg-info/
dist/
build/
.pytest_cache/
.coverage
htmlcov/
# The macOS wheel's Vulkan loader and MoltenVK, staged by
# scripts/stage_macos_bundled_vulkan_driver.sh at build time.
sdk/streamlib-python-wheel/python/tatolab/runtime/_vulkan_driver/

# Output files
output/
*.mp4
# ...except the one recording that is a checked-in test asset: `xtask
# mp4-inspect`'s tests read bytes `Mp4Sink` actually wrote, and a built-ins
# test regenerates and compares them so the two cannot drift.
!xtask/tests/fixtures/*.mp4
output.log

# IDE
.idea/
*.swp
*.swo
# Note: .vscode/ is committed for workspace recommendations

# OS
.DS_Store
Thumbs.db

# uv
.uv/
uv.lock
# The integration suite's CI job syncs it with `uv sync --frozen`.
!tests/stream-on-runtime/uv.lock

__internal__/

# Internal documentation (secret sauce)
docs/internal/
docs/research/ai_embodiment_vision.md
docs/research/SESSION_RESTORE.md

# Rust
target/
# Workspace lockfile is committed (reproducible dev/CI builds, per current
# cargo guidance); nested package/example lockfiles stay untracked. An
# extension wheel is the exception: it is a released artifact built from its
# own workspace root, so its lockfile is committed for the same reason the
# workspace's is.
Cargo.lock
!/Cargo.lock
!/packages/streamlib-webrtc/Cargo.lock

# Node/Nx
node_modules/
.nx/
dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
examples/camera-display/no_window_camera.log

# Example assets (user-specific) — README is tracked, the GLB / image
# files referenced by the macOS path are not redistributable.
examples/camera-python-display/assets/*
!examples/camera-python-display/assets/README.md

# Claude Code project files (except versioned items)
# Claude Code — ephemeral only
.claude/worktrees/
.claude/scheduled_tasks.lock
.claude/settings.local.json
.claude/rig-brake.local.json

# Operating-model session markers: plan-session, active-ticket.json.
# Machine-local, created/removed by the lifecycle skills — never tracked.
.claude/state/

# Loop runtime state — the reconciler's own memory (picture of in-flight tickets,
# comment-id ledger, delta-probe cache) plus its append-only run-log. Machine-local
# and rewritten every pass; `branch-shield.sh` refuses commits on main, so this must
# never be tracked. Loop POLICY (constraints, budget, registry) stays tracked in
# .claude/loops/. Shape documented by .claude/loops/state.example.json.
.claude/loops/state/
*.log
.rustup/

# Local dev environment
.streamlib/
.envrc
.cargo/config.toml

.streamlib-build.json

plan.md

# In-flight task handoff notes (working files for cross-session pickup,
# not part of any PR). Pattern matches TASK-401.md, TASK-NNN.md, etc.
TASK-*.md

# Generated bindings — each consuming package/crate regenerates from its
# own streamlib.yaml at build time (build.rs for Rust crates; setup.py
# build hook for the Python SDK; `deno task setup` for Deno projects).
# See docs/architecture/schema-identity-and-packaging.md.
_generated_/

# Generated Rust crate root — the mechanical projection of a folder-backed
# package's processors/ directory, rewritten before every cargo invocation.
# Kept out of _generated_/ so it is not mistaken for the Deno wire vocabulary,
# whose directory presence is a provisioning oracle.

# Local-only operator override files (scripts + runbooks): machine-specific
# values, private deployment targets, secrets. Convention is <name>.local.<ext>
# sitting next to a committed generic <name>.<ext>. Never part of a PR.
*.local.sh
*.local.md
# Per-machine rig profile (copied from docs/rig-profile.example.md). Already
# covered by *.local.md above; listed explicitly so it's greppable.
docs/rig-profile.local.md

# Per-developer amos focus state (machine-local, set by /amos:focus).
.amosrc.toml

# Scratch PR bodies — content belongs in the PR, not the tree.
pr-*-body.md
