From 515ef47f1b00cdf6db27b30c563b120ae1d892ce Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 17 Apr 2026 17:12:31 +0000 Subject: [PATCH 1/6] Initial plan From 284bd09f5dfd69d21331a6baa16d67b08d815a75 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 17 Apr 2026 17:50:38 +0000 Subject: [PATCH 2/6] fix: fallback to runtime node when GH_AW_NODE_BIN path is invalid Agent-Logs-Url: https://github.com/github/gh-aw/sessions/dd754442-4021-49ef-802b-d57b27f5a8ae Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/copilot_engine_execution.go | 14 +++++++------- pkg/workflow/copilot_engine_test.go | 6 ++++++ .../basic-copilot.golden | 2 +- .../with-imports.golden | 2 +- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/pkg/workflow/copilot_engine_execution.go b/pkg/workflow/copilot_engine_execution.go index 7a94d3ecec9..4da5e479a90 100644 --- a/pkg/workflow/copilot_engine_execution.go +++ b/pkg/workflow/copilot_engine_execution.go @@ -181,16 +181,15 @@ func (e *CopilotEngine) GetExecutionSteps(workflowData *WorkflowData, logFile st // When a driver script is provided (GetDriverScriptName), wrap the copilot invocation with // `node ` to enable retry logic for transient CAPIError 400 errors. // - // Use ${GH_AW_NODE_BIN:-node} instead of plain `node` so the absolute node path - // (exported by install_awf_binary.sh as GH_AW_NODE_BIN when the bundle is installed) - // is used inside the AWF container. In AWF's chroot mode the host filesystem is - // accessible, so the absolute path works even when sudo resets PATH on GPU runners - // (e.g. aw-gpu-runner-T4) and the actions/setup-node directory is not in PATH. + // Resolve node dynamically at runtime: + // - Prefer GH_AW_NODE_BIN when set and executable. + // - Fall back to `command -v node` if GH_AW_NODE_BIN points to a non-mounted toolcache path. + // This prevents agent startup failures when host toolcache paths are not present in the AWF container. driverScriptName := e.GetDriverScriptName() var execPrefix string if driverScriptName != "" { // Driver wraps the copilot subprocess; ${RUNNER_TEMP} and ${GH_AW_NODE_BIN} expand in the shell context. - execPrefix = fmt.Sprintf(`${GH_AW_NODE_BIN:-node} %s/%s %s`, SetupActionDestinationShell, driverScriptName, commandName) + execPrefix = fmt.Sprintf(`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 || echo node)"; fi; "$GH_AW_NODE_EXEC" %s/%s %s`, SetupActionDestinationShell, driverScriptName, commandName) } else { execPrefix = commandName } @@ -257,7 +256,8 @@ func (e *CopilotEngine) GetExecutionSteps(workflowData *WorkflowData, logFile st // secure_path, stripping the actions/setup-node directory. By capturing // the path here (where PATH is still intact) and exporting it, sudo -E // preserves the variable and AWF's --env-all forwards it into the container, - // where ${GH_AW_NODE_BIN:-node} resolves to the correct binary. + // where the execution command validates GH_AW_NODE_BIN and falls back to + // command -v node when the path does not exist in the container. PathSetup: "touch " + AgentStepSummaryPath + "\n" + "GH_AW_NODE_BIN=$(command -v node 2>/dev/null || true)\n" + "export GH_AW_NODE_BIN", diff --git a/pkg/workflow/copilot_engine_test.go b/pkg/workflow/copilot_engine_test.go index 3e79098e457..caeb595c686 100644 --- a/pkg/workflow/copilot_engine_test.go +++ b/pkg/workflow/copilot_engine_test.go @@ -1591,6 +1591,12 @@ func TestCopilotEngineDriverScript(t *testing.T) { if !strings.Contains(stepContent, "copilot_driver.cjs") { t.Errorf("Expected copilot_driver.cjs in execution step, got:\n%s", stepContent) } + if !strings.Contains(stepContent, `GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"`) { + t.Errorf("Expected GH_AW_NODE_EXEC runtime node resolution in execution step, got:\n%s", stepContent) + } + if !strings.Contains(stepContent, `command -v node 2>/dev/null || echo node`) { + t.Errorf("Expected node fallback lookup in execution step, got:\n%s", stepContent) + } // Driver should appear before the copilot args driverIdx := strings.Index(stepContent, "copilot_driver.cjs") diff --git a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/basic-copilot.golden b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/basic-copilot.golden index 08c968cd5e5..3ef3a0def6b 100644 --- a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/basic-copilot.golden +++ b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/basic-copilot.golden @@ -403,7 +403,7 @@ jobs: (umask 177 && touch /tmp/gh-aw/agent-stdio.log) # shellcheck disable=SC1003 sudo -E awf --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" --env-all --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --allow-domains api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.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,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.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,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --audit-dir /tmp/gh-aw/sandbox/firewall/audit --enable-host-access --image-tag 0.25.23 --skip-pull --enable-api-proxy \ - -- /bin/bash -c '${GH_AW_NODE_BIN:-node} ${RUNNER_TEMP}/gh-aw/actions/copilot_driver.cjs /usr/local/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 + -- /bin/bash -c '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 || echo node)"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_driver.cjs /usr/local/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: COPILOT_AGENT_RUNNER_TYPE: STANDALONE COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} diff --git a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/with-imports.golden b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/with-imports.golden index d72da59bff0..06738e84632 100644 --- a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/with-imports.golden +++ b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/with-imports.golden @@ -404,7 +404,7 @@ jobs: (umask 177 && touch /tmp/gh-aw/agent-stdio.log) # shellcheck disable=SC1003 sudo -E awf --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" --env-all --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --allow-domains api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.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,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.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,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --audit-dir /tmp/gh-aw/sandbox/firewall/audit --enable-host-access --image-tag 0.25.23 --skip-pull --enable-api-proxy \ - -- /bin/bash -c '${GH_AW_NODE_BIN:-node} ${RUNNER_TEMP}/gh-aw/actions/copilot_driver.cjs /usr/local/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 + -- /bin/bash -c '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 || echo node)"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_driver.cjs /usr/local/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: COPILOT_AGENT_RUNNER_TYPE: STANDALONE COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} From df2883001f6df17b83af1b627dfb8038d7d4fa35 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 17 Apr 2026 17:55:29 +0000 Subject: [PATCH 3/6] test: assert executable check in GH_AW_NODE_BIN fallback command Agent-Logs-Url: https://github.com/github/gh-aw/sessions/dd754442-4021-49ef-802b-d57b27f5a8ae Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/copilot_engine_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/workflow/copilot_engine_test.go b/pkg/workflow/copilot_engine_test.go index caeb595c686..c82ee329bfc 100644 --- a/pkg/workflow/copilot_engine_test.go +++ b/pkg/workflow/copilot_engine_test.go @@ -1594,6 +1594,9 @@ func TestCopilotEngineDriverScript(t *testing.T) { if !strings.Contains(stepContent, `GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"`) { t.Errorf("Expected GH_AW_NODE_EXEC runtime node resolution in execution step, got:\n%s", stepContent) } + if !strings.Contains(stepContent, `[ ! -x "$GH_AW_NODE_EXEC" ]`) { + t.Errorf("Expected executable check for GH_AW_NODE_BIN fallback in execution step, got:\n%s", stepContent) + } if !strings.Contains(stepContent, `command -v node 2>/dev/null || echo node`) { t.Errorf("Expected node fallback lookup in execution step, got:\n%s", stepContent) } From 82f8c082389f69276c30dd6750f1341af2bcbe8d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 17 Apr 2026 17:56:20 +0000 Subject: [PATCH 4/6] test: make node fallback assertion less brittle Agent-Logs-Url: https://github.com/github/gh-aw/sessions/dd754442-4021-49ef-802b-d57b27f5a8ae Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/copilot_engine_test.go | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/pkg/workflow/copilot_engine_test.go b/pkg/workflow/copilot_engine_test.go index c82ee329bfc..e0c075e5b1c 100644 --- a/pkg/workflow/copilot_engine_test.go +++ b/pkg/workflow/copilot_engine_test.go @@ -1591,14 +1591,9 @@ func TestCopilotEngineDriverScript(t *testing.T) { if !strings.Contains(stepContent, "copilot_driver.cjs") { t.Errorf("Expected copilot_driver.cjs in execution step, got:\n%s", stepContent) } - if !strings.Contains(stepContent, `GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"`) { - t.Errorf("Expected GH_AW_NODE_EXEC runtime node resolution in execution step, got:\n%s", stepContent) - } - if !strings.Contains(stepContent, `[ ! -x "$GH_AW_NODE_EXEC" ]`) { - t.Errorf("Expected executable check for GH_AW_NODE_BIN fallback in execution step, got:\n%s", stepContent) - } - if !strings.Contains(stepContent, `command -v node 2>/dev/null || echo node`) { - t.Errorf("Expected node fallback lookup in execution step, got:\n%s", stepContent) + nodeResolutionLogic := `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 || echo node)"; fi; "$GH_AW_NODE_EXEC"` + if !strings.Contains(stepContent, nodeResolutionLogic) { + t.Errorf("Expected runtime node resolution logic in execution step, got:\n%s", stepContent) } // Driver should appear before the copilot args From cbd53decfbdba2af9f8b46720c8e125b6cd3e0b2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 17 Apr 2026 17:57:40 +0000 Subject: [PATCH 5/6] refactor: share node resolution shell logic constant with tests Agent-Logs-Url: https://github.com/github/gh-aw/sessions/dd754442-4021-49ef-802b-d57b27f5a8ae Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/copilot_engine_execution.go | 4 +++- pkg/workflow/copilot_engine_test.go | 3 +-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pkg/workflow/copilot_engine_execution.go b/pkg/workflow/copilot_engine_execution.go index 4da5e479a90..96199e47c29 100644 --- a/pkg/workflow/copilot_engine_execution.go +++ b/pkg/workflow/copilot_engine_execution.go @@ -35,6 +35,8 @@ import ( var copilotExecLog = logger.New("workflow:copilot_engine_execution") +const nodeRuntimeResolutionPrefix = `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 || echo node)"; fi; "$GH_AW_NODE_EXEC"` + // GetExecutionSteps returns the GitHub Actions steps for executing GitHub Copilot CLI func (e *CopilotEngine) GetExecutionSteps(workflowData *WorkflowData, logFile string) []GitHubActionStep { copilotExecLog.Printf("Generating execution steps for Copilot: workflow=%s, firewall=%v", workflowData.Name, isFirewallEnabled(workflowData)) @@ -189,7 +191,7 @@ func (e *CopilotEngine) GetExecutionSteps(workflowData *WorkflowData, logFile st var execPrefix string if driverScriptName != "" { // Driver wraps the copilot subprocess; ${RUNNER_TEMP} and ${GH_AW_NODE_BIN} expand in the shell context. - execPrefix = fmt.Sprintf(`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 || echo node)"; fi; "$GH_AW_NODE_EXEC" %s/%s %s`, SetupActionDestinationShell, driverScriptName, commandName) + execPrefix = fmt.Sprintf(`%s %s/%s %s`, nodeRuntimeResolutionPrefix, SetupActionDestinationShell, driverScriptName, commandName) } else { execPrefix = commandName } diff --git a/pkg/workflow/copilot_engine_test.go b/pkg/workflow/copilot_engine_test.go index e0c075e5b1c..89f2b9c4ca8 100644 --- a/pkg/workflow/copilot_engine_test.go +++ b/pkg/workflow/copilot_engine_test.go @@ -1591,8 +1591,7 @@ func TestCopilotEngineDriverScript(t *testing.T) { if !strings.Contains(stepContent, "copilot_driver.cjs") { t.Errorf("Expected copilot_driver.cjs in execution step, got:\n%s", stepContent) } - nodeResolutionLogic := `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 || echo node)"; fi; "$GH_AW_NODE_EXEC"` - if !strings.Contains(stepContent, nodeResolutionLogic) { + if !strings.Contains(stepContent, nodeRuntimeResolutionPrefix) { t.Errorf("Expected runtime node resolution logic in execution step, got:\n%s", stepContent) } From ac0e9e7bcf3a3e78176fc8831de3c4a731327eec Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 17 Apr 2026 17:58:36 +0000 Subject: [PATCH 6/6] chore: rename shared node resolution command constant Agent-Logs-Url: https://github.com/github/gh-aw/sessions/dd754442-4021-49ef-802b-d57b27f5a8ae Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/copilot_engine_execution.go | 4 ++-- pkg/workflow/copilot_engine_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/workflow/copilot_engine_execution.go b/pkg/workflow/copilot_engine_execution.go index 96199e47c29..aa3a8e309f2 100644 --- a/pkg/workflow/copilot_engine_execution.go +++ b/pkg/workflow/copilot_engine_execution.go @@ -35,7 +35,7 @@ import ( var copilotExecLog = logger.New("workflow:copilot_engine_execution") -const nodeRuntimeResolutionPrefix = `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 || echo node)"; fi; "$GH_AW_NODE_EXEC"` +const nodeRuntimeResolutionCommand = `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 || echo node)"; fi; "$GH_AW_NODE_EXEC"` // GetExecutionSteps returns the GitHub Actions steps for executing GitHub Copilot CLI func (e *CopilotEngine) GetExecutionSteps(workflowData *WorkflowData, logFile string) []GitHubActionStep { @@ -191,7 +191,7 @@ func (e *CopilotEngine) GetExecutionSteps(workflowData *WorkflowData, logFile st var execPrefix string if driverScriptName != "" { // Driver wraps the copilot subprocess; ${RUNNER_TEMP} and ${GH_AW_NODE_BIN} expand in the shell context. - execPrefix = fmt.Sprintf(`%s %s/%s %s`, nodeRuntimeResolutionPrefix, SetupActionDestinationShell, driverScriptName, commandName) + execPrefix = fmt.Sprintf(`%s %s/%s %s`, nodeRuntimeResolutionCommand, SetupActionDestinationShell, driverScriptName, commandName) } else { execPrefix = commandName } diff --git a/pkg/workflow/copilot_engine_test.go b/pkg/workflow/copilot_engine_test.go index 89f2b9c4ca8..c70a4dd51fb 100644 --- a/pkg/workflow/copilot_engine_test.go +++ b/pkg/workflow/copilot_engine_test.go @@ -1591,7 +1591,7 @@ func TestCopilotEngineDriverScript(t *testing.T) { if !strings.Contains(stepContent, "copilot_driver.cjs") { t.Errorf("Expected copilot_driver.cjs in execution step, got:\n%s", stepContent) } - if !strings.Contains(stepContent, nodeRuntimeResolutionPrefix) { + if !strings.Contains(stepContent, nodeRuntimeResolutionCommand) { t.Errorf("Expected runtime node resolution logic in execution step, got:\n%s", stepContent) }