Skip to content

Environment Variables

PACE never stores credentials in pace.config.yaml. All secrets are read from environment variables at runtime.

LLM providers

VariableRequired forDescription
ANTHROPIC_API_KEYllm.provider: anthropicAnthropic API key. Get one at console.anthropic.com.
LLM_API_KEYllm.provider: litellmAPI key for the configured LiteLLM provider.
AWS_ACCESS_KEY_IDLiteLLM + BedrockAWS access key for Bedrock.
AWS_SECRET_ACCESS_KEYLiteLLM + BedrockAWS secret key for Bedrock.
AWS_REGION_NAMELiteLLM + BedrockAWS region (e.g. us-east-1).
AZURE_API_BASELiteLLM + AzureAzure OpenAI endpoint URL.
AZURE_API_VERSIONLiteLLM + AzureAzure API version (e.g. 2024-02-01).

Platforms

GitHub

VariableRequiredDescription
GITHUB_TOKENYesPersonal access token or Actions GITHUB_TOKEN. Needs repo scope (or public_repo for public repos).
GITHUB_REPOSITORYYesRepository in owner/repo format (e.g. acme-corp/acme-api). Auto-set in GitHub Actions.

GitLab

VariableRequiredDescription
GITLAB_TOKENYesProject or Group access token with api scope.
GITLAB_PROJECTYesProject ID (integer) or namespace path (group/project). Auto-set as $CI_PROJECT_ID in GitLab CI.
GITLAB_URLNoGitLab instance URL. Defaults to https://gitlab.com. Set for self-hosted instances.

Bitbucket

VariableRequiredDescription
BITBUCKET_USERYesBitbucket username.
BITBUCKET_APP_PASSWORDYesApp password with pullrequests:write and issues:write permissions.
BITBUCKET_WORKSPACEYesBitbucket workspace slug (formerly “team”).
BITBUCKET_REPO_SLUGYesRepository slug.

Jenkins

VariableRequiredDescription
JENKINS_URLYesBase URL of your Jenkins instance (e.g. https://ci.example.com).
JENKINS_USERYesJenkins username.
JENKINS_TOKENYesJenkins API token (not password). Generate in Jenkins → User → Configure → API Token.
JENKINS_JOB_NAMEYesJob or pipeline name to poll (e.g. my-app/main).

Jira

VariableRequiredDescription
JIRA_URLYesBase URL of your Jira Cloud instance — e.g. https://mycompany.atlassian.net. No trailing slash.
JIRA_EMAILYesAtlassian account email used for Basic auth.
JIRA_TOKENYesAPI token. Create at id.atlassian.com → Security → API tokens.
JIRA_PROJECT_KEYYesJira project key (e.g. ENG, PAY). Shown next to the project name in Jira.
JIRA_HOLD_ISSUE_TYPENoIssue type for HOLD escalation tickets. Default: Bug.
JIRA_HOLD_PRIORITYNoPriority for HOLD tickets. Default: High.
JIRA_ADVISORY_ISSUE_TYPENoIssue type for advisory finding tickets. Default: Task.
JIRA_ADVISORY_PRIORITYNoPriority for advisory tickets. Default: Medium.
JIRA_REVIEW_ISSUE_TYPENoIssue type for review gate tickets. Default: Task.

Local

No environment variables required.


Budget control

PACE tracks API token costs and can skip cron runs when a configurable daily limit is reached. Set these as GitHub Actions repository variables (Settings → Variables → Actions), not secrets.

VariableWho sets itDescription
PACE_DAILY_BUDGETYouMaximum USD spend per calendar day. Set to 0 or leave unset for unlimited. Example: 15
PACE_REPORTER_TIMEZONEYouIANA timezone for the budget day rollover (e.g. Asia/Kolkata, America/New_York). Defaults to UTC. Should match reporter.timezone in pace.config.yaml.
PACE_DAILY_SPENDPACE (auto)Running total of estimated API spend today. Reset automatically at midnight in the configured timezone. Do not set manually.
PACE_DAILY_SPEND_DATEPACE (auto)ISO date when PACE_DAILY_SPEND was last updated. Used to detect day rollovers. Do not set manually.
PACE_SPEND_TODAYpace.yml (auto)Prior accumulated spend before the current run starts. Injected into the orchestrator by the budget-check step. Not a persistent variable — do not set manually.

Story scoping

PACE can automatically refine stories that are predicted to exceed a cost or complexity threshold before FORGE runs. Set these as GitHub Actions repository variables.

VariableDefaultDescription
PACE_MAX_STORY_COST_USD1.50If the SCOPE agent predicts a story will cost more than this (USD), PRIME is asked to refine or split it before FORGE runs. Raise to 2.00+ for sprints with known high-complexity integration days.
PACE_MAX_STORY_AC5If a story has more acceptance criteria than this, PRIME is asked to reduce scope before FORGE runs.

See Proactive Story Scoping for how SCOPE and PRIME refinement interact.

Each completed run logs a per-model cost breakdown:

[PACE] API usage this run:
claude-haiku-4-5-20251001: 45,230 in + 8,912 out = $0.0718
claude-sonnet-4-6: 124,500 in + 31,200 out = $0.8430
Run total: $0.9148
[PACE] Daily spend updated: $2.14 (this run: $0.9148)

See Control Daily API Spend for setup instructions.


GitHub Actions integration

When running PACE inside a GitHub Actions workflow, most variables are provided automatically:

.github/workflows/pace.yml
jobs:
pace:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- run: pip install -r pace/requirements.txt
- name: Run PACE Day ${{ inputs.day }}
run: python pace/orchestrator.py --day ${{ inputs.day }}
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # auto-provided
# GITHUB_REPOSITORY is auto-provided by Actions

Setting variables locally

Terminal window
# Minimum for local development with Anthropic + local platform:
export ANTHROPIC_API_KEY="sk-ant-..."
# GitHub platform:
export GITHUB_TOKEN="ghp_..."
export GITHUB_REPOSITORY="my-org/my-repo"
# Verify all required vars are set:
python pace/pace/config.py --check-env

Variable precedence

PACE reads variables in this order:

  1. Process environment (export VAR=... or CI-injected)
  2. .env file in the pace/ directory (if python-dotenv is installed)

Never commit .env files or put credentials in pace.config.yaml.