Route reviewer publishing through PowerForge #3937
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |