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

# Outrider configuration

> Install and configure Outrider as a GitHub Action for a repository.

Outrider runs as a GitHub Action in the repository you configure.

For the shortest setup path, use [Studio Quickstart](https://studio.remyx.ai/start). It connects your provider, configures the repository, and starts the first run.

## Manual setup

The reference below shows how to install the workflow, provide credentials, and configure its inputs.

## Review the installation

Check the workflow file and permissions before enabling scheduled or manual runs. The GitHub Actions log shows each run's execution and outcome.

## Manual install

The CLI and the UI do this for you. Install by hand when neither is an option, or to see exactly what they do.

**1. Create a Research Interest and an API key**

Connect the repo in [studio.remyx.ai](https://studio.remyx.ai) so Remyx ingests its history and creates a Research Interest; note its UUID. Create a Remyx API key under [Account → API keys](https://docs.remyx.ai/platform/configure/account.md#api-keys).

**2. Add two repo secrets**

Under *Settings → Secrets and variables → Actions*: `REMYX_API_KEY`, and the secret for the provider you route at (`ANTHROPIC_API_KEY`, `ZAI_API_KEY`, `MOONSHOT_API_KEY`, `OPENAI_API_KEY`, `OPENROUTER_API_KEY`, or `BACKBOARD_API_KEY` for the Backboard agent). Set by hand, the keys only ever exist in your repo; `remyxai outrider init --github-secrets-only` gets the same property without the manual steps.

**3. Allow Actions to open PRs**

*Settings → Actions → General → Workflow permissions* → tick **Allow GitHub Actions to create and approve pull requests**. Without it, PR creation fails with `HTTP 403`.

**4. Add the workflow**

Save this as `.github/workflows/outrider.yml`. The `workflow_dispatch` inputs are what `remyxai outrider trigger` sets per run.

```yaml theme={null}
name: Outrider
on:
  schedule:
    - cron: '0 14 * * 1'   # Mondays 14:00 UTC; pick any cadence
  workflow_dispatch:
    inputs:
      mode:
        description: 'recommend (default), brief, smoke, weekly-summary'
        required: false
        default: ''
      pin-arxiv:
        required: false
        default: ''
      search-method:
        required: false
        default: ''
      lead-content:
        description: 'A gap analysis in recommend mode; the whole spec in brief mode'
        required: false
        default: ''
      publish:
        description: 'pr (default) or branch'
        required: false
        default: 'pr'
      claude-timeout:
        description: 'Seconds per agent phase (the name remyxai outrider trigger sends; agent-timeout is the same ceiling)'
        required: false
        default: '1500'
concurrency:
  group: outrider-${{ inputs['pin-arxiv'] || inputs['start-from-ref'] || github.run_id }}
  cancel-in-progress: false
jobs:
  recommend:
    runs-on: ubuntu-latest
    timeout-minutes: 55
    permissions:
      contents: write
      pull-requests: write
      issues: write
      # discussions: write   # only for mode: weekly-summary
    env:
      REMYX_API_KEY: ${{ secrets.REMYX_API_KEY }}
      ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}   # or ZAI_API_KEY, MOONSHOT_API_KEY, ...
    steps:
      - uses: remyxai/outrider@v1
        with:
          interest-id: 'YOUR-INTEREST-UUID-HERE'
          mode: ${{ inputs.mode }}
          pin-arxiv: ${{ inputs.pin-arxiv }}
          search-method: ${{ inputs.search-method }}
          lead-content: ${{ inputs.lead-content }}
          publish: ${{ inputs.publish }}
          claude-timeout: ${{ inputs.claude-timeout }}
```

To route per run at a different provider, add `agent`, `provider` and `model` dispatch inputs and pass each backend's secret in `env:`; see [Model backends](https://docs.remyx.ai/platform/agents/backends.md).

**5. First run**

*Actions → Outrider → Run workflow*. A draft PR, an Issue, or a branch appears when it completes.

The permissions above are the minimum: `contents: write` to push the branch, `pull-requests: write` and `issues: write` to open artifacts, plus `discussions: write` for the weekly digest. With a same-repo install the action mints a `remyx-ai[bot]` token for the artifacts and uses the workflow token only as a fallback.

***

> [!WARNING]
>
> Connect Remyx to your GitHub account in [Connectors](https://docs.remyx.ai/platform/configure/connectors.md). The [**GitHub**](https://docs.remyx.ai/platform/configure/github.md) connector installs the Remyx GitHub App in your account or organization; include access to the repos you want.
>
> A connected [**model provider**](https://docs.remyx.ai/platform/configure/connectors.md#model-providers-and-coding-agents) is required to draft PRs. Model usage is billed to your provider account.
>
> For the CLI, also create a [Remyx API key](https://docs.remyx.ai/platform/configure/account.md#api-keys).

Either path provisions the workflow and fires the first run. A draft PR or Issue lands in minutes.

## From the CLI

```bash theme={null}
pip install remyxai

# authenticate the CLI with your Remyx API key
export REMYXAI_API_KEY="YOUR_REMYX_API_KEY"

# install Outrider on the repo and auto-create a Research Interest from it
remyxai outrider init --repo owner/name --auto-interest
```

`--auto-interest` creates a Research Interest from the repo; drop it and pass `--interest <uuid>` to use an existing one. If the GitHub App isn't installed yet, the command prints the install link. Add `--github-secrets-only` to seal your provider key against the repo's own Actions public key on your machine, so it reaches GitHub as ciphertext and no copy is stored anywhere else (see [Security](https://docs.remyx.ai/platform/agents/security.md#where-the-model-key-lives)).

**No GitHub App?** `setup-local` provisions with your own authenticated `gh` CLI instead; PRs then come from your account, not **remyx-ai\[bot]**. ([details](https://docs.remyx.ai/cli/outrider-setup.md#install-without-the-github-app))

```bash theme={null}
remyxai outrider setup-local --repo owner/name --auto-interest
```

## From the UI

Use [**+ Set up an agent**](https://docs.remyx.ai/platform/agents/overview.md#set-up-an-agent) on the Agents page, or create a [Research Interest from your repo](https://docs.remyx.ai/platform/discover/feed.md#research-interests-from-a-repo) and choose **Set it up for me**. No terminal required.

## By hand

When the CLI isn't an option (CI-restricted environments, org policy against helper tooling), install the action yourself. See [Manual install](#manual-install) below.

## Identity and install

Either path pins the marketplace action at `remyxai/outrider@v1`. A same-repo install needs no `github-token`: the action self-mints a **remyx-ai\[bot]** App token at runtime. Commits and PRs are authored by the bot (GitHub identity `remyx-ai[bot]`), and the setup PR carries a `Co-Authored-By: remyx-ai[bot]` trailer so credit survives a squash-merge.

`@v1` floats: a published Outrider release moves the `v1` tag to the released commit, so a merged fix reaches every install at the next release. Change-controlled orgs can pin an exact release instead (`remyxai/outrider@v1.9.0`) and bump deliberately. Inside the runner, the coding-agent CLIs are installed at exact versions pinned in the action's own `package.json`, Python dependencies come from a pinned requirements file, and no system packages are installed. See [Supply chain](https://docs.remyx.ai/platform/agents/security.md#supply-chain).

You can also talk to a run by mentioning `@remyx-ai` on the PR or Issue. Research questions get read-only answers (see [Deep Research](https://docs.remyx.ai/platform/discover/briefs.md)); `@remyx-ai validate` starts a [Validate](https://docs.remyx.ai/platform/agents/validate.md) run on the PR.

> [!TIP]
>
> Outrider's artifacts carry [Open Knowledge Format](https://github.com/remyxai/outrider) frontmatter. A repo-root `CONTEXT.md`, a `REVIEW.md`, and agent-instruction files (`CLAUDE.md`, `AGENTS.md`, `CONTRIBUTING.md`) sharpen its picks. See [Steer Outrider from your repo](#steer-outrider-from-your-repo).

***

## Steer Outrider from your repo

The selection and drafting passes read your repo before the model picks anything. The more signal the repo emits, the more precise the pick.

* **`REVIEW.md`** (or `.github/REVIEW.md`) is the highest-precedence signal: your review conventions, test bar, scope stance, benchmark expectations and anti-patterns, threaded into the drafter and the downstream fidelity and convention passes. A template is in the action repo at [`docs/REVIEW-template.md`](https://github.com/remyxai/outrider/blob/main/docs/REVIEW-template.md).
* **Agent instruction files**, in this order: `CLAUDE.md`, `AGENTS.md`, `.cursorrules`, `.github/copilot-instructions.md`, `CONTRIBUTING.md`, `CONTEXT.md`. Lint and house-style rules are read from the repo's own config (ruff, pre-commit, black, flake8) rather than hardcoded.
* **`ENVIRONMENTS.md`** (or `ENVIRONMENT.md`), written by the workflow, tells the agent how to set up and run the repo's environment.
* **Discussions**, ranked by overlap with the candidate paper. A fork without Discussions falls back to its parent repo's.
* **Recent merged PRs** supply the PR-body template and contributor conventions the convention pass applies; `.github/ISSUE_TEMPLATE/` shapes Issues.
* **Direction signals** gate the strictest pick shape, a new capability your repo lacks: a README roadmap heading, a recurring theme in `CONTEXT.md`, or an open maintainer-authored `[RFC]` Issue. Without at least one, extension-shaped candidates are rejected.
* **Not re-recommending a paper.** A paper is treated as discharged when an Outrider-opened Issue exists for it (open or closed), or a maintainer-opened Issue links its arXiv id. Reopen the Issue to put it back in play.

***

## Configuration

The defaults are conservative; most repos only touch `interest-id` and the schedule.

| Input | Default | What it does |
| - | - | - |
| `interest-id` | `''` | The Research Interest UUID the run draws candidates from. Required in every mode except `brief`, which uses it (when set) only for repo context |
| `mode` | `recommend` | What the run produces: `recommend` (rank, validate, PR or Issue), `brief` (draft a PR from `lead-content`, no arXiv anchor; see [Run from a design brief](https://docs.remyx.ai/platform/agents/outrider-run-modes.md#run-from-a-design-brief)), `smoke` (verify the run's `agent` / `provider` / `model` wiring against the vendor in about 30s and exit, without cloning the repo or opening anything; see [Verify a pairing](https://docs.remyx.ai/platform/agents/backends.md#verify-a-pairing-before-you-spend-a-run)), `weekly-summary` (post a digest, see [Weekly digest](#weekly-digest)), `fidelity` / `convention` / `test` (run a single [refinement phase](https://docs.remyx.ai/platform/agents/outrider-run-modes.md#refinement-pass-chain) standalone), or `issue-convention` (fold an Issue body to the repo's `ISSUE_TEMPLATE`) |
| `chain` | `true` | After opening a draft PR, run the [refinement chain](https://docs.remyx.ai/platform/agents/outrider-run-modes.md#refinement-pass-chain) inline in the same run (fidelity, convention, test). Set `false` for recommend-only: cheaper, leaves the draft as Outrider first wrote it |
| `min-confidence` | `moderate` | Skip recommendations below `high` / `moderate` / `low` |
| `draft-mode` | `always` | `always` (draft), `on_test_failure` (ready if tests pass), or `never` (skip on test failure). A diff that touches a risky surface opens as a draft regardless |
| `rate-limit-days` | `7` | Cadence guard. Any value above 0 skips the run while an **open** Remyx PR or Issue exists on the target; merging or closing it releases the gate. The numeric value is otherwise ignored, kept as an on/off bit for workflow files written for the earlier sliding-window semantics. `0` disables |
| `lookback` | `week` | Candidate pool window: `today` / `week` / `month` |
| `candidate-pool` | `25` | How many candidates the selection pass chooses from |
| `test-integration-policy` | `strict` | `strict` demotes to an Issue if new tests don't import an existing module; `soft` opens a draft with a warning; `off` skips the gate. Use `soft` for component or library repos where a standalone module *is* the contribution |
| `guardrails-blocklist` | `''` | Path globs the agent must **not** touch (e.g. `secrets/**`, `*.lock`), added on top of the fixed default block (`.github/workflows/**`). Blocklist matches always win |
| `guardrails-allowlist` | `''` | Deprecated since v1.7.24 and a no-op: path access is permissive by default. Setting it logs a warning. Removal planned in v2; use `guardrails-blocklist` |
| `publish` | `pr` | `pr` opens a draft PR and runs the inline chain; `branch` pushes the branch only: no PR, no chain, no maintainer-facing artifact until the team opens the PR themselves. Branch mode is the drafter tier of the [two-tier pattern](https://docs.remyx.ai/platform/agents/backends.md#the-two-tier-drafter-refiner-pattern) |
| `agent` | `''` | Which coding-agent CLI drives the implementation: `backboard` (Backboard R-CLI), `claude` (Claude Code), or `codex` (OpenAI Codex); unset resolves to `claude`. A separate axis from `provider`, which picks the model. An agent speaks one API family, so an impossible pair is refused up front, naming the agent that does serve your provider. See [the `agent` input](https://docs.remyx.ai/platform/agents/backends#the-agent-input) |
| `provider` | `''` | Route the coding agent at a named backend: `anthropic`, `openai`, `zai`, `moonshot`, `openrouter`, or `custom`. Resolves that vendor's credential, endpoint, and auth style, and hands the agent exactly one credential; pass each backend's secret in the step's `env:`. Empty preserves legacy behavior. See [Model backends](https://docs.remyx.ai/platform/agents/backends.md#the-provider-input) |
| `model` | `''` | Model to request from the provider (e.g. `claude-opus-4-8`, `glm-5.3`, `kimi-k3`, `gpt-5.4-mini`), forwarded as the selected agent's own model variable (`ANTHROPIC_MODEL`, `CODEX_MODEL`, `BACKBOARD_MODEL`); also keys the per-model cost rate table. Required for `agent: backboard`, which has no default of its own |
| `model-base-url` | `''` | Override the selected agent's base-URL variable (`ANTHROPIC_BASE_URL` or `CODEX_BASE_URL`) to reach a **custom** endpoint that speaks the agent's API family (AWS Bedrock, GCP Vertex, an on-prem proxy). For the known backends prefer the `provider` input; set alongside a named provider it still wins, with a warning that it has overridden the registry endpoint and that the provider's credential is going there. Ignored for a native router, whose base-URL variable addresses its own control plane. Cost telemetry becomes an estimate |
| `agent-timeout` | *(falls back to `claude-timeout`)* | Wall-clock seconds for each coding-agent phase; every phase shares the ceiling. The generalized name for `claude-timeout`: pass either, and this one wins if both are set. For an agent with no `turn_cap` ([capability table](https://docs.remyx.ai/platform/agents/backends.md#what-each-agent-can-report)) it is the **only** bound on spend, so keep it tight on cron-driven installs. Remyx-provisioned installs bake `3600` with a 90-minute job wall |
| `claude-timeout` | `1500` | The original name for the same ceiling, supported indefinitely. The `1500` default applies to hand-written and `setup-local` workflows; raise to `3600` for backends whose thinking modes add per-turn latency, lower to cap cost |
| `pin-arxiv` | `''` | Implement one specific `arxiv_id` and skip the selection pass, for reproducible re-runs and warm starts. The paper need not be in the candidate pool: it is looked up in the Remyx catalog, then fetched from arxiv.org (`skipped_pin_arxiv_unresolvable` if neither resolves). Mutually exclusive with `search-method` |
| `search-method` | `''` | A free-text method query. Resolves the top match via engine search and implements it, bypassing the candidate pool and the selection pass. Mutually exclusive with `pin-arxiv`. (The CLI flag is `--search-method`) |
| `start-from-ref` | `''` | Branch, tag or SHA on the target to start the coding session from. The agent sees that ref's diff already applied, which is how a refinement run builds on a prior draft. The result pushes to a `<paper-slug>-refined` branch |
| `lead-content` | `''` | Markdown the agent reads as leading context. In `recommend` mode it replaces the paper's suggested experiment in the run's SPEC.md (a gap analysis, or a LEAD Issue's content); in `brief` mode it is the whole spec. A `linear.app/<workspace>/issue/<ID>` URL is resolved to the issue body when `linear-api-key` is set |
| `linear-api-key` | `''` | Linear API key used to resolve `lead-content` URLs of the form `linear.app/<workspace>/issue/<ID>` into the issue's body and metadata. Empty: the URL falls through to a plain web fetch |
| `fidelity-policy` | `block` | Pre-PR fidelity gate: `block` (one scoped patch attempt on a needs-judgment verdict, then skip; keeps hallucinated implementations out of public PRs), `advisory` (the audit attaches its coverage matrix but never blocks; best for curated warm-start runs), or `off` |
| `staged-synthesis` | `false` | Opt-in two-stage session: a bounded research pass first (target-repo state, prior attempts, conventions), then coding reads its findings. Adds about \$0.15–0.50 and 1–3 minutes |
| `maintain-state` | `false` | Opt-in per-fork cross-run learning via `.remyx/repo_intel.yaml`: confirmed landing zones, rejected mechanism shapes, exploration budget |
| `enable-cocoindex` | `true` | Installs the `ccc` AST-based semantic code search binary on the runner's PATH for every agent (the matching skill is installed for Claude Code only), grounding call-site claims on real paths. Adds about 60–90s and about 1 GB of dependencies to the run, and also powers the "Convention precedents" enrichment on Issue bodies. Disable to slim the runner |
| `pr-number` | `''` | PR number for the standalone chain phases (`fidelity` / `convention` / `test`), from the event payload or a dispatch input. Empty in `recommend` mode; the inline chain threads the just-opened PR through automatically |
| `issue-number` | `''` | Issue number for `mode: issue-convention`. Empty in `recommend` mode; the inline chain threads the just-opened Issue through automatically |
| `weekly-discussion-id` | `''` | Discussion number (from its URL) or GraphQL node ID for `mode: weekly-summary`. Read only in that mode, which skips cleanly when it's empty |
| `github-token` | `''` | Token for git push, PR and Issue creation, and the dedup check. Leave empty for a same-repo install: the action self-mints a `remyx-ai[bot]` token through the Remyx engine and falls back to the workflow's own `github.token` when minting isn't available. Set a PAT with `repo` scope only for a cross-repo controller (the action runs in repo A and writes to repo B) |

### Outputs

Every output below is declared on the action, so a downstream step can read it as `steps.<id>.outputs.<name>`.

| Output | When | Description |
| - | - | - |
| `status` | always | The run outcome; see [Run outcomes](https://docs.remyx.ai/platform/agents/outrider-run-modes.md#run-outcomes) |
| `pr_url` / `pr_number` | `pr_opened*` | The opened PR |
| `issue_url` / `issue_number` | `issue_opened*` | The opened Issue |
| `arxiv` | a paper was picked | The arXiv id (empty in brief mode) |
| `tier` | a paper was picked | `high` / `moderate` / `low` / `noise` |
| `candidates_considered` / `selection_rejected` | recommend mode | How many candidates the selection pass weighed, and how many it rejected |
| `chain_fidelity_status` / `chain_convention_status` / `chain_test_status` | the chain ran on a PR | Per-phase outcome of the inline [refinement chain](https://docs.remyx.ai/platform/agents/outrider-run-modes.md#refinement-pass-chain) |
| `chain_draft_dropped` | the chain ran | `true` when the test gate passed and moved the draft PR to ready for review; `false` when it stayed a draft |
| `cost_usd` / `input_tokens` / `output_tokens` | always | Model spend and token usage for the run, on whichever backend ran it; see [Costs](#costs) |
| `discussion_comment_url` | `weekly_summary_posted` | The posted weekly digest comment |

```yaml theme={null}
steps:
  - uses: remyxai/outrider@v1
    id: outrider
    with:
      interest-id: ${{ vars.REMYX_INTEREST_ID }}
  - name: Ping the channel when a draft is ready for review
    if: steps.outrider.outputs.chain_draft_dropped == 'true'
    run: echo "ready: ${{ steps.outrider.outputs.pr_url }}"
```

### Concurrency

Workflows written by `remyxai outrider init` and `setup-local` key their concurrency group by what the dispatch works on (`pin-arxiv`, then `start-from-ref`, then the run id), so distinct papers or branches run in parallel while a true duplicate of the same target queues behind its predecessor. A flat `group: outrider` permits exactly one pending run and silently cancels the rest, which reads as a flake; installs written before this change should re-provision (`init --force`), and the CLI's `trigger --wait-for-slot` waits for a pending run instead of cancelling it.

### Guardrails

Outrider constrains what the agent may change so a draft PR is reviewable:

* **Fixed block:** `.github/workflows/**` is always off-limits. An agent editing its own workflow file is the one change that compounds silently across future runs. `commit_and_push` strips any workflow edit before the push and lists the dropped paths in the step summary. `guardrails-blocklist` adds your own globs on top, and blocklist matches always win.
* **Risky surface (flag, not block):** a diff that touches dependency manifests or lockfiles, CI pipelines, git hooks, container or shell scripts is forced to draft even under `draft-mode: never`, labelled `risky-surface`, and gets a "review before landing" section in the PR body listing the files. A new method that genuinely needs a dependency still opens, just flagged.
* **Integration checks** (post-session, pre-push): at most 3 new `.py` files per run, and at least one newly added function or class must be invoked from another changed file; an import alone doesn't count. Violations terminate the run before any push (`rejected_path_violations`); orphan code downgrades the run to an Issue.
* **Canary:** the agent must echo a per-run canary token in its final commit. A missing or wrong canary is the fingerprint of an injection that hijacked the agent's output, and downgrades routing from PR to Issue (`issue_opened_canary_missing`).
* **Validators:** stub density, the test-integration gate, a self-review orphan check, a diff-risk score gate, and an outbound secret scan that aborts the run rather than redacting (`aborted_secret_in_payload`). Each has its own Issue-route or abort status.

These gates are why a run picks an Issue over a PR when an honest implementation would be larger or riskier than a reviewable draft. The full model, including what the agent process can and cannot reach, is on the [Security](https://docs.remyx.ai/platform/agents/security.md) page.

***

## Costs

You bring your own model-provider key ([any backend](https://docs.remyx.ai/platform/agents/backends.md)), so model usage is billed to you by that provider. Outrider runs are not charged to your Remyx balance.

* **Model usage:** on Anthropic, a full PR-route run **with the inline [chain](https://docs.remyx.ai/platform/agents/outrider-run-modes.md#refinement-pass-chain)** is about **\$5–6**; recommend-only (`chain: false`) is **\$1–3**. Other backends scale with their per-token rates, which differ by an order of magnitude between a budget model and a flagship one, so compare backends on your own repo rather than on a rule of thumb: every run reports its own `cost_usd`, and [Reports → Costs](https://docs.remyx.ai/platform/review/reports.md#costs) breaks spend down by agent, provider and model. A run that skips after the selection pass costs less still: it reads the repo to verify fit, then exits.
* **GitHub Actions:** minutes on `ubuntu-latest`. A run takes a few minutes to around twenty depending on the backend, the repo, and whether the chain runs; provisioned installs cap each agent phase at 60 minutes and the job at 90.
* **Remyx API:** included.

Each run reports `cost_usd`, `input_tokens`, and `output_tokens` as outputs and in the run summary, with a `cost_basis` that says where the dollars came from: `backend_rate_table` (computed from the vendor's published per-token rates for the named model), `backend_rate_table_approx` (the model has no rate row, so the host's default model's rates were used), `claude_code_envelope` or `agent_envelope` (the agent CLI's own figure), or `unavailable` (the backend reported no dollars; tokens are still exact). The [two-tier drafter/refiner pattern](https://docs.remyx.ai/platform/agents/backends.md#the-two-tier-drafter-refiner-pattern) is the structured way to spend less per artifact.

### Weekly digest

Run a second weekly cron with `mode: weekly-summary` and a `weekly-discussion-id` input to post a 7-day digest to a GitHub Discussion: outcomes, verified costs, license distribution, and open Issues with their next actions. It requires the `discussions: write` permission and makes one model call per week (about **\$0.10–0.20** on Anthropic); the rest is GitHub API reads.

## Next steps

[Run Outrider on a repository](https://docs.remyx.ai/tutorials/outrider-repository.md) · [Use the CLI](https://docs.remyx.ai/cli/outrider.md) · [Read the GitHub Action configuration](https://docs.remyx.ai/platform/agents/outrider-configuration.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.