# Copy to .env (gitignored) and fill in. Sourced by scripts/e2e_*.sh. # Target repo. Forked or sandboxed copy of solvcon recommended so the # bot's test comments don't pollute the main project. GITHUB_REPO=tigercosmos/solvcon # Bot identity. The bot GitHub account must be a collaborator on # $GITHUB_REPO (or, for org repos, a member of a team with write # access). BOT_HANDLE=solvcon-bot # PAT for the bot account. Classic: repo + read:org. Fine-grained: # pull-requests:write, contents:read, metadata:read, members:read. BOT_PAT=ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PR number in $GITHUB_REPO to leave the test mention on. The PR must # be open. Either reuse an existing one or open a throwaway one. TEST_PR_NUMBER=1 # Reviewer selection — pick one. mock keeps the e2e free and # deterministic. Every other kind runs the matching AI CLI through # codexmon (install with `make codexmon`), which supervises the run: # heartbeats, stall detection, timeouts, result capture. # # REVIEWER_KIND=mock # default; spawns /bin/cat and echoes the diff # REVIEWER_KIND=claude # codexmon run --agent claude (claude -p) # REVIEWER_KIND=codex # codexmon run --agent codex (codex exec) # REVIEWER_KIND=cursor # codexmon run --agent cursor (cursor-agent -p) REVIEWER_KIND=mock # Optional: path to the codexmon executable. Default resolves via # PATH. scripts/install_codexmon.sh installs to ~/.local/bin. #CODEXMON_BIN= # Optional, kind-specific. Empty falls back to a per-kind default: # claude -> claude-opus-4-8 # codex -> gpt-5.5 # cursor -> (codexmon's default, composer) # Override to anything else, e.g. claude-sonnet-4-6 or gpt-5. #REVIEWER_MODEL= # Effort. For claude this is exported as CLAUDE_EFFORT into the child # env. For codex it becomes `-c reasoning.effort=$value`. cursor has # no effort knob (ignored). Empty falls back to "high". Other values: # minimal, low, medium, xhigh. #REVIEWER_EFFORT= # Override the built-in review-prompt preamble. Use REVIEWER_PROMPT for # a literal string, REVIEWER_PROMPT_FILE for a path whose contents are # read. They are mutually exclusive. #REVIEWER_PROMPT= #REVIEWER_PROMPT_FILE= # Optional repo-specific review guide APPENDED to the prompt (default # or overridden): style rules, known invariants, what to skip. Literal # string or file path; mutually exclusive with each other. #REVIEWER_GUIDE= #REVIEWER_GUIDE_FILE= # Diff sizing. MAX_DIFF_BYTES is the review-payload budget: a bigger # diff is trimmed per file (whole "diff --git" sections dropped and # listed in the posted comment). MAX_DIFF_FETCH_BYTES caps the download # itself (default 5x MAX_DIFF_BYTES); only a diff bigger than that is # skipped outright. #MAX_DIFF_BYTES=200000 #MAX_DIFF_FETCH_BYTES= # Changed-file context: the bot fetches the head-side contents of files # the diff touches and appends them (fenced) to the review payload so # the AI sees whole files, not just hunks. Per-file cap, total cap # (0 disables the feature), and max number of files fetched per review. #MAX_CONTEXT_FILE_BYTES=65536 #MAX_CONTEXT_TOTAL_BYTES=262144 #MAX_CONTEXT_FILES=10 # Mock-only knobs. The e2e_reviewer_failure scenario sets # REVIEWER_MOCK_EXIT_CODE non-zero to assert the bot handles a # reviewer crash. REVIEWER_MOCK_OUTPUT (if set) replaces the diff-echo # with a fixed string. #REVIEWER_MOCK_EXIT_CODE=0 #REVIEWER_MOCK_OUTPUT= # Optional: where to put the bot's state file during the test. The # script cleans it up between runs so a previous run's "handled # comment" entry doesn't suppress this run's mention. STATE_FILE=/tmp/solvcon-bot-e2e.state # Optional: additional env-var names to pass through to the reviewer # subprocess. PATH/HOME/LANG/TERM/USER/LOGNAME are always passed. # Use this to give the AI CLI its credentials. Examples: # REVIEWER_ENV_PASSTHROUGH=ANTHROPIC_API_KEY # REVIEWER_ENV_PASSTHROUGH=OPENAI_API_KEY,ANTHROPIC_API_KEY # Leave empty when the CLI authenticates via files in $HOME (codex's # ~/.codex, claude after `claude /login` to the keychain). #REVIEWER_ENV_PASSTHROUGH= # Operator-facing diagnostics. Default off for the bot daemon — # operators with structured logs usually don't want raw AI output # interleaved. run-reviewer turns it on by default for human-friendly # local iteration. # # REVIEWER_STREAM_IO=1 mirrors codexmon's live output (heartbeats + # agent progress on stderr) to the bot's stderr in real time. Accepts # 1/0/true/false/yes/no/on/off. #REVIEWER_STREAM_IO= # # codexmon watchdog knobs, forwarded as flags on `codexmon run`. # REVIEWER_HEARTBEAT_SEC -> --heartbeat (unset/0 = codexmon's 10s # default). REVIEWER_IDLE_TIMEOUT_SEC -> --idle-timeout: kill the # agent after N idle seconds when nothing is in flight (unset = # codexmon's 180s default; 0 = disable). The wall-clock limit is # SUBPROCESS_TIMEOUT_SEC -> --wall-timeout. #REVIEWER_HEARTBEAT_SEC= #REVIEWER_IDLE_TIMEOUT_SEC= # Reviewer wall-clock limit in seconds (default 300). Accepted range # 1..86400 (1 day) — the bot adds a grace period to this value when # arming its own kill deadline, so absurd values are rejected up front. #SUBPROCESS_TIMEOUT_SEC=300 # Per-request HTTP timeouts against the GitHub API, in seconds. # Accepted range 1..3600 (1 hour) each. #HTTP_CONNECT_TIMEOUT_SEC=10 #HTTP_READ_TIMEOUT_SEC=30 #HTTP_WRITE_TIMEOUT_SEC=30