Skip to content

fix(scatter): eliminate concurrent schedule bursts via composite-seed two-hash scatter#29565

Merged
pelikhan merged 4 commits intomainfrom
copilot/deep-report-add-schedule-jitter
May 1, 2026
Merged

fix(scatter): eliminate concurrent schedule bursts via composite-seed two-hash scatter#29565
pelikhan merged 4 commits intomainfrom
copilot/deep-report-add-schedule-jitter

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented May 1, 2026

Multiple daily workflows compiled to the same cron expression (e.g. three workflows all at 54 13 * * *) due to birthday-paradox collisions in the single-hash 972-slot pool, causing concurrent installation-token requests that exhausted the 60 req/min quota and silently dropped safe-output writes.

Algorithm change (pkg/parser/schedule_fuzzy_scatter.go)

Before: stableHash(identifier, 972) → index into flat []timeSlot{hour, minute} pool. One hash collision = identical cron expression.

After: Two hash operations with a composite seed:

hHash := stableHash(identifier, len(weightedHourPool))          // 30-slot hour pool
hour  := weightedHourPool[hHash]

minuteSeed := fmt.Sprintf("%s:%d", identifier, hHash)
minute     := availableMinutes[stableHash(minuteSeed, len(availableMinutes))]
  • weightedHourPool — 30 entries: BEST hours 2–5 × weight 3, BROAD hours 6–23 × weight 1 (preserves existing BEST/BROAD preference)
  • availableMinutes — 29 pre-peak-excluded minutes: [5–11, 19–26, 34–41, 49–54]

Encoding hHash in the minute seed breaks ties from BEST-tier weight-3 duplication (e.g. pool indices 0 and 1 both resolve to hour 2 but carry different hHash values → different minute seeds). Pre-excluding peak ranges from the minute pool avoids avoidPeakMinutes() collapsing 7 distinct raw minutes to one output value, which was causing secondary artificial clusters.

Workflow fix

daily-fact.md: "daily around 11:00 on weekdays""daily around 14:00 on weekdays" — resolves a FUZZY:DAILY_AROUND_WEEKDAYS coincidental collision with daily-choice-test at 6 11 * * 1-5.

Recompile

All 205 workflow lock files regenerated with the new non-colliding cron expressions. Stability tests updated to reflect the new deterministic outputs.

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 k/gh-aw/gh-aw/.g-c k/gh-aw/gh-aw/.g"prettier" --write 'scripts/**/*.js' --ignore-path .prettierignore --log-level=error x_amd64/vet k/gh�� h ../../../.prettierignore k/gh-aw/gh-aw/.github/workflows/changeset.lock.ygithub.com/stretchr/testify/assert 64/pkg/tool/linux_amd64/vet (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 %H %ct %D (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 --check scripts/**/*.js 64/bin/go .prettierignore GO111MODULE 64/bin/go go env -json 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 GOMODCACHE ntdrain.test /usr/bin/git -json GO111MODULE ache/go/1.25.8/x--show-toplevel git rev-�� --show-toplevel go /usr/bin/git t2428373445/.gitnode GO111MODULE 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 GOMODCACHE go /usr/bin/git -json GO111MODULE 64/bin/go git rev-�� --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go 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 0229-42883/test-.artifacts[].name GO111MODULE ache/go/1.25.8/x64/pkg/tool/linux_amd64/vet GOINSECURE GOMOD GOMODCACHE ache/go/1.25.8/xowner/repo env 0229-42883/test-272697003 GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv --show-toplevel go /usr/bin/git 0229-42883/test-git stmain.go ache/go/1.25.8/x--show-toplevel git rev-�� --show-toplevel ache/go/1.25.8/xowner/repo /usr/bin/git 0229-42883/test-git GO111MODULE 64/pkg/tool/linu--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 git /usr/bin/git /tmp/TestGuardPogit remote /opt/hostedtoolc--show-toplevel git rev-�� --show-toplevel /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linu-buildtags /usr/bin/git -bool -buildtags /usr/bin/git 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 --noprofile (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv .js' --ignore-path .prettierignore --log-level=e!../../../pkg/workflow/js/**/*.json (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv .js' --ignore-path .prettierignore --log-level=error -run est.lock.yml ./pkg/parser/ (http block)
  • https://api.github.com/repos/actions/download-artifact/git/ref/tags/v8
    • Triggering command: /usr/bin/gh gh api /repos/actions/download-artifact/git/ref/tags/v8 --jq [.object.sha, .object.type] | @tsv se 464756/b211/vet.cfg bin/node (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/download-artifact/git/ref/tags/v8 --jq [.object.sha, .object.type] | @tsv cli/install.sh..." 464756/b218/vet.cfg tions/setup/js/node_modules/.bin-f (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/download-artifact/git/ref/tags/v8 --jq [.object.sha, .object.type] | @tsv ithub/workflows rev-parse ndor/bin/bash --noprofile (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 ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile /usr/bin/git SameOutput410595git GO111MODULE Name,createdAt,startedAt,updated--show-toplevel git rev-�� --show-toplevel 64/pkg/tool/linux_amd64/vet /usr/bin/git r/test-repo/actigit GO111MODULE /opt/hostedtoolc--show-toplevel 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 -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE node /opt�� prettier --check 64/bin/go --ignore-path .prettierignore 64/bin/go go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv npx prettier --cGOINSECURE GOPROXY 64/bin/go GOSUMDB GOWORK 64/bin/go sh -c "prettier" --cheGOINSECURE bash 64/bin/go tierignore /usr/bin/gh 64/bin/go go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv prettier --check 64/bin/go **/*.ts **/*.json --ignore-path go list�� -mod=readonly -f 64/bin/go -- unsafe 64/bin/go go (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 GOMODCACHE go /usr/lib/git-core/git-remote-https LsRemoteWithRealgit LsRemoteWithRealrev-parse 64/pkg/tool/linu--show-toplevel /usr/lib/git-core/git-remote-https http�� REDACTED 64/pkg/tool/linuother /usr/bin/git 41/001/test-compgit GO111MODULE ache/go/1.25.8/x--show-toplevel git (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.email s/5/artifacts /usr/bin/git -json GO111MODULE 64/bin/go git -C /home/REDACTED/work/gh-aw/gh-aw/.github/workflows (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 go /usr/bin/git -json GO111MODULE 64/pkg/tool/linu--show-toplevel git arch�� --remote=REDACTED v1.0.0 /usr/bin/git -json GO111MODULE At,event,headBra--show-toplevel 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 n.go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv .js' --ignore-path .prettierignore --log-level=error (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv ithub/workflows git k/node_modules/.bin/node get --local cal/bin/bash /opt/hostedtoolcache/go/1.25.8/x-f k/gh�� (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 /tmp/TestGuardPolicyMinIntegrityOnlymin-integrity_with_explicit_repo1188142937/001 rev-parse ache/node/24.14.1/x64/bin/node -json GO111MODULE 64/bin/go ache/node/24.14.1/x64/bin/node 7492�� mpleWorkflow705149205/001 dQCuzy-Wilad /usr/bin/git -json GO111MODULE 51af0b8e9b596b54--show-toplevel 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 --noprofile (http block)
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq [.object.sha, .object.type] | @tsv nore --log-level--ignore-path k/gh-aw/gh-aw/.g../../../.prettierignore 64/pkg/tool/linux_amd64/vet /home/REDACTED/wor/opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/compile /home/REDACTED/wor-o /home/REDACTED/wor/tmp/go-build970866026/b001/_pkg_.a 64/pkg/tool/linu-trimpath --no�� js/**/*.json' ---p cfg 64/pkg/tool/linu-lang=go1.25 /home/REDACTED/worgit /home/REDACTED/wor-C /home/REDACTED/wor/home/REDACTED/work/gh-aw/gh-aw/.github/workflows 64/pkg/tool/linurev-parse (http block)
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq [.object.sha, .object.type] | @tsv (http block)
  • https://api.github.com/repos/github/gh-aw
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw --jq .default_branch -unreachable=false /tmp/go-build823464756/b033/vet.cfg 464756/b288/vet.cfg (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw --jq .default_branch l && debian-sa1 1 1 rev-parse 64/pkg/tool/linux_amd64/vet s/data/action_pigit cfg ode_modules/.bin/home/REDACTED/work/gh-aw/gh-aw/.github/workflows 64/pkg/tool/linurev-parse -C k/gh-aw/gh-aw/.github/workflows rev-parse r: $owner, name: $name) { hasDiscussionsEnabled } } l (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw --jq .default_branch k/gh-aw/gh-aw/.github/workflows config 64/pkg/tool/linux_amd64/vet l git /home/REDACTED/wor/home/REDACTED/work/gh-aw/gh-aw/.github/workflows 64/pkg/tool/linurev-parse -C k/gh-aw/gh-aw/.github/workflows rev-parse r: $owner, name: $name) { hasDiscussionsEnabled } } ithub/workflows --write /home/REDACTED/go//home/REDACTED/work/gh-aw/gh-aw/.github/workflows docker (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 GOMODCACHE go /usr/bin/git -json GO111MODULE ache/go/1.25.8/x--show-toplevel git rev-�� --show-toplevel go /usr/bin/git y_with_repos_arrgit GO111MODULE ache/go/1.25.8/x--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/pkg/cli go clusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle l GO111MODULE 64/bin/go git -C ansitiveImports3583352908/001 l /usr/bin/git -json GO111MODULE 64/bin/go git (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 y config /usr/bin/git remote.origin.urgit GO111MODULE 64/bin/go git -C ansitiveImports3583352908/001 rev-parse om/org1/repo1.git -json GO111MODULE 64/bin/go git (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-24 GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE 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 --limit 100 --created >=2026-04-01 GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE 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 --limit 100 --created >=2026-01-31 GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (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 GO111MODULE 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile env 41/001/test-inlined-imports-enab-s GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE til GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh run download 1 --dir test-logs/run-1 GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json o ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (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 GO111MODULE 64/pkg/tool/linux_amd64/vet GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/vet env -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh run download 12345 --dir test-logs/run-12345 GO111MODULE 64/pkg/tool/linux_amd64/vet GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/vet env -json GO111MODULE x_amd64/compile GOINSECURE GOMOD GOMODCACHE x_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 GO111MODULE 64/pkg/tool/linux_amd64/vet GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/vet env -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh run download 12346 --dir test-logs/run-12346 GO111MODULE 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linu^remote\..*\.gh-resolved$ env 41/001/test-inlined-imports-enab-test.timeout=10m0s GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE ole GOMODCACHE go (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 l_test.go 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile env g_.a GO111MODULE x_amd64/link GOINSECURE GOMOD GOMODCACHE x_amd64/link (http block)
    • Triggering command: /usr/bin/gh gh run download 2 --dir test-logs/run-2 GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go estl�� -json GO111MODULE x_amd64/compile GOINSECURE GOMOD GOMODCACHE x_amd64/compile (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 GO111MODULE 64/pkg/tool/linux_amd64/vet GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/vet env 272697003 GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh run download 3 --dir test-logs/run-3 GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE k GOINSECURE GOMOD GOMODCACHE go (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 GO111MODULE 64/pkg/tool/linux_amd64/link GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linuTest User env util.test GO111MODULE k GOINSECURE GOMOD GOMODCACHE 6lOae4WsPt2nvzZ6yM/kanFXMcb9Ib9jremote.origin.url (http block)
    • Triggering command: /usr/bin/gh gh run download 4 --dir test-logs/run-4 GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (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 GO111MODULE 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linutest@example.com env g_.a GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh run download 5 --dir test-logs/run-5 GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE y4/NgsYRIvMQHHTX5b4d3ZQ/CzLq7wlyDIvrJo6ipZht env -json GO111MODULE x_amd64/link GOINSECURE GOMOD GOMODCACHE x_amd64/link (http block)
  • https://api.github.com/repos/github/gh-aw/actions/workflows
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path --check scripts/**/*.js 64/bin/go -d GO111MODULE 64/bin/go go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE 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 100 GOMOD GOMODCACHE go env Gitmain_branch3968052651/001' Gitmain_branch3968052651/001' 64/bin/go GOINSECURE GOMOD GOMODCACHE 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 GOMOD GOMODCACHE 64/pkg/tool/linuremote.origin.url env -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/contents/.github/workflows/shared/reporting.md
    • Triggering command: /tmp/go-build1177739615/b404/cli.test /tmp/go-build1177739615/b404/cli.test -test.testlogfile=/tmp/go-build1177739615/b404/testlog.txt -test.paniconexit0 -test.v=true -test.parallel=4 -test.timeout=10m0s -test.run=^Test -test.short=true GOINSECURE GOMOD GOMODCACHE 394514/b427/impoGO111MODULE /hom�� che/go-build/84/GOINSECURE **/*.cjs 64/bin/go **/*.json --ignore-path ../../../.pretti-json /opt/hostedtoolcGO111MODULE (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 ache/go/1.25.8/xremote.origin.url /usr/bin/git -json stmain.go ache/go/1.25.8/x--show-toplevel git rev-�� --show-toplevel ache/go/1.25.8/x64/pkg/tool/linux_amd64/link /usr/bin/git 7739615/b438/semdu GO111MODULE 7739615/b438/imp/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 -json GO111MODULE x_amd64/vet GOINSECURE GOMOD GOMODCACHE x_amd64/vet env -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (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 iant-3499036330/.github/workflows GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (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 -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env phen586880776/00-p phen586880776/00github.com/github/gh-aw/pkg/sliceutil x_amd64/asm GOINSECURE GOMOD GOMODCACHE x_amd64/asm (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 GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (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 GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE x_amd64/vet GOINSECURE GOMOD GOMODCACHE x_amd64/vet (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 -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go phen�� -json GO111MODULE x_amd64/vet GOINSECURE GOMOD GOMODCACHE x_amd64/vet (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 -json GO111MODULE x_amd64/vet GOINSECURE GOMOD GOMODCACHE x_amd64/vet env DefaultBranchFromLsRemoteWithRea-c=4 DefaultBranchFromLsRemoteWithRea-nolocalimports ache/go/1.25.8/x64/pkg/tool/linu-importcfg GOINSECURE GOMOD GOMODCACHE ache/go/1.25.8/x64/pkg/tool/linu/home/REDACTED/work/gh-aw/gh-aw/scripts/lint_error_messages_test.g-L (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 GOINSECURE GOMOD GOMODCACHE go env 0229-42883/test-source-field-variant-3499036330 GO111MODULE k GOINSECURE GOMOD GOMODCACHE go (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 64/bin/go tierignore GO111MODULE 64/bin/go go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path --repo owner/repo 64/bin/go -d GO111MODULE 64/bin/go go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh workflow list --repo owner/repo --json name,path,state ache/go/1.25.8/x64/bin/go GOINSECURE ole GOMODCACHE go env /ref/tags/v9 GO111MODULE sv GOINSECURE GOMOD GOMODCACHE ortcfg (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 -c=4 -nolocalimports -importcfg /tmp/go-build1177739615/b434/importcfg -pack /home/REDACTED/work/gh-aw/gh-aw/pkg/repoutil/repoutil.go /home/REDACTED/work/gh-aw/gh-aw/pkg/repoutil/repoutil_test.go env -json 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 9657/001/stability-test.md GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)

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

Copilot AI and others added 2 commits May 1, 2026 16:03
…ur+minute hashes

Replace the single 972-slot FNV hash pool with a two-hash approach:
- Hash 1 selects hour from a 30-entry weighted pool (BEST 02-05 × 3, BROAD 06-23 × 1)
- Hash 2 (minuteSeed = identifier + ":" + hHash) selects minute independently

Also pre-excludes peak minute ranges [12-18], [27-33], [42-48] from the minute
pool to prevent avoidPeakMinutes() from collapsing multiple values to the same
output minute (e.g. 27-33 → 34 for hour 6-9, causing artificial collisions).

The original single-hash approach over a flat (hour,minute) pool caused birthday-
paradox collisions: 3 workflows at 54 13 * * * simultaneously exhausted the
GitHub installation-token rate limit (60 req/min), silently losing safe-output
writes on 2026-05-01 and 2026-04-30.

Also change daily-fact.md from "daily around 11:00 on weekdays" to
"daily around 14:00 on weekdays" to resolve the FUZZY:DAILY_AROUND_WEEKDAYS
collision with daily-choice-test that landed both at 6 11 * * 1-5.

Recompile all 205 workflow lock files to apply new non-colliding cron times.

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/e8b34ff1-f6f5-4d97-aaef-e3c1e2d63ed7

Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>
…not three)

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/e8b34ff1-f6f5-4d97-aaef-e3c1e2d63ed7

Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>
Copilot AI changed the title [WIP] Add schedule jitter to daily workflows for token rate-limit prevention fix(scatter): eliminate concurrent schedule bursts via composite-seed two-hash scatter May 1, 2026
Copilot AI requested a review from gh-aw-bot May 1, 2026 16:09
@pelikhan pelikhan marked this pull request as ready for review May 1, 2026 16:20
Copilot AI review requested due to automatic review settings May 1, 2026 16:20
@github-actions github-actions Bot mentioned this pull request May 1, 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

Updates the fuzzy schedule scattering algorithm to reduce identical cron outputs across many workflows (and thereby avoid concurrent API/token bursts), then recompiles workflow lock files to the new deterministic cron times.

Changes:

  • Replaced the single-hash, flat daily pool scatter with a two-hash approach (weighted hour pool + composite-seed minute selection) and a curated minute set.
  • Updated cross-platform schedule stability expectations to match the new deterministic scatter outputs.
  • Regenerated workflow lock files (and adjusted one workflow source schedule) so compiled cron expressions reflect the new scatter.
Show a summary per file
File Description
pkg/parser/schedule_fuzzy_scatter.go Implements the new composite-seed two-hash daily scatter and introduces weightedHourPool/availableMinutes.
pkg/parser/schedule_parser_stability_test.go Updates stability test expected crons for daily/weekly scatter outputs.
.github/workflows/workflow-skill-extractor.lock.yml Recompiled to new scattered cron.
.github/workflows/workflow-normalizer.lock.yml Recompiled to new scattered cron.
.github/workflows/workflow-health-manager.lock.yml Recompiled to new scattered cron.
.github/workflows/weekly-safe-outputs-spec-review.lock.yml Recompiled to new scattered cron.
.github/workflows/weekly-editors-health-check.lock.yml Recompiled to new scattered cron.
.github/workflows/weekly-blog-post-writer.lock.yml Recompiled to new scattered cron.
.github/workflows/update-astro.lock.yml Recompiled to new scattered cron.
.github/workflows/unbloat-docs.lock.yml Recompiled to new scattered cron.
.github/workflows/ubuntu-image-analyzer.lock.yml Recompiled to new scattered cron.
.github/workflows/terminal-stylist.lock.yml Recompiled to new scattered cron.
.github/workflows/sub-issue-closer.lock.yml Recompiled to new scattered cron.
.github/workflows/step-name-alignment.lock.yml Recompiled to new scattered cron.
.github/workflows/static-analysis-report.lock.yml Recompiled to new scattered cron.
.github/workflows/spec-librarian.lock.yml Recompiled to new scattered cron.
.github/workflows/spec-extractor.lock.yml Recompiled to new scattered cron.
.github/workflows/spec-enforcer.lock.yml Recompiled to new scattered cron.
.github/workflows/smoke-ci.lock.yml Recompiled to new scattered cron.
.github/workflows/sergo.lock.yml Recompiled to new scattered cron.
.github/workflows/semantic-function-refactor.lock.yml Recompiled to new scattered cron.
.github/workflows/schema-consistency-checker.lock.yml Recompiled to new scattered cron.
.github/workflows/safe-output-health.lock.yml Recompiled to new scattered cron.
.github/workflows/refactoring-cadence.lock.yml Recompiled to new scattered cron.
.github/workflows/prompt-clustering-analysis.lock.yml Recompiled to new scattered cron.
.github/workflows/metrics-collector.lock.yml Recompiled to new scattered cron.
.github/workflows/lockfile-stats.lock.yml Recompiled to new scattered cron.
.github/workflows/jsweep.lock.yml Recompiled to new scattered cron.
.github/workflows/issue-arborist.lock.yml Recompiled to new scattered cron (and regenerated embedded config heredoc markers).
.github/workflows/instructions-janitor.lock.yml Recompiled to new scattered cron.
.github/workflows/gpclean.lock.yml Recompiled to new scattered cron.
.github/workflows/go-logger.lock.yml Recompiled to new scattered cron.
.github/workflows/github-remote-mcp-auth-test.lock.yml Recompiled to new scattered cron.
.github/workflows/firewall-escape.lock.yml Recompiled to new scattered cron.
.github/workflows/duplicate-code-detector.lock.yml Recompiled to new scattered cron (and regenerated embedded config heredoc markers).
.github/workflows/draft-pr-cleanup.lock.yml Recompiled to new scattered cron.
.github/workflows/docs-noob-tester.lock.yml Recompiled to new scattered cron.
.github/workflows/developer-docs-consolidator.lock.yml Recompiled to new scattered cron.
.github/workflows/dependabot-burner.lock.yml Recompiled to new scattered cron.
.github/workflows/delight.lock.yml Recompiled to new scattered cron.
.github/workflows/dead-code-remover.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-workflow-updater.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-token-consumption-report.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-testify-uber-super-expert.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-team-evolution-insights.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-syntax-error-quality.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-skill-optimizer.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-sentrux-report.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-semgrep-scan.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-security-red-team.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-security-observability.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-secrets-analysis.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-safe-outputs-conformance.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-safe-output-optimizer.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-safe-output-integrator.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-rendering-scripts-verifier.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-regulatory.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-performance-summary.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-otel-instrumentation-advisor.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-observability-report.lock.yml Recompiled to new scattered cron (and regenerated embedded config heredoc markers).
.github/workflows/daily-multi-device-docs-tester.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-malicious-code-scan.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-issues-report.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-function-namer.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-firewall-report.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-fact.md Changes the friendly schedule (“daily around 11:00” → “daily around 14:00”) to avoid a known collision scenario.
.github/workflows/daily-fact.lock.yml Recompiled to the updated “daily around 14:00 on weekdays” schedule and new scattered cron.
.github/workflows/daily-doc-healer.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-compiler-quality.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-community-attribution.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-code-metrics.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-cli-tools-tester.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-cli-performance.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-caveman-optimizer.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-cache-strategy-analyzer.lock.yml Recompiled to new scattered cron (and regenerated embedded config heredoc markers).
.github/workflows/daily-aw-cross-repo-compile-check.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-astrostylelite-markdown-spellcheck.lock.yml Recompiled to new scattered cron.
.github/workflows/daily-assign-issue-to-user.lock.yml Recompiled to new scattered cron.
.github/workflows/copilot-session-insights.lock.yml Recompiled to new scattered cron.
.github/workflows/copilot-pr-prompt-analysis.lock.yml Recompiled to new scattered cron.
.github/workflows/copilot-opt.lock.yml Recompiled to new scattered cron.
.github/workflows/copilot-cli-deep-research.lock.yml Recompiled to new scattered cron.
.github/workflows/copilot-agent-analysis.lock.yml Recompiled to new scattered cron.
.github/workflows/constraint-solving-potd.lock.yml Recompiled to new scattered cron.
.github/workflows/code-simplifier.lock.yml Recompiled to new scattered cron.
.github/workflows/cli-version-checker.lock.yml Recompiled to new scattered cron.
.github/workflows/claude-code-user-docs-review.lock.yml Recompiled to new scattered cron.
.github/workflows/audit-workflows.lock.yml Recompiled to new scattered cron.
.github/workflows/api-consumption-report.lock.yml Recompiled to new scattered cron.
.github/workflows/agent-persona-explorer.lock.yml Recompiled to new scattered cron.
.github/workflows/agent-performance-analyzer.lock.yml Recompiled to new scattered cron.

Copilot's findings

Tip

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

  • Files reviewed: 91/91 changed files
  • Comments generated: 2

Comment thread pkg/parser/schedule_fuzzy_scatter.go Outdated
Comment on lines +75 to +76
// availableMinutes is the pre-computed list of valid minute values [5, 54].
var availableMinutes = buildAvailableMinutes()
Comment thread pkg/parser/schedule_fuzzy_scatter.go Outdated
Comment on lines +88 to +93
// This implementation reduces collision probability by requiring two independent
// conditions to hold simultaneously for a full (hour, minute) collision:
//
// 1. hHash (stableHash of identifier) must map to the same hour-pool index.
// 2. The minute hash of a composite seed (identifier + ":" + hHash index string)
// must map to the same minute-pool index.
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

🧪 Test Quality Sentinel Report

Test Quality Score: 95/100

Excellent test quality

Metric Value
New/modified tests analyzed 1 function modified (TestScatterScheduleCrossPlatformConsistency)
✅ Design tests (behavioral contracts) 1 (100%)
⚠️ Implementation tests (low value) 0 (0%)
Tests with error/edge cases 1 (100%)
Duplicate test clusters 0
Test inflation detected No (test: +4 lines, production: +89 lines — ratio 0.04:1)
🚨 Coding-guideline violations None

Test Classification Details

Test File Classification Issues Detected
TestScatterScheduleCrossPlatformConsistency pkg/parser/schedule_parser_stability_test.go:57 ✅ Design None — expected cron values correctly updated for new algorithm

Analysis

The only test-file change in this PR is 4 expected cron values updated in TestScatterScheduleCrossPlatformConsistency to reflect the new composite-seed two-hash scatter algorithm. No new test functions were added.

The existing tests are well-structured:

  • TestScatterScheduleCrossPlatformConsistency — Behavioral contract test: verifies that ScatterSchedule() produces deterministic, cross-platform-stable cron strings. Table-driven with 8 named sub-cases. Includes error path via t.Fatalf("unexpected error: %v", err). ✅
  • TestStableHashCrossPlatform — Behavioral contract: verifies known FNV-1a hash outputs across platforms. 15 table-driven cases. ✅
  • TestStableHashProperties — Behavioral contract: verifies invariants (range correctness, empty string, special characters, collision resistance). 5 named sub-tests. ✅

The expected-value updates are the correct way to handle a hash algorithm change — the test enforces the new algorithm's output is stable and reproducible.

Checklist:

  • ✅ Build tag present: //go:build !integration
  • ✅ No mock libraries used
  • ✅ Table-driven tests with named sub-cases
  • ✅ Error path coverage
  • ✅ Production code change: +89/-49 lines; test change: +4/-4 lines (no inflation)

Verdict

Check passed. 0% of new tests are implementation tests (threshold: 30%). The test update correctly reflects the algorithm change with no new quality concerns.


📖 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: §25222352300

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

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: 95/100. Test quality is excellent — 0% of new tests are implementation tests (threshold: 30%). The 4 expected-value updates correctly reflect the new composite-seed two-hash scatter algorithm.

@pelikhan
Copy link
Copy Markdown
Collaborator

pelikhan commented May 1, 2026

@copilot review all comments

Copy link
Copy Markdown
Contributor Author

Copilot AI commented May 1, 2026

@copilot review all comments

Addressed both reviewer comments in 16e94d9:

  1. availableMinutes comment now accurately describes "29-value curated set spanning [5–11, 19–26, 34–41, 49–54]" instead of the incorrect "[5, 54]".
  2. Collision condition 1 now says "both workflows must resolve to the same hour value" (not pool index), with an explicit note that different indices can yield the same hour via BEST-tier weight-3 duplication.

Copilot AI requested a review from pelikhan May 1, 2026 16:46
@pelikhan pelikhan merged commit b4859b1 into main May 1, 2026
@pelikhan pelikhan deleted the copilot/deep-report-add-schedule-jitter branch May 1, 2026 16:49
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.

[deep-report] Add schedule jitter to daily workflows — prevent installation token rate-limit bursts

4 participants