Skip to content

perf: fix BenchmarkValidation regression (+119.3%) — cache concurrency validation and toolsets#28744

Merged
pelikhan merged 4 commits intomainfrom
copilot/fix-validation-performance-regression
Apr 27, 2026
Merged

perf: fix BenchmarkValidation regression (+119.3%) — cache concurrency validation and toolsets#28744
pelikhan merged 4 commits intomainfrom
copilot/fix-validation-performance-regression

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 27, 2026

BenchmarkValidation was 119.3% above historical average (250µs vs 114µs on CI) because validateWorkflowData re-ran two expensive operations on every call.

Root cause

validateConcurrencyGroupExpression was invoked on every iteration with the auto-generated workflow-level concurrency expression (e.g. gh-aw-${{ github.workflow }}-${{ ... }}). This triggers a regex scan + full ExpressionParser tokenize/parse pass — accounting for 47% of all allocations per iteration. The 70e10f676 fix cached the extraction of the expression from YAML but not the validation of it.

ParseGitHubToolsets was called twice per iteration: once inside ValidatePermissions (via GetToolsets()expandDefaultToolset) and again in validateToolConfiguration.

Changes

  • WorkflowData: add CachedConcurrencyGroupExprErr/CachedConcurrencyGroupExprSet and CachedParsedToolsets fields
  • applyDefaults defer block (tools.go): pre-validate the concurrency group expression and pre-parse toolsets once after all mutations are applied
  • compiler_validators.go: use cached concurrency result (with live-compute fallback for WorkflowData created outside ParseWorkflowFile); use CachedParsedToolsets in validateToolConfiguration
  • ValidatePermissions (permissions_validation.go): add optional parsedToolsets ...[]string variadic parameter (backward-compatible) so callers can skip the redundant ParseGitHubToolsets call

Result

before after
ns/op 7,016 2,390
allocs/op 40 10
B/op 2,080 552

~3× faster, 75% fewer allocations — well below the 114µs historical baseline.

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 gh repo view --json owner,name --jq .owner.login + "/" + .name k/gh-aw/gh-aw/actions/node_modules/.bin/sh nore ./pkg/workflow/ ache/node/24.14.--show-toplevel sh -c te '**/*.cjs' '**/*.ts' '**/*.json' --ignore-path ../../../.prettierignore bash .cfg --noprofile 3S1OFwt0u1_eyEoCrev-parse bin/bash bash (http block)
    • Triggering command: /usr/bin/gh gh repo view owner/repo 1423�� --show-toplevel bash k/gh-aw/gh-aw/actions/node_modules/.bin/node --noprofile x_amd64/vet /home/REDACTED/.local/bin/bash bash k/gh�� 8109/001/stability-test.md bash k/_temp/uv-python-dir/sh --noprofile x_amd64/vet erignore /opt/hostedtoolc12346 (http block)
    • Triggering command: /usr/bin/gh gh repo view owner/repo --no�� --noprofile bash k/gh-aw/node_modules/.bin/node --noprofile x_amd64/vet 1/x64/bin/bash bash k/gh�� --noprofile bash 64/pkg/tool/linux_amd64/link --noprofile x_amd64/vet erignore 64/pkg/tool/linux_amd64/link (http block)
  • https://api.github.com/orgs/test-owner/actions/secrets
    • Triggering command: /usr/bin/gh gh api /orgs/test-owner/actions/secrets --jq .secrets[].name --noprofile /opt/hostedtoolcache/go/1.25.8/x/opt/hostedtoolcache/go/1.25.8/x64/src/debug/gosym/pclntab.go x_amd64/compile -unreachable=fal/opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet /tmp/go-build422-atomic 86_64/bash x_amd64/compile --no�� js/**/*.json' ---errorsas /opt/hostedtoolc-ifaceassert 64/pkg/tool/linu-nilfunc -bool -buildtags /opt/hostedtoolc--show-toplevel 64/pkg/tool/linu-tests (http block)
    • Triggering command: /usr/bin/gh gh api /orgs/test-owner/actions/secrets --jq .secrets[].name -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env json' --ignore-p-p GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (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 --get remote.origin.url /usr/bin/git hub/workflows /opt/hostedtoolcrev-parse 64/pkg/tool/linu--show-toplevel git rev-�� --show-toplevel 64/pkg/tool/linux_amd64/compile /usr/bin/git g_.a grep x_amd64/link git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq [.object.sha, .object.type] | @tsv --git-dir 64/pkg/tool/linux_amd64/compile /usr/bin/git 442580430/.githugit GO111MODULE 64/pkg/tool/linu--show-toplevel git rev-�� --show-toplevel 64/pkg/tool/linux_amd64/vet /usr/bin/git mBE0P9mvl g/tty/tty_wasm.g/opt/hostedtoolcache/node/24.14.1/x64/bin/npm ache/go/1.25.8/xinstall 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 /tmp/TestHashConsistency_GoAndJavaScript2886900622/001/test-inlined-imports-enabled-with-env-temgit 2338169/b466/_testmain.go /usr/bin/unpigz (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq [.object.sha, .object.type] | @tsv --get remote.origin.url /usr/bin/git on' --ignore-patgit GO111MODULE 64/bin/go git remo�� GOMODCACHE go /usr/bin/git -json GO111MODULE x_amd64/asm git (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 te '../../../**/*.json' '!../../../pkg/workflow/js/**/*.json' ---errorsas 53 ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile ACCEPT .go 64/bin/bash ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile rev-�� 4246642666 bash ingutil.test --noprofile b/gh-aw/pkg/cli 64/pkg/tool/linu--show-toplevel ingutil.test (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv --show-toplevel bash /usr/bin/git 5SsZLhVho bash ache/go/1.25.8/x: git rev-�� --show-toplevel ortcfg /usr/bin/git edcfg security /home/REDACTED/nod--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 ache/go/1.25.8/x64/pkg/tool/linux_amd64/link /usr/bin/git 2338169/b459/ttygit remote.origin.urrev-parse e/git git rev-�� --show-toplevel e/git /usr/bin/git ry=1 remote 2338169/b459/_pk--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 aA5BM4NdI bash 64/pkg/tool/linux_amd64/vet =receive 64/pkg/tool/linurev-parse flow.test 64/pkg/tool/linux_amd64/vet ortc�� licyMinIntegrityOnlymin-integrity_with_repos_arr@{u} .cfg (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv runs/20260427-160244-16974/test-1438286504 -trimpath ache/node/24.14.1/x64/bin/node l github.com/githurev-parse -lang=go1.25 git t-13�� 2663136526 -goversion /usr/bin/git -c=4 -nolocalimports -importcfg git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv git-receive-pack '/tmp/TestParseDefaultBranchFromLsRemoteWithRealGitbranch_with_hyphen594776801/git l /usr/bin/git h ../../../.pretgit TOKEN"; }; f getrev-parse ache/go/1.25.8/x--show-toplevel git -C /tmp/TestGuardPolicyTrustedUsersRequiresMinIntegv1.0.0 remote clusion,workflowName,createdAt,startedAt,updated/tmp/gh-aw-git-clone-3685976461 js/**/*.json' --git /opt/hostedtoolcrev-parse /usr/local/sbin/--show-toplevel /tmp/go-build1142338169/b441/sliceutil.test (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 64/pkg/tool/linuconfig /usr/bin/git g_.a --silent /opt/hostedtoolcache/go/1.25.8/x--show-toplevel git rev-�� --show-toplevel sh /usr/bin/git d1bgTIFEu '/tmp/TestParseDrev-parse 64/pkg/tool/linu--show-toplevel git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq [.object.sha, .object.type] | @tsv --paginate repos/{owner}/{repo}/actions/runs/3/artifacts /usr/bin/git .artifacts[].nambash aMu6/n6X7R7Av3bG/tmp/gh-aw-test-runs/20260427-160756-56438/test-patch-priority-41463�� 5606961/b227=> git rev-�� --show-toplevel git /usr/bin/gh 5606961/b095/impgit -ZkR/Y5KUpR6ZrQZrev-parse e/git-upload-pac--show-toplevel gh (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 --noprofile x_amd64/compile modules/@npmcli/run-script/lib/node-gyp-bin/sh se 7696643/b184/vet/home/REDACTED/.npm/_npx/b388654678d519d9/node_modules/.bin/prettier ache/go/1.25.8/x--write bash --no�� h ../../../.pret.prettierignore ache/go/1.25.8/x--log-level=error ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile --noprofile (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv --oneline -- 1/x64/bin/bash se 7696643/b232/vet/opt/hostedtoolcache/node/24.14.1/x64/bin/npm ndor/bin/bash ache/go/1.25.8/xformat:pkg-json --no�� h ../../../.prettierignore ache/go/1.25.8/x64/pkg/tool/linux_amd64/link ache/go/1.25.8/x64/bin/go 7696643/b001/worbash (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv --noprofile ache/go/1.25.8/x64/pkg/tool/linupkg/workflow/compiler_validators.go 5205374b52a04c60c187e44c7ebc7e5a-d HEAD (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 --show-toplevel ache/go/1.25.8/x-test.v=true /usr/bin/docker .js' --ignore-pagit bash ules/.bin/node docker pull�� test/race-image:v1.0.0 ache/go/1.25.8/x/home/REDACTED/work/gh-aw/gh-aw/pkg/testutil/tempdir_test.go /usr/bin/infocmp plorer.md bash x_amd64/link infocmp (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv GOMODCACHE 64/pkg/tool/linuTest User rue,"errors":[],"warnings":[]}] 47/001/test-frongit GO111MODULE 64/pkg/tool/linu--show-toplevel git rev-�� --show-toplevel 64/pkg/tool/linux_amd64/compile (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 user.name Test User (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --show-toplevel bash /usr/bin/gh mLsRemoteWithReagit mLsRemoteWithRearev-parse tions/node_modul--show-toplevel gh run download 2 /usr/bin/git test-logs/run-2 bash 64/pkg/tool/linu--show-toplevel git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv list --json /usr/bin/git -json GO111MODULE 64/bin/go git rev-�� --show-toplevel go mple.com/org/repo.git json' --ignore-pgit GO111MODULE 64/bin/go 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 "prettier" --write 'scripts/**/*.js' --ignore-path .prettierignoremote.origin.url bash 64/pkg/tool/linux_amd64/vet tierignore 64/pkg/tool/linurev-parse ache/uv/0.11.8/x--show-toplevel 64/pkg/tool/linux_amd64/vet /hom�� --write ../../../**/*.json ache/go/1.25.8/x64/pkg/tool/linux_amd64/link --ignore-path ../../../.prettirev-parse x_amd64/asm ache/go/1.25.8/x64/pkg/tool/linu-test.v=true (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv /tmp/go-build1142338169/b070/gh-aw.test -importcfg .cfg -s -w -buildmode=exe ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile rev-�� 2338169/b454/_pkg_.a -extld=gcc 2338169/b466/typeutil.test ath ../../../.prgit b/gh-aw/pkg/testrev-parse x_amd64/compile 2338169/b466/typeutil.test (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv --all-progress-implied --revs /usr/bin/git --thin --delta-base-offrev-parse -q git conf�� user.email test@example.com ache/node/24.14.1/x64/bin/node js/**/*.json' --git 0dfd78d07..83597rev-parse k/_temp/uv-pytho--show-toplevel ache/node/24.14.1/x64/bin/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 ons-test1031020869 x_amd64/asm /tmp/go-build1142338169/b435/repoutil.test 881651407/001' 881651407/001' ormance.md /tmp/go-build1142338169/b435/repoutil.test -tes�� -test.paniconexit0 -test.v=true 0"}} -test.timeout=10git -test.run=^Test -test.short=true--show-toplevel git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --symref l /usr/bin/git -json GO111MODULE 64/bin/go git rev-�� --show-toplevel go /usr/bin/git -json context/xcontext-1 ode_modules/.binxterm-color git (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq [.object.sha, .object.type] | @tsv run lint:cjs 64/bin/go GOSUMDB GOWORK 64/bin/go sh -c "prettier" --cheGOINSECURE git 64/bin/go --show-toplevel git 64/bin/go go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq [.object.sha, .object.type] | @tsv log.showsignaturGOINSECURE log $name) { hasDiscussionsEnabled } } -d git 64/bin/go go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq [.object.sha, .object.type] | @tsv /usr/bin/git bash 64/bin/go --noprofile git 64/bin/go go env tions-lock.json pkg/actionpins/data/action_pins.json; \ cp .github/aw/actions-lock.json pkg/worgit GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw --jq .default_branch -json GO111MODULE r: $owner, name: $name) { hasDiscussionsEnabled } } GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE r: $owner, name: $name) { hasDiscussionsEnabled } } GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw --jq .default_branch nput.go false r: $owner, name: $name) { hasDiscussionsEnabled } } --require /home/REDACTED/wor-C 5b 1/x64/bin/node ve HEAD tions/setup/js/node_modules/viteowner=github r: $owner, name: $name) { hasDiscussionsEnabled } } --is-ancestor k/gh-aw/gh-aw/ac-C run-script/lib/n/home/REDACTED/work/gh-aw/gh-aw tions/setup/js/nshow (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw --jq .default_branch ithub/workflows -m ock.yml --require /home/REDACTED/wor-C ache/uv/0.11.8/x/home/REDACTED/work/gh-aw/gh-aw/.github/workflows /opt/hostedtoolcrev-parse -V=f�� ithub/workflows git repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } feature | cat /egit mp odules/npm/node_/home/REDACTED/work/gh-aw/gh-aw /opt/hostedtoolcshow (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 -3711905795/base.md -3711905795/new.md /usr/bin/git .js' --ignore-pagit validation_test.rev-parse tions/setup/node--show-toplevel /usr/bin/git remo�� -v .go /usr/bin/git l.go l_test.go son git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v0.1.2 --jq [.object.sha, .object.type] | @tsv --show-toplevel go /usr/bin/git flags="-w -s" -ogit at.go 64/pkg/tool/linu--show-toplevel git conf�� user.email test@example.com /usr/bin/git g_.a GO111MODULE 64/pkg/tool/linu--show-toplevel 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 k/gh-aw/gh-aw/.github/workflows/agent-persona-explorer.md ache/go/1.25.8/x../../../**/*.json /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/link yphen594776801/0git yphen594776801/0rev-parse cal/bin/bash /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/link -o /tmp/go-build1142338169/b444/stats.test (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.0.0 --jq [.object.sha, .object.type] | @tsv git-upload-pack '/tmp/TestParseDefaultBranchFromLsRemoteWithReal--detach l /usr/bin/git ays.md GO111MODULE 64/bin/go git -C runs/20260427-160750-55079/test-3052888509 remote /opt/hostedtoolcache/node/24.14.1/x64/bin/node s/test.md GO111MODULE 64/bin/go node (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 /ref/tags/v9 2338169/b111/vet.cfg sv remote.origin.urgit /opt/hostedtoolcrev-parse x_amd64/link git -C /tmp/gh-aw-test-runs/20260427-160244-16974/test-742462801 l /usr/bin/git J8gm/QEx8rI651Ywgit 64/pkg/tool/linurev-parse tnet/tools/git git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.2.3 --jq [.object.sha, .object.type] | @tsv git-upload-pack '/tmp/TestParseDefaultBranchFromLsRemoteWithRealGitmaster_branch699684073/001' l /usr/bin/git .github/workflowgit GO111MODULE 64/bin/go git -C /tmp/TestGuardPolicyMinIntegrityOnlymin-integrity_with_explicit_repo2826927229/001 config /opt/hostedtoolcache/node/24.14.1/x64/bin/node remote.origin.urinfocmp GO111MODULE 64/bin/go node (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --limit 100 --created >=2026-04-20 (http block)
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --limit 100 --created >=2026-03-28 (http block)
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --limit 100 --created >=2026-01-27 -j DROP bash tion�� hub/workflows = get && echo "******"; }; f store h --noprofile pkg/workflow/cacmaintenance ndor/bin/bash ache/go/1.25.8/x--auto (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/1/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/1/artifacts --jq .artifacts[].name pkg/workflow/action_sha_checker_test.go 64/pkg/tool/linux_amd64/link pkg/workflow/actgit pkg/workflow/actrev-parse pkg/workflow/act--show-toplevel 64/pkg/tool/linux_amd64/link --no�� 2839298233/.github/workflows pkg/workflow/add_comment_target_main x_amd64/link --noprofile x_amd64/vet ache/go/1.25.8/x--show-toplevel x_amd64/link (http block)
    • Triggering command: /usr/bin/gh gh run download 1 --dir test-logs/run-1 bash 64/pkg/tool/linux_amd64/compile ignore x_amd64/vet 1/x64/bin/bash 64/pkg/tool/linux_amd64/compile ache�� 742462801/custom/workflows bash rgo/bin/sh --noprofile util_test /usr/bin/bash bash (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/1/artifacts --jq .artifacts[].name ahb4/lZep-2MiwczJtV1iahb4 5606961/b223=> GOSUMDB GOWORK 64/bin/go git -c ithub/workflows (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/12345/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/12345/artifacts --jq .artifacts[].name bash 64/pkg/tool/linux_amd64/vet --noprofile x_amd64/vet /tmp/go-build254github.event.issue.number 64/pkg/tool/linux_amd64/vet -V=f�� x_amd64/vet /tmp/go-build254owner x_amd64/compile -nodecount=20 /tmp/cpu.prof rgo/bin/bash x_amd64/compile (http block)
    • Triggering command: /usr/bin/gh gh run download 12345 --dir test-logs/run-12345 ne_constants.go 64/pkg/tool/linu-importcfg --noprofile x_amd64/vet cal/bin/bash 64/pkg/tool/linux_amd64/compile --no�� --noprofile bash k/gh-aw/node_modules/.bin/node --noprofile x_amd64/vet 1/x64/bin/bash bash (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/12345/artifacts --jq .artifacts[].name rn9z/FXv0oohNOW0KmEF_rn9z ache/go/1.25.8/x64/pkg/tool/linux_amd64/vet GOSUMDB GOWORK 64/bin/go ache/go/1.25.8/x64/pkg/tool/linutest@example.com -V=f�� 5606961/b119/importcfg Wcxh/t93e_TlVPDjjPRjWWcxh /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/compile --write ../../../**/*.jsrev-parse 64/bin/go /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/compile (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/12346/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/12346/artifacts --jq .artifacts[].name bash aw.test --noprofile x_amd64/vet /home/REDACTED/wor-v aw.test 1423�� x_amd64/vet bash e_modules/.bin/node --noprofile missions\b nfig/composer/ve--show-toplevel iptables (http block)
    • Triggering command: /usr/bin/gh gh run download 12346 --dir test-logs/run-12346 bash 64/pkg/tool/linux_amd64/compile --noprofile x_amd64/vet /home/REDACTED/.losteps.test.outputs.result 64/pkg/tool/linux_amd64/compile --no�� g_.a bash k/gh-aw/gh-aw/node_modules/.bin/node --noprofile tants 64/bin/bash bash (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/12346/artifacts --jq .artifacts[].name -QbQ/h0mDcb4RKnBUHEwN-QbQ 1/x64/bin/node GOSUMDB GOWORK run-script/lib/n--show-toplevel 4270/b404/cli.test t-ha�� ithub/workflows/archie.md IPxV/l55902s4ayDCLJOlIPxV (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/2/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/2/artifacts --jq .artifacts[].name owner 64/pkg/tool/linux_amd64/link 0 -j ACCEPT 64/pkg/tool/linux_amd64/link --no�� .test git ortcfg.link )$/\1/p -- sh MNWyDzQ4auC1XaA_remote.origin.url (http block)
    • Triggering command: /usr/bin/gh gh run download 2 --dir test-logs/run-2 bash 64/pkg/tool/linux_amd64/link ignore x_amd64/vet /home/REDACTED/wor--show-toplevel 64/pkg/tool/linux_amd64/link --no�� 742462801 bash ck --noprofile x_amd64/vet sh iUEqf5PFeb3NCkL0nF/2rw-RdHCw_apH-buildtags (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/2/artifacts --jq .artifacts[].name vNkW/MmwpPo_3e3tB-Au8vNkW At,event,headBranch,headSha,displayTitle iles use Prettiegit able 64/bin/go git stat�� ithub/workflows dpoL/2ZiNq7r3HsYyi2fVdpoL e/git -json GO111MODULE 64/bin/go e/git (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/3/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/3/artifacts --jq .artifacts[].name -benchmem 64/pkg/tool/linu-nolocalimports -run=^$ ./pkg/workflow/ /usr/bin/bash 64/pkg/tool/linu/tmp/go-build1142338169/b462/_testmain.go --no�� 2839298233/.github/workflows bash bin/node --noprofile x_amd64/vet ache/node/24.14.--show-toplevel bash (http block)
    • Triggering command: /usr/bin/gh gh run download 3 --dir test-logs/run-3 git x_amd64/compile ignore --stat ndor/bin/bash x_amd64/compile --no�� eutil.test bash ortcfg.link nc.*Print\|func.git o p/bin/bash 1tjYVSqOEP82kiP9ch/8p_7IHIf_31YR-trimpath (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/3/artifacts --jq .artifacts[].name aMu6/n6X7R7Av3bGkLZAPaMu6 5606961/b227=> GOSUMDB l/ascii 64/bin/go git -c 5606961/b095/importcfg -ZkR/Y5KUpR6ZrQZn8hJV-ZkR e/git-upload-pack -n1 --format=format:rev-parse --end-of-options--show-toplevel /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linu--auto (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/4/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/4/artifacts --jq .artifacts[].name 53 64/pkg/tool/linux_amd64/compile ACCEPT x_amd64/vet /usr/bin/pager 64/pkg/tool/linux_amd64/compile --no�� 2839298233 /usr/bin/pager ache/node/24.14.1/x64/bin/node (.*\)$/\2/p 33 cal/bin/bash bash (http block)
    • Triggering command: /usr/bin/gh gh run download 4 --dir test-logs/run-4 bash 64/pkg/tool/linux_amd64/vet ignore x_amd64/vet /opt/hostedtoolc--show-toplevel 64/pkg/tool/linux_amd64/vet --no�� rite '**/*.cjs' '**/*.ts' '**/*.-p bash tnet/tools/sh --noprofile x_amd64/vet rgo/bin/bash /opt/hostedtoolcache/go/1.25.8/x-test.v=true (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/4/artifacts --jq .artifacts[].name GOPROXY 5606961/b226=> GOSUMDB l 5606961/b092/sym--show-toplevel ache/go/1.25.8/x64/src/reflect/asm_wasm.s conf�� extensions.objectformat FnMM/DTE1YZYN5-LgmGb0FnMM /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/compile -json GO111MODULE 64/bin/go /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linuInitial commit (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/5/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/5/artifacts --jq .artifacts[].name 53 x_amd64/vet ACCEPT x_amd64/vet /usr/bin/git x_amd64/vet --no�� --noprofile uoczUFi/AscsIbzFBlwwzyv4h75e ache/go/1.25.8/x64/bin/node /\1/p --stat 53058ead0a0d1a07--show-toplevel bash (http block)
    • Triggering command: /usr/bin/gh gh run download 5 --dir test-logs/run-5 bash 64/pkg/tool/linux_amd64/compile ignore x_amd64/vet 64/bin/bash 64/pkg/tool/linux_amd64/compile ache�� 22/001/test-empty-frontmatter.md-errorsas bash (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/5/artifacts --jq .artifacts[].name GOPROXY 5606961/b230=> GOSUMDB contextprotocol/rev-parse 5606961/b092/sym--show-toplevel git for-�� ithub/workflows 5606961/b092/importcfg /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/compile -json GO111MODULE 64/bin/go /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/compile (http block)
  • https://api.github.com/repos/github/gh-aw/actions/workflows
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path -c=4 -nolocalimports -importcfg /tmp/go-build1142338169/b430/importcfg -embedcfg /tmp/go-build1142338169/b430/embedcfg -pack --no�� js/**/*.json' ---errorsas /opt/hostedtoolc-ifaceassert 64/pkg/tool/linu-nilfunc -unreachable=falgit /tmp/go-build422-C 64/bin/bash 64/pkg/tool/linurev-parse (http block)
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --workflow nonexistent-workflow-12345 --limit 100 /tmp/go-build422init nfig/composer/ve--bare /opt/hostedtoolc--initial-branch=my-default -ato�� 3395028889/.github/workflows -buildtags ce-regression -errorsas -ifaceassert -nilfunc go (http block)
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --workflow nonexistent-workflow-12345 --limit 6 4757897/b241/embrev-parse /opt/hostedtoolc--show-toplevel 64/pkg/tool/linux_amd64/link --no�� --noprofile /opt/hostedtoolcache/go/1.25.8/xnonexistent-workflow-12345 /usr/local/.ghcup/bin/git .go ion_cache.go tnet/tools/bash git (http block)
  • https://api.github.com/repos/github/gh-aw/contents/.github/workflows/shared/reporting.md
    • Triggering command: /tmp/go-build1142338169/b404/cli.test /tmp/go-build1142338169/b404/cli.test -test.testlogfile=/tmp/go-build1142338169/b404/testlog.txt -test.paniconexit0 -test.v=true -test.parallel=4 -test.timeout=10m0s -test.run=^Test -test.short=true -r foreach(ini_get_-c ache/go/1.25.8/x"prettier" --write 'scripts/**/*.js' --ignore-path .prettierignore --log-level=e!../../../pkg/workflow/js/**/*.json git log ath ../../../.prettierignore 0dfd78d07..70e10f676 x_amd64/asm pkg/workflow/ pkg/mod/github.c-c /opt/hostedtoolc"prettier" --write '../../../**/*.json' '!../../../pkg/workflow/js/**/*.json' ---errorsas x_amd64/asm (http block)
    • Triggering command: /tmp/go-build5544270/b404/cli.test /tmp/go-build5544270/b404/cli.test -test.testlogfile=/tmp/go-build5544270/b404/testlog.txt -test.paniconexit0 -test.v=true -test.parallel=4 -test.timeout=10m0s -test.run=^Test -test.short=true -nolocalimports -importcfg /tmp/go-build1775606961/b197/importcfg -pack env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (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 git /usr/bin/git ApprovalLabelsCogit stmain.go /opt/hostedtoolc--show-toplevel git rev-�� --show-toplevel sh /usr/bin/git ithub/workflows 64/pkg/tool/linu-lh /home/REDACTED/wor/tmp/gh-aw/aw-feature-branch.patch git (http block)
    • 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 ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile /usr/bin/git ons/secrets in/yaml/v3@v3.0.rev-parse ache/go/1.25.8/x--show-toplevel /usr/bin/git remo�� -v ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile /usr/bin/git 5606961/b239/_pkls c9ZF/KtTFKQuDD_P-lh 1/x64/bin/node 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 copilot/fix-validation-performan-c=4 x_amd64/compile ache/go/1.25.8/x64/bin/node --noprofile x_amd64/vet 64/bin/bash erignore ache�� sRemoteWithRealGitbranch_with_hyphen594776801/00remote.origin.url sRemoteWithRealGitbranch_with_hyphen594776801/002/work /usr/local/sbin/bash --noprofile x_amd64/vet /usr/local/bin/b--show-toplevel bash (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.0.0 --jq [.object.sha, .object.type] | @tsv ub/workflows GO111MODULE x_amd64/vet GOINSECURE GOMOD emmove_wasm.s x_amd64/vet env -json GO111MODULE 64/pkg/tool/linux_amd64/asm GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/asm (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v1.2.3
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.2.3 --jq [.object.sha, .object.type] | @tsv --noprofile /opt/hostedtoolc-test.run=^Test /opt/hostedtoolc-test.short=true -bool -buildtags ache/uv/0.11.8/x--show-toplevel bash 7174�� ons\b ion_cache_container_pin_test.go ion_cache_test.go ion_pins_integragh ion_pins_loggingapi ion_pins_test.go/repos/actions/github-script/git/ref/tags/v9 ion_reference_te--jq (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.2.3 --jq [.object.sha, .object.type] | @tsv -json GO111MODULE x_amd64/asm GOINSECURE GOMOD GOMODCACHE x_amd64/asm env -json GO111MODULE x_amd64/compile GOINSECURE GOMOD GOMODCACHE x_amd64/compile (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v2.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v2.0.0 --jq [.object.sha, .object.type] | @tsv --noprofile /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linusecurity 86_64/bash -bool -buildtags rgo/bin/bash bash --no�� th .prettierignore --log-level=e!../../../pkg/workflow/js/**/*.json head 64/bin/bash -stringintconv -tests /opt/pipx_bin/ba/tmp/gh-aw-test-runs/20260427-160244-16974/test-1402883996 ache/go/1.25.8/xremote (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v2.0.0 --jq [.object.sha, .object.type] | @tsv nt >/dev/null 2>&1 -benchmem bin/bash -run=^$ ./pkg/workflow/ ndor/bin/bash head -20 890275860/001 890275860/002/work bin/bash --noprofile -tests cal/bin/bash bash (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v2.0.0 --jq [.object.sha, .object.type] | @tsv json' --ignore-pgo1.25.8 -importcfg 64/bin/go -s -w -buildmode=exe 02zfbN4/KAMAEFRbremote 8902�� th .prettierignore --log-level=error -extld=gcc node --noprofile -tests ons.go 64/pkg/tool/linux_amd64/asm (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v3.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v3.0.0 --jq [.object.sha, .object.type] | @tsv (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v3.0.0 --jq [.object.sha, .object.type] | @tsv -json GO111MODULE x_amd64/asm GOINSECURE GOMOD GOMODCACHE x_amd64/asm 8002�� -json GO111MODULE x_amd64/compile GOINSECURE GOMOD GOMODCACHE h-aw.wasm; \ AFTER=$(wc -c < g (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 copilot/fix-validation-performance-regression x_amd64/compile k --noprofile x_amd64/vet /usr/local/sbin/--show-toplevel erignore sRem�� rite '../../../**/*.json' '!../../../pkg/workflow/js/**/*.json' --ignore-path -trimpath ache/go/1.25.8/x64/bin/go -p github.com/githurun -lang=go1.25 bash (http block)
    • Triggering command: /usr/bin/gh gh api /repos/nonexistent/action/git/ref/tags/v999.999.999 --jq [.object.sha, .object.type] | @tsv */*.ts' '**/*.json' --ignore-pat-errorsas GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env source-field-variant-1789188605/.github/workflows e2862ceb827927312 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile (http block)
  • https://api.github.com/repos/nonexistent/repo/actions/runs/12345
    • Triggering command: /usr/bin/gh gh run view 12345 --repo nonexistent/repo --json status,conclusion -x c x_amd64/link 5237509/b369/importcfg ache�� k/gh-aw/gh-aw/pkg/workflow/features_import_test.go k/gh-aw/gh-aw/pkg/workflow/import_schema_test.go k/gh-aw/gh-aw/actions/setup/node_modules/.bin/sh --noprofile x_amd64/vet iptables erignore (http block)
    • Triggering command: /usr/bin/gh gh run view 12345 --repo nonexistent/repo --json status,conclusion -p internal/msan -lang=go1.25 /opt/hostedtoolcache/go/1.25.8/xTest User 5606�� 49 resolved$ /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/compile -p crypto/internal/rev-parse -lang=go1.25 /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/compile (http block)
  • https://api.github.com/repos/owner/repo/actions/workflows
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path --repo owner/repo x_amd64/vet -unreachable=fal/opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet /tmp/go-build422-atomic tnet/tools/bash x_amd64/vet --no�� js/**/*.json' ---errorsas /opt/hostedtoolc-ifaceassert 86_64/bash -unreachable=falgit /tmp/go-build422-C ache/node/24.14./tmp/gh-aw-test-runs/20260427-160244-16974/test-source-field-variant-3092783035 /usr/lib/systemdshow (http block)
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path --repo owner/repo x_amd64/vet -unreachable=fal/opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet /tmp/go-build422-atomic ash x_amd64/vet --no�� js/**/*.json' ---errorsas /opt/hostedtoolc-ifaceassert /home/REDACTED/wor-nilfunc -unreachable=fal/opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/compile /tmp/go-build422-o ndor/bin/bash bash (http block)
    • Triggering command: /usr/bin/gh gh workflow list --repo owner/repo --json name,path,state e_modules/.bin/node --noprofile missions\b nfig/composer/ve--show-toplevel iptables k/gh�� 8109/001/stability-test.md security k/gh-aw/node_modules/.bin/sh -nxv x_amd64/vet erignore tail (http block)
  • https://api.github.com/repos/test-owner/test-repo/actions/secrets
    • Triggering command: /usr/bin/gh gh api /repos/test-owner/test-repo/actions/secrets --jq .secrets[].name --noprofile /opt/hostedtoolcache/go/1.25.8/x/opt/hostedtoolcache/go/1.25.8/x-test.run=^$ es /tmp/go-build422/opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet -trimpath ache/go/1.25.8/x-bool bash --no�� js/**/*.json' ---errorsas /opt/hostedtoolc-ifaceassert 64/pkg/tool/linu-nilfunc -unreachable=falgit /tmp/go-build422rev-parse n-dir/bash 64/pkg/tool/linu-tests (http block)
    • Triggering command: /usr/bin/gh gh api /repos/test-owner/test-repo/actions/secrets --jq .secrets[].name -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env json' --ignore-p-p GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/test/repo
    • Triggering command: /usr/bin/gh gh api /repos/test/repo --jq .default_branch rite '**/*.cjs' '**/*.ts' '**/*.-p bash tnet/tools/sh --noprofile x_amd64/vet rgo/bin/bash /opt/hostedtoolcache/go/1.25.8/x-test.v=true -V=f�� te 'scripts/**/*.js' --ignore-pa-test.timeout=10m0s bash .cfg --noprofile x_amd64/vet x_amd64/link /opt/hostedtoolcache/go/1.25.8/x/home/REDACTED/work/gh-aw/gh-aw/pkg/testutil/tempdir_test.go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/test/repo --jq .default_branch --show-toplevel go /usr/bin/git -json GO111MODULE _modules/.bin/no--show-toplevel git rev-�� --show-toplevel resolved$ /usr/bin/git -json GO111MODULE x_amd64/compile git (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-SL15mI /git (dns block)

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

…oncurrency validation and toolsets

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/bd33433a-beae-478e-ba02-79c862b9d015

Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix regression in validation performance by optimizing code perf: fix BenchmarkValidation regression (+119.3%) — cache concurrency validation and toolsets Apr 27, 2026
Copilot AI requested a review from gh-aw-bot April 27, 2026 16:13
@pelikhan pelikhan marked this pull request as ready for review April 27, 2026 16:18
Copilot AI review requested due to automatic review settings April 27, 2026 16:18
@github-actions github-actions Bot mentioned this pull request Apr 27, 2026
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

Optimizes the BenchmarkValidation hot path by caching workflow-level concurrency expression validation results and pre-parsed GitHub toolsets to avoid repeating expensive parsing work on each validateWorkflowData call.

Changes:

  • Cache the result of validateConcurrencyGroupExpression in WorkflowData and reuse it during validation.
  • Cache parsed GitHub toolsets once and reuse them in both permission validation and tool configuration validation.
  • Extend ValidatePermissions with an optional pre-parsed toolsets argument to skip redundant parsing.
Show a summary per file
File Description
pkg/workflow/tools.go Populates new caches in a deferred block after defaults/mutations are applied.
pkg/workflow/permissions_validation.go Adds an optional pre-parsed toolsets parameter to ValidatePermissions.
pkg/workflow/compiler_validators.go Uses cached concurrency validation result and cached parsed toolsets to avoid repeated parsing.
pkg/workflow/compiler_types.go Adds cache fields to WorkflowData for concurrency validation and parsed toolsets.

Copilot's findings

Tip

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

  • Files reviewed: 4/4 changed files
  • Comments generated: 4

Comment on lines +265 to 272
} else {
// Fallback: cache not populated (e.g. WorkflowData created without ParseWorkflowFile).
groupExpr := workflowData.ConcurrencyGroupExpr
if groupExpr != "" {
if err := validateConcurrencyGroupExpression(groupExpr); err != nil {
return formatCompilerError(markdownPath, "error", "workflow-level concurrency validation failed: "+err.Error(), err)
}
}
Copy link

Copilot AI Apr 27, 2026

Choose a reason for hiding this comment

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

In the fallback path when CachedConcurrencyGroupExprSet is false, the code reads workflowData.ConcurrencyGroupExpr, but that field is only populated by applyDefaults. For WorkflowData constructed without applyDefaults (the scenario mentioned in the comment), ConcurrencyGroupExpr will be empty and workflow-level concurrency won’t be validated even if workflowData.Concurrency is set. Instead, extract the group expression from workflowData.Concurrency (e.g., via extractConcurrencyGroupFromYAML) in this fallback path.

Copilot uses AI. Check for mistakes.
Comment thread pkg/workflow/tools.go
Comment on lines +34 to +37
if data.ConcurrencyGroupExpr != "" {
data.CachedConcurrencyGroupExprErr = validateConcurrencyGroupExpression(data.ConcurrencyGroupExpr)
data.CachedConcurrencyGroupExprSet = true
}
Copy link

Copilot AI Apr 27, 2026

Choose a reason for hiding this comment

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

CachedConcurrencyGroupExprSet is only set when ConcurrencyGroupExpr is non-empty. If Concurrency is present but no group value is extracted (or group is intentionally absent), the cache remains "unset" and validateToolConfiguration will take the fallback branch on every call. Consider setting CachedConcurrencyGroupExprSet unconditionally after extraction (and leaving CachedConcurrencyGroupExprErr nil) so the cached-vs-fallback logic truly reflects "computed" vs "not computed" and avoids repeated branching in the hot loop.

Suggested change
if data.ConcurrencyGroupExpr != "" {
data.CachedConcurrencyGroupExprErr = validateConcurrencyGroupExpression(data.ConcurrencyGroupExpr)
data.CachedConcurrencyGroupExprSet = true
}
// Mark the cache as computed even when no group expression is present, so callers can
// distinguish "already computed" from "not yet computed" and avoid repeated fallback work.
data.CachedConcurrencyGroupExprErr = nil
if data.ConcurrencyGroupExpr != "" {
data.CachedConcurrencyGroupExprErr = validateConcurrencyGroupExpression(data.ConcurrencyGroupExpr)
}
data.CachedConcurrencyGroupExprSet = true

Copilot uses AI. Check for mistakes.
Comment thread pkg/workflow/tools.go Outdated
// Cache the expanded + parsed toolsets for the GitHub tool so both
// ValidatePermissions and validateToolConfiguration reuse one result.
if data.ParsedTools != nil && data.ParsedTools.GitHub != nil {
data.CachedParsedToolsets = ParseGitHubToolsets(strings.Join(data.ParsedTools.GitHub.Toolset.ToStringSlice(), ","))
Copy link

Copilot AI Apr 27, 2026

Choose a reason for hiding this comment

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

CachedParsedToolsets is derived by manually joining ParsedTools.GitHub.Toolset. Since GitHubToolConfig already centralizes toolset normalization in GetToolsets() (including expandDefaultToolset), it would be more robust to build the cache from githubTool.GetToolsets() and then ParseGitHubToolsets on that result. This avoids duplicating toolset-string construction logic and keeps caching behavior aligned with the validated runtime behavior if GetToolsets() changes.

Suggested change
data.CachedParsedToolsets = ParseGitHubToolsets(strings.Join(data.ParsedTools.GitHub.Toolset.ToStringSlice(), ","))
githubTool := data.ParsedTools.GitHub
data.CachedParsedToolsets = ParseGitHubToolsets(strings.Join(githubTool.GetToolsets(), ","))

Copilot uses AI. Check for mistakes.
Comment thread pkg/workflow/permissions_validation.go Outdated
Comment on lines +38 to +47
// - githubTool: The GitHub tool configuration implementing ValidatableTool interface
// - parsedToolsets: optional pre-parsed toolsets slice; when provided it is used directly
// instead of calling ParseGitHubToolsets(githubTool.GetToolsets()). Pass nil or omit to
// let ValidatePermissions derive the toolsets from the tool configuration.
//
// Returns:
// - A validation result indicating any missing permissions and which toolsets require them
//
// Use ValidatePermissions (this function) for general permission validation against GitHub MCP toolsets.
// Use ValidateIncludedPermissions (in imports.go) when validating permissions from included/imported workflow files.
Copy link

Copilot AI Apr 27, 2026

Choose a reason for hiding this comment

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

The function doc comment for ValidatePermissions is duplicated (the Parameters/Returns/Use paragraphs appear twice), which makes the exported API docs noisy and harder to maintain. Please remove the repeated block and keep a single coherent doc comment that includes the new parsedToolsets parameter description once.

Suggested change
// - githubTool: The GitHub tool configuration implementing ValidatableTool interface
// - parsedToolsets: optional pre-parsed toolsets slice; when provided it is used directly
// instead of calling ParseGitHubToolsets(githubTool.GetToolsets()). Pass nil or omit to
// let ValidatePermissions derive the toolsets from the tool configuration.
//
// Returns:
// - A validation result indicating any missing permissions and which toolsets require them
//
// Use ValidatePermissions (this function) for general permission validation against GitHub MCP toolsets.
// Use ValidateIncludedPermissions (in imports.go) when validating permissions from included/imported workflow files.

Copilot uses AI. Check for mistakes.
… toolset parsing

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

Commit pushed: fa7cf0d

🏗️ ADR gate enforced by Design Decision Gate 🏗️

@github-actions
Copy link
Copy Markdown
Contributor

🏗️ Design Decision Gate — ADR Required

This PR makes significant changes to core business logic (184 new lines in pkg/workflow/) but does not have a linked Architecture Decision Record (ADR).

AI has analyzed the PR diff and generated a draft ADR to help you get started:

📄 Draft ADR: docs/adr/28744-cache-concurrency-validation-and-toolset-parsing.md

What to do next

  1. Review the draft ADR committed to your branch — it was generated from the PR diff
  2. Complete the missing sections — add context the AI couldn't infer, refine the decision rationale, and list real alternatives you considered
  3. Commit the finalized ADR to docs/adr/ on your branch
  4. Reference the ADR in this PR body by adding a line such as:

    ADR: ADR-28744: Cache Concurrency Validation and Toolset Parsing

Once an ADR is linked in the PR body, this gate will re-run and verify the implementation matches the decision.

Why ADRs Matter

"AI made me procrastinate on key design decisions. Because refactoring was cheap, I could always say 'I'll deal with this later.' Deferring decisions corroded my ability to think clearly."

ADRs create a searchable, permanent record of why the codebase looks the way it does. Future contributors (and your future self) will thank you.


📋 ADR Draft Summary

The generated ADR covers the following decision:

Decision: Extend the WorkflowData eager-caching pattern (from ADR-28560) to cover: (a) concurrency group expression validation results via CachedConcurrencyGroupExprErr/CachedConcurrencyGroupExprSet, and (b) GitHub toolset parsing via CachedParsedToolsets. It also changes ValidatePermissions to accept pre-parsed toolsets via a variadic parameter.

Root cause addressed: BenchmarkValidation was 119.3% above baseline because validateConcurrencyGroupExpression (full ExpressionParser pass) and ParseGitHubToolsets were called redundantly on every validateWorkflowData invocation — accounting for 47% of all allocations per iteration.

Key design choice highlighted: Unlike CachedPermissions (which uses a nil sentinel), the concurrency validation cache requires a boolean CachedConcurrencyGroupExprSet to distinguish "valid (nil error)" from "not yet computed" — a deliberate inconsistency with the existing pattern that the ADR documents explicitly.

📋 Michael Nygard ADR Format Reference

An ADR must contain these four sections to be considered complete:

  • Context — What is the problem? What forces are at play?
  • Decision — What did you decide? Why?
  • Alternatives Considered — What else could have been done?
  • Consequences — What are the trade-offs (positive and negative)?

All ADRs are stored in docs/adr/ as Markdown files numbered by PR number (e.g., 28744-cache-concurrency-validation-and-toolset-parsing.md for PR #28744).

🔒 This PR cannot merge until an ADR is linked in the PR body.

References: §25006605654

🏗️ ADR gate enforced by Design Decision Gate 🏗️ · ● 189.3K ·

@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot review all comments

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 27, 2026

@copilot review all comments

Addressed all four review comments in 9f2db9b:

  1. Fallback path (compiler_validators.go): now calls extractConcurrencyGroupFromYAML(workflowData.Concurrency) directly instead of reading ConcurrencyGroupExpr, so validation is correct for WorkflowData built without applyDefaults.
  2. CachedConcurrencyGroupExprSet (tools.go): set unconditionally after extraction, so it always represents "computed" vs "not computed" rather than depending on whether a group expression was found.
  3. CachedParsedToolsets (tools.go): now built via data.ParsedTools.GitHub.GetToolsets() to stay aligned with GitHubToolConfig's normalization logic.
  4. Duplicate doc comment (permissions_validation.go): removed the repeated Parameters/Returns/Use block.

Copilot AI requested a review from pelikhan April 27, 2026 16:44
@pelikhan pelikhan merged commit 5366fbd into main Apr 27, 2026
@pelikhan pelikhan deleted the copilot/fix-validation-performance-regression branch April 27, 2026 16:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[performance] Regression in Validation: 119.3% slower

4 participants