# Macroscope's Agent
Source: https://docs.macroscope.com/agent
An AI agent that knows your codebase, git history, and connected tools
Macroscope's agent researches your codebase, git history, and connected tools to answer questions and take action.
To use Macroscope's Agent, you must configure Status. To configure Status, click on Status in the left sidebar, then complete the Product Overview and Sprint Cadence. Once your backfill has finished, you'll be able to use the Agent. Until setup is done, the sidebar stays trimmed to code review: see [Set Up Status](/setup-instructions#3-set-up-status).
## Tools
### Built-in
These tools work out of the box once your repositories are connected.
| Tool | What it can do |
| - | - |
| **Code search** | Finds relevant code, patterns, and implementations across all connected repos. |
| **Git history** | Traces what changed, when, and why across commits, branches, and contributors. |
| **Pull requests** | Searches PRs by status, date range, reviewer, or label. Views PR metadata, summaries, and review activity. |
| **GitHub API** | Makes read-only queries for issues, check runs, deployments, commit statuses, and releases. |
| **Code changes** | Creates branches, writes code, opens pull requests, updates existing branches, and adds reviewers. |
| **Contributor metrics** | Queries engineering output and productivity metrics for individuals or teams over time. |
| **Sprint reports** | Retrieves precomputed sprint summaries covering what the team shipped, organized by project and area. |
| **Image generation** | Generates AI images from text descriptions, including diagrams, flowcharts, and illustrations. |
| **Web search** | Searches the web for context beyond your codebase. |
| **Docs search** | Searches Macroscope's own docs. |
### Connected Services
These tools become available when you connect the corresponding service. See [Integrations](/integrations) for setup instructions.
| Tool | What it can do |
| - | - |
| **Jira** | Looks up issues, tracks project progress, creates new issues across projects. |
| **Linear** | Looks up issues, tracks project progress, creates new issues across teams, and breaks an existing issue into sub-issues. |
| **BigQuery** | Browses datasets, inspects schemas, runs read-only SQL. Includes a methodology summary with each answer so you can verify the analysis. |
| **PostHog** | Queries product analytics events, analyzes trends, searches session recordings, inspects feature flags, and runs HogQL queries. |
| **Amplitude** | Runs event segmentation queries, analyzes conversion funnels and retention, searches for users, and inspects individual user event streams. |
| **LaunchDarkly** | Lists projects, environments, and feature flags. Checks flag status, targeting rules, and variations across environments. |
| **Sentry** | Searches error issues across projects, views issue details and event history, and investigates crashes and exceptions. |
| **GCP Cloud Logging** | Discovers available log sources and queries log entries with filters on severity, resource type, timestamps, and payload content. |
| **MCP Connectors** | Connect any [MCP-compatible server](https://modelcontextprotocol.io/) to extend the agent with custom tools (e.g. Datadog, PagerDuty, internal APIs). Configure in **Settings โ Connections** (admin only). |
## Where to Interact with Macroscope's Agent
* **Slack**: DM Macroscope (under **Apps**), tag `@Macroscope` in a channel, or add it to a group DM.
* **GitHub**: Mention **@macroscope-app** in any PR discussion thread, or reply to any of Macroscope's inline code review comments.
* **API**: Trigger the agent programmatically via [webhooks](/api).
In Slack and GitHub, the agent reacts with ๐ to acknowledge a query and replies in-thread. You can attach images, screenshots, PDFs, and code snippets anywhere in a thread and the agent will use them as context.
## Pricing
Agent usage is billed via **credits**. 1 credit = \$0.01. You get **1000 free credits per month**. Beyond the free credits, credits draw from your balance.
Credits scale with LLM cost: a quick Slack question costs \~7 credits (\$0.07), a complex research task \~470 credits (\$4.70).
Credits apply to: Slack queries, [Macros](/macros), [Webhooks](/api), and [Check Run Agents](/check-run-agents). See [Pricing](/pricing#agent) for details.
## Custom Instructions
Set preferred tone, domain context, output format, or person-specific rules in **Settings โ Workspace โ Custom AMA (Ask Macroscope Anything) Instructions** (e.g. "customer success teammates should get less technical responses").
## Examples
* *"What did the team ship yesterday?"*
* *"Draft release notes for everything shipped in the past 2 weeks."*
* *"How does the authentication flow work?"*
* *"Here's a screenshot of a bug. What's causing it? Open a PR to fix it and assign Eliza as a reviewer."*
* *"How many signups did we get last week?"* (uses BigQuery or PostHog)
* *"What feature flags are enabled in production right now?"* (requires LaunchDarkly)
* *"Make a Jira ticket to track this bug. Assign it to Ikshita."* (requires Jira)
* *"What's the status of Linear ticket ENG-431?"* (requires Linear)
* *"Break ENG-431 into sub-issues, one per migration step."* (requires Linear)
# API
Source: https://docs.macroscope.com/api
Trigger Macroscope's agent programmatically via webhooks
To use the API, you must configure Status. To configure Status, click on Status in the left sidebar, then complete the Product Overview and Sprint Cadence. Once your backfill has finished, you'll be able to use the API.
Macroscope exposes an inbound webhook that triggers the agent. It's the same agent you use in Slack and GitHub, but invoked via HTTP so you can call it from CI pipelines, scripts, cron jobs, or any other system.
When the agent finishes, you can get the results two ways:
* **Push**: Macroscope delivers them to a destination you specify (a Slack channel or an external URL).
* **Pull**: omit the destination and poll for the result using the token returned by the trigger.
## Setup
1. Go to **Settings โ Connections โ Webhooks**
2. Click **Add Webhook** and give it a name (e.g. `ci-pipeline`)
3. Copy your **API key**. It's shown once and can't be retrieved later.
4. Copy your **Trigger URL**. You can access it anytime in Settings โ Connections โ Webhooks.
Your **Trigger URL** will follow this format:
```
POST https://hooks.macroscope.com/api/v1/workspaces/{workspaceType}/{workspaceId}/query-agent-webhook-trigger
```
## URL Allowlisting
If you want Macroscope to deliver results to an external URL (rather than Slack), that URL must be allowlisted first. For example, if you're routing results to a Zapier or n8n webhook endpoint, add that URL here. Manage the list in **Settings โ Connections โ Webhooks โ Allowed External URLs**. Only GitHub organization admins can add or remove URLs.
A delivery URL must be a public HTTPS endpoint. Macroscope rejects a URL that is not `https://`, carries credentials in the URL (`https://user:pass@host`), or names a private, loopback, link-local, or otherwise reserved address, whether it is written as a literal (`https://10.0.0.5/hook`) or resolves to one at delivery time. Redirects are not followed. A `3xx` response is reported as a delivery failure rather than chased to a new destination, so point the allowlist at the final endpoint.
## Request
Every request needs two headers:
```bash theme={null}
-H "Content-Type: application/json"
-H "X-Webhook-Secret: your-api-key"
```
POST a JSON body to your trigger URL:
The question to ask the agent.
Where to deliver the results. Use `slackChannelId` (string) to post to Slack, or `webhookUrl` (string) to POST to an external URL (must be [allowlisted](#allowed-external-urls)). Optionally include `slackThreadTs` (string) to reply in a specific Slack thread.
**Optional.** Omit it to retrieve the result by [polling](#polling-for-results) instead.
IANA timezone (e.g. `America/Los_Angeles`). Affects date references in the query.
The request returns `202 Accepted` with a job token and poll URL:
```json theme={null}
{
"jobToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"pollUrl": "https://hooks.macroscope.com/api/v1/workspaces/{workspaceType}/{workspaceId}/query-agent-jobs",
"workflowId": "abc-123-def-456"
}
```
* **`jobToken`**: a signed token (valid \~1 hour) authorizing you to read this one job's result. Send it as an `Authorization: Bearer` header when polling.
* **`pollUrl`**: where to poll for the result. The token is **not** in the URL.
* **`workflowId`**: *deprecated*.
## Example Requests
**Deliver results to Slack:**
```bash theme={null}
curl -X POST \
"https://hooks.macroscope.com/api/v1/workspaces/{workspaceType}/{workspaceId}/query-agent-webhook-trigger" \
-H "Content-Type: application/json" \
-H "X-Webhook-Secret: your-api-key" \
-d '{
"query": "What were the main changes this week?",
"responseDestination": { "slackChannelId": "C0123456789" },
"timezone": "America/Los_Angeles"
}'
```
**Deliver results to a Slack thread:**
```bash theme={null}
curl -X POST \
"https://hooks.macroscope.com/api/v1/workspaces/{workspaceType}/{workspaceId}/query-agent-webhook-trigger" \
-H "Content-Type: application/json" \
-H "X-Webhook-Secret: your-api-key" \
-d '{
"query": "Investigate this alert and respond in thread",
"responseDestination": {
"slackChannelId": "C0123456789",
"slackThreadTs": "1234567890.123456"
},
"timezone": "America/Los_Angeles"
}'
```
**Deliver results to an external URL:**
```bash theme={null}
curl -X POST \
"https://hooks.macroscope.com/api/v1/workspaces/{workspaceType}/{workspaceId}/query-agent-webhook-trigger" \
-H "Content-Type: application/json" \
-H "X-Webhook-Secret: your-api-key" \
-d '{
"query": "What were the main changes this week?",
"responseDestination": { "webhookUrl": "https://your-endpoint.com/callback" },
"timezone": "America/Los_Angeles"
}'
```
## Polling for results
If you didn't set a `responseDestination`, poll the `pollUrl` from the trigger response. Send the `jobToken` as a bearer token:
```bash theme={null}
curl -i "$POLL_URL" -H "Authorization: Bearer $JOB_TOKEN"
```
| Status | HTTP | Body |
| - | - | - |
| Still running | `202` | `{ "status": "running" }` |
| Finished | `200` | `{ "status": "completed", "response": "..." }` |
| Failed | `200` | `{ "status": "failed" }` |
While running, the response carries a `Retry-After` header (seconds) suggesting how long to wait before polling again. The job token is valid for about **one hour**. If it expires before the job finishes, you'll get `403`; re-trigger to get a fresh one.
### Example: trigger and poll
```bash theme={null}
# 1. Trigger without a destination
RESP=$(curl -s -X POST \
"https://hooks.macroscope.com/api/v1/workspaces/{workspaceType}/{workspaceId}/query-agent-webhook-trigger" \
-H "Content-Type: application/json" \
-H "X-Webhook-Secret: your-api-key" \
-d '{ "query": "What were the main changes this week?" }')
JOB_TOKEN=$(echo "$RESP" | jq -r .jobToken)
POLL_URL=$(echo "$RESP" | jq -r .pollUrl)
# 2. Poll until done
while :; do
OUT=$(curl -s "$POLL_URL" -H "Authorization: Bearer $JOB_TOKEN")
[ "$(echo "$OUT" | jq -r .status)" != "running" ] && break
sleep 10
done
echo "$OUT" | jq -r .response
```
## Response Payload
When the agent finishes, Macroscope POSTs this to your Slack channel or URL:
```json theme={null}
{
"query": "What were the main changes this week?",
"response": "Here are the main changes...",
"workflowId": "abc-123-def-456"
}
```
## Error Codes
| Code | Meaning |
| - | - |
| `202` | Query accepted. |
| `400` | Malformed request or missing `query`. |
| `401` | Missing or invalid `X-Webhook-Secret`. |
| `403` | Wrong workspace, or webhook URL not allowlisted or not a permitted public HTTPS endpoint. |
When polling:
| Code | Meaning |
| - | - |
| `200` | Job finished (`completed` or `failed`). |
| `202` | Still running; retry after the `Retry-After` interval. |
| `401` | Missing or invalid job token. |
| `403` | Job token expired, or doesn't match this workspace. |
| `404` | Job not found. |
## Use Cases
* **Post-deploy summaries**: GitHub Actions runs a deploy, triggers a webhook asking "what changed in this release?", and Macroscope posts a plain-English summary to your team's Slack channel.
* **Incident response**: wire a PagerDuty or Sentry alert to trigger a Macroscope webhook. The agent can investigate the error, open a PR with a proposed fix, assign the most relevant teammate as a reviewer, and post a summary to your on-call Slack channel.
* **No-code automations**: a Zapier or n8n workflow triggers Macroscope every Monday morning to generate a weekly engineering digest and routes the answer to email, Notion, or wherever your team tracks updates.
* **Synchronous Q\&A / chatbots**: trigger a query from your own app with no destination, poll until complete, and show the answer inline in a custom "ask Macroscope" experience.
# Approvability
Source: https://docs.macroscope.com/approvability
Auto-approve low-risk PRs that pass code review
Disabled by default. Turn it on per repo under [**Settings โ Repos โ Features**](/settings#features); the settings below it appear once it's on. Only a **GitHub Admin** can change it.
## How It Works
When a PR is opened or updated, Macroscope evaluates up to three criteria before auto-approving. Ownership (via CODEOWNERS) is disabled by default; Eligibility and Correctness are always active. All active criteria must pass for auto-approval. If any fail, the PR can still be approved manually.
### The verdict
Every PR gets a comment leading with one of four verdicts, followed by a sentence giving Macroscope's own assessment of the PR and the reasoning behind it. The verdict is what happened to the PR; the assessment is Macroscope's view of it, and the two are separate because a PR Macroscope finds approvable can still go unapproved because of how your workspace is configured.
| Verdict | Meaning |
| - | - |
| **Approved** | Approvable, nothing blocking, and automatic approval is on. Macroscope posted a real GitHub approval. |
| **Would Approve** | Approvable, but something held it: automatic approval is off, an ownership requirement, outstanding correctness findings, a correctness review that could not report, or [a correctness review a limit stopped from running](#limit-stops-correctness). The comment lists everything blocking it. |
| **Not approved** | The eligibility agent judged the PR not a candidate for automatic approval, and says why. |
| **Skipped** | Macroscope reached no verdict at all: a protected path, a diff too large to analyze, an unparseable result, or [a spend limit that stopped the check itself](#limit-stops-approvability). |
A **Would Approve** verdict is not a hedge on your code: Macroscope found the PR eligible and is telling you which setting or requirement stopped the approval.
### 1. Eligibility
Is this PR a good candidate for auto-approval? Macroscope evaluates the changes, code ownership, git blame history, and the author's role.
If your repo has a `CODEOWNERS` file, Macroscope factors in the author's relationship to changed files.
* **Typically eligible**: docs, tests, code behind feature flags, simple bug fixes, copy changes.
* **Not eligible**: large refactors, schema changes, security/auth/billing code, breaking changes.
### 2. **Correctness**
Are there unresolved correctness findings at or above your repo's Minimum Blocking Severity?
By default, correctness is a **hard gate**: an unresolved correctness finding at or above your repo's Minimum Blocking Severity blocks automatic approval. Resolving the final blocking review thread clears that gate automatically. If nothing else blocks approval and automatic approval is enabled, Macroscope approves the PR without requiring a new commit or Approvability run.
If resolving the final blocking thread does not update an existing PR, rerun Approvability once from the Checks tab.
The way to disable this is to set [**Minimum Blocking Severity**](#minimum-blocking-severity) to **Off**, which stops outstanding comments from automatically blocking approvability. The approvability agent then makes a non-deterministic evaluation based on all available information, including outstanding correctness comments, so it may still return **Not approved** on their merits. Your [custom instructions](#custom-eligibility-rules) control how it weighs them; see also [Letting Eligibility decide correctness instead](#letting-eligibility-decide-correctness-instead), which tells the agent to leave correctness out of the judgment altogether.
By default, a correctness review that cannot report also blocks approval. If the review finds issues but cannot post them, Approvability reports **Would Approve** instead of approving on findings nobody can see. It states that the assessment omitted those findings and lists the missing review as a blocker. **Off** covers this case too by removing the deterministic failure regardless of what the review found or whether it posted the findings. Telling Macroscope to ignore correctness in your guidelines does the same. With either setting, Eligibility decides alone.
Whether a review that never ran blocks depends on **why** it never ran, and the line is not about severity:
* **You turned it off**: correctness disabled for the repo, an excluded target branch, a skipped author, or simply no reviewable code in the PR. Nothing was owed, so nothing is missing: these never block, and approvals continue exactly as before.
* **A limit stopped it**: a spend limit, a cost limit, an exhausted credit balance, or the per-PR cap on automatic reviews. Here a review *was* expected and did not happen, so Macroscope is missing an input it normally weighs. These now hold the PR at **Would Approve** rather than approving without it. See [When a limit stops the correctness review](#limit-stops-correctness).
Comments from an *earlier* review still count either way. They remain outstanding until resolved, so a review that never ran does not clear a blocker raised by a previous review. If those comments exist, they hold the PR, not the missing review.
#### When a limit stops the correctness review
If a spend limit, cost limit, credit balance, or the per-PR cap on automatic reviews stops a correctness review from running, that PR is held at **Would Approve** instead of being approved. Macroscope normally weighs a correctness verdict when deciding approvability; a limit means the review was expected and did not happen, so the verdict is missing rather than clean.
This is not a severity question, and there is nothing in the PR to fix: no finding was produced. The comment names the limit that stopped the review and links the setting that clears it:
| What stopped it | What clears it |
| - | - |
| Monthly spend limit, or an exhausted credit balance | Raise the limit or add credits in **Billing settings**. A manual review does **not** help here: the workspace cap applies to it too. |
| Per-review or per-PR cost limit | Raise the limit in **Billing settings**, or comment `@macroscope-app review this PR` to bypass the limit and review this PR now. |
| Per-PR cap on automatic correctness reviews | Raise the limit in repo settings, or comment `@macroscope-app review this PR` to bypass the cap and review this PR now. |
Repos that have correctness **disabled** are unaffected and keep approving as before: see the two cases listed under Correctness above. A repo that hits a limit stops auto-approving until the limit clears or is raised; once a correctness review runs again, the next Approvability run approves normally.
Both ways of taking correctness out of the gate cover this too. With [**Minimum Blocking Severity: Off**](#minimum-blocking-severity), or with [custom rules telling Macroscope to ignore correctness](#letting-eligibility-decide-correctness-instead), a limit-stopped review does **not** hold the PR: Eligibility decides alone, and the comment notes that no correctness review stood behind the verdict.
#### When a limit stops the Approvability check itself
The section above is about a limit stopping the **correctness review**: Approvability still runs and holds the PR at **Would Approve**, naming the missing input. A limit can also stop **Approvability itself**, which looks different: there is no verdict and no comment, only a check run concluded **skipped**.
| What stopped it | What you see | What clears it |
| - | - | - |
| Monthly spend limit, or an exhausted credit balance | The check is concluded **skipped**, naming the limit | Raise the limit or add credits in **Billing settings** |
| Correctness per-PR cost limit | The check is concluded **skipped**, reporting what the PR has cost so far against the cap | Raise the cap in **Billing settings**, or comment `@macroscope-app review this PR` |
A skipped check never fails, so [using Approvability as a required status check](#using-approvability-as-a-required-status-check) will not block a merge because a limit was reached: a red check nobody on the PR can turn green would only block the wrong person.
Worth knowing about the per-PR cost limit specifically: it totals only **Code Review** spend on the PR. Approvability's own spend does not add to it, so Approvability can be stopped by a cap it never contributed to. This applies to every workspace, including one that has never touched the setting: the Correctness per-PR cap cannot be turned off and defaults to \$50.
That is intentional rather than an oversight. Approvability reads the correctness review's findings to reach a verdict, so once the cap has stopped correctness on a PR, continuing to run Approvability would produce a verdict from incomplete input: worse than reporting no verdict at all.
The separate [Check Run Agents per-PR limit](/pricing#cra-per-pr-limit) does **not** affect Approvability. Reaching it stops agents on the PR and leaves the Approvability check alone. See [What the Correctness per-PR cap counts](/pricing#per-pr-cap).
The Eligibility agent runs even when correctness is already blocking. Its verdict cannot change the outcome, but it tells you something correctness cannot: whether Macroscope would have approved the PR but for the findings, or would have held it anyway. That is the difference between a **Would Approve** verdict and a **Not approved** one.
#### Minimum Blocking Severity
**Minimum Blocking Severity** is a per-repo setting that controls which severity of unresolved correctness comments blocks auto-approval. Outstanding correctness comments at or above the configured severity block approval; comments below the threshold do not. Choose from **Low**, **Medium**, **High**, **Critical**, or **Off**: the default is **Medium**.
**Off** removes the deterministic gate entirely. Correctness never fails a PR on its own, even for a ๐ด **Critical** finding or when the review could not post its findings. It does *not* do two things:
* It does not silence correctness review. Findings are still posted on the PR as usual; they just stop holding up approval by themselves.
* It does not override the Eligibility agent. The agent still runs, sees the findings, and reports its view. A ๐ด **Critical** finding describing a real defect can still send the PR to human review based on its content rather than its badge.
That second point is the distinction worth holding on to: **Off** removes the automatic block, not the judgment. If you want correctness excluded from the judgment as well, use [Letting Eligibility decide correctness instead](#letting-eligibility-decide-correctness-instead).
Find it in **Settings โ Repos โ Approvability** (shown once Approvability is enabled). Only a **GitHub Admin** can change it.
A comment counts as outstanding until its review thread is resolved on GitHub, or the comment is deleted. Comments with no recorded severity are treated as **Medium**.
The threshold applies to the Eligibility judgment as well: a Macroscope correctness comment below it does not, on its own, send the PR to human review. Comments at or above the threshold still do, and so does anything else that warrants review: a comment from a human reviewer or another tool, or the nature of the changes themselves.
#### Check Run Conclusion
**Check Run Conclusion** is a per-repo setting that controls how the approvability check reports a PR it does not approve: **Neutral** (the default) or **Failure**. It is the settings-page equivalent of the [`conclusion`](#supported-fields) front matter field, for teams that cannot commit `.macroscope/approvability.md` into every repository.
* **Neutral**: the check is informational. It reports the verdict and never blocks merging.
* **Failure:** The check fails, so adding `Macroscope - Approvability Check` as a [required status check](#using-approvability-as-a-required-status-check) blocks the merge until the PR becomes approvable. Only two outcomes the author can clear ever fail: a **Not approved** verdict and outstanding correctness findings at or above your [Minimum Blocking Severity](#minimum-blocking-severity). A **Skipped** verdict never fails, regardless of this setting. Neither does [a correctness review stopped by a limit](#limit-stops-correctness). That case holds the PR at **Would Approve** but concludes **Neutral** because the author cannot clear a workspace limit, and a red check they cannot turn green would block the wrong person.
Everything documented under [Using approvability as a required status check](#using-approvability-as-a-required-status-check) applies identically however you set it, including the full list of outcomes on each side and how a `failure` is cleared. In particular, PRs held by [protected configuration paths](#protecting-review-configuration) still conclude **Neutral**, so this setting can never make a configuration PR unmergeable.
Find it in **Settings โ Repos โ Approvability** (shown once Approvability is enabled). Only a **GitHub Admin** can change it. It also has a workspace default and can be applied across many repos at once from **Settings โ Repos** with repos selected: the same batch flow as [Minimum Blocking Severity](#minimum-blocking-severity).
**Front matter always wins.** If `.macroscope/approvability.md` sets `conclusion`, that value applies and this setting is ignored for that repo: including `conclusion: neutral`, which is how a single repo opts out of a workspace-wide **Failure**. A file that omits `conclusion` does not override anything, so repos keep whatever the setting says even when they have guidelines for other purposes.
The workspace default seeds **newly added** repos. Changing it does not move repos that already exist: batch-edit them for that.
#### Letting Eligibility decide correctness instead
This is the stronger of the two ways to stop correctness from gating approval, and unlike [**Minimum Blocking Severity: Off**](#minimum-blocking-severity) it is not a setting: state it in your [custom eligibility rules](#custom-eligibility-rules). If your `.macroscope/approvability.md` **explicitly** says correctness issues must not factor into approvability, Macroscope stops treating correctness as a gate for that repo and lets the Eligibility judgment weigh the findings on its own:
```text theme={null}
Correctness issues and bugs found by code review must NOT factor into the
approvability decision. Judge this PR on the nature of the change alone.
```
This has to be explicit about correctness issues or bugs. Guidelines that only mention external reviewers' comments do not qualify, and silence or ambiguity leaves the gate on.
The difference from **Off** is what each asks of the agent: **Off** stops correctness from failing the PR automatically but leaves the agent weighing the findings, whereas this tells the agent to leave them out of the judgment altogether. It also keeps the choice visible in the repo rather than in a settings page.
***
Results appear as `Macroscope - Approvability Check` in the Checks tab and as a PR comment with detailed reasoning.
## Custom Eligibility Rules
Add a `.macroscope/approvability.md` file to your repo to define rules on top of the defaults. Your custom rules are **additive**: they are combined with the built-in eligibility criteria, not a replacement.
### Plain text rules
The simplest approach is a plain markdown file with your rules:
```text theme={null}
If a PR changes files in any of the following paths, DO NOT auto-approve:
- services/auth
- services/billing
- targets/auth
```
### Front matter configuration
For more control, add YAML front matter to configure the approvability agent's behavior:
```markdown theme={null}
---
tools:
- github_api_read_only
- modify_pr
conclusion: neutral
---
If a PR changes files in any of the following paths, DO NOT auto-approve:
- services/auth
- services/billing
- targets/auth
If the verdict is "not approved" and the PR touches services/auth/,
request a review from @security-team.
```
#### Supported fields
| Field | Default | Description |
| - | - | - |
| `tools` | `[]` | Additional tools for the approvability agent. The agent always has file browsing and git tools; this field adds more capabilities. |
| `conclusion` | [Check Run Conclusion](#check-run-conclusion) setting, or `neutral` | Controls the check run result when a PR is not approved. `neutral` (recommended) makes the check informational, so it never blocks merging. To gate merges on human approval, use GitHub's [required reviewers](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/available-rules-for-rulesets#require-a-pull-request-before-merging). `failure` makes the check block merges through [required status checks](#using-approvability-as-a-required-status-check); review the caveats before enabling it. `failure` does not apply to PRs held by [protected configuration paths](#protecting-review-configuration), which always conclude `neutral`. Setting this field here **overrides** the [Check Run Conclusion](#check-run-conclusion) repo setting; omit it to use that setting. |
| `waitsFor` | Correctness, Check Run Agents & external review tools | Additional check run names that must complete before approvability runs. Even when unset, approvability automatically waits for the Correctness check, every [Check Run Agent](/check-run-agents) on the commit, and recognized third-party review tools (Cursor BugBot, Greptile) before deciding: this field adds prerequisites on top of those. Supports `["*"]` wildcard to wait for all check runs. See [Waiting for Other Checks](#waiting-for-other-checks). |
| `waitsForTimeout` | `20` | How long to wait for prerequisites to **finish**, in minutes (`1` to `60`). Only meaningful when `waitsFor` is set. |
| `waitsForDiscoveryTimeout` | `1` (60 seconds) | How long to wait for a prerequisite to **appear** on the commit before treating it as absent, in minutes (`1` to `60`). Raise this when a check is published conditionally or late. See [Check Run Agents](/check-run-agents#late-prerequisites) for the full explanation and trade-off. With named prerequisites, it is a deadline and costs nothing once they appear. With `waitsFor: ["*"]`, it is a **floor paid on every run**, so every PR's verdict is delayed by that window. That combination triggers a warning on the check run page. The value is capped at `waitsForTimeout` and only matters when `waitsFor` is set. |
| `neverApprove` | `[]` | Additional paths that are never auto-approved when a PR changes them. Glob patterns, same syntax as Check Run Agent `include`/`exclude`. This list only ever **adds** to the always-on protection on your approvability file: see [Protecting review configuration](#protecting-review-configuration). |
| `alwaysApprove` | `[]` | Paths that skip the eligibility agent, but only when **every** file the PR changes matches one of them. Glob patterns, same syntax as `neverApprove`. Skips the agent, not the other approval conditions: see [`alwaysApprove`](#alwaysapprove--skipping-the-agent-for-routine-paths). |
#### Available tools
Tools extend what the approvability agent can do beyond its defaults (file browsing and git tools):
* `github_api_read_only`: search code and read GitHub metadata
* `modify_pr`: request reviewers or post PR reviews
* `slack`: post messages to Slack channels
* `launchdarkly`: check feature flag status
* `web_tools`: search the web
* `issue_tracking_tools`: query linked Jira/Linear tickets
The `modify_pr` tool enables instructions like "request a review from @security-team when the verdict is not approved." Without it, the agent can only analyze and report: it can't take actions on the PR.
#### Waiting for other checks
By default, approvability waits for the Correctness check, any [Check Run Agents](/check-run-agents), and recognized third-party review tools (Cursor BugBot, Greptile) before making its decision, so their findings are considered in the verdict. Use `waitsFor` to add CI steps whose results should affect the verdict, such as linters, deployment checks, or other external tools not covered by the built-in list.
**Wait for specific checks:**
```yaml theme={null}
---
waitsFor:
- "CI / lint"
- "Macroscope - Security Review"
conclusion: neutral
---
If CI lint or the security review flagged issues, DO NOT auto-approve.
```
**Wait for all checks (wildcard mode):**
```yaml theme={null}
---
waitsFor:
- "*"
---
Consider findings from ALL CI steps when deciding whether to auto-approve.
```
Wildcard mode waits for every check run on the commit except `Macroscope - Approvability Check` itself. This is useful when you have multiple Check Run Agents posting review comments and want approvability to consider all of their findings.
**Custom timeout:**
The default wait is 20 minutes. Set `waitsForTimeout` to change it (1-60 minutes):
```yaml theme={null}
---
waitsFor:
- "deploy-to-staging"
waitsForTimeout: 45
---
```
A prerequisite also has to *appear* on the commit within a shorter discovery window (60 seconds by default) or it is treated as absent. Set `waitsForDiscoveryTimeout` to give more time to a check published conditionally, behind an earlier job, or by a workflow queued while a previous run is still cancelling:
```yaml theme={null}
---
waitsFor:
- "pre-commit / pre-commit"
waitsForDiscoveryTimeout: 10
---
```
The cost of a longer window is that a check which never appears at all takes that long to give up on. See [Check Run Agents](/check-run-agents#late-prerequisites) for the full explanation.
Combining a longer window with `waitsFor: ["*"]` costs more. With named prerequisites, the window is a deadline for *appearance*. Once they appear, the window ends and the wait continues only until they conclude. A wildcard wait has no names to look for, so it must outlast the window before it can conclude that every check on the commit has finished. Every PR's approvability verdict is delayed by at least that window, whether or not anything was published late. The check run page warns about this combination rather than rejecting it, because the delay may be appropriate for a check that is genuinely published that late.
**Behavior summary:**
| Scenario | What happens |
| - | - |
| Prerequisites complete | Approvability proceeds with its eligibility assessment, considering review comments posted by the waited-for checks. |
| Prerequisite never appears within the discovery window (60 seconds by default) | The prerequisite is treated as absent and approvability proceeds. Check that the name in `waitsFor` matches the check run name exactly as it appears on GitHub; if the step is real but published late, raise `waitsForDiscoveryTimeout`. |
| Prerequisite does not complete within timeout | Approvability proceeds without waiting further. Increase `waitsForTimeout` if the step is slow. |
| Circular dependency | Detected at parse time. For example, if a CRA has `waitsFor: ["Macroscope - Approvability Check"]` and approvability has `waitsFor: ["*"]`, the cycle is detected and the affected CRA skips with a descriptive error. |
Approvability always waits for the Correctness check and recognized third-party review tools (Cursor BugBot, Greptile) regardless of `waitsFor`: this field controls additional prerequisites beyond those built-in waits. Named mode supports up to 10 entries.
#### Using approvability as a required status check
Most teams should leave `conclusion` at the default (`neutral`) and use GitHub's [required reviewers](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/available-rules-for-rulesets#require-a-pull-request-before-merging) to gate merge on human approval. The approvability check surfaces the verdict; the reviewer requirement does the blocking. This is the simplest and most predictable setup.
If you want the approvability check itself to hard-block merge when a PR is not approved, turn the conclusion to `failure` and add `Macroscope - Approvability Check` as a [required status check](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches#require-status-checks-before-merging) in your branch protection rules.
There are two ways to turn it on, and they behave identically from here on:
* Set the [**Check Run Conclusion**](#check-run-conclusion) repo setting to **Failure**. This needs no file, has a workspace default, and can be applied to many repos at once.
* Set `conclusion: failure` in `.macroscope/approvability.md` front matter. This is per-repo, lives in source control, and overrides the setting.
Be aware of how GitHub handles this combination.
**When the check concludes `failure` (merge blocked).** Only two outcomes fail the check, and both are ones the author can clear by acting on the PR:
* The approvability agent returned a verdict of **Not approved**.
* Correctness findings are posted on the PR and still outstanding at or above your repo's [Minimum Blocking Severity](#minimum-blocking-severity). Setting that to **Off** removes this outcome entirely, leaving the agent's verdict as the only way the check fails.
**When the check concludes `neutral` or `skipped` (merge NOT blocked).** GitHub counts [`success`, `skipped`, and `neutral`](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/collaborating-on-repositories-with-code-quality-features/troubleshooting-required-status-checks) as passing a required status check. Approvability deliberately concludes `neutral` instead of `failure` whenever the hold is something the author cannot clear by changing the PR: failing on those would leave the PR permanently unmergeable:
* The PR modifies `.macroscope/approvability.md`, modifies a path protected by `neverApprove` (see [Protecting review configuration](#protecting-review-configuration)), or modifies `CODEOWNERS` without owning it.
* The diff is too large to analyze, or the agent returned no usable response.
* Correctness could not report: it found issues but was unable to post them, reached no verdict, or never ran.
* The PR was authored by Macroscope, or auto-approval is switched off for the repo.
* The approvability agent itself errored or timed out.
It concludes `skipped`, which also passes, when approvability is disabled for the PR (draft PR, repo setting off, skipped author), when a billing or usage limit is reached, and when a push leaves the diff unchanged (for example a rebase, where the prior analysis is reused).
`conclusion: failure` gates on the **verdict**, not on availability. If the agent errors, times out, hits a usage limit, or otherwise cannot reach a verdict, the check concludes `neutral` and GitHub allows the merge: it is **not** a fail-closed gate. If you need a PR to stay blocked whenever Macroscope cannot decide, use GitHub's [required reviewers](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/available-rules-for-rulesets#require-a-pull-request-before-merging) instead.
**Clearing a `failure`.** How you clear it depends on which of the two outcomes failed the check.
* **Outstanding correctness findings: resolve them.** Resolving the final blocking thread clears the correctness gate automatically. If nothing else blocks approval, Macroscope updates the Approvability check and comment and, when automatic approval is enabled, approves the PR. Reopening a blocking thread withdraws that approval.
* **A Not approved verdict: re-trigger the check.** Resolving comments says nothing about that verdict, so the conclusion stands until approvability re-evaluates the PR: a new commit, a re-run from the Checks tab, or an `@macroscope` mention.
One thing that looks like it should clear a `failure` does not: **a PR review approval alone does not clear a failing required status check.** GitHub treats approvals and status checks as independent gates, so a human approval leaves the check exactly where it was.
The legacy path `macroscope_approvability.md` at the repo root is still supported for backward compatibility, but `.macroscope/approvability.md` is the recommended location. Front matter is only supported in the `.macroscope/approvability.md` path: the legacy path treats the entire file as plain text rules.
## Protecting review configuration
Macroscope reads `.macroscope/approvability.md` from the pull request's most recent commit, so an edit takes effect in the PR that makes it. A PR that changes the rules Macroscope approves by should not then be approved using the rules it just changed. Two things prevent that.
### Your approvability file is always held for a human
Any PR that adds, edits, renames, or deletes `.macroscope/approvability.md` (or the legacy `macroscope_approvability.md`) automatically gets the verdict **Skipped**, and the eligibility agent never runs. Macroscope decides this before the approvability agent starts, so nothing written in the file, including custom rules, front matter, or instructions to approve config changes, can change the outcome.
This is always on. There is no setting that turns it off, and that is deliberate: it is what makes your own `neverApprove` list trustworthy.
What the hold protects is the **eligibility rules**: the instructions the agent reads to decide whether a PR is approvable. Those live only in the file, so editing them always goes through code review. [Check Run Conclusion](#check-run-conclusion) is not one of them: it changes how a verdict is *reported*, never how it is *reached*, and it can only ever make the check stricter than the `neutral` default. That is why it is safe to expose as a setting, and why the rules themselves are not.
### `neverApprove`: additional protected paths
Use `neverApprove` to extend that protection to any other path you want a human to look at:
```markdown theme={null}
---
neverApprove:
- .macroscope/ignore.md
- .macroscope/check-run-agents/**
- .github/workflows/**
- CODEOWNERS
---
Approve routine dependency bumps and documentation changes.
```
Any PR that changes a file matching one of these patterns gets the verdict **Skipped**, without the agent running.
Patterns use the same glob syntax as Check Run Agent `include`/`exclude`: a pattern with no `/` matches at any depth (`CODEOWNERS` matches `CODEOWNERS` and `docs/CODEOWNERS`), and `**` matches across directories. Matching is case-sensitive. A pattern Macroscope cannot parse is skipped, with a warning in the check run details: check there after editing the list, since a skipped pattern protects nothing.
Renames and deletions count as changes to both the old and the new path, so moving a protected file out of the way still holds the PR.
`neverApprove` can only **add** paths. It cannot remove or narrow the protection on your approvability file, and no setting can. It takes priority over [`alwaysApprove`](#alwaysapprove--skipping-the-agent-for-routine-paths), so a path in both lists is held. This is also why the list is safe to trust: a PR cannot quietly delete an entry from it without editing `.macroscope/approvability.md`, which is itself always held for a human.
### What these holds do and don't do
A hold from either rule means the PR is not auto-approved and is marked **Skipped**. It does not block merging on its own. These checks conclude `neutral` even when you set `conclusion: failure` in front matter or through the [Check Run Conclusion](#check-run-conclusion) setting. A PR that updates your Macroscope configuration therefore cannot be made unmergeable by the check itself. Merge protection stays with your GitHub [required reviewers](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/available-rules-for-rulesets#require-a-pull-request-before-merging), where a human reviews and merges the change.
For the full list of what concludes `failure` versus `neutral`, see [Using approvability as a required status check](#using-approvability-as-a-required-status-check).
## `alwaysApprove`: skipping the agent for routine paths
Some changes do not need a judgment call. Lockfile bumps, vendored dependencies, generated code, a translations directory: if a PR touches nothing else, there is nothing for the eligibility agent to weigh.
`alwaysApprove` names those paths. When **every** file a PR changes matches one of the patterns, Macroscope finds the PR approvable without running the agent, and the run is [free](#pricing):
```markdown theme={null}
---
alwaysApprove:
- "**/*.lock"
- vendor/**
- "**/*.pb.go"
---
Approve routine dependency bumps and documentation changes.
```
### All, not any
This is the opposite of how `neverApprove` matches, and the difference is the point.
`neverApprove` fires when **any** changed file matches: one protected file is enough to hold the whole PR. `alwaysApprove` fires only when **every** changed file matches. A PR that updates `vendor/` *and* changes your scheduler is not a vendor PR, so it goes to the agent exactly as it would have.
That also means a partial match costs you nothing and changes nothing. If you are unsure whether a pattern is too broad, the worst case is that PRs you expected to skip the agent do not.
Renames count as changes to both the old and the new path, so moving a file *out* of a covered directory is not covered: the destination is a path you did not list.
### What it skips, and what it does not
`alwaysApprove` skips the eligibility agent. It does not skip anything else that has to be true before Macroscope approves a PR:
| Still applies | Effect |
| - | - |
| Correctness findings at or above your [Minimum Blocking Severity](#minimum-blocking-severity) | The PR is not approved. The verdict is **Would Approve**. |
| Approvability not enabled for the repo | The PR is not approved. The verdict is **Would Approve**. |
| The PR was authored by Macroscope | The PR is not approved. The verdict is **Skipped**. |
| Every [wait](#waiting-for-other-checks): Correctness, Check Run Agents, external review tools, `waitsFor` | Approvability still waits for all of them before deciding. |
One hold does *not* apply. A diff **too large to analyze** does not stop a fully covered PR: that hold exists because the agent cannot read the change, and on these paths there is nothing for it to read. A large vendored dependency bump is exactly the shape that is both too big to analyze and entirely covered.
The review still runs. What you are switching off is the judgment about whether the change is worth a human's attention, not the analysis of whether it is correct.
### Precedence
Three rules are evaluated before `alwaysApprove`, and none of them can be overridden by it:
1. **Your approvability file.** A PR that adds, edits, renames, or deletes `.macroscope/approvability.md` is held for a human: including the PR that adds `alwaysApprove` itself. See [Protecting review configuration](#protecting-review-configuration).
2. **[`neverApprove`](#neverapprove-additional-protected-paths).** If a path appears in both lists, or a PR matches both, `neverApprove` wins and the PR is held.
3. **`CODEOWNERS` changed by a non-owner.** Held, unchanged.
Even `alwaysApprove: ["**"]`, meaning "approve everything," cannot approve a PR that rewrites your approval rules, strips a protection you added, or changes `CODEOWNERS`. This ordering makes the list safe to use.
Patterns use the same glob syntax as `neverApprove` and Check Run Agent `include`/`exclude`: a pattern with no `/` matches at any depth, `**` matches across directories, and matching is case-sensitive. A pattern Macroscope cannot parse is skipped, with a warning in the check run details: check there after editing the list, since a skipped pattern means files it would have covered go back to the agent.
## Pricing
Approvability is billed in [agent credits](/pricing#agent) at a **flat 30 credits (\$0.30) per run**. The price does not depend on the size of the PR or on what the run cost to produce: every verdict costs the same.
**You are only charged when a verdict needs the agent.** Whenever Macroscope can reach the verdict on its own, no agent runs and the run is free:
| Outcome | Charge |
| - | - |
| The Eligibility agent judged the PR | 30 credits |
| The PR changes your [approvability configuration](#protecting-review-configuration) | Free |
| The PR matches a [`neverApprove`](#protecting-review-configuration) pattern | Free |
| Every file in the PR matches an [`alwaysApprove`](#alwaysapprove--skipping-the-agent-for-routine-paths) pattern | Free |
| The PR changes `CODEOWNERS` and the author is not an owner | Free |
| The diff is too large to analyze | Free |
Most free runs show a **Skipped** verdict, but the two are not the same thing. If the agent ran and could not return a usable verdict, the result is **Skipped** and the run is still charged: what you pay for is the agent being asked, not the verdict it managed to produce.
Every approvability check run states what it cost on its details page, including the runs that cost nothing:
```text theme={null}
**Agent Credits:** 30 credits
Approvability runs at a flat rate of 30 credits whenever the agent is asked for a verdict.
```
Approvability draws on the same balance and the same **1000 free credits per month** as every other agent feature, and is subject to your workspace's [monthly spend limit and per-PR cost limit](/pricing#how-billing-works). When either limit is reached the check run is marked **Skipped** with the reason, and nothing is charged.
The \$0.30 figure is the price at the standard rate of \$0.01 per credit. Workspaces on a negotiated credit rate pay 30 credits at their own rate.
## Setup
1. Enable Approvability in **Settings โ Repos**.
2. (Recommended) Add a [`CODEOWNERS` file](https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners) to your repo.
3. (Optional) Add a `.macroscope/approvability.md` file with custom eligibility rules and front matter configuration.
Macroscope cannot approve its own PRs.
# Areas
Source: https://docs.macroscope.com/areas
Group code activity into high-level categories that match how your team thinks about work
Areas let you categorize development activity into groups that align with your roadmap, like organizational units, product divisions, or cross-functional teams.
Once defined, Macroscope automatically:
* **Classifies all commit activity** into the appropriate Area using codebase context, linked tickets, and IdP metadata
* **Generates executive summaries** for each Area, updated multiple times per day
* **Enables Area-specific questions** via the agent
* **Sends Area-specific weekly email digests**
If your team is fewer than 20 developers, you probably don't need Areas. Macroscope treats your whole organization as a single Area by default and still generates executive summaries.
## Executive Summaries
Macroscope generates executive summaries for each Area, displayed on the Home page and sent via [weekly email digests](/productivity#email-reports).
## Example Areas
* By org or business unit (e.g. Consumer Team, Revenue Team)
* By product strategy group (e.g. Code Review, Platform)
## Writing Effective Descriptions
Macroscope uses your Area descriptions to classify commits, so detail matters. Include:
* Types of work that belong in this Area
* Specific terminology your team uses
* Team names associated with this Area
* Related systems, services, or products
Edit descriptions anytime on the Areas page.
### Example
**Area Name:** Consumer Growth
```markdown theme={null}
**Overview:** The Consumer Growth team drives user acquisition and activation.
**Work in this Area:**
- User onboarding flows and tutorials
- Sign-up and authentication experiences
- Marketing landing pages and conversion funnels
- A/B testing frameworks for growth experiments
- Referral and invite systems
**Teams:** Growth Engineering, Consumer Acquisition, Onboarding Experience
**Related Systems:** Consumer web app, mobile sign-up, marketing website, email service, experimentation platform, analytics infrastructure
```
# Backfilling
Source: https://docs.macroscope.com/backfilling
How Macroscope processes historical data from your repos
When you sign up, Macroscope automatically backfills recent commits from your GitHub repos. This typically takes about 60 minutes depending on the size and history of your repos. Once complete, your Home page will show summaries of your team's recent activity.
Need a longer backfill window? We can accommodate extended historical backfills for an added per-commit fee. Contact us at [support@macroscope.com](mailto:support@macroscope.com) with the timeframe you have in mind.
# Code Review
Source: https://docs.macroscope.com/bug-detection-and-fixes
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
* Set how Correctness runs on a repo under [**Settings โ Repos โ Features**](/settings#features): **Always run**, **Manual invocation only**, or **Never run**.
* Change the default for newly linked repos in **Settings โ Repos โ Defaults**. New workspaces start with that default **off**; onboarding turns it on for the repos you pick there.
* Set **always-review labels** to force a review even when automatic review is off, **skip labels** to prevent review even when automatic review is on, **mode labels** to run a review in a specific Detection Mode. Learn more about [Magic PR Labels](https://docs.macroscope.com/bug-detection-and-fixes#magic-pr-labels).
Go to **Settings โ Repos** in the Macroscope web app to edit code review settings per-repo or in batch.
## Detection Mode
Detection Mode tunes how Macroscope correctness review balances **recall**, **precision**, and **latency**. Detection Modes can be set per developer or per repo, or overridden for a single PR or single review run.
| Mode | What it does |
| - | - |
| **Budget** | Fast, low cost bug detection. Lower bug detection and precision compared to more premium modes. |
| **Balanced** (default) | Industry leading high bug detection. Recommended for teams who use Agents to review PR comments, where the inconvenience of occasional false positives is minimal. |
| **Precise** | Similar bug detection as Balanced mode, but higher confidence findings due to additional agentic validation to reduce noise from false positives and low-value findings. Recommended for teams who prefer to spend more budget (dollars and latency) to ensure high precision findings. |
| **Ultra** | Frontier bug detection for the most consequential reviews. Leverages a much higher number of parallel agents using more advanced coding models. Useful when maximizing bug detection matters more than cost. |
Each Detection Mode is billed at its own per-KB rate per review, based on the byte size of the diff that Macroscope reviews. See [Pricing](/pricing) for the rate of each mode.
We regularly assess the performance of these modes using an internal benchmark to give you the best understanding of the tradeoffs.
### Adjusting Detection Modes
There are a few ways to configure which Detection Mode is used during a review:
* **At the repository level:** Configure the Detection Mode in **Settings โ Repos โ Detection Mode**. This applies to every PR in the repository. The default mode is **Balanced**.
* **At the developer level:** Configure your personal Detection Mode in **Settings โ Personal โ Code Review โ Detection Mode**. This setting allows a developer to override the Detection Mode configured on the repository for all of authored PRs.
* **For a single review:** Comment `@macroscope-app review using mode` on the PR. This applies only to that review and bypasses per-review and per-PR spend caps.
* **For a single PR:** Add one of Macroscope's Magic PR labels (`macroscope-`) to the PR. For example, use `macroscope-ultra`, `macroscope-balanced`, `macroscope-precise`, or `macroscope-budget`. Every review of that PR will use the selected mode until the label is removed.
## PR Labels
**Always-review**
Force a review even when automatic review is off. Configurable in Settings โ Repos.
**Skip labels**
Prevents review even when automatic review is on. Skip labels take precedence over always-review labels. Configurable in Settings โ Repos.
**Detection Mode labels**
Runs a review in a specified mode.
* Available modes: `macroscope-budget`, `macroscope-balanced`, `macroscope-precise`, `macroscope-ultra`
* Every later review of that pull request runs in the same mode until the label is removed.
* A mode label acts as an **always-review label**. It runs a review even on a pull request that a skip label would otherwise exclude, and it triggers the Check Run Agents and Approvability check alongside the correctness review. Skip authors are the one filter it never overrides.
* Removing a label does not trigger a review; the next review returns to the configured mode.
* If a PR carries two labels naming different modes, no reviews will run.
## Minimum Severity to Comment
**Minimum Severity to Comment** sets how severe a correctness finding must be before Macroscope comments on it. Findings at or above it are posted; findings below it are withheld, as are findings with no recorded severity. Choose **Low**, **Medium**, **High**, **Critical**, or **Off**: the default is **Off**, which posts everything. See [Issue Severity Levels](#issue-severity-levels) for what each level means.
Set it in **Settings โ Repos**, per repo or across several at once, and under **Defaults** for newly added repos. Changing the default does not move repos that already exist. Developers can set a personal floor in **Settings โ Personal**, which overrides the repo for PRs they author; **Repo Default** defers to the repo. The PR author's setting is the one that applies, not that of whoever pushed last. [CLI](/cli) reviews honor both tiers.
Three things it does not do:
* **Change what the review looks for.** That is [Detection Mode](#detection-mode); this only decides which findings become comments.
* **Apply beyond correctness.** [Check Run Agents](/check-run-agents) and summaries are unaffected.
* **Hide the withheld findings.** They are listed on the correctness check run, under the dropdown **Filtered Issues Details** with a tag \[**Below severity threshold**], and [Approvability](/approvability) still weighs them as risk signals.
It is separate from Approvability's [Minimum Blocking Severity](/approvability#minimum-blocking-severity), which decides which comments block auto-approval rather than which get posted.
## Manually Triggering a Review
Comment **"@macroscope-app review"** on any PR in GitHub to trigger a review, even when the repo is set to [**Manual invocation only**](/settings#features) and nothing would have started one on its own. Unless a Detection Mode is explicitly mentioned (or the author has a personal override configured), the review will use the repository's configured [Detection Mode](#detection-mode).
A repo set to [**Never run**](/settings#features) does not review on request either. The mention is ignored, no check run appears, and no personal setting or label changes that. If you expected a review and got nothing, check the repo's **Correctness** mode first.
A manual review is an explicit request, so it bypasses the limits that gate automatic reviews:
* [**Max Automatic Runs per PR**](/settings#pull-request-settings): a PR that has already hit its run cap is still reviewed.
* [**Per-review and per-PR spend caps**](/pricing#spend-controls): the \$10-per-review and \$50-per-PR caps are not applied, regardless of the values your workspace has set.
Two limits are never bypassed: your workspace's [**monthly spend limit**](/pricing#spend-controls), which is an absolute ceiling whatever the trigger, and [**Max Reviewable File Size**](/settings#pull-request-settings), so oversized files stay excluded.
## 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.md`
You can tell Macroscope to skip specific files during code review by adding a `.macroscope/ignore.md` 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.md` in your repository.
2. Add one file path pattern per line.
3. Commit and push. Macroscope picks it up automatically on the next review.
On pull request reviews, the file is read from the PR's most recent commit, so pushing it to a PR takes effect on that PR right away; other open PRs pick it up once they include the change. Pull requests from external forks always read it from your default branch, and [Macroscope CLI](/cli#excluding-files-from-review) reviews read it from the most recent commit on the branch you're reviewing.
Macroscope looks for three paths, in this order, and the first one that exists wins: even if it is empty: `.macroscope/ignore.md`, then the extensionless `.macroscope/ignore`, then the legacy `.macroscope-ignore` at the repo root. The older two are supported for backward compatibility, but `.macroscope/ignore.md` is the recommended location, since it consolidates all Macroscope configuration into the `.macroscope/` directory.
### Example
```text theme={null}
# 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.md` file exists in your repo.
Creating your own `.macroscope/ignore.md` **replaces** these defaults rather than extending them. To preserve the defaults, copy the patterns below into your `.macroscope/ignore.md` file and add your own on top.
```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/**
**/.nuxt/**
**/.output/**
**/.vercel/**
**/.angular/**
**/vendor/**
**/_vendor/**
**/third_party/**
**/Pods/**
**/.bundle/**
# === Root-anchored ambiguous directories ===
build/**
out/**
env/**
ENV/**
# === Generated / build-output directories (match anywhere) ===
**/target/**
**/dist/**
**/generated/**
**/intermediates/**
**/generated_sources/**
**/generated-sources/**
**/generated-src/**
**/src/main/generated/**
# === Minified build output ===
**/*.min.js
**/*.min.css
**/*.bundle.js
# === Yarn PnP loader files ===
**/.pnp.cjs
**/.pnp.loader.mjs
# === 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
**/*.d.ts
**/*.gen.ts
**/*.gen.tsx
**/*.gen.js
**/*.gen.jsx
# === 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
```
```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/**
```
### Reviewing Your Test Code
By default, Macroscope ignores files it identifies as test files. Identification is by **file path**: Macroscope matches each language's test-file naming and directory conventions: a Go `_test.go` suffix, a test-like directory, and the equivalent for each other supported language. It does not read a file's contents to decide. To opt out of test detection, add a YAML front-matter block at the very top of your `.macroscope/ignore.md`:
```markdown theme={null}
---
ignoreTests: false
---
# Everything below the front matter is unchanged: one pattern per line
vendor/**
*.lock
```
* `ignoreTests` states whether to **ignore** tests: the same direction as every other line in the file. `true` means ignore them, so they are **not** reviewed. `false` means don't ignore them, so they **are** reviewed like any other code.
* Omitting the key, or having no front matter at all, means tests are not reviewed.
* Because identification is by path and not by content, this toggle moves whole **files** in and out of review. A test function that lives in a file whose path does not look like a test is unaffected by it: that function is already reviewed as ordinary code.
* The block is treated as front matter only if it sets a recognized key. A `---` block used as a horizontal rule, or one with only unrecognized keys, is read as an ignore pattern. If a block looks like it was meant as front matter but isn't usable, the check run conclusion says so and the review continues.
### 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.
* **Some file types are always excluded.** Genuinely unreviewable, non-text files such as images, fonts, archives, and compiled binaries are skipped whether or not you have an ignore file. An `include` pattern never brings them back. The patterns above are the *overridable* defaults; this always-on exclusion sits underneath them, so replacing the defaults with your own file cannot pull a binary into review or into what you're billed for.
`.macroscope/ignore.md` affects code review on GitHub and in the [Macroscope CLI](/cli#excluding-files-from-review), as well as [Check Run Agents](/check-run-agents#macroscope-ignore). It does not affect commit summaries, status, or the Slack agent.
## How Does Code Review Work?
Macroscope reviews every file in a PR. For ten natively supported languages, dedicated AST codewalkers build a reference graph for lower-latency reviews. All other languages, including Elixir, Starlark, C/C++, PHP, and more, are fully reviewed through Macroscope's agentic analysis engine.
### Native AST Codewalkers
For natively-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). Pre-building the reference graph makes these reviews lower-latency.
**Languages with native AST codewalkers**: Go, Python, TypeScript, JavaScript, Vue.js (including Nuxt), Java, Rust, Kotlin, Swift, Ruby.
### Agentic Analysis
All other languages, including Elixir, Starlark, C/C++, PHP, and more, are fully reviewed through Macroscope's agentic analysis engine with full cross-file codebase context. Review latency is slightly higher than for languages with native AST codewalkers, which build the reference graph in advance.
### Universal File Support
Config files, documentation, scripts, and other non-code files are also reviewed. Every file in a PR gets examined.
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).
# Cancel Subscription
Source: https://docs.macroscope.com/cancel-subscription
Learn how to cancel your Macroscope subscription
We're sorry you're thinking about cancelling Macroscope.
Feel free to write to us at [support@macroscope.com](mailto:support@macroscope.com) if you have feedback to share or [book 15 minutes to tell us about your experience.](https://cal.com/team/macroscope/feedback)
## Self-Service
1. Log in to your Macroscope account
2. Navigate to the **Billing** section
3. Click the **"Manage Plan"** button
4. You'll be redirected to our secure billing portal
5. Click on "Cancel Subscription"
Your access will continue until the end of your current billing period.
## Contact Support
Email **[support@macroscope.com](mailto:support@macroscope.com)** to request cancellation.
Uninstalling the Macroscope GitHub app will also automatically cancel your subscription at the end of the trial or billing period.
# Release Notes
Source: https://docs.macroscope.com/changelog
**New Default Repo Settings Available**
Skip PRs by Author, Skip PRs by Labels, Skip PRs by Target Branches, and Always Review PR Labels are now available under [**Settings โ Repos โ Defaults**](https://app.macroscope.com/settings#Repos). Values set here apply to every newly linked repository by default; existing repos keep their current settings and can override defaults individually.
**New Models in Check Run Agents**
Check Run Agents now support `claude-sonnet-5-5` and `gpt-6-1-sol`. [Learn more about Check Run Agent models and pricing](/model-pricing#available-models).
**GPT-6.1 Sol Joins MacroscopeBench**
[MacroscopeBench](https://macroscope.com/benchmark) now publishes GPT-6.1 Sol at all five of its reasoning levels, bringing the benchmark to twelve model families and 41 scored configurations.
**MacroscopeBench Is Now Public**
[MacroscopeBench](https://macroscope.com/benchmark), the benchmark we've used internally for the past year to tune our code review, is now public: 12,000+ validated bugs from 1,500+ open source repos across 14 languages, each replayed at the introducing commit and scored on recall, precision, signal-to-noise, cost, and latency. It's now the code review benchmark on [Fireworks AI's Specialized Intelligence Index](https://fireworks.ai/specialized-intelligence-index/#benchmark/code-review%2Fmacroscope-code-review-benchmark).
[Read the blog post](https://macroscope.com/blog/macroscopebench).
**New Models in Check Run Agents**
Check Run Agents now support `claude-opus-5-5` (1M-token context; effort `low`, `medium`, `high`), `gpt-6-sol`, `gpt-6-luna`, and `deepseek-v4-1-flash`. [Learn more about Check Run Agent models and pricing](/model-pricing#reasoning-and-effort).
**Four Fireworks-Retired Models Removed from Check Run Agents**
`deepseek-v4-flash`, `deepseek-v4-pro`, `glm-5-2`, and `kimi-k2-7-code` are no longer available in Check Run Agents. A check that still names one of them is skipped ("model not available") until you update it. [Learn more about Check Run Agent models and pricing](/model-pricing).
**More Reasoning Levels for Sol, Terra, and Luna Check Run Agents**
Check Run Agents now support `xhigh` and `max` reasoning for `gpt-5-6-sol`, `gpt-5-6-terra`, and `gpt-5-6-luna`. [Learn more about Check Run Agent models and pricing](/model-pricing#reasoning-and-effort).
**Turn a Review Feature Completely Off with Feature Switches**
A new **Feature Switches** section at the top of **Settings โ Repos** lets you switch Correctness, Approvability, and Check Run Agents off outright. A feature switched off does not run at all: no `@macroscope` mention, always-review label, or personal setting can start it. Set it for one repo, under **Defaults** for newly linked repos, or across several repos at once.
**New** `incremental `**Input Mode for Check Run Agents**
Check Run Agents have a new `incremental` input mode, and it is now the default. In this mode, when you push additional commits to a PR, the agent reviews only the files changed in that push, instead of every file changed by the PR (the same way correctness review works).
**GPT-6 Astra Support in Check Run Agents**
Check Run Agents now support `gpt-6-astra`, a flagship model with a large context window and reasoning at `low`, `medium`, `high`, `xhigh`, and `max`: it is the only model that accepts `max`. [Learn more about Check Run Agent models and pricing](/model-pricing).
**Run Correctness Review After Your CI, or Only When It's Green**
Correctness review can now wait for your CI steps before it starts, and skip entirely unless they passed. Set `waitsFor`, `requires`, `waitsForTimeout`, and `waitsForDiscoveryTimeout` in `.macroscope/correctness/correctness.md`: the governing file for the whole correctness check, alongside your other instruction files, which keep their own `include`/`exclude` patterns. [**Learn more**](https://docs.macroscope.com/custom-instructions#prerequisites).
**Check Run Agents Now Know What Has Already Been Said on Your Pull Request**
A [**Check Run Agent**](https://docs.macroscope.com/check-run-agents#what-an-agent-remembers) now starts every run already holding the pull request's discussion. You do not have to write instructions telling it to go and read the comments, and it spends no tool calls or tokens fetching them. [**Learn more**](https://docs.macroscope.com/check-run-agents#what-an-agent-remembers).
**Expanding Detection Mode: More Control Over Every Review**
We've expanded Macroscope [Detection Mode](/bug-detection-and-fixes#detection-mode), giving you more control over how each code review balances recall, precision, latency, and cost. Now, you can select the ideal performance profile for each review:
* **Ultra** (\$0.20/KB): Frontier bug detection for the most consequential reviews.
* **Balanced** (\$0.05/KB, default): Industry leading high bug detection.
* **Precise** (\$0.06/KB): Balanced-level detection with higher-confidence findings, using extra agentic validation to reduce false positives and low-value noise.
* **Budget** (\$0.025/KB): Fast, low cost bug detection.
You can set Detection Mode per author, repository, PR, or review. Every mode keeps the 10KB per-review minimum. [Check out the docs](/bug-detection-and-fixes#detection-mode) and [read the blog announcement](https://macroscope.com/blog/expanding-detection-mode).
**Skip the Approvability Agent for Routine Paths with `alwaysApprove`**
Approvability has a new `alwaysApprove` key in the front matter of `.macroscope/approvability.md`. List glob patterns for paths such as lockfiles, vendored dependencies, and generated code. A PR whose files **all** match is approved on eligibility without running the agent, so the run is free. It is all-or-nothing: one file outside the list and the PR goes to the agent as usual. It skips the agent, not the rest of approval. Correctness findings, the repo's approval setting, and every prerequisite wait still apply. It never overrides `neverApprove` or the always-on protection on your approvability file. [Learn more](/approvability#alwaysapprove--skipping-the-agent-for-routine-paths).
**GLM-5.3 support in Check Run Agents**
Check Run Agents now support `glm-5-3`, a large-context model with configurable reasoning levels. [Learn more about Check Run Agent models and pricing](/model-pricing).
**Give a Late-Publishing Check Longer to Appear with `waitsForDiscoveryTimeout`**
[Check Run Agents](/check-run-agents) and [Approvability](/approvability) now support `waitsForDiscoveryTimeout`, which gives conditionally published prerequisites, such as checks behind earlier jobs or queued workflows, longer to appear before they are treated as absent. It supports 1-60 minutes; named prerequisites stop waiting once found, while `waitsFor: ["*"]` waits the full floor on every run and shows a warning.
**Skip PRs by Author Now Covers Every Trigger**
Accounts listed under **Settings โ Repos โ Pull Requests โ Skip PRs by Author** now have their PRs skipped across [correctness review](/bug-detection-and-fixes), [Check Run Agents](/check-run-agents), and [Approvability](/approvability).
**Config Changes Now Take Effect in Your PR, No Merge Required**
Files in `.macroscope/` are now read from the most recent commit on the pull request rather than from your default branch, so a config change takes effect in the PR that makes it. This covers [Check Run Agents](/check-run-agents) (`.macroscope/check-run-agents/`), [ignore rules](/bug-detection-and-fixes#macroscope-ignore) (`.macroscope/ignore.md`), and [correctness review custom instructions](/custom-instructions) (`.macroscope/correctness/`), along with any file they import with `@path`.
**DeepSeek V4 Pro Support in Check Run Agents**
Check Run Agents now support `deepseek-v4-pro` (DeepSeek V4 Pro), a large-context model with binary reasoning. [Learn more about Check Run Agent models and pricing](/model-pricing).
**Gate a Check Run Agent on Its Prerequisites with `requires`**
Check Run Agents have a new `requires` key option in front matter. [`waitsFor`](/check-run-agents#prerequisite-steps) only controls ordering, and any conclusion satisfies it. `requires` also gates on the outcome: the agent waits the same way, then runs only if every prerequisite passed. [Learn more](/check-run-agents#requires).
**New Correctness Review Setting: Minimum Severity to Comment**
A new control in **Settings โ Repos** sets how severe a correctness finding must be before Macroscope comments on it: **Low**, **Medium**, **High**, **Critical**, or **Off**. The default is **Off**, which posts everything. Available per repo, across several at once, under **Defaults**, and as a personal floor in **Settings โ Personal**.
**New Models in Check Run Agents**
Check Run Agents now support: `grok-4-6` (xAI Grok 4.6) and `qwen-3-8-max` (Qwen3.8-Max), both with reasoning effort up to `xhigh`. [Learn more about Check Run Agent models and pricing](/model-pricing).
**Ignore Files in Macroscope CLI Reviews**
Macroscope CLI reviews now honor your repository's [`.macroscope/ignore.md`](/bug-detection-and-fixes#macroscope-ignore) file. Ignored files are skipped from review, and Macroscope's built-in defaults (vendored dependencies, generated code, binaries, and test files) apply when a repo has no ignore file. [Learn more](/cli#excluding-files-from-review).
**Protect Paths from Auto-Approval with `neverApprove`**
Approvability has a new `neverApprove` key in the front matter of `.macroscope/approvability.md`. List glob patterns there and any PR touching a matching path will never get approval from approvability check. [Learn more](/approvability#neverapprove-additional-protected-paths).
**Daily Chart View for Agent Credit Usage**
The Agent Usage Detail section in the [Billing Dashboard](https://app.macroscope.com/settings/billing) has a new **Daily chart** view alongside the pie chart. It plots agent credit usage per day, grouped by type, repo, or Check Run Agent, and you can select any slice to see that series on its own with its run count, totals, and per-run cost range.
**New Correctness Review Settings: Limit by Run Count and File Size**
Two new per-repo controls in **Settings โ Repos** let you bound how many correctness review invocations a single PR can trigger and how large a file Macroscope will review:
* **Max Automatic Reviews** caps how many times correctness review runs automatically on one PR: once the cap is reached the check concludes as `skipped`, titled "Maximum runs reached", with a summary referencing your limit. Manually triggered reviews, check re-runs, and moving a PR from draft to ready are exempt.
* **Max File Size** skips files larger than the configured KB limit when reviewing for correctness; useful for repos with large generated or vendored files. Larger files are listed on the check run with the reason "File too large (exceeds configured limit)." Glob-based excludes in `.macroscope/ignore.md` still work; this adds a size-based option.
**Including Test Files in Correctness Review**
Macroscope correctness review ignores test files by default. You can now opt out, per repo, by adding an `ignoreTests: false` front-matter block to the top of your `.macroscope/ignore.md`, and Macroscope will review the repo's test files as it would any other code.
**Spend Limits for Check Run Agents**
You can set `maxBudgetPerRun` in a Check Run Agent's front matter to cap what a single run of that agent may spend (in US dollars). The agent checks its accumulated cost after each turn and stops once it reaches the cap, concluding the check as `neutral` with a "Budget reached" message.
**Referencing Other Files in Check Run Agent Instructions**
Check Run Agent instructions can now embed other files from your repository with `@path/to/file.md`, so you can pull existing docs and context into an agent's instructions.
**New Models in Check Run Agents**
Check Run Agents now support Kimi K3. K3 delivers performance rivaling top frontier closed models, at a fraction of the price of Fable 5 or GPT-5.6 Sol. Check Run Agents also now support Claude Opus 5. [Learn more about Check Run Agent models and pricing](/model-pricing).
**Lower Check Run Agent Model Pricing for GPT-5.6 Terra and Luna**
We've reduced Check Run Agent pricing for two GPT-5.6 models: `gpt-5-6-luna` is now \$0.20 per 1M input tokens and \$1.20 per 1M output tokens, and `gpt-5-6-terra` is now \$2.00 and \$12.00. [See the full pricing table](/model-pricing#pricing).
**Screen Recordings in Slack Commit Summaries**
Screen recordings attached to a PR in its description or a comment now appear in that commit's Slack summary thread, alongside the images Macroscope already posts. Your team can review visual PR context without leaving Slack.
**Faster, More Accurate Code Review**
We've shipped a major update to Code Review that makes reviews faster and better at finding bugs: up to 20% lower latency on average and up to 20% better recall, depending on your [Detection Mode](/bug-detection-and-fixes#detection-mode) setting.
**Bug Grouping in Review Comments**
We've improved how findings are surfaced in PR comments:
* Critical and High severity bugs are now separated from related lower-severity findings.
* Related findings are grouped more accurately.
**Macroscope CLI Interactive Code Review**
The [Macroscope CLI](/cli) now has a full-screen interactive review experience. Run `macroscope` with no arguments for a guided setup wizard. You can also run Macroscope from inside Claude Code, Codex, Cursor, and OpenCode using the agent plugin installed alongside the CLI.
[Read more on the blog](https://macroscope.com/blog/introducing-macroscope-cli).
**Code Review Improvements**
We've made several improvements to our code review pipeline, particularly for Go, Rust, and Python.
**Run Limits for Check Run Agents**
You can now set `maxRuns` in a Check Run Agent's front matter to cap how many times it runs on a single pull request. Once the cap is reached, later pushes conclude the check as skipped with a "Maximum runs reached" message instead of running the agent: commenting `@macroscope review` still runs it past the cap. [Learn more](/check-run-agents#run-limits).
**Adjust Billing Chart Date Range**
You can now drag across the usage chart in [Billing](https://app.macroscope.com/settings/billing) to select a date range within the billing period. The usage tables and totals update to reflect just the selected range.
**Code Review Improvements for Swift and Rust**
We've made improvements to our code review pipeline for Swift and Rust, helping Macroscope catch more idiomatic issues in those languages.
**Open-Source Models in Check Run Agents**
Check Run Agents now support `kimi-k2-7-code`, `glm-5-2`, `minimax-m3`, and `qwen-3-7-plus`. [Learn more about Check Run Agent models and pricing](/model-pricing).
**GPT-5.6 Models in Check Run Agents**
Check Run Agents now support GPT-5.6 Sol, Terra, and Luna.
**Run Filters for Check Run Agents**
You can now configure Check Run Agents to run only on specific PRs via `runFilters` in the front matter. Use the `labels`, `authors`, and `targets` fields to scope CRA to PRs that carry a specific label, come from a specific author, or target a specific branch.
**PR Metadata Input Mode for Check Run Agents**
Check Run Agents now support `input: pr_metadata`, a new mode for reviewing a PR's title, author, description, labels, and commit messages instead of the code diff. This is useful for checks that enforce PR conventions, ticket requirements, or metadata standards.
**Required Status Checks for Check Run Agents**
You can now set `requiredStatusCheck: true` on a Check Run Agent so it always reports a conclusion, even when its `include`, `exclude`, or applicability filters skip a PR. Skipped runs report as `skipped`, which GitHub branch protection treats as passing, so the agent can be used as a required status check without blocking unrelated PRs.
**Improved Cache Hits for Check Run Agents**
We've improved cache hit rates for Check Run Agents to help you save on costs. Unchanged runs are now more likely to return cached results (e.g. after a rebase) so you don't pay to recompute the same review.
**Check Run Agent Filters Override Soft Exclusions**
Check Run Agent `include` and `exclude` patterns now override Macroscope's default soft exclusion patterns, so your CRA runs on exactly the files you've configured. The same override applies to [custom correctness instruction](/custom-instructions) `include` and `exclude` patterns.
**Check Run Agent Usage Breakdown Table**
Settings โ Billing now has a Check Run Agents section that breaks down your workspace's spend and usage over a billing period. The top row summarizes active agents, total runs, total credits consumed, and total cost. Below it, a table breaks that down per agent: repo, total runs, credits consumed, cost, per-run avg/min/max cost, and the last PR each agent ran on.
**New Models in Check Run Agents**
Check Run Agents now support two additional models: `fable-5` and `claude-sonnet-5`. [Learn more](/model-pricing).
**New Code Review Pipeline**
We've released a new version of Code Review that finds substantially more bugs. In our benchmarks it surfaces:
* 71% more critical issues
* 27% more high-severity issues
* 50% more medium-severity issues
* 31% more valid issues overall
This is now the default pipeline ("Prefer Coverage"). If you prefer the previous behavior, you can switch to "Prefer Precision" using the new Detection Mode setting below.
**Detection Mode**
Detection Mode is a new setting that controls how Macroscope balances finding more bugs against minimizing noise:
* **Prefer Coverage** (default): maximizes detection, with higher comment volume and more false positives. Built for teams using coding agents to validate PR comments.
* **Prefer Precision**: prioritizes high-confidence findings: fewer bugs caught, but fewer false positives. Mirrors the experience of the past few months.
You can set Detection Mode from **Settings** at the [repository level](https://app.macroscope.com/settings#Repos) or at the [individual developer level](https://app.macroscope.com/settings#Personal).
**Templates for Check Run Agents**
Teams can create [Check Run Agents](/check-run-agents) from pre-built templates. Browse templates on the [Code Review page](https://app.macroscope.com/code-review) and select a template to customize it or use as-is. Templates cover common review patterns including ticket requirements, language idioms, architecture standards, and security review.
**Organize Check Run Agents into Subfolders**
[Check Run Agents](/check-run-agents) now support nested directories inside `.macroscope/check-run-agents/`, so teams can organize their configuration files into subfolders.
**Manual Review Links to Check Runs**
When you manually trigger a review with `@macroscope review`, Macroscope now posts a link from the PR thread to the generated check run.
**Improved Python Code Understanding**
We've improved our Python codewalker to follow imports, type hints, class relationships, and nearby dependencies more accurately during review.
**Personal MCP Connections**
You can now connect your own MCP servers as personal connections from **Settings** โ **Personal**. These connections are separate from the MCP connections admins can set up for their workspace. Macroscope can use those personal connections on your behalf when answering your questions in Slack. [Learn more about MCP Connectors](/integrations#mcp-connectors).
**Skip Automatic Reviews by Author**
Workspace admins can now skip automatic Code Review for specific GitHub authors under **Settings โ Repos โ Pull Requests** โ **Skip PRs by Author**.
**Default View for the Commits Feed**
You can now save your preferred filters as the default view for your commits feed.
**Slack Agent Improvements**
We've made several improvements to how [Macroscope's agent](/agent) answers questions in Slack, including:
* **Live "Thinking..." status.** When you @ mention Macroscope, a native status indicator appears on the thread while it works, then clears when the answer posts.
* **Native tables.** Tabular answers render as tables instead of plain text.
* **Clickable links.** Links render as clickable labels instead of bare URLs.
**Landed vs. Pushed Coding Time**
Productivity stats now separate **pushed** coding time (everything authored and pushed to git) from **landed** coding time (the portion that merged to your default branch), showing how much code was written and how much shipped. Available with [Status](/productivity) enabled, with rollups at the organization, team, engineer, and agent level. [Read the blog](https://macroscope.com/blog/beyond-tokenmaxxing).
**Async Agent API Polling**
Webhook-triggered agent jobs now return a `jobToken` and `pollUrl` so integrations can trigger long-running agent jobs and poll for completion, rather than waiting for a synchronous response. [Learn more about the agent API](/api).
**Check Run Agent Tool-Call Visibility**
A Check Run Agent's GitHub check run now includes a "Tool Calls" section in the check details, showing what the agent did during its review. Available for workspaces using [Check Run Agents](/check-run-agents).
**New Code Review Pipeline**
A new code review pipeline is now available, improving overall bug detection by catching 40% more critical issues and 25% more medium severity issues. The tradeoff is slightly lower precision and higher latency, which we've found is a worthwhile tradeoff for teams heavily using coding agents in their PR review process.
Manage Detection Mode from **Settings** under workspace defaults or repository pull request review settings.
**MCP Connector Access Controls**
MCP connectors now support per-user access controls. When creating or editing an MCP connection, use the **Access** tab to define an allow list of users who can use it. [Learn more about MCP Connectors](/integrations#mcp-connectors).
**Code Review Feedback Analysis**
The Code Review activity log now includes a **Feedback Source** column and filter, so that you can see how feedback was captured:
* **Explicit** feedback covers emoji reactions (i.e. ๐ or ๐) on review comments
* **Inferred** feedback reflects sentiment Macroscope classifies from replies when a PR is closed.
**Macro Author Filtering**
Event-triggered Macros now support filtering by author, letting you include or exclude specific authors when defining trigger conditions. [Learn more about Macros](/macros).
**Check Run Agent Prerequisite Steps**
Custom Review Agents now support prerequisite CI step gating with the `waitsFor` configuration option. Specify CI checks that must complete before a review agent runs. This is useful for sequencing reviews after builds, tests, or other checks. Configure per-agent prerequisites with optional custom timeouts, or use `"*"` to wait for all other checks. See [Check Run Agents](/check-run-agents#prerequisite-steps) for details.
**Claude Opus 4.8 for Check Run Agents**
Claude Opus 4.8 (`claude-opus-4-8`) is now available as a model option for Check Run Agents. Set `model: claude-opus-4-8` in your agent's front matter to use the latest Opus generation.
**Code Review Improvements**
We've made improvements to our code review pipeline, resulting in increased recall for TypeScript, Rust, Swift, Kotlin, JavaScript, Python, Java, and Go.
**Exclude GitHub Authors from Commit Processing**
Admins can exclude specific GitHub authors from commit summarization and productivity metrics (i.e. Status features). Manage the list under **Settings** โ **Workspace โ Excluded Commit Authors**.
**Check Run Cost Visibility**
[Check Run Agents](/check-run-agents) display their billed total directly in the GitHub Checks tab, so you can see the cost of each run.
**Slack Connection Refresh**
Admins can reconnect their Slack workspace from **Settings โ Connections** to reauthorize new OAuth scopes. Use this whenever we add new bot capabilities and you want your existing connection to pick them up without uninstalling.
**Code Review Improvements**
We've made improvements to our code review pipeline, resulting in increased precision and recall for Go.
**Macroscope CLI**
You can now run Macroscope code review locally from your terminal, against your branch changes before you push. [Learn more about the CLI](/cli).
**New Models in Check Run Agents**
Check Run Agents now supports four additional models: `claude-sonnet-4-5`, `claude-sonnet-4-6`, `gpt-5-4`, and `gpt-5-5` -- alongside the existing Opus 4.5 / 4.6 / 4.7 and GPT-5.2 options. [Learn more about Check Run Agents](/model-pricing).
**Code Review Improvements**
We've made improvements to our code review pipeline, resulting in increased recall for Python and Elixir.
**Check Run Agents: now GA!**
Check Run Agents are fully customizable AI agents that execute as GitHub Check Runs on your pull requests. For each Check Run Agent, you can define exactly what the agent checks, which files it should/shouldn't review, which tools it can use, what actions it should take, and how it formats its output: all from a markdown file in your `.macroscope/` directory. [Learn more in our docs](/check-run-agents) and [check out our video about it](https://x.com/kayvz/status/2050259933409792386).
**Delegated Admins**
Workspace admins can now delegate admin permissions to other members from **Settings โ Macroscope Access โ Members**. Delegated admins can manage Macroscope settings on behalf of the workspace. GitHub roles and permissions are unaffected.
**One-Time Credit Purchase**
Admins on usage based billing can make one-time credit purchases from **Settings โ Billing**.
**Check Run Agents**
Check Run Agents are fully customizable AI agents that execute as GitHub Check Runs on every pull request. They have full access to your codebase, git history, and connected integrations. You can define exactly what an agent checks, which files it reviews, which tools it can use, what actions it can take, and how it formats its output: all from a markdown file in your `.macroscope/` directory. [Learn more in our docs](/check-run-agents).
**Code Review Improvements**
We've made improvements to our code review pipeline, resulting in increased recall for Kotlin and Swift.
**Event-Driven Macros**
Macros can now trigger on new commits and new pull requests, in addition to recurring schedules. Configure repo and branch filters to control which events run your Macro. Results can be delivered to Slack or forwarded to a webhook URL.
**New Integrations**
We've added several new integrations, including Amplitude, Sentry, and GCP Cloud Logging. You can configure your integrations in **Settings โ Connections**. [Learn more about supported integrations in our docs](/integrations).
**Image Generation**
The Macroscope Agent can now generate images on demand, including architecture diagrams, flowcharts, and visual explanations.
**Code Review Filter Persistence**
Filters in the Code Review activity log now persist in the URL. Copy the link to share a filtered view with your team.
**New Code Review Settings**
"Review Draft PRs" and "Automatically merge Macroscope's PRs" can now be configured at the workspace and repo level. Admins can set organization-wide defaults and manage settings in batch across repos; contributors can override in their account settings.
**MCP Connector Support**
Macroscope's Agent can now connect to any [MCP (Model Context Protocol)](https://modelcontextprotocol.io/) compatible server, so you can give it access to tools like Datadog, PagerDuty, or your own internal APIs. Macroscope auto-discovers available tools and supports OAuth 2.1 and header-based auth. [Learn more](/integrations#mcp-connectors).
**Webhooks**
You can now trigger Macroscope's Agent programmatically via webhooks. Send a query over HTTP and specify where to deliver the results: a Slack channel or an external URL. Note: using Webhooks requires Status to be enabled. [Learn more](/api).
**Cross-Repo PR Reviews**
Macroscope can now review pull requests where the head branch and base branch are in different repositories. Enable per repo with the new **Review Cross-Repo PRs** toggle in **Settings โ Repos**.
**Ask Macroscope Anything: GitHub API + Docs Search**
AMA can now query the GitHub REST API for live data on PRs, issues, check runs, and deployments. Ask "what checks failed on PR #42?" or "show me the latest deployment" and get real-time answers. The agent can also search [Macroscope's help docs](https://docs.macroscope.com) to answer any product questions.
**Code Review Improvements**
We've made improvements to our code review pipeline, resulting in increased recall for Rust and TypeScript.
**Next Scheduled Run for Macros**
Macros now show when they'll next run. The next run time appears in the macro header and as a tooltip on the cadence pill, so you always know when to expect your next scheduled report.
**Approvability: Now Generally Available**
Approvability has graduated from beta and is available to all workspaces. Approvability lets Macroscope automatically approve low-risk PRs from trusted authors when they pass code review with zero issues: freeing engineers from rubber-stamping routine changes. Enable it in **Settings** under the **Code Review** section. [Learn more about Approvability](/approvability).
**Slack Group DMs**
You can now create a Slack group DM that includes Macroscope alongside your teammates, so you can collaborate with Macroscope outside of a channel.
**Ask Macroscope to Add PR Reviewers**
You can ask Macroscope to assign a reviewer to any pull request directly from Slack: just tell it who to add and to which PR.
**Per-File Exclusion Reasons in Check Runs**
Check run details now surface per-file exclusion reasons, showing why specific files were skipped during review.
**Code Review Improvements**
We've made improvements to our code review pipeline, resulting in increases in precision for Elixir, Starlark, and PHP, as well as increased recall for Python, Rust, Java, JavaScript, Swift, Kotlin, and PHP.
**Biweekly Macro Cadence**
Macros now support a Biweekly schedule (i.e. every other week) in addition to Daily and Weekly.
**PR Description Formatting**
When a PR already contains user-written text, Macroscope's review summary renders as a blockquoted note rather than replacing the content.
**Code Review Improvements**
We've made improvements to our code review pipeline, resulting in increases in precision for Go as well as increased recall for TypeScript and Elixir.
**Webhooks**
You can now trigger Macroscope queries from external services like Zapier, n8n, or your own APIs. Pass in a query and a destination (either a Slack channel ID or forwarding URL), and Macroscope will post the result to the provided destination. You can create webhooks and see detailed instructions in Settings โ Connections โ Webhooks.
**PostHog Integration**
Macroscope now connects to PostHog as a data source. With this connection, you can query your PostHog event data, run HogQL queries, and explore feature flags directly through Macroscope. Connect PostHog in Settings โ Connections โ PostHog.
**Always-Review PR Labels**
You can now add "always-review" labels to have Macroscope review any PR, even on repositories where automatic reviews are turned off. This also overrides skip-review labels. Go to Settings โ Code Review โ Always Review PR Labels to add a label (e.g., `macroscope-review`), then apply it to any PR on GitHub to trigger a review.
**Slack Attachment Support**
Macroscope now reads attachments from all messages in a Slack thread, including images, text documents, and code snippets. For example, you can tag @Macroscope in a thread with a screenshot of a bug and it can parse the attachment and open a PR with a fix.
**Code Review Improvements**
We've made improvements to our code review pipeline, resulting in increased recall for Go, Java, Rust, and TypeScript.
**Filter by PR Status in Code Review Dashboard**
In the Code Review Dashboard, you can now filter code review issues by the status of the pull request (draft, open, merged, or closed), enabling you to see a more focused list of issues and analyze more specific code review stats.
**Code Review Improvements**
We've made improvements to our code review pipeline, resulting in increases in precision for Ruby, Rust, and Starlark, as well as increased recall for Go, Java, and Starlark, Swift.
**V3 Code Review**
We released a new version of Macroscope Code Review. Based on our benchmark, v3 leaves 22% fewer comments overall, with 64% fewer nitpicks in Python and 80% fewer in TypeScript, and demonstrates a step-change improvement in precision from 75% to 98%. [Learn more on our v3 Code Review blog](https://macroscope.com/blog/code-review-v3).
**Approvability \[beta]**
We're launching Approvability, which enables Macroscope to automatically approve PRs when low-risk changes from trusted authors meet safety criteria. When a PR is opened or updated, Macroscope runs two automated checks:
1. **Eligibility**: Do the changes meet your team's criteria for auto-approval? This includes evaluating code ownership as a contextual signal: factoring in `CODEOWNERS`, blame history, and author role.
2. **Correctness**: Does the PR pass Macroscope code review with zero issues?
If both hurdles are cleared, Macroscope will approve the PR automatically.
[Learn more about Approvability in our help docs](/approvability). Reach out to [support@macroscope.com](mailto:support@macroscope.com) if you would like to use this feature.
**Impact Severity on Code Review Comments**
Review comments now display impact severity (Critical / High / Medium / Low) so you can quickly triage which issues need immediate attention.
**Updates to Code Review Dashboard**
We've released several updates to the Code Review dashboard, including:
* Filter comments by author, date, feedback reaction (or ), and addressed status (whether a review comment has been resolved).
* View high-level stats, including total PRs reviewed, average issues per PR, total comments left, % comments addressed, fix-it-for-me tasks started, and time saved resulting from fix-it-for-me.
* "Useful Comments Over Time" chart shows the % of review comments that were addressed by PR close or that received positive feedback (from a reaction or a reply).
* Download your code review history as a CSV.
**Universal File Support**
Previously, Macroscope code review only reviewed files in languages with native AST-parsing. Now, every file in your PR gets reviewed.
**Linked Issues in Slack Commit Summaries**
Commit summary notifications in Slack now display linked Linear and Jira tickets when available. You'll see a "Linked Issues" section with ticket IDs linked to their URLs, making it easier to trace commits back to the work they address.
**PR Closed Notifications**
Macroscope now sends PR closed notifications even when a PR is closed without merging.
**Code Review Improvements**
We've made improvements to our code review pipeline, resulting in measurable increases in precision for Java, Kotlin, and Swift, as well as increased recall for Python.
**Custom AMA Instructions**
You can customize how Macroscope responds to questions about your codebase. Go to **Workspace Settings โ Custom AMA Instructions** to add your instructions, such as preferred response tone, domain-specific context, or output format preferences. You can also define person-specific instructions, like: "customer success teammates should get less technical responses."
**Code Review Improvements**
We've made several improvements to our code review pipeline, resulting in measurable increases in precision for TypeScript, Python, Go, Java, Ruby, and Kotlin, as well as increased recall for Java and Elixir.
**Pre-Configured Macro Templates**
You can now create Macros from pre-built templates. Browse templates on the Macros page and click any template to create a new Macro that you can customize or use as-is.
**Reassign Project Areas from Breakdown Chart**
When hovering over a Project in the Project Focus Breakdown chart, you can click the "Move Area" button to reassign the Project to a different Area.
**Skip Labels Now Work for PR Summaries**
Labels configured to skip code review now also skip PR summary posting. Add your configured skip label to any PR to disable both features at once.
**Improvements to Code Review**
Better handling of language-specific patterns and reduced noise from non-actionable issues.
**Comment Resolution Tracking**
Code review comments now link to the commit where they were resolved and indicate if feedback has been addressed. Macroscope automatically evaluates and updates comments when new code is pushed to a PR.
**Per-PR Auto-Merge Control**
You can override your default auto-merge settings when asking Macroscope to fix an issue by adding instructions like "Fix it for me and auto-merge" or "Fix it but don't auto-merge."
**Timezone-Aware Date Selection**
Date presets (e.g. "Yesterday", "This Month") in the Macroscope web app now automatically align with your local timezone.
**Neutral Check Run Status**
When Macroscope reviews your code and posts comments with issues that need addressing, check runs now complete with `NEUTRAL` status instead of `SUCCESS`, so it's clear when there's pending feedback to address.
**Explanations for Blocked Auto-Merges**
When you use Macroscope's coding agent to automatically fix issues on a feature branch, the agent creates a pull request with the fixes and attempts to auto-merge it back to your base branch (if you have auto-merge enabled).
If auto-merge is blocked, Macroscope now posts a comment explaining the specific GitHub requirement preventing the merge (e.g. missing reviews, merge conflicts, failed checks).
**Flexible @Mention Support in GitHub**
Macroscope now responds to both `@macroscope` and `@macroscope-app`.
**Fix It For Me**
Macroscope can directly fix issues found during code review. Just reply to a GitHub review comment and ask Macroscope to fix it. Macroscope will create a branch, push commits, open a PR, and merge it back into your working branch. [See help docs for more details](/fix-it-for-me).
**Updated Check Run Labels**
GitHub Check Runs now display as "Macroscope - Correctness Check" and "Macroscope - Custom Rules Check" (previously "Review for correctness" and "Review custom rules").
**Pull Request Closure Messages**
When someone manually closes a PR, Macroscope now posts a comment identifying who closed it and whether it was merged.
**Personal Code Review Settings**
Individuals can now customize their individual preferences for PR Summaries and Code Review that override their workspace defaults. Select "Repo Default" to inherit preferences from the repository level.
**Timezone Support in AMA**
When asking Macroscope questions, the query agent now automatically uses your timezone to interpret dates and times. This improves results for questions about "yesterday," "this week," or specific dates.
**v2 Code Review by Opus 4.5**
We released a new version of Code Review powered exclusively by Claude Opus 4.5. Compared to our previous code review pipeline, the new pipeline has 40% higher recall and generates 10% fewer false positives. [Learn more in our blog post](https://blog.macroscope.com/blog/opus-4.5-code-review).
**Invoking Macroscope in PR Discussions**
Macroscope can now respond to comments in the main PR discussion thread as well as inline code comments. When you mention @macroscope-app in a comment, Macroscope will react with ๐ to acknowledge the question and then respond in the main discussion thread.
**Ignoring Bot Comments in GitHub**
@macroscope-app no longer responds to comments authored by other bots in GitHub.
**Improved Executive Summaries**
We've simplified summaries on the home page. Summaries are organized by [Areas](/areas) and have collapsible sections, so you can easily see a high level view of what's changed in your codebase this sprint.
**@mentions in Slack**
Users can configure whether or not Macroscope can @mention them directly in Slack. When enabled, Macroscope will @mention them when relevant, such as when they are assigned as a reviewer on a PR. When disabled, Macroscope will reference the user's Slack name instead of @mentioning them directly. This setting is configurable per user in Settings โ Account.
**Language Support for Elixir and Starlark**
Macroscope code review now supports Elixir (.ex, .exs files) and Starlark (.star, Tiltfile, BUILD files).
**Login Improvements for Enterprise/SAML Customers**
For customers using SAML login alongside GitHub Enterprise Managed Users, Macroscope's login flow should be smoother and smarter about automatically detecting expired tokens.
**Streamlined Macros Scheduling**
Scheduling regular reports with Macros is now even easier. After you set your daily/weekly cadence and write your prompt, all you need to do is copy/paste the generated Slack command into any Slack channel(s) you want to subscribe to the Macro. [Learn more about Macros in our help docs](/macros).
**Manually Trigger Code Review in GitHub**
You can now manually trigger a code review on a PR in GitHub by commenting `@macroscope-app review`, regardless of whether Macroscope code review is enabled for the repository. Macroscope will acknowledge your comment with a thumbs-up reaction and run a code review on the PR. This is useful when you want Macroscope to run another review after making changes, or when automatic reviews are disabled for a repo.
**Visualize Your Code in Slack**
Want to see how tables are connected in a database? Map a diagram of a workflow's lifecycle? You can ask @Macroscope to generate ASCII diagrams of anything related to your code.
**Updates to Query Agent (a.k.a. Ask Macroscope Anything)**
* **Smarter Guidance** - Query Agent can provide guidance when you explicitly request help, even for tasks outside its direct capabilities.
* **Adaptive Tone** - Macroscope adapts to your communication style. If you use humor or casual language, Query Agent will respond in kind while maintaining accurate and factual responses.
* **Content for External Stakeholders** - When you need content for external audiences, Query Agent can format responses and links appropriately for sharing outside your organization. Just request externally-facing content when preparing materials.
* **More Flexibility** - Under the hood, Query Agent's underlying prompt system supports broader interaction patterns, allowing it to handle a wider variety of interactions with users.
**Merge Notifications in Slack**
Macroscope now notifies you in Slack in real-time when commits are merged to release branches. When a merge occurs, Macroscope reacts to the original PR summary message with a ๐ emoji and posts a reply in the message thread. This works for all merge types, including squash, rebase, and fast-forward merges.
Note: this requires subscribing to commit notifications in a Slack channel with the `/macroscope subscribe-commits` command.
**Skip Code Review with GitHub Labels**
You can now tell Macroscope to skip code review on PRs tagged with specific [GitHub labels](https://docs.github.com/en/issues/using-labels-and-milestones-to-track-work/managing-labels). In Settings โ Repos โ Skip PR Labels, you can specify which GitHub labels that you want Macroscope to ignore during code review (e.g. "docs-only"). When you apply any of these designated labels to a PR, Macroscope will automatically skip the code review process for that PR.
**New Rendering Modes for Suggested Fixes in Review Comments**
Macroscope now automatically selects the best format for displaying suggested code fixes in review comments. Depending on the context, Macroscope chooses between three options:
* GitHub's native inline suggestion block (i.e. "accept diff")
* Unified diff blocks (i.e. static code diff)
* No diff (i.e. text-only explanations)
**Code Review Latency**
We significantly improved code review latency in the case where you push multiple commits to a PR in quick succession.
**Batch Repository Settings**
You can now configure settings for multiple repositories at once. The new interface, found in Settings โ Repos, allows you to search repos, select multiple repos, and apply settings across multiple repos simultaneously.
**AMA for Repos with Summaries Disabled**
Macroscope's Slackbot can answer questions about any repository you've linked to Macroscope, even if PR summaries are disabled. Based on customer feedback, we changed the PR summary setting so that it only controls whether generated summaries are posted to GitHub. This allows your Slack users to @ mention Macroscope with questions about PRs in repos where the PR summary posting feature is disabled.
**Shorter Code Review Comments**
We've adjusted Macroscope code review comments to be more succinct.
**Path-Based Filters for Slack Subscriptions**
With path-based filters, you can limit code activity subscriptions to specific parts of a repository. Any activity that modifies files matching the specified path filter(s) will trigger a Slack notification in the subscribed Slack channel. To create a code activity subscription that is filtered by file path, add the`--paths=` flag to the end of a `/macroscope` subscription command, and specify which file path(s) you want to filter by. [Learn more about path-based filters in our help docs](/slack-subscriptions#path-based-filters).
**Filtered Issues in Code Review**
If you've been curious which comments Macroscope considered leaving on your pull request but didn't, you can now see them. By default, these lower-signal comments are hidden to keep reviews focused. However, you can expand the "Filtered Issues" section at the bottom of the PR description to see which comments were excluded, by file, and expand each file to view the specific comment(s) identified.
**Custom Rules \[deprecated for [Check Run Agents](/check-run-agents)]**
We're introducing the ability for Macroscope to run an independent code review focused on your team's best practices, based on custom rules you define. In `macroscope.md` files throughout your codebase, you can define your team's best practices (i.e. anything that's idiomatic of how you want code to be written). During reviews, Macroscope will run a separate CheckRun that flags violations and leaves inline comments that reference the relevant rule.
**AI Web Research in Code Review**
Code review now has web research capabilities, meaning that Macroscope can search the web for external knowledge sources. When reviewing your code, Macroscope uses [Parallel](https://www.parallel.ai/)'s search API to find the latest documentation, so that code reviews take into account every library and package you use.
**Ticket Creation in Slack**
You can now ask the Macroscope Slackbot to create Jira and Linear tickets. Ask @Macroscope to create a ticket and Macroscope will use the context provided to generate a ticket on your behalf. To enable this, you will need to re-authorize your Jira / Linear integrations in Settings โ Connections. [Learn more about our Jira / Linear integrations here](/issue-management-integrations).
**Displaying Teammate Names**
The web app now shows contributors' GitHub display names (instead of their GitHub usernames) across commits, contributors, and team views, making it easier to identify team members.
**Contributor Metrics in AMA**
Macroscope AMA now has access to Contributor Productivity Metrics (e.g. # commits, # PR, coding time), so you can ask questions like "@Macroscope how many PRs were opened in the last 2 days?". Macroscope's agent can retrieve any metrics that are visible on the Macroscope website, across any time range.
**Linear Integration v2**
Macroscope is now using Linear's new "Agents" framework. Soon, Macroscope will be able to take actions on behalf of users in Linear. Existing customers will need to unlink and re-link their Linear application in their Macroscope settings in order to authorize fresh permissions.
**Jira Integration v2**
We are building a deeper Jira integration in Macroscope AMA. Soon, Macroscope will be able to create Jira issues and answer questions about your Jira projects and issues.
**Squash Merge Summaries**
The Commits page now displays summaries for squash merges. Users can hover over a branch's release details to view the summary, which shows the number of commits squashed and the date range covered.
**Support for GitHub PR Templates**
You can now add Macroscope summaries directly into a PR template by placing special markers where you want the summary to appear. [Learn more in our help center.](https://docs.macroscope.com/pull-request-descriptions#inserting-macroscope-summaries-into-your-pr-templates)
**Exportable Contributor Stats across Custom Time Ranges**
The Contributors page shows engineering productivity metrics grouped by individual contributors or by GitHub Team. This page now includes total opened PRs, in addition to Commits and Coding Time. Metrics can be filtered across any custom date range and exported as a CSV.
**Smarter, Faster "PR Assistant"**
The PR bot now retains the code research gathered during review. Follow-up questions and implementation discussions in review comments receive better-informed responses with lower latency.
**Better Code Review**
We have made several improvements to code review that increase bug detection rate while reducing false positives.
**Slack Messages**
We have improved the formatting of code activity updates in Slack so that messages are easier to scan and understand.
**We're Live!**
As of September 17, we're officially out of private beta.
**Coding Time Estimates**
Improved our Coding Time estimate algorithm to provide more accurate estimations based on the complexity of code changes.
**Code Review Improvements**
Optimized our code review pipeline to reduce the likelihood of false positives. In our testing, this results in \~30% lower comment volume without a meaningful impact to overall bug detection rate.
**Deployment Tracking for Commits**
Commits now display a "Released to" indicator with a rocket icon and linked branch tag when released to a specific branch, making it easier to track deployment status.
**Slackbot Resilience**
Improved reliability and resilience of responses from Macroscope's Slackbot. Sometimes, when users asked code research questions, the Slackbot would struggle to respond when the response included emojis due to Slack API compatibility issues. Now, the Slackbot responds without failure.
**Mobile Viewing**
Better viewing on tablets and larger mobile devices, plus improved chart displays.
**Resynchronize with GitHub**
In the rare event your repositories or related data in Macroscope ever fall out of sync with GitHub, you can click the "Resynchronize Now" button in Settings โ Support to manually trigger a resynchronization.
**Code Review Improvements**
Improved bug detection across the 8 languages Macroscope code review supports. Our new pipeline will identify many more potential issues than before. In testing, we observed a significant improvement in detection rates with only a marginal increase in disapproval rates.
**Status for "Run Now" Macros**
When clicked, the "Run Now" button on the Macros Page shows live status, so users know when a Macro is executing and that the results will be posted to Slack soon.
**Project Focus Breakdown Chart Tooltips**
Tooltips in the Project Focus Breakdown chart on the Productivity Page have been improved for readability.
**Account Settings Code Review Toggle**
Users now have the flexibility to turn off correctness code reviews for their own PRs at the account level. This toggle is available in Settings โ Account and gives each user more control over their review experience.
**Mobile Experience Improvements**
Improved scrolling behavior and updated UI for a smoother, more consistent experience on mobile.
# Check Run Agents
Source: https://docs.macroscope.com/check-run-agents
Custom agentic check runs that enforce your rules and take action on every PR
Check Run Agents are customizable AI agents that can run on pull request opens, pushes, label changes, and manual re-runs. They can access your codebase, git history, and connected integrations, and you define what to check, how to format output, and what actions to take.
Macroscope automatically runs two built-in check runs on every PR: [**Correctness**](/bug-detection-and-fixes) (catches runtime bugs and logic errors) and [**Approvability**](/approvability) (evaluates merge readiness). Your custom agents appear alongside them in the Checks tab.
## Getting Started
1. Create a `.md` file in `.macroscope/check-run-agents/` (e.g. `.macroscope/check-run-agents/web-review.md`)
2. Configure the frontmatter fields you need (all optional) and write your instructions:
```md theme={null}
---
title: Security Review # Name in GitHub Checks UI (max 60 chars)
model: claude-opus-5-5 # See the Models & Pricing page
reasoning: low # off, low, medium, high, xhigh, max (per-model)
effort: low # low, medium, high
input: full_diff # full_diff, incremental, code_object, or pr_metadata
tools: # Omit to use defaults
- browse_code
- git_tools
include: # Glob patterns for files to review
- "src/**"
conclusion: neutral # neutral (non-blocking) or failure (blocking)
maxRuns: 5 # Max runs per PR (omit for no limit)
maxBudgetPerRun: 0.50 # Max spend per run in USD (omit for no limit)
maxBudgetPerPR: 2.00 # Max spend by this agent per PR (omit for no limit)
---
Your instructions here.
```
3. Commit and push. You can push to a pull request to try the agent out there first, then merge to your default branch once it does what you want.
Agent files work like any other code change. Macroscope reads them from the most recent commit on the pull request, so pushing a new or edited agent to your own PR takes effect on that PR right away. Other open PRs don't pick it up until the change is merged and their branches include it.
One exception: pull requests from **external forks** always read configuration from your default branch, never from the PR. The author of a fork is outside your organization, so their branch cannot introduce agents or change existing ones.
## File Layout
Each `.md` file in `.macroscope/check-run-agents/` becomes its own agent, scoped to its repo. Start with one file and split only when you need different configurations (e.g. different tools or input modes).
A typical repo structure:
```text theme={null}
.macroscope/
โโโ check-run-agents/
โ โโโ security-review.md
โ โโโ web-review.md
โโโ approvability.md
โโโ ignore.md
```
Subdirectories are walked recursively, so you can group agents by team or service in a monorepo:
```text theme={null}
.macroscope/
โโโ check-run-agents/
โโโ security-review.md
โโโ backend/
โ โโโ db-review.md
โโโ frontend/
โโโ accessibility-review.md
```
Nesting is purely organizational: an agent behaves the same wherever it lives. Only `*.md` files are read (`README.md` and others are ignored), and each agent's `title` must be unique across subdirectories; duplicates are auto-suffixed with a number.
The filenames `approvability.md` and `ignore.md` are **reserved**: they cannot be used as check run agent definitions. [`approvability.md`](/approvability#custom-eligibility-rules) configures custom approvability rules, and [`ignore.md`](/bug-detection-and-fixes#macroscope-ignore) controls which files are excluded from code review and Check Run Agents. These files always live in the `.macroscope/` root, not in the `check-run-agents/` subfolder.
**Existing setup?** If your check run agent files are in `.macroscope/` instead of `.macroscope/check-run-agents/`, they will continue to work. We recommend moving them to the subfolder when convenient: the root location will stop being read in a future release. See [Migrating](#migrating) for a one-line move.
If you already use a `CLAUDE.md` to guide how AI writes code, embed it directly in your instructions with `@/CLAUDE.md` to keep coding and review standards in sync. See [Importing Files](#importing-files).
## File Format
Each file has two parts: an optional YAML frontmatter block for settings and a markdown body with your instructions. Every field is optional: omit frontmatter entirely and defaults apply, with the filename as the title.
| Field | Default | Options | Description |
| - | - | - | - |
| `title` | Derived from filename | Any string (max 60 chars) | Name in GitHub Checks UI |
| `model` | `claude-opus-5-5` | See [Models & Token Pricing](/model-pricing#available-models) | Which model powers the agent |
| `reasoning` | `low` | `off`, `low`, `medium`, `high`, `xhigh`, `max` | Extended thinking depth. `xhigh` and `max` are only accepted on the models that support them; on any other model they warn and fall back to `low`. See [per-model support](/model-pricing#reasoning-and-effort) |
| `effort` | `low` | `low`, `medium`, `high` | How deep the agent digs (Anthropic models only: ignored elsewhere) |
| `input` | `full_diff` | `full_diff`, `incremental`, `code_object`, `pr_metadata` | What the agent is given as input |
| `tools` | `[browse_code, git_tools, github_api_read_only, modify_pr]` | See [Tools](#tools) | Which tools the agent can use |
| `include` | none | Glob patterns | Only review files matching these patterns (e.g. `"*.go"`, `"src/**"`) |
| `exclude` | none | Glob patterns | Files to skip (e.g. `"*.lock"`, `"vendor/**"`) |
| `labels` | none | List of label names | Only run if the PR has one of these labels. See [Applicability Filters](#applicability-filters) |
| `authors` | none | List of GitHub logins | Only run if the PR is by one of these authors. See [Applicability Filters](#applicability-filters) |
| `targets` | none | List of branch names / `only_default_branch` | Only run if the PR targets one of these branches. See [Applicability Filters](#applicability-filters) |
| `conclusion` | `neutral` | `neutral`, `failure` | Maximum severity the agent can report |
| `requiredStatusCheck` | `false` | `true`, `false` | When this agent is selected for an event, report `skipped` instead of disappearing if file scope or applicability filters exclude it: for use as a branch protection required status check. See [Required Status Checks](#required-status-checks) |
| `showToolCalls` | `true` | `true`, `false` | Show an ordered log of the agent's tool calls (tool name and description) on the check run conclusion page |
| `waitsFor` | none | Check run names or `["*"]` (up to 10 entries) | CI steps that must complete before this agent runs. See [Prerequisite Steps](#prerequisite-steps) |
| `requires` | none | Check run names or `["*"]` | CI steps that must **pass** before this agent runs: otherwise it is skipped without running. Works alongside `waitsFor`, and shares its 10-entry limit (10 distinct names across both). See [Gating on success](#requires) |
| `waitsForTimeout` | `20` | `1` to `60` (minutes) | How long to wait for prerequisites to **finish** before skipping. Applies to `waitsFor` and `requires` alike |
| `waitsForDiscoveryTimeout` | `1` (60 seconds) | `1` to `60` (minutes) | How long to wait for a prerequisite to **appear** on the commit before treating it as absent. Raise this when a required check is published conditionally or late. With named prerequisites it is a deadline and costs nothing once they appear; with `waitsFor: ["*"]` it is a **floor paid on every run**. See [When a prerequisite is published late](#late-prerequisites) |
| `maxRuns` | none (no limit) | Positive integer | Maximum number of times this agent runs on a single PR. Once reached, later pushes still create the check run but conclude it skipped. See [Run Limits](#run-limits) |
| `maxBudgetPerRun` | none (no limit) | Positive number (US dollars, e.g. `0.05`) | Maximum spend for a single run of this agent (best effort). After each turn within the run, the agent checks if it reached or exceeded the cap and if so, stops. Not supported with `input: code_object`. See [Spend Limits](#spend-limits) |
| `maxBudgetPerPR` | none (no limit) | Positive number (US dollars, e.g. `2.50`) | Maximum total spend for **this agent** across all of its runs on one pull request (best effort). Checked before a run is dispatched, against spend already recorded for this agent on the PR. Separate from the workspace-wide limit that covers all agents together. See [Spend Limits](#spend-limits) |
## When An Agent Runs
Many settings in Macroscope and your Check Run Agent's frontmatter affect whether it runs. Follow the stages below in order: the first blocked decision determines the outcome.
### Possible Outcomes
| Outcome | Meaning |
| - | - |
| **No check run created** | Macroscope does not create a GitHub check, and the agent does not start. |
| **Check run created but skipped** | Macroscope creates the GitHub check but concludes it as `skipped` before the agent starts. No agent work is billed. |
| **Agent started but stopped** | The agent starts, but a limit stops it before completion. Work completed before it stops is billed. |
| **Agent completed** | The agent finished and reported its result. Frontmatter [`conclusion`](#reporting-and-blocking) controls whether that result can block merging. |
### Which Event Selected The Agent?
| Trigger | Which agents are selected |
| - | - |
| **Automatic PR event** | Opening a PR, pushing a new commit, or marking a draft ready for review selects every agent definition available for that PR. |
| **Label event** | Adding or removing a label selects agents whose frontmatter or repository settings use that label. Adding a label configured in repository [**Always Review PR Labels**](/settings#pull-request-settings), or adding a [Detection Mode label](/bug-detection-and-fixes#pr-labels), selects every agent. |
| **Explicit mention** | A review or issue comment that mentions `@macroscope-app` and requests a review selects every agent, unless the comment names specific agent titles. |
| **GitHub rerun** | Rerunning a check selects that agent. Rerunning a check suite selects the agents represented by its existing checks. |
### Decision Waterfall
Start at **Selection** and stop at the first blocked row. Rows and settings within each row appear in the order Macroscope applies them.
| Stage | Decision | Relevant settings | If blocked | What can override it? |
| - | - | - | - | - |
| **Selection** | Was this agent selected? | The event type determines the initial set of agents. An explicit mention can name specific agent titles, while a label event selects only agents affected by the changed label. | **No check run created** | No setting can select an agent that the event did not select. [`requiredStatusCheck`](#required-status-checks) does not change selection. |
| **Availability** | Are Check Run Agents enabled? | The PR author's personal [**Check Run Agents**](/settings#personal-settings) override is applied first: **Always on**, **Always off**, or use the repository setting. If it defers, the repository [**Check Run Agents**](/settings#features) setting decides whether agents run automatically (**Always run**), only when asked (**Manual invocation only**), or not at all (**Never run**). | **No check run created** | An explicit mention bypasses personal **Always off** and repository **Manual invocation only**. Personal **Always on** overrides the repository setting. A label configured in **Always Review PR Labels**, or a Detection Mode label, overrides repository **Manual invocation only** but not personal **Always off**. Nothing overrides repository **Never run**. |
| **Availability** | Is this PR eligible for automatic review? | For a draft PR, personal [**Review my draft PRs**](/settings#personal-settings) overrides repository [**Review Draft PRs**](/settings#pull-request-settings). Repository [**Review Cross-Repo PRs**](/settings#pull-request-settings) then controls PRs from another repository, and repository [**Skip Dependabot**](/settings#pull-request-settings) controls Dependabot PRs. | A blocked draft produces **No check run created**. A blocked cross-repository or Dependabot PR produces **Check run created but skipped**. | An explicit mention bypasses the two draft settings. It does not bypass **Review Cross-Repo PRs** or **Skip Dependabot**. |
| **Availability** | Is the agent definition available? | The agent must be a valid `.md` file in the [Check Run Agent directory](#file-layout). For PRs from external forks, Macroscope reads agent definitions from the repository's default branch instead of the PR branch. | **No check run created** | Nothing can run an agent definition that is missing or in an unsupported location. |
| **Applicability** | Does this agent apply to the PR? | Macroscope checks frontmatter [`authors`, then `labels`, then `targets`](#applicability-filters). Defining an axis in frontmatter replaces the matching repository [**Skip PRs by Author**, **Skip PRs by Labels**, or **Skip PRs by Target Branches**](/settings#pull-request-settings) rule for that agent. If the axis is omitted, the repository rule applies. | **No check run created**. With [`requiredStatusCheck: true`](#required-status-checks), Macroscope creates the check and concludes it as skipped instead. | An explicit mention bypasses repository skip rules, but not frontmatter filters. Always-review and Detection Mode labels bypass repository label and target rules, but not the author rule or frontmatter filters. |
| **File scope** | Are any changed files eligible? | Frontmatter [`include`](#macroscope-ignore) first chooses eligible files, [`exclude`](#macroscope-ignore) removes files from that set, and [`.macroscope/ignore.md`](#macroscope-ignore) applies repository-wide exclusions. | If `include` or `exclude` leaves no files, the outcome is **No check run created**, or **Check run created but skipped** with `requiredStatusCheck: true`. If `.macroscope/ignore.md` leaves no files, the outcome is always **Check run created but skipped**. | An explicit `include` can restore a file excluded by `.macroscope/ignore.md`. An `exclude` pattern still removes that file. |
| **Limits** | Is another run allowed? | Macroscope checks the workspace [balance and monthly spend limit](/pricing#spend-controls), then the workspace [Check Run Agents per-PR limit](/pricing#the-check-run-agents-per-pr-limit), then this agent's [`maxBudgetPerPR`](#spend-limits), and finally this agent's [`maxRuns`](#run-limits). | **Check run created but skipped** | An explicit mention bypasses the workspace Check Run Agents per-PR limit, `maxBudgetPerPR`, and `maxRuns`. It cannot bypass the workspace balance or monthly spend limit. A GitHub rerun bypasses `maxRuns` only. |
| **Dependencies** | Are its prerequisites satisfied? | Both [`waitsFor` and `requires`](#prerequisite-steps) wait for named checks to appear and finish. `requires` also requires them to pass. [`waitsForDiscoveryTimeout`](#late-prerequisites) controls how long Macroscope waits for a check to appear, while [`waitsForTimeout`](#prerequisite-steps) controls how long it waits for the check to finish. | A missing, timed-out, or cyclic prerequisite produces **Check run created but skipped**. A prerequisite that fails also skips an agent that lists it in `requires`. | Nothing bypasses prerequisite requirements. |
| **Execution** | Can the configured agent run? | The [agent definition](#file-format) and its [`model`, `reasoning`, and `effort`](/model-pricing) must be valid. The selected [`input`](#input-modes) must support the configured options. For example, `input: code_object` does not support [`maxBudgetPerRun`](#spend-limits). The initial prompt must also fit the selected model's [context window](#context-window). | Invalid configuration or an oversized initial prompt produces **Check run created but skipped**. | Nothing bypasses configuration or initial context requirements. |
| **In-run limits** | Can the running agent continue? | After each turn, [`maxBudgetPerRun`](#spend-limits) can stop the agent when the run reaches its budget. The next model request must also fit the model's [context window](#context-window) as the conversation grows. | **Agent started but stopped** | Nothing bypasses the per-run budget or model context window. |
### Overrides And Bypasses
| Mechanism | Overrides or bypasses | Does not override |
| - | - | - |
| Personal [**Check Run Agents: Always on**](/settings#personal-settings) | For PRs authored by that person, enables Check Run Agents even when repository **Check Run Agents** is **Manual invocation only**. | It does not override repository **Never run**, and it does not bypass draft eligibility or any later decision in the waterfall. |
| **Explicit mention** | Selects every agent, or the named agents. It bypasses the personal and repository **Check Run Agents** controls and both draft-review controls. It also bypasses repository **Skip PRs by Author**, **Skip PRs by Labels**, and **Skip PRs by Target Branches**, plus the workspace Check Run Agents per-PR limit, `maxBudgetPerPR`, and `maxRuns`. | Repository **Check Run Agents: Never run** still applies. Frontmatter `authors`, `labels`, and `targets` still apply, as does file scope. The workspace balance and monthly spend limit, **Review Cross-Repo PRs**, **Skip Dependabot**, prerequisites, configuration, and in-run limits also still apply. |
| **GitHub rerun** | Allows the selected agent to run after it has reached `maxRuns`. | It does not bypass enablement, PR eligibility, definition availability, applicability, file scope, other limits, prerequisites, configuration, or in-run limits. |
| A label configured in repository [**Always Review PR Labels**](/settings#pull-request-settings) | Selects all agents and overrides repository **Check Run Agents: Manual invocation only**, **Skip PRs by Labels**, and **Skip PRs by Target Branches**. | It does not override repository **Check Run Agents: Never run**, personal **Check Run Agents: Always off**, draft settings, repository **Skip PRs by Author**, or any frontmatter filter. |
| [Detection Mode label](/bug-detection-and-fixes#pr-labels) | Selects all agents and overrides repository **Check Run Agents: Manual invocation only**, **Skip PRs by Labels**, and **Skip PRs by Target Branches**. | It does not override repository **Check Run Agents: Never run**, personal **Check Run Agents: Always off**, draft settings, repository **Skip PRs by Author**, or any frontmatter filter. |
| Frontmatter [`authors`](#applicability-filters) | Replaces repository **Skip PRs by Author** for this agent. | The frontmatter `labels` and `targets` decisions still apply. |
| Frontmatter [`labels`](#applicability-filters) | Replaces repository **Skip PRs by Labels** for this agent. | The frontmatter `authors` and `targets` decisions still apply. |
| Frontmatter [`targets`](#applicability-filters) | Replaces repository **Skip PRs by Target Branches** for this agent. | The frontmatter `authors` and `labels` decisions still apply. |
| Frontmatter [`include`](#macroscope-ignore) | Restores files that it explicitly matches even when `.macroscope/ignore.md` would otherwise exclude them. | A matching frontmatter `exclude` still removes the file. |
| [`requiredStatusCheck: true`](#required-status-checks) | Changes an applicability or `include`/`exclude` exclusion from **No check run created** to **Check run created but skipped**. It changes reporting, not whether the agent is allowed to run. | It does not select an agent, bypass availability, make an inapplicable agent apply, or make an excluded file eligible. |
**Applicability filters**
`labels`, `authors`, and `targets` decide **whether** an agent applies to a PR, based on PR metadata. Each is an **inclusion filter**: when set, the PR must match at least one entry; when omitted, that axis adds no constraint from the agent. Axes combine with AND, so every configured axis must match.
```yaml theme={null}
---
title: Release Branch Review
include:
- "src/**"
labels:
- release
authors:
- alice
- bob
targets:
- only_default_branch
---
Review release changes against our checklist...
```
| Axis | Effect |
| - | - |
| `labels` | Run only if the PR carries at least one of these labels (case-insensitive) |
| `authors` | Run only if the PR was opened by one of these GitHub logins (case-insensitive) |
| `targets` | Run only if the PR targets one of these branches (see below) |
Spell a bot author the way GitHub does, with the `[bot]` suffix: `dependabot[bot]`, not `dependabot`.
**`targets`** is a list of branch names, and supports a special sentinel value:
* Omitted -> runs regardless of target branch (default).
* `only_default_branch` -> runs only when the PR targets the repository's default branch. This is the common case for agents that should only gate merges into `main`.
* One or more branch names -> runs only when the PR targets one of them, e.g. `targets: [main, release/v1]`.
These filters apply on every trigger, including explicit mentions and GitHub reruns. See [Overrides And Bypasses](#overrides-and-bypasses) for how they interact with repository skip settings, always-review labels, and mode labels.
Blank entries are ignored and duplicates are removed automatically.
## What Gets Reviewed
**`include` and `exclude`: scoping by file**
Use `include` to review **only** matching files, `exclude` to skip files, or both: `include` narrows the universe first, then `exclude` carves out exceptions.
| Configuration | Behavior |
| - | - |
| Neither set | All changed files are reviewed |
| Only `include` | Only files matching at least one pattern are reviewed |
| Only `exclude` | All files except those matching a pattern are reviewed |
| Both set | Only files that match at least one `include` pattern **and** no `exclude` pattern: exclude wins on overlap |
For example, `include: ["src/**"]` + `exclude: ["src/gen/**"]` reviews all `src/` files except generated ones.
Both accept the same glob syntax (`"*.go"`, `"src/**"`, `"services/auth/**/*.go"`). Like `.gitignore`, a pattern without a `/` matches at any depth, so `"*.go"` also matches `src/main.go`.
**`.macroscope/ignore.md`: repository-wide exclusions**
To exclude files from every check run, add patterns to your repository's [`.macroscope/ignore.md`](/bug-detection-and-fixes#macroscope-ignore) file. A file is out of scope when it fails the agent's `include`/`exclude` pipeline or matches a repository-wide ignore pattern.
**An agent's `include` overrides `.macroscope/ignore.md`.** A file matching the agent's `include` (and not carved out by its `exclude`) is reviewed even if an ignore pattern also matches: the output warns which ignore pattern was overridden. This lets a targeted agent review files the rest of your checks ignore (e.g. generated code). Agents without `include` always respect `.macroscope/ignore.md`.
**When every changed file is out of scope**, no agent runs and nothing is billed. What appears in the Checks tab depends on which patterns did the filtering:
| Every changed file excluded by | Behavior |
| - | - |
| The agent's `include`/`exclude` | Check run is **not created** (invisible in Checks tab). With [`requiredStatusCheck: true`](#required-status-checks), it is **created but skipped** instead |
| `.macroscope/ignore.md` (alone or combined with `exclude`; only possible for agents without `include`) | Check run is **created but skipped**, with a message explaining that every changed file was filtered out |
**When some files are in scope**, the agent runs and both pattern sets bound what it reports:
* In **`full_diff` mode**, the agent sees the entire PR diff for context, and its prompt lists the `include`/`exclude`/ignore patterns to focus on: noting, for agents with `include`, that files matching the include patterns are in scope even where ignore patterns match.
* In **`incremental` mode**, out-of-scope files and files unchanged since this agent's last completed review are filtered out before the agent runs. Each selected file is still shown as its complete change against the PR's merge base.
* In **`code_object` mode**, out-of-scope code objects are filtered out before the agent runs: the agent never sees them.
* In **`pr_metadata` mode**, scoping works exactly like `full_diff`. The changed files decide whether the agent runs, but the diff itself is not in the prompt.
* In all modes, review comments the agent attempts to post on out-of-scope files are dropped.
Use `include`/`exclude` for per-agent scoping (e.g. "only Go files") and `.macroscope/ignore.md` for repo-wide exclusions that apply to all checks (e.g. generated code, vendored dependencies).
**`input`: full diff, incremental, code object, or PR metadata**
| Mode | What happens | When to use | Cost |
| - | - | - | - |
| `full_diff` | One agent processes the entire PR diff | Enforcement that needs PR-level context ("new function added without tests") | Lower |
| `incremental` (default) | One agent processes only files changed since its last completed review, with each selected file shown as its complete change in the PR | Non-blocking checks on frequently updated PRs | Lower on later pushes |
| `code_object` | Up to 20 agents in parallel, one per changed code object | Per-unit enforcement ("don't log PII in any changed file") | Higher |
| `pr_metadata` | One agent processes the PR's title, author, labels, description, and commit messages: the diff is not included | Enforcement on the PR itself ("description must link a ticket", "title must follow conventional commits") | Lowest |
The PR's title and description reach the prompt in **every** mode, not only `pr_metadata`. What `pr_metadata` adds on top is the author, the labels, and the commit messages โ and what it gives up is the diff. See [what an agent remembers](#what-an-agent-remembers).
Omitting `input` defaults to `incremental`. To review the entire PR diff on every run, explicitly set `input: full_diff`. Explicit `input` values are unchanged.
`incremental` narrows **which files** the agent reviews, not **how much of each file** it sees. A file changed since the agent's last completed review is shown with its full `merge base..head` diff, including changes from earlier pushes, so the agent reviews the file as a whole. Files unchanged since that review are omitted.
```yaml theme={null}
---
title: Security Review
input: incremental
conclusion: neutral
include:
- "src/**"
---
```
The first run reviews every in-scope file. Later automatic runs use this agent's most recent completed review as their baseline. A run that is skipped, stopped before completing its review, errors, or is cancelled does not move the baseline, so the next completed run still covers files changed since the earlier review. If no in-scope files changed, the check concludes as `skipped`; no agent runs and nothing is billed.
Macroscope falls back to reviewing every in-scope file when it cannot safely reuse the baseline. This includes force-pushes and rebases, a moved merge base, or changes to the agent's instructions, `include`, `exclude`, `input`, or `.macroscope/ignore.md`. An `@macroscope` mention or GitHub re-run also always requests a full review.
This is also how the built-in Correctness check reviews pull requests by default. Check Run Agents use the same input mode when you omit `input`; you can also set `input: incremental` explicitly.
`conclusion: failure` is not supported with `input: incremental`, including when `input` is omitted. A run with no newly selected files is skipped, and incremental mode does not replay an earlier blocking verdict. This combination produces a configuration error. Use `conclusion: neutral`, or keep `conclusion: failure` with an explicit `input: full_diff`. If an existing blocking agent omits `input`, add `input: full_diff` to preserve its behavior.
In `pr_metadata` mode, everything except the prompt input works exactly like `full_diff`. `include`/`exclude` patterns still decide whether the agent runs based on the changed files, `requiredStatusCheck` skips the same way, and the default tools are unchanged. An agent with `modify_pr` can fix the metadata it flags, and one with `browse_code` or `git_tools` can still consult the changes when its instructions require it. Only the diff is kept out of the prompt, which makes this mode the cheapest.
How much of the diff (in `full_diff` and `incremental`) or of the commit log (in `pr_metadata`) reaches the prompt depends on the [context window](#context-window) of the model the check selects. On a large pull request the agent may run without the diff inlined, and be told to read the paths its instructions need with `git_diff` instead.
### Reporting and blocking
**`conclusion`: blocking vs non-blocking**
By default, the conclusion is capped at `neutral`: issues show up in the Checks tab but never block merging. Set `conclusion: failure` with an explicit compatible input mode, such as `input: full_diff`, to let the agent block PRs when it finds issues. The default `incremental` input mode does not support blocking conclusions.
Even with `failure`, the check still reports success when nothing is wrong. The setting only raises the ceiling on severity, not the floor.
**`requiredStatusCheck`: branch protection required checks**
If you add a Check Run Agent to a [branch protection rule's required status checks](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches#require-status-checks-before-merging), GitHub treats a check that never reports as failing. The PR shows "Expected โ waiting for status to be reported" indefinitely and cannot merge.
By default, when `include`/`exclude` filters out every changed file, the check run is **not created** (see [Repository-Wide Exclusions](#macroscope-ignore)). That keeps narrowly-scoped agents out of the Checks tab in monorepos, but blocks PRs when the check is required.
Set `requiredStatusCheck: true` to make a selected agent report `skipped` instead of disappearing when its filters exclude the PR:
```yaml theme={null}
---
title: TypeScript Review
include:
- "**/*.ts"
- "**/*.tsx"
exclude:
- "**/*.d.ts"
requiredStatusCheck: true
---
```
When no files match, the check run is created and concluded as **skipped**, which GitHub counts as passing. No agent runs and nothing is billed: only how the skip is reported changes. When files match, behavior is identical to any other agent, for all four `input` modes.
`requiredStatusCheck` also changes how excluded [`labels`, `authors`, and `targets` filters](#applicability-filters) and repository **Skip PRs by Author / Label / Target** settings report: if the agent has already been selected for this event, the check run is created and concluded as **skipped**, with a message naming the filter. It does not override the filters and make the agent run.
`requiredStatusCheck` guarantees a conclusion only when the agent is scheduled. If any of the following conditions apply, the check run is never created and PRs requiring it will block without a Macroscope-side remedy:
* Check Run Agents is disabled for the repo (repo setting, account override, or the feature being unavailable),
* the agent's `.md` file is deleted or renamed while the branch protection rule still requires the check,
* the event selected a different named agent, or
* a label event could not affect this agent.
If either of those applies, update the branch protection rule to stop requiring the check.
Without `include`/`exclude` patterns or applicability filters, `requiredStatusCheck: true` does nothing because the agent already runs and reports a conclusion. If your repository's **Skip PRs by Author / Label / Target** settings can exclude PRs, excluded PRs get a check run concluded as **skipped** instead of no check run.
**`waitsFor`: prerequisite steps**
Use `waitsFor` to delay an agent until other CI steps finish. It shows as "in progress" on GitHub while waiting, then runs once all prerequisites complete: useful for reading another check's results (e.g. summarizing Correctness) or running last after all CI.
**Named prerequisites**
List the exact check run names your agent depends on, as they appear on the PR's Checks tab:
```yaml theme={null}
---
title: Annotate Correctness
waitsFor:
- "Macroscope - Correctness Check" # a Macroscope check
- "lint" # a job with an explicit name: field
- "ci / test" # a job with no name: field (workflow / job id)
tools:
- browse_code
- modify_pr
---
Read the review comments left by the Correctness check and add annotations...
```
See the name-matching rules below for how GitHub derives each of these names.
**Wildcard: run after everything else**
Use `"*"` to wait for all other check runs on the commit to complete before running:
```yaml theme={null}
---
title: PR Summary
waitsFor:
- "*"
---
Summarize the results of all CI checks on this PR...
```
**Custom timeout**
The default wait is 20 minutes. Set `waitsForTimeout` to change it (1-60 minutes):
```yaml theme={null}
---
title: Post-Deploy Check
waitsFor:
- "deploy-to-staging"
waitsForTimeout: 45
---
Verify the staging deployment succeeded...
```
**When a prerequisite is published late**
There are two separate clocks. `waitsForTimeout` is how long a prerequisite may take to **finish**. The shorter discovery window, 60 seconds by default, is how long it may take to **appear** on the commit. If a named prerequisite has not shown up on the Checks tab when the discovery window closes, the agent skips with "not found" rather than waiting out the full timeout for a check that a typo means will never exist.
Sixty seconds covers ordinary webhook lag, but not a check that is published *conditionally*. Two common cases:
* The job is gated behind an earlier job (e.g. a `detect-changes` job that decides whether to run it), so GitHub does not create its check run until that job finishes.
* Your workflow uses `concurrency` with `cancel-in-progress: true`, and a new push arrives while the previous run is still cancelling. The new run exists but stays pending, and none of its check runs are published until it starts, which can take several minutes.
Set `waitsForDiscoveryTimeout` (minutes, 1-60) to give such a check longer to appear:
```yaml theme={null}
---
title: Security Review
requires:
- "pre-commit / pre-commit"
waitsForDiscoveryTimeout: 10
---
Review this diff for security issues...
```
A long discovery window tolerates a check that is published late. It also means a check that will *never* appear, because of a typo or a job this PR does not trigger, takes that long to skip instead of failing in a minute. Set it to roughly the longest delay you actually observe, not to the maximum.
The discovery window is always capped at `waitsForTimeout`: it is a slice of the overall wait, never an addition to it. Both fields govern `requires` exactly as they govern `waitsFor`.
With `waitsFor: ["*"]` ("go last"), the discovery window is a **minimum** wait, not a deadline. A wildcard agent has no list of names to look for, so it must outlast the window before it can conclude that every check on the commit has finished: raising `waitsForDiscoveryTimeout` to 10 delays every run of that agent by 10 minutes. With named prerequisites there is no such cost: as soon as every named check has appeared the discovery window is over, and what remains is the ordinary wait for those checks to finish.
That cost is invisible on the Checks tab because the agent simply concludes late on every PR. Setting both an explicit `waitsForDiscoveryTimeout` and a wildcard wait therefore produces a warning on the check run page. It is a warning, not a refusal. A go-last agent with a raised window is appropriate for a check genuinely published that late. If you can name the checks you are waiting for instead of using `["*"]`, you get the tolerance without the per-run floor.
**Behavior**
| Scenario | What happens |
| - | - |
| Prerequisites complete | Agent runs normally. Prerequisite outcomes (success, failure, etc.) are passed to the agent as context. |
| Prerequisite never appears within the discovery window (60 seconds by default) | Agent is skipped with a "not found" message. Check that the name in `waitsFor` matches exactly; if the step is real but published late, raise `waitsForDiscoveryTimeout`. See [When a prerequisite is published late](#late-prerequisites). |
| Prerequisite doesn't complete within timeout | Agent is skipped with a "timed out" message. Increase `waitsForTimeout` if the step is slow. |
| Circular dependency (A waits for B, B waits for A) | Detected at parse time. Both agents skip immediately with an error naming the cycle. |
| Prerequisite completes but fails (`requires` only) | Agent is skipped without running, with a message naming the check and its conclusion. See [Gating on success](#requires). |
**Name matching**
Names are matched **exactly, case-insensitive** against the check run name as it appears on GitHub.
The easiest way to find the correct name is to open the PR's **Checks** tab on GitHub and copy the check run name exactly as it appears there. That string is what you put in `waitsFor`: no guessing required.
**Macroscope checks** use the prefix `Macroscope - `, e.g. `"Macroscope - Correctness Check"`.
**GitHub Actions jobs** appear as individual check runs, and GitHub derives the check run name in one of two ways depending on whether the job declares an explicit `name:` field in the workflow YAML:
1. **Job has an explicit `name:` field** โ the check run name is exactly that `name:` value (the workflow name is *not* prepended).
```yaml theme={null}
name: ci
jobs:
lint:
name: lint # check run name = "lint"
```
Here you would use `waitsFor: ["lint"]`.
2. **Job has no `name:` field** โ GitHub falls back to the composite format `workflow_name / job_id`.
```yaml theme={null}
name: ci
jobs:
lint: # no name: field โ check run name = "ci / lint"
```
Here you would use `waitsFor: ["ci / lint"]`.
In both examples the job id (the YAML key) is `lint`; the only difference is whether a `name:` field is present. When in doubt, trust the Checks tab: it shows the exact string GitHub computed.
`waitsFor` matches individual **jobs** (check runs), not entire **workflows** (check suites). To wait for all jobs in a multi-job workflow, list each job's check run name, or use `waitsFor: ["*"]` to wait for everything.
**Wildcard mode details**
When `waitsFor: ["*"]` is set, the agent waits for every check run on the commit except:
* **Itself**: the agent never waits for its own check run.
* **Other wildcard agents**: if multiple agents use `waitsFor: ["*"]`, they exclude each other and run in parallel once all non-wildcard checks finish.
You can have multiple "go last" agents without deadlock.
**Prerequisite conclusions**
The agent receives a Markdown table of prerequisite outcomes in its prompt context, so your instructions can branch on pass/fail:
```text theme={null}
## Prerequisite Results
| Check Run | Conclusion |
|-----------|------------|
| Macroscope - Correctness Check | success |
| CI / lint | failure |
```
Any conclusion (success, failure, neutral, etc.) satisfies the dependency: `waitsFor` controls ordering, not gating on success. Use [`requires`](#requires) when you want the agent skipped unless its prerequisites passed.
**`requires`: only run if the prerequisites passed**
`waitsFor` delays an agent; it never cancels one. If your lint job fails, a `waitsFor: ["lint"]` agent still runs and still costs money.
`requires` is `waitsFor` plus a gate on the outcome. The agent waits exactly the same way, and then runs **only if every prerequisite passed**. Otherwise it is skipped before the agent starts, so a run against a red build costs you nothing:
```yaml theme={null}
---
title: Security Review
requires:
- "lint"
- "ci / typecheck"
---
Review this diff for security issues...
```
Everything `waitsFor` supports, `requires` supports identically: the same name matching, the same `waitsForTimeout` (there is no separate timeout field), and the same `"*"` wildcard. The 10-entry limit counts distinct check names across both fields together:
```yaml theme={null}
---
title: PR Summary
requires:
- "*" # run last, but only if every other check passed
---
```
**Use both together**
`waitsFor` and `requires` are independent. A check named in either is waited for; a check named in `requires` must also pass. So you can wait for one thing and gate on another:
```yaml theme={null}
---
title: Flaky Test Triage
waitsFor:
- "integration-suite" # wait for it, whatever it reports
requires:
- "lint" # but don't spend anything unless lint passed
---
The integration suite's result is in your context. Triage any failures...
```
That is the common shape: you want a step's **result** in the agent's context regardless of how it ended, but you don't want to pay for the agent at all if something cheap and fundamental is broken. Prerequisite outcomes for *everything* waited on are passed to the agent (see [Prerequisite conclusions](#prerequisite-steps)), so waiting without gating is useful rather than merely permissive.
Naming the same check in both fields is fine and means exactly what it reads as: wait for it, and require it to pass. It is not an error and produces no warning.
You can also combine the wildcard with a named gate: "run last, but only if lint passed":
```yaml theme={null}
---
title: PR Summary
waitsFor:
- "*" # wait for every other check
requires:
- "lint" # but only run if lint passed
---
```
**What counts as passing**
`requires` uses GitHub's own definition, so it agrees with what your branch protection rules already do:
| Conclusion | Counts as passing? |
| - | - |
| `success` | Yes |
| `neutral` | Yes |
| `skipped` | Yes |
| `failure` | No |
| `cancelled` | No |
| `timed_out` | No |
| `action_required` | No |
| `stale` | No |
GitHub's branch protection documentation puts it directly: "Required status checks must have a `successful`, `skipped`, or `neutral` status before collaborators can make changes to a protected branch."
A **skipped** check passes. A conditional CI job that did not run for this PR, because a `paths:` filter did not match or an `if:` evaluated false, reports `skipped`, and GitHub lets that merge. Treating it as a failure would block your agent on jobs that were never meant to run.
**When a prerequisite fails**
The agent is skipped with a "Prerequisite check(s) did not pass" message naming each blocking check and how it ended:
```text theme={null}
This check requires the following CI step(s) to pass, but they did not:
- `ci / typecheck` โ failure
```
A required check that never appeared on the commit blocks too, and is listed as `not found on this commit`. The agent only runs when every required check is known to have passed.
To run the agent regardless of a step's outcome, put that step in `waitsFor` instead. The agent can then read and summarize a failure.
`.macroscope/approvability.md` accepts `waitsFor` only; `requires` there is ignored with a warning, because skipping the Approvability check when CI is red would remove the signal you rely on to decide whether a PR needs human review.
The correctness check accepts both, in `.macroscope/correctness/correctness.md`: see [prerequisite steps for correctness](/custom-instructions#prerequisites). It refuses `["*"]` and the name of any Macroscope check run, because correctness runs before all of them.
**Circular dependencies**
If agents form a dependency cycle (A waits for B, B waits for A), Macroscope detects it at parse time: `waitsFor` and `requires` form the same dependency graph, so a cycle built from either is caught the same way. Every agent in the cycle skips immediately with an error naming the cycle, so you get fast feedback instead of a silent timeout.
**`maxRuns`: run limits**
By default a Check Run Agent runs on every push to a pull request. Set `maxRuns` (a positive integer, e.g. `maxRuns: 3`) to cap how many times it runs on a single PR.
The limit is **per pull request**: each PR has its own independent count.
Once the cap is reached, later pushes still create the check run but immediately conclude it **skipped** with a "Maximum runs reached" message, so it stays visible in the Checks tab.
To run the agent again past the cap, comment `@macroscope-app review` on the pull request or re-run it from GitHub's Checks tab. Both deliberate paths bypass the cap.
Omitting `maxRuns` (the default), or setting it to `0` or less, means no limit. To turn a check off, remove its `.macroscope/*.md` file; `maxRuns: 0` does not disable it.
**`maxBudgetPerRun`: spend limits**
Set `maxBudgetPerRun` to limit runaway or degenerate behavior in a **single run** by your agent:
```yaml theme={null}
maxBudgetPerRun: 5
```
Fractional amounts work, so you can set the small caps those settings also allow:
```yaml theme={null}
maxBudgetPerRun: 0.05
```
The agent checks its accumulated cost after each turn and stops as soon as it reaches or exceeds the cap. The check run then concludes **neutral** with a "Budget reached" message, and the conclusion page reports what the run actually spent.
Because the agent stops mid-investigation, **its findings may be incomplete**: treat a budget-reached conclusion as "this run did not finish", not "this run found nothing". If an agent hits its cap regularly, either raise `maxBudgetPerRun` or narrow the check by adjusting your prompt so each run does less work.
Work already done when the cap is reached **is still billed**. The cap represents a boundary against future turns running; it does not make the work leading up to it free.
The limit is **per run**, not per pull request. An agent with `maxBudgetPerRun: 5` that runs three times on a PR may encounter the cap all three times.
**`maxBudgetPerPR`: this agent's total on one PR**
Set `maxBudgetPerPR` to cap what **this** agent may spend across all of its runs on a single pull request:
```yaml theme={null}
maxBudgetPerPR: 2.00
```
It is checked before a run is dispatched against what this agent has already recorded on the PR. Unlike `maxBudgetPerRun`, which stops an agent mid-investigation, this limit prevents another run from starting. The check run is created and concluded **skipped**, naming the budget.
The two compose: `maxBudgetPerRun` bounds any single run, `maxBudgetPerPR` bounds their sum on one PR. Both are best effort, and both are yours alone: neither is affected by what other agents in the workspace spend.
**A workspace-wide per-PR limit can also stop an agent**, independently of `maxBudgetPerRun` and `maxBudgetPerPR`. It totals the **combined** spend of every Check Run Agent on the PR and defaults to **\$100**. Once that total is reached, remaining automatic runs on the PR are created and concluded **skipped**, naming the limit.
Three things are worth knowing about it:
* **It is shared, so another agent's spend can stop yours.** Raising your agent's own `maxBudgetPerPR` will not clear a workspace limit that has already been reached: the two are separate ceilings and the first one reached wins.
* **It cannot be turned off.** The limit always has a value; the minimum is \$0.50. Admins change it in **Settings โ Billing โ PR review limits โ Check Run Agents**, independently of the Correctness caps. Those caps also cannot be turned off, but they are updated as a pair.
* **A deliberate invocation bypasses it.** Mentioning `@macroscope-app review` to run an agent yourself is not gated by the workspace limit; only automatic runs on a push are.
It is also best effort. Because an agent's cost is unknown until it finishes, the check compares spend already recorded and does not reserve or estimate. Agents dispatched concurrently can therefore take a PR past the limit by up to one round. See [The Check Run Agents per-PR limit](/pricing#cra-per-pr-limit).
The separate [Correctness per-PR cap](/pricing#per-pr-cap) does **not** stop agents. It totals only [Code Review](/bug-detection-and-fixes) spend, and agents are no longer gated on it.
Omitting `maxBudgetPerRun` (the default), or setting it to `0` or less, means no limit. The smallest cap that can be enforced is `0.00001` (\$0.00001); anything smaller but still positive is raised to it. Values above `100000` (\$100,000) are clamped down to that maximum. Either adjustment is noted as a warning on the check run's conclusion page.
`maxBudgetPerRun` is not supported with `input: code_object`. That mode runs one agent per changed code object, so a per-run cap would let a single check spend several times the amount you set. A check configured that way fails with a configuration error instead of running: switch to `input: full_diff`, `input: incremental`, or `input: pr_metadata`, or remove `maxBudgetPerRun`.
## What an Agent Remembers
An agent runs again on every push, so on an active pull request the same check may run a dozen times. Each run starts a fresh conversation with the model: but it is not told nothing. Before it looks at the change, it is shown what has already been said about the pull request, so that a re-run does not repeat itself and does not repeat you. None of this needs asking for in your instructions, and none of it costs the agent a tool call to go and fetch.
**What the author says the change does.** Every run carries the pull request's title and description, whatever [`input`](#input-modes) mode the check uses. This is where the author's declared intent lives โ the flag the change sits behind, the PR it has to land after, the migration it is half of โ and an agent that needs it no longer has to be instructed to go and read it.
It is author-supplied text, so the agent is told to treat everything in it strictly as data to weigh, never as instructions. A description cannot grant permission to skip a rule, and a claim made in one does not on its own suppress a finding the check's instructions require. A description longer than 16 KiB is cut at that point, and the agent is told it was cut.
**The discussion on the pull request.** Review threads the agent has commented on are carried into the prompt: its own comment, the replies underneath it, and whether the thread is currently resolved. Resolved and unresolved threads alike: an agent that saw only its outstanding comments would keep re-raising the ones you had settled. On a pull request where it has commented a great deal, the most recent of its threads are kept and the oldest are dropped; it is told how many comments are missing, so it never mistakes what it has for the whole discussion.
Replies give the agent context for its next run. If you explain that the behaviour is intended, the fix landed elsewhere, or the finding is wrong, the agent reads that answer and is instructed to account for it rather than restate the finding. Resolving the thread provides the same signal more briefly.
**Other people's comments too, when the agent has said little.** An agent that has posted only a handful of comments on a pull request also gets the most recent comments from everyone else: review-thread replies and pull-request comments, not pushes, labels or check statuses. That is the case where the surrounding discussion is worth more to it than its own short history. Once an agent has a substantial history of its own on a pull request, its own threads are what it is shown.
**Its own past actions.** Separately, an agent is shown a log of the stateful actions it took on previous runs: comments posted, Slack messages sent, labels and reviewers added, threads resolved, comments minimized. This covers the actions that leave no comment behind, and it is only recorded for runs where the agent actually did something.
All of this comes from what Macroscope has already recorded about the pull request, rather than from a live read of GitHub.
Comments Macroscope cannot see are comments the agent cannot read. Comments deleted from the pull request are excluded, and a very long comment may be shortened. When that happens, the agent is told the comment was cut, so it knows not to treat the excerpt as the whole argument.
## Context Window
On every run, an agent's prompt carries your instructions in full, including every file they [import](#importing-files). It also contains the PR context, the schemas for the check's tools, [what the agent remembers](#what-an-agent-remembers) about the pull request โ including its title and description โ and either the PR diff or its commit messages, depending on [`input`](#input-modes). All of it must fit the context window of the model named in the check's front matter.
There is no fixed KB cap on any of it. Macroscope sizes each part against the window of the model you selected, after measuring everything else the prompt carries, so the same pull request can have its diff inlined on a large-window model and left out on a smaller one. Three things follow from that.
**A diff that doesn't fit is left out whole, not truncated.** The check still runs. The agent is told that a diff exists and why it isn't in the prompt. Either the diff was larger than the remaining space, or the rest of the prompt filled the window so no diff could fit. If the check has `git_tools`, the agent is also told that `git_diff` reads changes for specific paths. A diff cut off partway can look complete while saying something else, which is worse for the agent than no diff.
**A conversation that doesn't fit loses whole threads.** The agent keeps its own threads before everyone else's and recent discussion before older discussion. Each thread is carried whole because a finding without the reply that answered it is worse than omitting the finding. One long thread is skipped instead of blocking shorter threads behind it, so a single enormous comment cannot consume the rest of the discussion. The agent is told how many comments are missing. If none of the conversation fits, it is told that too instead of seeing a pull request that appears to have no comments. The same rule applies to its activity log: whole runs are dropped from the oldest end, and the count is always disclosed.
**A commit log that doesn't fit loses its oldest entries.** [`pr_metadata`](#input-modes) fetches at most the 50 most recent commit messages. If they do not all fit, the oldest are dropped until the rest fit, and the agent is told how many are missing. A check reasoning over "the commits in this PR" therefore cannot silently reason over only a suffix. If the log cannot be read at all, the agent is told that too; an unreadable log is not the same as a PR with no commits.
**When a check runs out of window**
A check can run out of window in two different ways: the request does not fit even with the diff omitted and the commit log trimmed, or it started comfortably and the conversation outgrew the window as the agent worked and its tool results accumulated. Both conclude **skipped**, titled **"Prompt too large for the selected model"**. Skipped rather than failed: this is a configuration problem to fix, and blocking merges on it does not help you fix it.
The conclusion page tells you which happened, because they bill differently:
| What the conclusion page says | Billing |
| - | - |
| The check was skipped before it ran | Nothing is billed |
| The check stopped partway through | The work it completed is billed as usual |
Two things change the outcome:
* **Select a model with a larger context window** with `model:` in the check's front matter. This is usually the smallest change: see [Models](/model-pricing#available-models).
* **Shorten the check's instructions, or narrow what they ask for.** Instructions are carried in full on every run and are never trimmed automatically. A check that asks for less investigation also accumulates less context as it works, which matters when a check stops partway through.
Narrowing `include`/`exclude` does not shrink a `full_diff` prompt. Those patterns decide whether the check runs on a pull request and which files it should focus on; the diff it inlines is the PR's whole diff either way.
## Tools
**Included by default**
| Tool | What it does |
| - | - |
| `browse_code` | Explore the file tree, read files, search by filename or content |
| `git_tools` | Git log, blame, diff, grep |
| `github_api_read_only` | Read-only GitHub API: issues, labels, PR metadata, commit statuses |
| `modify_pr` | Update the PR (title, description, labels, assignees, reviewers), post line-level review comments, and post conversation-level comments on the PR |
Specifying `tools:` in frontmatter overrides the defaults. To keep defaults and add more, list them all. Each check run's conclusion page shows an ordered log of the agent's tool calls; set `showToolCalls: false` in frontmatter to hide it.
**Additional tools**
| Tool | Requires | What it does |
| - | - | - |
| `web_tools` | No connection needed | Search the web, fetch URLs |
| `slack` | Slack connected | Post messages to channels, look up users |
| `sentry` | Sentry connected | Search error issues, view event history |
| `posthog` | PostHog connected | Query analytics, feature flags, session recordings |
| `launchdarkly` | LaunchDarkly connected | Query feature flags, targeting rules |
| `bigquery` | BigQuery connected | Run read-only SQL queries |
| `amplitude` | Amplitude connected | Event segmentation, funnels, retention |
| `gcp_cloud_logging` | GCP connected | Query log entries by severity, resource, timestamp |
| `issue_tracking_tools` | Jira or Linear connected | Read issues and projects |
| `image_gen` | No connection needed | Generate images from text prompts and upload them to GitHub or Slack |
| `mcp` | MCP server connected | Invoke tools from any connected MCP server |
Connected tools require the integration in **Settings > Connections**. Missing connections are silently disabled.
Choose which model powers your agent, tune `reasoning` and `effort`, and see how a run is billed.
The shared model list and per-token rates every Macroscope feature bills against.
## Output
Results appear in three places:
1. **Check run details.** Click into the check in the Checks tab to see the full report: title, summary, and detailed findings. Your instructions influence how this output is structured and formatted.
2. **Inline PR comments.** The agent posts comments directly on specific lines in the PR diff, attributed to the check name.
3. **Conversation comments.** The agent can also post top-level comments in the pull request's conversation, for broader findings or summaries that do not belong on one line.
Both kinds of PR comment come from the [`modify_pr`](#tools) tool, which is included by default. An agent whose `tools:` list leaves `modify_pr` out reports in the check run details only: it cannot comment on the pull request.
## Instructions
**Controlling output format**
You can control formatting in your instructions. Some examples:
* "Use a markdown table with columns: file, line, issue, severity"
* "Group findings by priority, critical first"
* "Use ๐ด ๐ก ๐ข emoji for severity levels"
* "Start with a one-line summary, then list details"
* "If no issues found, just say 'All clear' with no extra detail"
* "Format as a checklist so the reviewer can tick items off"
* "Be concise. Each bullet point should be under 20 words"
**Writing good instructions**
* **Be specific.** "Review for quality" is too vague. "Flag any function over 50 lines without a doc comment" is actionable.
* **Define severity.** Spell out what critical vs minor means for your team.
* **Don't replicate the Correctness check run.** It already catches runtime bugs. Focus on your team's conventions and workflows.
* **Scope with `include`, `exclude`, or both.** If your check only applies to Go files, use `include: ["*.go"]`. If it applies to everything except lock files, use `exclude: ["*.lock"]`. Use both together to narrow to a set of files while carving out exceptions (e.g. `include: ["src/**"]` + `exclude: ["src/gen/**"]`).
* **Give the agent permission to do nothing.** "If nothing applies, report that no issues were found" prevents invented findings.
* **Use sections in your instructions.** Markdown headings (`##`) in the body help the agent organize its work and output.
* **Reference specific paths.** "Check files in `services/auth/`" is better than "check auth code."
* **Tell it what not to flag.** "Ignore test files" or "don't flag TODOs in draft PRs" reduces noise.
* **Don't paste your standards in.** If a standard already lives in a file in your repo, embed that file with `@path/to/file.md` instead of copying it. See [Importing Files](#importing-files).
## Importing Files
Your instructions can embed another file from your repository by writing `@path/to/file.md`. The file's contents are spliced in exactly where the directive appears, so the agent reads them as part of its instructions.
This is the same syntax Claude Code uses for `CLAUDE.md` imports, so standards you already reference that way work here unchanged.
```md theme={null}
---
title: Go Review
---
Review this diff against our Go standards:
@/docs/standards/go.md
Flag only violations of the standards above. Ignore style nits they don't mention.
```
Use it to keep one source of truth. A standard that lives in `docs/`, a `CLAUDE.md`, or a team playbook can be embedded by several agents at once, and editing that file updates every agent that imports it: no copy-paste to keep in sync.
Imports are expanded in the body only, not in frontmatter. The imported file's own frontmatter (if it has any) is stripped, so only its content reaches the agent.
### How paths resolve
A path resolves **relative to the directory of the file the directive is written in**: the same rule Claude Code uses. Starting the path with `/` resolves it from your repository root instead, which is usually what you want from an agent file nested in `.macroscope/check-run-agents/`.
From an agent at `.macroscope/check-run-agents/go-review.md`:
| Directive | Resolves to |
| - | - |
| `@/docs/standards/go.md` | `docs/standards/go.md` (repository root) |
| `@/CLAUDE.md` | `CLAUDE.md` |
| `@shared-rules.md` | `.macroscope/check-run-agents/shared-rules.md` |
| `@rules/naming.md` | `.macroscope/check-run-agents/rules/naming.md` |
| `@../../docs/standards/go.md` | `docs/standards/go.md` (same as the first, the long way) |
Any file type works: `.md`, `.txt`, a config file, a code sample. The contents are inserted as text.
### What is not an import
A directive is only recognized when the path is **path-structured**: it contains a `/` or a file extension. That keeps ordinary prose and code from being mistaken for imports:
* **Bare words are left alone.** `@Override`, `@Test`, `@param`, `@dataclass`, `@property`, and handles like `@macroscope-app` are not imports.
* **An `@` inside a word is left alone.** `support@yourcompany.com` stays an email address.
* **Code is never expanded.** A directive inside backticks (`` `@docs/style.md` ``) or a fenced code block is left as written, so you can quote the syntax or include a diff without triggering an import.
### Nesting
An imported file can import others, up to **4 hops** from the agent file. Each file's directives resolve relative to *its own* directory, so `docs/standards/all.md` can pull in its neighbours with `@go.md` and stay correct no matter which agent imports it:
```md theme={null}
Follow every standard below.
@typescript.md
@go.md
@testing.md
```
Import cycles are detected: if a file imports something that imports it back, the cycle is reported rather than expanded.
### Limits
| Limit | Value |
| - | - |
| Nesting depth | 4 hops |
| Imports per agent prompt | 50 |
**There is no size cap on what you embed.** You can import a complete contract, style guide, or compliance policy, and it is included in full. The selected model's [context window](#context-window), measured against the assembled prompt, determines whether the check runs, just as it does for the diff and commit log. A prompt too large for its model is skipped with a conclusion that explains the problem and what to change.
### When an import can't be expanded
**The agent still runs.** An import that can't be expanded is left in the prompt as literal text, and the reason appears as a warning on the check run's conclusion page: a broken path never costs you the review. Repeated problems are reported once, not per occurrence.
That covers a path that doesn't exist, a cycle, nesting past 4 hops, and more than 50 imports. If a check's output looks like it's missing a standard you expected, the conclusion page is the place to look.
### Which commit files come from
Imported files are read from the same commit as the agent file itself: the most recent commit on the pull request. Editing an imported standard takes effect on the PR that edits it, and on other PRs once the change is merged and their branches include it: exactly like editing the agent file.
Paths must stay inside the repository, and paths under `.git` cannot be imported. Symbolic links are not followed: a path is resolved literally.
## Example
Consolidate related rules into one check rather than many files. This web team example handles several concerns in one agent, saved as `.macroscope/check-run-agents/web-review.md`:
```md theme={null}
---
title: Web Review
model: claude-opus-5-5
effort: medium
input: full_diff
tools:
- browse_code
- git_tools
- modify_pr
- slack
- sentry
include:
- "targets/app/**"
- "web-etc/**"
---
Review this PR against our web team's standards:
## Event Tracking
If this PR touches payment flows, signup funnels, analytics calls,
CTA buttons, or redirect logic, check whether it could break event
tracking. Rate each issue: ๐ด will stop firing, ๐ก may fire incorrectly,
๐ข low risk.
## Accessibility
Check new or modified React components for basic accessibility:
- Images must have alt text
- Buttons and links must have accessible labels
- Form inputs must have associated labels
## Production Errors
For each file modified, check Sentry for unresolved issues. If any
active errors exist, list them with frequency and last seen date.
## Labels
Add labels to this PR based on what changed:
- "frontend" if any UI components are modified
- "styles" if CSS or styled-components changed
- "docs" if only markdown files changed
## Notifications
If any ๐ด/๐ก event tracking issues or accessibility violations are
found, post a summary to #eng on Slack with the PR link.
If nothing noteworthy is found, report that all checks passed.
```
## Migrating
**From the `.macroscope/` root to the subfolder.** If you have check run agent files in the root `.macroscope/` directory, move them into the `check-run-agents/` subfolder:
```bash theme={null}
mkdir -p .macroscope/check-run-agents
mv .macroscope/web-review.md .macroscope/check-run-agents/
# Repeat for each check run agent file. Do not move approvability.md or ignore.
```
Nothing else changes. The format and frontmatter are identical. The move takes effect in the PR that makes it and on other PRs once they include it. `approvability.md` and `ignore` are not check run agent files; leave them in the `.macroscope/` root.
**From Custom Rules.** Check Run Agents replace Custom Rules. Move an existing `macroscope.md` file's rules into `.macroscope/check-run-agents/my-rules.md`; they become the instructions body, and you can optionally add frontmatter for model, tools, and input mode.
They go further, too: agents can browse the codebase, query git history, post to Slack, check Sentry, and more, with structured output in the Checks tab instead of just inline comments.
Looking for model options or cost controls? See [Model Selection & Costs](/check-run-agents/costs), and [Models & Token Pricing](/model-pricing) for the shared rate table.
# Model Selection & Costs
Source: https://docs.macroscope.com/check-run-agents/costs
Pick the model behind a Check Run Agent, tune reasoning and effort, and see how a run is billed
Every [Check Run Agent](/check-run-agents) runs on a model you choose in its front matter. This page covers how to select one, how `reasoning` and `effort` behave on an agent, and how a run is billed. The model list and the per-token rates live on [Models & Token Pricing](/model-pricing).
## Pricing structure
Check Run Agents bill in Agent Credits based on what the run's model calls cost. The underlying token rates are the [raw model rates](/model-pricing#pricing), which are the same everywhere they are used; this page covers what Check Run Agents add on top. `claude-opus-5-5` is the default when no model is set.
A Check Run Agent's usage is billed in credits: **raw model cost + 5% markup**, then รท \$0.01 per credit (1 credit = \$0.01).
## Choosing a Model
Set `model:` in your front matter to choose which model powers the agent. Any model in the [shared model list](/model-pricing#available-models) can be used.
The default model is `claude-opus-5-5`.
If you omit `model:`, the agent uses the default (`claude-opus-5-5`). If you set `model:` to a value Macroscope doesn't recognize (or a deprecated one), the check run completes as `skipped`, neither passing nor failing, with a "model is not available on Macroscope" message on its details page. It never silently falls back to a default.
## Managing Costs
To keep costs down: use `include`/`exclude` or [`.macroscope/ignore.md`](/bug-detection-and-fixes#macroscope-ignore) to scope to relevant files, use [`incremental`](/check-run-agents#input-modes) for non-blocking checks that should avoid re-reviewing unchanged files on every push, prefer `full_diff` over `code_object`, use [`pr_metadata`](/check-run-agents#input-modes) for checks that only judge the PR's title, labels, description, or commit messages, and use lower `effort` for simple checks.
Cost information is available in two places:
* **Settings โ Billing**: Admins can see a full cost breakdown across all Check Run Agents.
* **GitHub Check Run details page**: Shows the billed total for each individual run, plus the token usage behind it.
### Reading the billing footer
Every Check Run Agent's details page ends with what the run cost and what it consumed:
> **Agent Credits:** 44 credits
>
> **Token usage:** 2 uncached input ยท 0 cache-read input ยท 44,885 cache-write input ยท 5,534 output
The four figures cover the whole run: every model call the agent made, including the nested ones its research tools make on its behalf. They do not overlap, so each token is counted once:
| Metric | What it counts |
| - | - |
| **Uncached input** | Prompt tokens the model read fresh, with no cache involved. |
| **Cache-read input** | Prompt tokens the model reused from the provider's prompt cache instead of re-reading. |
| **Cache-write input** | Prompt tokens written into the provider's prompt cache so later calls in the same run can read them back. |
| **Output** | Everything the model generated, including any reasoning tokens. |
You are billed in Agent Credits, not per token: these figures are what the run consumed, not four separate charges.
**Two different caches, and only one of them makes a run free.**
**Provider prompt caching** is what **cache-read** and **cache-write** measure. The model still runs, so the run still costs Agent Credits: caching just makes it cost fewer of them. This happens within a single run, turn to turn.
**Macroscope response reuse** is separate. When a check runs again over work it has already reviewed, Macroscope can reuse the complete stored result instead of calling the model at all. Nothing is metered, so the run costs **0 credits** and the details page says the result was reused rather than showing token figures. Re-running the check from GitHub forces a fresh review.
Agent Credits can also include charges from tools that bill per call rather than per token: web research, for instance. Those add to the credits total without appearing in any of the four token figures, and the footer says so when they apply.
# CLI
Source: https://docs.macroscope.com/cli
Run Macroscope locally from your editor or terminal and fix issues before you push
## Install
```bash theme={null}
curl -sSL https://raw.githubusercontent.com/prassoai/macroscope-local/main/install.sh | bash
```
The installer:
* Installs `macroscope`
* Adds it to your shell `PATH`
* Installs the Macroscope plugin for supported local setups of Claude Code, Codex, Cursor, and OpenCode
* Starts the setup wizard so you can sign in and choose a workspace
If your agent was already open, relaunch it after installation so the Macroscope command appears.
## Use the Agent Plugin
Use the Macroscope plugin from inside your coding tool:
```text theme={null}
Claude Code: /macroscope:codereview
Codex: $macroscope:codereview
Cursor: /codereview
OpenCode: /macroscope-codereview
```
This is the local review flow. It is **report-only**: it tells you what it found and leaves your files alone, so you see findings before you commit. Ask your agent to fix something, or use [loop mode](#run-the-autopilot-loop), when you want edits.
Your agent will:
* start a Macroscope review on the current branch
* watch for findings as they arrive
* explain each issue in plain language
* validate whether the issue is real
* ignore false positives
* report the confirmed issues by severity, with file and line
Invoke the command directly or ask your agent to use Macroscope on the current branch.
## Run the Autopilot Loop
If you want a more hands-off pass, use the loop variant:
```text theme={null}
Claude Code: /macroscope:autoloop
Codex: $macroscope:autoloop
Cursor: /autoloop
OpenCode: /macroscope-autoloop
```
Loop mode runs a local-only review-and-fix cycle. Your agent reviews the branch, fixes confirmed issues directly in your working tree, commits the fixes, then re-reviews to catch regressions: up to five iterations or until a clean pass.
Add `--isolate` to run the loop in a separate worktree instead of your working tree. Your checkout stays untouched, and the agent verifies the resulting patch against its latest state before giving you `git apply` instructions.
Loop mode is entirely local. It does not interact with GitHub, open PRs, or wait for remote checks. Use it when you want Macroscope to keep driving instead of stopping after a single review pass.
## Run from the Terminal
Run Macroscope with no arguments for the guided terminal experience:
```bash theme={null}
macroscope
```
For direct control without the guided wizard, use `codereview`. You can review the current repository or pass another repository path:
```bash theme={null}
macroscope codereview --base main
macroscope codereview /path/to/repo --base staging
```
If you omit `--base`, Macroscope automatically detects the comparison base.
### Detection Mode
A CLI review runs in **Balanced** [Detection Mode](/bug-detection-and-fixes#detection-mode) unless you choose another one:
```bash theme={null}
macroscope codereview --mode precise
```
Accepted values are `balanced`, `budget`, `precise`, and `ultra`. An unrecognized value is rejected before the review starts: a typo never silently runs, or bills, a mode you didn't ask for. Choosing a mode requires Detection Modes to be enabled for your workspace.
### Review location and isolation
By default, a review reads a **frozen snapshot** of your branch, including committed changes and your current work in progress, in a temporary worktree under a private per-user directory in your OS temp location. Your own working tree is never touched, and you can keep editing while the review runs without changing what it sees.
The worktree is removed when the review exits. A worktree left behind by a run that was killed or crashed is cleaned up by a later review, so they don't accumulate.
```bash theme={null}
# Isolated snapshot (default; removed on exit)
macroscope codereview
# Review the live working tree instead
macroscope codereview --isolate=false
# Keep the worktree after the review
macroscope codereview --keep-worktree
# Put worktrees somewhere else
macroscope codereview --worktree-dir /tmp/my-reviews
```
`--keep-worktree` and `--worktree-dir` each imply `--isolate`. An explicit `--isolate=false` wins over both and reviews the live working tree.
### Review flags
| Flag | Behavior |
| - | - |
| `--base ` | Choose what to compare against. The base is auto-detected when omitted. |
| `--mode ` | Run the review in a specific [Detection Mode](/bug-detection-and-fixes#detection-mode). Defaults to Balanced. Requires Detection Modes to be enabled for your workspace. |
| `--isolate` | Review a frozen snapshot in a temporary worktree. On by default; pass `--isolate=false` to review the live working tree. |
| `--keep-worktree` | Preserve the review worktree and its branch after the review exits. Implies `--isolate`. |
| `--worktree-dir ` | Parent directory for isolated worktrees. Implies `--isolate`. Defaults to a private per-user directory in your OS temp location. |
| `--interactive` | Force the full-screen review interface. This is the default when stdin and stdout are terminals. |
| `--raw` | Skip the interface and stream machine-readable issue records to stderr. |
| `--debug` | Include verbose progress and diagnostic logging. |
| `--tui` | Alias for `--interactive`. |
`--in-place` is the deprecated spelling of `--isolate=false`. It still works, but use `--isolate=false` in new scripts.
Run `macroscope --help` for the complete command overview or `macroscope codereview --help` for review-specific examples and flags.
### Setting your own defaults
Set defaults for the isolation flags in `~/.macroscope/config.yaml`:
```yaml theme={null}
codereview:
isolate: true
keep_worktree: false
worktree_dir: /tmp/my-reviews
```
`MACROSCOPE_WORKTREE_DIR` sets the worktree directory too. Settings resolve in this order: **flags, then environment variables, then the config file, then the built-in defaults.**
A saved `worktree_dir` or `keep_worktree: true` implies isolation, so it overrides `isolate: false` in the same file: those settings only mean something in a worktree. To review the live working tree while keeping them, pass `--isolate=false` on the command line; an explicit flag beats the whole config.
### Machine-readable output
Use `--raw` for a blocking, wizard-free review:
```bash theme={null}
macroscope codereview --base main --raw
```
Macroscope first emits a stable `review_session_id=...` token, then writes line-oriented `issue_event=` records to stderr as findings arrive. With `--keep-worktree` it also emits `review_worktree=...`, the absolute path of the worktree the review ran in. At the terminal state, it emits a per-attempt `review_id=...` and `issue_status=completed` or `issue_status=failed`, so automation can track the run from startup through completion.
Raw mode is a streaming protocol, not a single JSON document. To collect only the issue payloads as a JSON array, use:
```bash theme={null}
( set -o pipefail
macroscope codereview --base main --raw 2>&1 \
| awk 'sub(/^issue_event=/, "")' \
| jq -s '.' )
```
The `pipefail` subshell matters: without it the pipeline reports `jq`'s status, so a review that failed or needs an update looks like a success. With it, the exit code is Macroscope's, and a run with no findings still prints a valid empty `[]`.
### Exit codes
| Code | Meaning |
| - | - |
| `0` | The review completed. Findings do not change the exit code: read the `issue_event=` records to decide what to do about them. |
| `1` | The review did not complete: sign-in, network, repository, or workflow failure. |
| `42` | A required CLI update was not applied. Run `macroscope update`, then rerun the review. |
### Other commands
| Command | What it does |
| - | - |
| `macroscope setup` | Sign in and pick a workspace |
| `macroscope login` / `macroscope logout` | Sign in, or clear the stored session |
| `macroscope me` | Print the signed-in user and selected workspace as JSON. Exits non-zero when you're not signed in. |
| `macroscope update` | Update to the latest release |
| `macroscope uninstall` | Remove the CLI and its local state. Add `--reinstall` to install a fresh copy right after. |
## Excluding Files from Review
CLI reviews honor the same [`.macroscope/ignore.md`](/bug-detection-and-fixes#macroscope-ignore) file as reviews on GitHub, so a local review covers the same files your PR review would. Ignored files are left out of the review and out of what the review costs.
* **No ignore file?** Macroscope's built-in defaults apply: vendored dependencies, generated code, binaries, and test files.
* **Have one?** Its patterns replace the defaults, exactly as on GitHub. The [`ignoreTests: false`](/bug-detection-and-fixes#reviewing-your-test-code) front matter works locally too.
* **Where it's read from.** The ignore file is read from the most recent commit on the branch you're reviewing, not from your working tree. A PR review of that branch reads it from the same place. A rule you commit therefore applies to your next local review, while an uncommitted edit does not change what a review covers, just as an unpushed edit does not change what a PR review covers.
* **Binaries and other unreviewable file types** are always excluded, even when your own ignore file omits them.
If every changed file is ignored, the review finishes successfully with nothing to report:
```text theme={null}
All changed files are excluded by ignore rules - nothing to review
```
That is a clean, empty review rather than a failure: no action needed.
## Typical Workflow
1. Install Macroscope and complete setup.
2. Open your repo in Claude Code, Codex, Cursor, or OpenCode.
3. Run the Macroscope command for your host.
4. Let your agent work through findings locally before you push.
5. Use loop mode when you want a longer unattended pass.
## Signing in on Linux without a keyring
Macroscope stores your session in your operating system's credential service: the Secret Service over the session D-Bus on Linux (GNOME Keyring, for example). A desktop session with that service needs no extra setting.
On a Linux host with no credential service, such as a server, SSH session, or container, setup offers file-based storage instead. Only an explicit yes writes `credential_store: file` to `~/.macroscope/config.yaml` so later commands work without any exports. Decline and Macroscope prints Secret Service setup guidance and exits; it never installs or configures a keyring for you.
To choose file storage up front, or for a non-interactive setup that never prompts, set the environment variable before you sign in:
```bash theme={null}
export MACROSCOPE_CREDENTIAL_STORE=file
macroscope setup
```
With file storage your token is written **unencrypted** to `~/.macroscope/credentials`, with directory mode `0700` and file mode `0600`. Protect your home directory and its backups accordingly.
The environment variable wins over the saved preference. Set it to `keyring` to use the OS credential service regardless of what's in your config, and remove the `credential_store` preference to return to the OS default. The only accepted values are `keyring` and `file`; anything else fails immediately instead of partway through sign-in. There is no silent fallback or migration between the two. Switching stores picks up an existing session for that account in the selected store or asks you to sign in if one does not exist. `macroscope logout` only clears the currently selected store. Log out before switching if you want to remove the old store's session.
## Troubleshooting
| Issue | What to do |
| - | - |
| `command not found: macroscope` | Restart your terminal, then check that `~/.local/bin` is on your `PATH` |
| The Macroscope command does not appear in your agent | Relaunch the agent after installation |
| You need to sign in again | Run `macroscope` and complete setup |
| You need to switch workspaces | Run `macroscope` and choose the correct workspace |
| A direct review changed files in your working tree | Reviews are isolated by default; drop `--isolate=false` to review a snapshot in a worktree instead |
| `not a git repository` | Run the review inside a repository, or pass one: `macroscope codereview /path/to/repo` |
| Sign-in fails with no credential service available | You're on a Linux host without a keyring: [choose file-based credential storage](#signing-in-on-linux-without-a-keyring) |
To wipe your local Macroscope install and start over, run `macroscope uninstall --reinstall`.
## Pricing
CLI code reviews consume agent credits. Admins can view usage details in the [Billing](https://app.macroscope.com/settings/billing) dashboard under Agent Credit Usage.
CLI reviews are billed as agent credits from the review's actual model usage plus markup: not per KB, and no Detection Mode carries its own per-KB rate on the CLI. The mode still changes what a review costs, because each one does a different amount of model work: the same diff generally costs least in Budget and most in Ultra, with Balanced and Precise in between. That is the same ordering as the [per-KB rates for PR reviews](/pricing#code-review), but on the CLI the charge always follows what the review actually used.
Each CLI review's Detection Mode appears next to its charge under **Settings โ Billing โ CLI Reviews**, so you can compare modes on your own changes. Reviews that ran before Detection Modes launched show **โ**.
Admins can cap CLI review spend for the whole workspace and per developer under **Settings โ Billing โ CLI Spend Controls**. [Learn more about CLI review limits](/pricing#cli-review-limits).
| Message | What to do |
| - | - |
| `Your workspace has reached its monthly CLI review spend limit.` | Ask a workspace admin to raise the workspace limit in billing settings, then rerun the review |
| `You've reached your monthly CLI review spend limit.` | Ask a workspace admin to raise your per-user limit in billing settings, then rerun the review |
# Commit Summaries
Source: https://docs.macroscope.com/commit-summaries
Searchable feed of all commit activity across repositories
The **Commits** tab shows a chronological, filterable, searchable feed of all commit activity across your repos. Each commit includes a plain-language summary, estimated coding effort, and GitHub metadata. Use semantic search to find commits by topic or keyword.
Connect [Jira](/integrations#jira) or [Linear](/integrations#linear) to enrich summaries with issue context. Macroscope uses the code change to explain the *what* and *how*, and draws from your issue tracker for the *why*.
Toggle **Summarize Commits** per repo in **Settings โ Repos**, or for newly linked repos under **Defaults**. New workspaces start with that default off.
# Contact Us
Source: https://docs.macroscope.com/contact
You can reach us at [support@macroscope.com](mailto:support@macroscope.com), or for a quicker response, send us a message through [our shared Slack channel](/hit-the-ground-running#set-up-a-slack-channel-with-the-macroscope-support-team).
Schedule a setup session
Get help directly via email
SLA: You can expect a reply within 24 hours but in most cases you'll hear from us much sooner!
To report a security vulnerability, please visit our [Bug Bounty](/bug-bounty) page.
# Custom Instructions
Source: https://docs.macroscope.com/custom-instructions
Extend Macroscope's correctness review with your team's domain expertise, committed to your repo and scoped to the files that matter.
Extend Macroscope's default correctness check with context to improve precision and avoid false positives. Custom correctness instructions teach our core code review what's idiomatic, intentional, or off-limits in your codebase, so it flags real issues and stays quiet on patterns it would otherwise misread.
Drop markdown files into `.macroscope/correctness/`, optionally scope them with glob patterns, and your team's domain knowledge is folded into the same correctness review you already get.
## File layout
Create one or more markdown files inside `.macroscope/correctness/` at the root of your repo:
```
.macroscope/
โโโ correctness/
โโโ configuration-principles.md
โโโ transaction-invariants.md
โโโ auth-propagation.md
```
Subdirectories are walked recursively, so you can organize instructions by team or service: useful in monorepos:
```
.macroscope/
โโโ correctness/
โโโ shared-principles.md
โโโ backend/
โ โโโ transaction-invariants.md
โโโ frontend/
โโโ accessibility-rules.md
```
Nesting is purely organizational. A file's location does not affect which changes it applies to: that is controlled entirely by the `include`/`exclude` front matter. Only `*.md` files are read; any other files (and `README.md`) are ignored.
Instruction files work like any other code change. Macroscope reads them from the most recent commit on the pull request, so pushing a new or edited instruction to a PR takes effect on that PR right away: useful for tuning an instruction before the rest of your team gets it. Other open PRs pick it up once the change is merged and their branches include it. Pull requests from external forks always read instructions from your default branch.
## Front matter
Custom correctness instruction files support YAML front matter with the following fields:
| Field | Type | Description |
| - | - | - |
| `include` | `string[]` | Glob patterns matching files these instructions apply to. If omitted, the instructions apply to all files reviewed. |
| `exclude` | `string[]` | Glob patterns matching files these instructions should not apply to. Evaluated after `include`. |
If both `include` and `exclude` are omitted, the instructions apply globally to every file Macroscope reviews in the repo.
These two fields apply per file and control only that file's instructions. The fields that govern when the correctness **check run** starts, and whether it starts at all, live in one designated file instead. See [Prerequisite steps](#prerequisites).
## Example
`.macroscope/correctness/configuration-principles.md`:
```markdown theme={null}
---
include:
- "**/*.go"
- "**/config/**"
exclude:
- "**/*_test.go"
- "**/testdata/**"
---
**Configuration principles.** Configuration must be explicit. No empty-string-means-default. No silent fallbacks. If a required value is missing, fail fast and loud at startup โ not silently at runtime with an infinite hang or mysterious behavior. One source of truth for each config value, threaded through explicitly. Misconfiguration is a bug, and bugs must be caught as early as possible.
**No backwards compatibility.** This product is pre-release and in active development, never require dual-support, deprecation warnings, migration code, proto reservations or fallback paths. When something changes, change it everywhere. Break the old way. Delete the old code. Build forward.
```
In this example, the rules apply to all Go files and anything under a `config/` directory, but skip tests and test fixtures. When Macroscope reviews a change that touches a matching file, these principles are folded into the correctness review automatically.
Front matter is optional. A correctness instruction file with no front matter applies to every file in the repo.
## How matching works
For each file changed in a pull request, Macroscope walks `.macroscope/correctness/` and includes the contents of every instruction file whose `include`/`exclude` patterns match that file's path. Multiple instruction files can apply to the same file: they stack. If no instruction file matches, the correctness review behaves exactly as it does for repos without custom instructions.
## Prerequisite steps
By default, the correctness check starts as soon as your pull request is pushed, in parallel with the rest of your CI. You can instead have it wait for specific CI steps and skip entirely unless they pass.
### The governing file
`.macroscope/correctness/` holds as many instruction files as you like, but there is only **one** correctness check run. A field like "wait for the lint job" has no meaning spread across five files that might disagree, so Macroscope reads it from exactly one:
```
.macroscope/
โโโ correctness/
โโโ correctness.md โ governs the check run
โโโ security-rules.md
โโโ backend/
โโโ transactions.md
```
`.macroscope/correctness/correctness.md`, at the top level of the directory and spelled exactly that way, is the governing file. Its front matter configures the whole correctness check:
| Field | Default | Values | Description |
| - | - | - | - |
| `waitsFor` | none | Check run names (up to 10 entries) | CI steps that must **complete** before correctness runs |
| `requires` | none | Check run names | CI steps that must **pass** before correctness runs: otherwise it is skipped without reviewing. Shares the 10-entry limit with `waitsFor` (10 distinct names across both) |
| `waitsForTimeout` | `20` | `1` to `30` (minutes) | How long to wait for prerequisites to **finish** before skipping. Applies to `waitsFor` and `requires` alike |
| `waitsForDiscoveryTimeout` | `1` (60 seconds) | `1` to `30` (minutes) | How long to wait for a prerequisite to **appear** on the commit before treating it as absent. Raise this when a step is published conditionally or late |
Every other file in the directory keeps its `include`/`exclude` patterns and its instructions, and `correctness.md` keeps those too: it is an ordinary instruction file that additionally carries the configuration. Writing any of the four fields above in a different file does nothing, and Macroscope warns on the check run page rather than leaving you to guess.
So the governing file is not a config-only file. If one file is all you need, put everything in it:
```markdown theme={null}
---
requires:
- build
include:
- "**/*.go"
exclude:
- "**/*_test.go"
---
**No backwards compatibility.** This product is pre-release and in active development, never require dual-support, deprecation warnings, migration code, proto reservations or fallback paths. When something changes, change it everywhere. Break the old way. Delete the old code. Build forward.
```
That waits for `build` to pass before reviewing, and applies the same rule to Go files outside tests: one file, both jobs. A body is optional too: a `correctness.md` with only front matter configures the check and instructs nothing.
### Waiting and gating
`waitsFor` orders; `requires` orders **and** gates.
```markdown theme={null}
---
requires:
- build
- ci / test
waitsFor:
- "Integration Suite"
---
**No backwards compatibility.** This product is pre-release and in active development, never require dual-support, deprecation warnings, migration code, proto reservations or fallback paths. When something changes, change it everywhere. Break the old way. Delete the old code. Build forward.
```
Here correctness waits for all three steps and reviews only if `build` and `ci / test` passed. If either failed, the check is skipped before any review is dispatched, so a review against a broken build costs you nothing. The Integration Suite is waited for but not gated on; its outcome does not determine whether the review happens.
The names must match the check run names exactly as they appear on your PR's **Checks** tab. `requires` uses GitHub's own definition of passing: `success`, `skipped`, and `neutral`. These are the same three conclusions that satisfy a required status check on a protected branch.
### When a prerequisite doesn't arrive
| Situation | What happens |
| - | - |
| A prerequisite never appears within the discovery window (60 seconds by default) | Correctness is skipped with a "not found" message. Check the name against the Checks tab; if the step is real but published late, raise `waitsForDiscoveryTimeout`. |
| A prerequisite doesn't finish within `waitsForTimeout` | Correctness is skipped with a "timed out" message. Raise `waitsForTimeout` if the step is genuinely slow. |
| A `requires` prerequisite finishes without passing | Correctness is skipped, with a message naming the check and its conclusion. |
The discovery window is always capped at `waitsForTimeout`: it is a slice of the overall wait, never an addition to it.
Both timeouts top out at 30 minutes: half of what a [check run agent](/check-run-agents#prerequisite-steps) allows. A correctness review is the longer-running of the two, so less of its time can be spent waiting and still leave room to review. If a prerequisite regularly takes longer than 30 minutes to finish, correctness skips rather than waits; gate on an earlier, faster step instead.
A skipped correctness review holds the PR back from automatic approval. `waitsFor` and `requires` say **when** to review, not **whether**: the verdict was still owed, so Approvability will not approve without it. That is deliberate for `requires` in particular: a gate fires precisely when your CI is red, which is not the moment to approve a PR on the strength of a review that never ran.
### What correctness will not wait for
Two values are refused, with a warning on the check run page:
* **`["*"]`**, the "go last" wildcard that check run agents support.
* **The name of any Macroscope check run**, including `Macroscope - Approvability Check` and any of your own check run agents.
Both are cycles. The correctness check runs before every other Macroscope check: the Approvability check waits for correctness unconditionally, and so does any check run agent configured with `waitsFor: ["*"]`. Waiting for those in turn would have each side waiting for the other until its budget expired. Name your own CI steps instead: those are what these fields are for.
# Fix It For Me
Source: https://docs.macroscope.com/fix-it-for-me
Macroscope can create branches, commit fixes, and open PRs automatically
## How to Trigger
1. **From GitHub**: reply to a Macroscope review comment asking it to fix the issue.
2. **From Slack**: ask `@Macroscope` to fix a bug or make a change.
Fix-it-for-me is not available on cross-repo or fork pull requests. Macroscope will still review these PRs if cross-repo review is enabled, but will not offer fix-it-for-me suggestions.
## How It Works
1. Macroscope creates a new branch off the feature branch (if triggered from GitHub) or main (if from Slack).
2. Macroscope writes the fix and commits it.
3. Macroscope opens a PR.
4. Your GitHub Actions run. If any fail, Macroscope attempts to fix them and pushes again.
5. If auto-merge is enabled, Macroscope merges the PR once all checks pass. PRs against main always require manual merge.
## Auto-Merge
You can override auto-merge per fix:
* **"Fix it for me and auto-merge"**: merges once checks pass, even if auto-merge is off by default.
* **"Fix it but don't auto-merge"**: opens the PR but leaves it for manual merge.
If auto-merge is blocked, Macroscope posts a comment explaining why.
## Branch Protection
Macroscope never writes directly to main. All branches follow the pattern `macroscope/*/**`. If you have branch protection rules that apply to all branches, you may need to exclude this pattern.
## GitHub Actions
Macroscope uses your existing GitHub Actions to validate fixes. To reduce latency or cost, add branch-specific rules for `macroscope/*/**` to limit which actions run.
## Generated Code
If your repo has auto-generated code, include the expected diff in your test output. Macroscope will detect and apply it automatically.
```yaml theme={null}
name: Protobuf generated code up-to-date
on:
push:
pull_request:
jobs:
protobuf-gen-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "1.22"
- name: Install protoc plugins
run: |
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
- name: Regenerate protobuf files
run: protoc -I=proto --go_out=. --go-grpc_out=. proto/*.proto
- name: Fail if generated files changed
run: git diff --exit-code
```
# Quick Wins After Setup
Source: https://docs.macroscope.com/hit-the-ground-running
Start using Slack subscriptions, the agent, macros, and your support channel after setup.
## Send code activity to Slack
Stream commits or PRs into Slack so the team can follow code activity without checking GitHub.
[Set up Slack subscriptions](/integrations#slack).
Create a dedicated channel such as `#activity-prs`, then type `/macroscope subscribe-prs` to stream PR activity into it.
## Ask questions in Slack
Send Macroscope a direct message or tag `@Macroscope` in a team channel. It can query your codebase, connected analytics tools, issue trackers, and other integrations.
In a direct message, try: *"Summarize everything I worked on last week."* [See more examples](/macros#use-cases).
In a team channel, tag `@Macroscope` and ask: *"What did the team ship yesterday?"* [See more examples](/macros#use-cases).
Connect services under **Settings > Connections** to give the agent access to their data and actions. [See the supported tools](/agent#tools).
[Read about Macroscope's agent](/agent).
## Create a macro
Create an automated workflow that runs on a schedule or when a commit or PR event occurs. Send results to Slack or a webhook.
For example, create a daily standup macro that posts updates in `#eng-team`:
*"Create daily standup notes, organized by team member, with bullets for yesterday's work, today's priorities, and any blockers."*
[See more macro examples](/macros#use-cases).
[Set up macros](/macros).
## Open a support channel
Follow **Settings โ Support โ Slack Support Channel** to open a shared channel with the Macroscope team. Use it for questions and feedback.
# Integrations
Source: https://docs.macroscope.com/integrations
Connect your tools to give the agent more context and capabilities
Each integration gives the agent access to new data and actions. All integrations are configured in **Settings โ Connections**. For a full list of what the agent can do with each tool, see the [tools reference](/agent#tools).
## GitHub
Connected automatically during setup. No additional configuration needed.
## Slack
The primary way most teams interact with Macroscope. DM Macroscope or tag `@Macroscope` in any channel to query the agent.
Macroscope also streams real-time code activity into Slack channels via `/macroscope` commands. Use `/macroscope subscriptions` to view a channel's subscriptions, or `/macroscope help` for the full command list.
* `/macroscope subscribe `: all activity from a repo
* `/macroscope subscribe-commits `: commit summaries (includes linked Jira and Linear tickets)
* `/macroscope subscribe-prs `: PR activity, with live emoji reactions as PRs are โ approved, ๐ฌ commented, or ๐ merged
* `/macroscope subscribe-build-failures `: build failures
Add `--paths=` to any command to filter to specific parts of a repo (e.g. `--paths=/frontend`).
A Slack admin can connect Slack in **Settings โ Connections โ Slack**.
## Linear
The agent can look up issues, track project progress, and create new issues. When you connect Linear, you choose which teams Macroscope can access.
Ask it to create an issue **underneath an existing one** and you get a real Linear sub-issue, not a checklist buried in a description. Name the parent by its identifier, as in *"break ENG-431 into sub-issues, one per migration step"*.
* Each sub-issue is a first-class issue, so it can be assigned, estimated, and tracked on its own.
* A sub-issue joins its parent's team unless you ask for a different one โ you don't have to name a team, even in a multi-team workspace.
* Sub-issues are Linear-only. Asking for one in Jira returns an error rather than quietly creating a detached top-level issue.
Scroll down to the **Linear** section.
Click **Connect Linear** and sign in with your Linear account.
Linear will prompt you to choose which teams Macroscope can access. Select **all public teams** or **only select teams**.
Click **Authorize** to complete.
## Jira
The agent can look up tickets, track project progress, and create new issues. Macroscope inherits the permissions of the Jira account that authorizes the integration.
We recommend creating a dedicated Jira user for Macroscope, scoped to the specific Projects you want Macroscope to access. For Google Workspace teams, create an email alias like `linda+macroscope@yourcompany.com` and use it for the Jira account.
Scroll down to the **Jira** section.
Make sure you are logged out of any personal Jira accounts first. Click **Connect Jira** and sign in with the account you want to authorize for Macroscope.
In some cases, a Jira site admin may need to manually authorize the connection:
1. Go to Atlassian Administration โ Apps โ \[your-site].atlassian.net โ Connected apps
2. Find Macroscope and click Authorize/Allow for the site.
You'll see a list of Projects that Macroscope has been granted access to. These will be accessible to anyone on your team with Macroscope access.
To modify the list, update the permissions of the authorizing Jira account and re-authorize.
Click **Confirm Access** to complete.
## LaunchDarkly
The agent can list feature flags, projects, and environments, and check flag status and targeting rules.
Scroll down to the **LaunchDarkly** section.
In LaunchDarkly, go to **Settings โ Authorization โ Create Token**. Assign the **Reader** role.
Copy the token and paste it into the Macroscope connection modal. Click **Connect**.
## PostHog
The agent can query product analytics events, analyze trends, and inspect feature flags.
Scroll down to the **PostHog** section.
In PostHog, go to **Settings โ Personal API Keys โ Create**. Copy the key.
Use an organization-scoped API key for flexibility across multiple projects.
Select your region (US or EU), paste your API key, and click **Next**.
Macroscope will auto-fetch your projects. Select a default project and click **Connect**.
## Sentry
The agent can search error issues across projects, view issue details and event history, and investigate crashes and exceptions.
Scroll down to the **Sentry** section.
Choose your Sentry region: **sentry.io**, **us.sentry.io**, **de.sentry.io**, or enter a custom URL for self-hosted instances.
In Sentry, go to **Settings โ Auth Tokens** and create a token with the following scopes: `event:read`, `project:read`, `org:read`.
Paste the auth token, enter your organization slug, and click **Connect**. Macroscope will validate your credentials automatically.
## BigQuery
The agent can browse datasets, inspect table schemas, and run read-only SQL queries. Answers include a methodology summary so you can verify the analysis.
Scroll down to the **BigQuery** section.
In Google Cloud Console, create a service account with **BigQuery Data Viewer** and **BigQuery Job User** roles. Generate a JSON key file.
Enter a connection name, your GCP Project ID, and upload the service account JSON key (or paste it directly). Optionally add prompt instructions to give the agent context about your data.
Click **Create** to complete.
## GCP Cloud Logging
The agent can search and filter application logs across connected GCP projects.
Scroll down to the **GCP Cloud Logging** section.
In Google Cloud Console, create a service account with **Logs Viewer** role. Generate a JSON key file.
Enter a connection name, your GCP Project ID, and upload the service account JSON key (or paste it directly). Optionally add prompt instructions to give the agent context about your logs.
Click **Create** to complete.
## Amplitude
The agent can run event segmentation queries, analyze conversion funnels and retention, and inspect individual user event streams.
Scroll down to the **Amplitude** section.
In Amplitude, find your **API Key** and **Secret Key** in your project settings.
Enter a connection name, select your region (US or EU), paste your API Key and Secret Key, and optionally add prompt instructions.
Click **Create** to complete.
## MCP Connectors
Connect any [MCP-compatible server](https://modelcontextprotocol.io/) to extend the agent with custom tools (e.g. Datadog, PagerDuty, or your own internal APIs). Configure MCP Connectors from **Settings โ Connections โ MCP Servers** (admin only).
Scroll down to the **MCP Connectors** section.
Paste the MCP server URL and click **Discover**. Macroscope will auto-detect the server's authentication method.
Depending on the server, you may need to provide OAuth credentials (Client ID and Secret), custom headers, or no authentication.
Review the tools the server provides. Toggle off any tools you don't want the agent to use. Click **Connect**.
### Access Controls for Workspace-Scoped MCP Connectors
By default, all workspace members can use an MCP connector's tools. To restrict access to specific users:
1. Open the MCP connection in edit mode.
2. Switch to the **Access** tab.
3. Add users to the allow list.
Only users on the allow list can invoke the connector's tools. Connections with restricted access display a badge and tooltip in the connection list so admins can see which connectors are limited at a glance.
### Personal MCP Connections
Personal connections are MCP servers you connect for yourself, separate from the workspace connectors your admins manage. Use them to give the agent your own tools, like Stripe, Notion, Linear, or Sentry, or your own internal APIs, when it answers your questions. Set them up from **Settings โ Personal**, no admin required.
| | Workspace connector | Personal connection |
| - | - | - |
| Set up by | Admins | You |
| Available to | All workspace members (or an allow list) | Only you |
| Runs as | Shared workspace identity | Your own identity |
Personal connections support any public HTTPS server that implements OAuth 2.1. Macroscope discovers the server's authorization endpoints and registers a client automatically, so there are no client credentials to enter: paste the server URL, complete the OAuth consent flow, and the connection is ready. Reconnect or disconnect at any time from the same page.
# Macros
Source: https://docs.macroscope.com/macros
Automate workflows on a schedule or in response to code events. Deliver results to Slack or via webhook.
Macros let you automate workflows by combining a **trigger** (when it runs), **agent instructions** (what it does), and a **delivery target** (where the result goes).
Write instructions in plain English. The agent uses its [tools](/agent#tools) to do the work and sends the result to the configured destination. Any user with access to the Macroscope web app can create macros.
Test your prompt with the **Run Now** button or by asking @Macroscope in Slack before scheduling it.
## Triggers
Macros can run on a schedule or in response to events in your repositories.
Run on a recurring cadence: daily, weekly, or biweekly. Each macro displays its next scheduled run in the header.
Run whenever a commit is pushed. Filter by repository or branch to target specific activity.
Run whenever a pull request is opened. Filter by repository to focus on what matters.
### Filtering
You can scope event-based macros by specifying filters in your agent instructions:
* **Repository**: "Only run if this commit is in the `payments` repo"
* **Branch** (commit-based only): "Only run if this commit is on `main` or `release/*`"
* **Author**: "Only run if this PR was opened by Ryan or Claire"
## Delivery
Choose where the macro sends its results.
Post results to any Slack channel. To use a private channel, make sure @Macroscope is added to it first.
Send results to any webhook URL. Route output to Zapier, Discord, n8n, or your own APIs.
## Use Cases
### Scheduled Macros
"Summarize all activity from the last 24 hours, grouped by contributor. Use short 1-3 bullets per person describing what they shipped and what's still in progress. Include preview URLs for user-facing changes so teammates can easily check work."
"Summarize everything shipped in the past 7 days in plain language, highlighting user-facing changes first. Use a lightweight, bulleted format with emojis for readability. Exclude technical implementation details unless they directly impact users. The audience is the entire company, which includes non-engineers."
### Event-Based Macros
**Trigger:** On new commit to `main`
"Check if this commit touches the billing module, onboarding flow, or API endpoints. If it does, summarize what changed, who authored it, and what the blast radius is. Format the output as JSON with fields: summary, author, affected\_areas, risk\_level."
**Trigger:** On new PR
"Search Linear for any tickets that look related to this PR based on the title, description, and changed files. If you find matches, comment on the PR with links to the relevant tickets."
**Trigger:** On new PR (filtered to your repo)
"When a PR is opened by anyone on my team, send me a summary of what it changes and which areas of the codebase it touches."
**Trigger:** On new commit to `release/*`
"Compare this commit against the last release tag. Summarize all changes included in this release so far, grouped by area. Flag any commits that haven't been QA'd based on their Linear ticket status."
# Models & Token Pricing
Source: https://docs.macroscope.com/model-pricing
The models Macroscope runs on, how reasoning and effort behave, and the raw per-token rate for each one
This page is the single source of truth for the models Macroscope runs on and what their tokens cost. The rates below are raw model cost, so a model's price is the same wherever you use it.
Each product bills these rates under its own pricing: see [Model Selection & Costs](/check-run-agents/costs#how-runs-are-billed) for Check Run Agents.
## Available Models
| Model | Reasoning | Effort | Notes |
| - | - | - | - |
| **Anthropic** | | | |
| `claude-opus-4-5` | `low` (default), `medium`, `high` | `low` (default), `medium`, `high` | Earlier Opus generation. Smaller context window: best for short, targeted checks. |
| `claude-opus-4-6` | auto | `low` (default), `medium`, `high` | Strongest general-purpose option. Large context window. |
| `claude-opus-4-7` | auto | `low` (default), `medium`, `high` | Large context window. |
| `claude-opus-4-8` | auto | `low` (default), `medium`, `high` | Large context window. |
| `claude-opus-5` | auto | `low` (default), `medium`, `high` | Large context window. |
| `claude-opus-5-5` | auto | `low` (default), `medium`, `high` | Latest Opus. Large context window. |
| `claude-sonnet-4-5` | `low` (default), `medium`, `high` | `low` (default), `medium`, `high` | Faster than Opus. Smaller context window. |
| `claude-sonnet-4-6` | auto | `low` (default), `medium`, `high` | Faster than Opus, with a large context window. |
| `claude-sonnet-5-5` | auto | `low` (default), `medium`, `high` | Latest Sonnet. Faster than Opus, with a large context window. |
| `claude-sonnet-5` | auto | `low` (default), `medium`, `high` | Faster than Opus, with a large context window. |
| `claude-fable-5` | auto | `low` (default), `medium`, `high` | Highest intelligence. Best for hard tasks. **Note: Fable 5 does not support Zero Data Retention.** |
| `claude-fable-5-1` | auto | `low` (default), `medium`, `high` | Latest Fable. Highest intelligence. Best for hard tasks. **Note: Fable 5.1 does not support Zero Data Retention.** |
| **OpenAI** | | | |
| `gpt-5-2` | `low` (default), `medium`, `high` | โ | Earlier GPT generation. |
| `gpt-5-4` | `low` (default), `medium`, `high` | โ | More capable than 5.2. |
| `gpt-5-5` | `low` (default), `medium`, `high` | โ | Previous flagship GPT. |
| `gpt-5-6-sol` | `low` (default), `medium`, `high`, `xhigh`, `max` | โ | Latest GPT. Frontier tier with the highest quality. |
| `gpt-5-6-terra` | `low` (default), `medium`, `high`, `xhigh`, `max` | โ | Balanced price and quality. |
| `gpt-5-6-luna` | `low` (default), `medium`, `high`, `xhigh`, `max` | โ | Cost-optimized. |
| `gpt-6-astra` | `low` (default), `medium`, `high`, `xhigh`, `max` | โ | Latest flagship. Large context window. Always on; `off` maps to low. |
| `gpt-6-sol` | `off`, `low` (default), `medium`, `high`, `xhigh`, `max` | โ | Balances intelligence and cost for coding and agentic work. Large context window. Every thinking level is distinct, including `off`. |
| `gpt-6-luna` | `off`, `low` (default), `medium`, `high`, `xhigh`, `max` | โ | High-volume, cost-optimized tier. Large context window. Every thinking level is distinct, including `off`. |
| `gpt-6-1-sol` | `low` (default), `medium`, `high`, `xhigh`, `max` | โ | Latest GPT. Large context window. Always on; `off` maps to low. |
| **xAI** | | | |
| `grok-4-6` | `low` (default), `medium`, `high`, `xhigh` | โ | Large context window. Always on. Each level is distinct; `off` maps to low. |
| **Open source** | | | |
| `deepseek-v4-1-flash` | `low` (default), `high`, `xhigh` | โ | Large context window. Always on. `off`/`low` map to low effort, `medium`/`high` to high, `xhigh` to max. |
| `kimi-k3` | `low` (default), `high`, `xhigh` | โ | Large context window. Always on. `off`/`low` map to low effort, `medium`/`high` to high, `xhigh` to max. |
| `glm-5-3` | `low` (default), `high`, `xhigh` | โ | Large context window. Always on. `off`/`low` map to low effort, `medium`/`high` to high, `xhigh` to max. |
| `glm-5-3-flash` | `low` (default), `high`, `xhigh` | โ | Large context window. Always on. `off`/`low` map to low effort, `medium`/`high` to high, `xhigh` to max. |
| `minimax-m3` | `off` or on (default) | โ | Large context window. Any thinking level maps to on. |
| `qwen-3-8-max` | `off`, `low` (default), `medium`, `high`, `xhigh` | โ | Large context window. Every thinking level is distinct, including `off`. |
* **Default** = the value used when the field is omitted.
* **Effort** applies to Anthropic models only: GPT, Grok, and open-source models ignore it (shown as `โ`). On those models every `effort` level collapses to the same variant, so it has no effect.
* Newer Anthropic models (Opus 4.6 / 4.7 / 4.8 / 5 / 5.5, Sonnet 4.6 / 5 / 5.5, Fable 5 / 5.1) set thinking automatically, so their `reasoning` field is ignored (shown as auto).
* Writing a level a model does not support, such as `xhigh` on `gpt-5-2` or `max` on `kimi-k3`, falls back to `low` and surfaces a warning.
[MacroscopeBench](https://macroscope.com/benchmark) publishes score, recall, precision, signal-to-noise, cost, and duration for many of these models, each at a specific reasoning level, measured on real bugs with Macroscope's own code-review harness.
Open-source models are opt-in and typically cost a fraction of the frontier options: a good fit for specialized, high-volume, or narrowly-scoped work, while Opus remains the default where the strongest model matters.
Open-source models are served through Fireworks AI's hosted inference: Macroscope does not run local or self-hosted models, and you cannot point at your own endpoints. As we expand the set of inference providers we support, capacity fluctuations from these providers (during heavy load) mean latency may occasionally be higher due to request queuing.
## Reasoning and Effort
* `reasoning` accepts `off | low | medium | high | xhigh | max`
* `effort` accepts `low | medium | high`
Which field applies depends on the model:
* **Anthropic**: `effort` always applies. `claude-opus-4-5` and `claude-sonnet-4-5` additionally honor `reasoning`, which maps to [extended thinking](https://platform.claude.com/docs/en/build-with-claude/extended-thinking#supported-models); newer Anthropic models set thinking automatically and ignore `reasoning`.
* **OpenAI, xAI, and open source**: `reasoning` selects the thinking level; `effort` is ignored.
Writing a `reasoning` level a model does not support falls back to `low` and surfaces a warning.
For how to set these fields on a Check Run Agent, see [Model Selection & Costs](/check-run-agents/costs#reasoning-and-effort).
## Pricing
Raw model cost, USD per 1M tokens. The four columns are the four token counts a request is metered on, and they do not overlap: each token is counted once:
* **Input**: prompt tokens read fresh, with no cache involved.
* **Output**: everything the model generated, reasoning tokens included.
* **Cache write:** prompt tokens written into the provider's prompt cache. **โ** means the provider charges nothing to create a cache entry.
* **Cached input**: prompt tokens read back out of the cache instead of re-read.
Model ids are written here the way you set them in configuration. A provider's own usage view may spell the same model differently: `gpt-5-6-sol` is `gpt-5.6-sol` there, `grok-4-6` is `grok-4.6`, and the open-source models appear under vendor paths such as `moonshotai/Kimi-K3`.
| Model | Input | Output | Cache write | Cached input |
| - | - | - | - | - |
| **Anthropic** | | | | |
| `claude-opus-4-5` | \$5.00 | \$25.00 | \$6.25 | \$0.50 |
| `claude-opus-4-6` | \$5.00 | \$25.00 | \$6.25 | \$0.50 |
| `claude-opus-4-7` | \$5.00 | \$25.00 | \$6.25 | \$0.50 |
| `claude-opus-4-8` | \$5.00 | \$25.00 | \$6.25 | \$0.50 |
| `claude-opus-5` | \$5.00 | \$25.00 | \$6.25 | \$0.50 |
| `claude-opus-5-5` | \$4.00 | \$20.00 | \$5.00 | \$0.20 |
| `claude-sonnet-4-5` | \$3.00 | \$15.00 | \$3.75 | \$0.30 |
| `claude-sonnet-4-6` | \$3.00 | \$15.00 | \$3.75 | \$0.30 |
| `claude-sonnet-5-5` | \$2.00 | \$10.00 | \$2.50 | \$0.20 |
| `claude-sonnet-5` | \$2.00 | \$10.00 | \$2.50 | \$0.20 |
| `claude-fable-5` | \$10.00 | \$50.00 | \$12.50 | \$1.00 |
| `claude-fable-5-1` | \$10.00 | \$50.00 | \$12.50 | \$0.25 |
| **OpenAI** | | | | |
| `gpt-5-2` | \$1.75 | \$14.00 | โ | \$0.18 |
| `gpt-5-4` | \$2.50 | \$15.00 | โ | \$0.25 |
| `gpt-5-5` | \$5.00 | \$30.00 | โ | \$0.50 |
| `gpt-5-6-sol` | \$4.00 | \$20.00 | \$5.00 | \$0.40 |
| `gpt-5-6-terra` | \$2.00 | \$12.00 | \$2.50 | \$0.20 |
| `gpt-5-6-luna` | \$0.20 | \$1.20 | \$0.25 | \$0.02 |
| `gpt-6-astra` | \$10.00 | \$50.00 | \$12.50 | \$1.00 |
| `gpt-6-sol` | \$2.00 | \$10.00 | \$2.50 | \$0.20 |
| `gpt-6-luna` | \$0.10 | \$0.50 | \$0.13 | \$0.01 |
| `gpt-6-1-sol` | \$2.00 | \$10.00 | \$2.50 | \$0.10 |
| **xAI** | | | | |
| `grok-4-6` | \$2.00 | \$6.00 | โ | \$0.50 |
| **Open source** | | | | |
| `deepseek-v4-1-flash` | \$0.30 | \$1.20 | โ | \$0.01 |
| `kimi-k3` | \$3.00 | \$15.00 | โ | \$0.30 |
| `glm-5-3` | \$1.40 | \$4.40 | โ | \$0.26 |
| `glm-5-3-flash` | \$0.15 | \$0.50 | โ | \$0.03 |
| `minimax-m3` | \$0.30 | \$1.20 | โ | \$0.06 |
| `qwen-3-8-max` | \$2.00 | \$6.00 | โ | \$0.25 |
**Large prompts bill at a higher rate on some models.** Crossing the threshold reprices the *whole* request, not just the tokens past it. "Prompt tokens" means uncached input plus cached input plus cache writes.
* `gpt-5-4`, `gpt-5-5`, `gpt-5-6-sol`, `gpt-5-6-terra`, `gpt-5-6-luna`, `gpt-6-astra`, `gpt-6-sol`, `gpt-6-luna`, `gpt-6-1-sol`: above 272,000 prompt tokens: 2x input, 1.5x output, and 2x on both cache columns where they are charged.
* `claude-sonnet-4-5`: above 200,000 prompt tokens: 2x input, 1.5x output, 2x cache write, 2x cached input.
* `grok-4-6`: at 200,000 prompt tokens or more: 2x on every token, output included.
Every other model above bills the same rate at any prompt size.
# Pricing
Source: https://docs.macroscope.com/pricing
Usage-based pricing for Agent, Code Review, and Status
New customers have been on usage-based pricing since **March 27, 2026**. On **April 27, 2026**, we moved all existing customers over from the [legacy pricing plan](https://docs.macroscope.com/legacy-pricing), so everyone is now on the same plan.
Macroscope features are billed based on usage, so your costs are tied to the actual work Macroscope does reviewing and processing your code.
## Pricing
| Feature | Pricing | Description |
| - | - | - |
| Agent | \$0.01 per credit (1000 free credits/month) | Ask questions and take action via Slack, GitHub, or API |
| Code Review | Priced per KB of diff reviewed; based on the [Detection Mode](/bug-detection-and-fixes#detection-mode) used:
All modes have a 10KB minimum charge per review. | Reviews PRs for correctness and suggests fixes |
| Status | \$0.05 per commit processed | Commit summaries, area classification, productivity metrics, sprint reports |
**Macroscope is purely usage-based pricing; we do not charge for seats.**
Pricing as of September 28, 2026.
## How Billing Works
Macroscope uses a prepaid usage model. Each workspace has a single balance that covers Code Review, Status, and Agent, and decreases with usage. Enable **Auto-refill** to have your balance top up automatically when it falls below a threshold you configure, so there's no disruption.
Usage data in your billing dashboard may be delayed by a few minutes due to how Stripe's metering system works.
Admins can manage auto-refill and spend controls, and view their workspace's balance, usage history, and usage costs in **Settings โ Billing**. To zoom into a specific date range, click and drag on the usage chart. The usage summary and breakdown tables update to match the selected window. The breakdown table shows each meter's **Rate**, meaning the per-unit price it is billed at, alongside the usage recorded and the resulting cost.
Go to **Settings โ Billing** and configure your balance threshold and refill amount. We recommend enabling auto-refill to ensure Code Review and Status processing run without interruption. If your balance hits zero without auto-refill, processing pauses until your balance is topped up.
Whenever an auto-refill payment is made, you'll receive a receipt. Your invoice at the end of your usage period will be \$0 since top-ups are prepaid. You can view all receipts and invoices in **Settings โ Billing**, powered by Stripe.
Add, update, or remove payment methods in **Settings โ Billing**.
There can be up to a few minutes of delay in meter data due to how Stripe's metering system works. If something still looks off after accounting for that, reach out to us at [**support@macroscope.com**](mailto:support@macroscope.com).
No.
Access continues until the end of your billing period. Your balance stays in your account. If you resubscribe, it picks up where you left off.
## Spend Controls
You can set several limits to control your costs. Configurable by a workspace admin in **Settings โ Billing**.
| Control | Description | Override |
| - | - | - |
| **Monthly spend limit** | Hard ceiling on total usage per billing period. | Cannot be overridden |
| **Per-review cap** | Max cost for a single Code Review run. | Override with [on-demand review](#on-demand-reviews) |
| **Correctness per-PR cap** | Max total Code Review cost on one PR. Once reached, it also stops [Approvability](/approvability) on that PR: see [What the Correctness per-PR cap counts](#per-pr-cap). | Override with [on-demand review](#on-demand-reviews) |
| **Check Run Agents per-PR limit** | Max combined cost of **all** [Check Run Agents](/check-run-agents) on one PR. Separate from the Correctness caps and defaults to **\$100**: see [The Check Run Agents per-PR limit](#cra-per-pr-limit). | Mention `@macroscope-app` to force a run |
| **CLI review limits** | Caps on [Macroscope CLI](/cli) review spend per billing period, workspace-wide and per developer. | Cannot be overridden |
Default caps are \$10 per review and \$50 per PR. Both always apply and are adjustable in **Settings โ Billing**. There is no setting that removes them.
**Where each limit lives.** In **Settings โ Billing**, the per-PR controls are grouped by which review they govern, because they are separate budgets with different rules:
| Limit | Where to set it |
| - | - |
| Monthly spend limit | **Monthly workspace limit** โ *Maximum spend per billing period* |
| Per-review cap | **PR review limits โ Correctness** โ *Per-review limit* |
| Correctness per-PR cap | **PR review limits โ Correctness** โ *Per-PR limit* |
| Check Run Agents per-PR limit | **PR review limits โ Check Run Agents** โ *Per-PR limit* |
| CLI review limits | **CLI Spend Controls**: see [CLI Review Limits](#cli-review-limits) |
**The per-review cap, the Correctness per-PR cap and the Check Run Agents per-PR limit cannot be turned off.** Each one always resolves to a value, so leaving one of those fields blank means "leave this unchanged", not "remove the limit": blank the Correctness fields and save, and the stored caps are kept. Only the monthly and CLI limits can genuinely be cleared.
What differs between them is how they are **updated**: the two Correctness limits move as a pair, so changing either one submits both, while the Check Run Agents limit is configured independently of them. Each group links to the documentation for the review type it governs, and the **What if?** simulator sits with the Correctness limits because it models those two only.
### What the Correctness per-PR cap counts, and what it stops
The per-PR cap measures one thing and stops two, and the difference matters when you are working out why a check did not run.
**What counts toward the cap:** Code Review (correctness) runs on that PR, and nothing else. [Check Run Agent](/check-run-agents) and [Approvability](/approvability) spend on the PR does **not** add to the total, and neither does spend that is not attached to a PR at all: [Ask Macroscope Anything](/ask-macroscope-anything), [Macros](/macros), and [CLI reviews](/cli).
**What stops once the cap is reached:** Code Review and Approvability on that PR.
| On a PR at its cap | What happens |
| - | - |
| Code Review | Skipped, reporting *Per-PR cost limit exceeded (workspace setting)* |
| Approvability | The check is concluded **skipped** |
| Check Run Agents | **Not affected.** They have [their own per-PR limit](#cra-per-pr-limit) |
Approvability is stopped by a cap its own spend never counted toward. That is deliberate: the cap is a statement about what one pull request may cost in total, and Approvability reads the correctness review's findings, so continuing to run it once correctness has stopped would report a verdict from incomplete input.
Check Run Agents used to be stopped by this cap too. They are not any more: they are governed by a separate workspace limit, so raising or lowering the Correctness cap no longer changes when agents stop.
Two further details:
* **Code Review stops before exceeding the cap; the agents stop after reaching it.** Code Review's maximum cost is known before it runs, so it is skipped when the spend already booked plus this review's estimate would go over. An agent's cost cannot be estimated up front, so agents are stopped only once booked spend has already reached the cap.
* **Spend before usage-based billing began does not count.** Only Code Review runs recorded under usage-based billing are totalled, so a long-lived PR is not charged against the cap for work that predates it.
Commenting `@macroscope-app review this PR` bypasses the per-PR cap and reviews the PR now. The [monthly spend limit](#spend-controls) is not bypassable this way: it applies to on-demand reviews too.
### The Check Run Agents per-PR limit
[Check Run Agents](/check-run-agents) have their own workspace-wide per-PR limit, separate from the Correctness caps above. It defaults to **\$100**.
**It is one shared budget across every agent on the PR.** A workspace running ten agents gets one ceiling for all of them, not ten. Once their combined recorded spend on a PR reaches the limit, remaining automatic agent runs on that PR are created and concluded **skipped**, naming the limit.
| | Correctness per-PR cap | Check Run Agents per-PR limit |
| - | - | - |
| What it totals | Code Review spend on the PR | Combined Check Run Agent spend on the PR |
| Default | **\$50** | **\$100** |
| Minimum | \$0.50 | \$0.50 |
| Can be turned off | **No.** It always resolves to a value | **No.** It always resolves to a value |
| How you change it | As a pair with the per-review cap: changing either submits both | Independently of the Correctness caps |
| Also stops Approvability | Yes | No |
| Bypass | `@macroscope-app review this PR` | Mention `@macroscope-app` to invoke an agent deliberately |
**Automatic runs are gated; a deliberate invocation is not.** Agents that run automatically on a push are checked against the limit. Mentioning `@macroscope-app` yourself bypasses the workspace limit and runs the named agent, just as an on-demand review bypasses the Correctness cap. The per-PR limits pace what a single pull request spends on its own, so a deliberate request is allowed. The [monthly spend limit](#spend-controls) works differently because it bounds your total exposure for the billing period and **cannot** be overridden, including by on-demand runs.
**The limit is best effort, and a PR can overshoot it.** An agent's cost is only known once it finishes, so the check compares spend already recorded before dispatching: it does not reserve budget, estimate a run's cost, or hold agents back to find out. Several agents dispatched at once therefore all see the same pre-run total and can all be allowed through, taking the PR past the limit by up to one round of agents.
This is a deliberate trade: the alternative is serialising every agent behind a billing read. Treat the limit as "stop shortly after this much", not as a hard ceiling. The [monthly spend limit](#spend-controls) is the hard one.
**Per-agent budgets are separate and stack with it.** For finer control than one workspace-wide ceiling, an individual agent can declare its own caps in the front matter of its `.macroscope/*.md` file. The two do different jobs:
* [`maxBudgetPerRun`](/check-run-agents#spend-limits) bounds a **single run**. The agent re-checks it after each turn and stops as soon as the cap is reached, which makes it the control to reach for when you want to cut off an agent that would otherwise keep investigating. Work already done is still billed, and a run stopped this way should be read as incomplete rather than clean. Not supported with `input: code_object`.
* [`maxBudgetPerPR`](/check-run-agents#spend-limits) bounds **that agent's total across every run** it makes on one PR. It is checked before a run is dispatched, so it stops a further run from starting rather than interrupting one in flight.
Both cap one agent only; the workspace limit caps all of them together. Whichever ceiling is reached first stops that agent, so raising an agent's own budget will not clear a workspace limit that has already been reached.
If you don't have auto-refill on and your balance runs out, all processing pauses: Agent, Code Review, and Status. Commits and PRs pushed during that window are skipped and are not retroactively processed when your balance is topped up.
Agent, Code Review, and Status processing pause for the rest of the billing period. Auto-refill does not trigger when the monthly max is hit. Commits and PRs pushed during that window are skipped.
**Processing resumes when the next period starts or an admin increases the limit.**
Auto-refill tops up your balance but does not override the monthly spend limit. If you hit your monthly limit, processing pauses even if you still have balance remaining. They are separate controls.
### CLI Review Limits
[Macroscope CLI](/cli) reviews consume [Agent credits](#agent), and admins can cap them separately from the rest of your usage under **Settings โ Billing โ CLI Spend Controls**.
| Limit | Caps | If not set |
| - | - | - |
| **Monthly CLI review spend limit** | All CLI review spend in the workspace for the billing period. | No workspace-wide limit |
| **Default per-user monthly limit** | Each developer's CLI review spend for the billing period. | No per-user limit |
| **Per-user override** | One developer, replacing the default for them. | That developer follows the default |
Both workspace-level fields are blank by default and accept any amount above \$0. Per-user overrides are added and removed under **Per-user overrides**; an override of \$0 blocks that developer from running CLI reviews, and removing the override returns them to the default.
How the limits behave:
* **Checked before a review starts**, so a review that would exceed a limit is declined and costs nothing.
* **Only CLI reviews count.** Code Review on GitHub, Status, and other Agent usage draw on the workspace budget but not on these limits.
* **The workspace limit wins.** Once it's reached, every developer is blocked for the rest of the billing period, whatever their own limit allows.
* **Best effort, not a reservation.** Reviews already running are not stopped, so spend can land slightly past a limit.
* **Resets each billing period.** Raising a limit takes effect immediately: no need to wait for the reset.
When a limit is reached, the CLI declines the review and names the limit it hit:
| Limit reached | What the developer sees |
| - | - |
| Workspace | *Your workspace has reached its monthly CLI review spend limit. Ask a workspace admin to raise the limit in billing settings, then rerun the review.* |
| Per-user | *You've reached your monthly CLI review spend limit. Ask a workspace admin to raise your limit in billing settings, then rerun the review.* |
CLI review spend is Agent credit spend, so it also draws on your balance and counts toward the workspace's [monthly spend limit](#spend-controls). CLI limits sit on top of those controls: they never raise them.
## Agent
Credits are a usage-based billing unit for Macroscope's Agent features: Slack queries, Macros, Webhooks, Check Run Agents and Approvability. **1 credit = \$0.01.** Credit usage is calculated by taking the raw LLM cost of each agent run (based on your prompts and parameters), then adding a 5% markup, then dividing by the value of each credit (\$0.01). Every workspace includes **1000 free credits per month**.
Free credits do not roll over. Usage beyond the free credits draws from your balance.
**Credit calculation:** raw LLM cost of the agent run ร 1.05 markup รท \$0.01 per credit = credits consumed.
[Approvability](/approvability#pricing) is the one exception: it is priced per run at a flat **30 credits (\$0.30)**, regardless of the size of the PR or what the run cost to produce. Runs Macroscope decides without an agent are free.
### What uses credits
| Feature | Trigger |
| - | - |
| [Slack queries](/agent) | DM or tag `@Macroscope` in any channel |
| [GitHub queries](/agent) | Mention `@macroscope-app` in any PR discussion |
| [Macros](/macros) (scheduled) | Cron schedule |
| [Macros](/macros) (event-triggered) | New PR or commit |
| [Webhooks](/api) | HTTP POST to API |
| [Check Run Agents](/check-run-agents) | `.macroscope/*.md` on PR |
| [Fix It for Me](/fix-it-for-me) | Reply to a review comment or ask in Slack |
| [Approvability](/approvability#pricing) | New PR or commit: flat 30 credits per run, and only when a verdict needs the agent |
[Code Review](#code-review) and [Status](#status) are billed separately via their own meters. They do not consume credits.
### Transparency
Workspace admins can view detailed Agent usage logs in **Settings โ Billing**, including exporting a full CSV with cost and metadata for every agent invocation.
The Agent Credit Usage card offers two views of the same data, grouped by Type, Repo Name, or Check Run Name:
* **Pie chart**: how the billing period's usage splits across slices.
* **Daily chart**: usage per day across the period. Pick a single slice to drill into just that series, with its run count, period total, and per-run low, average, and high.
Both views follow the usage summary's credits/dollars toggle.
Credit usage scales with LLM cost: a quick Slack question uses fewer tokens than a complex multi-step research task, so it costs fewer credits. [Approvability](/approvability#pricing) is the exception: every approvability verdict costs the same 30 credits, so the price does not move with the size of the PR.
Usage beyond the free credits draws from your balance, the same one used by Code Review and Status. Auto-refill and spend limits apply normally.
Yes. Go to **Settings โ Billing** to view usage logs or export a CSV with detailed cost and metadata for every invocation.
## Code Review
Code Review is charged per review, based on the byte size of the PR diff that Macroscope reviews. The per-KB price depends on the [Detection Mode](/bug-detection-and-fixes#detection-mode) the review runs in. Every review has a minimum of 10 KB. If the reviewed diff is under 10 KB, you are charged for 10 KB at that mode's rate.
Anytime Macroscope's correctness check runs on a PR counts as one review. This can happen:
* Automatically on each push to a PR (if automatic Code Review is enabled for that repo)
* Manually, by commenting `@macroscope-app review` on any PR in GitHub
We pull diffs from GitHub in unified diff format (u3) and measure diff size by the raw u3 diff bytes.
For the first push to a PR (or any force push), we compare HEAD to the merge base of the target branch. For subsequent pushes, we always compare HEAD to the previous reviewed HEAD.
Any files Macroscope doesn't review, such as binaries or files excluded by your [`.macroscope/ignore.md` file](/bug-detection-and-fixes#macroscope-ignore), are excluded from the diff, so you only pay for the files Macroscope actually reviews.
Detection Mode enables you to choose how Macroscope code review balances precision, recall, and latency. [Learn more about Detection Mode](https://docs.macroscope.com/bug-detection-and-fixes#configuring-detection-mode).
Every review has a minimum of 10 KB. If your diff is under 10 KB, you're charged for 10 KB. The minimum applies in every [Detection Mode](#detection-mode-rates); at the default Balanced rate (\$0.05/KB), the minimum review cost is \$0.50.
The effective dollar amount varies by Detection Mode, and may vary if you're on a plan with custom rates.ย
Most reviews are under 10 KB and thus cost \$0.50 at the default Balanced rate. Assuming that rate of \$0.05/KB, here are some ballpark approximations:
| Change type | Diff size | Cost |
| - | - | - |
| Small bug fix | 2 KB | \$0.50 (10 KB minimum) |
| Medium feature | 30 KB | \$1.50 (30 ร \$0.05) |
| Large refactor | 700 KB | \$35 (700 ร \$0.05) |
Yes.
That said, we try to be clever and detect trivial force pushes and rebases to save you money.
### Per-Repo Code Review Controls
Configure in **Settings โ Repos**. [Learn more about repo settings](/settings#repo-settings).
| Control | Description |
| - | - |
| **Enable/disable Code Review** | Turn off automatic Code Review for specific repos. You can still review [on-demand](#on-demand-reviews). |
| **Skip Dependabot** | Skip Dependabot PRs. |
| **Skip by PR label** | Skip PRs with specific labels. |
| **Force review by label** | Always run checks on PRs with these labels, even when auto-review is off. |
| **Skip draft PRs** | Don't run checks on drafts until marked ready. |
| **Max Automatic Runs per PR** | Cap how many times Correctness review runs automatically on one PR. Manual reviews, check re-runs, and draft-to-ready transitions are exempt. [Learn more](/settings#pull-request-settings). |
| **Max Reviewable File Size** | Exclude files above a size, in KB, from Correctness review. [Learn more](/settings#pull-request-settings). |
Skip and force-review controls apply to **both** [Correctness](#code-review) checks **and** [Check Run Agents](/check-run-agents). Skipping a PR (by label, author, target branch, draft status, or Dependabot) skips both, and a force-review label runs both: even when auto-review is off. The one exception: a Check Run Agent that defines its own `authors`, `labels`, or `targets` filter follows that filter instead of the repo-level skip on that axis.
### On-Demand Reviews
Even if automatic Code Review is off for a repo, you can always invoke a review manually by commenting `@macroscope-app review` on any PR in GitHub.
### Excluding Files from Code Review
You can exclude specific files from review using a `.macroscope/ignore.md` file. See [`.macroscope/ignore.md`](/bug-detection-and-fixes#macroscope-ignore) for details.
## Status
Status is powered by per-commit summarization. This feeds your dashboards, weekly digests, productivity metrics, and sprint reports.
Code Review runs on PRs and analyzes the diff for bugs and correctness issues. Status runs on individual commit summaries and powers features like executive summaries and productivity insights. They're separate processes billed independently.
A commit is charged after Macroscope successfully summarizes it. All branches are in scope and each commit is billed at most once.
**Not charged:**
* Commits pushed while your balance is exhausted or spend limit is hit (skipped)
* Commits on repos with Status disabled
Bot commits (e.g. Dependabot, CI) are processed and billed like any other commit.
Commits on that repo won't be summarized, classified, or included in productivity metrics. No Status charges for that repo.
## Common Questions
Per-seat pricing charges a fixed rate per developer regardless of activity. Usage-based pricing means you only pay for what Macroscope actually processes. Teams with lighter activity pay less; teams that push more code pay proportionally more.
Yes. New workspaces receive a one-time \$100 in free usage to get started.
## Annual Discounts
If you're interested in discounted rates, reach out and we can discuss options for annual commitments. Contact [**enterprise@macroscope.com**](mailto:enterprise@macroscope.com).
***
Questions? Email [**support@macroscope.com**](mailto:support@macroscope.com) or reach out in your shared Slack channel.
# Productivity Insights
Source: https://docs.macroscope.com/productivity
See how engineering time is being spent and where progress is happening
GitHub admins can toggle Productivity Features on/off in **Settings โ Workspace โ Productivity Features**, and optionally limit them to specific GitHub teams.
## Accessing Productivity Insights
### Email Reports
Macroscope sends a weekly digest with executive summaries, coding time trends, and team productivity insights. Manage recipients in **Settings โ Workspace โ Digest Emails**.
### Dashboard
The home page dashboard includes everything from the weekly reports, plus additional productivity trends and contributor-level activity like Clickety Clack Scores.
## Coding Time
An LLM-generated estimate of time spent coding, calculated per commit using diff size, change complexity, and author familiarity (via git blame).
This estimates pure engineering time and does not reflect non-coding work (investigating, planning, meetings). Estimates may be inaccurate at the individual commit level but are useful when aggregated by contributor or week.
### Landed vs All Coding Time
The Home page and productivity views display two coding time metrics:
* **All**: Total estimated coding time across all commits.
* **Landed**: Coding time for commits that have been merged to release branches.
Stacked bar charts show the breakdown, with hover tooltips displaying exact values. Contributors and Teams views include Landed and Ratio columns, so you can see how much of each contributor's work has shipped.
## Clickety Clack Score
A normalized productivity score: **estimated Coding Time รท elapsed working hours**.
For example, 8 hours of estimated coding time over 2 work days (16 hours) = 0.500 Clickety Clack Score.
This measures output per calendar hour against a baseline (the model's understanding of an average engineer in your codebase). It doesn't capture non-coding contributions like research, recruiting, or coaching.
## Attribution
Only **verified contributors** appear in per-contributor metrics. A contributor is verified when their commit author email matches a verified email on their GitHub account.
If a contributor doesn't appear in metrics:
* Check that they've verified their email in GitHub settings
* Ensure their Git config email matches: `git config --global user.email "verified-email@company.com"`
## External Contributors
Control whether external contributors (e.g. open-source contributors) appear in Executive Summaries and/or Productivity Metrics separately in **Settings โ External Contributors**. You may want external contributions in summaries for completeness but excluded from productivity metrics so they reflect only your team's work.
# PR Summaries
Source: https://docs.macroscope.com/pull-request-descriptions
Automatic summaries for every pull request, grounded in codebase context and connected tools
Macroscope generates a summary for each pull request and suggests where reviewers should start. Summaries update automatically when new commits are pushed.
Connecting [integrations](/integrations) improves summary quality by giving Macroscope more context, especially [Jira](/integrations#jira) and [Linear](/integrations#linear) which provide ticket metadata and issue context.
Toggle PR summaries per repo with **Summarize PRs on GitHub** in **Settings โ Repos**, or for newly linked repos under **Defaults**. New workspaces start with that default off.
## Where Summaries Appear
* If the PR has no description, Macroscope adds its summary directly to the PR description.
* If the author already wrote a description, Macroscope posts its summary as a comment instead.
## Using PR Templates
Add these markers anywhere in your PR template to have Macroscope insert its summary in a specific location:
```
```
Macroscope replaces everything between the markers. The markers are invisible in GitHub's rendered markdown. If either marker is removed, Macroscope posts its summary as a separate comment.
Example template:
```
## Why are we making this change?
Explain the motivation here.
## Pull Request Summary
## Checklist
- [ ] Code compiles and passes tests
- [ ] Documentation updated
```
# Settings
Source: https://docs.macroscope.com/settings
Configure Macroscope for your team
Settings are organized into tabs: Workspace, Personal, Repos, Connections, and Support. From the top of the page you can also access the **Billing** portal to manage or cancel your subscription (GitHub admins only).
## Workspace Settings
* **Custom AMA (Ask Macroscope Anything) Instructions**: customize how the agent responds to your team's questions.
* **Product Overview**: give Macroscope context about your product to improve summaries.
* **Weekly Cadence**: set the day and time boundary for weekly reports (e.g. Friday 6pm to Friday 6pm).
* **Digest Emails**: add or remove recipients for weekly digest emails.
* **Productivity Features**: toggle coding time estimates, coding time module, and contributors module on/off. Can be limited to specific GitHub teams.
* **External Contributors**: control whether people with write access who aren't in your GitHub org are included in summaries and/or productivity metrics.
* **Web Search**: allow Macroscope to search the web for additional context when generating summaries.
* **Administrative Contact Email**: email used for policy updates, support, and account communications.
* **Teams**: enable GitHub Teams to see team-specific productivity metrics in the Contributors module.
### Excluded Commit Authors
Workspace admins can exclude commit authors from commit metering, summarization, and productivity metrics under **Workspace Settings โ Excluded Commit Authors**. Authors can be excluded by either **GitHub username** or **Git author name**, controlled by a mode toggle in the UI.
The Excluded Commit Authors section is only visible in workspaces with Status enabled.
## Personal Settings
Per-user preferences for code review and PR summaries. Each can be toggled on/off or set to follow the repo default:
* **Correctness**: review PRs for logical errors and bugs
* [**Detection Mode**](/bug-detection-and-fixes#detection-mode): choose Prefer Coverage, Prefer Precision, or Repo Default. Your choice overrides the repo default for your PRs.
* [**Minimum Severity to Comment**](/bug-detection-and-fixes#minimum-severity-to-comment): your own floor for correctness comments on PRs you author. **Repo Default** defers to the repo's setting.
* [**Check Run Agents**](/check-run-agents): toggle to enable/disable agents defined in your repo's `.macroscope/` folder
* **Review my draft PRs**: review draft PRs before they're marked open
* **Automatically merge Macroscope's PRs**: auto-merge Fix It For Me PRs when all checks pass
* **Auto-summarize my PRs**: control whether Macroscope generates PR summaries
* **Post in PR description**: post summaries in the PR description field (if empty or contains template markers), otherwise as a comment
## Repo Settings
Select repos on the left and configure settings on the right. All settings below are per-repo and can be applied across multiple repos at once. Use **Defaults** to set the default for newly linked repos.
### Features
The section at the top of the page controls which of Macroscope's features run on the selected repos, and how. **Correctness** (reviews pull requests for bugs) and [**Check Run Agents**](/check-run-agents) (runs the agents defined in your repo's `.macroscope/` folder) each offer three choices:
* **Always run**: Macroscope runs the feature automatically on every eligible pull request.
* **Manual invocation only**: the feature never starts on its own, but mentioning `@macroscope-app` on a pull request or applying an [Always Review PR Label](#pull-request-settings) still runs it.
* **Never run**: the feature does not run at all, and nothing overrides that: not a mention, not a label, not a personal setting.
Two more features are a plain on/off toggle:
* [**Approvability**](/approvability): approves pull requests that meet the criteria you define.
* **Status**: generates executive summaries of what's being worked on from codebase activity, computes [productivity statistics](/productivity), and generates [commit summaries](/commit-summaries).
A feature only appears if your workspace has it.
Where to set it:
* **One repo**: select it under **Settings โ Repos**.
* **Workspace defaults**: set it under **Defaults**, which governs newly linked repos.
* **Several repos at once**: select them and use the batch settings panel.
Controls follow your GitHub permissions: **Correctness**, **Check Run Agents**, and **Status** need repo write access, and **Approvability** can only be changed by a **GitHub Admin**.
### Pull Request Settings
These tune how Macroscope handles each pull request. Whether a feature runs at all, and whether it runs automatically, is set under [Features](#features).
* [**Detection Mode**](/bug-detection-and-fixes#detection-mode): balance bug coverage against noise (Prefer Coverage or Prefer Precision) for this repo. Set the default for new repos under **Defaults**.
* [**Minimum Severity to Comment**](/bug-detection-and-fixes#minimum-severity-to-comment): how severe a correctness finding must be before Macroscope comments on it. Choose **Low**, **Medium**, **High**, **Critical**, or **Off**; defaults to **Off**, which posts everything. Set the default for new repos under **Defaults**.
* **Max Automatic Runs per PR**: cap how many times correctness review runs automatically on a single pull request. Once a PR reaches the cap, the correctness check concludes as skipped, titled "Maximum runs reached", with a summary naming your limit. Manual reviews, check re-runs, and moving a PR from draft to ready for review are exempt and always run. A capped PR can still be reviewed by commenting `@macroscope-app review this PR`. Set the default for new repos under **Defaults**.
* **Max Reviewable File Size**: the largest file, in KB, that correctness review will look at. Files above the limit are excluded from the review and listed on the check run with the reason "File too large (exceeds configured limit)". This is a **soft** exclusion: a file matched by an explicit `include` in your [custom correctness instructions](/custom-instructions) is still reviewed, however large it is. The limit applies to every language uniformly, so you can use it to raise a language's built-in limit as well as lower it. Set the default for new repos under **Defaults**.
* **Review Draft PRs**: review draft PRs before they're marked ready; contributors can override this for their own PRs in Personal settings
* **Summarize PRs on GitHub**: toggle auto-generated PR summaries
* **Auto-assign Reviewer**: assign a reviewer when a PR is opened without one
* **Skip Dependabot**: ignore PRs authored by Dependabot
* **Review Cross-Repo PRs**: review pull requests from forked or external repositories
* **Skip PRs by Author**: skip automatic checks for PRs from these GitHub users, except Check Run Agents with their own `authors` filter. Write each entry as the GitHub login; for a bot account, include the `[bot]` suffix, as in `my-bot[bot]`. Set the default for new repos under **Defaults**.
* **Skip PRs by Labels**: skip automatic checks for PRs with these GitHub labels, except Check Run Agents with their own `labels` filter. Set the default for new repos under **Defaults**.
* **Skip PRs by Target Branches**: skip automatic checks for PRs targeting these branches, except Check Run Agents with their own `targets` filter. Set the default for new repos under **Defaults**.
* **Always Review PR Labels**: always run code review for PRs with these labels, even when the repo's features are set to **Manual invocation only**. Set the default for new repos under **Defaults**.
Both limits are optional. Leave the field blank to apply no limit of your own; the field shows a **No limit** placeholder. Entering `0` also clears the limit.
Left blank, **Max Automatic Runs per PR** never caps a PR. **Max Reviewable File Size** adds no limit of its own, but two languages have a built-in one that still applies: TypeScript at 1 MB and Python at 2 MB. Every other language is unlimited until you set a value. Setting one also raises those two built-in limits.
### Approvability Settings
Approvability auto-approves eligible PRs based on eligibility criteria and correctness checks you define. Turn it on under [Features](#features); these settings govern how it decides. [Learn more about Approvability](/approvability).
* [**Minimum Blocking Severity**](/approvability#minimum-blocking-severity): the lowest correctness severity that blocks auto-approval. Outstanding correctness comments at or above it stop Macroscope from approving, whatever the eligibility judgment concluded; comments below it do not. Choose **Low**, **Medium**, **High**, **Critical**, or **Off**; defaults to **Medium**. Only a **GitHub Admin** can change it, per repo or under **Defaults**. **Off** removes the deterministic gate, so correctness never fails a PR on its own. Findings are still posted, and the Eligibility agent still weighs them, so it may still recommend human review on their merits. To exclude correctness from that judgment too, say so explicitly in the repo's [custom eligibility rules](/approvability#letting-eligibility-decide-correctness-instead).
### Repo Stages
* **Default Branch**: the main branch Macroscope indexes, based on your GitHub default branch.
* **Release Ref Patterns**: tell Macroscope which refs (tags and branches) count as releases for sharper summaries and agent responses. Supports [glob patterns](https://en.wikipedia.org/wiki/Glob_\(programming\)) like `release/*`, `release/**`, or `production`.
## Connections
Configure integrations with Slack, Jira, Linear, BigQuery, PostHog, LaunchDarkly, and GCP Cloud Logging. Each integration gives Macroscope more context and capabilities. [Learn more about integrations](/integrations).
### Webhooks
Create webhooks to trigger Macroscope's agent from external services. Each webhook generates a unique **trigger URL** and **API key**. If you want results forwarded to an external URL (instead of Slack), that URL must be added to the **allowlist** here. Only GitHub admins can manage the allowlist. [Learn more about the API](/api).
## Support
* **Slack Support Channel**: open a shared Slack channel with the Macroscope team. Enter your Slack email address and we'll send an invitation.
* **Synchronize with GitHub**: manually resync if your repos or data fall out of sync with GitHub.
# Getting Started
Source: https://docs.macroscope.com/setup-instructions
Everything you need to get Macroscope up and running
To get started, [sign up on the Macroscope website](https://app.macroscope.com/login), then follow the steps below.
## 1. Connect your GitHub repos
Authorize Macroscope in GitHub and select the repos you want to connect.
## 2. Activate your subscription
Complete Stripe checkout.
## 3. Set up Status
In the left sidebar, click **Status**, add a Product Overview, and choose your weekly report cadence. Once the backfill completes, you can use Status features like [Productivity Insights](/productivity), [Commit Summaries](/commit-summaries), and [Areas](/areas).
Until Status setup is complete, your sidebar shows only **Code Review** and **Status**. Home, Commits, Areas, and Macros stay hidden, and the Agent and API stay unavailable. They appear once your Product Overview is saved and the initial backfill finishes.
## 4. Connect Slack
Have a Slack admin connect Macroscope to your workspace to enable the [Agent](/agent) in Slack.
**Who can interact with Macroscope in Slack?**
By default, anyone in Slack can @mention Macroscope, but they're asked to log in first, and only users with GitHub or Macroscope access can interact. To allow anyone in Slack to ask questions without a Macroscope account, [contact support](/contact).
## 5. Connect integrations
Add integrations in **Settings โ Connections** to give the Agent access to more tools. The more you connect, the better the answers and the more actions Macroscope can take.
## 6. Install the CLI (optional)
Review your changes locally, before you push, from Claude Code, Codex, Cursor, or OpenCode:
```bash theme={null}
curl -sSL https://raw.githubusercontent.com/prassoai/macroscope-local/main/install.sh | bash
```
See the [CLI guide](/cli) for setup and usage.
## 7. Set up support Slack channel
Open a shared Slack channel with the Macroscope team via **Settings โ Support โ Slack Support Channel** for questions and feedback.
## What happens next
Once connected, Macroscope automatically:
* [Backfills](/backfilling) data from your GitHub repos
* Generates plain-language summaries for commits and PRs in GitHub
* Reviews PRs for correctness issues and suggests fixes
* Sends weekly activity reports
**Admin features** (billing, managing Areas, productivity settings, and email digest recipients) are limited to GitHub organization admins. Macroscope inherits permissions from GitHub.
If your company uses GitHub Enterprise Managed Users, [follow this guide](/github-enterprise-login).
Using a GitHub IP allow list? [Add Macroscope's IP addresses](/github-ip-allow-list) so Macroscope can reach your repos.
# Welcome to Macroscope
Source: https://docs.macroscope.com/welcome
Macroscope connects to your codebase and workflow tools to review code, answer questions, and take action.
## What Macroscope Does
* [**Agent**](/agent): ask anything about your codebase and tell it to take action (e.g. write code, open PRs, create tickets). Available via Slack, GitHub, and API.
* [**Code Review**](/bug-detection-and-fixes): reviews every PR for correctness, and can suggest and implement fixes.
* [**Status**](/productivity): see what's changing in your codebase with executive summaries, productivity insights, and weekly digests.
## Integrations
GitHub, Slack, Jira, Linear, BigQuery, PostHog, LaunchDarkly, GCP Cloud Logging, and more. [See all integrations](/integrations).
## Get Started
* [Getting started](/setup-instructions): connect your repos, Slack, and integrations
* [Install the CLI](/cli): run Macroscope locally from Claude Code, Codex, Cursor, or OpenCode
* [Quick wins after setup](/hit-the-ground-running): start using the agent