# ── 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.
dev/debug/atlas-*.jsonl
dev/debug/atlas-*.md
dev/debug/latest.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

# Screenshots dropped in while reporting a bug. Same class as the debug/atlas-* rule above:
# per-session working files, not source.
dev/debug/*.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/

# NOT ignored, deliberately: incubator/aix-integration/aix-files/ — the three real ArcGIS Pro
# exports plus one companion PDF, 5.9 MB. Every claim about the format is checked against them and
# the conformance test diffs our output against them, so they are the ground truth rather than
# sample data. Losing them would mean losing the ability to verify anything.
#
# Which is exactly why the well data they were drawn from does NOT live in there: 590 MB of
# Eagle Ford lateral, DSU and inventory shapefiles were sitting inside that not-ignored folder,
# one `git add` away from being in the history permanently. They are in source-data/ now, and
# nothing in the study needs them — verifying the format needs the .aix, not its subject.
incubator/aix-integration/source-data/

# Output from the .aix inspector, regenerated by running it.
incubator/aix-integration/**/stream_*.bin

# ── Deck generator dependencies ──────────────────────────────────────────────────
# docs/enablement-presentation/ holds the .pptx and nothing else; everything used to
# build it is in working/. pptxgenjs is restored with `npm install pptxgenjs` there.
node_modules/
package-lock.json
docs/enablement-presentation/working/render/

# ── 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 releases/.
ship/handoff/*.skill

# ── Model binaries in the incubator ───────────────────────────────────────────
# 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.
products/e1/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.
dev/testing/regression/bugs*/
dev/testing/regression/catimport/
dev/testing/regression/cattest/
dev/testing/regression/cmptest/
dev/testing/regression/dragtest/
dev/testing/regression/dtest/
dev/testing/regression/expsave/
dev/testing/regression/gdbtest/
dev/testing/regression/savetest/
dev/testing/regression/*.gpkg
dev/testing/regression/*.gdb/
dev/testing/regression/*.aix
dev/testing/regression/*.pdf
dev/testing/regression/*.png
dev/testing/regression/*.atlas
dev/testing/regression/*.atlas.json
#  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/
dev/testing/regression/rt/
dev/testing/regression/racetest/
