mirror of
https://github.com/garrytan/gstack.git
synced 2026-11-12 11:40:51 +01:00
Move the tools only Capy crews use into a crew/ folder (GST-1833) (#4145)
* Load the Capy crew skills only on Capy machines (GST-1833) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Add changelog entry for Capy-only crew skills (GST-1833) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Move the Capy-only crew tooling into crew/ and run its tests only when needed (GST-1833) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Test that the Capy launch file puts crew/bin on PATH Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Count any ~/.capy as a Capy machine, so a Mac running Capy keeps /captain Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Fix the tests and fixtures that broke when crew tooling moved into crew/ Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Plan every crew test when a pull request's merge-base can't be read Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Add a test that checks each crew-only module left the root tree for crew/ Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Run crew tests on pull requests that change bin/ commands or workflows they drive Review-Finding: p1/specialist-batched#1 reader=testing Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Keep running every crew test on every pull request; the skip comes in a later change Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Keep copied installs and older release bisects working after the crew/ move Setup now copies crew/lib into every host's runtime root beside bin and lib, so Windows installs (which copy instead of linking) can still start gstack-ship-receipt, gstack-pregate and the other commands that import it. The release bisect runs the train-gate script from wherever the checked-out commit has it, so a bisect over commits from before the move still gets a verdict. Review-Finding: p1/outside-voice#1 reader=outside-voice Review-Finding: p1/outside-voice#2 reader=outside-voice Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Say in the changelog that Windows installs keep working after the crew/ move Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Point the harness guide's merge-queue rows at crew/lib/ where those modules moved Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Point the plain-title test at the wave module's new home in crew/ (GST-1833) 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>
This commit is contained in:
1 parent
6042f6ad48
commit
6417abf7a6
210 files changed
+1963
-1784
No files matched your search
@@ -87,10 +87,10 @@ jobs:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
GSTACK_STATE_ROOT: ${{ runner.temp }}/gstack-state
|
||||
run: |
|
||||
bun --no-env-file --config=/dev/null --no-install run scripts/train-backstop.ts run --repo "$GITHUB_REPOSITORY" --branch "$GITHUB_REF_NAME" --sha "$GITHUB_SHA" \
|
||||
bun --no-env-file --config=/dev/null --no-install run crew/scripts/train-backstop.ts run --repo "$GITHUB_REPOSITORY" --branch "$GITHUB_REF_NAME" --sha "$GITHUB_SHA" \
|
||||
--summary "$GITHUB_STEP_SUMMARY" --outputs "$GITHUB_OUTPUT"
|
||||
|
||||
# The per-commit verdict the stable release reads (scripts/release-cut.ts).
|
||||
# The per-commit verdict the stable release reads (crew/scripts/release-cut.ts).
|
||||
# Its own job with checks: write and no repository code (the same split as
|
||||
# evals.yml's train-check): only the action word the gate step recorded.
|
||||
backstop-check:
|
||||
|
||||
@@ -15,7 +15,7 @@ name: Periodic Evals
|
||||
# diff-billed, so without it the full gate census might never execute
|
||||
# anywhere); the hollow-shard guard (exit 0 + zero executed tests under
|
||||
# EVALS_ALL fails) makes both lanes census-health checks, not just test runs.
|
||||
# The gate census is a matrix of arms (scripts/census-arms.ts): each arm is a
|
||||
# The gate census is a matrix of arms (crew/scripts/census-arms.ts): each arm is a
|
||||
# host and model with its own plan. Monday runs claude-opus (the capture
|
||||
# model) and codex-sol (gpt-6.1-sol on the Codex host, adapter cases only);
|
||||
# the monthly cron runs only the census, with claude-fable and codex-astra.
|
||||
@@ -41,7 +41,7 @@ on:
|
||||
type: boolean
|
||||
default: false
|
||||
census_arms:
|
||||
description: 'Run only the gate census, with these arms (comma-separated: claude-opus, codex-sol, claude-fable, codex-astra; scripts/census-arms.ts). Empty keeps the periodic lane.'
|
||||
description: 'Run only the gate census, with these arms (comma-separated: claude-opus, codex-sol, claude-fable, codex-astra; crew/scripts/census-arms.ts). Empty keeps the periodic lane.'
|
||||
type: string
|
||||
default: ''
|
||||
expected_sha:
|
||||
@@ -159,7 +159,7 @@ jobs:
|
||||
with:
|
||||
bun-version: 1.4.2
|
||||
|
||||
# Census arms (scripts/census-arms.ts): which host/model arms run the
|
||||
# Census arms (crew/scripts/census-arms.ts): which host/model arms run the
|
||||
# gate census, and whether the periodic lane runs beside them.
|
||||
- name: Select the census arms
|
||||
id: census
|
||||
@@ -167,7 +167,7 @@ jobs:
|
||||
SCHEDULE: ${{ github.event.schedule }}
|
||||
CENSUS_ARMS: ${{ inputs.census_arms }}
|
||||
INCLUDE_GATE_CENSUS: ${{ github.ref == 'refs/heads/main' || inputs.include_gate_census }}
|
||||
run: bun --no-install run scripts/census-arms.ts --select >> "$GITHUB_OUTPUT"
|
||||
run: bun --no-install run crew/scripts/census-arms.ts --select >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Emit run manifest (ALL periodic tests minus reasoned excludes)
|
||||
if: steps.census.outputs.periodic_lane == 'true'
|
||||
@@ -204,7 +204,7 @@ jobs:
|
||||
run: |
|
||||
set -euo pipefail
|
||||
for arm in $(jq -r '.[]' <<<"$ARMS"); do
|
||||
mapfile -t arm_env < <(bun --no-install run scripts/census-arms.ts --env "$arm")
|
||||
mapfile -t arm_env < <(bun --no-install run crew/scripts/census-arms.ts --env "$arm")
|
||||
env "${arm_env[@]}" EVALS_TIER=gate bun run scripts/test-paid-shards.ts --tier gate --emit-plan "/tmp/gate-census-plan/$arm/manifest.json" --slice-budget 420 --jobs 2 --skip-judges --max-parallel 20
|
||||
done
|
||||
|
||||
@@ -213,7 +213,7 @@ jobs:
|
||||
id: gate-matrix
|
||||
env:
|
||||
ARMS: ${{ steps.census.outputs.arms }}
|
||||
run: bun --no-install run scripts/census-arms.ts --matrix /tmp/gate-census-plan "$ARMS" >> "$GITHUB_OUTPUT"
|
||||
run: bun --no-install run crew/scripts/census-arms.ts --matrix /tmp/gate-census-plan "$ARMS" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7
|
||||
if: steps.census.outputs.arms != '[]'
|
||||
@@ -553,7 +553,7 @@ jobs:
|
||||
name: gate-census-${{ matrix.arm }} (${{ matrix.slice }})
|
||||
runs-on: ubicloud-standard-8
|
||||
needs: [build-image, plan-slices]
|
||||
# The planner picks the arms (scripts/census-arms.ts). A branch dispatch
|
||||
# The planner picks the arms (crew/scripts/census-arms.ts). A branch dispatch
|
||||
# validates the periodic lane only unless it sets include_gate_census or
|
||||
# census_arms; gate cases on a branch also go through an evals.yml
|
||||
# dispatch with evals_all. Main (schedule or dispatch) always runs it.
|
||||
@@ -634,7 +634,7 @@ jobs:
|
||||
- name: Select the census arm's host and model
|
||||
env:
|
||||
ARM: ${{ matrix.arm }}
|
||||
run: bun --no-install run scripts/census-arms.ts --env "$ARM" >> "$GITHUB_ENV"
|
||||
run: bun --no-install run crew/scripts/census-arms.ts --env "$ARM" >> "$GITHUB_ENV"
|
||||
|
||||
- name: Run gate census slice ${{ matrix.slice }} (${{ matrix.arm }})
|
||||
env:
|
||||
|
||||
+23
-20
@@ -34,7 +34,7 @@ on:
|
||||
default: ''
|
||||
# Merge trains (docs/ship-policy.md#run-a-merge-train): only under a train
|
||||
# block in the default branch's .gstack/ship-policy.json. The route job
|
||||
# validates them before any paid work (scripts/train-gate.ts route).
|
||||
# validates them before any paid work (crew/scripts/train-gate.ts route).
|
||||
cases:
|
||||
description: 'Train bisect: comma-separated case ids from the full gate plan (gstack-ship-queue train bisect sets it)'
|
||||
type: string
|
||||
@@ -194,7 +194,7 @@ jobs:
|
||||
# changes. Under a train block a PR push is `pr-summary` (screen-summary
|
||||
# prints the screening selection and its estimated cost; no paid slice
|
||||
# starts), and gstack-ship-queue's dispatches are `screen`, `train` or
|
||||
# `bisect` once scripts/train-gate.ts has validated their inputs. A refused
|
||||
# `bisect` once crew/scripts/train-gate.ts has validated their inputs. A refused
|
||||
# dispatch fails here, before any paid work.
|
||||
route:
|
||||
runs-on: ubuntu-24.04
|
||||
@@ -290,10 +290,10 @@ jobs:
|
||||
if [ "$TRAIN_POLICY" = true ]; then mode=pr-summary; fi
|
||||
echo "mode=${mode}" >> "$GITHUB_OUTPUT"
|
||||
echo "- Run mode: ${mode}" >> "$GITHUB_STEP_SUMMARY"
|
||||
elif [ -f scripts/train-gate.ts ]; then
|
||||
bun --no-env-file --config=/dev/null --no-install run scripts/train-gate.ts route --github-output "$GITHUB_OUTPUT" >> "$GITHUB_STEP_SUMMARY"
|
||||
elif [ -f crew/scripts/train-gate.ts ]; then
|
||||
bun --no-env-file --config=/dev/null --no-install run crew/scripts/train-gate.ts route --github-output "$GITHUB_OUTPUT" >> "$GITHUB_STEP_SUMMARY"
|
||||
elif [ -n "${CASES}${PREFIX_SHAS}${SCREEN_PR}${SCREEN_MERGE_SHA}${SCREEN_POLICY}" ]; then
|
||||
echo "::error::${GITHUB_REF_NAME} has no scripts/train-gate.ts to validate the train or screen inputs; dispatch from a ref that has it"
|
||||
echo "::error::${GITHUB_REF_NAME} has no crew/scripts/train-gate.ts to validate the train or screen inputs; dispatch from a ref that has it"
|
||||
exit 1
|
||||
else
|
||||
echo "mode=dispatch" >> "$GITHUB_OUTPUT"
|
||||
@@ -323,7 +323,7 @@ jobs:
|
||||
PREFIXES: ${{ steps.route.outputs.prefixes }}
|
||||
NONCE: ${{ inputs.nonce }}
|
||||
run: |
|
||||
bun --no-env-file --config=/dev/null --no-install run scripts/train-gate.ts bisect-plan --cases "$CASES" --prefixes "$PREFIXES" --nonce "$NONCE" \
|
||||
bun --no-env-file --config=/dev/null --no-install run crew/scripts/train-gate.ts bisect-plan --cases "$CASES" --prefixes "$PREFIXES" --nonce "$NONCE" \
|
||||
--out /tmp/train-bisect/bisect.json --github-output "$GITHUB_OUTPUT" >> "$GITHUB_STEP_SUMMARY"
|
||||
|
||||
- name: Hand the bisect plan to its executors
|
||||
@@ -460,11 +460,11 @@ jobs:
|
||||
RECOVERY_MODE: ${{ github.event_name == 'workflow_dispatch' && 'dispatch' || 'pr' }}
|
||||
run: |
|
||||
mkdir -p /tmp/gstack-eval-input-cache
|
||||
if [ ! -f scripts/recover-receipts.ts ]; then
|
||||
echo "- Receipt recovery unavailable: the base ref has no scripts/recover-receipts.ts; reuse stays off this run" >> "$GITHUB_STEP_SUMMARY"
|
||||
if [ ! -f crew/scripts/recover-receipts.ts ]; then
|
||||
echo "- Receipt recovery unavailable: the base ref has no crew/scripts/recover-receipts.ts; reuse stays off this run" >> "$GITHUB_STEP_SUMMARY"
|
||||
exit 0
|
||||
fi
|
||||
bun --no-install run scripts/recover-receipts.ts collect --repo "$GITHUB_REPOSITORY" --pr "$PR_NUMBER" \
|
||||
bun --no-install run crew/scripts/recover-receipts.ts collect --repo "$GITHUB_REPOSITORY" --pr "$PR_NUMBER" \
|
||||
--head-repo "$HEAD_REPO" --branch "$HEAD_BRANCH" --run-id "$GITHUB_RUN_ID" \
|
||||
--store /tmp/gstack-eval-input-cache --store-key "$STORE_KEY" --mode "$RECOVERY_MODE" --budget-seconds 60 >> "$GITHUB_STEP_SUMMARY" \
|
||||
|| echo "- Receipt recovery crashed; reuse stays off this run" >> "$GITHUB_STEP_SUMMARY"
|
||||
@@ -493,11 +493,11 @@ jobs:
|
||||
TESTED_SHA: ${{ inputs.screen_merge_sha || github.sha }}
|
||||
SCREEN_POLICY: ${{ inputs.screen_policy }}
|
||||
run: |
|
||||
if [ ! -f scripts/gate-reuse.ts ]; then
|
||||
echo "- Gate verdict reuse unavailable: the base ref has no scripts/gate-reuse.ts; the full gate runs" >> "$GITHUB_STEP_SUMMARY"
|
||||
if [ ! -f crew/scripts/gate-reuse.ts ]; then
|
||||
echo "- Gate verdict reuse unavailable: the base ref has no crew/scripts/gate-reuse.ts; the full gate runs" >> "$GITHUB_STEP_SUMMARY"
|
||||
exit 0
|
||||
fi
|
||||
bun --no-install run scripts/gate-reuse.ts find --repo "$GITHUB_REPOSITORY" --pr "$PR_NUMBER" --head-repo "$HEAD_REPO" \
|
||||
bun --no-install run crew/scripts/gate-reuse.ts find --repo "$GITHUB_REPOSITORY" --pr "$PR_NUMBER" --head-repo "$HEAD_REPO" \
|
||||
--branch "$HEAD_BRANCH" --run-id "$GITHUB_RUN_ID" --head-sha "$HEAD_SHA" --tested-sha "$TESTED_SHA" \
|
||||
${SCREEN_POLICY:+--screen-policy "$SCREEN_POLICY"} --out /tmp/gate-reuse --budget-seconds 90 >> "$GITHUB_STEP_SUMMARY" \
|
||||
|| echo "- Gate verdict reuse crashed; the full gate runs" >> "$GITHUB_STEP_SUMMARY"
|
||||
@@ -548,7 +548,7 @@ jobs:
|
||||
EVALS_SCREEN_POLICY: narrow
|
||||
run: |
|
||||
EVALS_TIER=gate bun --no-install run scripts/test-paid-shards.ts --tier gate --emit-plan /tmp/paid-plan/manifest.json --slices 1
|
||||
bun --no-env-file --config=/dev/null --no-install run scripts/train-gate.ts screen-summary /tmp/paid-plan/manifest.json --pr "$PR_NUMBER" >> "$GITHUB_STEP_SUMMARY"
|
||||
bun --no-env-file --config=/dev/null --no-install run crew/scripts/train-gate.ts screen-summary /tmp/paid-plan/manifest.json --pr "$PR_NUMBER" >> "$GITHUB_STEP_SUMMARY"
|
||||
bun --no-install run scripts/test-pr-profile.ts summary /tmp/paid-plan/manifest.json >> "$GITHUB_STEP_SUMMARY"
|
||||
|
||||
# ── Sliced lane (the ONLY paid lane; legacy 17-row matrix deleted) ──────────
|
||||
@@ -633,7 +633,7 @@ jobs:
|
||||
if: github.event_name == 'pull_request' || inputs.pr_receipts != ''
|
||||
run: |
|
||||
mkdir -p /tmp/gstack-eval-input-cache
|
||||
bun --no-install run scripts/recover-receipts.ts decide /tmp/gstack-eval-input-cache --github-output "$GITHUB_OUTPUT" >> "$GITHUB_STEP_SUMMARY"
|
||||
bun --no-install run crew/scripts/recover-receipts.ts decide /tmp/gstack-eval-input-cache --github-output "$GITHUB_OUTPUT" >> "$GITHUB_STEP_SUMMARY"
|
||||
|
||||
- name: Emit run manifest
|
||||
env:
|
||||
@@ -661,7 +661,7 @@ jobs:
|
||||
if: github.event_name == 'pull_request' || needs.route.outputs.mode == 'screen'
|
||||
run: |
|
||||
mkdir -p /tmp/gate-reuse
|
||||
bun --no-install run scripts/gate-reuse.ts confirm /tmp/gate-reuse /tmp/paid-plan/manifest.json --out /tmp/paid-plan \
|
||||
bun --no-install run crew/scripts/gate-reuse.ts confirm /tmp/gate-reuse /tmp/paid-plan/manifest.json --out /tmp/paid-plan \
|
||||
--github-output "$GITHUB_OUTPUT" >> "$GITHUB_STEP_SUMMARY"
|
||||
|
||||
# CEO-13: the mode, case counts and, on fallback, every file that
|
||||
@@ -870,7 +870,7 @@ jobs:
|
||||
# The rerun runs fresh (no receipts, no reuse) and never changes a trial
|
||||
# count, kind or threshold; slices-report decides FLAKY (green, annotated,
|
||||
# flake record) or red. Train runs use the same path; bisects rerun inside
|
||||
# scripts/train-gate.ts.
|
||||
# crew/scripts/train-gate.ts.
|
||||
rerun-plan:
|
||||
runs-on: ubuntu-24.04
|
||||
needs: [plan-slices, eval-slices]
|
||||
@@ -1167,7 +1167,10 @@ jobs:
|
||||
EVALS_JOBS: "1"
|
||||
EVALS_CONCURRENCY: "1"
|
||||
SLICE: ${{ matrix.slice }}
|
||||
run: EVALS_TIER=gate bun --no-env-file --config=/dev/null run scripts/train-gate.ts bisect-prefix --plan /tmp/train-bisect/bisect.json --index "$SLICE" --out /tmp/train-bisect/out
|
||||
run: |
|
||||
# A prefix from before the crew/ move (GST-1833) has the executor at scripts/train-gate.ts.
|
||||
gate=crew/scripts/train-gate.ts; [ -f "$gate" ] || gate=scripts/train-gate.ts
|
||||
EVALS_TIER=gate bun --no-env-file --config=/dev/null run "$gate" bisect-prefix --plan /tmp/train-bisect/bisect.json --index "$SLICE" --out /tmp/train-bisect/out
|
||||
|
||||
- name: Upload the prefix record
|
||||
if: always() && steps.prefix.outputs.short != ''
|
||||
@@ -1305,7 +1308,7 @@ jobs:
|
||||
if: needs.plan-slices.outputs.gate_reuse == 'true'
|
||||
run: |
|
||||
set +e
|
||||
bun --no-install run scripts/gate-reuse.ts report /tmp/paid-report/gate-reuse.json --repo "$GITHUB_REPOSITORY" > /tmp/report.txt
|
||||
bun --no-install run crew/scripts/gate-reuse.ts report /tmp/paid-report/gate-reuse.json --repo "$GITHUB_REPOSITORY" > /tmp/report.txt
|
||||
code=$?
|
||||
cat /tmp/report.txt
|
||||
echo "exit=$code" >> "$GITHUB_OUTPUT"
|
||||
@@ -1378,7 +1381,7 @@ jobs:
|
||||
SCREEN_POLICY: ${{ inputs.screen_policy }}
|
||||
RECONCILE_EXIT: ${{ steps.reconcile.outputs.exit }}
|
||||
run: |
|
||||
bun --no-install run scripts/gate-reuse.ts bind /tmp/paid-report --out /tmp/gate-binding --repo "$GITHUB_REPOSITORY" \
|
||||
bun --no-install run crew/scripts/gate-reuse.ts bind /tmp/paid-report --out /tmp/gate-binding --repo "$GITHUB_REPOSITORY" \
|
||||
--pr "$PR_NUMBER" --run-id "$GITHUB_RUN_ID" --run-attempt "$GITHUB_RUN_ATTEMPT" --head-sha "$HEAD_SHA" \
|
||||
--tested-sha "$TESTED_SHA" --profile "$EVALS_PROFILE" --reconcile-exit "$RECONCILE_EXIT" \
|
||||
${SCREEN_POLICY:+--purpose screen --screen-policy "$SCREEN_POLICY"} >> "$GITHUB_STEP_SUMMARY"
|
||||
@@ -1413,7 +1416,7 @@ jobs:
|
||||
RECORD: ${{ needs.plan-slices.outputs.record_artifact }}
|
||||
RECONCILE_EXIT: ${{ steps.reconcile.outputs.exit }}
|
||||
run: |
|
||||
bun --no-env-file --config=/dev/null --no-install run scripts/train-gate.ts train-record /tmp/paid-report --nonce "$NONCE" --head "$HEAD_SHA" \
|
||||
bun --no-env-file --config=/dev/null --no-install run crew/scripts/train-gate.ts train-record /tmp/paid-report --nonce "$NONCE" --head "$HEAD_SHA" \
|
||||
--reconcile-exit "$RECONCILE_EXIT" --run-id "$GITHUB_RUN_ID" --run-attempt "$GITHUB_RUN_ATTEMPT" --repo "$GITHUB_REPOSITORY" \
|
||||
--out "/tmp/train-record/${RECORD}.json" >> "$GITHUB_STEP_SUMMARY"
|
||||
|
||||
|
||||
@@ -35,5 +35,5 @@ jobs:
|
||||
run: bun install --frozen-lockfile
|
||||
- name: Measure one guarded read (3 runs per journal)
|
||||
run: |
|
||||
bun scripts/measure-journal-read.ts --runs 3 | tee "$RUNNER_TEMP/measure.md"
|
||||
bun crew/scripts/measure-journal-read.ts --runs 3 | tee "$RUNNER_TEMP/measure.md"
|
||||
cat "$RUNNER_TEMP/measure.md" >> "$GITHUB_STEP_SUMMARY"
|
||||
@@ -1,9 +1,9 @@
|
||||
name: Release gate
|
||||
# The release gate (docs/ship-policy.md#release-gate; bin/gstack-release-gate,
|
||||
# lib/release-gate.ts): the full paid gate on main's head every 8 hours, only
|
||||
# The release gate (docs/ship-policy.md#release-gate; crew/bin/gstack-release-gate,
|
||||
# crew/lib/release-gate.ts): the full paid gate on main's head every 8 hours, only
|
||||
# when main moved since the last gate. It records the verdict as a release
|
||||
# note in refs/notes/gstack-trains, publishes the main-backstop check run on
|
||||
# the gated commit (what scripts/release-cut.ts reads as gated), and bisects
|
||||
# the gated commit (what crew/scripts/release-cut.ts reads as gated), and bisects
|
||||
# a red gate's cases. It never writes the stable branch: release-cut is its
|
||||
# only writer, and refuses every cut while the newest gate is red. Inert (no
|
||||
# paid work, nothing written) unless main's .gstack/ship-policy.json declares
|
||||
@@ -12,7 +12,7 @@ name: Release gate
|
||||
on:
|
||||
schedule:
|
||||
# Every 8 hours (RELEASE_GATE_SCHEDULE_HOURS in lib/release-gate-policy.ts;
|
||||
# test/release-gate-workflow.test.ts pins the two together), off the hour.
|
||||
# crew/test/release-gate-workflow.test.ts pins the two together), off the hour.
|
||||
- cron: '17 */8 * * *'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
@@ -90,12 +90,12 @@ jobs:
|
||||
# branch) publishes no check run, so it fails the job, as does a run that recorded no action (a crash).
|
||||
run: |
|
||||
rc=0
|
||||
./bin/gstack-release-gate run --repo "$GITHUB_REPOSITORY" --budget-minutes 330 \
|
||||
./crew/bin/gstack-release-gate run --repo "$GITHUB_REPOSITORY" --budget-minutes 330 \
|
||||
--summary "$GITHUB_STEP_SUMMARY" --outputs "$GITHUB_OUTPUT" ${DRY_RUN:+--dry-run} ${IGNORE_CADENCE:+--ignore-cadence} || rc=$?
|
||||
if [ "$rc" != 0 ] && ! { grep -qE '^action=(held|failed)$' "$GITHUB_OUTPUT" && grep -qE '^sha=[0-9a-f]{40}$' "$GITHUB_OUTPUT"; }; then exit "$rc"; fi
|
||||
|
||||
# The gated commit's check run (release_gate.check_name, main-backstop), the
|
||||
# evidence scripts/release-cut.ts reads. Its own job with checks: write and
|
||||
# evidence crew/scripts/release-cut.ts reads. Its own job with checks: write and
|
||||
# no repository code, as for backstop-check: only the recorded action word.
|
||||
release-check:
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
@@ -27,7 +27,7 @@ jobs:
|
||||
# reads below fail loudly when a fetch fails (.github/scripts/history-read.sh).
|
||||
filter: blob:none
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
# The head's release_tool runs inside the gate (lib/version-gate-train.ts);
|
||||
# The head's release_tool runs inside the gate (crew/lib/version-gate-train.ts);
|
||||
# no token may sit in the checkout it stages. The base fetch below is public.
|
||||
persist-credentials: false
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ name: Stable release
|
||||
# Tags the newest green commit on main as v<VERSION>, publishes the GitHub
|
||||
# Release, and fast-forwards refs/heads/stable to it (docs/releases.md). Team
|
||||
# installs follow stable, so this is the only thing that moves them. Runs
|
||||
# every day at 14:00 UTC as the daily check (scripts/release-cadence.ts, R74):
|
||||
# every day at 14:00 UTC as the daily check (crew/scripts/release-cadence.ts, R74):
|
||||
# it cuts when a gated change stable lacks carries an important: changelog
|
||||
# fragment and stable is 24 hours old, when stable is 7 days old and main has
|
||||
# gated changes, or on Monday and Thursday past the 72-hour floor; otherwise it
|
||||
@@ -54,8 +54,8 @@ on:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/weekly-release.yml'
|
||||
- 'scripts/release-cut.ts'
|
||||
- 'scripts/release-cadence.ts'
|
||||
- 'crew/scripts/release-cut.ts'
|
||||
- 'crew/scripts/release-cadence.ts'
|
||||
- 'lib/changelog-fragments.ts'
|
||||
|
||||
# One cut at a time; a second dispatch waits for the first. A pull request's
|
||||
@@ -133,7 +133,7 @@ jobs:
|
||||
[ -n "$SECURITY_REASON" ] && args+=(--security "$SECURITY_REASON")
|
||||
[ -n "$REGRESSION_REASON" ] && args+=(--regression "$REGRESSION_REASON")
|
||||
echo "## Stable release ($([ "$DRY_RUN" = true ] && echo 'dry run' || echo 'cut')$([ "$DAILY" = true ] && echo ', daily check'), $GITHUB_EVENT_NAME)" >> "$GITHUB_STEP_SUMMARY"
|
||||
bun --no-env-file --config=/dev/null --no-install run scripts/release-cut.ts "${args[@]}"
|
||||
bun --no-env-file --config=/dev/null --no-install run crew/scripts/release-cut.ts "${args[@]}"
|
||||
|
||||
dry-run:
|
||||
name: Dry run against main
|
||||
@@ -161,6 +161,6 @@ jobs:
|
||||
git fetch --quiet origin '+refs/heads/stable:refs/remotes/origin/stable' 2>/dev/null || echo "origin has no stable yet"
|
||||
git fetch --quiet --tags origin
|
||||
echo "## Stable release (dry run from PR #${{ github.event.pull_request.number }})" >> "$GITHUB_STEP_SUMMARY"
|
||||
bun --no-env-file --config=/dev/null --no-install run scripts/release-cut.ts --repo "$GITHUB_REPOSITORY" --summary "$GITHUB_STEP_SUMMARY" --dry-run
|
||||
bun --no-env-file --config=/dev/null --no-install run crew/scripts/release-cut.ts --repo "$GITHUB_REPOSITORY" --summary "$GITHUB_STEP_SUMMARY" --dry-run
|
||||
echo "## Daily check (dry run from PR #${{ github.event.pull_request.number }})" >> "$GITHUB_STEP_SUMMARY"
|
||||
bun --no-env-file --config=/dev/null --no-install run scripts/release-cut.ts --repo "$GITHUB_REPOSITORY" --summary "$GITHUB_STEP_SUMMARY" --dry-run --daily
|
||||
bun --no-env-file --config=/dev/null --no-install run crew/scripts/release-cut.ts --repo "$GITHUB_REPOSITORY" --summary "$GITHUB_STEP_SUMMARY" --dry-run --daily
|
||||
Reference in new issue
Block a user