Skip to content

feat: support filesystem allowWrite with Cloud Hypervisor - #7669

Merged
lpcox merged 3 commits into
mainfrom
lpcox-ch-allowwrite-runtime-integration
Aug 23, 2026
Merged

feat: support filesystem allowWrite with Cloud Hypervisor#7669
lpcox merged 3 commits into
mainfrom
lpcox-ch-allowwrite-runtime-integration

Conversation

@lpcox

@lpcox lpcox commented Aug 23, 2026

Copy link
Copy Markdown
Collaborator

Wires filesystem.allowWrite into the Cloud Hypervisor microVM runtime. Both foundations are already on main and were deliberately left inert — the write-policy planner (#7660, 6aab9a1) and host mount-tree enforcement (#7661, 62de637). This is the runtime integration that joins them.

Branched from current main; not stacked. Does not touch github/gh-aw — compiler rollout is a later independent PR once firewall support is released.

Behavioral mapping

src/cloud-hypervisor/filesystem-write-enforcement.ts is the only place the planner and the mount tree meet. The translation is total; there is no fallback path.

Planner disposition Guest mount mode Host staged root Plan passed to virtiofsd
policy absent (undefined) unchanged unchanged nonestart() receives no enforcement argument at all, and the original export objects are returned by identity, so behaviour is byte-identical to a run without a policy
unrestricted / fully writable (hostRootMode: 'rw') rw unchanged none
fully read-only (hostRootMode: 'ro', no overlays) ro ro plan with zero overlays
selectively writable (hostRootMode: 'ro', overlays) rw ro plan with one overlay per allowed path

A zero-overlay read-only export still gets a plan rather than falling back to the legacy single mount --bind + remount,ro. The staged tree is the only variant that recursively remounts carried-in submounts read-only and verifies against /proc/self/mountinfo, so a policy-narrowed export always uses the stronger path.

No internalTags are passed to the planner. Cloud Hypervisor has no analogue of the Docker runtime's always-writable agent-log and session-state binds — every export it publishes is host-visible workspace or runner state. Marking one internal (tmp-gh-aw in particular) would defeat the narrowing that the motivating allowWrite: ["/tmp/gh-aw/agent"] exists to express. An empty allowlist therefore narrows every writable export, /tmp/gh-aw included.

Correctness / security

  • The host mount tree is the boundary. A selectively writable export is never mounted read-only guest-side — virtio-fs submounts inherit MNT_READONLY from the parent via d_automount/finish_automount(), so a guest-side ro would also block the writable nodes.
  • The guest mode is derived from the plan, so validateCloudHypervisorExports() accepts a read-only workspace export only when a mount plan for the workspace tag actually exists. A read-only workspace that nothing enforces is still rejected (allowReadOnlyWorkspace is opt-in and plan-gated).
  • Planning happens in a dedicated filesystem-write-policy startup stage before the boot loop, so an invalid allowlist aborts before virtiofsd or the guest is launched and before any retry can re-attempt it. Dependency injection and retry behaviour are otherwise untouched.
  • Planner validation is not duplicated; unknown plan tags stay fail-closed through assertPlansMatchExports(). No broad catch or fallback anywhere.
  • Destination canonicalization, propagation/slave rejection, recursive mountinfo verification, and cleanup semantics from feat: stage host mount trees for virtiofsd exports #7661 are all preserved — this PR passes data into that layer, it does not change it.
  • Only the Cloud Hypervisor rejection is removed from src/filesystem-policy.ts. sbx and Docker-in-Docker still fail closed.

One consequence worth flagging, documented in docs/cloud-hypervisor-foundation.md: the guest HOME is /workspace/.awf-home, inside the workspace export, so a policy that narrows /workspace makes the agent home read-only. That is the policy working as specified — add the home path to allowWrite if the workload needs it.

Files

New

  • src/cloud-hypervisor/filesystem-write-enforcement.ts — planner → mount-tree translation
  • src/cloud-hypervisor/filesystem-write-enforcement.test.ts

Runtime

  • src/cloud-hypervisor-runtime-backend.tsfilesystem-write-policy stage, mountEnforcement threaded through createManager
  • src/cloud-hypervisor/manager.ts, manager-types.ts — carries enforcement to VirtiofsdManager.start()
  • src/cloud-hypervisor/exports.ts — plan-gated allowReadOnlyWorkspace validation option
  • src/cloud-hypervisor/vm-config-builder.ts — guest cmdline mode encoding under a plan
  • src/filesystem-policy.ts — Cloud Hypervisor rejection removed

Docs/spec

  • docs/cloud-hypervisor-foundation.md — de-inerted, new "Runtime integration" section with the mapping table
  • docs/awf-config-spec.md §4.1, src/awf-config-schema.json, docs/awf-config.schema.json (regenerated via npm run generate:schema)

Tests/CI

  • scripts/ci/cloud-hypervisor-live-smoke.sh, scripts/ci/cloud-hypervisor-ci-scripts.test.ts
  • .github/workflows/test-cloud-hypervisor.yml — added src/filesystem-policy.ts to paths:

Review fixes (0fbc6b3)

CRITICAL — filesystem.allowWrite leaked into compose generation. writeConfigs()generateDockerCompose()buildAgentVolumes() called Docker's applyFilesystemWritePolicy() unconditionally. Compose still builds an agent service object for microVM runtimes (so infra containers can wire depends_on edges) even though it is omitted from the emitted file, so a Cloud Hypervisor policy was evaluated against compose bind mounts the agent never uses. Guest paths like /workspace/allowed — and the motivating /tmp/gh-aw/agent — are not backed by any host bind mount, so they threw filesystem.allowWrite path is not an existing path within a writable host mount during writeConfigs(), long before the Cloud Hypervisor planner ran.

New resolveComposeFilesystemAllowWrite() returns the policy only when runtimeUsesComposeAgent() is true. Both consumers route through it: the applyFilesystemWritePolicy() call in volume-builder.ts and the dropUnbackedHostHomeOverlays() toggle in optional-services.ts. Docker/gVisor behaviour unchanged; sbx still fails closed. Every other filesystemAllowWrite reader was audited — the rest are the type declaration, config mapping, the compatibility gate, and the CH planner itself, all correct.

HIGH — the live smoke truncate probe killed the guest shell. The guest runs BusyBox ash, where a redirection failure on a POSIX special builtin is fatal. ! : > /workspace/input.txt exited the shell before the rename and delete probes ran, while host post-checks still passed vacuously — a write never attempted also never changes anything. Reproduced in busybox:latest: the old chain exits 1 and never prints the rename/delete markers, while printf '' continues correctly. Every write-denial probe is now a regular builtin or external command, subshell-wrapped so a fatal error stays contained, and followed by a sentinel; a new assert_sentinels helper requires all of them after each case.

Regression coverage added: top-level generateDockerCompose tests proving a Cloud Hypervisor config with /workspace/allowed neither throws nor rewrites any emitted compose volume, while Docker/gVisor still narrow mounts and still fail closed on an unbacked path (verified to fail without the fix); plus script-contract tests banning special-builtin write probes and requiring each sentinel to be both emitted and asserted.

Tests

Unit/focused coverage: undefined policy (identity-preserving, no mountEnforcement key, call.length === 6 with call[5] undefined), empty allowlist narrowing all rw exports including /tmp/gh-aw, the /tmp/gh-aw/agent motivating case, wholly-allowed export, selective directory and selective file overlays, invalid/missing/escaping/relative paths failing closed before createManager, hostRootMode/guestMountMode translation, deterministic plan tags and ordering, read-only workspace refused without enforcement, and the awf.virtiofs=workspace:…:ro cmdline. Compatibility tests updated: Cloud Hypervisor accepted (including []), sbx rejected, DinD rejected (including combined with cloud-hypervisor).

Teardown/no-residue is covered by the existing mount-tree/virtiofsd suites from #7661 plus assert_no_residue after every live case (netns, veth/TAP, cgroup, process, and /run/awf-cloud-hypervisor run-directory residue) — not duplicated here.

Live-KVM cases added to the existing preview harness (no new framework):

  • allow-write — selective policy; asserts the allowed directory/file writes and a nested create persist to the host, /workspace/allowed appears as its own virtio-fs submount, and sibling write, root-level create, mkdir, truncate of input.txt, rename, and delete outside the allowlist all fail; verified host-side afterward.
  • allow-write-none — empty allowlist; guest mount is ro, reads still work, writes fail.
  • allow-write-invalid — unmatched allowlist entry aborts with a filesystem.allowWrite error and no residue.

Validation

Check Result
tsc --noEmit + npm run type-check clean
npx jest (full suite) 319 suites / 5068 tests passed
npx eslint on changed files 0 errors
markdownlint-cli2 on changed docs 0 issues
bash -n + shellcheck --severity=error on the smoke script clean
npm run generate:schema idempotent, both schema copies in sync

CI-only: the three live-KVM cases require /dev/kvm on a GitHub-hosted Ubuntu x86_64 runner and cannot execute on this macOS host. Everything locally runnable was validated — script syntax, shellcheck, and the assertion-contract tests in cloud-hypervisor-ci-scripts.test.ts. The live job needs a workflow_dispatch run or the cloud-hypervisor-kvm label on this PR.

Wires the write-policy planner (#7660) into the host mount-tree
enforcement layer (#7661) so `filesystem.allowWrite` is actually
enforced by the Cloud Hypervisor microVM runtime. Both foundations
landed deliberately inert; this is the runtime integration.

`filesystem-write-enforcement.ts` is the only place the two meet. It
plans the policy in a dedicated startup stage before the boot loop, so
an invalid allowlist aborts before virtiofsd or the guest launches, and
translates each planner disposition into the merged mount-tree API:

- policy absent: no enforcement argument at all, byte-identical legacy
  behaviour and original export objects;
- unrestricted/fully writable: guest `rw`, no plan;
- fully read-only: guest `ro`, staged host root `ro`, zero-overlay plan;
- selectively writable: guest `rw`, staged host root `ro`, one overlay
  per allowed path.

A zero-overlay read-only export still gets a plan rather than falling
back to the legacy single bind plus remount, so a narrowed export always
uses the recursively-verified staged tree. No `internalTags` are passed:
Cloud Hypervisor has no analogue of Docker's always-writable log and
session-state binds, and exempting `tmp-gh-aw` would defeat the
narrowing a policy like `allowWrite: ["/tmp/gh-aw/agent"]` expresses.

Because the host tree is the boundary, a selective export is never
mounted read-only guest-side. `validateCloudHypervisorExports()` accepts
a read-only `workspace` only when a plan for that tag exists, so a
read-only workspace nothing enforces is still rejected. Unknown plan
tags stay fail-closed and planner validation is not duplicated.

Removes only the Cloud Hypervisor rejection from `filesystem-policy.ts`;
sbx and Docker-in-Docker still fail closed. Adds live-KVM smoke cases
proving an allowed directory and file write persists to the host while
sibling, parent, create, truncate, rename, and delete outside the
allowlist fail, plus empty-allowlist narrowing and a fail-closed abort.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings August 23, 2026 17:57
@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Documentation Preview

Documentation build failed for this PR. View logs.

Built from commit 81fdf33

@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

✅ Coverage Check Passed

Overall Coverage

Metric Base PR Delta
Lines 93.80% 93.85% 📈 +0.05%
Statements 92.68% 92.73% 📈 +0.05%
Functions 93.09% 93.12% 📈 +0.03%
Branches 86.04% 86.06% 📈 +0.02%
📁 Per-file Coverage Changes (7 files)
File Lines (Before → After) Statements (Before → After)
src/services/optional-services.ts 100.0% → 100.0% (+0.00%) 96.8% → 96.9% (+0.02%)
src/services/agent-volumes/filesystem-write-policy.ts 100.0% → 100.0% (+0.00%) 98.6% → 98.7% (+0.09%)
src/cloud-hypervisor-runtime-backend.ts 96.6% → 96.6% (+0.03%) 94.2% → 94.3% (+0.04%)
src/cloud-hypervisor/manager.ts 89.5% → 89.5% (+0.04%) 88.2% → 88.2% (+0.05%)
src/cloud-hypervisor/vm-config-builder.ts 89.5% → 90.0% (+0.53%) 89.5% → 90.0% (+0.53%)
src/cloud-hypervisor/exports.ts 87.9% → 89.7% (+1.83%) 84.3% → 86.1% (+1.83%)
src/log-directory-setup.ts 96.2% → 100.0% (+3.78%) 96.3% → 100.0% (+3.71%)
✨ New Files (1 files)
  • src/cloud-hypervisor/filesystem-write-enforcement.ts: 100.0% lines

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

Integrates filesystem.allowWrite with the Cloud Hypervisor runtime using host-side virtio-fs mount-tree enforcement.

Changes:

  • Translates write-policy plans into guest mount modes and host enforcement plans.
  • Threads enforcement through runtime startup, manager, and virtiofsd.
  • Adds unit/live-KVM coverage and updates configuration documentation.
Show a summary per file
File Description
src/filesystem-policy.ts Enables Cloud Hypervisor policy support.
src/filesystem-policy.test.ts Tests runtime compatibility.
src/cloud-hypervisor/vm-config-builder.ts Encodes policy-derived guest mount modes.
src/cloud-hypervisor/vm-config-builder.test.ts Tests read-only workspace encoding.
src/cloud-hypervisor/manager.ts Passes enforcement to virtiofsd.
src/cloud-hypervisor/manager.test.ts Tests manager enforcement handling.
src/cloud-hypervisor/manager-types.ts Adds enforcement to guest configuration.
src/cloud-hypervisor/filesystem-write-enforcement.ts Implements planner-to-mount translation.
src/cloud-hypervisor/filesystem-write-enforcement.test.ts Covers translation and failure behavior.
src/cloud-hypervisor/exports.ts Allows plan-gated read-only workspaces.
src/cloud-hypervisor/exports.test.ts Tests workspace validation.
src/cloud-hypervisor-runtime-backend.ts Plans policy before VM boot attempts.
src/cloud-hypervisor-runtime-backend.test.ts Tests runtime integration.
src/awf-config-schema.json Documents supported runtimes.
scripts/ci/cloud-hypervisor-live-smoke.sh Adds live enforcement cases.
scripts/ci/cloud-hypervisor-ci-scripts.test.ts Verifies smoke-test assertions.
docs/cloud-hypervisor-foundation.md Documents runtime architecture and behavior.
docs/awf-config.schema.json Updates published schema documentation.
docs/awf-config-spec.md Documents Cloud Hypervisor policy semantics.
.github/workflows/test-cloud-hypervisor.yml Expands workflow path triggers.

Review details

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

  • Files reviewed: 20/20 changed files
  • Comments generated: 1
  • Review effort level: Balanced

Comment thread docs/awf-config-spec.md Outdated
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@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 Aug 23, 2026

Copy link
Copy Markdown
Contributor

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

Warning

Firewall blocked 3 domains

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

  • msfeed2.pkgs.visualstudio.com
  • msfeed25.pkgs.visualstudio.com
  • registry.npmjs.org

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

network:
  allowed:
    - defaults
    - "msfeed2.pkgs.visualstudio.com"
    - "msfeed25.pkgs.visualstudio.com"
    - "registry.npmjs.org"

See Network Configuration for more information.

🔮 The oracle has spoken through Smoke Codex

@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

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

🪪 BYOK (AOAI Entra) report filed by Smoke Copilot BYOK AOAI (Entra)

@github-actions

github-actions Bot commented Aug 23, 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 Aug 23, 2026

Copy link
Copy Markdown
Contributor

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

Tested by Smoke Chroot

@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Smoke Claude passed

Generated by Smoke Claude for #7669

@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Smoke Copilot BYOK completed. Copilot BYOK mode operational. 🔓

🔑 BYOK report filed by Smoke Copilot BYOK

@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Build Test Suite completed successfully!

Generated by Build Test Suite for #7669

@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

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

📡 OTel tracing validated by Smoke OTel Tracing

@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

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

Warning

Firewall blocked 1 domain

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

  • example.com

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

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

See Network Configuration for more information.

🛡️ Egress verdict from Smoke Copilot Network Isolation

@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Contribution Check failed. Please review the logs for details.

Generated by Contribution Check for #7669

@lpcox
lpcox deployed to aoai-model August 23, 2026 18:14 — with GitHub Actions Active
@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

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

📰 BREAKING: Report filed by Smoke Docker Sbx

@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Smoke Gemini reports failed. Facets need polishing...

💎 Faceted by Smoke Gemini

@github-actions

Copy link
Copy Markdown
Contributor

🚀 Security Guard has started processing this pull request

@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

🔌 Smoke Services — All services reachable! ✅

🔌 Service connectivity validated by Smoke Services

@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

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

🔑 BYOK (AOAI api-key) report filed by Smoke Copilot BYOK AOAI (api-key)

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions github-actions Bot added smoke-copilot-network-isolation Copilot network-isolation egress smoke test smoke-copilot labels Aug 23, 2026
@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

🔌 Smoke Services — All services reachable! ✅

🔌 Service connectivity validated by Smoke Services

@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

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

📰 BREAKING: Report filed by Smoke Docker Sbx

@github-actions

Copy link
Copy Markdown
Contributor

🚀 Security Guard has started processing this pull request

@lpcox
lpcox deployed to aoai-model August 23, 2026 18:25 — with GitHub Actions Active
@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Smoke Gemini reports failed. Facets need polishing...

💎 Faceted by Smoke Gemini

@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Smoke Copilot BYOK completed. Copilot BYOK mode operational. 🔓

🔑 BYOK report filed by Smoke Copilot BYOK

@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Contribution Check was cancelled. Please review the logs for details.

Generated by Contribution Check for #7669

@lpcox lpcox added the cloud-hypervisor-kvm Trigger the Cloud Hypervisor live-KVM smoke/security suite label Aug 23, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Smoke Test: Claude Engine Validation

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

Overall result: PASS

Generated by Smoke Claude for #7669 · haiku45 · 55.7 AIC · ⊞ 4.5K ·
Add label ready-for-aw to run again

@github-actions

Copy link
Copy Markdown
Contributor

Smoke Test: Copilot Engine

  • ✅ GitHub MCP connectivity (PR list fetched)
  • ✅ github.com connectivity (HTTP 200)
  • ✅ File write/read test passed

PRs referenced: #7661, #7660

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

EGRESS_RESULT allow=pass deny=pass

✅ Allowed domain (github.com) reachable: allowed=200
✅ Non-allowed domain (example.com) blocked: denied=000 (CONNECT tunnel 403)

Overall status: PASS

@lpcox

Warning

Firewall blocked 1 domain

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

  • example.com

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

network:
  allowed:
    - defaults
    - "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

🚀 Security Guard has started processing this pull request

@github-actions

Copy link
Copy Markdown
Contributor

Smoke Test: Docker Sbx@lpcox

Overall: PASS

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

@github-actions

Copy link
Copy Markdown
Contributor

Smoke Test: Copilot BYOK (Direct) Mode

  • ✅ GitHub MCP: PR data retrieved (github/gh-aw-firewall merged PRs)
  • ✅ HTTP connectivity: 200 (github.com reachable)
  • ✅ File I/O: smoke test file created and readable
  • ✅ BYOK inference: Running in direct mode (COPILOT_PROVIDER_API_KEY) via api-proxy → api.githubcopilot.com

Status: PASS

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

@github-actions

Copy link
Copy Markdown
Contributor

Smoke Test: Services Connectivity

  • Redis PING: ❌ (DNS resolution failure)
  • PostgreSQL pg_isready: ❌ (no response)
  • PostgreSQL SELECT 1: ❌ (DNS resolution failure)

Overall: FAILhost.docker.internal could not be resolved from the sandbox.

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

@github-actions

Copy link
Copy Markdown
Contributor

@lpcox
GitHub MCP (2 merged PRs):

  • feat: support filesystem allowWrite with Cloud Hypervisor ✅
  • Add runner-doctor B26 artifact download failure mode ✅
    GitHub.com connectivity ✅
    File I/O ✅
    BYOK inference ✅
    Running in direct BYOK mode (COPILOT_PROVIDER_API_KEY + COPILOT_PROVIDER_BASE_URL) via api-proxy → Azure OpenAI (Foundry, o4-mini-aw)
    Overall: PASS

🔑 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

Smoke Test

  • "feat: stage host mount trees for virtiofsd exports"
  • "feat: add Cloud Hypervisor filesystem write planner"
  • GitHub merged PR review ✅
  • safeinputs-gh query ❌
  • Playwright / file / cat / build ✅
  • Discussion comment ❌
  • Overall: FAIL

Warning

Firewall blocked 3 domains

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

  • msfeed2.pkgs.visualstudio.com
  • msfeed25.pkgs.visualstudio.com
  • registry.npmjs.org

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

network:
  allowed:
    - defaults
    - "msfeed2.pkgs.visualstudio.com"
    - "msfeed25.pkgs.visualstudio.com"
    - "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

📡 OTel Tracing Smoke Test Results

  • Scenario 1 (Module Loading): ✅ otel.js loaded successfully. isEnabled(): true. Exports: startRequestSpan, setTokenAttributes, setBudgetAttributes, endSpan, endSpanError, shutdown, isEnabled (+ internal helpers).
  • Scenario 2 (Test Suite): ✅ 3 suites / 68 tests passed (otel.test.js, otel-fanout.test.js, otel-workload-identity.test.js).
  • Scenario 3 (Env Var Forwarding): ✅ env-passthrough.ts forwards GITHUB_AW_OTEL_TRACE_ID / GITHUB_AW_OTEL_PARENT_SPAN_ID to the agent; api-proxy-env-config.ts forwards GH_AW_OTLP_ENDPOINTS, OTEL_EXPORTER_OTLP_ENDPOINT, and the trace context to the api-proxy sidecar.
  • Scenario 4 (Token Tracker Integration): ✅ onUsage callback present in token-tracker-http.js as the OTEL hook point.
  • Scenario 5 (OTEL Diagnostics): ✅ Spans were exported this run (/tmp/gh-aw/otel.jsonl contains 1 resourceSpans record with gh-aw.agent.setup span, GenAI attributes present).

Overall: All 5 scenarios passed. No regressions detected in OTEL tracing integration.

📡 OTel tracing validated by Smoke OTel Tracing
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.19.0 v22.23.2 ❌ NO
Go go1.22.12 go1.22.12 ✅ YES

Node.js version differs between host and chroot environment; Python and Go match. Since not all versions matched, the smoke-chroot label was not added.

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

@lpcox
lpcox deployed to aoai-model August 23, 2026 18:29 — with GitHub Actions Active
@github-actions

Copy link
Copy Markdown
Contributor

@lpcox
feat: stage host mount trees for virtiofsd exports
feat: add Cloud Hypervisor filesystem write planner

  • GitHub MCP connectivity: ✅
  • GitHub.com connectivity: ✅
  • File write/read test: ✅
  • 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

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

@lpcox
lpcox deployed to aoai-model August 23, 2026 18:29 — with GitHub Actions Active
@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 (ran, printed "Hello, World!") ✅ 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

Notes:

  • All repositories cloned successfully; no CLONE_FAILED entries.
  • Java: Maven's default local repository (~/.m2/repository) was not writable in this environment (unrelated to the AWF proxy config), so -Dmaven.repo.local was pointed at a writable directory to complete compile/test. The ~/.m2/settings.xml proxy config (host squid-proxy:3128) worked correctly for fetching dependencies.
  • No test failures or build errors encountered in any ecosystem.

.NET dotnet-run entry was included as a build/run check since json-parse and hello-world are simple console apps without a dedicated test runner.

Generated by Build Test Suite for #7669 · auto · 45.7 AIC · ⊞ 12K ·
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