*.o
*.so
.build/
# Local dynamic-module build tree used to prove a change before pushing.
# Ignored for the same reason .build/ is: it is an unpacked nginx source
# tree, so a stray `git add -A` commits thousands of upstream files.
.build-proof/
__pycache__/
build/
objs/
valgrind-*.log

# Coverage artifacts (ci/tools/coverage.sh output + gcov intermediates)
coverage-report/
*.gcda
*.gcno
*.gcov

# Unit-test build binary (source under ci/tests/unit/ IS tracked)
ci/tests/unit/test_math
ci/tests/unit/test_vary_gen
ci/tests/unit/test_variant_gen
ci/tests/unit/generated_variant.inc
ci/tests/unit/test_shm_state
ci/tests/unit/test_shm_state.san
ci/tests/unit/test_frame_scan
ci/tests/unit/test_frame_scan.san
ci/tests/unit/test_digest_fail
ci/tests/unit/test_key_fold
ci/tests/unit/generated_key_fold.inc

# Fuzzing build artifacts (seed corpus IS tracked; everything else is not)
ci/fuzz/fuzz_resp_parser
ci/fuzz/fuzz_norm_args
ci/fuzz/fuzz_mc_parser
ci/fuzz/fuzz_auto_classify
ci/fuzz/auto_classify_empty_smoke
ci/fuzz/fuzz_blob
ci/fuzz/fuzz_blob_fixtures
ci/tests/unit/blob_fixtures
ci/tests/unit/auto_classify_fixtures
ci/tests/unit/resp_parser_fixtures
ci/fuzz/generated_parser.inc
ci/fuzz/generated_norm_args.inc
ci/fuzz/generated_mc_parser.inc
ci/fuzz/generated_auto_classify.inc
ci/fuzz/generated_blob.inc
ci/tests/unit/generated_shm.inc
ci/fuzz/crash-*
ci/fuzz/*-min/
ci/fuzz/*.profraw
# Local fuzz runs dump discovered units into the corpus dirs; keep only the
# hand-written NN_* seeds, ignore libFuzzer's hash-named discoveries.
ci/fuzz/corpus/*
!ci/fuzz/corpus/[0-9][0-9]_*
ci/fuzz/corpus_norm_args/*
!ci/fuzz/corpus_norm_args/[0-9][0-9]_*
ci/fuzz/corpus_mc/*
!ci/fuzz/corpus_mc/[0-9][0-9]_*
ci/fuzz/corpus_auto/*
!ci/fuzz/corpus_auto/[0-9][0-9]_*
ci/fuzz/corpus_blob/*
!ci/fuzz/corpus_blob/[0-9][0-9]_*

# Test::Nginx::Socket regenerates these per run (ci/t/*.t). Under
# TEST_NGINX_RANDOMIZE the scaffold hardcodes t/servroot_<port>/ as the root,
# so the dirs land in t/ regardless of where the .t files live.
/t/
# Without RANDOMIZE (a single `prove ci/t/presets/foo.t` while iterating) the
# servroot instead lands beside the .t files, as ci/t/servroot/. It holds a
# generated nginx.conf plus access/error logs -- scratch, never source.
ci/t/servroot/
