> ## Documentation Index
> Fetch the complete documentation index at: https://docs.macroscope.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Code Review

> Automatic bug detection and fixes on every pull request

Macroscope automatically reviews every pull request for correctness. When it finds an issue, it leaves a comment on the PR describing the problem and suggesting a fix.

You can also configure fully customizable AI agents that trigger on every pull request open, push, and manual check rerun by setting up [Check Run Agents](/check-run-agents).

You can reply to any comment, give 👍 or 👎 feedback to help Macroscope learn, or ask it to [fix the issue for you](/fix-it-for-me).

## Code Review Settings

* Enabled by default on every linked repo.
* Toggle on/off per repo in **Settings → Repos**.
* Change the default for new repos in **Settings → Repos → Defaults**.
* Set **always-review labels** to force a review even when automatic review is off.
* Set **skip labels** to prevent review even when automatic review is on. Skip labels take precedence over always-review labels.

<Note>
  Go to **Settings → Repos** in the Macroscope web app to edit code review settings per-repo or in batch.
</Note>

## Manually Triggering a Review

Comment **"@macroscope-app review"** on any PR in GitHub to trigger a review, even if automatic code review is disabled for that repo.

## Code Review Activity Log

The Code Review activity log in the Macroscope web app shows all review comments across your repositories.

### Source Column and Filtering

Each comment displays a **Source** column indicating where the feedback originated (e.g. Correctness, Check Run Agent). Use the source filter to focus on comments from a specific review type.

Filters persist in the URL, so you can bookmark or share filtered views. When exporting to CSV, the export respects your current filters.

### Review Type Filtering in Feedback Metrics

Feedback metrics pages support filtering by review type. Select a specific type to see metrics for that review source, or view a cross-type overview to compare feedback across all review types.

## How Reviews Appear in GitHub

### Check Runs

When issues are found, the GitHub check run completes with `NEUTRAL` instead of `SUCCESS`. Check run details show per-file exclusion reasons.

### Comment Resolution

Comments link to the commit where they were resolved. Macroscope re-evaluates automatically when new code is pushed.

### Issue Severity Levels

* **CRITICAL**: data loss, security breach
* **HIGH**: production crashes, security degradation
* **MEDIUM**: broken functionality (recoverable)
* **LOW**: cosmetic, edge-case issues

## Excluding Files with `.macroscope/ignore`

<a id="excluding-files-from-code-review" />

<a id="macroscope-ignore" />

You can tell Macroscope to skip specific files during code review by adding a `.macroscope/ignore` file to your repository. The file uses a simplified [glob pattern](https://en.wikipedia.org/wiki/Glob_\(programming\)) syntax, one pattern per line. Lines starting with `#` are comments, blank lines are ignored.

### Setup

1. Create a file named `.macroscope/ignore` in your repository.
2. Add one file path pattern per line.
3. Commit and push. Macroscope picks it up automatically on the next review.

<Note>
  The legacy path `.macroscope-ignore` at the repo root is still supported for backward compatibility, but `.macroscope/ignore` is the recommended location. This consolidates all Macroscope configuration into the `.macroscope/` directory.
</Note>

### Example

```text theme={null}
# Vendor dependencies
vendor/**

# Generated code
*.pb.go
*.generated.go

# Lock files
*.lock

# Documentation assets
docs/**/*.pdf

# Log directories
logs/**
```

<Tip>
  Use `**` to match across directories, `*` to match within a single path segment, and `?` to match a single character. Patterns without a `/` match at any depth. Maximum 1,000 patterns.
</Tip>

### Default Ignore Patterns

Macroscope ships with a built-in set of ignore patterns covering vendored dependencies, generated code, binary assets, and test files. These are applied automatically when no `.macroscope/ignore` file exists in your repo.

<Warning>
  Creating your own `.macroscope/ignore` **replaces** these defaults rather than extending them. To preserve the defaults, copy the patterns below into your `.macroscope/ignore` file and add your own on top.
</Warning>

<AccordionGroup>
  <Accordion title="Default base patterns (vendored, generated, binary, etc.)">
    ```text theme={null}
    # === Vendored / dependency directories ===
    **/.git/**
    **/__pycache__/**
    **/.pytest_cache/**
    **/.mypy_cache/**
    **/.ruff_cache/**
    **/venv/**
    **/.venv/**
    **/node_modules/**
    **/site-packages/**
    **/.pnpm-store/**
    **/__Snapshots__/**
    **/__snapshots__/**
    **/.agents/skills/**
    **/.claude/skills/**
    **/.github/skills/**
    **/bower_components/**
    **/jspm_packages/**
    **/.next/**
    **/.svelte-kit/**
    **/vendor/**
    **/_vendor/**
    **/third_party/**
    **/Pods/**
    **/.bundle/**

    # === Minified build output ===
    **/*.min.js
    **/*.min.css

    # === Generated protobuf / codegen files ===
    **/*_pb.d.ts
    **/*_pb.js
    **/*.pb.go
    **/*_pb2.py
    **/*_pb2_grpc.py
    **/*_pb2.pyi
    **/*.grpc.swift
    **/*.pb.swift
    **/*.sql.go
    **/*.designer.cs
    **/*.g.dart
    **/*.pb.dart
    **/*_pb.rb

    # === Package manager files ===
    **/go.mod
    **/package.json
    **/*.pbxproj
    **/*.xcstrings
    **/*.strings
    **/*.properties
    **/pom.xml
    **/Package.swift
    **/bun.lock
    **/.eslintrc
    **/.eslintignore

    # === Lock / sum files ===
    **/go.sum
    **/package-lock.json
    **/pnpm-lock.yaml
    **/yarn.lock
    **/Package.resolved

    # === Images ===
    **/*.jpg
    **/*.jpeg
    **/*.png
    **/*.gif
    **/*.svg
    **/*.ico
    **/*.webp
    **/*.bmp
    **/*.tiff

    # === Fonts ===
    **/*.woff
    **/*.woff2
    **/*.ttf
    **/*.eot
    **/*.otf

    # === Media ===
    **/*.mp3
    **/*.mp4
    **/*.wav
    **/*.avi
    **/*.mov
    **/*.mkv
    **/*.flac
    **/*.ogg
    **/*.srt

    # === Archives ===
    **/*.zip
    **/*.tar
    **/*.gz
    **/*.rar
    **/*.7z
    **/*.bz2

    # === Documents ===
    **/*.pdf
    **/*.doc
    **/*.docx
    **/*.xls
    **/*.xlsx
    **/*.ppt
    **/*.pptx

    # === Data / serialized ===
    **/*.db
    **/*.sqlite
    **/*.sqlite3
    **/*.parquet
    **/*.avro
    **/*.arrow
    **/*.npy
    **/*.pkl
    **/*.jsonl

    # === ML models ===
    **/*.onnx
    **/*.tflite
    **/*.h5
    **/*.safetensors

    # === Compiled / binary ===
    **/*.exe
    **/*.dll
    **/*.so
    **/*.dylib
    **/*.bin
    **/*.pyc
    **/*.class
    **/*.o
    **/*.a
    **/*.wasm

    # === Certificates / keys ===
    **/*.cer
    **/*.pem
    **/*.p12

    # === Platform-specific / non-reviewable ===
    **/*.stringsdict
    **/*.snap
    **/*.adoc
    **/*.arb
    **/*.lock
    **/*.po
    **/*.fbx
    **/*.log
    **/*.xib
    **/*.meta
    **/*.kml
    **/*.prefab
    **/*.eml
    **/*.csv
    **/*.grpc.reflection
    **/*.js.map
    ```
  </Accordion>

  <Accordion title="Default test file patterns">
    ```text theme={null}
    # === Go ===
    **/*_test.go

    # === TypeScript / JavaScript ===
    **/*.test.ts
    **/*.test.tsx
    **/*.test.js
    **/*.test.jsx
    **/*.test.mjs
    **/*.test.cjs
    **/*.test.mts
    **/*.test.cts
    **/*.spec.ts
    **/*.spec.tsx
    **/*.spec.js
    **/*.spec.jsx
    **/*.spec.mjs
    **/*.spec.cjs
    **/*.spec.mts
    **/*.spec.cts
    **/*.e2e.ts
    **/*.e2e.tsx
    **/*.e2e.js
    **/*.e2e.jsx
    **/*.e2e.mjs
    **/*.e2e.cjs
    **/*.integration.ts
    **/*.integration.tsx
    **/*.integration.js
    **/*.integration.jsx
    **/*.integration.mjs
    **/*.integration.cjs
    **/__tests__/**

    # === Python ===
    **/test_*.py
    **/*_test.py

    # === Java / Kotlin ===
    **/*Test.java
    **/*Tests.java
    **/*Spec.java
    **/*IT.java
    **/*ITCase.java
    **/*Test.kt
    **/*Tests.kt
    **/*Spec.kt
    **/*IT.kt
    **/*ITCase.kt
    **/src/test/java/**
    **/src/test/kotlin/**
    **/src/androidTest/**
    **/src/integrationTest/**

    # === Swift ===
    **/*Tests.swift
    **/*UITests.swift
    **/*Tests/**
    **/*UITests/**

    # === Rust ===
    **/tests/*.rs
    **/*_test.rs
    **/test_*.rs

    # === Ruby ===
    **/*_test.rb
    **/*_spec.rb
    **/test_*.rb

    # === Generic test directories ===
    **/test/**
    **/tests/**
    **/spec/**
    **/specs/**
    **/e2e/**
    ```
  </Accordion>
</AccordionGroup>

### Behavior

* Pattern matching is deterministic. If a file matches, it is always skipped, including on manual invocations. There is no override mechanism.
* Skipped files are listed in the check run details.

<Note>
  `.macroscope/ignore` affects code review and [Check Run Agents](/check-run-agents#macroscope-ignore). It does not affect commit summaries, status, or the Slack agent.
</Note>

## How Does Code Review Work?

<a id="how-code-review-works" />

Macroscope reviews every file in a PR. For supported languages, it uses deep AST-based analysis. For everything else, it uses an AI-powered agentic approach.

### Native AST Analysis

For supported languages, Macroscope's code walkers parse the Abstract Syntax Tree to build a graph-based representation of your codebase. This enables deep, language-aware review with per-language model tuning and framework-specific handling (e.g. parsing `.vue` single-file components and Nuxt conventions).

**Supported languages**: Go, Python, TypeScript, JavaScript, Vue.js (including Nuxt), Java, Rust, Kotlin, Swift, Ruby, Elixir, Starlark.

### Universal File Support

All other files (config, docs, scripts, other languages) are reviewed via an AI-powered agentic approach. Every file in a PR gets examined, just without language-specific AST parsing.

Macroscope also uses web search during review to pull in up-to-date context, such as latest library documentation, API signatures, and deprecation notices.

### Models

Macroscope's auto-tune system tests multiple model, prompt, and parameter combinations per language to find the best config. An LLM-driven curator analyzes failures and proposes improvements each iteration. [Learn more about our auto-tune system](https://macroscope.com/blog/we-stopped-writing-prompts).
