Skip to content

guix+agent-s: desktop image target + local/cloud test runner + Nix parity baseline - #315

Merged
mdheller merged 1 commit into
mainfrom
feat/guix-agent-s-image-testing
Aug 2, 2026
Merged

guix+agent-s: desktop image target + local/cloud test runner + Nix parity baseline#315
mdheller merged 1 commit into
mainfrom
feat/guix-agent-s-image-testing

Conversation

@mdheller

@mdheller mdheller commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

What

Enables the Agent-S test agent against the Guix build for local OR cloud image testing, and documents the Nix setup copiously as the migration parity target.

  • guix/system/desktop.scm — GNOME desktop image (nonguix kernel/firmware/microcode) → qcow2; the Agent-S GUI target (Guix equivalent of nix sourceos-image-qcow2-desktop).
  • tests/agent-s/run-guix.sh — builds the Guix image and feeds it to the existing Agent-S harness (which is image-source-agnostic). --mode local (KVM) or --mode cloud (rsync to a GCP GPU VM + run local there, so the UI-TARS grounder is on the GPU). --main-model local by default (AS_MAIN_URL) per the local-agent-default posture; external providers only on explicit request.
  • guix/NIX_BASELINE.md — copious inventory of the current Nix setup (7 packages · 5 image targets · 3 modules · the boot/contract/smoke matrix · 5 CI workflows · cache+signing · dev shells), each mapped to its Guix equivalent + acceptance. The checklist the migration must satisfy before cutover.

Adversarial review (done)

  • Fixed a missing (gnu packages ssh) import in desktop.scm (openssh-sans-x was unbound).
  • Replaced a fabricated scripts/gcp-build-linux.sh --run call (that script lives in bearbrowser, and I hadn't verified the flag) with a generic rsync + ssh-to-GPU-VM cloud path.
  • bash -n clean; Scheme forms balanced; import→symbol coverage checked.

Honest limits

Authored + reviewed, not build-validated here (no guix on macOS). First guix system image + Agent-S run on a Linux runner (GPU VM for Layer-2) is the real gate. Builds on the spike (#314).

…rity baseline

Enables the Agent-S test agent against the Guix build, for local OR cloud image
testing, and documents the Nix setup copiously as the parity target.

- guix/system/desktop.scm: GNOME desktop image (nonguix kernel/firmware/microcode)
  -> qcow2, the Agent-S GUI target (Guix equiv of nix sourceos-image-qcow2-desktop).
- tests/agent-s/run-guix.sh: builds the Guix image and runs the existing Agent-S
  harness (image-source-agnostic). --mode local (KVM here) | cloud (sync to a GCP
  GPU VM, run local there so the UI-TARS grounder is on the GPU). --main-model
  LOCAL by default (AS_MAIN_URL), external providers only on explicit request.
- guix/NIX_BASELINE.md: copious inventory of the current Nix setup (7 packages, 5
  image targets, 3 modules, the boot/contract/smoke test matrix, 5 CI workflows,
  cache+signing, dev shells) each mapped to its Guix equivalent + acceptance =
  the parity checklist the migration must satisfy before cutover.

Adversarial review: fixed missing (gnu packages ssh) import in desktop.scm;
replaced a fabricated scripts/gcp-build-linux.sh --run call (that script lives in
bearbrowser) with a generic rsync+ssh-to-GPU-VM cloud path. bash -n clean;
Scheme forms balanced. NOT build-validated here (no guix on macOS); Linux runner
is the gate.
Copilot AI review requested due to automatic review settings August 2, 2026 23:39
@mdheller
mdheller merged commit 7e3f7ee into main Aug 2, 2026
2 checks passed

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Adds initial Guix support for Agent-S Layer-2 GUI testing by introducing a Guix-built GNOME desktop qcow2 target, a runner script to build/run it locally or via a GCP GPU VM, and a “Nix parity baseline” document to track migration completeness.

Changes:

  • Introduces guix/system/desktop.scm to build an x86_64 GNOME desktop qcow2 image (nonguix kernel/firmware/microcode).
  • Adds tests/agent-s/run-guix.sh to build the Guix image and invoke the existing Agent-S harness in local or cloud mode.
  • Adds guix/NIX_BASELINE.md as a parity checklist mapping current Nix artifacts to intended Guix equivalents.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 5 comments.

File Description
tests/agent-s/run-guix.sh New runner wiring Guix image builds into the existing Agent-S harness (local/cloud), with main-model selection logic.
guix/system/desktop.scm New Guix OS definition for a GNOME desktop qcow2 image intended to be driven by Agent-S over VNC.
guix/NIX_BASELINE.md New documentation enumerating Nix→Guix parity targets and acceptance checklist for migration cutover.

Comment thread tests/agent-s/run-guix.sh
Comment on lines +28 to +34
while [ $# -gt 0 ]; do
case "$1" in
--mode) MODE="$2"; shift 2 ;;
--main-model) MAIN_MODEL="$2"; shift 2 ;;
*) echo "unknown arg: $1" >&2; exit 2 ;;
esac
done
Comment thread tests/agent-s/run-guix.sh
Comment on lines +74 to +77
rsync -a --delete --exclude '.git' "$REPO/" "$GCP_HOST:sourceos/"
# AS_GROUND_URL defaults to the VM's local grounder; forward the model choice.
exec ssh "$GCP_HOST" \
"cd sourceos && AS_GROUND_URL='${AS_GROUND_URL}' bash tests/agent-s/run-guix.sh --mode local --main-model '${MAIN_MODEL}'"
Comment thread guix/system/desktop.scm
Comment on lines +62 to +67
;; Full GNOME on top of the desktop stack (%desktop-services provides gdm +
;; NetworkManager); openssh for headless control from the harness.
(services (cons* (service gnome-desktop-service-type)
(service openssh-service-type
(openssh-configuration (openssh openssh-sans-x)))
%desktop-services)))
Comment thread guix/NIX_BASELINE.md
Comment on lines +6 to +7
to the same bar. Keep it updated as `flake.nix` evolves — it is the source of
truth for what Guix must match, the same way `board-spec.yaml` is for the boards.
Comment thread tests/agent-s/run-guix.sh
Comment on lines +36 to +45
# Local-first main model: default to a local endpoint; only reach for an external
# provider when explicitly requested (and only then require its key).
case "$MAIN_MODEL" in
local)
: "${AS_MAIN_URL:?set AS_MAIN_URL to a local main-model endpoint (e.g. http://localhost:8081/v1)}"
export AS_PROVIDER="local" AS_MAIN_URL
;;
anthropic) : "${ANTHROPIC_API_KEY:?set ANTHROPIC_API_KEY}"; export AS_PROVIDER="anthropic" ;;
openai) : "${OPENAI_API_KEY:?set OPENAI_API_KEY}"; export AS_PROVIDER="openai" ;;
*) echo "unknown --main-model: $MAIN_MODEL" >&2; exit 2 ;;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants