Skip to main content
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. You can reply to any comment, give 👍 or 👎 feedback to help Macroscope learn, or ask it to fix the issue for you.

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.
Go to Settings → Repos in the Macroscope web app to edit code review settings per-repo or in batch.

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

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 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.
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.

Example

# Vendor dependencies
vendor/**

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

# Lock files
*.lock

# Documentation assets
docs/**/*.pdf

# Log directories
logs/**
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.

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.
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.
# === 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
# === 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/**

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.
.macroscope/ignore affects code review and Check Run Agents. It does not affect commit summaries, status, or the Slack agent.

How Does Code Review Work?

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.