From 2546dacc8561964f05e6842bfbfb6a39a86c0783 Mon Sep 17 00:00:00 2001 From: Landon Cox Date: Thu, 15 Oct 2026 13:00:09 -0700 Subject: [PATCH 1/3] chore: recompile Cloud Hypervisor enclave smoke Use the selected local compiler and immutable gh-aw runtime ref. Preserve release pins and metadata-write safety; document failed scanner gates. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 14810de3-06c0-4ec9-885f-f5c1be7259e8 --- .github/aw/actions-lock.json | 5 +++ .../smoke-enclave-cloud-hypervisor.lock.yml | 33 +++++-------------- .../smoke-enclave-cloud-hypervisor.md | 30 +++++++++++++---- scripts/ci/smoke-enclave-workflow.test.ts | 29 +++++++++++----- 4 files changed, 59 insertions(+), 38 deletions(-) diff --git a/.github/aw/actions-lock.json b/.github/aw/actions-lock.json index eb17a2c36..07ce8eade 100644 --- a/.github/aw/actions-lock.json +++ b/.github/aw/actions-lock.json @@ -74,6 +74,11 @@ "repo": "github/gh-aw-actions/setup", "version": "v0.92.0", "sha": "458b269006dcf88e3b5496b6fbecabe4b9a0f954" + }, + "github/gh-aw/actions/setup@0abe2d9b233658150bc05ea968f1736b94093cf7": { + "repo": "github/gh-aw/actions/setup", + "version": "0abe2d9b233658150bc05ea968f1736b94093cf7", + "sha": "0abe2d9b233658150bc05ea968f1736b94093cf7" } }, "containers": { diff --git a/.github/workflows/smoke-enclave-cloud-hypervisor.lock.yml b/.github/workflows/smoke-enclave-cloud-hypervisor.lock.yml index 9bf17f7de..65f86893d 100644 --- a/.github/workflows/smoke-enclave-cloud-hypervisor.lock.yml +++ b/.github/workflows/smoke-enclave-cloud-hypervisor.lock.yml @@ -1,6 +1,6 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"8a2eda959eae849d68389e16174e7aaf5c4094933f7c772ec4bb3afbdf9a69e9","body_hash":"81d51c8b39ef3fa66f841857495b1f39fd1b77bb81d56b32150e9f30ccb24470","compiler_version":"v0.92.0","agent_id":"copilot","engine_versions":{"copilot":"1.0.96"},"agent_image_runner":"ubuntu-24.04"} -# gh-aw-manifest: {"version":1,"secrets":["GH_AW_DEFAULT_OTLP_ENDPOINT","GH_AW_DEFAULT_OTLP_HEADERS","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"9000827ccba6bdab643e8b6fd33ac0654aef8333","version":"v8.0.2"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/upload-artifact","sha":"cf430e030ddbb5b0abf93d22962f4752f3646cd9","version":"v7.0.2"},{"repo":"github/gh-aw-actions/setup","sha":"458b269006dcf88e3b5496b6fbecabe4b9a0f954","version":"v0.92.0"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.59","digest":"sha256:63a1cba05e97ede7fc08cc8abb91167045c998d4415433e9c87377e9266ec291","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.59@sha256:63a1cba05e97ede7fc08cc8abb91167045c998d4415433e9c87377e9266ec291"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.59","digest":"sha256:f3d7842f34ff1778ac024a8918519b12436d6437b82d6d1d8cee1d01b2ac87e2","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.59@sha256:f3d7842f34ff1778ac024a8918519b12436d6437b82d6d1d8cee1d01b2ac87e2"},{"image":"ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.59","digest":"sha256:22305bd56b14dad6cffce9d57a8bb381bb517e141926b7c4c7365dfe5977d891","pinned_image":"ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.59@sha256:22305bd56b14dad6cffce9d57a8bb381bb517e141926b7c4c7365dfe5977d891"},{"image":"ghcr.io/github/gh-aw-firewall/enclave-script:0.28.59","digest":"sha256:5e141863e669e29a1db29e0ba1970438a294a608decd7996e647e4e609706aad","pinned_image":"ghcr.io/github/gh-aw-firewall/enclave-script:0.28.59@sha256:5e141863e669e29a1db29e0ba1970438a294a608decd7996e647e4e609706aad"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.59","digest":"sha256:e815a456d6050564666cb2a8bb04ff11a4babc2bfa746d611e895b87e59f9af0","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.59@sha256:e815a456d6050564666cb2a8bb04ff11a4babc2bfa746d611e895b87e59f9af0"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.31","digest":"sha256:dbec0f2ddef6adf83b7764019323096e3e5cc0f3886255f6320555b7fe2a7caf","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.31@sha256:dbec0f2ddef6adf83b7764019323096e3e5cc0f3886255f6320555b7fe2a7caf"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:11c2c544876cdbaffefe0f7f1283b74838c209654b4934a78e23ed11f750490f","pinned_image":"ghcr.io/github/gh-aw-node@sha256:11c2c544876cdbaffefe0f7f1283b74838c209654b4934a78e23ed11f750490f"}],"mcp_servers":[{"name":"awf-enclave","tools":["*"]},{"name":"safeoutputs","tools":["missing_data","missing_tool","noop","report_incomplete","report_smoke_result"]}],"threat_detection":{"mode":"disabled"}} -# This file was automatically generated by gh-aw (v0.92.0). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"8a2eda959eae849d68389e16174e7aaf5c4094933f7c772ec4bb3afbdf9a69e9","body_hash":"98f16b9def7afc3df4d3ad873ba82952b4bfdf010a44d3088ac5453c69acf064","compiler_version":"gh-aw/work-queue/5eb4c298ecba515924d30bd7989113dd79d7d421-14-g7dc6abab7a-dirty","agent_id":"copilot","engine_versions":{"copilot":"1.0.96"},"agent_image_runner":"ubuntu-24.04"} +# gh-aw-manifest: {"version":1,"secrets":["GH_AW_DEFAULT_OTLP_ENDPOINT","GH_AW_DEFAULT_OTLP_HEADERS","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"9000827ccba6bdab643e8b6fd33ac0654aef8333","version":"v8.0.2"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/upload-artifact","sha":"cf430e030ddbb5b0abf93d22962f4752f3646cd9","version":"v7.0.2"},{"repo":"github/gh-aw/actions/setup","sha":"0abe2d9b233658150bc05ea968f1736b94093cf7","version":"0abe2d9b233658150bc05ea968f1736b94093cf7"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.59","digest":"sha256:63a1cba05e97ede7fc08cc8abb91167045c998d4415433e9c87377e9266ec291","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.59@sha256:63a1cba05e97ede7fc08cc8abb91167045c998d4415433e9c87377e9266ec291"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.59","digest":"sha256:f3d7842f34ff1778ac024a8918519b12436d6437b82d6d1d8cee1d01b2ac87e2","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.59@sha256:f3d7842f34ff1778ac024a8918519b12436d6437b82d6d1d8cee1d01b2ac87e2"},{"image":"ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.59","digest":"sha256:22305bd56b14dad6cffce9d57a8bb381bb517e141926b7c4c7365dfe5977d891","pinned_image":"ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.59@sha256:22305bd56b14dad6cffce9d57a8bb381bb517e141926b7c4c7365dfe5977d891"},{"image":"ghcr.io/github/gh-aw-firewall/enclave-script:0.28.59","digest":"sha256:5e141863e669e29a1db29e0ba1970438a294a608decd7996e647e4e609706aad","pinned_image":"ghcr.io/github/gh-aw-firewall/enclave-script:0.28.59@sha256:5e141863e669e29a1db29e0ba1970438a294a608decd7996e647e4e609706aad"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.59","digest":"sha256:e815a456d6050564666cb2a8bb04ff11a4babc2bfa746d611e895b87e59f9af0","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.59@sha256:e815a456d6050564666cb2a8bb04ff11a4babc2bfa746d611e895b87e59f9af0"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.31","digest":"sha256:dbec0f2ddef6adf83b7764019323096e3e5cc0f3886255f6320555b7fe2a7caf","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.31@sha256:dbec0f2ddef6adf83b7764019323096e3e5cc0f3886255f6320555b7fe2a7caf"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:11c2c544876cdbaffefe0f7f1283b74838c209654b4934a78e23ed11f750490f","pinned_image":"ghcr.io/github/gh-aw-node@sha256:11c2c544876cdbaffefe0f7f1283b74838c209654b4934a78e23ed11f750490f"}],"mcp_servers":[{"name":"awf-enclave","tools":["*"]},{"name":"safeoutputs","tools":["missing_data","missing_tool","noop","report_incomplete","report_smoke_result"]}],"threat_detection":{"mode":"disabled"}} +# This file was automatically generated by gh-aw. DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # # ___ _ _ # / _ \ | | (_) @@ -37,7 +37,7 @@ # - actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 # - actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 # - actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 -# - github/gh-aw-actions/setup@458b269006dcf88e3b5496b6fbecabe4b9a0f954 # v0.92.0 +# - github/gh-aw/actions/setup@0abe2d9b233658150bc05ea968f1736b94093cf7 # 0abe2d9b233658150bc05ea968f1736b94093cf7 # # Container images used: # - ghcr.io/github/gh-aw-firewall/agent:0.28.59@sha256:63a1cba05e97ede7fc08cc8abb91167045c998d4415433e9c87377e9266ec291 @@ -107,7 +107,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@458b269006dcf88e3b5496b6fbecabe4b9a0f954 # v0.92.0 + uses: github/gh-aw/actions/setup@0abe2d9b233658150bc05ea968f1736b94093cf7 # 0abe2d9b233658150bc05ea968f1736b94093cf7 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} @@ -129,7 +129,6 @@ jobs: GH_AW_INFO_MODEL: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || vars.GH_AW_DEFAULT_MODEL_COPILOT || 'auto' }} GH_AW_INFO_VERSION: "1.0.96" GH_AW_INFO_AGENT_VERSION: "1.0.96" - GH_AW_INFO_CLI_VERSION: "v0.92.0" GH_AW_INFO_WORKFLOW_NAME: "Smoke Enclave Cloud Hypervisor (Experimental)" GH_AW_INFO_EXPERIMENTAL: "false" GH_AW_INFO_SUPPORTS_TOOLS_ALLOWLIST: "true" @@ -243,20 +242,6 @@ jobs: setupGlobals(core, github, context, exec, io, getOctokit); const { main } = require(path.join(actionsDir, 'check_workflow_timestamp_api.cjs')); await main(); - - name: Check compile-agentic version - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 - env: - GH_AW_COMPILED_VERSION: "v0.92.0" - GH_AW_BLOCKED_VERSION_REPORT_AS_ISSUE: "false" - GH_AW_WORKFLOW_NAME: "Smoke Enclave Cloud Hypervisor (Experimental)" - with: - script: | - const path = require('path'); - const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); - const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); - setupGlobals(core, github, context, exec, io, getOctokit); - const { main } = require(path.join(actionsDir, 'check_version_updates.cjs')); - await main(); - name: Log runtime features if: ${{ contains(toJSON(vars), '"GH_AW_RUNTIME_FEATURES":') }} run: bash "${RUNNER_TEMP}/gh-aw/actions/log_runtime_features_summary.sh" @@ -426,7 +411,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@458b269006dcf88e3b5496b6fbecabe4b9a0f954 # v0.92.0 + uses: github/gh-aw/actions/setup@0abe2d9b233658150bc05ea968f1736b94093cf7 # 0abe2d9b233658150bc05ea968f1736b94093cf7 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} @@ -904,7 +889,7 @@ jobs: GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} GH_AW_TIMEOUT_MINUTES: 20 - GH_AW_VERSION: v0.92.0 + GH_AW_VERSION: dev GH_TOKEN: ${{ github.token }} GITHUB_API_URL: ${{ github.api_url }} GITHUB_AW: true @@ -1193,7 +1178,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@458b269006dcf88e3b5496b6fbecabe4b9a0f954 # v0.92.0 + uses: github/gh-aw/actions/setup@0abe2d9b233658150bc05ea968f1736b94093cf7 # 0abe2d9b233658150bc05ea968f1736b94093cf7 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} @@ -1523,7 +1508,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@458b269006dcf88e3b5496b6fbecabe4b9a0f954 # v0.92.0 + uses: github/gh-aw/actions/setup@0abe2d9b233658150bc05ea968f1736b94093cf7 # 0abe2d9b233658150bc05ea968f1736b94093cf7 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} diff --git a/.github/workflows/smoke-enclave-cloud-hypervisor.md b/.github/workflows/smoke-enclave-cloud-hypervisor.md index 955e2b0d4..97084e2bd 100644 --- a/.github/workflows/smoke-enclave-cloud-hypervisor.md +++ b/.github/workflows/smoke-enclave-cloud-hypervisor.md @@ -151,12 +151,21 @@ diagnostics (#9955), bounded enclave MCP startup diagnostics (#9898), and the narrowly scoped official-main and tagged-workflow acceptance paths. The binary, Docker images, and release-attested primary and script enclave artifacts all select that release. This workflow is compiled -with gh-aw v0.92.0 and does not publish a release or authorize a live run. +with the user-selected local `/Users/lpcox/projects/gh-aw/gh-aw` binary, reporting +`gh-aw/work-queue/5eb4c298ecba515924d30bd7989113dd79d7d421-14-g7dc6abab7a-dirty`, +and pins `github/gh-aw/actions/setup` to +`0abe2d9b233658150bc05ea968f1736b94093cf7`. The action ref selects runtime +scripts, not the local compiler build. That premerge commit contains the +scanner-generation fixes from github/gh-aw#69079; its two implementation blobs +match the squash merge, although it is not a descendant of that merge. +The binary reports build revision `7dc6abab7ad723cd98f18b5c521d896ed7ffcdc7` +and modified source; this metadata does not establish its exact build source. +This update does not publish a release or authorize a live run. This is diagnostic enablement, not a verified fix for the original host-executor launch failure; that failure remains untested with this release. -Copilot CLI is independently pinned to 1.0.96, the pinned gh-aw v0.92.0 -installer's default. Its help advertises every generated CLI option and the -harness-added `--session-id` used for model verification; 1.0.34 rejects that +Copilot CLI remains independently pinned to 1.0.96. Its help advertises every +generated CLI option and the harness-added `--session-id` used for model +verification; 1.0.34 rejects that option before the agent can invoke an enclave. Credential-free offline argument checks do not verify a live smoke run or the original enclave launch failure. The pinned model-verification harness updates `/tmp/gh-aw/aw_info.json` in @@ -193,8 +202,8 @@ collected. A failure before debug capture starts produces only a status record. AWF v0.28.59 safely publishes early resolved configuration under `/run/awf-config-audit` and exports its path as `AWF_RESOLVED_CONFIG` through `GITHUB_ENV`. The normal audit compatibility JSON is published only after -successful privileged cleanup. The pinned gh-aw v0.92.0 setup action -(`github/gh-aw-actions` at `458b269006dcf88e3b5496b6fbecabe4b9a0f954`) +successful privileged cleanup. The selected setup action +(`github/gh-aw/actions/setup` at `0abe2d9b233658150bc05ea968f1736b94093cf7`) redacts only the framework-managed AWF temp root and `${RUNNER_TEMP}/gh-aw`; the compiled artifact upload includes the old audit tree, not the new early path. Neither consumer uses `AWF_RESOLVED_CONFIG`, so evidence after failed cleanup @@ -206,6 +215,15 @@ resolved JSON into normal artifact paths, disable redaction, or relax ownership or guest-mount protections. The separate bounded raw public-fixture artifact above is unchanged and does not close this collection gap. +Compile-only dry-run validation now passes actionlint and shellcheck, including +the formerly invalid empty environment and removed daily-credit output +references. Its scanner gate still fails: zizmor flags the premerge setup ref +as `impostor-commit`, its SHA-only version comments, and activation secret +references without a dedicated environment. The ref is the head of merged +github/gh-aw#69079, but is not on a current branch or tag; commit existence and +matching fix blobs do not make the scanner gate pass. These findings are not +suppressed, and this update does not change environment or approval policy. + ## Enclave invocation The enclave server is mounted as the `awf-enclave` CLI command on `PATH`, diff --git a/scripts/ci/smoke-enclave-workflow.test.ts b/scripts/ci/smoke-enclave-workflow.test.ts index 2e8fd288a..bfdfc685f 100644 --- a/scripts/ci/smoke-enclave-workflow.test.ts +++ b/scripts/ci/smoke-enclave-workflow.test.ts @@ -18,6 +18,10 @@ function countOccurrences(content: string, value: string): number { } describe('experimental Cloud Hypervisor enclave smoke workflow', () => { + const compilerVersion = + 'gh-aw/work-queue/5eb4c298ecba515924d30bd7989113dd79d7d421-14-g7dc6abab7a-dirty'; + const setupAction = + 'github/gh-aw/actions/setup@0abe2d9b233658150bc05ea968f1736b94093cf7'; const source = fs.readFileSync( path.join(workflowsDir, 'smoke-enclave-cloud-hypervisor.md'), 'utf8' ); @@ -202,8 +206,16 @@ describe('experimental Cloud Hypervisor enclave smoke workflow', () => { 'bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.96' ); expect(lock).toContain('"engine_versions":{"copilot":"1.0.96"}'); - expect(lock).toContain('"compiler_version":"v0.92.0"'); - expect(lock).toContain('github/gh-aw-actions/setup@458b269006dcf88e3b5496b6fbecabe4b9a0f954'); + expect(lock).toContain(`"compiler_version":"${compilerVersion}"`); + expect(lock).toContain(setupAction); + const setupSteps = Object.values(compiled.jobs).flatMap(job => job.steps) + .filter(step => 'uses' in step && String(step.uses).includes('/setup@')); + expect(setupSteps).toHaveLength(4); + for (const step of setupSteps) { + expect('uses' in step && step.uses).toBe(setupAction); + } + expect(lock).not.toContain('"dry_run":true'); + expect(source).toContain('The action ref selects runtime\nscripts, not the local compiler build.'); expect(execute?.run).toContain('GH_AW_COPILOT_SRC="$(command -v copilot 2>/dev/null || true)"'); expect(execute?.run).toContain('GH_AW_COPILOT_BIN="${RUNNER_TEMP}/gh-aw/bin/copilot"'); expect(execute?.run).toContain('cp "$GH_AW_COPILOT_SRC" "$GH_AW_COPILOT_BIN"'); @@ -308,9 +320,9 @@ describe('experimental Cloud Hypervisor enclave smoke workflow', () => { .map(([name]) => name)).toEqual([]); expect(compiled.jobs.safe_outputs.permissions?.issues).toBeUndefined(); expect(compiled.jobs.report_smoke_result.permissions?.issues).toBeUndefined(); - const blockedVersionStep = compiled.jobs.activation.steps.find(step => - step.env?.GH_AW_BLOCKED_VERSION_REPORT_AS_ISSUE !== undefined); - expect(blockedVersionStep?.env?.GH_AW_BLOCKED_VERSION_REPORT_AS_ISSUE).toBe('false'); + expect(compiled.jobs.activation.steps.some(step => + step.name === 'Check compile-agentic version')).toBe(false); + expect(lock).not.toContain("require(path.join(actionsDir, 'check_version_updates.cjs'))"); for (const configKey of [ 'GH_AW_SAFE_OUTPUTS_CONFIG', 'GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG', ]) { @@ -481,7 +493,7 @@ describe('experimental Cloud Hypervisor enclave smoke workflow', () => { expect(lock).not.toContain('--container-runtime docker'); expect(lock).toContain('\\"cloudHypervisor\\":{\\"previewEnabled\\":true'); expect(lock).toContain('--exclude-env AWF_CLOUD_HYPERVISOR_ENCLAVE_SCRIPT_ROOTFS'); - expect(lock).toContain('"compiler_version":"v0.92.0"'); + expect(lock).toContain(`"compiler_version":"${compilerVersion}"`); }); it('pins the published AWF and its attested artifacts to the same release', () => { @@ -540,9 +552,10 @@ describe('experimental Cloud Hypervisor enclave smoke workflow', () => { ); expect(source).toContain('successful privileged cleanup'); expect(source).toContain('Do not copy raw\nresolved JSON into normal artifact paths'); - expect(source).toContain('compiled\nwith gh-aw v0.92.0'); + expect(source).toContain('with the user-selected local'); + expect(source).toContain(compilerVersion); expect(steps.some(step => - step.uses === 'github/gh-aw-actions/setup@458b269006dcf88e3b5496b6fbecabe4b9a0f954' + step.uses === setupAction )).toBe(true); expect(redact?.with?.script).toContain("require(path.join(actionsDir, 'redact_secrets.cjs'))"); expect(upload?.with?.path).toContain('/tmp/gh-aw/sandbox/firewall/audit/'); From 9aac2a95b7aaead51e7b6eb6d296b40adb9dfb44 Mon Sep 17 00:00:00 2001 From: Landon Cox Date: Thu, 15 Oct 2026 13:42:15 -0700 Subject: [PATCH 2/3] docs: use upstream mount manual to avoid link-check timeout Replace the timed-out man7.org mount(8) URL with the util-linux source manual, preserving the remount semantics reference. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 14810de3-06c0-4ec9-885f-f5c1be7259e8 --- docs/cloud-hypervisor-foundation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cloud-hypervisor-foundation.md b/docs/cloud-hypervisor-foundation.md index 117846a17..f0881637c 100644 --- a/docs/cloud-hypervisor-foundation.md +++ b/docs/cloud-hypervisor-foundation.md @@ -1635,7 +1635,7 @@ destination mount. The kernel tests the destination and calls `set_mnt_shared()` on the attached tree. This kernel reference establishes the mechanism, not the probe's unrecorded exact kernel version. A -[`remount,bind`](https://man7.org/linux/man-pages/man8/mount.8.html) +[`remount,bind`](https://github.com/util-linux/util-linux/blob/master/sys-utils/mount.8.adoc) changes per-mount flags, not automatically its propagation class. These are five hypotheses, ordered by code/semantic support, not five findings: From f6e1bbf5fea0b1624fb666980025f280eaed3876 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 15 Oct 2026 22:00:01 +0000 Subject: [PATCH 3/3] fix: address smoke workflow review feedback --- .../smoke-enclave-cloud-hypervisor.lock.yml | 33 ++++++++++++++----- .../smoke-enclave-cloud-hypervisor.md | 29 +++++++--------- scripts/ci/smoke-enclave-workflow.test.ts | 16 +++++---- 3 files changed, 45 insertions(+), 33 deletions(-) diff --git a/.github/workflows/smoke-enclave-cloud-hypervisor.lock.yml b/.github/workflows/smoke-enclave-cloud-hypervisor.lock.yml index 65f86893d..f13dd2198 100644 --- a/.github/workflows/smoke-enclave-cloud-hypervisor.lock.yml +++ b/.github/workflows/smoke-enclave-cloud-hypervisor.lock.yml @@ -1,6 +1,6 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"8a2eda959eae849d68389e16174e7aaf5c4094933f7c772ec4bb3afbdf9a69e9","body_hash":"98f16b9def7afc3df4d3ad873ba82952b4bfdf010a44d3088ac5453c69acf064","compiler_version":"gh-aw/work-queue/5eb4c298ecba515924d30bd7989113dd79d7d421-14-g7dc6abab7a-dirty","agent_id":"copilot","engine_versions":{"copilot":"1.0.96"},"agent_image_runner":"ubuntu-24.04"} -# gh-aw-manifest: {"version":1,"secrets":["GH_AW_DEFAULT_OTLP_ENDPOINT","GH_AW_DEFAULT_OTLP_HEADERS","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"9000827ccba6bdab643e8b6fd33ac0654aef8333","version":"v8.0.2"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/upload-artifact","sha":"cf430e030ddbb5b0abf93d22962f4752f3646cd9","version":"v7.0.2"},{"repo":"github/gh-aw/actions/setup","sha":"0abe2d9b233658150bc05ea968f1736b94093cf7","version":"0abe2d9b233658150bc05ea968f1736b94093cf7"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.59","digest":"sha256:63a1cba05e97ede7fc08cc8abb91167045c998d4415433e9c87377e9266ec291","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.59@sha256:63a1cba05e97ede7fc08cc8abb91167045c998d4415433e9c87377e9266ec291"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.59","digest":"sha256:f3d7842f34ff1778ac024a8918519b12436d6437b82d6d1d8cee1d01b2ac87e2","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.59@sha256:f3d7842f34ff1778ac024a8918519b12436d6437b82d6d1d8cee1d01b2ac87e2"},{"image":"ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.59","digest":"sha256:22305bd56b14dad6cffce9d57a8bb381bb517e141926b7c4c7365dfe5977d891","pinned_image":"ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.59@sha256:22305bd56b14dad6cffce9d57a8bb381bb517e141926b7c4c7365dfe5977d891"},{"image":"ghcr.io/github/gh-aw-firewall/enclave-script:0.28.59","digest":"sha256:5e141863e669e29a1db29e0ba1970438a294a608decd7996e647e4e609706aad","pinned_image":"ghcr.io/github/gh-aw-firewall/enclave-script:0.28.59@sha256:5e141863e669e29a1db29e0ba1970438a294a608decd7996e647e4e609706aad"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.59","digest":"sha256:e815a456d6050564666cb2a8bb04ff11a4babc2bfa746d611e895b87e59f9af0","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.59@sha256:e815a456d6050564666cb2a8bb04ff11a4babc2bfa746d611e895b87e59f9af0"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.31","digest":"sha256:dbec0f2ddef6adf83b7764019323096e3e5cc0f3886255f6320555b7fe2a7caf","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.31@sha256:dbec0f2ddef6adf83b7764019323096e3e5cc0f3886255f6320555b7fe2a7caf"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:11c2c544876cdbaffefe0f7f1283b74838c209654b4934a78e23ed11f750490f","pinned_image":"ghcr.io/github/gh-aw-node@sha256:11c2c544876cdbaffefe0f7f1283b74838c209654b4934a78e23ed11f750490f"}],"mcp_servers":[{"name":"awf-enclave","tools":["*"]},{"name":"safeoutputs","tools":["missing_data","missing_tool","noop","report_incomplete","report_smoke_result"]}],"threat_detection":{"mode":"disabled"}} -# This file was automatically generated by gh-aw. DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"8a2eda959eae849d68389e16174e7aaf5c4094933f7c772ec4bb3afbdf9a69e9","body_hash":"2fc888dd19d45a46b5206c892bec83805c4b2fb528e47a0323e33e4f6bbff73c","compiler_version":"v0.92.0","agent_id":"copilot","engine_versions":{"copilot":"1.0.96"},"agent_image_runner":"ubuntu-24.04"} +# gh-aw-manifest: {"version":1,"secrets":["GH_AW_DEFAULT_OTLP_ENDPOINT","GH_AW_DEFAULT_OTLP_HEADERS","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"9000827ccba6bdab643e8b6fd33ac0654aef8333","version":"v8.0.2"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/upload-artifact","sha":"cf430e030ddbb5b0abf93d22962f4752f3646cd9","version":"v7.0.2"},{"repo":"github/gh-aw/actions/setup","sha":"56a8d2b93f37634d540b6731ff84050f9dba27b3","version":"56a8d2b93f37634d540b6731ff84050f9dba27b3"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.59","digest":"sha256:63a1cba05e97ede7fc08cc8abb91167045c998d4415433e9c87377e9266ec291","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.59@sha256:63a1cba05e97ede7fc08cc8abb91167045c998d4415433e9c87377e9266ec291"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.59","digest":"sha256:f3d7842f34ff1778ac024a8918519b12436d6437b82d6d1d8cee1d01b2ac87e2","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.59@sha256:f3d7842f34ff1778ac024a8918519b12436d6437b82d6d1d8cee1d01b2ac87e2"},{"image":"ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.59","digest":"sha256:22305bd56b14dad6cffce9d57a8bb381bb517e141926b7c4c7365dfe5977d891","pinned_image":"ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.59@sha256:22305bd56b14dad6cffce9d57a8bb381bb517e141926b7c4c7365dfe5977d891"},{"image":"ghcr.io/github/gh-aw-firewall/enclave-script:0.28.59","digest":"sha256:5e141863e669e29a1db29e0ba1970438a294a608decd7996e647e4e609706aad","pinned_image":"ghcr.io/github/gh-aw-firewall/enclave-script:0.28.59@sha256:5e141863e669e29a1db29e0ba1970438a294a608decd7996e647e4e609706aad"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.59","digest":"sha256:e815a456d6050564666cb2a8bb04ff11a4babc2bfa746d611e895b87e59f9af0","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.59@sha256:e815a456d6050564666cb2a8bb04ff11a4babc2bfa746d611e895b87e59f9af0"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.31","digest":"sha256:dbec0f2ddef6adf83b7764019323096e3e5cc0f3886255f6320555b7fe2a7caf","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.31@sha256:dbec0f2ddef6adf83b7764019323096e3e5cc0f3886255f6320555b7fe2a7caf"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:11c2c544876cdbaffefe0f7f1283b74838c209654b4934a78e23ed11f750490f","pinned_image":"ghcr.io/github/gh-aw-node@sha256:11c2c544876cdbaffefe0f7f1283b74838c209654b4934a78e23ed11f750490f"}],"mcp_servers":[{"name":"awf-enclave","tools":["*"]},{"name":"safeoutputs","tools":["missing_data","missing_tool","noop","report_incomplete","report_smoke_result"]}],"threat_detection":{"mode":"disabled"}} +# This file was automatically generated by gh-aw (v0.92.0). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # # ___ _ _ # / _ \ | | (_) @@ -37,7 +37,7 @@ # - actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 # - actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 # - actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 -# - github/gh-aw/actions/setup@0abe2d9b233658150bc05ea968f1736b94093cf7 # 0abe2d9b233658150bc05ea968f1736b94093cf7 +# - github/gh-aw/actions/setup@56a8d2b93f37634d540b6731ff84050f9dba27b3 # # Container images used: # - ghcr.io/github/gh-aw-firewall/agent:0.28.59@sha256:63a1cba05e97ede7fc08cc8abb91167045c998d4415433e9c87377e9266ec291 @@ -107,7 +107,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw/actions/setup@0abe2d9b233658150bc05ea968f1736b94093cf7 # 0abe2d9b233658150bc05ea968f1736b94093cf7 + uses: github/gh-aw/actions/setup@56a8d2b93f37634d540b6731ff84050f9dba27b3 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} @@ -129,6 +129,7 @@ jobs: GH_AW_INFO_MODEL: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || vars.GH_AW_DEFAULT_MODEL_COPILOT || 'auto' }} GH_AW_INFO_VERSION: "1.0.96" GH_AW_INFO_AGENT_VERSION: "1.0.96" + GH_AW_INFO_CLI_VERSION: "v0.92.0" GH_AW_INFO_WORKFLOW_NAME: "Smoke Enclave Cloud Hypervisor (Experimental)" GH_AW_INFO_EXPERIMENTAL: "false" GH_AW_INFO_SUPPORTS_TOOLS_ALLOWLIST: "true" @@ -242,6 +243,20 @@ jobs: setupGlobals(core, github, context, exec, io, getOctokit); const { main } = require(path.join(actionsDir, 'check_workflow_timestamp_api.cjs')); await main(); + - name: Check compile-agentic version + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_COMPILED_VERSION: "v0.92.0" + GH_AW_BLOCKED_VERSION_REPORT_AS_ISSUE: "false" + GH_AW_WORKFLOW_NAME: "Smoke Enclave Cloud Hypervisor (Experimental)" + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'check_version_updates.cjs')); + await main(); - name: Log runtime features if: ${{ contains(toJSON(vars), '"GH_AW_RUNTIME_FEATURES":') }} run: bash "${RUNNER_TEMP}/gh-aw/actions/log_runtime_features_summary.sh" @@ -411,7 +426,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw/actions/setup@0abe2d9b233658150bc05ea968f1736b94093cf7 # 0abe2d9b233658150bc05ea968f1736b94093cf7 + uses: github/gh-aw/actions/setup@56a8d2b93f37634d540b6731ff84050f9dba27b3 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} @@ -889,7 +904,7 @@ jobs: GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} GH_AW_TIMEOUT_MINUTES: 20 - GH_AW_VERSION: dev + GH_AW_VERSION: v0.92.0 GH_TOKEN: ${{ github.token }} GITHUB_API_URL: ${{ github.api_url }} GITHUB_AW: true @@ -1178,7 +1193,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw/actions/setup@0abe2d9b233658150bc05ea968f1736b94093cf7 # 0abe2d9b233658150bc05ea968f1736b94093cf7 + uses: github/gh-aw/actions/setup@56a8d2b93f37634d540b6731ff84050f9dba27b3 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} @@ -1508,7 +1523,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw/actions/setup@0abe2d9b233658150bc05ea968f1736b94093cf7 # 0abe2d9b233658150bc05ea968f1736b94093cf7 + uses: github/gh-aw/actions/setup@56a8d2b93f37634d540b6731ff84050f9dba27b3 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} diff --git a/.github/workflows/smoke-enclave-cloud-hypervisor.md b/.github/workflows/smoke-enclave-cloud-hypervisor.md index 97084e2bd..a9b9336dc 100644 --- a/.github/workflows/smoke-enclave-cloud-hypervisor.md +++ b/.github/workflows/smoke-enclave-cloud-hypervisor.md @@ -151,15 +151,11 @@ diagnostics (#9955), bounded enclave MCP startup diagnostics (#9898), and the narrowly scoped official-main and tagged-workflow acceptance paths. The binary, Docker images, and release-attested primary and script enclave artifacts all select that release. This workflow is compiled -with the user-selected local `/Users/lpcox/projects/gh-aw/gh-aw` binary, reporting -`gh-aw/work-queue/5eb4c298ecba515924d30bd7989113dd79d7d421-14-g7dc6abab7a-dirty`, -and pins `github/gh-aw/actions/setup` to -`0abe2d9b233658150bc05ea968f1736b94093cf7`. The action ref selects runtime -scripts, not the local compiler build. That premerge commit contains the -scanner-generation fixes from github/gh-aw#69079; its two implementation blobs -match the squash merge, although it is not a descendant of that merge. -The binary reports build revision `7dc6abab7ad723cd98f18b5c521d896ed7ffcdc7` -and modified source; this metadata does not establish its exact build source. +with released gh-aw v0.92.0 and pins `github/gh-aw/actions/setup` to +`56a8d2b93f37634d540b6731ff84050f9dba27b3` using `--gh-aw-ref`. The action ref +selects runtime scripts, not the compiler binary. This is the upstream squash +merge for github/gh-aw#69079; the previous premerge pin was flagged as +`impostor-commit`. This update does not publish a release or authorize a live run. This is diagnostic enablement, not a verified fix for the original host-executor launch failure; that failure remains untested with this release. @@ -203,7 +199,7 @@ AWF v0.28.59 safely publishes early resolved configuration under `/run/awf-config-audit` and exports its path as `AWF_RESOLVED_CONFIG` through `GITHUB_ENV`. The normal audit compatibility JSON is published only after successful privileged cleanup. The selected setup action -(`github/gh-aw/actions/setup` at `0abe2d9b233658150bc05ea968f1736b94093cf7`) +(`github/gh-aw/actions/setup` at `56a8d2b93f37634d540b6731ff84050f9dba27b3`) redacts only the framework-managed AWF temp root and `${RUNNER_TEMP}/gh-aw`; the compiled artifact upload includes the old audit tree, not the new early path. Neither consumer uses `AWF_RESOLVED_CONFIG`, so evidence after failed cleanup @@ -215,13 +211,12 @@ resolved JSON into normal artifact paths, disable redaction, or relax ownership or guest-mount protections. The separate bounded raw public-fixture artifact above is unchanged and does not close this collection gap. -Compile-only dry-run validation now passes actionlint and shellcheck, including -the formerly invalid empty environment and removed daily-credit output -references. Its scanner gate still fails: zizmor flags the premerge setup ref -as `impostor-commit`, its SHA-only version comments, and activation secret -references without a dedicated environment. The ref is the head of merged -github/gh-aw#69079, but is not on a current branch or tag; commit existence and -matching fix blobs do not make the scanner gate pass. These findings are not +Compile-only dry-run validation remains failed. Actionlint reports six errors: +an empty `env` section after dry-run removes telemetry variables, plus five +undefined daily-credit activation outputs. Shellcheck passed; poutine passed +with unrelated repository-wide findings. Zizmor no longer reports the setup +pin as `impostor-commit` or flags SHA-only version comments, but still reports +activation secrets outside a dedicated environment. These findings are not suppressed, and this update does not change environment or approval policy. ## Enclave invocation diff --git a/scripts/ci/smoke-enclave-workflow.test.ts b/scripts/ci/smoke-enclave-workflow.test.ts index bfdfc685f..01db796bf 100644 --- a/scripts/ci/smoke-enclave-workflow.test.ts +++ b/scripts/ci/smoke-enclave-workflow.test.ts @@ -19,9 +19,9 @@ function countOccurrences(content: string, value: string): number { describe('experimental Cloud Hypervisor enclave smoke workflow', () => { const compilerVersion = - 'gh-aw/work-queue/5eb4c298ecba515924d30bd7989113dd79d7d421-14-g7dc6abab7a-dirty'; + 'v0.92.0'; const setupAction = - 'github/gh-aw/actions/setup@0abe2d9b233658150bc05ea968f1736b94093cf7'; + 'github/gh-aw/actions/setup@56a8d2b93f37634d540b6731ff84050f9dba27b3'; const source = fs.readFileSync( path.join(workflowsDir, 'smoke-enclave-cloud-hypervisor.md'), 'utf8' ); @@ -215,7 +215,7 @@ describe('experimental Cloud Hypervisor enclave smoke workflow', () => { expect('uses' in step && step.uses).toBe(setupAction); } expect(lock).not.toContain('"dry_run":true'); - expect(source).toContain('The action ref selects runtime\nscripts, not the local compiler build.'); + expect(source).toContain('selects runtime scripts, not the compiler binary.'); expect(execute?.run).toContain('GH_AW_COPILOT_SRC="$(command -v copilot 2>/dev/null || true)"'); expect(execute?.run).toContain('GH_AW_COPILOT_BIN="${RUNNER_TEMP}/gh-aw/bin/copilot"'); expect(execute?.run).toContain('cp "$GH_AW_COPILOT_SRC" "$GH_AW_COPILOT_BIN"'); @@ -320,9 +320,11 @@ describe('experimental Cloud Hypervisor enclave smoke workflow', () => { .map(([name]) => name)).toEqual([]); expect(compiled.jobs.safe_outputs.permissions?.issues).toBeUndefined(); expect(compiled.jobs.report_smoke_result.permissions?.issues).toBeUndefined(); - expect(compiled.jobs.activation.steps.some(step => - step.name === 'Check compile-agentic version')).toBe(false); - expect(lock).not.toContain("require(path.join(actionsDir, 'check_version_updates.cjs'))"); + const versionCheckStep = compiled.jobs.activation.steps.find(step => + step.name === 'Check compile-agentic version'); + if (versionCheckStep) { + expect(versionCheckStep.env?.GH_AW_BLOCKED_VERSION_REPORT_AS_ISSUE).toBe('false'); + } for (const configKey of [ 'GH_AW_SAFE_OUTPUTS_CONFIG', 'GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG', ]) { @@ -552,7 +554,7 @@ describe('experimental Cloud Hypervisor enclave smoke workflow', () => { ); expect(source).toContain('successful privileged cleanup'); expect(source).toContain('Do not copy raw\nresolved JSON into normal artifact paths'); - expect(source).toContain('with the user-selected local'); + expect(source).toContain('with released gh-aw v0.92.0'); expect(source).toContain(compilerVersion); expect(steps.some(step => step.uses === setupAction