# ── Secrets — never commit ────────────────────────────────────────────────────
# Live PyPI API token used by dev/publish-*.bat
**/dev/token.txt
**/token.txt
*.pem
*.key
.env
.env.*

# ── Virtual environments ──────────────────────────────────────────────────────
.venv/
venv/
env/
**/.venv/

# ── Python build / cache ──────────────────────────────────────────────────────
__pycache__/
*.py[cod]
*.egg-info/
build/
dist/
.pytest_cache/
.mypy_cache/
.ruff_cache/

# ── Atlas debug session logs ──────────────────────────────────────────────────
# Bug reports are per-session working files, not source. README.md is kept. Pro-only, and the
# packager leaves the folder out of every .skill.
products/pro/debug/*
!products/pro/debug/README.md

# ── Large test / sample data — on disk, not in history ────────────────────────
# 364 MB of Bakken + Vaca Muerta shapefiles. Git is not a data store; keeping
# these out is what makes the repo clonable. They stay on disk untouched.
#  Test data, wherever it lives. This line used to read incubator/testing-data/ -- the folder's
#  old home. It moved to archive/ and the rule did not move with it, so 335 MB of Enverus well
#  data (producing well lists, Bakken and Three Forks laterals) was committed from 1.2.2 on and
#  had to be scrubbed from history before the first push to GitHub. Matched by name anywhere,
#  because a path-specific rule is exactly what went stale.
**/testing-data/
#  Data pulled out of Databricks as the output of an experiment: Enverus data, not the work.
archive/databricks-optimizer/deliverables/
**/TestingData/
*.duckdb
*.zip

# Data moved out of the incubator into archive/ when the work finished. archive/ IS tracked, so
# these need naming here or the move would make 6.6 MB of scratch and somebody else's config
# files committable — the folder changed, the "git is not a data store" rule did not.
#
# This replaces a line reading `incubator/archive/`, which named a folder that never existed:
# finished work goes to the repo's own archive/, which is what CLAUDE.md says archive/ is for.
#
# instant-analyst-configs: the Instant Analyst configs cross-referenced against the warehouse
# for 1.8.2's lat/lon discovery. The FINDING shipped; these are somebody else's config files.
archive/instant-analyst-configs/
# scratch-badass-gis: a visual-language scratch study. Its output was always ignored (below);
# archived whole, because the whole thing is now output rather than work.
archive/scratch-badass-gis/

# Base-data build inputs and outputs — 2.5 GB: a 2.4 GB file geodatabase of PRISM land grids,
# a 119 MB counties shapefile and the 144 MB GeoPackage built from them. There is no source in
# this folder, only data; the scripts that build it live with the experiment. Same rule as
# testing-data above — git is not a data store, and this alone would make the repo unclonable.
archive/env-base-data/

# Probe output from the flex-detect experiment. The BRIEF and README are the work; these are
# 3.3 MB of intermediate rasters and screenshots regenerated by running the probes.
archive/flex-detect/probe_*.tif
archive/flex-detect/probe_*.png

# 19 exported map PDFs, 15 MB of output with no source beside them. Same rule as
# env-base-data and testing-data above — the outputs of an experiment, not the experiment.
# They sit with the .pagx study that produced them.
archive/atlas-mapping/exports/


# ── Deck generator dependencies ──────────────────────────────────────────────────
node_modules/
package-lock.json

# ── Editor / OS ───────────────────────────────────────────────────────────────
.idea/
.vscode/
*.swp
Thumbs.db
desktop.ini
$RECYCLE.BIN/

# ── Claude Code working state ─────────────────────────────────────────────────
.claude/worktrees/
.claude/shell-snapshots/
.claude/statsig/
.claude/todos/

# ── Scratch output ────────────────────────────────────────────────────────────
*.atlas.json.bak
*.bak-*

# ── Virtual environments the skill creates ────────────────────────────────────
# preflight.py builds skill/venv on the user's machine; it is platform-specific and large.
products/pro/venv/

# ── Handoff artifacts ─────────────────────────────────────────────────────────
# The .skill is rebuilt by package_skill.py and already versioned in warehouse/.
ship/handoff/*.skill

# ── Model binaries ───────────────────────────────────────────
# Esri .dlpk study material: 1.8 GB for ~600 MB of content, because every model is present
# three times (extracted + .dlpk + .zip). Reference only — never part of a release.
archive/DeepLearningModelsESRI/
*.dlpk
*.pth
*.pt


# Map output from the badass-gis visual-language trial: 3.1 MB of pulled lake data (3,111
# permitted laterals, 150 active rigs), the deduped subplay frame, and the exported PDF. The
# visual-language document and the scripts beside it are the work; this is the output of the
# work, and it is regenerated by running build_data.py and make_map.py against a live Atlas.
archive/scratch-badass-gis/output/

# The scraped symbology corpus: a 140 MB CSV of 301,613 layer records pulled from 669 .aprx
# projects on the GIS share, plus the aggregates derived from it. The reference sheets, the
# analysis scripts and CONCLUSIONS.md are the work; this is the input and the output of the
# work, and git is not a data store — this file alone would make the repo unclonable.
archive/palette-v2/symbology_master.csv
archive/palette-v2/conclusions_*.csv
archive/palette-v2/discovered_labels.csv

# Rendered sample pages from the E1 port. `test/preview.js` is the work; these are its output,
# regenerated by running it. Note e1/dist/ and e1/build/ are ALREADY ignored by the global
# `dist/` and `build/` rules above -- deliberately, because every file in them is generated by
# `gen_spec.py` + `build.js` from sources that ARE tracked. Nothing in e1/ that somebody pastes
# into E1 is a source file; the sources are e1/src/*.js and e1/skill/.
#
# Replaces two entries naming `e1/atlas-skeleton.zip` and `e1/atlas-skeleton/`, which were the
# output of the first E1 attempt and no longer exist.
archive/e1-js/preview/

#  Office lock files. PowerPoint/Word write `~$name.pptx` beside an open document and remove
#  it on close, so it shows up in git status for exactly as long as the deck is open.
~$*

#  The scraped symbology corpus, 137 MB. Its two outputs that matter -- the 107 measured
#  rules and the write-up -- are tracked at docs/style-guide/ instead, which is where
#  e1/gen_spec.py now reads them from.
archive/palette-v2/

#  Regression scratch. Each suite writes its own working directory beside itself -- projects,
#  GeoPackages, geodatabases, exports -- and rebuilds them on the next run. 110 MB of it had
#  accumulated untracked and would have gone into the next commit: `dtest/` alone holds a
#  69 MB pwi_wells.gpkg. The rule the repo already states, applied here: a folder holds the
#  work, not the output of the work, and git is not a data store. The SUITES are tracked; what
#  they produce is not.
#  Allow-listed rather than enumerated: tests/ keeps its suites and README, and every scratch
#  directory a suite writes beside itself is ignored without having to be named first.
tests/*
!tests/*.py
!tests/README.md
!tests/maps/
#  rt/ and racetest/ are scratch directories later suites create, and enumerating one
#  more name is how this list went stale in the first place: the two of them held
#  **507 MB** of Eagleford_Remake.data sidecars, waiting for the next commit. A *.data
#  sidecar is a project's COPY of data it references -- output by definition, and
#  regenerable by rerunning the suite -- so the pattern is ignored wherever it appears
#  rather than per directory.
**/*.data/

# Map-testing scenarios: copies of real Enverus project data (DSUs, laterals, operator land) for
# running Atlas Lite and Pro end to end. Never committed -- it is customer-adjacent data and
# ~175 MB of it. Only the README that says what each scenario is for is kept.
tests/maps/*
!tests/maps/README.md
