
You exclude files from review with **file exclusion patterns**. Lines in excluded files never reach the AI reviewer and never count against your review credit (RC) usage. ADO Pilot ships a default exclusion list covering binary formats and files ending in `.lock`; you add your own patterns for generated code, build outputs, and vendored dependencies.

## What the setting controls

| Field                   | Type                   | Default | Scope merge |
| ----------------------- | ---------------------- | ------- | ----------- |
| `fileExclusionPatterns` | array of glob patterns | `[]`    | Additive    |

Patterns are evaluated against the **path** of each file in the PR diff. A file is excluded if its path matches any pattern in the merged list (defaults plus your custom patterns).

## Default exclusions

These exclusions are always applied — you do not need to add them yourself.

ADO Pilot always excludes these file types from review. Lines in these files do not count toward review credit (RC) usage.

**Binary formats**

- Images: `.png`, `.jpg`, `.jpeg`, `.gif`, `.bmp`, `.ico`, `.webp`, `.svg`, `.tif`, `.tiff`, `.avif`, `.heic`, `.heif`
- Archives: `.zip`, `.tar`, `.gz`, `.rar`, `.7z`, `.bz2`, `.xz`, `.cab`
- Audio: `.mp3`, `.wav`, `.flac`, `.aac`, `.m4a`, `.wma`
- Video: `.mp4`, `.mov`, `.avi`, `.mkv`, `.webm`, `.m4v`
- Executables and libraries: `.exe`, `.dll`, `.so`, `.dylib`, `.a`, `.lib`
- Compiled bytecode: `.class`, `.pyc`, `.wasm`
- Fonts: `.woff`, `.woff2`, `.ttf`, `.otf`, `.eot`
- Office documents: `.pdf`, `.doc`, `.docx`, `.xls`, `.xlsx`, `.ppt`, `.pptx`
- Design files: `.sketch`, `.fig`, `.xd`
- 3D model files: `.stl`, `.fbx`, `.blend`, `.gltf`, `.glb`
- Database files: `.db`, `.sqlite`, `.mdb`, `.accdb`
- Mobile app bundles: `.apk`, `.ipa`, `.aab`
- Disk images: `.iso`, `.dmg`, `.img`

**Generated and machine-maintained files**

- Lock files ending in `.lock`: `yarn.lock`, `poetry.lock`, `Gemfile.lock`, `composer.lock`
- Source maps: `*.map`

The default matcher uses the file's last-dot extension only. Lock files with a different extension — most importantly `package-lock.json` and `pnpm-lock.yaml` — are **not** excluded by default. If you do not want lock-file changes consuming review credits, add them to your org-level `fileExclusionPatterns`:

```yaml
fileExclusionPatterns:
  - "**/package-lock.json"
  - "**/pnpm-lock.yaml"
```

The complete default list covers more than 130 extensions. Custom exclusion patterns you add stack on top of these defaults.

## Glob pattern syntax

The same glob syntax used for [branch filters](branch-filters.md):

| Pattern             | Meaning                                       | Matches                                       |
| ------------------- | --------------------------------------------- | --------------------------------------------- |
| `**/*.generated.cs` | Any file ending `.generated.cs`, at any depth | `Models/User.generated.cs`                    |
| `build/**`          | Anything under `build/`                       | `build/output.js`, `build/intermediate/foo.o` |
| `**/vendor/**`      | `vendor/` at any depth                        | `vendor/foo`, `services/api/vendor/lib/x.go`  |
| `dist/**`           | Anything under `dist/`                        | `dist/index.js`, `dist/assets/main.css`       |

## Example: .NET / C\#

Skip Roslyn-generated partials, designer files, and the `obj/` and `bin/` build directories.

```yaml
fileExclusionPatterns:
  - "**/*.generated.cs"
  - "**/*.Designer.cs"
  - "**/obj/**"
  - "**/bin/**"
  - ".vs/**"
```

## Example: Node.js / TypeScript

Skip dependencies, build outputs, and minified bundles.

```yaml
fileExclusionPatterns:
  - "node_modules/**"
  - "dist/**"
  - "build/**"
  - ".next/**"
  - "**/*.min.js"
  - "**/*.bundle.js"
```

## Example: Python

Skip virtualenvs, bytecode caches, and packaging artifacts.

```yaml
fileExclusionPatterns:
  - "venv/**"
  - ".venv/**"
  - "__pycache__/**"
  - "**/*.egg-info/**"
  - "build/**"
  - "dist/**"
```

## Example: Go

Skip vendored modules and generated protobuf bindings.

```yaml
fileExclusionPatterns:
  - "vendor/**"
  - "**/*.pb.go"
  - "gen/**"
```

## Additive merge across scopes

Exclusions from every scope combine. If your organization excludes `**/*.generated.cs` and a repository adds `**/*.min.js`, both patterns apply to that repository.

```text
Organization:  ["**/*.generated.cs", "**/package-lock.json"]
Project:       ["build/**"]
Repository:    ["**/*.min.js", "dist/**"]
Effective:     ["**/*.generated.cs", "**/package-lock.json", "build/**", "**/*.min.js", "dist/**"]
```

In the example above the organization has explicitly added `**/package-lock.json` to its exclusions — `package-lock.json` is **not** excluded by default (see [Default exclusions](#default-exclusions)).

A file is excluded if it matches any pattern in the effective set, plus the default exclusions. See [Org, project, and repo settings hierarchy](settings-hierarchy.md).

## Cost impact: excluded lines are free

Excluded lines never reach the AI reviewer, so they do not count when ADO Pilot calculates RC usage for a PR. This is the single biggest lever for controlling cost on PRs that touch generated or vendored content.

| Change                                                                        | Without exclusion | With exclusion |
| ----------------------------------------------------------------------------- | ----------------- | -------------- |
| 200 lines of code plus 800 lines of `package-lock.json` (added to exclusions) | 2 RC              | 1 RC           |
| 50 lines of code plus 20,000 lines of minified JS                             | 40+ RC            | 1 RC           |

Long lines bill higher than the raw line count suggests: a line longer than 200 characters counts as more than one billing line, so genuinely minified JS (a few very long lines rather than 20,000 short ones) typically costs more without exclusion than a simple per-line count implies.

For details on how ADO Pilot calculates RC consumption, see the billing documentation.

## What happens when every file is excluded

If every file in the PR matches an exclusion pattern, ADO Pilot detects an empty effective diff and skips the AI review. No inline comments are posted and no RCs are charged — but ADO Pilot still posts a **succeeded** `adopilot/ai-pr-review` status check, so a required branch policy on that status doesn't block the PR.

## Interaction with other settings

- **Branch does not match the filter** — Whole PR is skipped before exclusions are evaluated.
- **Branch matches, all files excluded** — Empty-diff skip path; 0 RC charged, but a succeeded status check is still posted.
- **Branch matches, some files excluded** — Review runs on the remaining files; only those lines count toward RC.



