Skip to content

fix(gvisor): skip iptables and route MCP gateway via NO_PROXY#6401

Merged
lpcox merged 2 commits into
mainfrom
gvisor-skip-iptables
Jul 19, 2026
Merged

fix(gvisor): skip iptables and route MCP gateway via NO_PROXY#6401
lpcox merged 2 commits into
mainfrom
gvisor-skip-iptables

Conversation

@lpcox

@lpcox lpcox commented Jul 19, 2026

Copy link
Copy Markdown
Collaborator

Problem

The Smoke gVisor Codex workflow (run 29665726755) failed at "Validate safe outputs were invoked" — the agent never wrote to outputs.jsonl.

Root cause: gVisor's userspace netstack is isolated from the host network namespace, so the host-netns iptables DNAT/RETURN rules that awf-iptables-init installs cannot govern the sandbox's traffic. In particular, the iptables NAT RETURN bypass that normally lets the agent reach the MCP gateway (172.30.0.1:8080) directly never fires under gVisor. As a result, MCP requests followed HTTP_PROXY into Squid and were rejected with 403 ERR_ACCESS_DENIED:

The requested URL could not be retrieved: http://172.30.0.1:8080/mcp/safeoutputs
The requested URL could not be retrieved: http://172.30.0.1:8080/mcp/github

With the safeoutputs MCP server unreachable, the agent had no way to emit safe outputs → empty outputs.jsonl → validation step failed. Direct connections (/dev/tcp/github.com/80) also failed with "No route to host" for the same reason.

Fix

Introduce a usesIptables runtime capability (false for gvisor/sbx) so runtimes whose network stack can't use host-netns iptables route egress purely through the proxy:

  • src/container-runtime.ts — new usesIptables capability + runtimeUsesIptables() helper.
  • src/services/optional-services.ts — skip the awf-iptables-init container for non-iptables runtimes and set AWF_SKIP_IPTABLES_INIT=1.
  • containers/agent/entrypoint.sh — honor AWF_SKIP_IPTABLES_INIT to skip the init-container ready-file handshake (otherwise the agent would time out and exit 1).
  • src/services/agent-environment/proxy-environment.ts — add the network gateway (172.30.0.1) + host.docker.internal to NO_PROXY for non-iptables runtimes, so proxy-aware MCP clients (rmcp) connect to the gateway directly instead of via Squid. This is the piece that fixes the 403.

Caveat

Under gVisor there is no iptables DNAT fallback, so proxy-unaware tools (e.g. raw /dev/tcp) get "No route to host". Egress requires proxy-aware clients. The security posture holds: the only route out is through Squid's allowlist. Documented in docs/gvisor-integration.md.

Testing

  • npm test — 246 suites / 3893 tests pass
  • npm run build clean, npm run lint 0 errors
  • Added unit tests: runtimeUsesIptables, presetSidecarIpEnvVars (gVisor sets AWF_SKIP_IPTABLES_INIT), and new proxy-environment.test.ts for gVisor NO_PROXY behavior
  • Recompiled the smoke-gvisor* workflows with gh-aw v0.82.13 (latest pre-release) + ran postprocess-smoke-workflows.ts; lock files were already current. The gVisor smoke workflows build awf from branch source, so CI exercises this fix.

gVisor's isolated userspace netstack is not governed by the host-netns
iptables DNAT/RETURN rules that awf-iptables-init installs, so egress
(including the MCP gateway bypass at 172.30.0.1) silently failed under
gVisor: MCP requests were routed through Squid and rejected with 403,
leaving the agent unable to emit safe outputs.

Add a usesIptables runtime capability (false for gvisor/sbx) that:
- skips the awf-iptables-init container
- sets AWF_SKIP_IPTABLES_INIT=1 so the entrypoint skips the init handshake
- adds the network gateway + host.docker.internal to NO_PROXY so
  proxy-aware MCP clients reach the gateway directly

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: be040aef-5830-42b1-a871-4cade09f4585
Copilot AI review requested due to automatic review settings July 19, 2026 17:12
@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Documentation Preview

Documentation build failed for this PR. View logs.

Built from commit 6ef10bc

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

✅ Coverage Check Passed

Overall Coverage

Metric Base PR Delta
Lines 98.43% 98.48% 📈 +0.05%
Statements 98.27% 98.32% 📈 +0.05%
Functions 99.16% 99.16% ➡️ +0.00%
Branches 94.22% 94.27% 📈 +0.05%
📁 Per-file Coverage Changes (2 files)
File Lines (Before → After) Statements (Before → After)
src/container-lifecycle.ts 99.1% → 100.0% (+0.87%) 99.2% → 100.0% (+0.83%)
src/log-directory-setup.ts 96.2% → 100.0% (+3.78%) 96.3% → 100.0% (+3.71%)

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

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.

Pull request overview

Adds runtime-aware network handling so gVisor agents can reach MCP gateways without ineffective iptables rules.

Changes:

  • Adds the usesIptables runtime capability.
  • Skips iptables initialization and configures gateway NO_PROXY routing.
  • Adds tests and updates gVisor documentation.
Show a summary per file
File Description
src/container-runtime.ts Defines iptables runtime capabilities.
src/container-runtime.test.ts Tests capability detection.
src/services/optional-services.ts Conditionally omits iptables initialization.
src/services/optional-services.test.ts Tests the skip marker.
src/services/agent-environment/proxy-environment.ts Adds direct gateway proxy bypasses.
src/services/agent-environment/proxy-environment.test.ts Tests NO_PROXY generation.
containers/agent/entrypoint.sh Skips the readiness handshake when requested.
docs/gvisor-integration.md Documents proxy-based gVisor networking.

Review details

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comments suppressed due to low confidence (1)

src/services/agent-environment/proxy-environment.ts:27

  • This grants every non-iptables runtime direct access to the network gateway even when host access is disabled and the gateway was not allowlisted. Because the same change removes the iptables OUTPUT/port filters, a proxy-aware agent can target any service/port exposed on the host gateway, bypassing both Squid and allowHostPorts; this also conflicts with strict mode's host-access prohibition. Route MCP through a port-restricted gateway mechanism, or require explicit host/gateway authorization and enforce the allowed ports rather than adding a blanket NO_PROXY host.
  const gatewayNeedsNoProxy = config.enableHostAccess || !runtimeUsesIptables(config.containerRuntime);
  if (gatewayNeedsNoProxy) {
    const subnetBase = networkConfig.subnet.split('/')[0];
    const parts = subnetBase.split('.');
    const networkGatewayIp = `${parts[0]}.${parts[1]}.${parts[2]}.1`;
    noProxyHosts.push('host.docker.internal', networkGatewayIp);
  • Files reviewed: 8/8 changed files
  • Comments generated: 4
  • Review effort level: Medium

Comment on lines +261 to +264
// Skip the iptables-init container when egress isn't governed by host-netns
// iptables — either topology-based network isolation, or a runtime whose
// network stack can't use those rules (e.g. gVisor's isolated netstack).
const skipIptables = networkIsolation || !runtimeUsesIptables(config.containerRuntime);

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Thanks — I dug into this and want to correct one premise, then explain the decision.

\u201cNo route to host\u201d does not depend on topology mode. In legacy mode (networkIsolation:false), cli-workflow.ts:86-107 takes the else branch and calls setupHostIptables, which installs the FW_WRAPPER chain and jumps to it from DOCKER-USER (host-iptables-chain.ts:64). DOCKER-USER is in the bridge FORWARD path, and FW_WRAPPER ends in a default-deny REJECT (host-iptables-rules.ts:279-288). That REJECT is what produced the observed No route to host for the gVisor agent on awf-net — it is enforced at the host, is runtime-independent, and does not require the internal topology network. So skipping the container iptables under gVisor does not open a direct outbound internet route: proxy-unaware traffic still hits the host FORWARD default-deny.

Proxy env vars were never the boundary. HTTP_PROXY/NO_PROXY are client-side routing hints the agent fully controls; they can\u2019t be a security control. Squid restricts what proxy-aware clients can reach, but the actual egress boundary is (a) the host DOCKER-USER default-deny in legacy mode and (b) the internal network topology in strict mode. The container-level iptables DNAT that gVisor skips was always defense-in-depth, not the primary enforcement layer. I\u2019ve reworded docs/gvisor-integration.md to say exactly this.

On the host-gateway NO_PROXY entry: the one real nuance is that container\u2192host-gateway (172.30.0.1) is INPUT to the host, not FORWARD, so it isn\u2019t covered by DOCKER-USER. That reachability is a pre-existing property of running with a host-based MCP gateway (it exists for runc host-access too) and is bounded by host INPUT rules, not introduced by this change \u2014 adding the gateway to NO_PROXY only changes routing for cooperating clients, not what\u2019s reachable.

Force-topology / reject: I agree the cleanest long-term posture is running gVisor in strict/topology mode (where the MCP gateway is attached as a topology peer). I deliberately did not force that here because the isolation mode is chosen upstream by gh-aw alongside where it places the MCP gateway; having awf silently override networkIsolation would desync from gh-aw\u2019s gateway placement and can break MCP reachability. The correct fix for the smoke workflows is to move them to sudo: false (strict) on the gh-aw side, which is tracked separately. Happy to add an explicit warning for the legacy + non-iptables-runtime combination if you\u2019d prefer a louder signal in the meantime.

Comment thread src/container-runtime.ts Outdated
Comment on lines +158 to +160
export function runtimeUsesIptables(runtime: string | undefined): boolean {
if (!runtime) return true;
return RUNTIME_REGISTRY[runtime]?.usesIptables ?? true;

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Fixed in e9a4a6e. runsc (the raw OCI runtime name) is now canonicalized to gVisor capabilities via a RUNTIME_ALIASES table, so resolveDockerRuntime, runtimeNeedsStaticDns, runtimeUsesIptables, and runtimeUsesComposeAgent all treat runsc == gvisor. Also added isGvisorRuntime() and routed the Claude/Bun JIT check through it. Tests cover both names.

Comment on lines 267 to +269
if (includeComposeAgent) {
assembleSysrootService(params, imageConfig.registry, imageConfig.parsedTag, sysrootActive);
assembleIptablesInitService(params, networkIsolation);
assembleIptablesInitService(params, skipIptables);

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Added in e9a4a6e. compose-generator.test.ts now has a "gVisor runtime" block asserting that a config with networkIsolation: false omits the iptables-init service, retains the agent service, and sets AWF_SKIP_IPTABLES_INIT=1 on the agent env — for both the gvisor and raw runsc names.

Comment thread docs/gvisor-integration.md Outdated
Comment on lines +220 to +225
Egress is enforced **solely** through the `HTTP_PROXY`/`HTTPS_PROXY` env vars
pointing at Squid. Because the iptables NAT bypass for the MCP gateway is gone,
`proxy-environment.ts` adds the network gateway IP (e.g. `172.30.0.1`) and
`host.docker.internal` to `NO_PROXY` for non-iptables runtimes, so proxy-aware
MCP clients (rmcp) connect to the gateway **directly** instead of being routed
through Squid and rejected with `403 ERR_ACCESS_DENIED`.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Reworded in e9a4a6e. The section no longer claims egress is enforced "solely" via proxy env vars. It now distinguishes Squid-routed internet egress from the deliberate direct MCP/host-gateway NO_PROXY exception, and states explicitly that NO_PROXY/HTTP_PROXY are client-side routing hints — not the security boundary — with the enforced boundary being topology (strict mode) or the host DOCKER-USER default-deny FORWARD chain (legacy mode).

- container-runtime: canonicalize raw runsc OCI name to gVisor capabilities
  via an alias table; add isGvisorRuntime() and use it for the Claude/Bun check.
- compose-generator.test: assert gVisor (networkIsolation:false) omits
  iptables-init, keeps the agent, and sets AWF_SKIP_IPTABLES_INIT (gvisor+runsc).
- docs/gvisor-integration: distinguish Squid-routed internet egress from the
  direct MCP/host-gateway NO_PROXY exception; clarify the enforced boundary is
  topology (strict) / host DOCKER-USER default-deny (legacy), not proxy env.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: be040aef-5830-42b1-a871-4cade09f4585
@github-actions

Copy link
Copy Markdown
Contributor

✅ Copilot review passed with no inline comments.

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

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

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

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

🔑 Smoke Copilot PAT PAT auth validated. All systems operational. ✅

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Smoke Gemini completed. All facets verified. 💎

Starting smoke test

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

🔌 Smoke Services — All services reachable! ✅

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Contribution Check completed successfully!

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Smoke Copilot BYOK completed. Copilot BYOK mode operational. 🔓

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

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

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Smoke Copilot BYOK AOAI (Entra) completed. Copilot AOAI BYOK (Entra) mode operational. 🔓

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Chroot tests passed! Smoke Chroot - All security and functionality tests succeeded.

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Smoke Copilot BYOK AOAI (api-key) completed. Copilot AOAI BYOK (api-key) mode operational. 🔓

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Smoke Claude passed

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

📡 Smoke OTel Tracing completed. All tracing scenarios validated. ✅

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Security Guard failed. Please review the logs for details.

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Build Test Suite completed successfully!

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

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

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

🛡️ Smoke Copilot Network Isolation confirmed the egress allowlist is enforced. ✅

@lpcox
lpcox enabled auto-merge (squash) July 19, 2026 17:39
@github-actions

Copy link
Copy Markdown
Contributor

Smoke Test: Claude Engine Validation

Check Result
API Status ✅ PASS
GH Check ✅ PASS
File Status ✅ PASS

Overall Result: PASS

Warning

Firewall blocked 1 domain

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

  • awmgmcpg

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

network:
  allowed:
    - defaults
    - "awmgmcpg"

See Network Configuration for more information.

Generated by Smoke Claude for #6401 · 55.3 AIC · ⊞ 3.3K ·
Add label ready-for-aw to run again

@github-actions

Copy link
Copy Markdown
Contributor

Smoke test: Copilot network isolation egress

@lpcox

EGRESS_RESULT allow=pass deny=pass

✅ Test 1 (allowed domain): api.github.com → HTTP 200
✅ Test 2 (blocked domain): example.com → blocked (403 from proxy)

Overall: PASS

Warning

Firewall blocked 2 domains

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

  • awmgmcpg
  • example.com

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

network:
  allowed:
    - defaults
    - "awmgmcpg"
    - "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: Copilot PAT Auth — FAIL ❌

Test Result
GitHub MCP connectivity ❌ (unverifiable)
GitHub.com HTTP ❌ (template vars unresolved)
File write/read ❌ (template vars unresolved)

Pre-step outputs were not substituted (${{ steps.smoke-data.outputs.* }} literal). Overall: FAIL

Auth mode: PAT (COPILOT_GITHUB_TOKEN)

Warning

Firewall blocked 1 domain

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

  • awmgmcpg

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

network:
  allowed:
    - defaults
    - "awmgmcpg"

See Network Configuration for more information.

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

@github-actions

Copy link
Copy Markdown
Contributor

Smoke Test: Copilot BYOK (Direct) Mode

✅ GitHub MCP connectivity
✅ GitHub.com reachable (HTTP 200)
✅ File write/read functional
✅ BYOK inference path active

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

Overall Status: PASS

Warning

Firewall blocked 1 domain

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

  • awmgmcpg

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

network:
  allowed:
    - defaults
    - "awmgmcpg"

See Network Configuration for more information.

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

@github-actions github-actions Bot added smoke-copilot-byok smoke-copilot-network-isolation Copilot network-isolation egress smoke test labels Jul 19, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Smoke Test Results

Overall status: FAIL

Warning

Firewall blocked 1 domain

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

  • localhost

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

network:
  allowed:
    - defaults
    - "localhost"

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

Smoke Test Results

Test Result
GitHub MCP Connectivity
GitHub.com HTTP ⚠️ pre-step data unavailable
File Write/Read ⚠️ pre-step data unavailable

Overall: PASS — engine reachable; template vars not expanded in this run.

Author: @lpcox

Warning

Firewall blocked 1 domain

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

  • awmgmcpg

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

network:
  allowed:
    - defaults
    - "awmgmcpg"

See Network Configuration for more information.

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

@github-actions

Copy link
Copy Markdown
Contributor

Smoke Test: Services Connectivity

  • Redis PING: ❌ (DNS resolution failed for host.docker.internal)
  • PostgreSQL pg_isready: ❌ (no response)
  • PostgreSQL SELECT 1: ❌ (DNS resolution failed)

Overall: FAILhost.docker.internal is not resolvable in this sandbox environment.

Warning

Firewall blocked 1 domain

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

  • awmgmcpg

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

network:
  allowed:
    - defaults
    - "awmgmcpg"

See Network Configuration for more information.

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

@github-actions

Copy link
Copy Markdown
Contributor

Looks good overall. One CONTRIBUTING.md item to consider: the PR requirements ask for references to any related issues. If this change corresponds to an issue, please add the issue link in the description. Tests and docs updates are already covered.

Warning

Firewall blocked 1 domain

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

  • awmgmcpg

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

network:
  allowed:
    - defaults
    - "awmgmcpg"

See Network Configuration for more information.

Generated by Contribution Check for #6401 · 3.73 AIC · ⊞ 19.2K ·
Add label ready-for-aw to run again

@github-actions

Copy link
Copy Markdown
Contributor

Smoke test results: PR titles only\n- ✅ Refactor Copilot auth routing to use shared GitHub server host classification\n- ✅ chore: upgrade gh-aw to v0.82.13 (pre-release) and recompile workflows\n- ✅ [CLI Flag Review] 🔍 CLI Flag Consistency Report — 2026-07-19\n- ✅ GitHub title check\n- ✅ File write verification\n- ✅ Build verification\n- Overall status: PASS

Warning

Firewall blocked 2 domains

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

  • awmgmcpg
  • registry.npmjs.org

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

network:
  allowed:
    - defaults
    - "awmgmcpg"
    - "registry.npmjs.org"

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 Results

Runtime Host Version Chroot Version Match?
Python Python 3.12.13 Python 3.12.3 ❌ NO
Node.js v24.18.0 v22.23.1 ❌ NO
Go go1.22.12 go1.22.12 ✅ YES

Overall: FAILED — Python and Node.js versions differ between host and chroot.

Warning

Firewall blocked 1 domain

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

  • awmgmcpg

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

network:
  allowed:
    - defaults
    - "awmgmcpg"

See Network Configuration for more information.

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

@github-actions

Copy link
Copy Markdown
Contributor

@lpcox

GitHub MCP: ✅
GitHub.com connectivity: ✅
File write/read: ✅
BYOK inference: ✅

Running in direct BYOK mode (AWF_AUTH_TYPE=github-oidc + AWF_AUTH_AZURE_* + COPILOT_PROVIDER_BASE_URL) via api-proxy → Azure OpenAI (Foundry, o4-mini-aw) authenticated via Microsoft Entra

Overall: PASS

Warning

Firewall blocked 1 domain

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

  • awmgmcpg

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

network:
  allowed:
    - defaults
    - "awmgmcpg"

See Network Configuration for more information.

🪪 BYOK (AOAI Entra) report filed by Smoke Copilot BYOK AOAI (Entra)
Add label ready-for-aw to run again

@github-actions

Copy link
Copy Markdown
Contributor

Smoke Test (Direct BYOK Azure OpenAI):

  • PR titles: validated pre-fetched data ✅
  • GitHub.com HTTP: 200 ✅
  • File I/O (write/read): gh-aw-test ✅
  • BYOK Inference: working ✅
    Running in direct BYOK mode (COPILOT_PROVIDER_API_KEY + COPILOT_PROVIDER_BASE_URL) via api-proxy → Azure OpenAI (Foundry, o4-mini-aw)
    PASS
    @lpcox

Warning

Firewall blocked 1 domain

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

  • awmgmcpg

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

network:
  allowed:
    - defaults
    - "awmgmcpg"

See Network Configuration for more information.

🔑 BYOK (AOAI api-key) report filed by Smoke Copilot BYOK AOAI (api-key)
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 ✅ PASS
.NET json-parse N/A ✅ PASS
Go color 1/1 passed ✅ PASS
Go env 1/1 passed ✅ PASS
Go uuid 1/1 passed ✅ 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 local repository was owned by root; tests were run with -Dmaven.repo.local override to work around the permission issue.

Warning

Firewall blocked 1 domain

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

  • awmgmcpg

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

network:
  allowed:
    - defaults
    - "awmgmcpg"

See Network Configuration for more information.

Generated by Build Test Suite for #6401 · 40.1 AIC · ⊞ 7.1K ·
Add label ready-for-aw to run again

@github-actions

Copy link
Copy Markdown
Contributor

OTEL Smoke Test Results

Scenario Result
Scenario 1: Module Loading otel.js loads successfully. Exports: startRequestSpan, setTokenAttributes, setBudgetAttributes, endSpan, endSpanError, shutdown, isEnabled, plus internal helpers.
Scenario 2: Test Suite ✅ 39 tests passed, 0 failed (otel.test.js + exporters).
Scenario 3: Env Var Forwarding src/services/api-proxy-env-config.ts forwards GH_AW_OTLP_ENDPOINTS, OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_HEADERS, GITHUB_AW_OTEL_TRACE_ID, GITHUB_AW_OTEL_PARENT_SPAN_ID, and OTEL_SERVICE_NAME to the api-proxy container.
Scenario 4: Token Tracker Integration onUsage callback exists in token-tracker-http.js and is invoked after normalized usage extraction — confirmed OTEL hook point.
Scenario 5: OTEL Diagnostics FileSpanExporter writes spans to /var/log/api-proxy/otel.jsonl as fallback when no OTLP endpoint is configured. Export path validated by unit tests.

Overall: ✅ All scenarios pass.

Warning

Firewall blocked 1 domain

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

  • awmgmcpg

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

network:
  allowed:
    - defaults
    - "awmgmcpg"

See Network Configuration for more information.

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

@github-actions

Copy link
Copy Markdown
Contributor

🔥 Smoke Test Results — Docker Sbx

Test Result
GitHub MCP connectivity
GitHub.com HTTP ✅ 200
File write/read

Overall: PASS

/cc @lpcox

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

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.

2 participants