From b173f541ae3653701035312d56366ceeb2d4e28f Mon Sep 17 00:00:00 2001 From: Landon Cox Date: Wed, 26 Aug 2026 17:00:10 -0700 Subject: [PATCH 1/9] feat: add protected enclave entry diagnostics Add bounded progress and preflight events, preserve safe launch errors, and keep private inputs out of protected session metadata. Cover launch failures, timeout cleanup, redaction, milestones, and audit mapping. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- containers/enclave/agent-entrypoint.py | 230 +++++++++++++-- .../agent-entrypoint-diagnostics.test.ts | 270 ++++++++++++++++++ src/enclave/agent-mcp-server.test.ts | 9 +- 3 files changed, 480 insertions(+), 29 deletions(-) create mode 100644 src/enclave/agent-entrypoint-diagnostics.test.ts diff --git a/containers/enclave/agent-entrypoint.py b/containers/enclave/agent-entrypoint.py index 0728699ec..8b2d1281b 100644 --- a/containers/enclave/agent-entrypoint.py +++ b/containers/enclave/agent-entrypoint.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 """Run the pinned native Copilot CLI inside a enclave-agent enclave.""" +import errno import json import os import re @@ -21,6 +22,7 @@ MAX_INPUT_BYTES = 64 * 1024 MAX_TRANSCRIPT_BYTES = 1024 * 1024 +MAX_ENGINE_STREAM_BYTES = MAX_TRANSCRIPT_BYTES // 4 MAX_DIAGNOSTIC_BYTES = 256 * 1024 MAX_DIAGNOSTIC_FILES = 32 MAX_STARTUP_RETRIES = 2 @@ -32,6 +34,13 @@ EXIT_RESULT_WRITE_FAILED = 30 +def truncate_utf8(value: str, max_bytes: int) -> str: + encoded = value.encode("utf-8") + if len(encoded) <= max_bytes: + return value + return encoded[:max_bytes].decode("utf-8", errors="ignore") + + def append_event(event: dict) -> None: try: encoded = (json.dumps(event, separators=(",", ":"), ensure_ascii=False) + "\n").encode() @@ -68,6 +77,115 @@ def redact_diagnostics(value: str) -> str: return redacted +def append_progress(stage: str, **metadata) -> None: + append_event({"event": "progress", "stage": stage, **metadata}) + + +def safe_os_error(error: OSError, operation: str) -> None: + error_number = error.errno if isinstance(error.errno, int) else None + category = { + errno.ENOENT: "not-found", + errno.EACCES: "permission-denied", + errno.ENOEXEC: "not-executable", + errno.ENOTDIR: "not-directory", + errno.EISDIR: "is-directory", + errno.EROFS: "read-only-filesystem", + }.get(error_number, "os-error") + exception = type(error).__name__ + if exception not in { + "OSError", + "FileNotFoundError", + "PermissionError", + "NotADirectoryError", + "IsADirectoryError", + }: + exception = "OSError" + event = { + "event": "operation-error", + "operation": operation, + "exception": exception, + "category": category, + } + if error_number is not None: + event["errno"] = error_number + try: + event["strerror"] = os.strerror(error_number) + except (ValueError, OverflowError): + pass + append_event(event) + + +def preflight_path( + identifier: str, + path: Path, + expected_type: str, + *, + executable: bool = False, + writable: bool = False, +) -> OSError | None: + metadata = { + "event": "preflight", + "path": identifier, + "exists": False, + "type": "missing", + } + try: + path_stat = path.stat() + except OSError as error: + append_event(metadata) + return error + + is_file = stat.S_ISREG(path_stat.st_mode) + is_directory = stat.S_ISDIR(path_stat.st_mode) + actual_type = "file" if is_file else "directory" if is_directory else "other" + metadata.update({"exists": True, "type": actual_type}) + if executable: + metadata["executable"] = os.access(path, os.X_OK) + if writable: + metadata["writable"] = os.access(path, os.W_OK) + append_event(metadata) + + type_matches = ( + (expected_type == "file" and is_file) + or (expected_type == "directory" and is_directory) + ) + if not type_matches: + error_number = errno.EISDIR if is_directory else errno.ENOTDIR + return OSError(error_number, os.strerror(error_number)) + if executable and not metadata["executable"]: + return OSError(errno.ENOEXEC, os.strerror(errno.ENOEXEC)) + if writable and not metadata["writable"]: + return PermissionError(errno.EACCES, os.strerror(errno.EACCES)) + return None + + +def run_preflight(copilot_logs: Path) -> bool: + checks = [ + ("copilot-executable", Path(COPILOT_BIN), "file", True, False), + ("seed-directory", SEED_DIR, "directory", True, False), + ("task-input", TASK_PATH, "file", False, False), + ("schema-input", SCHEMA_PATH, "file", False, False), + ("output-file", OUT_PATH, "file", False, True), + ("session-log", SESSION_LOG_PATH, "file", False, True), + ("agent-directory", AGENT_DIR, "directory", True, True), + ("copilot-log-directory", copilot_logs, "directory", True, True), + ] + valid = True + for identifier, path, expected_type, executable, writable in checks: + error = preflight_path( + identifier, + path, + expected_type, + executable=executable, + writable=writable, + ) + if error is not None: + safe_os_error(error, f"preflight-{identifier}") + valid = False + append_progress("preflight-completed", valid=valid) + return valid + + def read_copilot_diagnostics(log_dir: Path) -> str: chunks = [] remaining = MAX_DIAGNOSTIC_BYTES @@ -83,12 +201,14 @@ def read_copilot_diagnostics(log_dir: Path) -> str: data = handle.read(remaining + 1)[:remaining] except OSError: continue - relative = path.relative_to(log_dir) - chunks.append(f"--- {relative}\n{data.decode('utf-8', errors='replace')}") + chunks.append( + f"--- diagnostic-{len(chunks) + 1}\n" + f"{data.decode('utf-8', errors='replace')}" + ) remaining -= len(data) if remaining <= 0: break - return redact_diagnostics("\n".join(chunks)) + return truncate_utf8(redact_diagnostics("\n".join(chunks)), MAX_DIAGNOSTIC_BYTES) def build_prompt(task: str, schema_text: str) -> str: @@ -145,8 +265,8 @@ def append_engine_result(completed: subprocess.CompletedProcess) -> tuple[str, s append_event({ "event": "engine-result", "exitCode": completed.returncode, - "stdout": stdout[:MAX_TRANSCRIPT_BYTES // 2], - "stderr": stderr[:MAX_TRANSCRIPT_BYTES // 2], + "stdout": truncate_utf8(redact_diagnostics(stdout), MAX_ENGINE_STREAM_BYTES), + "stderr": truncate_utf8(redact_diagnostics(stderr), MAX_ENGINE_STREAM_BYTES), }) return stdout, stderr @@ -155,6 +275,7 @@ def main() -> int: if os.environ.get("AWF_ENCLAVE_AGENT_ENGINE") != "copilot": append_event({"event": "failure", "category": "configuration-invalid"}) return EXIT_CONFIGURATION_INVALID + append_progress("configuration-accepted", engine="copilot") try: task = read_bounded(TASK_PATH) schema_text = read_bounded(SCHEMA_PATH) @@ -172,18 +293,41 @@ def main() -> int: except (KeyError, OSError, UnicodeDecodeError, ValueError, json.JSONDecodeError): append_event({"event": "failure", "category": "input-invalid"}) return EXIT_INPUT_INVALID + append_progress( + "input-accepted", + taskBytes=len(task.encode("utf-8")), + schemaBytes=len(schema_text.encode("utf-8")), + ) - (AGENT_DIR / "home").mkdir(mode=0o700, exist_ok=True) - (AGENT_DIR / "copilot").mkdir(mode=0o700, exist_ok=True) - copilot_logs = AGENT_DIR / "copilot-logs" - copilot_logs.mkdir(mode=0o700, exist_ok=True) + runtime_paths = [ + ("home-directory", AGENT_DIR / "home"), + ("copilot-directory", AGENT_DIR / "copilot"), + ("copilot-log-directory", AGENT_DIR / "copilot-logs"), + ] + try: + for _, path in runtime_paths: + path.mkdir(mode=0o700, exist_ok=True) + except OSError as error: + safe_os_error(error, "runtime-path-creation") + append_event({"event": "failure", "category": "engine-failed"}) + return EXIT_ENGINE_FAILED + copilot_logs = runtime_paths[-1][1] + append_progress( + "runtime-paths-ready", + paths=[identifier for identifier, _ in runtime_paths], + ) append_event({ "event": "session", "engine": "copilot", - "model": model, - "task": task, - "schema": json.loads(schema_text), + "taskBytes": len(task.encode("utf-8")), + "schemaBytes": len(schema_text.encode("utf-8")), }) + if not run_preflight(copilot_logs): + diagnostics = read_copilot_diagnostics(copilot_logs) + if diagnostics: + append_event({"event": "engine-diagnostics", "log": diagnostics}) + append_event({"event": "failure", "category": "engine-failed"}) + return EXIT_ENGINE_FAILED command = [ COPILOT_BIN, @@ -214,36 +358,61 @@ def main() -> int: if remaining <= 0: break started = time.monotonic() + append_progress("engine-launch-attempt", attempt=attempt + 1) try: - completed = subprocess.run( + process = subprocess.Popen( command, cwd=SEED_DIR, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.PIPE, - timeout=remaining, - check=False, + start_new_session=True, + ) + append_progress("engine-started", attempt=attempt + 1) + try: + process_stdout, process_stderr = process.communicate(timeout=remaining) + except subprocess.TimeoutExpired: + os.killpg(process.pid, signal.SIGKILL) + process_stdout, process_stderr = process.communicate() + append_event({ + "event": "engine-result", + "exitCode": None, + "stdout": truncate_utf8( + redact_diagnostics(process_stdout.decode("utf-8", errors="replace").strip()), + MAX_ENGINE_STREAM_BYTES, + ), + "stderr": truncate_utf8( + redact_diagnostics(process_stderr.decode("utf-8", errors="replace")), + MAX_ENGINE_STREAM_BYTES, + ), + }) + diagnostics = read_copilot_diagnostics(copilot_logs) + if diagnostics: + append_event({"event": "engine-diagnostics", "log": diagnostics}) + append_event({"event": "failure", "category": "deadline-exceeded"}) + return EXIT_DEADLINE_EXCEEDED + completed = subprocess.CompletedProcess( + command, + process.returncode, + process_stdout, + process_stderr, ) - except subprocess.TimeoutExpired as error: - partial_stdout = (error.stdout or b"").decode("utf-8", errors="replace").strip() - partial_stderr = (error.stderr or b"").decode("utf-8", errors="replace") - append_event({ - "event": "engine-result", - "exitCode": None, - "stdout": partial_stdout[:MAX_TRANSCRIPT_BYTES // 2], - "stderr": partial_stderr[:MAX_TRANSCRIPT_BYTES // 2], - }) + except OSError as error: + safe_os_error(error, "engine-launch") diagnostics = read_copilot_diagnostics(copilot_logs) if diagnostics: append_event({"event": "engine-diagnostics", "log": diagnostics}) - append_event({"event": "failure", "category": "deadline-exceeded"}) - return EXIT_DEADLINE_EXCEEDED - except OSError: append_event({"event": "failure", "category": "engine-failed"}) return EXIT_ENGINE_FAILED stdout, _ = append_engine_result(completed) runtime = time.monotonic() - started + append_progress( + "engine-completed", + attempt=attempt + 1, + exitCode=completed.returncode, + runtimeMs=int(runtime * 1000), + ) startup_crash = ( completed.returncode in {-signal.SIGABRT, -signal.SIGSEGV} and not stdout @@ -267,15 +436,20 @@ def main() -> int: append_event({"event": "engine-diagnostics", "log": diagnostics}) append_event({"event": "failure", "category": "engine-failed"}) return EXIT_ENGINE_FAILED + append_progress("output-normalization-started") result = normalize_copilot_output(stdout, schema_text) if not result or len(result.encode("utf-8")) > max_output: append_event({"event": "failure", "category": "result-write-failed"}) return EXIT_RESULT_WRITE_FAILED + append_progress("output-normalized", outputBytes=len(result.encode("utf-8"))) + append_progress("output-write-attempt") try: OUT_PATH.write_text(result, encoding="utf-8") - except OSError: + except OSError as error: + safe_os_error(error, "output-write") append_event({"event": "failure", "category": "result-write-failed"}) return EXIT_RESULT_WRITE_FAILED + append_progress("output-written", outputBytes=len(result.encode("utf-8"))) append_event({"event": "success"}) return 0 diff --git a/src/enclave/agent-entrypoint-diagnostics.test.ts b/src/enclave/agent-entrypoint-diagnostics.test.ts new file mode 100644 index 000000000..080f6d07a --- /dev/null +++ b/src/enclave/agent-entrypoint-diagnostics.test.ts @@ -0,0 +1,270 @@ +import { spawnSync } from 'child_process'; +import * as fs from 'fs'; +import * as os from 'os'; +import * as path from 'path'; + +const entrypoint = path.join( + __dirname, + '..', + '..', + 'containers', + 'enclave', + 'agent-entrypoint.py', +); + +const harness = String.raw` +import errno +import importlib.util +import json +import os +from pathlib import Path + +spec = importlib.util.spec_from_file_location("agent_entrypoint", os.environ["ENTRYPOINT"]) +module = importlib.util.module_from_spec(spec) +spec.loader.exec_module(module) + +root = Path(os.environ["HARNESS_ROOT"]) +scenario = os.environ["SCENARIO"] +module.SEED_DIR = root / "seed" +module.TASK_PATH = root / "task.txt" +module.SCHEMA_PATH = root / "schema.json" +module.OUT_PATH = root / "out" +module.SESSION_LOG_PATH = root / "session.jsonl" +module.AGENT_DIR = root / "agent" +module.COPILOT_BIN = str(root / "copilot") + +if scenario == "bounds": + module.SESSION_LOG_PATH.write_text("", encoding="utf-8") + completed = module.subprocess.CompletedProcess( + [], + 1, + ("é" * module.MAX_TRANSCRIPT_BYTES).encode("utf-8"), + b"x" * module.MAX_TRANSCRIPT_BYTES, + ) + module.append_engine_result(completed) + for index in range(10): + module.append_event({ + "event": "large", + "index": index, + "value": "é" * (module.MAX_TRANSCRIPT_BYTES // 8), + }) + transcript = module.SESSION_LOG_PATH.read_text(encoding="utf-8") + print(json.dumps({ + "exitCode": 0, + "transcript": transcript, + "transcriptBytes": len(transcript.encode("utf-8")), + "output": "", + })) + raise SystemExit(0) + +module.SEED_DIR.mkdir() +module.AGENT_DIR.mkdir() +module.TASK_PATH.write_text(os.environ["PRIVATE_TASK"], encoding="utf-8") +module.SCHEMA_PATH.write_text('{"type":"boolean"}', encoding="utf-8") +module.OUT_PATH.write_text("", encoding="utf-8") +module.SESSION_LOG_PATH.write_text("", encoding="utf-8") + +if scenario != "missing-copilot": + copilot = Path(module.COPILOT_BIN) + if scenario == "timeout": + copilot.write_text("#!/bin/sh\nsleep 30 &\nwait\n", encoding="utf-8") + else: + copilot.write_text( + "#!/bin/sh\n" + "printf '%s\\n' true\n" + "printf '%s\\n' 'Authorization: Bearer " + os.environ["TEST_API_TOKEN"] + "' >&2\n", + encoding="utf-8", + ) + copilot.chmod(0o644 if scenario == "non-executable-copilot" else 0o755) + +if scenario == "missing-seed": + module.SEED_DIR.rmdir() + +if scenario == "launch-oserror": + def fail_launch(*args, **kwargs): + log_dir = module.AGENT_DIR / "copilot-logs" + log_dir.mkdir(exist_ok=True) + (log_dir / "launch.log").write_text( + "Proxy-Authorization: Bearer " + os.environ["TEST_API_TOKEN"], + encoding="utf-8", + ) + raise FileNotFoundError( + errno.ENOENT, + "unsafe detail " + os.environ["PRIVATE_PATH"], + os.environ["PRIVATE_PATH"], + ) + module.subprocess.Popen = fail_launch + +exit_code = module.main() +transcript = module.SESSION_LOG_PATH.read_text(encoding="utf-8") +print(json.dumps({ + "exitCode": exit_code, + "transcript": transcript, + "transcriptBytes": len(transcript.encode("utf-8")), + "output": module.OUT_PATH.read_text(encoding="utf-8"), +})) +`; + +interface HarnessResult { + exitCode: number; + transcript: string; + transcriptBytes: number; + output: string; +} + +function runHarness(scenario: string): HarnessResult { + const root = fs.mkdtempSync(path.join(os.tmpdir(), 'awf-enclave-entrypoint-')); + try { + const result = spawnSync('python3', ['-c', harness], { + encoding: 'utf8', + env: { + ...process.env, + ENTRYPOINT: entrypoint, + HARNESS_ROOT: root, + SCENARIO: scenario, + PRIVATE_TASK: 'private prompt sentinel', + PRIVATE_PATH: '/private/repository/secret-path', + TEST_API_TOKEN: 'test-secret-token-value', + AWF_ENCLAVE_AGENT_ENGINE: 'copilot', + AWF_ENCLAVE_AGENT_MAX_OUTPUT_BYTES: '1024', + AWF_ENCLAVE_AGENT_DEADLINE_SECONDS: scenario === 'timeout' ? '1' : '5', + AWF_ENCLAVE_AGENT_MODEL: 'test-model', + }, + }); + if (result.status !== 0) { + throw new Error(`Python harness failed: ${result.stderr}`); + } + return JSON.parse(result.stdout) as HarnessResult; + } finally { + fs.rmSync(root, { recursive: true, force: true }); + } +} + +function events(result: HarnessResult): Array> { + return result.transcript.trim().split('\n').filter(Boolean).map((line) => JSON.parse(line)); +} + +describe('enclave agent protected entrypoint diagnostics', () => { + it.each<[string, string, boolean]>([ + ['missing-copilot', 'not-found', false], + ['non-executable-copilot', 'not-executable', true], + ])('fails preflight safely for %s', (scenario, category, exists) => { + const result = runHarness(scenario); + const transcript = events(result); + + expect(result.exitCode).toBe(24); + expect(transcript).toContainEqual(expect.objectContaining({ + event: 'preflight', + path: 'copilot-executable', + exists, + })); + expect(transcript).toContainEqual(expect.objectContaining({ + event: 'operation-error', + operation: 'preflight-copilot-executable', + category, + })); + expect(transcript[transcript.length - 1]) + .toEqual({ event: 'failure', category: 'engine-failed' }); + }); + + it('identifies a missing working directory without logging its path', () => { + const result = runHarness('missing-seed'); + const transcript = events(result); + + expect(result.exitCode).toBe(24); + expect(transcript).toContainEqual({ + event: 'preflight', + path: 'seed-directory', + exists: false, + type: 'missing', + }); + expect(transcript).toContainEqual(expect.objectContaining({ + event: 'operation-error', + operation: 'preflight-seed-directory', + category: 'not-found', + errno: 2, + })); + expect(result.transcript).not.toContain('/private/'); + }); + + it('records a redacted actionable launch OSError and existing Copilot diagnostics', () => { + const result = runHarness('launch-oserror'); + const transcript = events(result); + + expect(result.exitCode).toBe(24); + expect(transcript).toContainEqual(expect.objectContaining({ + event: 'operation-error', + operation: 'engine-launch', + exception: 'FileNotFoundError', + category: 'not-found', + errno: 2, + strerror: expect.any(String), + })); + expect(transcript).toContainEqual(expect.objectContaining({ + event: 'engine-diagnostics', + log: expect.stringContaining('[REDACTED]'), + })); + expect(result.transcript).not.toContain('test-secret-token-value'); + expect(result.transcript).not.toContain('/private/repository/secret-path'); + }); + + it('records the successful milestone sequence without duplicating private input', () => { + const result = runHarness('success'); + const transcript = events(result); + const stages = transcript + .filter((event) => event.event === 'progress') + .map((event) => event.stage); + + expect(result.exitCode).toBe(0); + expect(result.output).toBe('true'); + expect(stages).toEqual([ + 'configuration-accepted', + 'input-accepted', + 'runtime-paths-ready', + 'preflight-completed', + 'engine-launch-attempt', + 'engine-started', + 'engine-completed', + 'output-normalization-started', + 'output-normalized', + 'output-write-attempt', + 'output-written', + ]); + expect(result.transcript).not.toContain('private prompt sentinel'); + expect(result.transcript).not.toContain('test-secret-token-value'); + expect(result.transcript).not.toContain('test-model'); + expect(transcript).toContainEqual(expect.objectContaining({ + event: 'engine-result', + exitCode: 0, + stderr: expect.stringContaining('[REDACTED]'), + })); + expect(transcript[transcript.length - 1]).toEqual({ event: 'success' }); + }); + + it('kills the launched process group and records a bounded deadline failure', () => { + const started = Date.now(); + const result = runHarness('timeout'); + const transcript = events(result); + + expect(Date.now() - started).toBeLessThan(5000); + expect(result.exitCode).toBe(20); + expect(transcript).toContainEqual(expect.objectContaining({ + event: 'engine-result', + exitCode: null, + })); + expect(transcript[transcript.length - 1]) + .toEqual({ event: 'failure', category: 'deadline-exceeded' }); + }); + + it('keeps the protected transcript at its byte limit with valid JSONL', () => { + const result = runHarness('bounds'); + + const transcript = events(result); + + expect(result.transcriptBytes).toBeLessThanOrEqual(1024 * 1024); + expect(transcript).toContainEqual(expect.objectContaining({ + event: 'engine-result', + exitCode: 1, + })); + }); +}); diff --git a/src/enclave/agent-mcp-server.test.ts b/src/enclave/agent-mcp-server.test.ts index d36f32dc8..691e1ed02 100644 --- a/src/enclave/agent-mcp-server.test.ts +++ b/src/enclave/agent-mcp-server.test.ts @@ -416,8 +416,10 @@ describe('unified enclave executor accounting', () => { it('buckets an enclave engine failure identically to a rejected repository', async () => { async function run(runner: Record, seedMap: Map) { let now = 0; + const audit = { failure: jest.fn(), invocation: jest.fn() }; const broker = agentBroker({ seedMap, + audit, ledger: { tryDebit: () => true }, clock: { nowMs: () => now, sleep: async (ms: number) => { now += ms; } }, runner, @@ -429,7 +431,7 @@ describe('unified enclave executor accounting', () => { }); let result = ''; await broker.handle(validAgentArguments, (value: string) => { result = value; }); - return { now, result }; + return { audit, now, result }; } const engineFailure = await run( { runScriptContainer: async () => ({ exitCode: 24, timedOut: false }) }, @@ -439,6 +441,11 @@ describe('unified enclave executor accounting', () => { expect(engineFailure.result).toBe(CANONICAL_ERROR_RESPONSE_JSON); expect(unknownRepo.result).toBe(CANONICAL_ERROR_RESPONSE_JSON); expect(engineFailure.now).toBe(unknownRepo.now); + expect(engineFailure.audit.failure).toHaveBeenCalledWith( + expect.any(String), + 'enclave-engine-failed', + 'exit=24', + ); }); it('never leaks an enclave workspace when preservation and teardown are wired', async () => { From e308b738b0e189e122696fb4cfb02188a47f38c5 Mon Sep 17 00:00:00 2001 From: Landon Cox Date: Wed, 26 Aug 2026 17:16:59 -0700 Subject: [PATCH 2/9] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- containers/enclave/agent-entrypoint.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/containers/enclave/agent-entrypoint.py b/containers/enclave/agent-entrypoint.py index 8b2d1281b..daa4406a3 100644 --- a/containers/enclave/agent-entrypoint.py +++ b/containers/enclave/agent-entrypoint.py @@ -153,6 +153,8 @@ def preflight_path( error_number = errno.EISDIR if is_directory else errno.ENOTDIR return OSError(error_number, os.strerror(error_number)) if executable and not metadata["executable"]: + if is_directory: + return PermissionError(errno.EACCES, os.strerror(errno.EACCES)) return OSError(errno.ENOEXEC, os.strerror(errno.ENOEXEC)) if writable and not metadata["writable"]: return PermissionError(errno.EACCES, os.strerror(errno.EACCES)) From d6bb4ba66e66080ee516c82ae79baef60ec4f949 Mon Sep 17 00:00:00 2001 From: Landon Cox Date: Wed, 26 Aug 2026 17:17:09 -0700 Subject: [PATCH 3/9] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- containers/enclave/agent-entrypoint.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/containers/enclave/agent-entrypoint.py b/containers/enclave/agent-entrypoint.py index daa4406a3..02fd65445 100644 --- a/containers/enclave/agent-entrypoint.py +++ b/containers/enclave/agent-entrypoint.py @@ -306,13 +306,13 @@ def main() -> int: ("copilot-directory", AGENT_DIR / "copilot"), ("copilot-log-directory", AGENT_DIR / "copilot-logs"), ] - try: - for _, path in runtime_paths: + for identifier, path in runtime_paths: + try: path.mkdir(mode=0o700, exist_ok=True) - except OSError as error: - safe_os_error(error, "runtime-path-creation") - append_event({"event": "failure", "category": "engine-failed"}) - return EXIT_ENGINE_FAILED + except OSError as error: + safe_os_error(error, f"runtime-path-creation-{identifier}") + append_event({"event": "failure", "category": "engine-failed"}) + return EXIT_ENGINE_FAILED copilot_logs = runtime_paths[-1][1] append_progress( "runtime-paths-ready", From 3c0c5d1e97a189da435b8a0cc73d5136b4c2315e Mon Sep 17 00:00:00 2001 From: Landon Cox Date: Wed, 26 Aug 2026 17:17:18 -0700 Subject: [PATCH 4/9] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- containers/enclave/agent-entrypoint.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/containers/enclave/agent-entrypoint.py b/containers/enclave/agent-entrypoint.py index 02fd65445..3d186218d 100644 --- a/containers/enclave/agent-entrypoint.py +++ b/containers/enclave/agent-entrypoint.py @@ -374,7 +374,10 @@ def main() -> int: try: process_stdout, process_stderr = process.communicate(timeout=remaining) except subprocess.TimeoutExpired: - os.killpg(process.pid, signal.SIGKILL) + try: + os.killpg(process.pid, signal.SIGKILL) + except ProcessLookupError: + pass process_stdout, process_stderr = process.communicate() append_event({ "event": "engine-result", From 0ec2cf8e1334c0342638bc78f592775118555f69 Mon Sep 17 00:00:00 2001 From: Landon Cox Date: Wed, 26 Aug 2026 17:34:31 -0700 Subject: [PATCH 5/9] ci: compile workflows with enclave-compatible gh-aw Build the exact gh-aw revision used by the agent-enclave workflow so supply-chain compilation recognizes its GitHub capability configuration. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e552ccd0-4793-480a-bcf9-da6172693e60 --- .github/workflows/supply-chain-scan.yml | 26 ++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/.github/workflows/supply-chain-scan.yml b/.github/workflows/supply-chain-scan.yml index f5400190f..e4a203f0c 100644 --- a/.github/workflows/supply-chain-scan.yml +++ b/.github/workflows/supply-chain-scan.yml @@ -57,10 +57,30 @@ jobs: with: persist-credentials: false - - name: Install gh-aw - uses: github/gh-aw-actions/setup-cli@2a78d04403fdc6907d0f05327cffac9dbad5312d # v0.87.5 + - name: Checkout enclave-compatible gh-aw compiler + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + repository: github/gh-aw + ref: 1cf55bdc4f19e5f371b1e7fe888df649695ee48a + path: .tmp/gh-aw-compiler + persist-credentials: false + + - name: Set up Go + uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0 with: - version: v0.87.5 + go-version-file: .tmp/gh-aw-compiler/go.mod + cache: false + + - name: Install enclave-compatible gh-aw + run: | + mkdir -p "$HOME/.local/share/gh/extensions/gh-aw" + go build \ + -C .tmp/gh-aw-compiler \ + -ldflags="-X main.version=v0.87.5-108-g1cf55bdc4f -X main.isRelease=true" \ + -o "$HOME/.local/share/gh/extensions/gh-aw/gh-aw" \ + ./cmd/gh-aw + rm -rf .tmp/gh-aw-compiler + gh aw version - name: Compile + generate SBOMs (Syft) env: From cfe7041f3ee2a092684cb4a0b9e6586eb7873247 Mon Sep 17 00:00:00 2001 From: Landon Cox Date: Wed, 26 Aug 2026 18:06:25 -0700 Subject: [PATCH 6/9] Fix enclave MCP image CVE scan Upgrade Alpine runtime packages before installing docker-cli so the enclave MCP server picks up patched OpenSSL packages. Remove the obsolete version-scoped CVE exception. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e552ccd0-4793-480a-bcf9-da6172693e60 --- .grype.yaml | 28 ---------------------------- containers/enclave/Dockerfile | 3 ++- 2 files changed, 2 insertions(+), 29 deletions(-) diff --git a/.grype.yaml b/.grype.yaml index 24f6a495f..8ada87dbd 100644 --- a/.grype.yaml +++ b/.grype.yaml @@ -10,34 +10,6 @@ # Format reference: https://github.com/anchore/grype?tab=readme-ov-file#configuration ignore: - # ── OpenSSL 3.5.7 QUIC server listener DoS ────────────────────────────────── - # - # CVE-2026-14456 (OpenSSL QUIC server pending-connection queue, HIGH): - # The affected path exists only in OpenSSL's QUIC server listener, where - # valid Initial packets can create unbounded pending connection objects. - # - # Risk acceptance — NOT REACHABLE in AWF images: - # The affected images use libssl for client-side HTTPS/TLS or conventional - # TCP servers. They do not create OpenSSL QUIC listeners or expose UDP - # services, so attacker-controlled QUIC Initial packets cannot reach the - # vulnerable listener path. - # - # No fixed Alpine 3.24 package is available today: libcrypto3/libssl3 - # 3.5.7-r0 is current and Grype reports no fixed package. Revisit when - # Alpine publishes OpenSSL >= 3.5.8, then rebuild the images and delete - # these version-scoped exceptions. - # Advisory: https://security.alpinelinux.org/vuln/CVE-2026-14456 - - vulnerability: CVE-2026-14456 - package: - name: libcrypto3 - version: "3.5.7-r0" - type: apk - - vulnerability: CVE-2026-14456 - package: - name: libssl3 - version: "3.5.7-r0" - type: apk - # ── Node.js 22.23.2 Permission Model false positive ─────────────────────────── # # CVE-2026-58043 (Node.js Permission Model path matching, HIGH): diff --git a/containers/enclave/Dockerfile b/containers/enclave/Dockerfile index 79650f61e..1b6fd45fb 100644 --- a/containers/enclave/Dockerfile +++ b/containers/enclave/Dockerfile @@ -47,7 +47,8 @@ RUN chmod 0555 /usr/local/bin/run-enclave-agent /usr/local/bin/gh \ FROM node:22.23.2-alpine3.24 AS enclave-mcp-server -RUN apk add --no-cache docker-cli \ +RUN apk upgrade --no-cache \ + && apk add --no-cache docker-cli \ && test -x /usr/bin/docker \ && rm -rf /usr/local/lib/node_modules/npm \ && rm -f /usr/local/bin/npm /usr/local/bin/npx /usr/local/bin/corepack From 4943943f3710228a188f1991785196700ce8d1cf Mon Sep 17 00:00:00 2001 From: Landon Cox Date: Wed, 26 Aug 2026 18:28:29 -0700 Subject: [PATCH 7/9] Upgrade Alpine packages across scanned images Apply current Alpine security updates to every affected image stage so the blocking Grype gate sees patched OpenSSL 3.5.8 packages consistently. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e552ccd0-4793-480a-bcf9-da6172693e60 --- containers/api-proxy/Dockerfile | 5 +++-- containers/cli-proxy/Dockerfile | 9 +++++---- containers/enclave/Dockerfile | 3 ++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/containers/api-proxy/Dockerfile b/containers/api-proxy/Dockerfile index db0e7e068..45a8ff12c 100644 --- a/containers/api-proxy/Dockerfile +++ b/containers/api-proxy/Dockerfile @@ -2,8 +2,9 @@ # Routes through Squid to respect domain whitelisting FROM node:22.23.2-alpine3.24 -# Install curl for healthchecks (>=8.21.0-r0 to fix CVE in 8.20.x) -RUN apk add --no-cache "curl>=8.21.0-r0" +# Install current Alpine security updates and curl for healthchecks. +RUN apk upgrade --no-cache \ + && apk add --no-cache "curl>=8.21.0-r0" # Replace the vulnerable npm 10.x bundled with Node 22.23.2 with npm 11.18.0. # npm 11.18.0 bundles: tar 7.5.19 (fixes GHSA-23hp-3jrh-7fpw/GHSA-8x88-c5mf-7j5w), diff --git a/containers/cli-proxy/Dockerfile b/containers/cli-proxy/Dockerfile index bf414ef18..a09a348a3 100644 --- a/containers/cli-proxy/Dockerfile +++ b/containers/cli-proxy/Dockerfile @@ -26,10 +26,11 @@ FROM node:22.23.2-alpine3.24 # (Alpine 3.24 ships 8.20.0-r1 by default; the constraint forces the patched build). # The alpine community repo includes github-cli — we replace it below with the # official release binary to control the exact Go toolchain and module versions. -RUN apk add --no-cache \ - "curl>=8.21.0-r0" \ - ca-certificates \ - bash +RUN apk upgrade --no-cache \ + && apk add --no-cache \ + "curl>=8.21.0-r0" \ + ca-certificates \ + bash # Build the pinned GitHub CLI release with the patched Go toolchain. COPY --from=gh-build /tmp/cli-2.97.0/bin/gh /usr/local/bin/gh diff --git a/containers/enclave/Dockerfile b/containers/enclave/Dockerfile index 1b6fd45fb..3829562d5 100644 --- a/containers/enclave/Dockerfile +++ b/containers/enclave/Dockerfile @@ -2,7 +2,8 @@ FROM python:3.14.7-alpine3.24 AS enclave-script -RUN python3 -c 'import json, pathlib, sys; sys.exit(0)' \ +RUN apk upgrade --no-cache \ + && python3 -c 'import json, pathlib, sys; sys.exit(0)' \ && test -x /usr/local/bin/python3 \ && rm -f /sbin/apk COPY enclave/script-entrypoint.py /usr/local/bin/run-enclave-script From 2a706e66aa62caa39893f9d45d73bd1da1e63436 Mon Sep 17 00:00:00 2001 From: Landon Cox Date: Wed, 26 Aug 2026 20:56:55 -0700 Subject: [PATCH 8/9] Fix enclave transcript bounds test buffer Allow the Python harness JSON wrapper to exceed Node's default 1 MiB spawnSync buffer while continuing to assert the protected transcript itself stays within its 1 MiB limit. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e552ccd0-4793-480a-bcf9-da6172693e60 --- src/enclave/agent-entrypoint-diagnostics.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/enclave/agent-entrypoint-diagnostics.test.ts b/src/enclave/agent-entrypoint-diagnostics.test.ts index 080f6d07a..37f58a9aa 100644 --- a/src/enclave/agent-entrypoint-diagnostics.test.ts +++ b/src/enclave/agent-entrypoint-diagnostics.test.ts @@ -117,6 +117,7 @@ function runHarness(scenario: string): HarnessResult { try { const result = spawnSync('python3', ['-c', harness], { encoding: 'utf8', + maxBuffer: 8 * 1024 * 1024, env: { ...process.env, ENTRYPOINT: entrypoint, From 1dd8e6511f25e38b9b9244970c088c3935434229 Mon Sep 17 00:00:00 2001 From: Landon Cox Date: Wed, 26 Aug 2026 21:46:40 -0700 Subject: [PATCH 9/9] Recompile enclave Issues smoke workflow Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/aw/actions-lock.json | 5 ++ .../smoke-enclave-issues-read.lock.yml | 63 ++++++++----------- .../workflows/smoke-enclave-issues-read.md | 4 +- 3 files changed, 34 insertions(+), 38 deletions(-) diff --git a/.github/aw/actions-lock.json b/.github/aw/actions-lock.json index 4a5d91118..86792196e 100644 --- a/.github/aw/actions-lock.json +++ b/.github/aw/actions-lock.json @@ -80,6 +80,11 @@ "version": "1cf55bdc4f19e5f371b1e7fe888df649695ee48a", "sha": "1cf55bdc4f19e5f371b1e7fe888df649695ee48a" }, + "github/gh-aw/actions/setup@b5db66ca43a7614d7d3efd248dfe7323f3080baa": { + "repo": "github/gh-aw/actions/setup", + "version": "b5db66ca43a7614d7d3efd248dfe7323f3080baa", + "sha": "b5db66ca43a7614d7d3efd248dfe7323f3080baa" + }, "github/gh-aw/actions/setup@v0.87.5": { "repo": "github/gh-aw/actions/setup", "version": "v0.87.5", diff --git a/.github/workflows/smoke-enclave-issues-read.lock.yml b/.github/workflows/smoke-enclave-issues-read.lock.yml index 2380753a1..d67e8e0c5 100644 --- a/.github/workflows/smoke-enclave-issues-read.lock.yml +++ b/.github/workflows/smoke-enclave-issues-read.lock.yml @@ -1,5 +1,5 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"2339cbbf8a0973a5cc6f6a2cb8b3166ffb1bcc8880186b882fbc1c86ede67881","body_hash":"2da025901e8f70a0197dd99c6f702a98be6386e13d4b5ef64f2126e32847136a","compiler_version":"v0.87.5-108-g1cf55bdc4f","agent_id":"copilot","engine_versions":{"copilot":"1.0.34"}} -# gh-aw-manifest: {"version":1,"secrets":["GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw/actions/setup","sha":"1cf55bdc4f19e5f371b1e7fe888df649695ee48a","version":"1cf55bdc4f19e5f371b1e7fe888df649695ee48a"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.8","digest":"sha256:0a94ad1b9976881fb88ba5db3aa6f4f26b91535a1b00986799fe87cdbe6105f9","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.8@sha256:0a94ad1b9976881fb88ba5db3aa6f4f26b91535a1b00986799fe87cdbe6105f9"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.8","digest":"sha256:531fb75f54c07d66200be6973033db98838d9e838316549fd9af09329a56b848","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.8@sha256:531fb75f54c07d66200be6973033db98838d9e838316549fd9af09329a56b848"},{"image":"ghcr.io/github/gh-aw-firewall/enclave-agent:0.28.8","digest":"sha256:d76fc00b001352d0ec59fb539aec953006ff9a4e7741caf7f6942249b68f1c79","pinned_image":"ghcr.io/github/gh-aw-firewall/enclave-agent:0.28.8@sha256:d76fc00b001352d0ec59fb539aec953006ff9a4e7741caf7f6942249b68f1c79"},{"image":"ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.8","digest":"sha256:1539f71876901ce293e255a3fe89a3ce1a1eaabc3a66fd6458614edbad011b96","pinned_image":"ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.8@sha256:1539f71876901ce293e255a3fe89a3ce1a1eaabc3a66fd6458614edbad011b96"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.8","digest":"sha256:9ede51772d89f6c70049753e36c62d5e3690e3cbd0fef327eb6c1fdd22c61b73","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.8@sha256:9ede51772d89f6c70049753e36c62d5e3690e3cbd0fef327eb6c1fdd22c61b73"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.11","digest":"sha256:ebde80f4652332211accb3e316eaa0b048704f51916899c88a1ace5cf01bad1d","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.11@sha256:ebde80f4652332211accb3e316eaa0b048704f51916899c88a1ace5cf01bad1d"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b","pinned_image":"ghcr.io/github/gh-aw-node@sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b"},{"image":"ghcr.io/github/github-mcp-server:v1.10.1","digest":"sha256:1817b57d43916532dc002bdc5f344d639bd9fb54a9148d42168458f7c3280567","pinned_image":"ghcr.io/github/github-mcp-server:v1.10.1@sha256:1817b57d43916532dc002bdc5f344d639bd9fb54a9148d42168458f7c3280567"}],"mcp_servers":[{"name":"awf-enclave","tools":["*"]},{"name":"github","tools":["get_me"]},{"name":"safeoutputs","tools":["create_issue","missing_data","missing_tool","noop"]}]} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"72314c86cc03de59da29cabc8e62f93434cdb219d8103c6f091457383162efff","body_hash":"2da025901e8f70a0197dd99c6f702a98be6386e13d4b5ef64f2126e32847136a","compiler_version":"v0.87.5-132-gb5db66ca43","agent_id":"copilot","engine_versions":{"copilot":"1.0.34"}} +# gh-aw-manifest: {"version":1,"secrets":["GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw/actions/setup","sha":"b5db66ca43a7614d7d3efd248dfe7323f3080baa","version":"b5db66ca43a7614d7d3efd248dfe7323f3080baa"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.9","digest":"sha256:54b2fb3068efc15a4cc1bd4033f8fa056a9b1779baeba0cb80ae95ea55e7e343","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.9@sha256:54b2fb3068efc15a4cc1bd4033f8fa056a9b1779baeba0cb80ae95ea55e7e343"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.9","digest":"sha256:a0ffb1dc926c6e5a500b336893e032a8f167d3db43c869be886874ef14280bb8","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.9@sha256:a0ffb1dc926c6e5a500b336893e032a8f167d3db43c869be886874ef14280bb8"},{"image":"ghcr.io/github/gh-aw-firewall/enclave-agent:0.28.9","digest":"sha256:8d548153f18d9b44406bebe3f71e2e080c15c89cbf8c0f72e8aa7bc0681efcf2","pinned_image":"ghcr.io/github/gh-aw-firewall/enclave-agent:0.28.9@sha256:8d548153f18d9b44406bebe3f71e2e080c15c89cbf8c0f72e8aa7bc0681efcf2"},{"image":"ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.9","digest":"sha256:9edfa59fe0cf96f86c0be2f3280743a95032cf730526a204f729a06fbe7e4727","pinned_image":"ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.9@sha256:9edfa59fe0cf96f86c0be2f3280743a95032cf730526a204f729a06fbe7e4727"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.9","digest":"sha256:3d5dba0b0a139bbb11b5d5b8b44f277d2b18f69cf43090e3c283d750cf864baa","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.9@sha256:3d5dba0b0a139bbb11b5d5b8b44f277d2b18f69cf43090e3c283d750cf864baa"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.12","digest":"sha256:92d5377b6bd32cd5b9306b2a553f7ef3549bccff9207e46f931e7249bc718713","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.12@sha256:92d5377b6bd32cd5b9306b2a553f7ef3549bccff9207e46f931e7249bc718713"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b","pinned_image":"ghcr.io/github/gh-aw-node@sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b"},{"image":"ghcr.io/github/github-mcp-server:v1.10.1","digest":"sha256:1817b57d43916532dc002bdc5f344d639bd9fb54a9148d42168458f7c3280567","pinned_image":"ghcr.io/github/github-mcp-server:v1.10.1@sha256:1817b57d43916532dc002bdc5f344d639bd9fb54a9148d42168458f7c3280567"}],"mcp_servers":[{"name":"awf-enclave","tools":["*"]},{"name":"github","tools":["get_me"]},{"name":"safeoutputs","tools":["create_issue","missing_data","missing_tool","noop"]}]} # This file was automatically generated by gh-aw. DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # # ___ _ _ @@ -41,15 +41,15 @@ # - actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 # - actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 (source v9) # - actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 -# - github/gh-aw/actions/setup@1cf55bdc4f19e5f371b1e7fe888df649695ee48a # 1cf55bdc4f19e5f371b1e7fe888df649695ee48a +# - github/gh-aw/actions/setup@b5db66ca43a7614d7d3efd248dfe7323f3080baa # b5db66ca43a7614d7d3efd248dfe7323f3080baa # # Container images used: -# - ghcr.io/github/gh-aw-firewall/agent:0.28.8@sha256:0a94ad1b9976881fb88ba5db3aa6f4f26b91535a1b00986799fe87cdbe6105f9 -# - ghcr.io/github/gh-aw-firewall/api-proxy:0.28.8@sha256:531fb75f54c07d66200be6973033db98838d9e838316549fd9af09329a56b848 -# - ghcr.io/github/gh-aw-firewall/enclave-agent:0.28.8@sha256:d76fc00b001352d0ec59fb539aec953006ff9a4e7741caf7f6942249b68f1c79 -# - ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.8@sha256:1539f71876901ce293e255a3fe89a3ce1a1eaabc3a66fd6458614edbad011b96 -# - ghcr.io/github/gh-aw-firewall/squid:0.28.8@sha256:9ede51772d89f6c70049753e36c62d5e3690e3cbd0fef327eb6c1fdd22c61b73 -# - ghcr.io/github/gh-aw-mcpg:v0.4.11@sha256:ebde80f4652332211accb3e316eaa0b048704f51916899c88a1ace5cf01bad1d +# - ghcr.io/github/gh-aw-firewall/agent:0.28.9@sha256:54b2fb3068efc15a4cc1bd4033f8fa056a9b1779baeba0cb80ae95ea55e7e343 +# - ghcr.io/github/gh-aw-firewall/api-proxy:0.28.9@sha256:a0ffb1dc926c6e5a500b336893e032a8f167d3db43c869be886874ef14280bb8 +# - ghcr.io/github/gh-aw-firewall/enclave-agent:0.28.9@sha256:8d548153f18d9b44406bebe3f71e2e080c15c89cbf8c0f72e8aa7bc0681efcf2 +# - ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.9@sha256:9edfa59fe0cf96f86c0be2f3280743a95032cf730526a204f729a06fbe7e4727 +# - ghcr.io/github/gh-aw-firewall/squid:0.28.9@sha256:3d5dba0b0a139bbb11b5d5b8b44f277d2b18f69cf43090e3c283d750cf864baa +# - ghcr.io/github/gh-aw-mcpg:v0.4.12@sha256:92d5377b6bd32cd5b9306b2a553f7ef3549bccff9207e46f931e7249bc718713 # - ghcr.io/github/gh-aw-node@sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b # - ghcr.io/github/github-mcp-server:v1.10.1@sha256:1817b57d43916532dc002bdc5f344d639bd9fb54a9148d42168458f7c3280567 @@ -103,7 +103,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw/actions/setup@1cf55bdc4f19e5f371b1e7fe888df649695ee48a # 1cf55bdc4f19e5f371b1e7fe888df649695ee48a + uses: github/gh-aw/actions/setup@b5db66ca43a7614d7d3efd248dfe7323f3080baa # b5db66ca43a7614d7d3efd248dfe7323f3080baa with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} @@ -112,7 +112,7 @@ jobs: GH_AW_SETUP_WORKFLOW_NAME: "Smoke Enclave Issues Read" GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/smoke-enclave-issues-read.lock.yml@${{ github.ref }} GH_AW_INFO_VERSION: "1.0.34" - GH_AW_INFO_AWF_VERSION: "v0.28.8" + GH_AW_INFO_AWF_VERSION: "v0.28.9" GH_AW_INFO_ENGINE_ID: "copilot" - name: Generate agentic run info id: generate_aw_info @@ -128,8 +128,8 @@ jobs: GH_AW_INFO_STAGED: "false" GH_AW_INFO_ALLOWED_DOMAINS: '["defaults","github"]' GH_AW_INFO_FIREWALL_ENABLED: "true" - GH_AW_INFO_AWF_VERSION: "v0.28.8" - GH_AW_INFO_AWMG_VERSION: "v0.4.11" + GH_AW_INFO_AWF_VERSION: "v0.28.9" + GH_AW_INFO_AWMG_VERSION: "v0.4.12" GH_AW_INFO_FIREWALL_TYPE: "squid" GH_AW_INFO_AGENT_RUNTIME: "" GH_AW_COMPILED_STRICT: "false" @@ -394,7 +394,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw/actions/setup@1cf55bdc4f19e5f371b1e7fe888df649695ee48a # 1cf55bdc4f19e5f371b1e7fe888df649695ee48a + uses: github/gh-aw/actions/setup@b5db66ca43a7614d7d3efd248dfe7323f3080baa # b5db66ca43a7614d7d3efd248dfe7323f3080baa with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} @@ -404,7 +404,7 @@ jobs: GH_AW_SETUP_WORKFLOW_NAME: "Smoke Enclave Issues Read" GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/smoke-enclave-issues-read.lock.yml@${{ github.ref }} GH_AW_INFO_VERSION: "1.0.34" - GH_AW_INFO_AWF_VERSION: "v0.28.8" + GH_AW_INFO_AWF_VERSION: "v0.28.9" GH_AW_INFO_ENGINE_ID: "copilot" - name: Set runtime paths id: set-runtime-paths @@ -459,7 +459,7 @@ jobs: env: GH_HOST: github.com - name: Install AWF binary - run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.28.8 --rootless + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.28.9 --rootless - name: Determine automatic lockdown mode for GitHub MCP Server id: determine-automatic-lockdown uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 (source v9) @@ -488,16 +488,7 @@ jobs: GH_AW_SKILL_DIR: ".github/skills" run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_inline_skills.sh" - name: Download container images - run: | - bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" \ - ghcr.io/github/gh-aw-firewall/agent:0.28.8@sha256:0a94ad1b9976881fb88ba5db3aa6f4f26b91535a1b00986799fe87cdbe6105f9 \ - ghcr.io/github/gh-aw-firewall/api-proxy:0.28.8@sha256:531fb75f54c07d66200be6973033db98838d9e838316549fd9af09329a56b848 \ - ghcr.io/github/gh-aw-firewall/enclave-agent:0.28.8@sha256:d76fc00b001352d0ec59fb539aec953006ff9a4e7741caf7f6942249b68f1c79 \ - ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.8@sha256:1539f71876901ce293e255a3fe89a3ce1a1eaabc3a66fd6458614edbad011b96 \ - ghcr.io/github/gh-aw-firewall/squid:0.28.8@sha256:9ede51772d89f6c70049753e36c62d5e3690e3cbd0fef327eb6c1fdd22c61b73 \ - ghcr.io/github/gh-aw-mcpg:v0.4.11@sha256:ebde80f4652332211accb3e316eaa0b048704f51916899c88a1ace5cf01bad1d \ - ghcr.io/github/gh-aw-node@sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b \ - ghcr.io/github/github-mcp-server:v1.10.1@sha256:1817b57d43916532dc002bdc5f344d639bd9fb54a9148d42168458f7c3280567 + run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.28.9@sha256:54b2fb3068efc15a4cc1bd4033f8fa056a9b1779baeba0cb80ae95ea55e7e343 ghcr.io/github/gh-aw-firewall/api-proxy:0.28.9@sha256:a0ffb1dc926c6e5a500b336893e032a8f167d3db43c869be886874ef14280bb8 ghcr.io/github/gh-aw-firewall/enclave-agent:0.28.9@sha256:8d548153f18d9b44406bebe3f71e2e080c15c89cbf8c0f72e8aa7bc0681efcf2 ghcr.io/github/gh-aw-firewall/enclave-mcp-server:0.28.9@sha256:9edfa59fe0cf96f86c0be2f3280743a95032cf730526a204f729a06fbe7e4727 ghcr.io/github/gh-aw-firewall/squid:0.28.9@sha256:3d5dba0b0a139bbb11b5d5b8b44f277d2b18f69cf43090e3c283d750cf864baa ghcr.io/github/gh-aw-mcpg:v0.4.12@sha256:92d5377b6bd32cd5b9306b2a553f7ef3549bccff9207e46f931e7249bc718713 ghcr.io/github/gh-aw-node@sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b ghcr.io/github/github-mcp-server:v1.10.1@sha256:1817b57d43916532dc002bdc5f344d639bd9fb54a9148d42168458f7c3280567 - name: Prepare Safe Outputs Directories run: | mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs" @@ -660,7 +651,8 @@ jobs: GITHUB_ENTERPRISE_HOST: ${{ env.GITHUB_ENTERPRISE_HOST }} GITHUB_GRAPHQL_URL: ${{ env.GITHUB_GRAPHQL_URL }} GITHUB_COPILOT_BASE_URL: ${{ env.GITHUB_COPILOT_BASE_URL }} - ENCLAVE_GITHUB_PROXY_IMAGE: 'ghcr.io/github/gh-aw-mcpg:v0.4.11' + ENCLAVE_GITHUB_PROXY_IMAGE: 'ghcr.io/github/gh-aw-mcpg:v0.4.12' + ENCLAVE_GITHUB_PROXY_ALIAS: awf-enclave-github-proxy ENCLAVE_GITHUB_PROXY_POLICY_TEMPLATE: '{"version":1,"workflow_run_id":"","profile":"issues-read-v1","audience":"gh-aw-enclave-github","repositories":[{"repo":"github/gh-aw","sensitivity":"internal"}],"public_min_integrity":"approved","allowed_operations":["issues.comments.list","issues.get","issues.list"],"max_capability_ttl_seconds":600}' run: | bash "${RUNNER_TEMP}/gh-aw/actions/start_enclave_github_proxy.sh" @@ -706,6 +698,7 @@ jobs: # The eager checker runs inside start_mcp_gateway.cjs in this step. export GH_AW_MCP_DEFERRED_SERVERS="awf-enclave" { + printf '%s=%s\n' MCP_GATEWAY_API_KEY "$MCP_GATEWAY_API_KEY" printf '%s=%s\n' AWF_ENCLAVE_MCP_CAPABILITY "$AWF_ENCLAVE_MCP_CAPABILITY" printf '%s=%s\n' AWF_ENCLAVE_MCP_GATEWAY_IDENTITY "$AWF_ENCLAVE_MCP_GATEWAY_IDENTITY" printf '%s=%s\n' AWF_ENCLAVE_MCP_GATEWAY_CONTAINER "$AWF_ENCLAVE_MCP_GATEWAY_CONTAINER" @@ -718,7 +711,7 @@ jobs: MCP_GATEWAY_UID=$(id -u 2>/dev/null || echo '0') MCP_GATEWAY_GID=$(id -g 2>/dev/null || echo '0') source "${RUNNER_TEMP}/gh-aw/actions/resolve_docker_socket_gid.sh" - export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network bridge -p 127.0.0.1:'"${MCP_GATEWAY_PORT}"':'"${MCP_GATEWAY_PORT}"' --name awmg-mcpg --label com.github.gh-aw.mcpg.run='"${AWF_ENCLAVE_MCP_GATEWAY_IDENTITY}"' --add-host host.docker.internal:host-gateway --user '"${MCP_GATEWAY_UID}"':'"${MCP_GATEWAY_GID}"' --group-add '"${DOCKER_SOCK_GID}"' -v '"${DOCKER_SOCK_PATH}"':/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DOCKER_HOST=unix:///var/run/docker.sock -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_POLICY_ALLOW_CREATE_PULL_REQUEST -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GH_AW_SINK_VISIBILITY -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e RUNNER_TEMP -e RUNNER_TOOL_CACHE -e MCP_GATEWAY_ALLOWED_MOUNT_ROOTS -e AWF_ENCLAVE_MCP_CAPABILITY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw -v '"${RUNNER_TEMP}"'/gh-aw/safeoutputs:'"${RUNNER_TEMP}"'/gh-aw/safeoutputs:rw ghcr.io/github/gh-aw-mcpg:v0.4.11' + export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network bridge -p 127.0.0.1:'"${MCP_GATEWAY_PORT}"':'"${MCP_GATEWAY_PORT}"' --name awmg-mcpg --label com.github.gh-aw.mcpg.run='"${AWF_ENCLAVE_MCP_GATEWAY_IDENTITY}"' --add-host host.docker.internal:host-gateway --user '"${MCP_GATEWAY_UID}"':'"${MCP_GATEWAY_GID}"' --group-add '"${DOCKER_SOCK_GID}"' -v '"${DOCKER_SOCK_PATH}"':/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DOCKER_HOST=unix:///var/run/docker.sock -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_POLICY_ALLOW_CREATE_PULL_REQUEST -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GH_AW_SINK_VISIBILITY -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e RUNNER_TEMP -e RUNNER_TOOL_CACHE -e MCP_GATEWAY_ALLOWED_MOUNT_ROOTS -e AWF_ENCLAVE_MCP_CAPABILITY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw -v '"${RUNNER_TEMP}"'/gh-aw/safeoutputs:'"${RUNNER_TEMP}"'/gh-aw/safeoutputs:rw ghcr.io/github/gh-aw-mcpg:v0.4.12' mkdir -p "$HOME/.copilot" GH_AW_NODE=$(which node 2>/dev/null || command -v node 2>/dev/null || echo node) @@ -799,7 +792,6 @@ jobs: id: mount-mcp-clis continue-on-error: true env: - MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} MCP_GATEWAY_DOMAIN: ${{ steps.start-mcp-gateway.outputs.gateway-domain }} MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 @@ -848,7 +840,7 @@ jobs: export COPILOT_API_KEY="$COPILOT_DUMMY_BYOK" (umask 177 && touch /tmp/gh-aw/agent-stdio.log) GH_AW_MAX_AI_CREDITS="${GH_AW_MAX_AI_CREDITS:-1000}" - printf '%s\n' "{\"\$schema\":\"https://github.com/github/gh-aw-firewall/releases/download/v0.28.8/awf-config.schema.json\",\"network\":{\"allowDomains\":[\"*.githubusercontent.com\",\"api.github.com\",\"api.githubcopilot.com\",\"api.snapcraft.io\",\"archive.ubuntu.com\",\"azure.archive.ubuntu.com\",\"codeload.github.com\",\"crl.geotrust.com\",\"crl.globalsign.com\",\"crl.identrust.com\",\"crl.sectigo.com\",\"crl.thawte.com\",\"crl.usertrust.com\",\"crl.verisign.com\",\"crl3.digicert.com\",\"crl4.digicert.com\",\"crls.ssl.com\",\"docs.github.com\",\"github-cloud.githubusercontent.com\",\"github-cloud.s3.amazonaws.com\",\"github.blog\",\"github.com\",\"github.githubassets.com\",\"host.docker.internal\",\"json-schema.org\",\"json.schemastore.org\",\"keyserver.ubuntu.com\",\"lfs.github.com\",\"objects.githubusercontent.com\",\"ocsp.digicert.com\",\"ocsp.geotrust.com\",\"ocsp.globalsign.com\",\"ocsp.identrust.com\",\"ocsp.sectigo.com\",\"ocsp.ssl.com\",\"ocsp.thawte.com\",\"ocsp.usertrust.com\",\"ocsp.verisign.com\",\"packagecloud.io\",\"packages.cloud.google.com\",\"packages.microsoft.com\",\"patch-diff.githubusercontent.com\",\"patchdiff.githubusercontent.com\",\"ppa.launchpad.net\",\"raw.githubusercontent.com\",\"s.symcb.com\",\"s.symcd.com\",\"security.ubuntu.com\",\"ts-crl.ws.symantec.com\",\"ts-ocsp.ws.symantec.com\",\"www.googleapis.com\"],\"isolation\":true,\"topologyAttach\":[\"awmg-mcpg\"]},\"apiProxy\":{\"enabled\":true,\"enableTokenSteering\":true,\"maxRuns\":500,\"maxAiCredits\":${GH_AW_MAX_AI_CREDITS},\"maxCacheMisses\":5,\"models\":{\"agent\":[\"sonnet-6x\",\"gpt-5.4\",\"gpt-5.5\",\"gpt-5.6\",\"gpt-5.3\",\"gemini-pro\",\"any\"],\"antigravity\":[\"copilot/antigravity*\",\"google/antigravity*\",\"gemini/antigravity*\"],\"any\":[\"copilot/*\",\"anthropic/*\",\"openai/*\",\"google/*\",\"gemini/*\"],\"auto\":[\"copilot/auto\",\"large\"],\"claude\":[\"agent\"],\"codex\":[\"agent\"],\"coding\":[\"copilot/gpt-5*codex*\",\"openai/gpt-5*codex*\",\"gpt-5-codex\",\"kimi\"],\"computer-use\":[\"copilot/*computer-use*\",\"google/*computer-use*\",\"gemini/*computer-use*\",\"openai/*computer-use*\"],\"copilot\":[\"agent\"],\"deep-research\":[\"copilot/deep-research*\",\"copilot/o3-deep-research*\",\"copilot/o4-mini-deep-research*\",\"google/deep-research*\",\"gemini/deep-research*\",\"openai/o3-deep-research*\",\"openai/o4-mini-deep-research*\"],\"detection\":[\"small\"],\"evals\":[\"small\"],\"fable\":[\"copilot/*fable*\",\"anthropic/*fable*\"],\"gemini\":[\"agent\"],\"gemini-3-flash\":[\"copilot/gemini-3*flash*\",\"google/gemini-3*flash*\",\"gemini/gemini-3*flash*\"],\"gemini-3-pro\":[\"copilot/gemini-3*pro*\",\"google/gemini-3*pro*\",\"google/nano-banana*\",\"gemini/gemini-3*pro*\"],\"gemini-3.1-flash\":[\"copilot/gemini-3.1*flash*\",\"google/gemini-3.1*flash*\",\"gemini/gemini-3.1*flash*\"],\"gemini-3.1-pro\":[\"copilot/gemini-3.1*pro*\",\"google/gemini-3.1*pro*\",\"gemini/gemini-3.1*pro*\"],\"gemini-3.5-flash\":[\"copilot/gemini-3.5*flash*\",\"google/gemini-3.5*flash*\",\"gemini/gemini-3.5*flash*\"],\"gemini-3.6-flash\":[\"copilot/gemini-3.6*flash*\",\"google/gemini-3.6*flash*\",\"gemini/gemini-3.6*flash*\"],\"gemini-3.7-flash\":[\"copilot/gemini-3.7*flash*\",\"google/gemini-3.7*flash*\",\"gemini/gemini-3.7*flash*\"],\"gemini-flash\":[\"copilot/gemini-*flash*\",\"google/gemini-*flash*\",\"gemini/gemini-*flash*\"],\"gemini-flash-lite\":[\"copilot/gemini-*flash*lite*\",\"google/gemini-*flash*lite*\",\"gemini/gemini-*flash*lite*\"],\"gemini-omni\":[\"copilot/gemini-omni*\",\"google/gemini-omni*\",\"gemini/gemini-omni*\"],\"gemini-pro\":[\"copilot/gemini-*pro*\",\"google/gemini-*pro*\",\"gemini/gemini-*pro*\"],\"gemma\":[\"copilot/gemma*\",\"google/gemma*\",\"gemini/gemma*\"],\"gpt-5\":[\"copilot/gpt-5*\",\"openai/gpt-5*\"],\"gpt-5-codex\":[\"copilot/gpt-5*codex*\",\"openai/gpt-5*codex*\"],\"gpt-5-mini\":[\"copilot/gpt-5*mini*\",\"openai/gpt-5*mini*\"],\"gpt-5-nano\":[\"copilot/gpt-5*nano*\",\"openai/gpt-5*nano*\"],\"gpt-5-pro\":[\"copilot/gpt-5*pro*\",\"openai/gpt-5*pro*\"],\"gpt-5.1\":[\"copilot/gpt-5.1*\",\"openai/gpt-5.1*\"],\"gpt-5.2\":[\"copilot/gpt-5.2*\",\"openai/gpt-5.2*\"],\"gpt-5.3\":[\"copilot/gpt-5.3*\",\"openai/gpt-5.3*\"],\"gpt-5.4\":[\"copilot/gpt-5.4*\",\"openai/gpt-5.4*\"],\"gpt-5.5\":[\"copilot/gpt-5.5*\",\"openai/gpt-5.5*\"],\"gpt-5.6\":[\"copilot/gpt-5.6*\",\"openai/gpt-5.6*\"],\"grok\":[\"copilot/*grok*\",\"openai/*grok*\"],\"haiku\":[\"copilot/*haiku*\",\"anthropic/*haiku*\"],\"image-generation\":[\"copilot/gpt-image*\",\"openai/gpt-image*\",\"openai/chatgpt-image*\",\"copilot/gemini-*image*\",\"google/gemini-*image*\",\"gemini/gemini-*image*\",\"google/imagen*\"],\"kimi\":[\"copilot/kimi*\",\"openai/kimi*\"],\"kiwi\":[\"copilot/kiwi*\",\"openai/kiwi*\"],\"large\":[\"sonnet\",\"gpt-5-pro\",\"gpt-5\",\"gemini-pro\"],\"lyria\":[\"google/lyria*\",\"gemini/lyria*\",\"copilot/lyria*\"],\"mai-code\":[\"copilot/MAI-Code*\",\"copilot/mai-code*\",\"openai/MAI-Code*\"],\"mai-code-1-flash-picker\":[\"copilot/MAI-Code-1-Flash-picker*\",\"copilot/mai-code-1-flash-picker*\",\"openai/MAI-Code-1-Flash-picker*\"],\"mini\":[\"haiku\",\"gpt-5-mini\",\"gpt-5-nano\",\"gemini-flash-lite\"],\"nano-banana\":[\"copilot/nano-banana*\",\"google/nano-banana*\",\"gemini/nano-banana*\"],\"opus\":[\"copilot/*opus*\",\"anthropic/*opus*\"],\"opusplan\":[\"opus?effort=high\"],\"raptor-mini\":[\"copilot/raptor*\",\"openai/raptor*\"],\"reasoning\":[\"copilot/o1*\",\"copilot/o3*\",\"copilot/o4*\",\"openai/o1*\",\"openai/o3*\",\"openai/o4*\"],\"robotics\":[\"copilot/*robotics*\",\"google/*robotics*\",\"gemini/*robotics*\"],\"small\":[\"mini\"],\"small-agent\":[\"haiku\",\"gpt-5-mini\",\"gemini-flash\"],\"sonnet\":[\"copilot/*sonnet*\",\"anthropic/*sonnet*\"],\"sonnet-6x\":[\"copilot/*sonnet-4.5*\",\"copilot/*sonnet-4.6*\",\"copilot/*sonnet-5*\",\"copilot/*sonnet-4-5-*\",\"anthropic/*sonnet-4-5-*\",\"copilot/*sonnet-4-6*\",\"anthropic/*sonnet-4-6*\",\"anthropic/*sonnet-5*\"],\"summarization\":[\"haiku\",\"gpt-5-mini\",\"gemini-flash-lite\",\"mini\"],\"veo\":[\"google/veo*\",\"gemini/veo*\"],\"vision\":[\"copilot/gemini-*image*\",\"google/gemini-*image*\",\"gemini/gemini-*image*\",\"copilot/gemini-*flash*\",\"google/gemini-*flash*\",\"gemini/gemini-*flash*\"]}},\"enclaves\":[{\"agent\":{\"github\":{\"cli\":\"issues-read-v1\"},\"model\":\"gpt-5\"},\"repos\":[{\"repo\":\"github/gh-aw\",\"sensitivity\":\"internal\"}],\"timeout\":180}],\"container\":{\"imageTag\":\"0.28.8,squid=sha256:9ede51772d89f6c70049753e36c62d5e3690e3cbd0fef327eb6c1fdd22c61b73,agent=sha256:0a94ad1b9976881fb88ba5db3aa6f4f26b91535a1b00986799fe87cdbe6105f9,api-proxy=sha256:531fb75f54c07d66200be6973033db98838d9e838316549fd9af09329a56b848,cli-proxy=sha256:c10f37b8677fc208c052b57f9035c4ad1b08c76d8e6d9545ee24173e31e29023\"},\"logging\":{\"proxyLogsDir\":\"/tmp/gh-aw/sandbox/firewall/logs\",\"auditDir\":\"/tmp/gh-aw/sandbox/firewall/audit\"}}" > "${RUNNER_TEMP}/gh-aw/awf-config.json" + printf '%s\n' "{\"\$schema\":\"https://github.com/github/gh-aw-firewall/releases/download/v0.28.9/awf-config.schema.json\",\"network\":{\"allowDomains\":[\"*.githubusercontent.com\",\"api.github.com\",\"api.githubcopilot.com\",\"api.snapcraft.io\",\"archive.ubuntu.com\",\"azure.archive.ubuntu.com\",\"codeload.github.com\",\"crl.geotrust.com\",\"crl.globalsign.com\",\"crl.identrust.com\",\"crl.sectigo.com\",\"crl.thawte.com\",\"crl.usertrust.com\",\"crl.verisign.com\",\"crl3.digicert.com\",\"crl4.digicert.com\",\"crls.ssl.com\",\"docs.github.com\",\"github-cloud.githubusercontent.com\",\"github-cloud.s3.amazonaws.com\",\"github.blog\",\"github.com\",\"github.githubassets.com\",\"host.docker.internal\",\"json-schema.org\",\"json.schemastore.org\",\"keyserver.ubuntu.com\",\"lfs.github.com\",\"objects.githubusercontent.com\",\"ocsp.digicert.com\",\"ocsp.geotrust.com\",\"ocsp.globalsign.com\",\"ocsp.identrust.com\",\"ocsp.sectigo.com\",\"ocsp.ssl.com\",\"ocsp.thawte.com\",\"ocsp.usertrust.com\",\"ocsp.verisign.com\",\"packagecloud.io\",\"packages.cloud.google.com\",\"packages.microsoft.com\",\"patch-diff.githubusercontent.com\",\"patchdiff.githubusercontent.com\",\"ppa.launchpad.net\",\"raw.githubusercontent.com\",\"s.symcb.com\",\"s.symcd.com\",\"security.ubuntu.com\",\"ts-crl.ws.symantec.com\",\"ts-ocsp.ws.symantec.com\",\"www.googleapis.com\"],\"isolation\":true,\"topologyAttach\":[\"awmg-mcpg\"]},\"apiProxy\":{\"enabled\":true,\"enableTokenSteering\":true,\"maxRuns\":500,\"maxAiCredits\":${GH_AW_MAX_AI_CREDITS},\"maxCacheMisses\":5,\"models\":{\"agent\":[\"sonnet-6x\",\"gpt-5.4\",\"gpt-5.5\",\"gpt-5.6\",\"gpt-5.3\",\"gemini-pro\",\"any\"],\"antigravity\":[\"copilot/antigravity*\",\"google/antigravity*\",\"gemini/antigravity*\"],\"any\":[\"copilot/*\",\"anthropic/*\",\"openai/*\",\"google/*\",\"gemini/*\"],\"auto\":[\"copilot/auto\",\"large\"],\"claude\":[\"agent\"],\"codex\":[\"agent\"],\"coding\":[\"copilot/gpt-5*codex*\",\"openai/gpt-5*codex*\",\"gpt-5-codex\",\"kimi\"],\"computer-use\":[\"copilot/*computer-use*\",\"google/*computer-use*\",\"gemini/*computer-use*\",\"openai/*computer-use*\"],\"copilot\":[\"agent\"],\"deep-research\":[\"copilot/deep-research*\",\"copilot/o3-deep-research*\",\"copilot/o4-mini-deep-research*\",\"google/deep-research*\",\"gemini/deep-research*\",\"openai/o3-deep-research*\",\"openai/o4-mini-deep-research*\"],\"detection\":[\"small\"],\"evals\":[\"small\"],\"fable\":[\"copilot/*fable*\",\"anthropic/*fable*\"],\"gemini\":[\"agent\"],\"gemini-3-flash\":[\"copilot/gemini-3*flash*\",\"google/gemini-3*flash*\",\"gemini/gemini-3*flash*\"],\"gemini-3-pro\":[\"copilot/gemini-3*pro*\",\"google/gemini-3*pro*\",\"google/nano-banana*\",\"gemini/gemini-3*pro*\"],\"gemini-3.1-flash\":[\"copilot/gemini-3.1*flash*\",\"google/gemini-3.1*flash*\",\"gemini/gemini-3.1*flash*\"],\"gemini-3.1-pro\":[\"copilot/gemini-3.1*pro*\",\"google/gemini-3.1*pro*\",\"gemini/gemini-3.1*pro*\"],\"gemini-3.5-flash\":[\"copilot/gemini-3.5*flash*\",\"google/gemini-3.5*flash*\",\"gemini/gemini-3.5*flash*\"],\"gemini-3.6-flash\":[\"copilot/gemini-3.6*flash*\",\"google/gemini-3.6*flash*\",\"gemini/gemini-3.6*flash*\"],\"gemini-3.7-flash\":[\"copilot/gemini-3.7*flash*\",\"google/gemini-3.7*flash*\",\"gemini/gemini-3.7*flash*\"],\"gemini-flash\":[\"copilot/gemini-*flash*\",\"google/gemini-*flash*\",\"gemini/gemini-*flash*\"],\"gemini-flash-lite\":[\"copilot/gemini-*flash*lite*\",\"google/gemini-*flash*lite*\",\"gemini/gemini-*flash*lite*\"],\"gemini-omni\":[\"copilot/gemini-omni*\",\"google/gemini-omni*\",\"gemini/gemini-omni*\"],\"gemini-pro\":[\"copilot/gemini-*pro*\",\"google/gemini-*pro*\",\"gemini/gemini-*pro*\"],\"gemma\":[\"copilot/gemma*\",\"google/gemma*\",\"gemini/gemma*\"],\"gpt-5\":[\"copilot/gpt-5*\",\"openai/gpt-5*\"],\"gpt-5-codex\":[\"copilot/gpt-5*codex*\",\"openai/gpt-5*codex*\"],\"gpt-5-mini\":[\"copilot/gpt-5*mini*\",\"openai/gpt-5*mini*\"],\"gpt-5-nano\":[\"copilot/gpt-5*nano*\",\"openai/gpt-5*nano*\"],\"gpt-5-pro\":[\"copilot/gpt-5*pro*\",\"openai/gpt-5*pro*\"],\"gpt-5.1\":[\"copilot/gpt-5.1*\",\"openai/gpt-5.1*\"],\"gpt-5.2\":[\"copilot/gpt-5.2*\",\"openai/gpt-5.2*\"],\"gpt-5.3\":[\"copilot/gpt-5.3*\",\"openai/gpt-5.3*\"],\"gpt-5.4\":[\"copilot/gpt-5.4*\",\"openai/gpt-5.4*\"],\"gpt-5.5\":[\"copilot/gpt-5.5*\",\"openai/gpt-5.5*\"],\"gpt-5.6\":[\"copilot/gpt-5.6*\",\"openai/gpt-5.6*\"],\"grok\":[\"copilot/*grok*\",\"openai/*grok*\"],\"haiku\":[\"copilot/*haiku*\",\"anthropic/*haiku*\"],\"image-generation\":[\"copilot/gpt-image*\",\"openai/gpt-image*\",\"openai/chatgpt-image*\",\"copilot/gemini-*image*\",\"google/gemini-*image*\",\"gemini/gemini-*image*\",\"google/imagen*\"],\"kimi\":[\"copilot/kimi*\",\"openai/kimi*\"],\"kiwi\":[\"copilot/kiwi*\",\"openai/kiwi*\"],\"large\":[\"sonnet\",\"gpt-5-pro\",\"gpt-5\",\"gemini-pro\"],\"lyria\":[\"google/lyria*\",\"gemini/lyria*\",\"copilot/lyria*\"],\"mai-code\":[\"copilot/MAI-Code*\",\"copilot/mai-code*\",\"openai/MAI-Code*\"],\"mai-code-1-flash-picker\":[\"copilot/MAI-Code-1-Flash-picker*\",\"copilot/mai-code-1-flash-picker*\",\"openai/MAI-Code-1-Flash-picker*\"],\"mini\":[\"haiku\",\"gpt-5-mini\",\"gpt-5-nano\",\"gemini-flash-lite\"],\"nano-banana\":[\"copilot/nano-banana*\",\"google/nano-banana*\",\"gemini/nano-banana*\"],\"opus\":[\"copilot/*opus*\",\"anthropic/*opus*\"],\"opusplan\":[\"opus?effort=high\"],\"raptor-mini\":[\"copilot/raptor*\",\"openai/raptor*\"],\"reasoning\":[\"copilot/o1*\",\"copilot/o3*\",\"copilot/o4*\",\"openai/o1*\",\"openai/o3*\",\"openai/o4*\"],\"robotics\":[\"copilot/*robotics*\",\"google/*robotics*\",\"gemini/*robotics*\"],\"small\":[\"mini\"],\"small-agent\":[\"haiku\",\"gpt-5-mini\",\"gemini-flash\"],\"sonnet\":[\"copilot/*sonnet*\",\"anthropic/*sonnet*\"],\"sonnet-6x\":[\"copilot/*sonnet-4.5*\",\"copilot/*sonnet-4.6*\",\"copilot/*sonnet-5*\",\"copilot/*sonnet-4-5-*\",\"anthropic/*sonnet-4-5-*\",\"copilot/*sonnet-4-6*\",\"anthropic/*sonnet-4-6*\",\"anthropic/*sonnet-5*\"],\"summarization\":[\"haiku\",\"gpt-5-mini\",\"gemini-flash-lite\",\"mini\"],\"veo\":[\"google/veo*\",\"gemini/veo*\"],\"vision\":[\"copilot/gemini-*image*\",\"google/gemini-*image*\",\"gemini/gemini-*image*\",\"copilot/gemini-*flash*\",\"google/gemini-*flash*\",\"gemini/gemini-*flash*\"]}},\"enclaves\":[{\"agent\":{\"github\":{\"cli\":\"issues-read-v1\"},\"model\":\"gpt-5\"},\"repos\":[{\"repo\":\"github/gh-aw\",\"sensitivity\":\"internal\"}],\"timeout\":180}],\"container\":{\"imageTag\":\"0.28.9,squid=sha256:3d5dba0b0a139bbb11b5d5b8b44f277d2b18f69cf43090e3c283d750cf864baa,agent=sha256:54b2fb3068efc15a4cc1bd4033f8fa056a9b1779baeba0cb80ae95ea55e7e343,api-proxy=sha256:a0ffb1dc926c6e5a500b336893e032a8f167d3db43c869be886874ef14280bb8,cli-proxy=sha256:38d7ac0585ee5aa6a06eb71e087d514b059db36005c7783c6485e0dfd36fea35\"},\"logging\":{\"proxyLogsDir\":\"/tmp/gh-aw/sandbox/firewall/logs\",\"auditDir\":\"/tmp/gh-aw/sandbox/firewall/audit\"}}" > "${RUNNER_TEMP}/gh-aw/awf-config.json" cp "${RUNNER_TEMP}/gh-aw/awf-config.json" /tmp/gh-aw/awf-config.json export GH_AW_MODELS_JSON_PATH="/tmp/gh-aw/models.json" GH_AW_DOCKER_HOST="" @@ -866,7 +858,7 @@ jobs: fi fi # shellcheck disable=SC1003,SC2016,SC2086 - awf --config "${RUNNER_TEMP}/gh-aw/awf-config.json" --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" ${GH_AW_TOOL_CACHE_MOUNT:+--mount "$GH_AW_TOOL_CACHE_MOUNT"} ${GH_AW_DOCKER_HOST:+--docker-host "$GH_AW_DOCKER_HOST"} --env-all --exclude-env ACTIONS_ID_TOKEN_REQUEST_TOKEN --exclude-env ACTIONS_ID_TOKEN_REQUEST_URL --exclude-env AWF_ENCLAVE_GITHUB_PROXY_CA_CERT --exclude-env AWF_ENCLAVE_GITHUB_PROXY_CONTAINER --exclude-env AWF_ENCLAVE_GITHUB_PROXY_IDENTITY --exclude-env AWF_ENCLAVE_MCP_CAPABILITY --exclude-env AWF_ENCLAVE_MCP_GATEWAY_CONTAINER --exclude-env AWF_ENCLAVE_MCP_GATEWAY_ENDPOINT --exclude-env AWF_ENCLAVE_MCP_GATEWAY_IDENTITY --exclude-env AWF_ENCLAVE_MCP_READINESS_TIMEOUT_MS --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --exclude-env MCP_GATEWAY_ENCLAVE_CAPABILITY_KEY --mount /tmp/gh-aw:/tmp/gh-aw:rw --log-level info \ + awf --config "${RUNNER_TEMP}/gh-aw/awf-config.json" --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" ${GH_AW_TOOL_CACHE_MOUNT:+--mount "$GH_AW_TOOL_CACHE_MOUNT"} ${GH_AW_DOCKER_HOST:+--docker-host "$GH_AW_DOCKER_HOST"} --env-all --exclude-env ACTIONS_ID_TOKEN_REQUEST_TOKEN --exclude-env ACTIONS_ID_TOKEN_REQUEST_URL --exclude-env AWF_ENCLAVE_GITHUB_PROXY_CA_CERT --exclude-env AWF_ENCLAVE_GITHUB_PROXY_CONTAINER --exclude-env AWF_ENCLAVE_GITHUB_PROXY_IDENTITY --exclude-env AWF_ENCLAVE_MCP_CAPABILITY --exclude-env AWF_ENCLAVE_MCP_GATEWAY_CONTAINER --exclude-env AWF_ENCLAVE_MCP_GATEWAY_ENDPOINT --exclude-env AWF_ENCLAVE_MCP_GATEWAY_IDENTITY --exclude-env AWF_ENCLAVE_MCP_READINESS_TIMEOUT_MS --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --exclude-env MCP_GATEWAY_ENCLAVE_CAPABILITY_KEY --mount /tmp/gh-aw:/tmp/gh-aw:rw --log-level info --skip-pull \ -- /bin/bash -c 'set +o histexpand; export PATH="${RUNNER_TEMP}/gh-aw/mcp-cli/bin:$PATH" && : "${RUNNER_TOOL_CACHE:?RUNNER_TOOL_CACHE must be set}"; GH_AW_TOOL_CACHE="$RUNNER_TOOL_CACHE"; export PATH="$(find "$GH_AW_TOOL_CACHE" -maxdepth 5 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true; [ -n "$ERLANG_HOME" ] && export PATH="$ERLANG_HOME/bin:$PATH" || true && GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || true)"; fi; if [ -z "$GH_AW_NODE_EXEC" ]; then echo "node runtime missing on this runner — check runtimes.node in workflow YAML" >&2; exit 127; fi; GH_AW_NPM_GLOBAL_ROOT="$(npm root -g 2>/dev/null || true)"; if [ -n "$GH_AW_NPM_GLOBAL_ROOT" ]; then export NODE_PATH="${GH_AW_NPM_GLOBAL_ROOT}${NODE_PATH:+:${NODE_PATH}}"; fi; "$GH_AW_NODE_EXEC" "${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs" "${RUNNER_TEMP}/gh-aw/bin/copilot" --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-all-tools --allow-all-paths --add-dir "${GITHUB_WORKSPACE}" --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log env: AWF_REFLECT_ENABLED: 1 @@ -933,7 +925,6 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} - MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | bash "${RUNNER_TEMP}/gh-aw/actions/stop_mcp_gateway.sh" "$GATEWAY_PID" @@ -1101,7 +1092,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw/actions/setup@1cf55bdc4f19e5f371b1e7fe888df649695ee48a # 1cf55bdc4f19e5f371b1e7fe888df649695ee48a + uses: github/gh-aw/actions/setup@b5db66ca43a7614d7d3efd248dfe7323f3080baa # b5db66ca43a7614d7d3efd248dfe7323f3080baa with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} @@ -1111,7 +1102,7 @@ jobs: GH_AW_SETUP_WORKFLOW_NAME: "Smoke Enclave Issues Read" GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/smoke-enclave-issues-read.lock.yml@${{ github.ref }} GH_AW_INFO_VERSION: "1.0.34" - GH_AW_INFO_AWF_VERSION: "v0.28.8" + GH_AW_INFO_AWF_VERSION: "v0.28.9" GH_AW_INFO_ENGINE_ID: "copilot" - name: Download agent output artifact id: download-agent-output @@ -1372,7 +1363,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw/actions/setup@1cf55bdc4f19e5f371b1e7fe888df649695ee48a # 1cf55bdc4f19e5f371b1e7fe888df649695ee48a + uses: github/gh-aw/actions/setup@b5db66ca43a7614d7d3efd248dfe7323f3080baa # b5db66ca43a7614d7d3efd248dfe7323f3080baa with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} @@ -1382,7 +1373,7 @@ jobs: GH_AW_SETUP_WORKFLOW_NAME: "Smoke Enclave Issues Read" GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/smoke-enclave-issues-read.lock.yml@${{ github.ref }} GH_AW_INFO_VERSION: "1.0.34" - GH_AW_INFO_AWF_VERSION: "v0.28.8" + GH_AW_INFO_AWF_VERSION: "v0.28.9" GH_AW_INFO_ENGINE_ID: "copilot" - name: Download agent output artifact id: download-agent-output diff --git a/.github/workflows/smoke-enclave-issues-read.md b/.github/workflows/smoke-enclave-issues-read.md index 743868459..229658347 100644 --- a/.github/workflows/smoke-enclave-issues-read.md +++ b/.github/workflows/smoke-enclave-issues-read.md @@ -41,9 +41,9 @@ timeout-minutes: 20 sandbox: agent: id: awf - version: v0.28.8 + version: v0.28.9 mcp: - version: v0.4.11 + version: v0.4.12 strict: false concurrency: group: smoke-enclave-issues-read