Skip to content

Reach Cloud Hypervisor parity for the NVX microVM backend - #8983

Merged
lpcox merged 7 commits into
mainfrom
copilot/reach-feature-parity-nvx-cloud-hypervisor
Sep 25, 2026
Merged

lpcox merged 7 commits into
mainfrom
copilot/reach-feature-parity-nvx-cloud-hypervisor

Conversation

Copilot AI commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

NVX landed as an opt-in preview backend with several deliberate boundaries relative to Cloud Hypervisor: no live host workspace export (files had to be pre-baked into an --nvx-layer), no per-run env passthrough, and blanket rejection of --container-workdir / --network-subnet. This closes those gaps and resolves the open design question about fallback behaviour.

Everything here works within the existing attested NVX guest contract — the initramfs and OpenVMM fork are signed upstream artifacts pinned by src/nvx/preflight.ts, and the guest interface is kernel-cmdline-only. No new guest token, block device, or virtio-fs share was needed.

How the workspace export works

The guest assembles its rootfs as overlayfs(lowerdir=custom:runtime:distro, upperdir=<scratch>/upper). AWF owns the custom layer, so staging the host workspace there makes it read-write in-guest via overlay copy-up, with all writes landing in the scratch ext4 image. After the microVM exits, those writes are pulled back out with debugfs — no guest cooperation required.

stage()            host $GITHUB_WORKSPACE ──► <staging>/custom-layer/workspace ──► mkfs.erofs
guest              overlay upper layer absorbs every write to /workspace
extractAfterStop() e2fsck -f -y scratch.img
                   debugfs -R "rdump /upper <dir>" scratch.img
                   mergeTree()  ──► host workspace (whiteouts = deletions)

Changes

  • Live workspace export — src/nvx/workspace-layer.ts (staging, ownership policy, copy-back, host-conflict detection) and src/nvx/workspace-export.ts (guest layout constants, export resolution). Mount policies workspace-only (default) and workspace-and-tool-cache via --nvx-mount-policy / nvx.mountPolicy. src/nvx/filesystem-builder.ts gained preserveOwnership so mkfs.erofs can omit --all-root — with it, every entry is root-owned and the non-root workload cannot copy-up.
  • Write-policy narrowing — src/nvx/filesystem-write-policy.ts plans filesystem.allowWrite. Read-only subtrees are staged uid/gid 0 with write bits cleared; the workload runs with an empty capability set (no CAP_FOWNER/CAP_DAC_OVERRIDE), so this is enforced by the kernel rather than by convention. Copy-back additionally filters non-writable guest paths.
  • Per-run env passthrough — guest-environment-builder.ts (mirrors the Cloud Hypervisor builder) plus guest-entrypoint.ts, which generates a root-owned 0555 script in the custom layer that exports the environment, cds to the working directory, and execs the command. This also fixes multi-word agent commands, which the whitespace-free nvx_arg= cmdline token could never carry — the previous entrypoint: /bin/sh, args: ['-lc', agentCommand] was already broken for anything beyond a single token.
  • --container-workdir — accepted when it resolves inside the guest workspace export (assertNvxContainerWorkDir); the blanket rejection is gone.
  • --network-subnet — still rejected, now with a recorded rationale: src/microvm/infrastructure.ts asserts the Docker network matches the compile-time NETWORK_SUBNET and is shared with Cloud Hypervisor, so this is not an NVX-local change.
  • Fallback decision — NVX keeps its fail-closed, never-fall-back posture as an intentional divergence, documented in a new "Fallback behaviour" section of docs/nvx-security-design.md. Rationale: NVX is explicitly opt-in preview, and silently downgrading to Docker would misrepresent the isolation boundary and let preview validation runs pass without ever booting a microVM.
  • Smoke coverage — .github/workflows/smoke-nvx-copilot.md runs the pinned Copilot CLI inside an NVX microVM and records four checks: microVM run, in-guest assertions (workspace readable, workdir honoured, env present, no credential variables leaked), workspace copy-back, and inference through the API proxy. Because gh-aw's sandbox.agent.runtime enum has no nvx entry, the microVM runs from pre-agent steps: and the gh-aw agent analyses the recorded evidence.
  • preflight.ts now requires debugfs and e2fsck.

Review notes

  • Nothing is runtime-verified — the dev sandbox has no KVM, OpenVMM, or NVX artifacts. The smoke workflow is the intended proving ground for the two assumptions worth scrutinising: that debugfs rdump faithfully reproduces overlay whiteout char devices, and that mkfs.erofs preserves uid/gid without --all-root.
  • Overlayfs opaque directory xattrs are not preserved by rdump; documented as a known limitation.
  • Copy-back refuses any entry the host modified during the run rather than silently overwriting.

Copilot AI changed the title [WIP] Resolve gaps for NVX to reach feature parity with Cloud Hypervisor Reach Cloud Hypervisor parity for the NVX microVM backend Sep 24, 2026
Copilot AI requested a review from lpcox September 24, 2026 23:47
@lpcox
lpcox marked this pull request as ready for review September 25, 2026 02:04
Copilot AI balanced review requested due to automatic review settings September 25, 2026 02:04

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Credential filtering, write-policy traversal, guest permissions, and copy-back ownership currently have blocking correctness and security defects.

Get a fresh assessment by requesting another Copilot review.

Review effort: Balanced
Findings: 4 High severity · 5 Medium severity · 1 Low severity

Open (10)
What changed in this PR

Adds NVX workspace staging/copy-back, filesystem write controls, environment passthrough, workdir support, and end-to-end smoke coverage.

Changes:

  • Adds workspace/tool-cache exports with post-run synchronization.
  • Adds guest environment scripts and write-policy enforcement.
  • Documents runtime constraints and introduces Copilot smoke coverage.
File Description
src/​types/​runtime-options.ts Defines NVX mount policies.
src/​nvx/​workspace-layer.ts Implements staging and copy-back.
src/​nvx/​workspace-layer.test.ts Tests workspace synchronization.
src/​nvx/​workspace-export.ts Resolves guest exports.
src/​nvx/​workspace-export.test.ts Tests export validation.
src/​nvx/​runtime-validation.ts Validates workdirs and policies.
src/​nvx/​runtime-validation.test.ts Tests compatibility checks.
src/​nvx/​runtime-backend.ts Integrates workspace lifecycle.
src/​nvx/​runtime-backend.test.ts Updates backend tests.
src/​nvx/​preflight.ts Requires copy-back tools.
src/​nvx/​manager.ts Coordinates staging and extraction.
src/​nvx/​index.ts Exports new NVX APIs.
src/​nvx/​guest-environment-builder.ts Builds guest environments.
src/​nvx/​guest-entrypoint.ts Generates guest run scripts.
src/​nvx/​guest-entrypoint.test.ts Tests script generation.
src/​nvx/​filesystem-write-policy.ts Plans writable guest paths.
src/​nvx/​filesystem-write-policy.test.ts Tests write-policy planning.
src/​nvx/​filesystem-builder.ts Preserves layer ownership.
src/​config-mapper.ts Maps mount-policy configuration.
src/​config-file.ts Types the new config field.
src/​commands/​build-config.ts Parses NVX mount policies.
src/​cli-options.ts Adds the CLI option.
src/​awf-config-schema.json Updates runtime schema copy.
docs/​nvx-security-design.md Documents security and fallback behavior.
docs/​awf-config.schema.json Updates canonical configuration schema.
docs/​awf-config-spec.md Documents configuration usage.
.github/​workflows/​smoke-nvx-copilot.md Adds NVX Copilot smoke coverage.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +133 to +138
const normalized = path.posix.normalize(containerWorkDir).replace(/\/+$/, '')
|| NVX_GUEST_WORKSPACE;
if (
normalized !== NVX_GUEST_WORKSPACE &&
!normalized.startsWith(`${NVX_GUEST_WORKSPACE}/`)
) {
Comment on lines +169 to +172
function isReservedGuestTarget(target: string): boolean {
const reserved = [path.dirname(NVX_GUEST_RUN_SCRIPT), NVX_GUEST_RUN_SCRIPT, NVX_GUEST_HOME];
return reserved.some((entry) => entry === target || isWithin(entry, target));
}
Comment thread src/nvx/workspace-layer.ts Outdated
Comment on lines +217 to +219
await copySafeTree(source, destination, source, (relative) => excluded.some(
(credential) => relative === credential || relative.startsWith(`${credential}/`),
));
Comment thread src/nvx/workspace-layer.ts Outdated
Comment on lines +459 to +463
async function describeHostEntry(absolutePath: string, stat: Stats): Promise<string> {
if (stat.isSymbolicLink()) return `symlink:${await fs.readlink(absolutePath)}`;
if (stat.isDirectory()) return `directory:${stat.mode & 0o7777}`;
if (stat.isFile()) return `file:${stat.mode & 0o7777}:${stat.size}:${stat.mtimeMs}`;
return 'other';
Comment thread src/nvx/workspace-layer.ts Outdated
Comment thread src/nvx/workspace-layer.ts Outdated
Comment on lines +296 to +299
if (!isNvxWritableGuestPath(this.config.writePlan, guestPath)) {
outcome.rejected.push(guestPath);
continue;
}
Comment on lines +306 to +310
if (stat.isDirectory()) {
await fs.mkdir(hostPath, { recursive: true, mode: stat.mode & 0o7777 });
await this.mergeTree(childUpperPath, exportEntry, outcome);
continue;
}
Comment on lines +319 to +321
await fs.rm(hostPath, { recursive: true, force: true });
await fs.copyFile(childUpperPath, hostPath);
await fs.chmod(hostPath, stat.mode & 0o7777);
Comment thread src/nvx/workspace-layer.ts Outdated
Comment on lines +394 to +400
if (stat.isSymbolicLink()) {
await options.lchown(absolute, writable ? options.uid : 0, writable ? options.gid : 0);
return;
}
await options.chown(absolute, writable ? options.uid : 0, writable ? options.gid : 0);
const mode = stat.mode & 0o7777;
await fs.chmod(absolute, writable ? mode | 0o600 : mode & ~0o222);
Comment thread src/nvx/workspace-layer.test.ts Outdated
Comment on lines +134 to +136
// Overlay records a deletion as a 0/0 character device in the upper layer;
// a plain file stands in for it here since mknod requires privileges.
await fs.writeFile(path.join(guestWorkspace, 'README.md'), '');
@lpcox

lpcox commented Sep 25, 2026

Copy link
Copy Markdown
Collaborator

@copilot address review feedback

Copilot AI commented Sep 25, 2026

Copy link
Copy Markdown
Contributor Author

@copilot address review feedback

Addressed the NVX review feedback in commits f095245 and 9bbc078, with focused regression coverage and validation.

@github-actions

Copy link
Copy Markdown
Contributor

✅ Copilot review passed with no inline comments.

@copilot Add the ready-for-aw label to this PR to trigger agentic CI smoke tests.

@github-actions

Copy link
Copy Markdown
Contributor

Documentation Preview

Documentation has been built for this PR.

Download preview artifact

To view locally:

  1. Download the docs-preview-pr-8983 artifact from the workflow run
  2. Unzip and open index.html in your browser

Built from commit ea8f8cd

@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Coverage Regression Detected

This PR decreases test coverage. Please add tests to maintain coverage levels.

Overall Coverage

Metric Base PR Delta
Lines 92.82% 92.74% 📉 -0.08%
Statements 91.36% 91.26% 📉 -0.10%
Functions 89.78% 89.25% 📉 -0.53%
Branches 84.64% 84.43% 📉 -0.21%
📁 Per-file Coverage Changes (8 files)
File Lines (Before → After) Statements (Before → After)
src/commands/validators/infrastructure-validator.ts 100.0% → 90.3% (-9.73%) 100.0% → 90.4% (-9.59%)
src/nvx/runtime-backend.ts 88.2% → 81.6% (-6.52%) 87.3% → 81.4% (-5.97%)
src/commands/build-config.ts 84.4% → 79.4% (-4.96%) 85.1% → 80.3% (-4.79%)
src/nvx/manager.ts 82.9% → 79.7% (-3.21%) 82.8% → 79.3% (-3.53%)
src/nvx/runtime-validation.ts 100.0% → 98.7% (-1.27%) 100.0% → 98.8% (-1.22%)
src/nvx/filesystem-builder.ts 89.1% → 88.2% (-0.95%) 88.3% → 87.1% (-1.19%)
src/nvx/one-shot-adapter.ts 83.5% → 82.9% (-0.60%) 80.3% → 79.8% (-0.56%)
src/log-directory-setup.ts 96.2% → 100.0% (+3.78%) 96.3% → 100.0% (+3.71%)
✨ New Files (5 files)
  • src/nvx/filesystem-write-policy.ts: 97.7% lines
  • src/nvx/guest-entrypoint.ts: 100.0% lines
  • src/nvx/guest-environment-builder.ts: 90.0% lines
  • src/nvx/workspace-export.ts: 98.5% lines
  • src/nvx/workspace-layer.ts: 92.5% lines

Coverage comparison generated by scripts/ci/compare-coverage.ts

@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

✅ Smoke Gemini completed. All facets verified. 💎

Warning

Firewall blocked 2 domains

The following domains were blocked by the firewall during workflow execution:

  • github.com
  • play.googleapis.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "github.com"
    - "play.googleapis.com"

See Network Configuration for more information.

💎 Faceted by Smoke Gemini

@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

✨ The prophecy is fulfilled... Smoke Codex has completed its mystical journey. The stars align. 🌟

Warning

Firewall blocked 12 domains

The following domains were blocked by the firewall during workflow execution:

  • ab.chatgpt.com
  • accounts.google.com
  • api.github.com
  • clients2.google.com
  • collector.github.com
  • contentautofill.googleapis.com
  • github.com
  • github.githubassets.com
  • msfeed25.pkgs.visualstudio.com
  • update.googleapis.com
  • www.google.com
  • www.gstatic.com

[!TIP]
api.github.com is blocked because GitHub API access uses the built-in GitHub tools by default. Instead of adding api.github.com to network.allowed, use tools.github.mode: gh-proxy for direct pre-authenticated GitHub CLI access without requiring network access to api.github.com:

tools:
  github:
    mode: gh-proxy

See GitHub Tools for more information on gh-proxy mode.

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "ab.chatgpt.com"
    - "accounts.google.com"
    - "api.github.com"
    - "clients2.google.com"
    - "collector.github.com"
    - "contentautofill.googleapis.com"
    - "github.com"
    - "github.githubassets.com"
    - "msfeed25.pkgs.visualstudio.com"
    - "update.googleapis.com"
    - "www.google.com"
    - "www.gstatic.com"

See Network Configuration for more information.

🔮 The oracle has spoken through Smoke Codex

@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

🔌 Smoke Services — All services reachable! ✅

🔌 Service connectivity validated by Smoke Services

@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

📰 VERDICT: Smoke Copilot has concluded. All systems operational. This is a developing story. 🎤

📰 BREAKING: Report filed by Smoke Copilot

@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

✅ Smoke Claude passed

Warning

Firewall blocked 1 domain

The following domain was blocked by the firewall during workflow execution:

  • api.anthropic.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "api.anthropic.com"

See Network Configuration for more information.

Generated by Smoke Claude for #8983

@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

✅ Smoke Copilot BYOK completed. Copilot BYOK mode operational. 🔓

🔑 BYOK report filed by Smoke Copilot BYOK

@lpcox
lpcox enabled auto-merge (squash) September 25, 2026 04:37
@github-actions

Copy link
Copy Markdown
Contributor

🚀 Security Guard has started processing this pull request

@github-actions

Copy link
Copy Markdown
Contributor

Smoke Test: Copilot Engine

Overall: PASS

cc @lpcox

📰 BREAKING: Report filed by Smoke Copilot
Add label ready-for-aw to run again

@github-actions

Copy link
Copy Markdown
Contributor

Smoke Test: Cloud Hypervisor + Copilot

  1. list_pull_requests (github/gh-aw-firewall): PASS
  2. curl https://github.com -> 200: PASS
  3. write/read /tmp/gh-aw/agent/smoke file: PASS
  4. curl (example.com/redacted) -> 000 (blocked): PASS

Result: PASS (4/4)

Warning

Firewall blocked 2 domains

The following domains were blocked by the firewall during workflow execution:

  • example.com
  • github.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "example.com"
    - "github.com"

See Network Configuration for more information.

Cloud Hypervisor + Copilot smoke test by Smoke Cloud Hypervisor
Add label ready-for-aw to run again

@github-actions

Copy link
Copy Markdown
Contributor

Smoke Test: Claude Engine Validation

Check Status
API ✅ PASS
gh CLI ✅ PASS
File access ✅ PASS

Overall result: ✅ PASS

Warning

Firewall blocked 1 domain

The following domain was blocked by the firewall during workflow execution:

  • api.anthropic.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "api.anthropic.com"

See Network Configuration for more information.

Generated by Smoke Claude for #8983 · claude · haiku45 · 55.9 AIC · ⊞ 4.7K · ◷
Add label ready-for-aw to run again

@github-actions github-actions Bot added smoke-claude smoke-copilot-network-isolation Copilot network-isolation egress smoke test labels Sep 25, 2026
@github-actions

Copy link
Copy Markdown
Contributor

EGRESS_RESULT allow=pass deny=pass

✅ Allowed domain (github.com) reachable: allowed=200
✅ Blocked domain (example.com) denied: connection error, not reachable

Overall: PASS — network isolation egress enforcement working as expected. cc @lpcox

Warning

Firewall blocked 2 domains

The following domains were blocked by the firewall during workflow execution:

  • api.github.com
  • example.com

[!TIP]
api.github.com is blocked because GitHub API access uses the built-in GitHub tools by default. Instead of adding api.github.com to network.allowed, use tools.github.mode: gh-proxy for direct pre-authenticated GitHub CLI access without requiring network access to api.github.com:

tools:
  github:
    mode: gh-proxy

See GitHub Tools for more information on gh-proxy mode.

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "api.github.com"
    - "example.com"

See Network Configuration for more information.

🛡️ Egress verdict from Smoke Copilot Network Isolation
Add label ready-for-aw to run again

@github-actions

Copy link
Copy Markdown
Contributor

Smoke Test: Services Connectivity

  • Redis PING: ✅ (PONG)
  • pg_isready: ✅ (accepting connections)
  • PostgreSQL SELECT 1: ✅ (1)

Overall: PASS

🔌 Service connectivity validated by Smoke Services
Add label ready-for-aw to run again

@github-actions

Copy link
Copy Markdown
Contributor

Smoke Test: Copilot BYOK (Direct) Mode — PASS ✅

Test Result
1. GitHub MCP ✅ (2 merged PRs fetched)
2. GitHub.com Connectivity ✅ (HTTP 200)
3. File Write/Read ✅ (File accessible)
4. BYOK Inference ✅ (Agent responding)

Status: Running in direct BYOK mode (COPILOT_PROVIDER_API_KEY) via api-proxy → api.githubcopilot.com

/cc @lpcox

🔑 BYOK report filed by Smoke Copilot BYOK
Add label ready-for-aw to run again

@github-actions

Copy link
Copy Markdown
Contributor

Gemini Smoke Test Results

Overall Status: PASS

Warning

Firewall blocked 2 domains

The following domains were blocked by the firewall during workflow execution:

  • github.com
  • play.googleapis.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "github.com"
    - "play.googleapis.com"

See Network Configuration for more information.

💎 Faceted by Smoke Gemini
Add label ready-for-aw to run again

@github-actions

Copy link
Copy Markdown
Contributor

Extract dynamic enclave launch test fixture
Deduplicate Cloud Hypervisor network-plan test fixture
Merged PR review ✅
PR detail lookup ✅
Playwright GitHub title ✅
File write/read ✅
Discussion comment ✅
Build AWF ✅
Overall: PASS

Warning

Firewall blocked 12 domains

The following domains were blocked by the firewall during workflow execution:

  • ab.chatgpt.com
  • accounts.google.com
  • api.github.com
  • clients2.google.com
  • collector.github.com
  • contentautofill.googleapis.com
  • github.com
  • github.githubassets.com
  • msfeed25.pkgs.visualstudio.com
  • update.googleapis.com
  • www.google.com
  • www.gstatic.com

[!TIP]
api.github.com is blocked because GitHub API access uses the built-in GitHub tools by default. Instead of adding api.github.com to network.allowed, use tools.github.mode: gh-proxy for direct pre-authenticated GitHub CLI access without requiring network access to api.github.com:

tools:
  github:
    mode: gh-proxy

See GitHub Tools for more information on gh-proxy mode.

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "ab.chatgpt.com"
    - "accounts.google.com"
    - "api.github.com"
    - "clients2.google.com"
    - "collector.github.com"
    - "contentautofill.googleapis.com"
    - "github.com"
    - "github.githubassets.com"
    - "msfeed25.pkgs.visualstudio.com"
    - "update.googleapis.com"
    - "www.google.com"
    - "www.gstatic.com"

See Network Configuration for more information.

🔮 The oracle has spoken through Smoke Codex
Add label ready-for-aw to run again

@github-actions

Copy link
Copy Markdown
Contributor

Chroot Version Comparison

Runtime Host Version Chroot Version Match?
Python Python 3.12.14 Python 3.12.14 ✅ YES
Node.js v24.21.0 v22.23.2 ❌ NO
Go go1.22.12 go1.22.12 ✅ YES

Overall result: ❌ FAILED — Node.js version mismatch between host and chroot environment. The smoke-chroot label was not added.

Tested by Smoke Chroot
Add label ready-for-aw to run again

@github-actions

Copy link
Copy Markdown
Contributor

🏗️ Build Test Suite Results

Ecosystem Project Build/Install Tests Status
Bun elysia ✅ 1/1 passed ✅ PASS
Bun hono ✅ 1/1 passed ✅ PASS
C++ fmt ✅ N/A ✅ PASS
C++ json ✅ N/A ✅ PASS
Deno oak N/A 1/1 passed ✅ PASS
Deno std N/A 1/1 passed ✅ PASS
.NET hello-world ✅ N/A (run OK) ✅ PASS
.NET json-parse ✅ N/A (run OK) ✅ PASS
Go color ✅ ok ✅ PASS
Go env ✅ ok ✅ PASS
Go uuid ✅ ok ✅ PASS
Java gson ✅ 1/1 passed ✅ PASS
Java caffeine ✅ 1/1 passed ✅ PASS
Node.js clsx ✅ passed ✅ PASS
Node.js execa ✅ passed ✅ PASS
Node.js p-limit ✅ passed ✅ PASS
Rust fd ✅ 1/1 passed ✅ PASS
Rust zoxide ✅ 1/1 passed ✅ PASS

Overall: 8/8 ecosystems passed — PASS

Note: Java Maven builds initially failed with Could not create local repository at /home/runner/.m2/repository (permission denied — ~/.m2 owned by root, not writable by runner). Worked around locally with -Dmaven.repo.local=/tmp/gh-aw/agent/m2repo; the underlying sandbox permission issue is unrelated to the firewall itself but may be worth fixing in the runner image/setup so Maven projects work without an override.

All 18 projects across all 8 language ecosystems built/installed and passed their tests successfully through the AWF firewall proxy.

Warning

Firewall blocked 8 domains

The following domains were blocked by the firewall during workflow execution:

  • api.nuget.org
  • bun.sh
  • dc.services.visualstudio.com
  • deno.land
  • dl.deno.land
  • github.com
  • releaseassets.githubusercontent.com
  • repo.maven.apache.org

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "api.nuget.org"
    - "bun.sh"
    - "dc.services.visualstudio.com"
    - "deno.land"
    - "dl.deno.land"
    - "github.com"
    - "releaseassets.githubusercontent.com"
    - "repo.maven.apache.org"

See Network Configuration for more information.

Generated by Build Test Suite for #8983 · copilot · auto · 44.3 AIC · ⊞ 11.8K · ◷
Add label ready-for-aw to run again

@github-actions

Copy link
Copy Markdown
Contributor

OTEL Tracing Smoke Test Results

Scenario Result
1. Module Loading ✅ otel.js loaded; isEnabled: true; exports startRequestSpan, setTokenAttributes, setBudgetAttributes, endSpan, endSpanError, shutdown, isEnabled + internals
2. Test Suite ✅ 68/68 tests passed (3 suites: otel-fanout, otel-workload-identity, otel)
3. Env Var Forwarding ✅ GITHUB_AW_OTEL_TRACE_ID/GITHUB_AW_OTEL_PARENT_SPAN_ID present in env-passthrough.ts; GH_AW_OTLP_ENDPOINTS, OTEL_EXPORTER_OTLP_ENDPOINT, and trace context vars present in api-proxy-env-config.ts
4. Token Tracker Integration ✅ onUsage callback confirmed in token-tracker-http.js
5. OTEL Diagnostics ⚪ No otel.jsonl span file found — expected since this run had no OTLP endpoint configured; graceful degradation confirmed (token-usage.jsonl populated normally, no errors)

Overall: Success. All implemented scenarios pass; span export (Scenario 5) is not applicable without a configured OTLP endpoint in this environment, consistent with expected graceful degradation behavior.

Warning

Firewall blocked 1 domain

The following domain was blocked by the firewall during workflow execution:

  • o205451.ingest.us.sentry.io

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "o205451.ingest.us.sentry.io"

See Network Configuration for more information.

📡 OTel tracing validated by Smoke OTel Tracing
Add label ready-for-aw to run again

@lpcox
lpcox merged commit 631f5a8 into main Sep 25, 2026
163 of 167 checks passed
@lpcox
lpcox deleted the copilot/reach-feature-parity-nvx-cloud-hypervisor branch September 25, 2026 04:49

This branch was successfully deployed

1 active deployment
aoai-model — 9bbc0781 Deployed Sep 25, 2026 by lpcox via conclusion #1763
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Reach feature parity between NVX and Cloud Hypervisor microVM backends

3 participants