From 41e56afe3be31f95c6b5a155aed1c058258fa48d Mon Sep 17 00:00:00 2001 From: OffgridwithJD Date: Sat, 29 Aug 2026 23:25:34 +0000 Subject: [PATCH] ci: run the gates on a tag, so beta criterion 2 can be satisfied (#833) design/RELEASE_PLAN_1.0.md asks for a green matrix "on the tag itself, not on a branch", and names both the nightly deep gate and the sanitizer gate. Nothing fired on a tag. Measured against the three shipped tags, counting workflow runs whose head_sha is the tagged commit: v1.0-dev 0 runs. Nothing has ever run against that commit. v1.0-alpha 2 runs, both event=push ref=main. v1.0-alpha2 8 runs, all ref=main: 2 success on the day of the tag, and 6 nightly deep gate failures from 08-19 to 08-24, which were the environment red that #741 diagnosed and closed on 08-25. Not one run is attributed to a tag. The provenance of a release today is "some runs against main that happen to share a SHA", and for v1.0-dev there are none. ci.yml gains tags on its existing push trigger. nightly.yml gains a push trigger it did not have, because criterion 2 names its two jobs specifically and a schedule cannot deliver them for a tag: the nightly after a tag runs against whatever main holds by then, not against the tagged commit. Three things checked rather than assumed before making the change: actions/checkout takes the triggering ref, so a tag run builds the tag. ci.yml's concurrency group is ci-${{ github.ref }} with cancel-in-progress. A tag ref is not refs/heads/main, so the tag run and the main run occupy different groups and neither cancels the other. nightly.yml is group: nightly with cancel-in-progress: false, so a tag run queues behind a scheduled one. nightly.yml guards every job with `if: github.event_name == 'workflow_dispatch' || github.repository == 'commandprompt/pgcolumnar'`. A tag push on the canonical repository satisfies the second clause, so the jobs run there and a fork still skips them. No guard change is needed. The duplicate run against a commit already built on main is the point rather than waste: it is what binds a green result to the release artifact. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01KL9BxvtjERL34H1XV8BND2 --- .github/workflows/ci.yml | 13 +++++++++++++ .github/workflows/nightly.yml | 12 ++++++++++++ 2 files changed, 25 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 632165ef..f2676c4f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,6 +24,19 @@ name: build and test on: push: branches: [main] + # Tags too, because the beta 1 entry test in design/RELEASE_PLAN_1.0.md asks + # for a green matrix "on the tag itself, not on a branch", and nothing here + # fired on a tag: v1.0-dev has no workflow run at all, and the runs against + # v1.0-alpha and v1.0-alpha2 are push-to-main runs that happen to share the + # commit. A criterion satisfiable only by remembering to dispatch one by hand + # is not a gate. actions/checkout takes the triggering ref, so this run is + # the tag's own. + # + # The duplicate run against a commit already built on main is the point + # rather than waste: it is what binds a green result to the release + # artifact. The concurrency group below keys on github.ref, and a tag ref is + # not refs/heads/main, so the two do not cancel each other. + tags: ['v*'] pull_request: workflow_dispatch: diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index a3866ec9..508b5324 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -17,6 +17,18 @@ name: nightly deep gate on: + # A tag runs the deep gate as well as the per-PR one. Beta 1 criterion 2 names + # both this workflow's matrix and its sanitizer gate, and asks for them green + # on the tag; a schedule cannot deliver that, because the nightly that follows + # a tag runs against whatever main holds by then. + # + # concurrency below is group: nightly with cancel-in-progress: false, so a tag + # run queues behind a scheduled one instead of killing it. The per-job + # `if: github.event_name == 'workflow_dispatch' || github.repository == ...` + # guards already admit a push on the canonical repository, so they need no + # change: a tag push there satisfies the second clause, and a fork still skips. + push: + tags: ['v*'] schedule: - cron: "0 6 * * *" # nightly, 06:00 UTC workflow_dispatch: