Skip to content

Commit 9daa87d

Browse files
authored
Merge pull request #253 from preloopdev/improve/runner-watch-conformance
fix: improve runner fidelity and real-world conformance
2 parents b6a4145 + e002938 commit 9daa87d

127 files changed

Lines changed: 46426 additions & 368 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.gitignore‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,10 @@ skills-lock.json
142142
/plans/
143143
/logo.png
144144
/logo-square.png
145-
146-
.wrangler/
145+
.ori/
147146
.pi/
147+
.pi/extensions/entire/index.ts
148+
dist-packages
149+
# Supply-chain gate: parked until the cargo vet backlog is dealt with
150+
/.github/workflows/supply-chain.yml
151+
.wrangler/

‎Cargo.lock‎

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎benchmarks/real-world/conformance-10repos.sh‎

Lines changed: 351 additions & 0 deletions
Large diffs are not rendered by default.

‎benchmarks/real-world/conformance-new5repos.sh‎

Lines changed: 47 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
# flask, gin, json-c, nlohmann/json, node-fetch, bat, vite, uv,
55
# nextcloud, caddy, bento, agent-ci, openclaw, buzz, qm, runner,
66
# ripgrep, click, yq, axios, fd (lightweight wave 2026-08-29)
7-
# New picks (diverse, popular, ubuntu-latest dominated, lightweight):
8-
# - ajeetdsouza/zoxide (Rust, 1 ubuntu)
9-
# - junegunn/fzf (Go, 1 ubuntu-24.04)
10-
# - golangci/golangci-lint (Go, 2 ubuntu)
11-
# - jqlang/jq (C, 17 cross but ubuntu-latest)
12-
# - starship/starship (Rust, 5 ubuntu)
7+
# New picks (varied, medium-to-large, and not covered by prior campaigns):
8+
# - prometheus/prometheus (Go observability server)
9+
# - helm/helm (Go package manager)
10+
# - pypa/pip (Python packaging)
11+
# - rails/rails (Ruby web framework)
12+
# - webpack/webpack (Node/JavaScript bundler)
1313
set -Eeuo pipefail
1414
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
1515
WORKSPACE_ROOT="${CONFORMANCE_WORKSPACE_ROOT:-/tmp/preloop-conformance-new5repos/workspaces}"
@@ -20,6 +20,7 @@ POLL_SECONDS="${CONFORMANCE_POLL_SECONDS:-10}"
2020
TIMEOUT_SECONDS="${CONFORMANCE_TIMEOUT_SECONDS:-7200}"
2121
POOL_SIZE="${PRELOOP_RUNNER_POOL_SIZE:-1}"
2222
HOST_HOME="${HOME:-}"
23+
SMOLVM_HOME_DIR="${SMOLVM_HOME_DIR:-$HOST_HOME/.smolvm/1.15.0}"
2324
SMOLVM_PROCESS_HOME="${CONFORMANCE_SMOLVM_HOME:-$CAMPAIGN_HOME/smolvm-home}"
2425
if [[ -z "${PRELOOP_SYSTEM_TOKEN:-}" ]]; then
2526
export PRELOOP_SYSTEM_TOKEN="$(python3 -c 'import secrets; print(secrets.token_hex(32))')"
@@ -35,48 +36,45 @@ SERVER_PID=""
3536
FAILED_TARGETS=""
3637
if [ "$(uname -s)" = Darwin ]; then
3738
if [ -z "${DYLD_FALLBACK_LIBRARY_PATH:-}" ]; then
38-
export DYLD_FALLBACK_LIBRARY_PATH="$HOST_HOME/.smolvm/lib:/opt/homebrew/lib:/usr/lib"
39+
export DYLD_FALLBACK_LIBRARY_PATH="$SMOLVM_HOME_DIR/lib:/opt/homebrew/lib:/usr/lib"
3940
else
4041
case ":$DYLD_FALLBACK_LIBRARY_PATH:" in
41-
*":$HOST_HOME/.smolvm/lib:"*) ;;
42-
*) export DYLD_FALLBACK_LIBRARY_PATH="$HOST_HOME/.smolvm/lib:$DYLD_FALLBACK_LIBRARY_PATH" ;;
42+
*":$SMOLVM_HOME_DIR/lib:"*) ;;
43+
*) export DYLD_FALLBACK_LIBRARY_PATH="$SMOLVM_HOME_DIR/lib:$DYLD_FALLBACK_LIBRARY_PATH" ;;
4344
esac
4445
fi
4546
fi
4647
usage() {
4748
cat <<'EOF'
48-
Usage: conformance-new5repos.sh [all|requests|axios|typescript|react|nextjs] [--workflow NAME]
49+
Usage: conformance-new5repos.sh [all|prometheus|helm|pip|rails|webpack] [--workflow NAME]
4950
EOF
5051
}
5152
fail() { echo "conformance-new5repos: $*" >&2; exit 1; }
5253
target_cfg() {
5354
case "$1" in
54-
zoxide/ci)
55-
echo "zoxide https://github.com/ajeetdsouza/zoxide.git main .github/workflows/ci.yml push refs/heads/main" ;;
56-
fzf/ci)
57-
echo "fzf https://github.com/junegunn/fzf.git master .github/workflows/linux.yml push refs/heads/master" ;;
58-
golangci-lint/ci)
59-
echo "golangci-lint https://github.com/golangci/golangci-lint.git main .github/workflows/pr-tests.yml push refs/heads/main" ;;
60-
jq/ci)
61-
echo "jq https://github.com/jqlang/jq.git master .github/workflows/ci.yml push refs/heads/master" ;;
62-
starship/ci)
63-
echo "starship https://github.com/starship/starship.git main .github/workflows/workflow.yml push refs/heads/main" ;;
64-
cobra/ci)
65-
echo "cobra https://github.com/spf13/cobra.git main .github/workflows/test.yml push refs/heads/main" ;;
55+
prometheus/ci)
56+
echo "prometheus https://github.com/prometheus/prometheus.git main .github/workflows/ci.yml push refs/heads/main" ;;
57+
helm/build-test)
58+
echo "helm https://github.com/helm/helm.git main .github/workflows/build-test.yml push refs/heads/main" ;;
59+
pip/ci)
60+
echo "pip https://github.com/pypa/pip.git main .github/workflows/ci.yml push refs/heads/main" ;;
61+
rails/smoke)
62+
echo "rails https://github.com/rails/rails.git main .github/workflows/devcontainer-smoke-test.yml push refs/heads/main" ;;
63+
webpack/test)
64+
echo "webpack https://github.com/webpack/webpack.git main .github/workflows/test.yml push refs/heads/main" ;;
6665
*) return 1 ;;
6766
esac
6867
}
6968
all_targets() {
70-
echo "zoxide/ci fzf/ci golangci-lint/ci jq/ci starship/ci cobra/ci"
69+
echo "prometheus/ci helm/build-test pip/ci rails/smoke webpack/test"
7170
}
7271
repo_targets() {
7372
case "$1" in
74-
zoxide) echo "zoxide/ci" ;;
75-
fzf) echo "fzf/ci" ;;
76-
golangci-lint) echo "golangci-lint/ci" ;;
77-
jq) echo "jq/ci" ;;
78-
starship) echo "starship/ci" ;;
79-
cobra) echo "cobra/ci" ;;
73+
prometheus) echo "prometheus/ci" ;;
74+
helm) echo "helm/build-test" ;;
75+
pip) echo "pip/ci" ;;
76+
rails) echo "rails/smoke" ;;
77+
webpack) echo "webpack/test" ;;
8078
*) return 1 ;;
8179
esac
8280
}
@@ -93,17 +91,15 @@ prepare_golden_home() {
9391
sudo umount -f "$CAMPAIGN_HOME/externals" 2>/dev/null || true
9492
rm -rf "$CAMPAIGN_HOME" || true
9593
[ -f "$OFFICIAL_GOLDEN_ARTIFACT" ] || fail "missing 9GB official golden: $OFFICIAL_GOLDEN_ARTIFACT"
96-
local bytes expected fingerprint
94+
local bytes expected
9795
bytes="$(file_size "$OFFICIAL_GOLDEN_ARTIFACT")"
9896
[ "$bytes" -ge 8589934592 ] || fail "golden is ${bytes} bytes, not the required ~9GB"
99-
fingerprint="$(python3 - "$OFFICIAL_GOLDEN_BASE" <<'INNERPY'
100-
import hashlib, json, sys, platform
101-
rosetta = platform.system() == "Darwin" and platform.machine() in ("arm64", "aarch64")
102-
normalized = {"base": sys.argv[1], "toolchains": [], "curated": False, "bake": "", "rosetta_libs": rosetta}
103-
print(hashlib.sha256(json.dumps(normalized, separators=(",", ":")).encode()).hexdigest())
104-
INNERPY
105-
)"
106-
expected="$CAMPAIGN_HOME/vms/$OFFICIAL_GOLDEN_NAME-$fingerprint"
97+
# Ask the CLI for the same fingerprinted payload path the server computes.
98+
# Reimplementing EnvironmentSpec here drifted when runner-root and smolvm
99+
# inputs changed, silently causing a fresh multi-GiB image pull.
100+
expected="$(PRELOOP_HOME="$CAMPAIGN_HOME" \
101+
PRELOOP_RUNNER_BASE_IMAGE="$OFFICIAL_GOLDEN_BASE" \
102+
"$SERVER_BIN" golden-path)" || fail "could not compute golden payload path"
107103
mkdir -p "$(dirname "$expected")"
108104
ln -sfn "$OFFICIAL_GOLDEN_ARTIFACT" "$expected"
109105
[ -f "$expected" ] || fail "failed to expose official golden at $expected"
@@ -138,15 +134,20 @@ start_server() {
138134
local log="$OUTPUT_ROOT/server.log"
139135
mkdir -p "$OUTPUT_ROOT" "$CAMPAIGN_HOME" "$SMOLVM_PROCESS_HOME"
140136
rm -f "$log"
141-
if [ -z "${PRELOOP_GITHUB_TOKEN:-}" ] && command -v gh >/dev/null 2>&1; then
142-
PRELOOP_GITHUB_TOKEN="$(gh auth token 2>/dev/null || true)"
143-
export PRELOOP_GITHUB_TOKEN
144-
fi
137+
mkdir -p "$CAMPAIGN_HOME/bin"
138+
ln -sfn "$SMOLVM_HOME_DIR/smolvm" "$CAMPAIGN_HOME/bin/smolvm"
139+
export PATH="$CAMPAIGN_HOME/bin:$PATH"
140+
hash -r 2>/dev/null || true
141+
command -v smolvm
142+
smolvm --version
143+
# Do not mint PRELOOP_GITHUB_TOKEN from `gh auth token`. These campaigns
144+
# execute foreign public workflows; an operator PAT must be supplied
145+
# explicitly (short-lived, narrowly scoped) or omitted.
145146
PRELOOP_HOME="$CAMPAIGN_HOME" \
146147
HOME="$SMOLVM_PROCESS_HOME" \
147148
SMOLVM_DATA_DIR="${SMOLVM_DATA_DIR:-$CAMPAIGN_HOME/smolvm}" \
148-
SMOLVM_AGENT_ROOTFS="${SMOLVM_AGENT_ROOTFS:-$HOST_HOME/.smolvm/agent-rootfs}" \
149-
SMOLVM_LIB_DIR="${SMOLVM_LIB_DIR:-$HOST_HOME/.smolvm/lib}" \
149+
SMOLVM_AGENT_ROOTFS="${SMOLVM_AGENT_ROOTFS:-$SMOLVM_HOME_DIR/agent-rootfs}" \
150+
SMOLVM_LIB_DIR="${SMOLVM_LIB_DIR:-$SMOLVM_HOME_DIR/lib}" \
150151
PRELOOP_RUNNER_BASE_IMAGE="$OFFICIAL_GOLDEN_BASE" \
151152
PRELOOP_RUNNER_BUNDLE="$GUEST_RUNNER_BUNDLE" \
152153
PRELOOP_RUNNER_NAME_PREFIX="conformance-new5repos" \
@@ -155,7 +156,7 @@ start_server() {
155156
PRELOOP_RUNNER_POOL_SIZE="$POOL_SIZE" \
156157
PRELOOP_USE_FORK=1 \
157158
PRELOOP_RUNNER_MEMORY_MIB="${PRELOOP_RUNNER_MEMORY_MIB:-8192}" \
158-
PRELOOP_RUNNER_STORAGE_GB="${PRELOOP_RUNNER_STORAGE_GB:-160}" \
159+
PRELOOP_RUNNER_STORAGE_GB="${PRELOOP_RUNNER_STORAGE_GB:-80}" \
159160
PRELOOP_RUNNER_LABELS="${PRELOOP_RUNNER_LABELS:-X64,ubuntu-arm64-small,ubuntu-x64-small,ubuntu-x64,ubuntu-latest,ubuntu-22.04,ubuntu-24.04,ubuntu-20.04}" \
160161
PRELOOP_PUBLIC_URL="http://127.0.0.1:$PORT" \
161162
RUST_LOG="${RUST_LOG:-info,preloop=info}" \
@@ -284,7 +285,7 @@ EOF
284285
echo "=== [$target] final status: $final_status ==="
285286
case "$final_status" in
286287
success|skipped) ;;
287-
*) FAILED_TARGETS="${FAILED_TARGETS}${target}=${final_status}\n" ;;
288+
*) FAILED_TARGETS="${FAILED_TARGETS:-}${target}=${final_status}\n" ;;
288289
esac
289290
}
290291
main() {
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
# 10-Repo Conformance Campaign — Final Report
2+
3+
**Date:** 2026-09-11 · **Branch:** `improve/runner-watch-conformance` rebased onto
4+
`origin/main@008893a3` · **Stack:** preloop server + preloop Rust runner,
5+
both built from the branch (incl. 10 fixes below) · **Golden:** official
6+
`ubuntu24-arm64-runner-large` packed image · **Isolation:** smolvm microVMs,
7+
pool of 4×(4 vCPU/16 GB); nothing on host · **Labels:** X64 + ubuntu-* +
8+
ubuntu-slim
9+
10+
All 10 repos are NEW (no overlap with the 41 previously covered). Real
11+
`.github/workflows` files, submitted as push payloads, run to completion.
12+
13+
## Scoreboard (final validated state)
14+
15+
| Repo | Workflow | Verdict |
16+
|---|---|---|
17+
| spf13/hugo | test.yml | **ubuntu fully green** (codegen + asciidoc via fixes #13/#16, confirmed in full workflow rerun); windows starves (expected) |
18+
| grpc/grpc-go | testing.yml | **7/8 PASS** (vet-proto, static-checks, extras, latest, latest-1, -race, arm64); i386 red (env) |
19+
| pytest-dev/pytest | test.yml | **`package` fully green** (fetch-depth:0 checkout + hynek build via fixes #12/#16); 15 ubuntu tox legs starved on pool serialization (no test signal); macos/windows starved (expected) |
20+
21+
## Rerun with fixes (2026-09-12/13)
22+
23+
- Full workflow reruns on the final stack: hugo's Ubuntu jobs are green;
24+
pytest's `package` job is green (including the `fetch-depth: 0` checkout
25+
and hynek build); jekyll's profiler test is green; nushell's relabeled
26+
std-lib workflow is green 5/5. The pytest tox matrix still has no signal
27+
for its unavailable platform cells because this host has one serialized
28+
Linux runner.
29+
- Django remains 1/4 (scripts green; Chrome-dependent JavaScript and
30+
free-threaded Python environment gaps; Windows unavailable). Laravel has
31+
one Linux matrix failure plus cancelled siblings and unavailable Windows
32+
cells; the remaining Linux failure is workflow/environment-level after the
33+
services-PATH fix. fmt still has the gcc-4.9 failure followed by fail-fast
34+
cancellation. JUnit has six green jobs; OpenJ9, CodeQL/zizmor credentials,
35+
and unavailable Windows/macOS account for the rest.
36+
- Testcontainers now expands its dynamic module matrix correctly:
37+
`lint (modules/compose)` is materialized and runs. Its remaining failure
38+
is `make generate` returning non-zero; the old literal
39+
`${{ fromJSON(...) }}` job-name/dynamic-matrix gap is closed.
40+
- pytest `package` checkout now succeeds in the real workflow (fetch +
41+
`checkout --force`); hugo codegen panic gone (`_work/hugo/hugo` in full
42+
logs); jekyll keeps the identical single profiler assert (rename applied,
43+
didn't fix it — open).
44+
- Both fixes unveiled the next blocker: `setup-python` 3.14.7 is broken in
45+
later steps (`libpython3.14.so.1.0` missing; pip works in-step) — fails
46+
pytest `package` and hugo asciidoc. Upstream tarball intact; the drop is
47+
in GITHUB_ENV→later-step propagation (suspect composite-inner env).
48+
- The rerun died of disk exhaustion during junit (8/10 snapshotted; junit
49+
and testcontainers unsalvaged). Late-run verdicts are contaminated by
50+
600s pool starvation (grpc latest/latest-1/-race/arm show steps `pending`,
51+
not build failures) — scheduling casualties, not regressions.
52+
- Targeted proofs (not the noisy rerun) remain dispositive; see
53+
`pytest/validation/`, `hugo/validation/`, `jekyll/validation/`,
54+
`nushell/` (relabel experiment).
55+
| django/django | tests.yml | 1/4 — scripts-tests green; JS red (chrome libs); 3.14t red (missing step output); windows starved |
56+
| laravel/framework | tests.yml | 0 passing — runner bugs fixed (verified zero), now blocked on creds + mysql flake |
57+
| fmtlib/fmt | linux.yml | 0 executed — 1 env leg (gcc-4.9 amd64-only) + fail-fast cascade cancels 18 |
58+
| nushell/nushell | ci.yml | 0 runnable — all jobs pinned to Incredibuild custom fleet; submit fixed |
59+
| jekyll/jekyll | ci.yml | profiler assert fixed (single-test proof `0 failures` + Ruby 2.7 Linux green in rerun); 3.3/3.4/profile/rubocop never scheduled (pool starvation); JRuby red (locale); windows starved |
60+
| junit-team/junit5 | ci.yml | **6 green post-fix** (Build/Linux, docs, openjdk 26/27/28, reproducibility); windows/macOS starved; CodeQL+zizmor creds; openJ9 TBD; status cascade-correct |
61+
| testcontainers-go | ci.yml | dynamic matrix now expands to `modules/compose`; lint runs and fails in `make generate` (generated-file/workflow environment issue), remaining platform jobs skip |
62+
63+
## Bugs found & fixed (branch, all with regression tests)
64+
65+
1. **Expression `Index{base,key}`** (`preloop-gha-expressions`): `env[matrix.target.options]`
66+
rejected (`unexpected token Dot`), nushell unsubmittable. Full bracket-expression
67+
parsing; literal fast path preserved.
68+
2. **Composite `working-directory` never evaluated** (runner): literal
69+
`${{ inputs.working-directory }}` became the spawn cwd (junit).
70+
3. **`$/` nested-local-action fallback** (runner): workspace-local composites
71+
errored (junit main-build). Falls back to workspace join.
72+
4. **Node entry-point containment by repo root** (runner): gradle `../dist/...`
73+
+ codeql `../lib/...` legit layouts rejected; unblocked gradle + codeql init.
74+
5. **Per-action `INPUT_*` scoping** (runner composite+node+docker): parent inputs
75+
leaked into nested actions; setup-gradle died on its removed `arguments`.
76+
6. **`github.action_path` empty in nested composites** (runner): produced
77+
`/setup-testlens.sh` → 127 (junit). Save/restore per composite level.
78+
7. **Services-only jobs took container PATH branch** (runner): host-PATH fallback
79+
skipped, first GITHUB_PATH write replaced PATH with extras-only, all later
80+
spawns ENOENT (laravel). Flag now requires a real job container.
81+
8. **Empty-PATH fallback** (runner): defense + warning log.
82+
9. **Disk-backed `/tmp` provisioning** (orchestrator): 8 GB tmpfs killed heavy
83+
Go builds; GitHub uses disk-backed /tmp. Verified live on fresh forks.
84+
10. **`preloop golden-path`** (hidden CLI): exact packed-artifact path from server
85+
code; hand-rolled fingerprint drift caused full 9 GB rebuilds.
86+
11. **Spawn diagnostics** (runner, kept): program/cwd-exists/PATH in the error —
87+
decisive in two investigations.
88+
12. **Snapshot git transport ignored `Content-Encoding: gzip`** (server):
89+
git gzip-encodes large smart-HTTP POST bodies; the full-history fetch
90+
(thousands of want lines, ~6 KB) arrived gzipped and was piped raw to
91+
`git http-backend`, which died with `bad line length character` while the
92+
client reported `fatal: expected 'packfile'`. This was pytest's
93+
`fetch-depth: 0` killer. Fixed with `decode_git_request_body` + regression
94+
test; verified live: depth-0 checkout succeeds (17732 commits), depth-1
95+
still succeeds. Evidence in `pytest/validation/`.
96+
13. **Job workspace is now `<work>/<repo>/<repo>`** (runner): the claim
97+
message carries no work directory, so every job landed in
98+
`_work/default/default` while GitHub uses `/home/runner/work/<repo>/<repo>`.
99+
hugo's codegen test panics unless the absolute path contains `"hugo"`.
100+
`setup_workspace` derives both segments from
101+
`contextData.github.repository` (decoded from the AzDO typed-dict wire
102+
form), with strict `owner/repo` validation and the historical fallback.
103+
Shared helper `workspace_dir_for_repository` + regression tests (plain
104+
and tagged shapes; fails-without verified). Verified live: hugo checkout
105+
lands in `_work/hugo/hugo` and the previously panicking
106+
`TestMethods/MethodsFromTypes` passes (`ok codegen 1.020s`). Evidence in
107+
`hugo/validation/`.
108+
14. **smolvm 1.8.2 → 1.15.0 (infra)**: clone boots died code 133 (`no
109+
active virtual interrupt`) and rollback-resume failed (`EINVAL`), so
110+
every job was a ~30 GB full materialization — the disk deaths and most
111+
600s starvations trace here. 1.14.6 was unpairable (demands
112+
`krun_set_cpu_template`, absent from both the 1.8.2-era shipped libs
113+
and Homebrew upstream libkrun). 1.15.0 + bundled libs forks correctly
114+
(second job boots in ~60s, clones ~1 GB). Harness pins
115+
`~/.smolvm/1.15.0` via `SMOLVM_HOME_DIR`.
116+
15. **Node externals fallback to legacy baked path** (runner): packed VMs
117+
never mount externals (IRQ budget) — they use the golden-baked
118+
`/var/lib/preloop-runner/externals`. The `/home/runner` move put the
119+
upward walk out of reach and every node action died (`bundled node24
120+
is missing`). The lookup now falls back to the legacy root when the
121+
walk misses (seam unit-tested incl. precedence). Proven live: jekyll
122+
setup-ruby runs and the profiler test passes
123+
(`1 tests, 5 assertions, 0 failures`).
124+
16. **Tool cache defaults to `/opt/hostedtoolcache`** (runner): version
125+
tarballs bake an absolute RUNPATH there, and actions with
126+
`update-environment: false` (hynek's composite, pytest `package`)
127+
rely on the interpreter loading without `LD_LIBRARY_PATH` — true on
128+
hosted, false with the old `_work/_tool` default (also fails on stock
129+
self-hosted runners). `RUNNER_TOOL_CACHE` + `AGENT_TOOLSDIRECTORY`
130+
now prefer the hosted path when present and writable (our provisioning
131+
already creates/chmods it), else the old default. Proven live: pytest
132+
`package` fully green (`Using CPython ... /opt/hostedtoolcache/...`,
133+
sdist + wheel built). Evidence in `pytest/validation/`.
134+
135+
## Fidelity findings for follow-up (not fixed)
136+
137+
- **P1 — snapshot lifecycle vs queue wait**: `repository not found` when jobs
138+
claim ~10 min after submit.
139+
- **P1 — builder-stop EAGAIN exits the whole server** (seen once).
140+
- **P2 — checkout dir naming**: `_work/default/default` vs repo name breaks
141+
path-assuming tests (hugo codegen `MethodsFromTypes`, jekyll profiler —
142+
identical signature on 3 rubies).
143+
- **Possible log-capture gap**: django 3.14t ran 3.5 min with zero step output.
144+
- **Env gaps (golden)**: qemu-i386 (grpc), chrome system libs (django JS),
145+
JRuby locale (`Malformed input`, bundler), gcc-4.9 amd64 (fmt),
146+
EA/OpenJ9 JDK legs, Incredibuild labels (nushell).
147+
- **Credentials (local-only box, no GitHub token)**: fake local GITHUB_TOKEN
148+
poisons composer auth (laravel) and fails CodeQL/zizmor (401s).
149+
150+
## Infra notes
151+
152+
SUPERSEDED by fix #14: smolvm/libkrun must be a matched pair — 1.14.6
153+
demands `krun_set_cpu_template` (absent from 1.8.2-era libs and Homebrew
154+
upstream libkrun alike); 1.8.2's fork path is broken. Campaign now pins
155+
`~/.smolvm/1.15.0` (binary + bundled libs + agent-rootfs) via
156+
`SMOLVM_HOME_DIR`, still shadowed onto PATH through `$CAMPAIGN_HOME/bin`.
157+
- Disk: 258 stale VMs + 85 GB stale store deleted (was 99%); storage cap
158+
160→100 GB; APFS clones share ~97% (6 VMs ≈ 6 GB real).
159+
- Server restart wipes run logs (state under CAMPAIGN_HOME); `run.json`
160+
snapshots survive — diagnose live or lose logs.
161+
- `cargo zigbuild` needs `rust-std aarch64-unknown-linux-gnu` (vanished twice);
162+
kache staleness linked two stale guests — verify rlib/binary mtimes.
163+
- mtplx server (Qwen Flash Next) ate ~50 GB; killed + `bootout`ed its system
164+
daemon for the campaign; restore with
165+
`sudo launchctl bootstrap system /Library/LaunchDaemons/com.nuraydia.mtplx.plist`.
166+
167+
## Evidence
168+
169+
Per-target `run.json` snapshots + server logs under
170+
`benchmarks/real-world/results/conformance-10repos/`; validation captures in
171+
`junit/validation/` (5-green run + logs) and `laravel/validation/`
172+
(composer-auth logs). Harness: `benchmarks/real-world/conformance-10repos.sh`.

0 commit comments

Comments
 (0)