From 9665621d18086efc3c755d1052dc103f076846a5 Mon Sep 17 00:00:00 2001 From: Garry Tan Date: Mon, 19 Oct 2026 10:13:58 -0700 Subject: [PATCH] v1.91.148.0 ci(seed): seed PRs also dispatch Quality gate, and say which runs are their checks (#3297) * ci(seed): seed PRs also dispatch Quality gate, and say which runs are their checks Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * chore: stamp v1.91.148.0 Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> --------- Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> --- .github/workflows/free-durations-record.yml | 3 ++- CHANGELOG.md | 8 ++++++++ VERSION | 2 +- agents-digest/gstack-AGENTS.md | 2 +- docs/TESTING_INTERNALS.md | 5 ++++- package.json | 2 +- test/free-durations-record-workflow.test.ts | 6 +++++- 7 files changed, 22 insertions(+), 6 deletions(-) diff --git a/.github/workflows/free-durations-record.yml b/.github/workflows/free-durations-record.yml index 848be5dfc..9101104d3 100644 --- a/.github/workflows/free-durations-record.yml +++ b/.github/workflows/free-durations-record.yml @@ -161,7 +161,7 @@ jobs: - Files that failed while recording (durations kept; this PR's own free checks decide): $failed_line - Seed growth ratchet (60 s ceiling, shrink-only allowlist): $ratchet_line - Data only. Stamp and merge per docs/ship-policy.md; the stamp push runs the full PR checks. + Data only. This run dispatched Free Tests (the required free-tests check), Windows Free Tests and Quality gate on this branch; those are this PR's checks. The pull_request runs wait as "action required" because a token-opened PR never starts them without approval. Stamp and merge per docs/ship-policy.md; the stamp push runs the full PR checks. EOF if [ -n "$number" ]; then gh pr edit "$number" --body-file pr-body.md @@ -170,3 +170,4 @@ jobs: fi gh workflow run free-tests.yml --repo "$GITHUB_REPOSITORY" --ref "$branch" gh workflow run windows-free-tests.yml --repo "$GITHUB_REPOSITORY" --ref "$branch" + gh workflow run quality-gate.yml --repo "$GITHUB_REPOSITORY" --ref "$branch" diff --git a/CHANGELOG.md b/CHANGELOG.md index 1232dd584..b130dfee2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [1.91.148.0] - 2026-10-19 + +**Weekly seed PRs now get the credential scan as well as the free suites.** A pull request the recorder opens with the workflow token never starts its own `pull_request` checks. GitHub holds them as "action required". So the recorder dispatches its checks on the bot branch instead. + +### Changed +- **`free-durations-record.yml` also dispatches Quality gate** on `bot/free-duration-seeds`, next to Free Tests (the required `free-tests` check) and Windows Free Tests. +- **The seed PR body says the dispatched runs are its checks** and explains why its pull_request runs wait for approval. + ## [1.91.147.0] - 2026-10-19 **The free-suite duration seeds are current again.** This is the first refresh from the weekly recorder. It adds 14 Linux and 6 Windows test files that the shard packers had been placing at the 99th-percentile estimate. diff --git a/VERSION b/VERSION index ae26945c3..427e8cae8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.91.147.0 +1.91.148.0 diff --git a/agents-digest/gstack-AGENTS.md b/agents-digest/gstack-AGENTS.md index 656c5d1e5..7c7dab179 100644 --- a/agents-digest/gstack-AGENTS.md +++ b/agents-digest/gstack-AGENTS.md @@ -1,4 +1,4 @@ -# gstack digest v1.91.147.0 — regenerate/re-copy after upgrading gstack +# gstack digest v1.91.148.0 — regenerate/re-copy after upgrading gstack Behavioral rules from gstack (https://github.com/garrytan/gstack), compressed for agent hosts without a full skill install. The full skills add workflows, diff --git a/docs/TESTING_INTERNALS.md b/docs/TESTING_INTERNALS.md index 9f2d95941..3aec0d114 100644 --- a/docs/TESTING_INTERNALS.md +++ b/docs/TESTING_INTERNALS.md @@ -1379,7 +1379,10 @@ refresh to a maintainer. `windows-free-tests.yml`'s `record_durations` path. When either recording adds or drops a test file, it force-updates the `bot/free-duration-seeds` branch, opens or refreshes one seed PR whose body states the ratchet result, and - dispatches the free lanes on it. A file that fails while recording turns its + dispatches Free Tests, Windows Free Tests and Quality gate on it. Those + dispatched runs are the seed PR's checks, and Free Tests supplies the required + `free-tests` check. GitHub holds the pull_request runs of a token-opened PR as + "action required" until someone approves them. A file that fails while recording turns its job red but keeps its duration, and the PR body names it; the seed PR's own free checks decide whether the tree is healthy. An interrupted recording uploads no seed, and more than 5 red files on either OS proposes nothing. The diff --git a/package.json b/package.json index ff953935f..61f535db9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gstack", - "version": "1.91.147", + "version": "1.91.148", "description": "Garry's Stack — Claude Code skills + fast headless browser. One repo, one install, entire AI engineering workflow.", "license": "MIT", "type": "module", diff --git a/test/free-durations-record-workflow.test.ts b/test/free-durations-record-workflow.test.ts index 7a61d7c6b..a86d0fcbc 100644 --- a/test/free-durations-record-workflow.test.ts +++ b/test/free-durations-record-workflow.test.ts @@ -81,7 +81,11 @@ test('the propose step touches only the two seeds, never the allowlist, on one b expect(script).not.toContain('free-test-seed-allowlist.json'); expect(script).toContain('branch=bot/free-duration-seeds'); expect(script).toContain('bun test test/free-seed-ratchet.test.ts'); - expect(script).toContain('gh workflow run free-tests.yml'); + for (const workflow of ['free-tests.yml', 'windows-free-tests.yml', 'quality-gate.yml']) { + expect(script).toContain(`gh workflow run ${workflow} --repo "$GITHUB_REPOSITORY" --ref "$branch"`); + expect(load(workflow).on).toHaveProperty('workflow_dispatch'); + } + expect(script).toContain('those are this PR\'s checks'); expect(proposeStep.env.OPEN_PR).toBe("${{ github.ref == 'refs/heads/main' && (github.event_name == 'schedule' || inputs.open_pr) }}"); expect(script.indexOf('if [ "$OPEN_PR" != true ]')).toBeLessThan(script.indexOf('git push')); expect(recorder.on.workflow_dispatch.inputs.open_pr).toMatchObject({ type: 'boolean', default: true });