diff --git a/.github/workflows/build-warning-fixer.lock.yml b/.github/workflows/build-warning-fixer.lock.yml index fdd666a082..8915683e99 100644 --- a/.github/workflows/build-warning-fixer.lock.yml +++ b/.github/workflows/build-warning-fixer.lock.yml @@ -1,5 +1,5 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"e7e8802235cbafe4d90c2bc2ff1a4facdcf1ee7fb168c73863e34958a1ee42d4","body_hash":"cc7079a34a6d232ac3a85711db4b44eacde3dc50aa01fc5afe20407347f96f17","compiler_version":"v0.83.4","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.75"}} -# gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"820762786026740c76f36085b0efc47a31fe5020","version":"v7.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"v0.83.4","version":"v0.83.4"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.27.42","digest":"sha256:26a8af4e5566485b02f52af59ee03803ae798271a9619d4767e94d07806deb9b","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.27.42@sha256:26a8af4e5566485b02f52af59ee03803ae798271a9619d4767e94d07806deb9b"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.42","digest":"sha256:944f2686c9ab9bec338fd14b662461662f77cd12cd0ea8a3e7cb8c0987cd1607","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.42@sha256:944f2686c9ab9bec338fd14b662461662f77cd12cd0ea8a3e7cb8c0987cd1607"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.27.42","digest":"sha256:42dfeb649c680a8558cd5423dbc530b653a69413e35ffbe5e71da5d48c94bdf0","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.27.42@sha256:42dfeb649c680a8558cd5423dbc530b653a69413e35ffbe5e71da5d48c94bdf0"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.6","digest":"sha256:fecabec51bbc41f2ad61076d6bcd9a36ef23b142e672a444e054d37fc29de93c","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.6@sha256:fecabec51bbc41f2ad61076d6bcd9a36ef23b142e672a444e054d37fc29de93c"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:a8082161d7dceda14b68f32eb39d0eaa96b825d07f5895b096afab9d9e0c7748","pinned_image":"ghcr.io/github/gh-aw-node@sha256:a8082161d7dceda14b68f32eb39d0eaa96b825d07f5895b096afab9d9e0c7748"},{"image":"ghcr.io/github/github-mcp-server:v1.7.0","digest":"sha256:c491ffdf6f4c85cb5397021bc655edb8ab825c6f5f568e7597d77a1bd7c4d308","pinned_image":"ghcr.io/github/github-mcp-server:v1.7.0@sha256:c491ffdf6f4c85cb5397021bc655edb8ab825c6f5f568e7597d77a1bd7c4d308"}]} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"2962af842274db83194df5dd7c8f0f510da0a642bb894dc020c72d6b8c841403","body_hash":"9f185491648c1746272b41a2ec82cbc78f74d14529e55b96609495d72df3bf8b","compiler_version":"v0.83.4","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.75"}} +# gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"820762786026740c76f36085b0efc47a31fe5020","version":"v7.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"v0.83.4","version":"v0.83.4"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.27.42","digest":"sha256:26a8af4e5566485b02f52af59ee03803ae798271a9619d4767e94d07806deb9b","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.27.42@sha256:26a8af4e5566485b02f52af59ee03803ae798271a9619d4767e94d07806deb9b"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.42","digest":"sha256:944f2686c9ab9bec338fd14b662461662f77cd12cd0ea8a3e7cb8c0987cd1607","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.42@sha256:944f2686c9ab9bec338fd14b662461662f77cd12cd0ea8a3e7cb8c0987cd1607"},{"image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.27.42","digest":"sha256:da006bf96d2d246dd269d57b233c1798d2ad63d6cd64ca02f7bf71045028781f","pinned_image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.27.42@sha256:da006bf96d2d246dd269d57b233c1798d2ad63d6cd64ca02f7bf71045028781f"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.27.42","digest":"sha256:42dfeb649c680a8558cd5423dbc530b653a69413e35ffbe5e71da5d48c94bdf0","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.27.42@sha256:42dfeb649c680a8558cd5423dbc530b653a69413e35ffbe5e71da5d48c94bdf0"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.6","digest":"sha256:fecabec51bbc41f2ad61076d6bcd9a36ef23b142e672a444e054d37fc29de93c","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.6@sha256:fecabec51bbc41f2ad61076d6bcd9a36ef23b142e672a444e054d37fc29de93c"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:a8082161d7dceda14b68f32eb39d0eaa96b825d07f5895b096afab9d9e0c7748","pinned_image":"ghcr.io/github/gh-aw-node@sha256:a8082161d7dceda14b68f32eb39d0eaa96b825d07f5895b096afab9d9e0c7748"},{"image":"ghcr.io/github/github-mcp-server:v1.7.0","digest":"sha256:c491ffdf6f4c85cb5397021bc655edb8ab825c6f5f568e7597d77a1bd7c4d308","pinned_image":"ghcr.io/github/github-mcp-server:v1.7.0@sha256:c491ffdf6f4c85cb5397021bc655edb8ab825c6f5f568e7597d77a1bd7c4d308"}]} # This file was automatically generated by gh-aw (v0.83.4). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # # ___ _ _ @@ -45,6 +45,7 @@ # Container images used: # - ghcr.io/github/gh-aw-firewall/agent:0.27.42@sha256:26a8af4e5566485b02f52af59ee03803ae798271a9619d4767e94d07806deb9b # - ghcr.io/github/gh-aw-firewall/api-proxy:0.27.42@sha256:944f2686c9ab9bec338fd14b662461662f77cd12cd0ea8a3e7cb8c0987cd1607 +# - ghcr.io/github/gh-aw-firewall/cli-proxy:0.27.42@sha256:da006bf96d2d246dd269d57b233c1798d2ad63d6cd64ca02f7bf71045028781f # - ghcr.io/github/gh-aw-firewall/squid:0.27.42@sha256:42dfeb649c680a8558cd5423dbc530b653a69413e35ffbe5e71da5d48c94bdf0 # - ghcr.io/github/gh-aw-mcpg:v0.4.6@sha256:fecabec51bbc41f2ad61076d6bcd9a36ef23b142e672a444e054d37fc29de93c # - ghcr.io/github/gh-aw-node@sha256:a8082161d7dceda14b68f32eb39d0eaa96b825d07f5895b096afab9d9e0c7748 @@ -261,20 +262,20 @@ jobs: run: | bash "${RUNNER_TEMP}/gh-aw/actions/create_prompt_first.sh" { - cat << 'GH_AW_PROMPT_ed9e3b37a434eff3_EOF' + cat << 'GH_AW_PROMPT_3155a913464d600a_EOF' - GH_AW_PROMPT_ed9e3b37a434eff3_EOF + GH_AW_PROMPT_3155a913464d600a_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/xpia.md" cat "${RUNNER_TEMP}/gh-aw/prompts/temp_folder_prompt.md" cat "${RUNNER_TEMP}/gh-aw/prompts/markdown.md" cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_prompt.md" - cat << 'GH_AW_PROMPT_ed9e3b37a434eff3_EOF' + cat << 'GH_AW_PROMPT_3155a913464d600a_EOF' Tools: create_issue, missing_tool, missing_data, noop - GH_AW_PROMPT_ed9e3b37a434eff3_EOF + GH_AW_PROMPT_3155a913464d600a_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/mcp_cli_tools_prompt.md" - cat << 'GH_AW_PROMPT_ed9e3b37a434eff3_EOF' + cat << 'GH_AW_PROMPT_3155a913464d600a_EOF' The following GitHub context information is available for this workflow: {{#if github.actor}} @@ -303,12 +304,12 @@ jobs: {{/if}} - GH_AW_PROMPT_ed9e3b37a434eff3_EOF - cat "${RUNNER_TEMP}/gh-aw/prompts/github_mcp_tools_with_safeoutputs_prompt.md" - cat << 'GH_AW_PROMPT_ed9e3b37a434eff3_EOF' + GH_AW_PROMPT_3155a913464d600a_EOF + cat "${RUNNER_TEMP}/gh-aw/prompts/cli_proxy_with_safeoutputs_prompt.md" + cat << 'GH_AW_PROMPT_3155a913464d600a_EOF' {{#runtime-import .github/workflows/build-warning-fixer.md}} - GH_AW_PROMPT_ed9e3b37a434eff3_EOF + GH_AW_PROMPT_3155a913464d600a_EOF } > "$GH_AW_PROMPT" - name: Interpolate variables and render templates uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 @@ -339,7 +340,7 @@ jobs: GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} GH_AW_GITHUB_WORKFLOW: ${{ github.workflow }} GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} - GH_AW_MCP_CLI_SERVERS_LIST: "- `github` — run `github --help` to see available tools\n- `safeoutputs` — run `safeoutputs --help` to see available tools" + GH_AW_MCP_CLI_SERVERS_LIST: '- `safeoutputs` — run `safeoutputs --help` to see available tools' GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED: ${{ needs.pre_activation.outputs.activated }} with: script: | @@ -527,7 +528,7 @@ jobs: GH_AW_SKILL_DIR: ".github/skills" run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_inline_skills.sh" - name: Download container images - run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.27.42@sha256:26a8af4e5566485b02f52af59ee03803ae798271a9619d4767e94d07806deb9b ghcr.io/github/gh-aw-firewall/api-proxy:0.27.42@sha256:944f2686c9ab9bec338fd14b662461662f77cd12cd0ea8a3e7cb8c0987cd1607 ghcr.io/github/gh-aw-firewall/squid:0.27.42@sha256:42dfeb649c680a8558cd5423dbc530b653a69413e35ffbe5e71da5d48c94bdf0 ghcr.io/github/gh-aw-mcpg:v0.4.6@sha256:fecabec51bbc41f2ad61076d6bcd9a36ef23b142e672a444e054d37fc29de93c ghcr.io/github/gh-aw-node@sha256:a8082161d7dceda14b68f32eb39d0eaa96b825d07f5895b096afab9d9e0c7748 ghcr.io/github/github-mcp-server:v1.7.0@sha256:c491ffdf6f4c85cb5397021bc655edb8ab825c6f5f568e7597d77a1bd7c4d308 + run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.27.42@sha256:26a8af4e5566485b02f52af59ee03803ae798271a9619d4767e94d07806deb9b ghcr.io/github/gh-aw-firewall/api-proxy:0.27.42@sha256:944f2686c9ab9bec338fd14b662461662f77cd12cd0ea8a3e7cb8c0987cd1607 ghcr.io/github/gh-aw-firewall/cli-proxy:0.27.42@sha256:da006bf96d2d246dd269d57b233c1798d2ad63d6cd64ca02f7bf71045028781f ghcr.io/github/gh-aw-firewall/squid:0.27.42@sha256:42dfeb649c680a8558cd5423dbc530b653a69413e35ffbe5e71da5d48c94bdf0 ghcr.io/github/gh-aw-mcpg:v0.4.6@sha256:fecabec51bbc41f2ad61076d6bcd9a36ef23b142e672a444e054d37fc29de93c ghcr.io/github/gh-aw-node@sha256:a8082161d7dceda14b68f32eb39d0eaa96b825d07f5895b096afab9d9e0c7748 ghcr.io/github/github-mcp-server:v1.7.0@sha256:c491ffdf6f4c85cb5397021bc655edb8ab825c6f5f568e7597d77a1bd7c4d308 - name: Generate Safe Outputs Config run: | mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs" @@ -673,9 +674,6 @@ jobs: GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} GH_AW_SAFE_OUTPUTS_CONFIG_PATH: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS_CONFIG_PATH }} GH_AW_SAFE_OUTPUTS_TOOLS_PATH: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS_TOOLS_PATH }} - GITHUB_MCP_GUARD_MIN_INTEGRITY: ${{ steps.determine-automatic-lockdown.outputs.min_integrity }} - GITHUB_MCP_GUARD_REPOS: ${{ steps.determine-automatic-lockdown.outputs.repos }} - GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | set -eo pipefail @@ -701,26 +699,9 @@ jobs: mkdir -p "$HOME/.copilot" GH_AW_NODE=$(which node 2>/dev/null || command -v node 2>/dev/null || echo node) - cat << GH_AW_MCP_CONFIG_bcbb445f12830b86_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" + cat << GH_AW_MCP_CONFIG_9d741f5eafe23c95_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" { "mcpServers": { - "github": { - "type": "stdio", - "container": "ghcr.io/github/github-mcp-server:v1.7.0", - "env": { - "GITHUB_FEATURES": "fields_param", - "GITHUB_HOST": "${GITHUB_SERVER_URL}", - "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_MCP_SERVER_TOKEN}", - "GITHUB_READ_ONLY": "1", - "GITHUB_TOOLSETS": "context,repos,issues,pull_requests,actions" - }, - "guard-policies": { - "allow-only": { - "min-integrity": "$GITHUB_MCP_GUARD_MIN_INTEGRITY", - "repos": "$GITHUB_MCP_GUARD_REPOS" - } - } - }, "safeoutputs": { "type": "stdio", "container": "ghcr.io/github/gh-aw-node", @@ -763,7 +744,7 @@ jobs: "startupTimeout": 120 } } - GH_AW_MCP_CONFIG_bcbb445f12830b86_EOF + GH_AW_MCP_CONFIG_9d741f5eafe23c95_EOF - name: Mount MCP servers as CLIs id: mount-mcp-clis continue-on-error: true @@ -785,6 +766,21 @@ jobs: id: pre_agent_audit continue-on-error: true run: bash "${RUNNER_TEMP}/gh-aw/actions/audit_pre_agent_workspace.sh" + - name: Start CLI Proxy + env: + GH_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_API_URL: ${{ github.api_url }} + GH_HOST: ${{ env.GH_HOST }} + GITHUB_HOST: ${{ env.GITHUB_HOST }} + GITHUB_ENTERPRISE_HOST: ${{ env.GITHUB_ENTERPRISE_HOST }} + GITHUB_GRAPHQL_URL: ${{ env.GITHUB_GRAPHQL_URL }} + GITHUB_COPILOT_BASE_URL: ${{ env.GITHUB_COPILOT_BASE_URL }} + GH_AW_NETWORK_ISOLATION: 'true' + CLI_PROXY_POLICY: '{"allow-only":{"repos":"${{ steps.determine-automatic-lockdown.outputs.repos }}","min-integrity":"${{ steps.determine-automatic-lockdown.outputs.min_integrity }}"}}' + CLI_PROXY_IMAGE: 'ghcr.io/github/gh-aw-mcpg:v0.4.6' + run: | + bash "${RUNNER_TEMP}/gh-aw/actions/start_cli_proxy.sh" - name: Execute GitHub Copilot CLI id: agentic_execution # Copilot CLI tool arguments (sorted): @@ -803,7 +799,7 @@ jobs: export COPILOT_API_KEY="$COPILOT_DUMMY_BYOK" (umask 177 && touch /tmp/gh-aw/agent-stdio.log) GH_AW_MAX_AI_CREDITS="${GH_AW_MAX_AI_CREDITS:-1000}" - printf '%s\n' "{\"\$schema\":\"https://github.com/github/gh-aw-firewall/releases/download/v0.27.42/awf-config.schema.json\",\"network\":{\"allowDomains\":[\"api.business.githubcopilot.com\",\"api.enterprise.githubcopilot.com\",\"api.github.com\",\"api.githubcopilot.com\",\"api.individual.githubcopilot.com\",\"api.snapcraft.io\",\"archive.ubuntu.com\",\"azure.archive.ubuntu.com\",\"crl.geotrust.com\",\"crl.globalsign.com\",\"crl.identrust.com\",\"crl.sectigo.com\",\"crl.thawte.com\",\"crl.usertrust.com\",\"crl.verisign.com\",\"crl3.digicert.com\",\"crl4.digicert.com\",\"crls.ssl.com\",\"github.com\",\"host.docker.internal\",\"json-schema.org\",\"json.schemastore.org\",\"keyserver.ubuntu.com\",\"ocsp.digicert.com\",\"ocsp.geotrust.com\",\"ocsp.globalsign.com\",\"ocsp.identrust.com\",\"ocsp.sectigo.com\",\"ocsp.ssl.com\",\"ocsp.thawte.com\",\"ocsp.usertrust.com\",\"ocsp.verisign.com\",\"packagecloud.io\",\"packages.cloud.google.com\",\"packages.microsoft.com\",\"ppa.launchpad.net\",\"raw.githubusercontent.com\",\"registry.npmjs.org\",\"s.symcb.com\",\"s.symcd.com\",\"security.ubuntu.com\",\"telemetry.enterprise.githubcopilot.com\",\"ts-crl.ws.symantec.com\",\"ts-ocsp.ws.symantec.com\",\"www.googleapis.com\"],\"isolation\":true,\"topologyAttach\":[\"awmg-mcpg\"]},\"apiProxy\":{\"enabled\":true,\"enableTokenSteering\":true,\"maxRuns\":500,\"maxAiCredits\":${GH_AW_MAX_AI_CREDITS},\"maxCacheMisses\":5,\"models\":{\"agent\":[\"sonnet-6x\",\"gpt-5.4\",\"gpt-5.5\",\"gpt-5.6\",\"gpt-5.3\",\"gemini-pro\",\"any\"],\"antigravity\":[\"copilot/antigravity*\",\"google/antigravity*\",\"gemini/antigravity*\"],\"any\":[\"copilot/*\",\"anthropic/*\",\"openai/*\",\"google/*\",\"gemini/*\"],\"claude\":[\"agent\"],\"codex\":[\"agent\"],\"coding\":[\"copilot/gpt-5*codex*\",\"openai/gpt-5*codex*\",\"gpt-5-codex\",\"kimi\"],\"computer-use\":[\"copilot/*computer-use*\",\"google/*computer-use*\",\"gemini/*computer-use*\",\"openai/*computer-use*\"],\"copilot\":[\"agent\"],\"deep-research\":[\"copilot/deep-research*\",\"copilot/o3-deep-research*\",\"copilot/o4-mini-deep-research*\",\"google/deep-research*\",\"gemini/deep-research*\",\"openai/o3-deep-research*\",\"openai/o4-mini-deep-research*\"],\"fable\":[\"copilot/*fable*\",\"anthropic/*fable*\"],\"gemini\":[\"agent\"],\"gemini-3-flash\":[\"copilot/gemini-3*flash*\",\"google/gemini-3*flash*\",\"gemini/gemini-3*flash*\"],\"gemini-3-pro\":[\"copilot/gemini-3*pro*\",\"google/gemini-3*pro*\",\"google/nano-banana*\",\"gemini/gemini-3*pro*\"],\"gemini-3.1-flash\":[\"copilot/gemini-3.1*flash*\",\"google/gemini-3.1*flash*\",\"gemini/gemini-3.1*flash*\"],\"gemini-3.1-pro\":[\"copilot/gemini-3.1*pro*\",\"google/gemini-3.1*pro*\",\"gemini/gemini-3.1*pro*\"],\"gemini-3.5-flash\":[\"copilot/gemini-3.5*flash*\",\"google/gemini-3.5*flash*\",\"gemini/gemini-3.5*flash*\"],\"gemini-3.6-flash\":[\"copilot/gemini-3.6*flash*\",\"google/gemini-3.6*flash*\",\"gemini/gemini-3.6*flash*\"],\"gemini-flash\":[\"copilot/gemini-*flash*\",\"google/gemini-*flash*\",\"gemini/gemini-*flash*\"],\"gemini-flash-lite\":[\"copilot/gemini-*flash*lite*\",\"google/gemini-*flash*lite*\",\"gemini/gemini-*flash*lite*\"],\"gemini-omni\":[\"copilot/gemini-omni*\",\"google/gemini-omni*\",\"gemini/gemini-omni*\"],\"gemini-pro\":[\"copilot/gemini-*pro*\",\"google/gemini-*pro*\",\"gemini/gemini-*pro*\"],\"gemma\":[\"copilot/gemma*\",\"google/gemma*\",\"gemini/gemma*\"],\"gpt-5\":[\"copilot/gpt-5*\",\"openai/gpt-5*\"],\"gpt-5-codex\":[\"copilot/gpt-5*codex*\",\"openai/gpt-5*codex*\"],\"gpt-5-mini\":[\"copilot/gpt-5*mini*\",\"openai/gpt-5*mini*\"],\"gpt-5-nano\":[\"copilot/gpt-5*nano*\",\"openai/gpt-5*nano*\"],\"gpt-5-pro\":[\"copilot/gpt-5*pro*\",\"openai/gpt-5*pro*\"],\"gpt-5.1\":[\"copilot/gpt-5.1*\",\"openai/gpt-5.1*\"],\"gpt-5.2\":[\"copilot/gpt-5.2*\",\"openai/gpt-5.2*\"],\"gpt-5.3\":[\"copilot/gpt-5.3*\",\"openai/gpt-5.3*\"],\"gpt-5.4\":[\"copilot/gpt-5.4*\",\"openai/gpt-5.4*\"],\"gpt-5.5\":[\"copilot/gpt-5.5*\",\"openai/gpt-5.5*\"],\"gpt-5.6\":[\"copilot/gpt-5.6*\",\"openai/gpt-5.6*\"],\"haiku\":[\"copilot/*haiku*\",\"anthropic/*haiku*\"],\"image-generation\":[\"copilot/gpt-image*\",\"openai/gpt-image*\",\"openai/chatgpt-image*\",\"copilot/gemini-*image*\",\"google/gemini-*image*\",\"gemini/gemini-*image*\",\"google/imagen*\"],\"kimi\":[\"copilot/kimi*\",\"openai/kimi*\"],\"kiwi\":[\"copilot/kiwi*\",\"openai/kiwi*\"],\"large\":[\"fable\",\"sonnet\",\"gpt-5-pro\",\"gpt-5\",\"gemini-pro\"],\"lyria\":[\"google/lyria*\",\"gemini/lyria*\",\"copilot/lyria*\"],\"mai-code\":[\"copilot/MAI-Code*\",\"copilot/mai-code*\",\"openai/MAI-Code*\"],\"mai-code-1-flash-picker\":[\"copilot/MAI-Code-1-Flash-picker*\",\"copilot/mai-code-1-flash-picker*\",\"openai/MAI-Code-1-Flash-picker*\"],\"mini\":[\"haiku\",\"gpt-5-mini\",\"gpt-5-nano\",\"gemini-flash-lite\"],\"nano-banana\":[\"copilot/nano-banana*\",\"google/nano-banana*\",\"gemini/nano-banana*\"],\"opus\":[\"copilot/*opus*\",\"anthropic/*opus*\"],\"opusplan\":[\"opus?effort=high\"],\"raptor-mini\":[\"copilot/raptor*\",\"openai/raptor*\"],\"reasoning\":[\"copilot/o1*\",\"copilot/o3*\",\"copilot/o4*\",\"openai/o1*\",\"openai/o3*\",\"openai/o4*\"],\"robotics\":[\"copilot/*robotics*\",\"google/*robotics*\",\"gemini/*robotics*\"],\"small\":[\"mini\"],\"small-agent\":[\"haiku\",\"gpt-5-mini\",\"gemini-flash\"],\"sonnet\":[\"copilot/*sonnet*\",\"anthropic/*sonnet*\"],\"sonnet-6x\":[\"copilot/*sonnet-4.5*\",\"copilot/*sonnet-4.6*\",\"copilot/*sonnet-5*\",\"copilot/*sonnet-4-5-*\",\"anthropic/*sonnet-4-5-*\",\"copilot/*sonnet-4-6*\",\"anthropic/*sonnet-4-6*\",\"anthropic/*sonnet-5*\"],\"summarization\":[\"haiku\",\"gpt-5-mini\",\"gemini-flash-lite\",\"mini\"],\"veo\":[\"google/veo*\",\"gemini/veo*\"],\"vision\":[\"copilot/gemini-*image*\",\"google/gemini-*image*\",\"gemini/gemini-*image*\",\"copilot/gemini-*flash*\",\"google/gemini-*flash*\",\"gemini/gemini-*flash*\"]}},\"container\":{\"imageTag\":\"0.27.42,squid=sha256:42dfeb649c680a8558cd5423dbc530b653a69413e35ffbe5e71da5d48c94bdf0,agent=sha256:26a8af4e5566485b02f52af59ee03803ae798271a9619d4767e94d07806deb9b,agent-act=sha256:a14ad974484aa518aab83d40f3f141175dfd171d3745e01c092375b970f73a20,api-proxy=sha256:944f2686c9ab9bec338fd14b662461662f77cd12cd0ea8a3e7cb8c0987cd1607,cli-proxy=sha256:da006bf96d2d246dd269d57b233c1798d2ad63d6cd64ca02f7bf71045028781f\"},\"logging\":{\"proxyLogsDir\":\"/tmp/gh-aw/sandbox/firewall/logs\",\"auditDir\":\"/tmp/gh-aw/sandbox/firewall/audit\"}}" > "${RUNNER_TEMP}/gh-aw/awf-config.json" + printf '%s\n' "{\"\$schema\":\"https://github.com/github/gh-aw-firewall/releases/download/v0.27.42/awf-config.schema.json\",\"network\":{\"allowDomains\":[\"api.business.githubcopilot.com\",\"api.enterprise.githubcopilot.com\",\"api.github.com\",\"api.githubcopilot.com\",\"api.individual.githubcopilot.com\",\"api.snapcraft.io\",\"archive.ubuntu.com\",\"azure.archive.ubuntu.com\",\"crl.geotrust.com\",\"crl.globalsign.com\",\"crl.identrust.com\",\"crl.sectigo.com\",\"crl.thawte.com\",\"crl.usertrust.com\",\"crl.verisign.com\",\"crl3.digicert.com\",\"crl4.digicert.com\",\"crls.ssl.com\",\"github.com\",\"host.docker.internal\",\"json-schema.org\",\"json.schemastore.org\",\"keyserver.ubuntu.com\",\"ocsp.digicert.com\",\"ocsp.geotrust.com\",\"ocsp.globalsign.com\",\"ocsp.identrust.com\",\"ocsp.sectigo.com\",\"ocsp.ssl.com\",\"ocsp.thawte.com\",\"ocsp.usertrust.com\",\"ocsp.verisign.com\",\"packagecloud.io\",\"packages.cloud.google.com\",\"packages.microsoft.com\",\"ppa.launchpad.net\",\"raw.githubusercontent.com\",\"registry.npmjs.org\",\"s.symcb.com\",\"s.symcd.com\",\"security.ubuntu.com\",\"telemetry.enterprise.githubcopilot.com\",\"ts-crl.ws.symantec.com\",\"ts-ocsp.ws.symantec.com\",\"www.googleapis.com\"],\"isolation\":true,\"topologyAttach\":[\"awmg-mcpg\",\"awmg-cli-proxy\"]},\"apiProxy\":{\"enabled\":true,\"enableTokenSteering\":true,\"maxRuns\":500,\"maxAiCredits\":${GH_AW_MAX_AI_CREDITS},\"maxCacheMisses\":5,\"models\":{\"agent\":[\"sonnet-6x\",\"gpt-5.4\",\"gpt-5.5\",\"gpt-5.6\",\"gpt-5.3\",\"gemini-pro\",\"any\"],\"antigravity\":[\"copilot/antigravity*\",\"google/antigravity*\",\"gemini/antigravity*\"],\"any\":[\"copilot/*\",\"anthropic/*\",\"openai/*\",\"google/*\",\"gemini/*\"],\"claude\":[\"agent\"],\"codex\":[\"agent\"],\"coding\":[\"copilot/gpt-5*codex*\",\"openai/gpt-5*codex*\",\"gpt-5-codex\",\"kimi\"],\"computer-use\":[\"copilot/*computer-use*\",\"google/*computer-use*\",\"gemini/*computer-use*\",\"openai/*computer-use*\"],\"copilot\":[\"agent\"],\"deep-research\":[\"copilot/deep-research*\",\"copilot/o3-deep-research*\",\"copilot/o4-mini-deep-research*\",\"google/deep-research*\",\"gemini/deep-research*\",\"openai/o3-deep-research*\",\"openai/o4-mini-deep-research*\"],\"fable\":[\"copilot/*fable*\",\"anthropic/*fable*\"],\"gemini\":[\"agent\"],\"gemini-3-flash\":[\"copilot/gemini-3*flash*\",\"google/gemini-3*flash*\",\"gemini/gemini-3*flash*\"],\"gemini-3-pro\":[\"copilot/gemini-3*pro*\",\"google/gemini-3*pro*\",\"google/nano-banana*\",\"gemini/gemini-3*pro*\"],\"gemini-3.1-flash\":[\"copilot/gemini-3.1*flash*\",\"google/gemini-3.1*flash*\",\"gemini/gemini-3.1*flash*\"],\"gemini-3.1-pro\":[\"copilot/gemini-3.1*pro*\",\"google/gemini-3.1*pro*\",\"gemini/gemini-3.1*pro*\"],\"gemini-3.5-flash\":[\"copilot/gemini-3.5*flash*\",\"google/gemini-3.5*flash*\",\"gemini/gemini-3.5*flash*\"],\"gemini-3.6-flash\":[\"copilot/gemini-3.6*flash*\",\"google/gemini-3.6*flash*\",\"gemini/gemini-3.6*flash*\"],\"gemini-flash\":[\"copilot/gemini-*flash*\",\"google/gemini-*flash*\",\"gemini/gemini-*flash*\"],\"gemini-flash-lite\":[\"copilot/gemini-*flash*lite*\",\"google/gemini-*flash*lite*\",\"gemini/gemini-*flash*lite*\"],\"gemini-omni\":[\"copilot/gemini-omni*\",\"google/gemini-omni*\",\"gemini/gemini-omni*\"],\"gemini-pro\":[\"copilot/gemini-*pro*\",\"google/gemini-*pro*\",\"gemini/gemini-*pro*\"],\"gemma\":[\"copilot/gemma*\",\"google/gemma*\",\"gemini/gemma*\"],\"gpt-5\":[\"copilot/gpt-5*\",\"openai/gpt-5*\"],\"gpt-5-codex\":[\"copilot/gpt-5*codex*\",\"openai/gpt-5*codex*\"],\"gpt-5-mini\":[\"copilot/gpt-5*mini*\",\"openai/gpt-5*mini*\"],\"gpt-5-nano\":[\"copilot/gpt-5*nano*\",\"openai/gpt-5*nano*\"],\"gpt-5-pro\":[\"copilot/gpt-5*pro*\",\"openai/gpt-5*pro*\"],\"gpt-5.1\":[\"copilot/gpt-5.1*\",\"openai/gpt-5.1*\"],\"gpt-5.2\":[\"copilot/gpt-5.2*\",\"openai/gpt-5.2*\"],\"gpt-5.3\":[\"copilot/gpt-5.3*\",\"openai/gpt-5.3*\"],\"gpt-5.4\":[\"copilot/gpt-5.4*\",\"openai/gpt-5.4*\"],\"gpt-5.5\":[\"copilot/gpt-5.5*\",\"openai/gpt-5.5*\"],\"gpt-5.6\":[\"copilot/gpt-5.6*\",\"openai/gpt-5.6*\"],\"haiku\":[\"copilot/*haiku*\",\"anthropic/*haiku*\"],\"image-generation\":[\"copilot/gpt-image*\",\"openai/gpt-image*\",\"openai/chatgpt-image*\",\"copilot/gemini-*image*\",\"google/gemini-*image*\",\"gemini/gemini-*image*\",\"google/imagen*\"],\"kimi\":[\"copilot/kimi*\",\"openai/kimi*\"],\"kiwi\":[\"copilot/kiwi*\",\"openai/kiwi*\"],\"large\":[\"fable\",\"sonnet\",\"gpt-5-pro\",\"gpt-5\",\"gemini-pro\"],\"lyria\":[\"google/lyria*\",\"gemini/lyria*\",\"copilot/lyria*\"],\"mai-code\":[\"copilot/MAI-Code*\",\"copilot/mai-code*\",\"openai/MAI-Code*\"],\"mai-code-1-flash-picker\":[\"copilot/MAI-Code-1-Flash-picker*\",\"copilot/mai-code-1-flash-picker*\",\"openai/MAI-Code-1-Flash-picker*\"],\"mini\":[\"haiku\",\"gpt-5-mini\",\"gpt-5-nano\",\"gemini-flash-lite\"],\"nano-banana\":[\"copilot/nano-banana*\",\"google/nano-banana*\",\"gemini/nano-banana*\"],\"opus\":[\"copilot/*opus*\",\"anthropic/*opus*\"],\"opusplan\":[\"opus?effort=high\"],\"raptor-mini\":[\"copilot/raptor*\",\"openai/raptor*\"],\"reasoning\":[\"copilot/o1*\",\"copilot/o3*\",\"copilot/o4*\",\"openai/o1*\",\"openai/o3*\",\"openai/o4*\"],\"robotics\":[\"copilot/*robotics*\",\"google/*robotics*\",\"gemini/*robotics*\"],\"small\":[\"mini\"],\"small-agent\":[\"haiku\",\"gpt-5-mini\",\"gemini-flash\"],\"sonnet\":[\"copilot/*sonnet*\",\"anthropic/*sonnet*\"],\"sonnet-6x\":[\"copilot/*sonnet-4.5*\",\"copilot/*sonnet-4.6*\",\"copilot/*sonnet-5*\",\"copilot/*sonnet-4-5-*\",\"anthropic/*sonnet-4-5-*\",\"copilot/*sonnet-4-6*\",\"anthropic/*sonnet-4-6*\",\"anthropic/*sonnet-5*\"],\"summarization\":[\"haiku\",\"gpt-5-mini\",\"gemini-flash-lite\",\"mini\"],\"veo\":[\"google/veo*\",\"gemini/veo*\"],\"vision\":[\"copilot/gemini-*image*\",\"google/gemini-*image*\",\"gemini/gemini-*image*\",\"copilot/gemini-*flash*\",\"google/gemini-*flash*\",\"gemini/gemini-*flash*\"]}},\"container\":{\"imageTag\":\"0.27.42,squid=sha256:42dfeb649c680a8558cd5423dbc530b653a69413e35ffbe5e71da5d48c94bdf0,agent=sha256:26a8af4e5566485b02f52af59ee03803ae798271a9619d4767e94d07806deb9b,agent-act=sha256:a14ad974484aa518aab83d40f3f141175dfd171d3745e01c092375b970f73a20,api-proxy=sha256:944f2686c9ab9bec338fd14b662461662f77cd12cd0ea8a3e7cb8c0987cd1607,cli-proxy=sha256:da006bf96d2d246dd269d57b233c1798d2ad63d6cd64ca02f7bf71045028781f\"},\"logging\":{\"proxyLogsDir\":\"/tmp/gh-aw/sandbox/firewall/logs\",\"auditDir\":\"/tmp/gh-aw/sandbox/firewall/audit\"}}" > "${RUNNER_TEMP}/gh-aw/awf-config.json" cp "${RUNNER_TEMP}/gh-aw/awf-config.json" /tmp/gh-aw/awf-config.json export GH_AW_MODELS_JSON_PATH="/tmp/gh-aw/models.json" GH_AW_DOCKER_HOST="" @@ -821,7 +817,7 @@ jobs: fi fi # shellcheck disable=SC1003,SC2016,SC2086 - awf --config "${RUNNER_TEMP}/gh-aw/awf-config.json" --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" ${GH_AW_TOOL_CACHE_MOUNT:+--mount "$GH_AW_TOOL_CACHE_MOUNT"} ${GH_AW_DOCKER_HOST:+--docker-host "$GH_AW_DOCKER_HOST"} --env-all --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --log-level info --skip-pull \ + awf --config "${RUNNER_TEMP}/gh-aw/awf-config.json" --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" ${GH_AW_TOOL_CACHE_MOUNT:+--mount "$GH_AW_TOOL_CACHE_MOUNT"} ${GH_AW_DOCKER_HOST:+--docker-host "$GH_AW_DOCKER_HOST"} --env-all --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GH_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --log-level info --skip-pull --difc-proxy-host awmg-cli-proxy:18443 --difc-proxy-ca-cert /tmp/gh-aw/difc-proxy-tls/ca.crt \ -- /bin/bash -c 'set +o histexpand; export PATH="${RUNNER_TEMP}/gh-aw/mcp-cli/bin:$PATH" && : "${RUNNER_TOOL_CACHE:?RUNNER_TOOL_CACHE must be set}"; GH_AW_TOOL_CACHE="$RUNNER_TOOL_CACHE"; export PATH="$(find "$GH_AW_TOOL_CACHE" -maxdepth 5 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true; [ -n "$ERLANG_HOME" ] && export PATH="$ERLANG_HOME/bin:$PATH" || true && GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || true)"; fi; if [ -z "$GH_AW_NODE_EXEC" ]; then echo "node runtime missing on this runner — check runtimes.node in workflow YAML" >&2; exit 127; fi; GH_AW_NPM_GLOBAL_ROOT="$(npm root -g 2>/dev/null || true)"; if [ -n "$GH_AW_NPM_GLOBAL_ROOT" ]; then export NODE_PATH="${GH_AW_NPM_GLOBAL_ROOT}${NODE_PATH:+:${NODE_PATH}}"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-all-tools --allow-all-paths --add-dir "${GITHUB_WORKSPACE}" --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log env: AWF_REFLECT_ENABLED: 1 @@ -837,6 +833,7 @@ jobs: GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} GH_AW_TIMEOUT_MINUTES: 90 GH_AW_VERSION: v0.83.4 + GH_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN || github.token }} GITHUB_API_URL: ${{ github.api_url }} GITHUB_AW: true GITHUB_COPILOT_INTEGRATION_ID: agentic-workflows @@ -853,6 +850,10 @@ jobs: RUNNER_TEMP: ${{ runner.temp }} S2STOKENS: true TRACEPARENT: ${{ env.GITHUB_AW_OTEL_TRACE_ID != '' && env.GITHUB_AW_OTEL_PARENT_SPAN_ID != '' && format('00-{0}-{1}-01', env.GITHUB_AW_OTEL_TRACE_ID, env.GITHUB_AW_OTEL_PARENT_SPAN_ID) || '' }} + - name: Stop CLI Proxy + if: always() + continue-on-error: true + run: bash "${RUNNER_TEMP}/gh-aw/actions/stop_cli_proxy.sh" - name: Detect agent errors if: always() id: detect-agent-errors diff --git a/.github/workflows/build-warning-fixer.md b/.github/workflows/build-warning-fixer.md index 0cfd428e38..929f76302a 100644 --- a/.github/workflows/build-warning-fixer.md +++ b/.github/workflows/build-warning-fixer.md @@ -29,6 +29,7 @@ safe-outputs: network: defaults tools: github: + mode: gh-proxy toolsets: [default, actions] bash: [":*"] timeout-minutes: 90 @@ -44,7 +45,7 @@ steps: # Clang-Tidy Warning Fixer -You are an AI agent that uses clang-tidy warning output captured in GitHub Actions logs, proposes conservative fixes, and creates a GitHub issue with ready-to-apply git diffs. +You are an AI agent that uses clang-tidy warning output captured in a GitHub Actions artifact, proposes conservative fixes, and creates a GitHub issue with ready-to-apply git diffs. ## Current Context @@ -63,58 +64,36 @@ This workflow is only for `Z3Prover/z3`. If `${{ github.repository }}` is not `Z3Prover/z3`, call `noop` immediately with a short explanation. -### 1. Retrieve logs from `clang-tidy-warning-report.yml` +### 1. Retrieve the artifact from `clang-tidy-warning-report.yml` -Use GitHub MCP tools (not `gh`) to retrieve job logs from the triggering run. Do not use `download_workflow_run_artifact`: it may be unavailable, and this workflow must operate entirely from Actions logs. +Use the authenticated `gh` CLI proxy to retrieve the warning artifact from the triggering run. 1. Determine source run ID: - If `${{ github.event.workflow_run.id }}` is present, use it. - - For manual dispatch, call `github-mcp-server-actions_list` (`list_workflow_runs`) for workflow `clang-tidy-warning-report.yml` and select the latest `completed` run. -2. List jobs for that run with `github-mcp-server-actions_list` (`list_workflow_jobs`). -3. Identify the job named `Build Z3 with clang-tidy warnings`. -4. Retrieve its logs with `github-mcp-server-get_job_logs` using `return_content: true` and a large `tail_lines` value so the appended summary block is included. -5. Save the returned log content locally for repeatable analysis: + - For manual dispatch, use `gh run list` for workflow `clang-tidy-warning-report.yml` and select the latest completed run. +2. Download and extract the artifact: ```bash +RUN_ID="${{ github.event.workflow_run.id }}" +if [ -z "$RUN_ID" ]; then + RUN_ID="$(gh run list --repo "${{ github.repository }}" \ + --workflow clang-tidy-warning-report.yml --status completed --limit 1 \ + --json databaseId --jq '.[0].databaseId')" +fi + +rm -rf /tmp/gh-aw/clang-tidy-warning-report mkdir -p /tmp/gh-aw/clang-tidy-warning-report -cat <<'EOF' > /tmp/gh-aw/clang-tidy-warning-report/build.log -$JOB_LOG_CONTENT -EOF -cp /tmp/gh-aw/clang-tidy-warning-report/build.log /tmp/gh-aw/clang-tidy-warning-report/combined.log +gh run download "$RUN_ID" --repo "${{ github.repository }}" \ + --name "clang-tidy-warning-report-$RUN_ID" \ + --dir /tmp/gh-aw/clang-tidy-warning-report ls -la /tmp/gh-aw/clang-tidy-warning-report ``` -The source workflow emits a marker-delimited summary near the end of the job log: - -- `CLANG_TIDY_WARNING_REPORT_BEGIN` -- `CLANG_TIDY_STATUS_BEGIN` / `CLANG_TIDY_STATUS_END` -- `CLANG_TIDY_WARNINGS_BEGIN` / `CLANG_TIDY_WARNINGS_END` -- `CLANG_TIDY_WARNING_REPORT_END` - -Extract the summary into local files: - -```bash -sed -n '/^CLANG_TIDY_STATUS_BEGIN$/,/^CLANG_TIDY_STATUS_END$/p' \ - /tmp/gh-aw/clang-tidy-warning-report/combined.log | sed '1d;$d' \ - > /tmp/gh-aw/clang-tidy-warning-report/status.txt - -sed -n '/^CLANG_TIDY_WARNINGS_BEGIN$/,/^CLANG_TIDY_WARNINGS_END$/p' \ - /tmp/gh-aw/clang-tidy-warning-report/combined.log | sed '1d;$d' \ - > /tmp/gh-aw/clang-tidy-warning-report/warnings.txt -``` - -If the marker block is missing, fall back to grepping the full log: - -```bash -grep -nE 'warning:|error:|clang-tidy' /tmp/gh-aw/clang-tidy-warning-report/combined.log \ - > /tmp/gh-aw/clang-tidy-warning-report/warnings.txt || true -``` - -Expect at minimum `build.log`, `combined.log`, and `warnings.txt`. Prefer using `status.txt` when extracted successfully. If the job log is unavailable or empty, call `noop` with a concise explanation. +Expect `configure.log`, `build.log`, `combined.log`, `warnings.txt`, and `status.txt`. If the artifact is unavailable, expired, or empty, call `noop` with a concise explanation. ### 2. Extract actionable diagnostics -Analyze log-derived files from this run: +Analyze artifact files from this run: - `/tmp/gh-aw/clang-tidy-warning-report/warnings.txt` - `/tmp/gh-aw/clang-tidy-warning-report/build.log` - `/tmp/gh-aw/clang-tidy-warning-report/combined.log` @@ -196,7 +175,7 @@ Issue content must include: - proposed fixes as unified diffs (full diff text, not prose only) - short assignment-ready checklist for Copilot (one checkbox per proposed fix) -If no actionable warnings are found, or the source job logs are missing/corrupt, call `noop` with a concise explanation. +If no actionable warnings are found, or the source artifact is missing/corrupt, call `noop` with a concise explanation. ## Guidelines @@ -204,4 +183,4 @@ If no actionable warnings are found, or the source job logs are missing/corrupt, - Prefer no issue over risky or speculative patch suggestions. - Keep fixes surgical and easy to review. - Focus only on diagnostics produced by the referenced `clang-tidy-warning-report.yml` run. -- Prefer workflow job logs over cross-run artifact downloads, even if artifact metadata is visible. +- Use only the warning artifact from the selected workflow run. diff --git a/src/ast/rewriter/seq_monadic.cpp b/src/ast/rewriter/seq_monadic.cpp index 85ef56ad23..cf902d42c1 100644 --- a/src/ast/rewriter/seq_monadic.cpp +++ b/src/ast/rewriter/seq_monadic.cpp @@ -59,6 +59,36 @@ Author: #include #include +namespace { + char const* mode_name(seq::transition_mode mode) { + switch (mode) { + case seq::transition_mode::brzozowski_tm: + return "brzozowski"; + case seq::transition_mode::light_antimirov_tm: + return "light-antimirov"; + default: + return "unknown"; + } + } + + char const* bail_name(unsigned i) { + static char const* const names[] = { + "unsupported", + "state-cap", + "dnf-cap", + "budget", + "resource", + "nullability", + "guard" + }; + return i < std::size(names) ? names[i] : "unknown"; + } + + char const* result_name(lbool r) { + return r == l_true ? "sat" : r == l_false ? "unsat" : "unknown"; + } +} + expr_ref seq_monadic::der_elem(expr* r, expr* elem) { expr* cached = nullptr; @@ -375,6 +405,8 @@ unsigned seq_monadic::var_index(expr* v) { } void seq_monadic::reset_search() { + m_seq_sort = nullptr; + m_elem_sort = nullptr; m_atoms.reset(); m_regexes.reset(); m_vars.reset(); @@ -799,39 +831,43 @@ lbool seq_monadic::choose_cont(unsigned vi, svector const& S, unsigned } lbool seq_monadic::decide(membership_vec const& memberships) { + m_last_search_memberships = memberships; m_model.reset(); - if (memberships.empty()) - return l_true; // empty conjunction is vacuously true reset_search(); // clear the caches before dropping the m_pin.reset(); // pins that keep their keys alive m_rp_cache.maybe_reset(1u << 16); m_rw.get_derive().maybe_reset_cached_cofactors(1u << 16); m_budget = 200000; m_giveup = false; - if (!prepare(memberships)) - return l_undef; - lbool r; - if (m_config.m_state_search) { - // Build one cursor per membership at its regex start; initial_normalize consumes - // leading constants so every active cursor exposes a variable head. - m_cursors.reset(); - for (unsigned mi = 0; mi < m_atoms.size(); ++mi) - m_cursors.push_back(cursor{ 0, m_regexes.get(mi), false }); - m_last_var = UINT_MAX; - lbool norm = initial_normalize(); - r = (norm == l_false) ? l_false : search(); + lbool r = l_true; // empty conjunction is vacuously true + if (!memberships.empty() && !prepare(memberships)) + r = l_undef; + else if (!memberships.empty()) { + if (m_config.m_state_search) { + // Build one cursor per membership at its regex start; initial_normalize consumes + // leading constants so every active cursor exposes a variable head. + m_cursors.reset(); + for (unsigned mi = 0; mi < m_atoms.size(); ++mi) + m_cursors.push_back(cursor{ 0, m_regexes.get(mi), false }); + m_last_var = UINT_MAX; + lbool norm = initial_normalize(); + r = (norm == l_false) ? l_false : search(); + } + else + r = dfs_membership(0); } - else - r = dfs_membership(0); if (r != l_true) m_model.reset(); + m_last_search_result = r; return r; } lbool seq_monadic::solve(expr* term, expr* R) { + m_core.reset(); membership_vec mv; mv.push_back({ expr_ref(term, m), expr_ref(R, m), nullptr }); - return decide(mv); + m_last_result = decide(mv); + return m_last_result; } void seq_monadic::add(expr* term, expr* regex, void* d) { @@ -930,9 +966,132 @@ void seq_monadic::minimize_core(membership_vec const& memberships) { lbool seq_monadic::check() { m_core.reset(); lbool r = decide(m_memberships); - if (r == l_false) + if (r == l_false) { minimize_core(m_memberships); - return r; + m_model.reset(); + } + m_last_result = r; + return m_last_result; +} + +std::ostream& seq_monadic::display(std::ostream& out) const { + auto display_expr = [&](expr* e) { + if (e) + out << mk_pp(e, m); + else + out << "null"; + }; + + out << "(seq-monadic\n" + << " :mode " << mode_name(m_config.m_mode) << "\n" + << " :generate-model " << (m_config.m_model ? "true" : "false") << "\n" + << " :minimize-core " << (m_config.m_min_core ? "true" : "false") << "\n" + << " :last-result " << result_name(m_last_result) << "\n" + << " :budget " << m_budget << "\n" + << " :giveup " << (m_giveup ? "true" : "false") << "\n" + << " :sequence-sort "; + if (m_seq_sort) + out << mk_pp(m_seq_sort, m); + else + out << "null"; + out << "\n :element-sort "; + if (m_elem_sort) + out << mk_pp(m_elem_sort, m); + else + out << "null"; + + out << "\n :memberships ("; + for (unsigned i = 0; i < m_memberships.size(); ++i) { + auto const& [term, regex, dep] = m_memberships[i]; + out << "\n [" << i << "] "; + display_expr(term); + out << " in "; + display_expr(regex); + out << " :dependency " << dep; + } + if (!m_memberships.empty()) + out << "\n "; + out << ")\n :model ("; + for (auto const& [var, value] : m_model) { + out << "\n "; + display_expr(var); + out << " -> "; + display_expr(value); + } + if (!m_model.empty()) + out << "\n "; + out << ")\n :core ("; + for (void* dep : m_core) + out << " " << dep; + out << " )"; + + out << "\n :last-internal-search\n" + << " (:result " << result_name(m_last_search_result) + << "\n :memberships ("; + for (unsigned i = 0; i < m_last_search_memberships.size(); ++i) { + auto const& [term, regex, dep] = m_last_search_memberships[i]; + out << "\n [" << i << "] "; + display_expr(term); + out << " in "; + display_expr(regex); + out << " :dependency " << dep; + } + if (!m_last_search_memberships.empty()) + out << "\n "; + out << ")\n :variables ("; + for (expr* var : m_vars) { + out << " "; + display_expr(var); + } + out << " )\n :parsed-memberships ("; + for (unsigned mi = 0; mi < m_atoms.size(); ++mi) { + out << "\n [" << mi << "] :regex "; + display_expr(m_regexes.get(mi)); + out << " :atoms ("; + for (atom const& a : m_atoms[mi]) { + out << " " << (a.is_var ? "var:" : "elem:"); + display_expr(a.is_var ? a.var.get() : a.elem.get()); + } + out << " )"; + } + if (!m_atoms.empty()) + out << "\n "; + out << ")\n :groups ("; + for (unsigned vi = 0; vi < m_groups.size(); ++vi) { + out << "\n "; + display_expr(m_vars[vi]); + out << " ("; + for (component const& c : m_groups[vi]) { + out << "\n "; + display_expr(c.state); + if (c.target) { + out << " -> "; + display_expr(c.target); + } + else { + out << " nullable"; + } + } + if (!m_groups[vi].empty()) + out << "\n "; + out << ")"; + } + if (!m_groups.empty()) + out << "\n "; + out << ")\n" + << " :undefined-variables " << m_undef_vars << "\n" + << " :group-cache-size " << m_group_cache.size() << "\n" + << " :derivative-cache-size " << m_der_cache.size() << "\n" + << " :nullable-cache-size " << m_nullable_cache.size() << "\n" + << " :live-cache-size " << m_live_cache.size() << "\n" + << " :pinned-expressions " << m_pin.size() << ")\n"; + + out << " :statistics\n" + << " (:cofactor-calls " << m_stats.m_cofactor_calls << "\n" + << " :states " << m_stats.m_states; + for (unsigned i = 0; i < static_cast(bail_reason::num_reasons); ++i) + out << "\n :bail-" << bail_name(i) << " " << m_stats.m_bails[i]; + return out << "))\n"; } void seq_monadic::collect_statistics(::statistics& st) const { diff --git a/src/ast/rewriter/seq_monadic.h b/src/ast/rewriter/seq_monadic.h index d167490367..062f483412 100644 --- a/src/ast/rewriter/seq_monadic.h +++ b/src/ast/rewriter/seq_monadic.h @@ -121,8 +121,11 @@ class seq_monadic { // seq_rewriter's own cache is capped and flushed whole using membership_vec = vector>; membership_vec m_memberships; // asserted (term in regex, dep) for check() + membership_vec m_last_search_memberships; // inputs used by the last internal decide() ptr_vector m_core; // dependencies of an unsat subset, filled by check() on l_false std::function m_is_var; // predicate for whether a term is a sequence variable + lbool m_last_result = l_undef; // result of the last public solve()/check() + lbool m_last_search_result = l_undef; // result of the last internal decide() seq_util& u() const { return m_rw.u(); } seq_util::rex& re() const { return m_rw.u().re; } @@ -295,6 +298,9 @@ public: void collect_statistics(::statistics &st) const; + // Display asserted constraints, result artifacts, search state, caches, and counters. + std::ostream& display(std::ostream& out) const; + seq::transition_mode mode() const { return m_config.m_mode; } // Enable/disable model generation (default: enabled). When enabled, a successful diff --git a/src/cmd_context/cmd_context.cpp b/src/cmd_context/cmd_context.cpp index a4363d0063..8a0f856b66 100644 --- a/src/cmd_context/cmd_context.cpp +++ b/src/cmd_context/cmd_context.cpp @@ -373,6 +373,19 @@ bool cmd_context::contains_func_decl(symbol const& s, unsigned n, sort* const* d return m_func_decls.find(s, fs) && fs.contains(n, domain, range); } +bool cmd_context::builtin_signature_collides(symbol const& s, unsigned arity, sort* const* domain) const { + expr_ref_vector args(m()); + for (unsigned i = 0; i < arity; ++i) + args.push_back(m().mk_var(i, domain[i])); + expr_ref result(m()); + try { + return try_mk_builtin_app(s, arity, args.data(), 0, nullptr, nullptr, result); + } + catch (ast_exception&) { + return false; + } +} + bool cmd_context::contains_macro(symbol const& s) const { macro_decls decls; return m_macros.find(s, decls) && !decls.empty(); @@ -938,11 +951,12 @@ void cmd_context::insert(symbol const & s, func_decl * f) { if (contains_macro(s, f)) { throw cmd_exception("invalid declaration, named expression already defined with this name ", s); } -#if 0 - if (m_builtin_decls.contains(s)) { - throw cmd_exception("invalid declaration, builtin symbol ", s); + if (builtin_signature_collides(s, f->get_arity(), f->get_domain())) { + std::string msg = "invalid declaration, builtin symbol '"; + msg += s.str(); + msg += "' has the same argument sorts"; + throw cmd_exception(std::move(msg)); } -#endif func_decls & fs = m_func_decls.insert_if_not_there(s, func_decls()); if (!fs.insert(m(), f)) { if (m_allow_duplicate_declarations) @@ -980,11 +994,12 @@ void cmd_context::insert(symbol const & s, psort_decl * p) { void cmd_context::insert(symbol const & s, unsigned arity, sort *const* domain, expr * t) { expr_ref _t(t, m()); -#if 0 - if (m_builtin_decls.contains(s)) { - throw cmd_exception("invalid macro/named expression, builtin symbol ", s); + if (builtin_signature_collides(s, arity, domain)) { + std::string msg = "invalid named expression, builtin symbol '"; + msg += s.str(); + msg += "' has the same argument sorts"; + throw cmd_exception(std::move(msg)); } -#endif if (contains_macro(s, arity, domain)) { throw cmd_exception("named expression already defined"); } @@ -2570,4 +2585,3 @@ std::ostream & operator<<(std::ostream & out, cmd_context::status st) { } return out; } - diff --git a/src/cmd_context/cmd_context.h b/src/cmd_context/cmd_context.h index 611b1c2079..0f4313bb40 100644 --- a/src/cmd_context/cmd_context.h +++ b/src/cmd_context/cmd_context.h @@ -364,6 +364,7 @@ protected: void mk_solver(); bool contains_func_decl(symbol const& s, unsigned n, sort* const* domain, sort* range) const; + bool builtin_signature_collides(symbol const& s, unsigned arity, sort* const* domain) const; bool contains_macro(symbol const& s) const; bool contains_macro(symbol const& s, func_decl* f) const; @@ -581,4 +582,3 @@ public: std::ostream & operator<<(std::ostream & out, cmd_context::status st); - diff --git a/src/test/seq_monadic.cpp b/src/test/seq_monadic.cpp index d7a1942a36..8b84ab2d15 100644 --- a/src/test/seq_monadic.cpp +++ b/src/test/seq_monadic.cpp @@ -27,6 +27,7 @@ Author: #include "params/smt_params.h" #include "smt/smt_kernel.h" #include +#include #include namespace { @@ -467,6 +468,68 @@ public: std::cout << (trail_ok ? " OK " : " FAIL ") << "check preserves assertions and pop removes them\n"; + std::cout << "=== seq_monadic: display ===\n"; + m_trail.push_scope(); + unsigned display_dep = 0; + m_mon.set_gen_model(true); + m_mon.add(x, aaS, &display_dep); + lbool display_result = m_mon.check(); + std::ostringstream display_out; + m_mon.display(display_out); + std::string display_text = display_out.str(); + bool display_ok = + display_result == l_true && + display_text.find("(seq-monadic") != std::string::npos && + display_text.find(":memberships") != std::string::npos && + display_text.find(":model") != std::string::npos && + display_text.find(":last-result sat") != std::string::npos && + display_text.find(":last-internal-search") != std::string::npos && + display_text.find(":parsed-memberships") != std::string::npos && + display_text.find(":statistics") != std::string::npos && + display_text.find("x") != std::string::npos; + m_trail.pop_scope(1); + if (!display_ok) ++m_fail; + std::cout << (display_ok ? " OK " : " FAIL ") + << "display exposes readable solver state\n"; + + m_trail.push_scope(); + unsigned display_dep1 = 1, display_dep2 = 2; + m_mon.set_min_core(true); + m_mon.add(x, aaS, &display_dep1); + m_mon.add(x, a_aaS, &display_dep2); + lbool unsat_display_result = m_mon.check(); + std::ostringstream unsat_display_out; + m_mon.display(unsat_display_out); + std::string unsat_display_text = unsat_display_out.str(); + bool unsat_display_ok = + unsat_display_result == l_false && + unsat_display_text.find(":last-result unsat") != std::string::npos && + unsat_display_text.find(":model ()") != std::string::npos && + unsat_display_text.find(":last-internal-search") != std::string::npos; + m_trail.pop_scope(1); + m_mon.set_min_core(false); + if (!unsat_display_ok) ++m_fail; + std::cout << (unsat_display_ok ? " OK " : " FAIL ") + << "display distinguishes unsat result from core-search state\n"; + + lbool solve_display_result = m_mon.solve(x, aaS); + std::ostringstream solve_display_out; + m_mon.display(solve_display_out); + bool solve_display_ok = + solve_display_result == l_true && + solve_display_out.str().find(":core ( )") != std::string::npos; + lbool empty_display_result = m_mon.check(); + std::ostringstream empty_display_out; + m_mon.display(empty_display_out); + std::string empty_display_text = empty_display_out.str(); + bool empty_display_ok = + empty_display_result == l_true && + empty_display_text.find(":sequence-sort null") != std::string::npos && + empty_display_text.find(":element-sort null") != std::string::npos; + if (!solve_display_ok || !empty_display_ok) ++m_fail; + std::cout << (solve_display_ok && empty_display_ok ? " OK " : " FAIL ") + << "display clears artifacts across solve and empty check\n"; + std::cout << "=== seq_monadic: length bounds ===\n"; auto check_bound = [&](char const* name, expr* regex, unsigned bound, bool is_lo, lbool expected) { diff --git a/src/test/smt2print_parse.cpp b/src/test/smt2print_parse.cpp index f696a8349e..5186ec78e3 100644 --- a/src/test/smt2print_parse.cpp +++ b/src/test/smt2print_parse.cpp @@ -257,6 +257,36 @@ void test_symbol_escape() { std::cout << "done evaluating\n"; } +void test_builtin_signature_clash() { + char const* rejected[] = { + "(declare-fun and (Bool Bool) Int)", + "(define-fun not ((a Bool)) Bool false)", + "(declare-const true Bool)", + "(define-fun = ((a Int) (b Int)) Bool true)", + "(define-fun ite ((c Bool) (a Int) (b Int)) Int 0)", + "(define-fun + ((a Int) (b Int)) Int 0)", + "(define-fun-rec and ((a Bool) (b Bool)) Bool false)" + }; + + for (char const* spec : rejected) { + Z3_context ctx = Z3_mk_context(nullptr); + Z3_set_error_handler(ctx, setError); + is_error = false; + Z3_parse_smtlib2_string(ctx, spec, 0, nullptr, nullptr, 0, nullptr, nullptr); + ENSURE(is_error); + Z3_del_context(ctx); + } + + Z3_context ctx = Z3_mk_context(nullptr); + Z3_set_error_handler(ctx, setError); + test_eval(ctx, + "(declare-fun and (Int Int) Int)\n" + "(assert (= (and 1 2) 0))\n" + "(check-sat)\n", + false); + Z3_del_context(ctx); +} + void tst_smt2print_parse() { // test basic datatypes @@ -326,6 +356,7 @@ void tst_smt2print_parse() { test_ho_choice_expression(); test_symbol_escape(); + test_builtin_signature_clash(); // Regression test for GitHub issue #10166: // With (set-option :smtlib2_compliant true), a formula involving to_real