Skip to content

feat(claude): add retry harness for transient Anthropic API failures#29581

Merged
pelikhan merged 6 commits intomainfrom
copilot/review-claude-agent-driver
May 1, 2026
Merged

feat(claude): add retry harness for transient Anthropic API failures#29581
pelikhan merged 6 commits intomainfrom
copilot/review-claude-agent-driver

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented May 1, 2026

The Claude agent driver had no retry logic — a transient overload (529) or rate-limit (429) from the Anthropic API caused immediate job failure, with no attempt to resume.

Changes

actions/setup/js/awf_reflect.cjs (new, shared)

AWF API proxy /reflect helpers extracted into a shared module consumed by all harnesses:

  • Constants: AWF_API_PROXY_REFLECT_URL, AWF_REFLECT_OUTPUT_PATH, AWF_REFLECT_TIMEOUT_MS, AWF_MODELS_URL_TIMEOUT_MS, GEMINI_MODEL_NAME_PREFIX
  • Functions: extractModelIds, fetchModelsFromUrl, enrichReflectModels, fetchAWFReflect

actions/setup/js/claude_harness.cjs (new)

Node.js harness wrapping Claude Code CLI, mirroring copilot_harness.cjs:

  • Detects overloaded_error (HTTP 529) and rate_limit_error (HTTP 429) in output
  • Retries up to 3× with exponential backoff (5s → 10s → 20s, cap 60s)
  • On partial-execution failure (has output): retries with --continue so Claude resumes from on-disk session state — no prompt re-injection; prompt is omitted on --continue runs since Claude Code doesn't re-accept it
  • On no-output failure: does not retry (binary not found, auth failure, etc.)
  • Uses shared awf_reflect.cjs for AWF API proxy reflection

actions/setup/js/copilot_harness.cjs

  • Refactored to use shared awf_reflect.cjs (no behaviour change)

pkg/workflow/claude_engine.go

  • Implements HarnessProvider via GetHarnessScriptName() string { return "claude_harness.cjs" }
  • GetExecutionSteps() now wraps the command as node claude_harness.cjs claude … and passes --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt (harness resolves file → last positional arg) instead of inline "$(cat …)" shell expansion
# before
claude --print … "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)"

# after
node claude_harness.cjs claude --print … --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt

Custom engine.harness in workflow frontmatter overrides the built-in harness, consistent with how Copilot handles it.

Tests

  • Updated 4 existing tests that asserted "$(cat …)" → now assert --prompt-file
  • Added TestClaudeEngineGetHarnessScriptName, TestClaudeEngineHarnessUsesPromptFile, TestClaudeEngineCustomHarnessOverridesBuiltIn
  • Added awf_reflect.test.cjs with 23 tests covering all exported constants and functions in the shared module


✨ PR Review Safe Output Test - Run 25230880894

💥 [THE END] — Illustrated by Smoke Claude · ● 368.9K ·

Copilot AI and others added 2 commits May 1, 2026 11:34
… API errors

- Create actions/setup/js/claude_harness.cjs wrapping Claude Code CLI with
  retry logic for overload (529) and rate-limit (429) errors, using --continue
  on partial-execution retries with exponential backoff (5s->10s->20s, max 3)
- Add GetHarnessScriptName() to ClaudeEngine returning "claude_harness.cjs"
- Update GetExecutionSteps() to use harness prefix and --prompt-file instead
  of inline shell expansion "$(cat ...)" when harness is available
- Update tests to reflect harness-based --prompt-file prompt passing
- Add new tests for GetHarnessScriptName(), harness command format, and
  custom harness override behaviour

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/607f6264-584f-4644-9ac7-ce0eb8aa15ca

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
…-agent-driver

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Comment thread actions/setup/js/claude_harness.cjs Outdated
* @param {(msg: string) => void} logger
* @returns {Promise<string[]|null>}
*/
async function fetchModelsFromUrl(modelsUrl, timeoutMs, logger) {
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot refactor /reflect and models parsing into separate file shared by all harnesses

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in f824127. Created actions/setup/js/awf_reflect.cjs with the shared constants and functions (extractModelIds, fetchModelsFromUrl, enrichReflectModels, fetchAWFReflect). Both copilot_harness.cjs and claude_harness.cjs now require from it and pass { logger: log } to fetchAWFReflect() so each harness keeps its own log prefix. Added awf_reflect.test.cjs with 23 dedicated tests for the shared module.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Me agree! Retry logic very important. Transient errors bad. Retry harness fix. Good code!

📰 BREAKING: Report filed by Smoke Copilot · ● 1.8M

….cjs

- Create actions/setup/js/awf_reflect.cjs with AWF API proxy /reflect
  helpers: constants (AWF_API_PROXY_REFLECT_URL, AWF_REFLECT_OUTPUT_PATH,
  AWF_REFLECT_TIMEOUT_MS, AWF_MODELS_URL_TIMEOUT_MS, GEMINI_MODEL_NAME_PREFIX)
  and functions (extractModelIds, fetchModelsFromUrl, enrichReflectModels,
  fetchAWFReflect) previously duplicated between the two harnesses
- Update copilot_harness.cjs to require from awf_reflect.cjs; pass {logger:log}
  to fetchAWFReflect() to preserve [copilot-harness] log prefix
- Update claude_harness.cjs to require from awf_reflect.cjs; pass {logger:log}
  to fetchAWFReflect() to preserve [claude-harness] log prefix
- Add actions/setup/js/awf_reflect.test.cjs with 23 tests covering all exported
  constants and functions in the shared module

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/5451ae39-f59c-42cd-a6c0-f664fbe1a822

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented May 1, 2026

Just as a heads up, I was blocked by some firewall rules while working on your feedback. Expand below for details.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw --conditions development python3 /pre�� run-script/lib/n-M git ash user.name (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw --conditions development python3 /pre�� te &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.prettierignore git /bin/sh user.name (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw --conditions development python3 /pre�� te &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.prettierignore git ode_modules/.bin/sh user.name (http block)
  • https://api.github.com/repos/actions/ai-inference/git/ref/tags/v1
    • Triggering command: /usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq [.object.sha, .object.type] | @tsv ache/uv/0.11.8/x--write ache/node/24.14.**/*.cjs /usr/bin/git ath ../../../.prgit k/gh-aw/gh-aw/acrev-parse ode_modules/.bin--show-toplevel git rev-�� --show-toplevel k/gh-aw/gh-aw/ac--write /usr/bin/git th .prettierignonode .cjs bin/node git (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v3
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq [.object.sha, .object.type] | @tsv ript files formatted&#34; tions/setup/js/node_modules/vite/home/REDACTED/work/gh-aw/gh-aw/ac**/*.json sh tierignore git /node node /opt�� te &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.prettierignore typecheck bin/node -q (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v5
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv h ../../../.prettierignore git de_modules/.bin/sh -q (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv xterm-color python3 /usr/bin/git h ../../../.pretgit git ules/.bin/sh git rev-�� --show-toplevel erignore /usr/bin/git json&#39; --ignore-pgit /home/REDACTED/worrev-parse ache/uv/0.11.8/x--show-toplevel git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv --show-toplevel node /usr/bin/git .js&#39; --ignore-pagit git 86_64/node git rev-�� --show-toplevel node /usr/bin/git te &#39;**/*.cjs&#39; &#39;*git --write /opt/hostedtoolc--show-toplevel git (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v6
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv json&#39; --ignore-path ../../../.pr**/*.json forks.js ache/go/1.25.8/x64/bin/node --binary mp modules/@npmcli/--show-toplevel sh ache�� th .prettierignore --log-level=error git ode_modules/.bin/sh commit.gpgsign hNyQ/.diffsize.trev-parse be117b52..d395f1--show-toplevel node (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv rite &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.pr**/*.json git 64/bin/bash tierignore ode_modules/viterev-parse nfig/composer/ve--show-toplevel node /hom�� te &#39;scripts/**/*.js&#39; --ignore-path .prettierigno**/*.ts ode_modules/vitest/dist/workers/forks.js tions/setup/js/node_modules/.bin/node --binary --output=/tmp/girev-parse ode-gyp-bin/sh sh (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv ci st/dist/workers/forks.js nfig/composer/vendor/bin/bash user.email test@example.comrev-parse /node node 1/x6�� --noEmit git ache/node/24.14.1/x64/bin/node HEAD t-patch-utils-k9rev-parse k/gh-aw/node_mod--show-toplevel node (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v8
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq [.object.sha, .object.type] | @tsv --show-toplevel node /usr/bin/git */*.ts&#39; &#39;**/*.jsgit run 86_64/node git rev-�� --show-toplevel bash /usr/bin/git json&#39; --ignore-pgit forks.js n-dir/bash git (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v9
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv &#34;prettier&#34; --write &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.prettierignore git /home/REDACTED/go/bin/node t.cjs test@example.comrev-parse 1/x64/bin/sh node /hom�� be117b52..071256npx prettier --write &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.prgit /opt/hostedtoolcache/node/24.14.1/x64/bin/node /usr/bin/git rror /home/REDACTED/worrev-parse _modules/.bin/sh--show-toplevel git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv --write **/*.cjs /opt/pipx_bin/sh **/*.json --ignore-path ../../../.pretti--show-toplevel sh -c husky node /usr/bin/gh /tmp/http-mcp-tegit --port n-dir/sh gh (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv --write **/*.cjs /usr/local/.ghcup/bin/sh **/*.json --ignore-path ../../../.pretti--show-toplevel sh -c husky /opt/hostedtoolcache/node/24.14.1/x64/bin/node /usr/bin/git --require /home/REDACTED/worrev-parse rgo/bin/bash git (http block)
  • https://api.github.com/repos/actions/setup-go/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --write **/*.cjs /snap/bin/sh **/*.json --ignore-path ../../../.pretti--show-toplevel sh -c husky node /usr/bin/gh /tmp/http-mcp-tegit --port run-script/lib/n--show-toplevel gh (http block)
  • https://api.github.com/repos/actions/setup-node/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --noEmit git n-dir/node HEAD t-patch-utils-k9rev-parse n-dir/go node tion�� te &#39;scripts/**/*.js&#39; --ignore-path .prettierignore --log-level=error **/*.cjs cal/bin/node **/*.json --ignore-path ../../../.pretti--show-toplevel sh (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --write **/*.cjs /opt/hostedtoolcache/go/1.25.8/x64/bin/sh **/*.json --ignore-path ../../../.pretti--show-toplevel sh -c husky node /usr/bin/git rror --port /prettier git (http block)
  • https://api.github.com/repos/actions/setup-node/git/ref/tags/v6
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv json&#39; --ignore-path ../../../.pr**/*.json forks.js k/gh-aw/gh-aw/actions/setup/js/n../../../.prettierignore --binary mp odules/npm/node_--show-toplevel sh -c th .prettierignore --log-level=error git es/.bin/sh . hNyQ/.diffsize.trev-parse be117b52..d395f1--show-toplevel /opt/hostedtoolcache/node/24.14.1/x64/bin/node (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv rite &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.pr**/*.json git h tierignore main tnet/tools/git /bin/sh -c te &#39;scripts/**/*.js&#39; --ignore-path .prettierigno**/*.ts git tions/setup/node_modules/.bin/node --binary --output=/tmp/girev-parse ache/go/1.25.8/x--show-toplevel sh (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv ci st/dist/workers/forks.js 64/bin/node user.email test@example.comrev-parse bin/git node 1/x6�� --noEmit git 1/x64/lib/node_modules/npm/node_modules/@npmcli/run-script/lib/node-gyp-bin/node HEAD t-patch-utils-k9rev-parse 1/x64/lib/node_m--show-toplevel node (http block)
  • https://api.github.com/repos/actions/upload-artifact/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv ode-gyp-bin/git git ode -q -m modules/@npmcli/--show-toplevel node it-c�� te &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.pret.prettierignore --write tnet/tools/bash **/*.ts **/*.json --ignore-path node (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v0.1.2
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v0.1.2 --jq [.object.sha, .object.type] | @tsv **/*.cjs **/*.ts /home/REDACTED/.npm/_cacache/tmp/node_modules/.bin/sh --ignore-path ../../../.prettirev-parse ache/node/24.14.--show-toplevel sh -c husky /opt/hostedtoolc--write /usr/bin/git rror /home/REDACTED/worrev-parse n-dir/node git (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.0.0 --jq [.object.sha, .object.type] | @tsv .js&#39; --ignore-path .prettierignore --log-level=error typecheck tions/setup/js/node_modules/.bin/sh -M t-patch-utils-k9rev-parse 1/x64/bin/node sh -c te &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.prettierignore 1/x64/bin/node k/gh-aw/gh-aw/actions/node_modules/.bin/sh re --log-level=egit ode_modules/viterev-parse ode-gyp-bin/sh sh (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.2.3
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.2.3 --jq [.object.sha, .object.type] | @tsv .js&#39; --ignore-path .prettierignore --log-level=error typecheck 64/bin/node -q t-patch-utils-k9rev-parse 1/x64/bin/node sh 1/x6�� te &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.prettierignore 1/x64/bin/node k/gh-aw/gh-aw/actions/setup/js/node_modules/.bin/sh re --log-level=egit ode_modules/viterev-parse 64/bin/go sh (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v0.47.4
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v0.47.4 --jq [.object.sha, .object.type] | @tsv --show-toplevel /opt/hostedtoolcache/node/24.14.1/x64/bin/node /usr/bin/git te &#39;scripts/**/*git /home/REDACTED/worrev-parse odules/npm/node_--show-toplevel git rev-�� --show-toplevel sh /usr/bin/git th .prettierignodu git ode_modules/.bin/tmp/gh-aw/aw-feature-branch.patch git (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.0.0 --jq [.object.sha, .object.type] | @tsv on&#39; --ignore-path ../../../.pret.prettierignore git k/node_modules/.bin/node on-test ings.cjs ache/node/24.14.--write python3 k/gh�� ath ../../../.pr**/*.json test.cjs k/gh-aw/node_mod../../../.prettierignore --get 21982b99b66def56-c n-dir/git python3 (http block)
  • https://api.github.com/repos/nonexistent/action/git/ref/tags/v999.999.999
    • Triggering command: /usr/bin/gh gh api /repos/nonexistent/action/git/ref/tags/v999.999.999 --jq [.object.sha, .object.type] | @tsv on&#39; --ignore-path ../../../.pret.prettierignore git 64/bin/bash on-test ings.cjs ndor/bin/git python3 k/gh�� ath ../../../.pr**/*.json test.cjs n-dir/sh --get 21982b99b66def56-c k/_temp/uv-pythohusky python3 (http block)
  • invalid.example.invalid
    • Triggering command: /usr/lib/git-core/git-remote-https /usr/lib/git-core/git-remote-https origin https://invalid.example.invalid/nonexistent-repo.git e/git init�� ndor/bin/git git ode_modules/.bin/git =receive test@example.com--git-dir=/tmp/bare-incremental-wn3sdv /git (dns block)
    • Triggering command: /usr/lib/git-core/git-remote-https /usr/lib/git-core/git-remote-https origin https://invalid.example.invalid/nonexistent-repo.git e/git conf�� --local --get ode_modules/.bin/git =receive test@example.com--git-dir=/tmp/bare-incremental-y9ZEf7 es/.bin/git (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Copilot AI requested a review from pelikhan May 1, 2026 18:41
@pelikhan pelikhan marked this pull request as ready for review May 1, 2026 18:55
Copilot AI review requested due to automatic review settings May 1, 2026 18:55
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a Node.js “harness” wrapper for Claude Code CLI to retry and resume after transient Anthropic API failures, and extracts shared AWF api-proxy /reflect helpers for reuse across harnesses.

Changes:

  • Introduces actions/setup/js/claude_harness.cjs with retry + --continue resume behavior and --prompt-file support.
  • Extracts AWF /reflect fetch/enrichment logic into actions/setup/js/awf_reflect.cjs and refactors copilot_harness.cjs to use it.
  • Updates Claude engine command generation and tests to pass prompts via --prompt-file (instead of $(cat ...)) and updates locked workflow fixtures accordingly.
Show a summary per file
File Description
pkg/workflow/runtime_detection.go Updates Node runtime requirement commentary/logic for engine harness usage.
pkg/workflow/engine_agent_import_test.go Updates assertions to expect --prompt-file for Claude execution.
pkg/workflow/claude_engine_test.go Adds/updates tests for Claude harness script name and --prompt-file usage.
pkg/workflow/claude_engine.go Wraps Claude execution with Node harness + switches prompt passing to --prompt-file.
actions/setup/js/copilot_harness.cjs Refactors AWF reflect logic to shared module; passes logger into reflect fetch.
actions/setup/js/awf_reflect.cjs New shared module for AWF api-proxy /reflect fetching + model enrichment.
actions/setup/js/awf_reflect.test.cjs New vitest coverage for the shared AWF reflect module.
.github/workflows/test-create-pr-error-handling.lock.yml Updates locked Claude invocation to use node …/claude_harness.cjs … --prompt-file ….
.github/workflows/smoke-agent-scoped-approved.lock.yml Same locked command update for smoke workflow.
.github/workflows/smoke-agent-public-none.lock.yml Same locked command update for smoke workflow.
.github/workflows/smoke-agent-public-approved.lock.yml Same locked command update for smoke workflow.
.github/workflows/smoke-agent-all-none.lock.yml Same locked command update for smoke workflow.
.github/workflows/smoke-agent-all-merged.lock.yml Same locked command update for smoke workflow.
.github/workflows/schema-consistency-checker.lock.yml Same locked command update for checker workflow.
.github/workflows/lockfile-stats.lock.yml Same locked command update for stats workflow.
.github/workflows/go-pattern-detector.lock.yml Same locked command update for detector workflow.
.github/workflows/github-mcp-tools-report.lock.yml Same locked command update for report workflow.
.github/workflows/example-workflow-analyzer.lock.yml Same locked command update for analyzer workflow.
.github/workflows/daily-team-evolution-insights.lock.yml Same locked command update for daily workflow.
.github/workflows/daily-security-red-team.lock.yml Same locked command update for daily workflow.
.github/workflows/daily-safe-outputs-conformance.lock.yml Same locked command update for daily workflow.
.github/workflows/daily-otel-instrumentation-advisor.lock.yml Same locked command update for daily workflow.
.github/workflows/daily-function-namer.lock.yml Same locked command update for daily workflow.
.github/workflows/daily-code-metrics.lock.yml Same locked command update for daily workflow.
.github/workflows/daily-choice-test.lock.yml Same locked command update for daily workflow.
.github/workflows/daily-astrostylelite-markdown-spellcheck.lock.yml Same locked command update for daily workflow.
.github/workflows/copilot-agent-analysis.lock.yml Same locked command update for analysis workflow.
.github/workflows/commit-changes-analyzer.lock.yml Same locked command update for analyzer workflow.
.github/workflows/ci-doctor.lock.yml Same locked command update for CI workflow.
.github/workflows/aw-failure-investigator.lock.yml Same locked command update for investigator workflow.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 66/66 changed files
  • Comments generated: 3

Comment thread actions/setup/js/claude_harness.cjs Outdated
Comment on lines +128 to +132
function runProcess(command, args, attempt) {
return new Promise(resolve => {
const startTime = Date.now();
log(`attempt ${attempt + 1}: spawning: ${command} ${args.join(" ").substring(0, 200)}`);

Copy link

Copilot AI May 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The harness logs the spawned command including args.join(" "), which will include the full prompt text (appended as the last arg by resolveClaudePromptFileArgs). This can leak prompt contents into stderr/agent logs and artifacts. Please redact the prompt argument (and ideally any sensitive args) from logs—e.g., log only the executable + non-prompt flags, or replace the last arg with a placeholder like <prompt omitted> when it came from --prompt-file.

Copilot uses AI. Check for mistakes.
Comment thread pkg/workflow/runtime_detection.go Outdated
Comment on lines 106 to 109
// Copilot consumes engine.harness in execution command generation.
// Claude is excluded here because its installation steps already include Node.js setup
// (GenerateNpmInstallSteps with includeNodeSetup=true), so no extra requirement is needed.
return strings.EqualFold(engineID, string(constants.CopilotEngine))
Copy link

Copilot AI May 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment is now a bit misleading: Claude also supports engine.harness in execution command generation (via the new Node harness wrapper), but is excluded here because Node.js setup is already included in Claude’s installation steps. Consider rewording to clarify that Claude does consume engine.harness, but does not need an additional runtime requirement.

Copilot uses AI. Check for mistakes.
Comment on lines +223 to +232
const promptFile = args[i + 1];
try {
const stat = fs.statSync(promptFile);
log(`resolved --prompt-file: path=${promptFile} size=${stat.size}B`);
promptContent = fs.readFileSync(promptFile, "utf8");
} catch (error) {
const err = /** @type {Error} */ error;
log(`warning: failed to read --prompt-file ${promptFile}: ${err.message}; leaving arguments unchanged`);
filteredArgs.push(args[i], promptFile);
}
Copy link

Copilot AI May 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If reading the --prompt-file fails, the harness currently leaves --prompt-file <path> in the args list and proceeds. Since --prompt-file is a harness-only flag (not a Claude CLI flag), this will likely cause the underlying claude process to fail with an “unknown option” style error. Consider treating an unreadable prompt file as a hard error (exit with a clear message) or at least stripping the flag so it’s never forwarded to the Claude subprocess.

Copilot uses AI. Check for mistakes.
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

🧪 Test Quality Sentinel Report

Test Quality Score: 80/100

Excellent test quality

Metric Value
New/modified tests analyzed 30
✅ Design tests (behavioral contracts) 30 (100%)
⚠️ Implementation tests (low value) 0 (0%)
Tests with error/edge cases 20 (67%)
Duplicate test clusters 0
Test inflation detected Yes (claude_engine_test.go: 78 lines added vs 30 in production, ratio 2.6:1)
🚨 Coding-guideline violations None

Test Classification Details

View all 30 classified tests

JavaScript — awf_reflect.test.cjs (23 tests)

Test Classification Issues
exports expected default values ✅ Design
returns null for null input ✅ Design (edge case)
returns null for empty object ✅ Design (edge case)
returns null for empty data array ✅ Design (edge case)
extracts ids from OpenAI format ✅ Design
falls back to name when id is absent in OpenAI format ✅ Design
extracts ids from Gemini format, stripping prefix ✅ Design
handles Gemini entries without the prefix ✅ Design (edge case)
returns sorted results ✅ Design
returns null for empty models array ✅ Design (edge case)
does nothing when all configured endpoints already have models ✅ Design
does nothing for unconfigured endpoints with null models ✅ Design (edge case)
does nothing when models_url is null ✅ Design (edge case)
fetches models from models_url for configured endpoints with null models ✅ Design fetch mocked (legitimate external I/O)
leaves models null when models_url fetch fails ✅ Design (error path)
handles empty endpoints array ✅ Design (edge case)
returns model IDs on successful fetch ✅ Design
returns null on non-ok HTTP status ✅ Design (error path)
returns null on network error ✅ Design (error path)
saves enriched reflect data when api-proxy returns null models ✅ Design (integration-style)
does not throw when the reflect endpoint is unreachable ✅ Design (error path)
does not throw when the reflect endpoint returns non-ok status ✅ Design (error path)
uses the caller-supplied logger for all messages ✅ Design

Go — claude_engine_test.go (3 new, 4 modified)

Test Classification Issues
TestClaudeEngineGetHarnessScriptName (new) ✅ Design
TestClaudeEngineHarnessUsesPromptFile (new) ✅ Design (error path)
TestClaudeEngineCustomHarnessOverridesBuiltIn (new) ✅ Design
TestClaudeEngineNoDoubleEscapePrompt (modified) ✅ Design
TestClaudeEngineAWFWithAgentFileReadsPromptTxt (modified) ✅ Design

Go — engine_agent_import_test.go (2 modified)

Test Classification Issues
TestClaudeEngineWithAgentFromImports (modified) ✅ Design
TestClaudeEngineWithoutAgentFile (modified) ✅ Design

Flagged Tests — Requires Review

⚠️ Test Inflation — claude_engine_test.go

Issue: 78 lines added to the test file vs 30 lines in the production file (claude_engine.go) — a 2.6:1 ratio, exceeding the 2:1 threshold.
Context: This is likely benign — 3 new behavioral tests were added (TestClaudeEngineGetHarnessScriptName, TestClaudeEngineHarnessUsesPromptFile, TestClaudeEngineCustomHarnessOverridesBuiltIn) and each requires setup code and multiple assertions. The inflation appears structural rather than inflated padding. No action strictly required, but be mindful that test verbosity doesn't erode future signal.


Language Support

Tests analyzed:

  • 🐹 Go (*_test.go): 7 tests — unit (//go:build !integration) ✅ build tags present
  • 🟨 JavaScript (*.test.cjs): 23 tests (vitest) — mocking limited to fetch (external I/O, legitimate)

Verdict

Check passed. 0% of new tests are implementation tests (threshold: 30%). All 30 new/modified tests verify observable behavioral contracts. No coding-guideline violations detected.


📖 Understanding Test Classifications

Design Tests (High Value) verify what the system does:

  • Assert on observable outputs, return values, or state changes
  • Cover error paths and boundary conditions
  • Would catch a behavioral regression if deleted
  • Remain valid even after internal refactoring

Implementation Tests (Low Value) verify how the system does it:

  • Assert on internal function calls (mocking internals)
  • Only test the happy path with typical inputs
  • Break during legitimate refactoring even when behavior is correct
  • Give false assurance: they pass even when the system is wrong

Goal: Shift toward tests that describe the system's behavioral contract — the promises it makes to its users and collaborators.

References: §25228247290

🧪 Test quality analysis by Test Quality Sentinel · ● 651.3K ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Test Quality Sentinel: 80/100. Test quality is excellent — 0% of new tests are implementation tests (threshold: 30%). All 30 analyzed tests verify observable behavioral contracts. No coding-guideline violations detected.

Documents the decision to wrap Claude Code CLI invocation in a Node.js
harness (claude_harness.cjs) with exponential-backoff retry logic for
transient Anthropic API errors (HTTP 529/429) and session-resume via
--continue.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Commit pushed: c306471

🏗️ ADR gate enforced by Design Decision Gate 🏗️

@pelikhan
Copy link
Copy Markdown
Collaborator

pelikhan commented May 1, 2026

@copilot review all comments

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
…ction.go

- Redact prompt content in spawn log: add logArgs param to runProcess(),
  build safeInitialArgs (last arg replaced with '<prompt omitted>') only
  when original args contained --prompt-file, pass it for logging so task
  instructions are never written to stderr or agent log artifacts
- Treat unreadable --prompt-file as a fatal startup error: resolveClaudePromptFileArgs()
  now throws instead of silently re-inserting the harness-only flag; main() catches,
  logs the error and exits before the flag could reach the claude subprocess
- Clarify runtime_detection.go comment: reword to note that both Copilot and Claude
  consume engine.harness, but Claude needs no extra Node.js requirement because its
  install steps already provision Node via GenerateNpmInstallSteps
- Add claude_harness.test.cjs with 10 tests covering resolveClaudePromptFileArgs
  (including the new throw-on-error path) and stripPromptFileArgs

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/91ac6eae-c232-4f42-9bac-1fd6ff799cee

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented May 1, 2026

@copilot review all comments

Addressed all three reviewer comments in f427c1e (and the runtime_detection.go comment was already in c306471):

  1. Prompt redaction — Added logArgs param to runProcess(). main() builds safeInitialArgs (last arg replaced with <prompt omitted>, but only when --prompt-file was in the original args) and passes it for logging, so prompt content never appears in stderr/agent logs.

  2. Unreadable prompt file = hard errorresolveClaudePromptFileArgs() now throws on read failure instead of silently re-inserting --prompt-file into the args list. main() catches, logs a fatal message, and exits before the harness-only flag could reach the claude subprocess.

  3. Misleading runtime_detection.go comment — Reworded to clarify that both Copilot and Claude consume engine.harness, but Claude doesn't need an extra Node.js runtime requirement because its install steps already provision Node via GenerateNpmInstallSteps.

Also added claude_harness.test.cjs (10 tests) covering the new throw-on-error path.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw --local /usr/local/sbin/--show-toplevel git rev-�� --show-toplevel git /usr/bin/git .cjs --local node git (http block)
  • https://api.github.com/repos/actions/ai-inference/git/ref/tags/v1
    • Triggering command: /usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq [.object.sha, .object.type] | @tsv --noEmit (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v3
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq [.object.sha, .object.type] | @tsv scripts/**/*.js est.cjs k/gh-aw/gh-aw/actions/node_modules/.bin/node --log-level=errogit (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v5
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv xterm-color (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv --show-toplevel git /usr/bin/git .js&#39; --ignore-pagit (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v6
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv json&#39; --ignore-path ../../../.pr**/*.json --local cal/bin/sh credential.userngit (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv rite &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.pr**/*.json user.email e_modules/.bin/node (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv */*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.prettierignore (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v8
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq [.object.sha, .object.type] | @tsv --show-toplevel git /usr/bin/git get --global nfig/composer/vendor/bin/git git rev-�� --show-toplevel git /usr/bin/git get --local 1/x64/bin/sh git (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v9
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv --write **/*.cjs /home/REDACTED/.npm/_cacache/tmp/git-clonekpVHPn/node_modules/.bin/sh **/*.json --ignore-path ../../../.pretti--show-toplevel sh -c husky (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv --write **/*.cjs /usr/local/.ghcup/bin/sh **/*.json --ignore-path ../../../.pretti--show-toplevel sh -c husky (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv --write **/*.cjs /usr/local/bin/sh **/*.json --ignore-path run-script/lib/n--show-toplevel sh -c husky (http block)
  • https://api.github.com/repos/actions/setup-go/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --write **/*.cjs /home/REDACTED/.cargo/bin/sh **/*.json --ignore-path ../../../.pretti--show-toplevel sh -c husky (http block)
  • https://api.github.com/repos/actions/setup-node/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --noprofile est.cjs ache/uv/0.11.8/x86_64/node (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --write **/*.cjs /home/REDACTED/.local/bin/sh **/*.json --ignore-path ../../../.pretti--show-toplevel sh -c husky (http block)
  • https://api.github.com/repos/actions/setup-node/git/ref/tags/v6
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv json&#39; --ignore-path ../../../.pr**/*.json --local 1/x64/bin/npx credential.userngit (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv rite &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.pr**/*.json user.name n-dir/node (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv */*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.prettierignore (http block)
  • https://api.github.com/repos/actions/upload-artifact/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv .js&#39; --ignore-path .prettierignore --log-level=error (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v0.1.2
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v0.1.2 --jq [.object.sha, .object.type] | @tsv --write **/*.cjs /home/REDACTED/node_modules/.bin/sh **/*.json --ignore-path ../../../.pretti--show-toplevel sh -c husky (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.0.0 --jq [.object.sha, .object.type] | @tsv .js&#39; --ignore-path .prettierignore --log-level=error (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.2.3
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.2.3 --jq [.object.sha, .object.type] | @tsv .js&#39; --ignore-path .prettierignore --log-level=error (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v0.47.4
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v0.47.4 --jq [.object.sha, .object.type] | @tsv --show-toplevel (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.0.0 --jq [.object.sha, .object.type] | @tsv on&#39; --ignore-path ../../../.prettierignore (http block)
  • https://api.github.com/repos/nonexistent/action/git/ref/tags/v999.999.999
    • Triggering command: /usr/bin/gh gh api /repos/nonexistent/action/git/ref/tags/v999.999.999 --jq [.object.sha, .object.type] | @tsv on&#39; --ignore-path ../../../.prettierignore (http block)
  • invalid.example.invalid
    • Triggering command: /usr/lib/git-core/git-remote-https /usr/lib/git-core/git-remote-https origin https://invalid.example.invalid/nonexistent-repo.git git conf�� --local --get n-dir/git user.email test@example.com--git-dir=/tmp/bare-incremental-pbT9vS ode_modules/.binfor-each-ref git comm�� -m Initial commit k/gh-aw/gh-aw/actions/setup/node_modules/.bin/git --bare --initial-branchadd ndor/bin/git git (dns block)
    • Triggering command: /usr/lib/git-core/git-remote-https /usr/lib/git-core/git-remote-https origin https://invalid.example.invalid/nonexistent-repo.git e/git init�� ndor/bin/git git ode_modules/.bin/git =receive test@example.com--git-dir=/tmp/bare-incremental-ay2Sg5 /git (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

⚠️ Smoke Gemini failed. Gemini encountered unexpected challenges...

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

⚠️ Smoke Crush failed. Crush encountered unexpected challenges...

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

🚀 Smoke OpenCode MISSION COMPLETE! OpenCode delivered. 🔥

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

🎬 THE ENDSmoke Claude MISSION: ACCOMPLISHED! The hero saves the day! ✨

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

📰 BREAKING: Smoke Copilot is now investigating this pull request. Sources say the story is developing...

@github-actions github-actions Bot removed the smoke label May 1, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

✨ The prophecy is fulfilled... Smoke Codex has completed its mystical journey. The stars align. 🌟

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Agent Container Tool Check

Tool Status Version
bash 5.2.21
sh available
git 2.53.0
jq 1.7
yq 4.52.5
curl 8.5.0
gh 2.89.0
node 22.22.2
python3 3.10.16 (PyPy 7.3.19)
go 1.24.13
java openjdk 21.0.10
dotnet 10.0.201

Result: 12/12 tools available ✅

Overall Status: PASS

🔧 Tool validation by Agent Container Smoke Test · ● 123.7K ·

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Codex smoke: FAIL
PRs: #29606 Add daily-experiment-report workflow; #29599 feat: add daily ab-testing-advisor workflow
✅ GitHub MCP ✅ Serena ✅ Playwright ❌ Web Fetch ✅ File ✅ Bash ✅ Build ✅ Comment Memory ✅ Cache Memory
Run: https://github.com/github/gh-aw/actions/runs/25230880950

Warning

Firewall blocked 2 domains

The following domains were blocked by the firewall during workflow execution:

  • ab.chatgpt.com
  • chatgpt.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "ab.chatgpt.com"
    - "chatgpt.com"

See Network Configuration for more information.

🔮 The oracle has spoken through Smoke Codex ·

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Comment Memory

Smoke test rain falls
Codex leaves three quiet lines
Build lights warm the dawn

Note

This comment is managed by comment memory.

It stores persistent context for this thread in the code block at the top of this comment.
Edit only the text inside the backtick fences; workflow metadata and the footer are regenerated automatically.

Learn more about comment memory

Warning

Firewall blocked 2 domains

The following domains were blocked by the firewall during workflow execution:

  • ab.chatgpt.com
  • chatgpt.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "ab.chatgpt.com"
    - "chatgpt.com"

See Network Configuration for more information.

🔮 The oracle has spoken through Smoke Codex ·

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

✅ Smoke test PASS for PR #29581

Test Status
GitHub MCP
MCP Scripts GH
Serena CLI
Playwright
Web Fetch
File Write
Bash
Discussion
Build
Artifact Upload
Discussion Create
Workflow Dispatch
PR Review
Comment Memory

Overall: PASS · Author: app/copilot-swe-agent · Assignees: pelikhan, Copilot

📰 BREAKING: Report filed by Smoke Copilot · ● 1.8M ·

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

🦴 UGH! Me smoke test agent! Me was here! Fire burn bright! Tests run good! Cave painting confirmed: ALL GREEN! 🎉🐒

📰 BREAKING: Report filed by Smoke Copilot · ● 1.8M ·

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Comment Memory

Code runs through the dark
Tests confirm the path is clear
Smoke fades, green lights shine

Note

This comment is managed by comment memory.

It stores persistent context for this thread in the code block at the top of this comment.
Edit only the text inside the backtick fences; workflow metadata and the footer are regenerated automatically.

Learn more about comment memory

📰 BREAKING: Report filed by Smoke Copilot · ● 1.8M ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Me copilot smoke test agent. PR add retry harness for Claude. Smart idea. Retry help when API grumpy. Code look solid.

📰 BREAKING: Report filed by Smoke Copilot · ● 1.8M

}

// GetHarnessScriptName returns the filename of the JavaScript harness script that wraps
// the Claude Code CLI with retry logic for transient Anthropic API errors (overload, rate limit).
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UGH! Big brain retry logic here. Me like how retry wrap Claude call. Very smart.

@@ -0,0 +1,383 @@
// @ts-check
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Me see new harness file! JS wrap Claude CLI. Handle retry outside Go. Good separation of concerns. Me approve.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

📰 VERDICT: Smoke Copilot has concluded. All systems operational. This is a developing story. 🎤

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

💥 Smoke Test Run 25230880894

Test Status
1 GitHub MCP
2 mcpscripts-gh
3 Serena MCP
4 Make Build ✅ (bash fallback)
5 Playwright
6 Tavily Search
7-8 File I/O
9 Discussion
10 AW MCP Status
11 Slack Output
12 Code Scan Alert
13 Update PR
14 Review Comments
15 Submit Review
16 Resolve Thread
17 Add Reviewer
18 Push to Branch
19 Close PR ⚠️ skipped

Overall: PARTIAL (test #19 skipped; #4 used bash fallback)

💥 [THE END] — Illustrated by Smoke Claude · ● 368.9K ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💥 Automated smoke test review - all systems nominal! Run 25230880894

💥 [THE END] — Illustrated by Smoke Claude · ● 368.9K

# shellcheck disable=SC1003
sudo -E 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" --tty --env-all --exclude-env ANTHROPIC_API_KEY --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --audit-dir /tmp/gh-aw/sandbox/firewall/audit --enable-host-access --allow-host-ports 80,443,8080 --skip-pull \
-- /bin/bash -c 'export PATH="${RUNNER_TEMP}/gh-aw/mcp-cli/bin:$PATH" && export PATH="$(find /opt/hostedtoolcache /home/runner/work/_tool -maxdepth 4 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true && claude --print --no-chrome --mcp-config "${{ runner.temp }}/gh-aw/mcp-config/mcp-servers.json" --allowed-tools '\''Bash,BashOutput,Edit,Edit(/tmp/gh-aw/cache-memory/*),ExitPlanMode,Glob,Grep,KillBash,LS,MultiEdit,MultiEdit(/tmp/gh-aw/cache-memory/*),NotebookEdit,NotebookRead,Read,Read(/tmp/gh-aw/cache-memory/*),Task,TodoWrite,Write,Write(/tmp/gh-aw/cache-memory/*),mcp__agenticworkflows,mcp__github__download_workflow_run_artifact,mcp__github__get_code_scanning_alert,mcp__github__get_commit,mcp__github__get_dependabot_alert,mcp__github__get_discussion,mcp__github__get_discussion_comments,mcp__github__get_file_contents,mcp__github__get_job_logs,mcp__github__get_label,mcp__github__get_latest_release,mcp__github__get_me,mcp__github__get_notification_details,mcp__github__get_pull_request,mcp__github__get_pull_request_comments,mcp__github__get_pull_request_diff,mcp__github__get_pull_request_files,mcp__github__get_pull_request_review_comments,mcp__github__get_pull_request_reviews,mcp__github__get_pull_request_status,mcp__github__get_release_by_tag,mcp__github__get_secret_scanning_alert,mcp__github__get_tag,mcp__github__get_workflow_run,mcp__github__get_workflow_run_logs,mcp__github__get_workflow_run_usage,mcp__github__issue_read,mcp__github__list_branches,mcp__github__list_code_scanning_alerts,mcp__github__list_commits,mcp__github__list_dependabot_alerts,mcp__github__list_discussion_categories,mcp__github__list_discussions,mcp__github__list_issue_types,mcp__github__list_issues,mcp__github__list_label,mcp__github__list_notifications,mcp__github__list_pull_requests,mcp__github__list_releases,mcp__github__list_secret_scanning_alerts,mcp__github__list_starred_repositories,mcp__github__list_tags,mcp__github__list_workflow_jobs,mcp__github__list_workflow_run_artifacts,mcp__github__list_workflow_runs,mcp__github__list_workflows,mcp__github__pull_request_read,mcp__github__search_code,mcp__github__search_issues,mcp__github__search_orgs,mcp__github__search_pull_requests,mcp__github__search_repositories,mcp__github__search_users,mcp__safeoutputs'\'' --debug-file /tmp/gh-aw/agent-stdio.log --verbose --permission-mode bypassPermissions --output-format stream-json "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)"${GH_AW_MODEL_AGENT_CLAUDE:+ --model "$GH_AW_MODEL_AGENT_CLAUDE"}' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log
-- /bin/bash -c 'export PATH="${RUNNER_TEMP}/gh-aw/mcp-cli/bin:$PATH" && export PATH="$(find /opt/hostedtoolcache /home/runner/work/_tool -maxdepth 4 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/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 || echo node)"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/claude_harness.cjs claude --print --no-chrome --mcp-config "${{ runner.temp }}/gh-aw/mcp-config/mcp-servers.json" --allowed-tools '\''Bash,BashOutput,Edit,Edit(/tmp/gh-aw/cache-memory/*),ExitPlanMode,Glob,Grep,KillBash,LS,MultiEdit,MultiEdit(/tmp/gh-aw/cache-memory/*),NotebookEdit,NotebookRead,Read,Read(/tmp/gh-aw/cache-memory/*),Task,TodoWrite,Write,Write(/tmp/gh-aw/cache-memory/*),mcp__agenticworkflows,mcp__github__download_workflow_run_artifact,mcp__github__get_code_scanning_alert,mcp__github__get_commit,mcp__github__get_dependabot_alert,mcp__github__get_discussion,mcp__github__get_discussion_comments,mcp__github__get_file_contents,mcp__github__get_job_logs,mcp__github__get_label,mcp__github__get_latest_release,mcp__github__get_me,mcp__github__get_notification_details,mcp__github__get_pull_request,mcp__github__get_pull_request_comments,mcp__github__get_pull_request_diff,mcp__github__get_pull_request_files,mcp__github__get_pull_request_review_comments,mcp__github__get_pull_request_reviews,mcp__github__get_pull_request_status,mcp__github__get_release_by_tag,mcp__github__get_secret_scanning_alert,mcp__github__get_tag,mcp__github__get_workflow_run,mcp__github__get_workflow_run_logs,mcp__github__get_workflow_run_usage,mcp__github__issue_read,mcp__github__list_branches,mcp__github__list_code_scanning_alerts,mcp__github__list_commits,mcp__github__list_dependabot_alerts,mcp__github__list_discussion_categories,mcp__github__list_discussions,mcp__github__list_issue_types,mcp__github__list_issues,mcp__github__list_label,mcp__github__list_notifications,mcp__github__list_pull_requests,mcp__github__list_releases,mcp__github__list_secret_scanning_alerts,mcp__github__list_starred_repositories,mcp__github__list_tags,mcp__github__list_workflow_jobs,mcp__github__list_workflow_run_artifacts,mcp__github__list_workflow_runs,mcp__github__list_workflows,mcp__github__pull_request_read,mcp__github__search_code,mcp__github__search_issues,mcp__github__search_orgs,mcp__github__search_pull_requests,mcp__github__search_repositories,mcp__github__search_users,mcp__safeoutputs'\'' --debug-file /tmp/gh-aw/agent-stdio.log --verbose --permission-mode bypassPermissions --output-format stream-json --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt${GH_AW_MODEL_AGENT_CLAUDE:+ --model "$GH_AW_MODEL_AGENT_CLAUDE"}' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Smoke test review comment #1 — The claude_harness.cjs wrapper is now correctly invoked via node with --prompt-file. This is a good improvement over inline shell expansion which could fail with large prompts.

# shellcheck disable=SC1003
sudo -E 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" --mount "${RUNNER_TEMP}/gh-aw/safeoutputs/upload-artifacts:${RUNNER_TEMP}/gh-aw/safeoutputs/upload-artifacts:rw" --tty --env-all --exclude-env ANTHROPIC_API_KEY --exclude-env GH_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --audit-dir /tmp/gh-aw/sandbox/firewall/audit --enable-host-access --allow-host-ports 80,443,8080 --skip-pull --difc-proxy-host host.docker.internal:18443 --difc-proxy-ca-cert /tmp/gh-aw/difc-proxy-tls/ca.crt \
-- /bin/bash -c 'export PATH="${RUNNER_TEMP}/gh-aw/mcp-cli/bin:$PATH" && export PATH="$(find /opt/hostedtoolcache /home/runner/work/_tool -maxdepth 4 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true && claude --print --no-chrome --mcp-config "${{ runner.temp }}/gh-aw/mcp-config/mcp-servers.json" --allowed-tools '\''Bash(cat),Bash(cat:*),Bash(date),Bash(date:*),Bash(echo),Bash(echo:*),Bash(grep),Bash(head),Bash(ls),Bash(mkdir:*),Bash(pwd),Bash(safeoutputs:*),Bash(sort),Bash(tail),Bash(tee:*),Bash(uniq),Bash(wc),Bash(yq),BashOutput,Edit,ExitPlanMode,Glob,Grep,KillBash,LS,MultiEdit,NotebookEdit,NotebookRead,Read,Task,TodoWrite,Write,mcp__github__download_workflow_run_artifact,mcp__github__get_code_scanning_alert,mcp__github__get_commit,mcp__github__get_dependabot_alert,mcp__github__get_discussion,mcp__github__get_discussion_comments,mcp__github__get_file_contents,mcp__github__get_job_logs,mcp__github__get_label,mcp__github__get_latest_release,mcp__github__get_me,mcp__github__get_notification_details,mcp__github__get_pull_request,mcp__github__get_pull_request_comments,mcp__github__get_pull_request_diff,mcp__github__get_pull_request_files,mcp__github__get_pull_request_review_comments,mcp__github__get_pull_request_reviews,mcp__github__get_pull_request_status,mcp__github__get_release_by_tag,mcp__github__get_secret_scanning_alert,mcp__github__get_tag,mcp__github__get_workflow_run,mcp__github__get_workflow_run_logs,mcp__github__get_workflow_run_usage,mcp__github__issue_read,mcp__github__list_branches,mcp__github__list_code_scanning_alerts,mcp__github__list_commits,mcp__github__list_dependabot_alerts,mcp__github__list_discussion_categories,mcp__github__list_discussions,mcp__github__list_issue_types,mcp__github__list_issues,mcp__github__list_label,mcp__github__list_notifications,mcp__github__list_pull_requests,mcp__github__list_releases,mcp__github__list_secret_scanning_alerts,mcp__github__list_starred_repositories,mcp__github__list_tags,mcp__github__list_workflow_jobs,mcp__github__list_workflow_run_artifacts,mcp__github__list_workflow_runs,mcp__github__list_workflows,mcp__github__pull_request_read,mcp__github__search_code,mcp__github__search_issues,mcp__github__search_orgs,mcp__github__search_pull_requests,mcp__github__search_repositories,mcp__github__search_users,mcp__safeoutputs'\'' --debug-file /tmp/gh-aw/agent-stdio.log --verbose --permission-mode acceptEdits --output-format stream-json "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)"${GH_AW_MODEL_AGENT_CLAUDE:+ --model "$GH_AW_MODEL_AGENT_CLAUDE"}' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log
-- /bin/bash -c 'export PATH="${RUNNER_TEMP}/gh-aw/mcp-cli/bin:$PATH" && export PATH="$(find /opt/hostedtoolcache /home/runner/work/_tool -maxdepth 4 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/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 || echo node)"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/claude_harness.cjs claude --print --no-chrome --mcp-config "${{ runner.temp }}/gh-aw/mcp-config/mcp-servers.json" --allowed-tools '\''Bash(cat),Bash(cat:*),Bash(date),Bash(date:*),Bash(echo),Bash(echo:*),Bash(grep),Bash(head),Bash(ls),Bash(mkdir:*),Bash(pwd),Bash(safeoutputs:*),Bash(sort),Bash(tail),Bash(tee:*),Bash(uniq),Bash(wc),Bash(yq),BashOutput,Edit,ExitPlanMode,Glob,Grep,KillBash,LS,MultiEdit,NotebookEdit,NotebookRead,Read,Task,TodoWrite,Write,mcp__github__download_workflow_run_artifact,mcp__github__get_code_scanning_alert,mcp__github__get_commit,mcp__github__get_dependabot_alert,mcp__github__get_discussion,mcp__github__get_discussion_comments,mcp__github__get_file_contents,mcp__github__get_job_logs,mcp__github__get_label,mcp__github__get_latest_release,mcp__github__get_me,mcp__github__get_notification_details,mcp__github__get_pull_request,mcp__github__get_pull_request_comments,mcp__github__get_pull_request_diff,mcp__github__get_pull_request_files,mcp__github__get_pull_request_review_comments,mcp__github__get_pull_request_reviews,mcp__github__get_pull_request_status,mcp__github__get_release_by_tag,mcp__github__get_secret_scanning_alert,mcp__github__get_tag,mcp__github__get_workflow_run,mcp__github__get_workflow_run_logs,mcp__github__get_workflow_run_usage,mcp__github__issue_read,mcp__github__list_branches,mcp__github__list_code_scanning_alerts,mcp__github__list_commits,mcp__github__list_dependabot_alerts,mcp__github__list_discussion_categories,mcp__github__list_discussions,mcp__github__list_issue_types,mcp__github__list_issues,mcp__github__list_label,mcp__github__list_notifications,mcp__github__list_pull_requests,mcp__github__list_releases,mcp__github__list_secret_scanning_alerts,mcp__github__list_starred_repositories,mcp__github__list_tags,mcp__github__list_workflow_jobs,mcp__github__list_workflow_run_artifacts,mcp__github__list_workflow_runs,mcp__github__list_workflows,mcp__github__pull_request_read,mcp__github__search_code,mcp__github__search_issues,mcp__github__search_orgs,mcp__github__search_pull_requests,mcp__github__search_repositories,mcp__github__search_users,mcp__safeoutputs'\'' --debug-file /tmp/gh-aw/agent-stdio.log --verbose --permission-mode acceptEdits --output-format stream-json --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt${GH_AW_MODEL_AGENT_CLAUDE:+ --model "$GH_AW_MODEL_AGENT_CLAUDE"}' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Smoke test review comment #2 — Consistent harness wrapping across workflows. The claude_harness.cjs node invocation properly handles retry logic for 429/529 errors. Verified in Run 25230880894.

@pelikhan pelikhan merged commit 0f182f6 into main May 1, 2026
167 of 170 checks passed
@pelikhan pelikhan deleted the copilot/review-claude-agent-driver branch May 1, 2026 20:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants