Skip to content

Route reviewer publishing through PowerForge #3937

Route reviewer publishing through PowerForge

Route reviewer publishing through PowerForge #3937

name: IntelligenceX Review
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
workflow_dispatch:
inputs:
repo:
description: 'Repository (owner/name) for manual runs'
required: false
default: ''
pr_number:
description: 'Pull request number for manual runs'
required: false
default: ''
provider:
description: 'Review provider override for manual runs (openai, claude, copilot)'
required: false
default: ''
model:
description: 'Optional model override for manual runs'
required: false
default: ''
openai_model:
description: 'Optional OpenAI model override for manual runs'
required: false
default: ''
copilot_model:
description: 'Optional Copilot model override for manual runs'
required: false
default: ''
copilot_launcher:
description: 'Copilot launcher override for manual runs (binary, gh, auto)'
required: false
default: ''
openai_account_id:
description: 'Override OpenAI account id for this run'
required: false
default: ''
openai_account_ids:
description: 'Override ordered OpenAI account ids (CSV) for this run'
required: false
default: ''
openai_account_rotation:
description: 'Override OpenAI account rotation (first-available|round-robin|sticky) for this run'
required: false
default: ''
openai_account_failover:
description: 'Override OpenAI account failover (true|false) for this run'
required: false
default: ''
usage_budget_guard:
description: 'Override usage budget guard (true|false) for this run'
required: false
default: ''
usage_budget_allow_credits:
description: 'Override credits budget allowance (true|false) for this run'
required: false
default: ''
usage_budget_allow_weekly_limit:
description: 'Override weekly-limit budget allowance (true|false) for this run'
required: false
default: ''
history_enabled:
description: 'Override reviewer history awareness (true|false)'
required: false
default: ''
history_include_external_bot_summaries:
description: 'Include configured external bot summaries as supporting context (true|false)'
required: false
default: ''
history_external_bot_logins:
description: 'External bot logins included as supporting history context (CSV)'
required: false
default: ''
history_artifacts:
description: 'Write reviewer history artifacts (true|false)'
required: false
default: ''
swarm_enabled:
description: 'Override reviewer swarm mode (true|false)'
required: false
default: ''
swarm_shadow_mode:
description: 'Override reviewer swarm shadow mode (true|false)'
required: false
default: ''
swarm_reviewers:
description: 'Override reviewer swarm roles (CSV or JSON)'
required: false
default: ''
swarm_max_parallel:
description: 'Override reviewer swarm max parallel reviewers'
required: false
default: ''
swarm_aggregator_model:
description: 'Override reviewer swarm aggregator model'
required: false
default: ''
swarm_fail_open_on_partial:
description: 'Override swarm partial-failure fail-open behavior (true|false)'
required: false
default: ''
swarm_metrics:
description: 'Override swarm metrics/artifact capture (true|false)'
required: false
default: ''
workflow_call:
inputs:
repo:
description: 'Repository (owner/name) override for reusable callers'
required: false
type: string
pr_number:
description: 'Pull request number override for reusable callers'
required: false
type: string
provider:
description: 'Review provider override for reusable callers'
required: false
type: string
agent_profile:
description: 'Named agent profile override for reusable callers'
required: false
type: string
model:
description: 'Model override for reusable callers'
required: false
type: string
openai_model:
description: 'OpenAI model override for reusable callers'
required: false
type: string
copilot_model:
description: 'Copilot model override for reusable callers'
required: false
type: string
copilot_launcher:
description: 'Copilot launcher override for reusable callers'
required: false
type: string
openai_account_id:
description: 'OpenAI account id override for reusable callers'
required: false
type: string
openai_account_ids:
description: 'Ordered OpenAI account ids override for reusable callers'
required: false
type: string
openai_account_rotation:
description: 'OpenAI account rotation override for reusable callers'
required: false
type: string
openai_account_failover:
description: 'OpenAI account failover override for reusable callers'
required: false
type: string
usage_budget_guard:
description: 'Usage budget guard override for reusable callers'
required: false
type: string
usage_budget_allow_credits:
description: 'Credits budget allowance override for reusable callers'
required: false
type: string
usage_budget_allow_weekly_limit:
description: 'Weekly-limit budget allowance override for reusable callers'
required: false
type: string
profile:
description: 'Prompt profile override for reusable callers'
required: false
type: string
style:
description: 'Review style override for reusable callers'
required: false
type: string
output_style:
description: 'Output style override for reusable callers'
required: false
type: string
strictness:
description: 'Strictness override for reusable callers'
required: false
type: string
tone:
description: 'Tone override for reusable callers'
required: false
type: string
focus:
description: 'Focus override for reusable callers'
required: false
type: string
auto_approve_enabled:
description: 'Auto-approval enablement override for reusable callers'
required: false
default: ''
type: string
auto_approve_dry_run:
description: 'Auto-approval dry-run override for reusable callers'
required: false
default: ''
type: string
auto_approve_required_labels:
description: 'Auto-approval required labels for reusable callers'
required: false
default: ''
type: string
auto_approve_allowed_authors:
description: 'Auto-approval allowed authors for reusable callers'
required: false
default: ''
type: string
auto_approve_ignored_check_names:
description: 'Auto-approval ignored check names for reusable callers'
required: false
default: ''
type: string
length:
description: 'Review length override for reusable callers'
required: false
type: string
mode:
description: 'Review mode override for reusable callers'
required: false
type: string
persona:
description: 'Persona override for reusable callers'
required: false
type: string
notes:
description: 'Additional prompt notes override for reusable callers'
required: false
type: string
ci_context_enabled:
description: 'CI context enablement override for reusable callers'
required: false
type: string
ci_context_include_check_summary:
description: 'CI check summary override for reusable callers'
required: false
type: string
ci_context_include_failed_runs:
description: 'CI failed-run metadata override for reusable callers'
required: false
type: string
ci_context_include_failure_snippets:
description: 'CI failure snippet mode override for reusable callers'
required: false
type: string
ci_context_max_failed_runs:
description: 'CI max failed runs override for reusable callers'
required: false
type: string
ci_context_max_snippet_chars_per_run:
description: 'CI failure snippet char budget override for reusable callers'
required: false
type: string
ci_context_classify_infra_failures:
description: 'CI infra-failure classification override for reusable callers'
required: false
type: string
reviewed_changes:
description: 'Reviewed Changes table rendering override for reusable callers'
required: false
type: string
history_enabled:
description: 'Reviewer history-awareness override for reusable callers'
required: false
type: string
history_include_ix_summary_history:
description: 'Include prior IX sticky summaries for reusable callers'
required: false
type: string
history_include_review_threads:
description: 'Include review threads in history context for reusable callers'
required: false
type: string
history_include_external_bot_summaries:
description: 'Include external bot summaries in history context for reusable callers'
required: false
type: string
history_external_bot_logins:
description: 'External bot login list override for reusable callers'
required: false
type: string
history_artifacts:
description: 'History artifact capture override for reusable callers'
required: false
type: string
history_max_rounds:
description: 'Max prior history rounds override for reusable callers'
required: false
type: string
history_max_items:
description: 'Max prior history items override for reusable callers'
required: false
type: string
swarm_enabled:
description: 'Reviewer swarm enablement override for reusable callers'
required: false
type: string
swarm_shadow_mode:
description: 'Reviewer swarm shadow mode override for reusable callers'
required: false
type: string
swarm_reviewers:
description: 'Reviewer swarm reviewers override for reusable callers'
required: false
type: string
swarm_max_parallel:
description: 'Reviewer swarm max parallel override for reusable callers'
required: false
type: string
swarm_publish_subreviews:
description: 'Reviewer swarm sub-review publishing override for reusable callers'
required: false
type: string
swarm_aggregator_model:
description: 'Reviewer swarm aggregator model override for reusable callers'
required: false
type: string
swarm_fail_open_on_partial:
description: 'Reviewer swarm partial fail-open override for reusable callers'
required: false
type: string
swarm_metrics:
description: 'Reviewer swarm metrics override for reusable callers'
required: false
type: string
review_config_path:
description: 'Reviewer config path override for reusable callers'
required: false
type: string
max_files:
description: 'Max files override for reusable callers'
required: false
default: ''
type: string
max_patch_chars:
description: 'Max patch chars override for reusable callers'
required: false
default: ''
type: string
max_inline_comments:
description: 'Max inline comments override for reusable callers'
required: false
default: ''
type: string
include_issue_comments:
description: 'Issue comment inclusion override for reusable callers'
required: false
type: string
include_review_comments:
description: 'Review comment inclusion override for reusable callers'
required: false
type: string
include_related_prs:
description: 'Related PR inclusion override for reusable callers'
required: false
type: string
progress_updates:
description: 'Progress update override for reusable callers'
required: false
type: string
diagnostics:
description: 'Diagnostics override for reusable callers'
required: false
type: string
preflight:
description: 'Preflight override for reusable callers'
required: false
type: string
preflight_timeout_seconds:
description: 'Preflight timeout override for reusable callers'
required: false
type: string
jobs:
# INTELLIGENCEX:BEGIN
review:
# Do not run secret-dependent review on forked pull requests unless a maintainer opts in.
# Maintainers can force a forked PR review by adding `needs-ai-review`.
# Dependabot PRs still run the job, then the reviewer exits before LLM/auth unless `needs-ai-review` is present.
if: ${{ github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork || contains(github.event.pull_request.labels.*.name, 'needs-ai-review') }}
permissions:
contents: read
pull-requests: write
issues: write
id-token: write
uses: ./.github/workflows/review-intelligencex-core.yml
with:
runs_on: ${{ github.event.repository.private && vars.IX_FORCE_GITHUB_HOSTED != 'true' && '["self-hosted","ubuntu"]' || '["ubuntu-latest"]' }}
# Keep PR reviews on the repo source so reviewer UX/contracts stay aligned with current IntelligenceX changes.
reviewer_source: source
repo: ${{ github.event.pull_request.number && github.repository || inputs.repo }}
pr_number: ${{ github.event.pull_request.number || inputs.pr_number }}
provider: ${{ inputs.provider || vars.IX_REVIEW_PROVIDER || 'openai' }}
agent_profile: ${{ inputs.agent_profile != '' && inputs.agent_profile || ((inputs.provider != '' || inputs.model != '' || inputs.openai_model != '' || inputs.copilot_model != '') && 'none' || vars.IX_REVIEW_AGENT_PROFILE) }}
model: ${{ inputs.model || vars.IX_REVIEW_MODEL || 'gpt-5.5' }}
openai_model: ${{ inputs.openai_model }}
copilot_model: ${{ inputs.copilot_model || vars.IX_REVIEW_COPILOT_MODEL }}
copilot_launcher: ${{ inputs.copilot_launcher || vars.IX_REVIEW_COPILOT_LAUNCHER }}
copilot_auto_install: ${{ (inputs.copilot_launcher || vars.IX_REVIEW_COPILOT_LAUNCHER) == 'auto' || vars.IX_REVIEW_COPILOT_AUTO_INSTALL == 'true' }}
copilot_auto_install_method: ${{ vars.IX_REVIEW_COPILOT_AUTO_INSTALL_METHOD || 'Auto' }}
copilot_auto_install_prerelease: ${{ vars.IX_REVIEW_COPILOT_AUTO_INSTALL_PRERELEASE == 'true' }}
openai_transport: native
openai_account_id: ${{ inputs.openai_account_id }}
openai_account_ids: ${{ inputs.openai_account_ids }}
openai_account_rotation: ${{ inputs.openai_account_rotation }}
openai_account_failover: ${{ inputs.openai_account_failover }}
usage_budget_guard: ${{ inputs.usage_budget_guard }}
usage_budget_allow_credits: ${{ inputs.usage_budget_allow_credits }}
usage_budget_allow_weekly_limit: ${{ inputs.usage_budget_allow_weekly_limit }}
profile: ${{ inputs.profile || 'balanced' }}
style: ${{ inputs.style || 'direct' }}
output_style: ${{ inputs.output_style }}
strictness: ${{ inputs.strictness }}
tone: ${{ inputs.tone }}
focus: ${{ inputs.focus }}
auto_approve_enabled: ${{ inputs.auto_approve_enabled }}
auto_approve_dry_run: ${{ inputs.auto_approve_dry_run }}
auto_approve_required_labels: ${{ inputs.auto_approve_required_labels }}
auto_approve_allowed_authors: ${{ inputs.auto_approve_allowed_authors }}
auto_approve_ignored_check_names: ${{ inputs.auto_approve_ignored_check_names }}
length: ${{ inputs.length || 'medium' }}
mode: ${{ inputs.mode || 'hybrid' }}
persona: ${{ inputs.persona }}
notes: ${{ inputs.notes }}
ci_context_enabled: ${{ inputs.ci_context_enabled }}
ci_context_include_check_summary: ${{ inputs.ci_context_include_check_summary }}
ci_context_include_failed_runs: ${{ inputs.ci_context_include_failed_runs }}
ci_context_include_failure_snippets: ${{ inputs.ci_context_include_failure_snippets }}
ci_context_max_failed_runs: ${{ inputs.ci_context_max_failed_runs }}
ci_context_max_snippet_chars_per_run: ${{ inputs.ci_context_max_snippet_chars_per_run }}
ci_context_classify_infra_failures: ${{ inputs.ci_context_classify_infra_failures }}
reviewed_changes: ${{ inputs.reviewed_changes }}
history_enabled: ${{ inputs.history_enabled }}
history_include_ix_summary_history: ${{ inputs.history_include_ix_summary_history }}
history_include_review_threads: ${{ inputs.history_include_review_threads }}
history_include_external_bot_summaries: ${{ inputs.history_include_external_bot_summaries }}
history_external_bot_logins: ${{ inputs.history_external_bot_logins }}
history_artifacts: ${{ inputs.history_artifacts }}
history_max_rounds: ${{ inputs.history_max_rounds }}
history_max_items: ${{ inputs.history_max_items }}
swarm_enabled: ${{ inputs.swarm_enabled }}
swarm_shadow_mode: ${{ inputs.swarm_shadow_mode }}
swarm_reviewers: ${{ inputs.swarm_reviewers }}
swarm_max_parallel: ${{ inputs.swarm_max_parallel }}
swarm_publish_subreviews: ${{ inputs.swarm_publish_subreviews }}
swarm_aggregator_model: ${{ inputs.swarm_aggregator_model }}
swarm_fail_open_on_partial: ${{ inputs.swarm_fail_open_on_partial }}
swarm_metrics: ${{ inputs.swarm_metrics }}
review_config_path: ${{ inputs.review_config_path || '.intelligencex/reviewer.json' }}
max_files: ${{ inputs.max_files }}
max_patch_chars: ${{ inputs.max_patch_chars }}
max_inline_comments: ${{ inputs.max_inline_comments }}
include_issue_comments: ${{ fromJSON(inputs.include_issue_comments || 'true') }}
include_review_comments: ${{ fromJSON(inputs.include_review_comments || 'true') }}
include_related_prs: ${{ fromJSON(inputs.include_related_prs || 'true') }}
progress_updates: ${{ fromJSON(inputs.progress_updates || 'true') }}
diagnostics: ${{ fromJSON(inputs.diagnostics || 'false') }}
preflight: ${{ fromJSON(inputs.preflight || 'false') }}
preflight_timeout_seconds: ${{ fromJSON(inputs.preflight_timeout_seconds || '15') }}
cleanup_enabled: false
cleanup_mode: comment
cleanup_scope: pr
cleanup_require_label: ''
cleanup_min_confidence: 0.85
cleanup_allowed_edits: 'formatting,grammar,title,sections'
cleanup_post_edit_comment: true
secrets:
INTELLIGENCEX_AUTH_B64: ${{ secrets.INTELLIGENCEX_AUTH_B64 }}
INTELLIGENCEX_GITHUB_APP_ID: ${{ secrets.INTELLIGENCEX_GITHUB_APP_ID }}
INTELLIGENCEX_GITHUB_APP_PRIVATE_KEY: ${{ secrets.INTELLIGENCEX_GITHUB_APP_PRIVATE_KEY }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
# INTELLIGENCEX:END