"""Isolated B01 runner with durable per-attempt evidence, maximum three runs.""" import datetime import json import os from pathlib import Path import subprocess import sys repo = Path(__file__).resolve().parents[2] root = repo.parent / ".hermes/test-runtime/unified-execution/b01" root.mkdir(parents=True, exist_ok=True) ledger = root / "attempts.jsonl" attempts = ledger.read_text().splitlines() if ledger.exists() else [] if len(attempts) >= 3: raise SystemExit("B01 budget exhausted") attempt = len(attempts) + 1 home = root / f"attempt-{attempt}" config = home / "config" config.mkdir(parents=True, exist_ok=True) (config / "settings.yaml").write_text("enable_async_subagents: false\nenable_scheduler: false\nmemory_workers_enabled: false\n") env = { "HOME": str(home), "PATH": str(repo / ".venv/bin") + ":/usr/bin:/bin", "PYTHONPATH": str(repo), "PYTHON_DOTENV_DISABLED": "1", "PYTEST_DISABLE_PLUGIN_AUTOLOAD": "1", "PYTHONDONTWRITEBYTECODE": "1", "EVOSCIENTIST_HOME": str(home), "EVOSCIENTIST_CONFIG_DIR": str(config), "XDG_CONFIG_HOME": str(config), "EVOSCIENTIST_DATA_DIR": str(home / "data"), "EVOSCIENTIST_WORKSPACE_DIR": str(home / "workspace"), "EVOSCIENTIST_SKILLS_DIR": str(home / "skills"), "EVOSCIENTIST_MEMORIES_DIR": str(home / "memory"), } nodes = [ "test_explicit_web_factory_preserves_environment_and_globals", "test_two_tenants_real_file_tools_and_sqlite_reopen", "test_web_manual_execute_interrupts_before_backend", ] command = [str(repo / ".venv/bin/python"), "-m", "pytest", "--noconftest", "-p", "no:cacheprovider", "-q", "--tb=short"] command += ["tests/test_execution_adapter_embedding.py::" + n for n in nodes] record = {"attempt": attempt, "started": datetime.datetime.now().isoformat(), "nodes": nodes, "command": command, "cwd": str(repo)} with ledger.open("a") as handle: handle.write(json.dumps(record) + "\n") result = subprocess.run(command, cwd=repo, env=env, text=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) log = root / f"attempt-{attempt}.log" log.write_text(result.stdout) print(result.stdout) print(json.dumps({"attempt": attempt, "exit_code": result.returncode, "log": str(log)})) sys.exit(result.returncode)