Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
d77eacd
test(sandbox): Seatbelt guarded-loopback spike fixtures (ticket 01)
Jul 29, 2026
ca49e25
test(sandbox): resolve jenv shims to real JVM in loopback-spike runner
Jul 29, 2026
bcb3915
feat(cli): add omac build — sandboxed Gradle build requests (ticket 03)
Jul 29, 2026
7707214
feat(build): fast focused-test loop with warm daemon, JDK resolution,…
Jul 30, 2026
d77067e
feat(build): share and approve non-standard build manifests (ticket 05)
Jul 30, 2026
008ffba
feat(build): resolve private Gradle deps via scoped credential lift (…
Jul 30, 2026
bf90613
feat(build): retire yarp3 checkstyle twins, honest executor provenanc…
Jul 30, 2026
930179f
feat(build): mediated Docker endpoint for cold yarp3 compile (ticket 08)
Jul 30, 2026
b4052da
ticket 09: startup scavenger + denial correlation
Jul 31, 2026
877e644
ticket 10: ship docs + security-boundary regression test
Jul 31, 2026
d889baf
fix(build): enumerate host JDKs unsandboxed for Gradle toolchain dete…
Jul 31, 2026
ca84b68
fix(build): credential-lift keychain prefix, prune allowlist, embedde…
Jul 31, 2026
5deb03f
fix(build): stable container-proxy port per worktree; Sysctls/LxcConf…
Jul 31, 2026
820901e
fix(build): post-build daemon recycle for warm-daemon correctness
Aug 3, 2026
fae260d
fix(build): credential-lift proxy stable port per worktree
Aug 3, 2026
c84657c
Close four must-fix test-gap tickets for jvm-build-executor
Aug 3, 2026
1716ed5
fix(build): persist scanned stable proxy ports
Aug 4, 2026
2246b19
refactor(build): apply JVM executor review cleanups
Aug 4, 2026
bbcceee
docs(build): align JVM executor v1 contract with shipped boundary
Aug 4, 2026
6d458e9
refactor(build): centralize stable proxy-port choice in stableport.Ch…
Aug 4, 2026
1bde06e
docs(build): drop stale warm-daemon reuse claims in queue timeout com…
Aug 4, 2026
67ea8cf
chore: ignore local .scratch/ working notes
Aug 4, 2026
64724ae
fix(build): make CI green — race-free proxy tests, Linux cred denial,…
Aug 4, 2026
59d82ec
test(build): restore Linux-ci green for cli build integration + credp…
Aug 4, 2026
a815d39
fix(build): CI green on Linux + macOS — EPERM scope-path, RandomFree …
Aug 4, 2026
21ba840
fix(build): stableport fallback never lands in stable window on Linux
Aug 4, 2026
5fd475f
fix(build): containerproxy cleanup races network attach on slow daemons
Aug 4, 2026
ffd6c8e
fix(build): distinguish keychain-backend-unavailable from missing cre…
Aug 5, 2026
363f522
refactor(build): extract internal/buildengine (behavior-preserving pr…
Aug 5, 2026
e9b4e0e
feat(build): host build broker — managed build path (ticket 05)
Aug 5, 2026
acc893a
refactor(build): apply ticket 05 review findings
Aug 5, 2026
4eb673a
feat(build): lock, control-state, and approval hardening (ticket 06)
Aug 5, 2026
9956122
feat(build): daemon ownership handshake and safe brokered stop (ticke…
Aug 6, 2026
2d69a2f
docs(build): correct stale lock/max-duration comments, document broke…
Aug 6, 2026
7cb6cd5
style(build): gofmt the jvm build executor packages
Aug 6, 2026
8996d41
fix(build): Linux-CI failures in daemon-ownership + keychain sentinel
Aug 6, 2026
0cef9a5
fix(build): race + pid-mismatch in daemon-ownership engine tests
Aug 6, 2026
70a2df3
fix(build): break-in-select + --stop recycle timeout in ownership tests
Aug 6, 2026
027bb5c
fix(build): three brokered-build/stop defects from the local-install run
Aug 6, 2026
6c5d285
fix(build): gofmt the ownership test + make the Bug-1 engine test det…
Aug 6, 2026
1866430
fix(build): pre-resolve JDK for ownership regardless of verifier
Aug 7, 2026
e9756c5
fix(build): pid type mismatch + stale sock in daemon ownership handshake
Aug 7, 2026
aa02d67
feat(e2e): add JVM-build brokered canary (TestE2EJvmBuild, issue #207)
nhuelstng Aug 4, 2026
bd43b06
fix(e2e): give the JVM build canary a filtered-network profile
Aug 18, 2026
2ef8106
fix(build,sandbox): grant the JDK conf dir to the executor sandbox
Aug 18, 2026
187f009
fix(e2e): add missing testcontainers-postgresql module and exclude *I…
Aug 18, 2026
8c05b52
fix(build): negotiate Docker Engine API version (Docker 29.x MinAPIVe…
Aug 18, 2026
958f016
fix(rebase): fix errors introduced during rebase
Aug 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 108 additions & 0 deletions .github/workflows/e2e-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
# E2E: build brokered canary.
#
# Runs TestE2EJvmBuild (internal/e2e/jvm_build_test.go, build tag e2e,
# model-free — no SKAINET_* secrets). The canary drives the full JVM
# build loop exactly as an agent does: sandboxed `omac start
# claude-code --inner /bin/sh` session, brokered `omac build` through
# the host build broker, restricted executor, and a REAL Gradle wrapper
# from the committed synthetic fixture.
#
# Two legs, deliberately separated (keeps the canary isolated from the
# model-flaky e2e.yml matrix):
#
# - unit leg (macos-latest): runs the default unit leg (gradle test
# — GreetingServiceTest, Mockito). No Colima. The Testcontainers
# IT class runs only under the IT leg.
# - IT leg (macos-15-intel): runs PostgresIT through the mediated
# container proxy (ADR 0002) against Colima. The ONLY GHA runner
# tier where a Linux VM can run (arm runners have nested
# virtualization disabled) — the container proxy's upstream is the
# Colima daemon. Starts Colima, exports DOCKER_HOST (the test also
# stages the socket at the SHORT test HOME/.colima/default/
# docker.sock for the parent's container proxy, which resolves
# upstream from os.UserHomeDir()).
#
# The canary must be a LOUD failure on regression (daemon-recycle
# revert, image-allowlist removal, container-proxy cleanup regression)
# — never a skip.
name: "E2E: build canary"

on:
pull_request:
workflow_dispatch:

permissions:
contents: read

jobs:
build:
name: "${{ matrix.leg }}"
strategy:
fail-fast: false
matrix:
include:
- leg: unit
runner: macos-latest
- leg: it
runner: macos-15-intel
runs-on: ${{ matrix.runner }}
env:
E2E_JVM_BUILD_IT: ${{ matrix.leg == 'it' && '1' || '' }}
concurrency:
group: e2e-build-${{ matrix.leg }}
cancel-in-progress: false
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version-file: go.mod
cache: true

- name: Install JDK
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '21'

- name: Install Colima + Docker CLI (IT leg)
if: matrix.leg == 'it'
run: |
brew install colima docker jq
colima start --memory 6 --cpu 2
# The container proxy derives its upstream from the PARENT's
# os.UserHomeDir() (the SHORT test HOME), not from DOCKER_HOST
# — so the test stages the socket itself. DOCKER_HOST is
# exported for the test's socket discovery (stageColimaSocket)
# and for a quick daemon-reachability check here.
echo "DOCKER_HOST=unix://$HOME/.colima/default/docker.sock" >> "$GITHUB_ENV"
# The executor env is hermetic (buildrun.envPassThrough), so the
# Testcontainers overrides the issue prescribed for the Colima
# VM cannot reach the executor — it gets DOCKER_HOST from the
# container proxy and TESTCONTAINERS_RYUK_DISABLED=true from
# the engine. Exported here only for host-command convenience.
echo "TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE=/var/run/docker.sock" >> "$GITHUB_ENV"
echo "TESTCONTAINERS_HOST_OVERRIDE=$(colima ls -j | jq -r .address)" >> "$GITHUB_ENV"
# Verify the daemon is reachable before the test runs, so a
# Colima provisioning failure is loud here, not inside the test.
docker info >/dev/null

- name: Run build canary (${{ matrix.leg }} leg)
run: |
set -o pipefail
# The test seeds a cold Gradle dist host-side once (via the
# fixture's real gradlew) — no Colima needed, but a real JDK
# is required on the path for the wrapper. macOS runners ship
# JDK via setup-java.
go test -tags=e2e -timeout=40m -v -run '^TestE2EJvmBuild$' ./internal/e2e/ 2>&1 | tee /tmp/build-canary.log

- name: Upload build canary log
if: always()
uses: actions/upload-artifact@v4
with:
name: build-canary-${{ matrix.leg }}
path: /tmp/build-canary.log
if-no-files-found: ignore
retention-days: 14
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,4 @@ __pycache__/
.vscode/
*~
.omo
.scratch/
Loading
Loading