buildx
.DS_Store
BPTK_Py/.DS_Store
*.DS_Store
.eggs/
*.*pyc
*__pycache
*.csv
*.log
results/
venv
.idea/
.ipynb_checkpoints/
.vscode
dist/
*.egg-info
build/
_build
test*.ipynb
.env
.claude
tests/state
/state
.mypy_cache/
.pytest_cache/

# Rust engine build artifacts
target/
Cargo.lock
BPTK_Py/_rust_engine*.so
BPTK_Py/_rust_engine*.pyd

# Generated Python files from XMILE compiler
# XMILE models (*.stmx) are compiled to Python during tests
tests/test_models/*.py

# marimo session/autosave caches (the notebook .py itself IS tracked)
__marimo__/

# Quarto documentation build
docs/tutorial/_output/
docs/tutorial/.quarto/
docs/tutorial/_freeze/
*.quarto_ipynb
# Quarto recreates this on every render; its two patterns are covered above
docs/tutorial/.gitignore

# What the pages write when they execute. All three are outputs of a lesson
# rather than inputs to one, so a render must not leave the tree dirty:
#   - export_data and exporting_simulation_results call export_scenarios()
#   - beergame_ql dumps a freshly trained q-table; training is stochastic, so the
#     file differs on every build. The q-tables the pages *read*
#     (q_tables_12500..50000.json) are genuine inputs and stay tracked.
docs/tutorial/model_library/customer_acquisition/export/
docs/tutorial/xmile/exporting_simulation_results/data/customer_acquisition.xlsx
docs/tutorial/model_library/beergame/data/q_tables_10.json

# The environment uv builds. It ships its own .gitignore containing "*", so it
# hides itself anyway — stated here because that is uv's convention, not our rule.
#
# uv.lock is deliberately NOT ignored. It is what makes `uv sync` install the same
# versions on a laptop and in CI; ignored, as it was until 2026-09-02, the lock
# existed on one machine and every other one resolved afresh.
.venv/

# Build output: `just build-all` and the CI wheel job write here
dist/
platform-dist/
smoke/

# node, used only by the Pyodide test runner
node_modules/
package-lock.json

# Coverage output
.coverage
htmlcov/
