From da23118e85a3f5f5d63e1640a124596ff36c34bf Mon Sep 17 00:00:00 2001 From: tend-agent <270458913+tend-agent@users.noreply.github.com> Date: Thu, 6 Aug 2026 23:59:05 +0000 Subject: [PATCH 1/2] fix(review-reviewers): stop a skipped init-tracking from cancelling the whole matrix A hard `needs: init-tracking` meant a 15-minute runner-acquisition failure on the tracking-issue job skipped all five matrix legs. Four consecutive ticks hit this during the 2026-08-06 Actions incident, costing 8h15m of coverage. The skill carries its own find-or-create fallback, so init-tracking is an optimisation for the first tick of each month, not a precondition. Keep `needs:` so it still wins the race normally, but let the matrix proceed when it doesn't complete. --- .github/workflows/review-reviewers.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/review-reviewers.yaml b/.github/workflows/review-reviewers.yaml index 6c0c2b1e..cfef446e 100644 --- a/.github/workflows/review-reviewers.yaml +++ b/.github/workflows/review-reviewers.yaml @@ -17,6 +17,10 @@ jobs: # legs find an existing issue instead of racing to create one. Without this, # the first cron tick of each new month produced N-1 duplicate tracking # issues (one per matrix leg that lost the find-or-create race). + # + # This is an optimisation, not a precondition: the skill still carries its own + # find-or-create fallback, so the matrix runs even when this job doesn't + # complete (see `if:` on the matrix job below). init-tracking: runs-on: ubuntu-24.04 environment: @@ -47,6 +51,11 @@ jobs: review-reviewers: needs: init-tracking + # Run even when init-tracking failed or never got a runner — losing the + # race guard costs at most a duplicate tracking issue on the first tick of + # a month, while gating on it costs the whole analysis window for every + # target repo. Not `always()`: a user cancelling the run should stop here. + if: ${{ !cancelled() }} strategy: fail-fast: false matrix: From 27641c63d882f2d397c4ed881cc01f283d848955 Mon Sep 17 00:00:00 2001 From: tend-agent <270458913+tend-agent@users.noreply.github.com> Date: Fri, 7 Aug 2026 00:07:56 +0000 Subject: [PATCH 2/2] review feedback: correct duplicate-issue cost, reconcile skill doc --- .github/workflows/review-reviewers.yaml | 2 +- plugins/tend-ci-runner/skills/review-reviewers/SKILL.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/review-reviewers.yaml b/.github/workflows/review-reviewers.yaml index cfef446e..7f4e15f5 100644 --- a/.github/workflows/review-reviewers.yaml +++ b/.github/workflows/review-reviewers.yaml @@ -52,7 +52,7 @@ jobs: review-reviewers: needs: init-tracking # Run even when init-tracking failed or never got a runner — losing the - # race guard costs at most a duplicate tracking issue on the first tick of + # race guard costs up to N-1 duplicate tracking issues on the first tick of # a month, while gating on it costs the whole analysis window for every # target repo. Not `always()`: a user cancelling the run should stop here. if: ${{ !cancelled() }} diff --git a/plugins/tend-ci-runner/skills/review-reviewers/SKILL.md b/plugins/tend-ci-runner/skills/review-reviewers/SKILL.md index b9af0f82..55d3b18f 100644 --- a/plugins/tend-ci-runner/skills/review-reviewers/SKILL.md +++ b/plugins/tend-ci-runner/skills/review-reviewers/SKILL.md @@ -82,7 +82,7 @@ GIST_DESC="review-reviewers evidence: $TARGET $MONTH" The tracking issue lives on tend (the current repo). It indexes gists via one comment per new gist — no per-run comments, no body edits. -The workflow's `init-tracking` job runs before the matrix and creates the monthly tracking issue if absent, so matrix legs always find an existing one. The find-or-create logic below remains the fallback for ad-hoc invocations and as a safety net; sort lowest-numbered first in case a race ever does produce duplicates. `gh issue create` prints the new issue's URL; parse the number from its basename. +The workflow's `init-tracking` job runs before the matrix and creates the monthly tracking issue if absent, so on a normal tick matrix legs find an existing one. It is not a precondition — the matrix runs even when that job fails or never gets a runner, so the find-or-create logic below is a live code path on the first tick of a month, not only a fallback for ad-hoc invocations. Sort lowest-numbered first so a lost race degrades to a duplicate rather than a crash. `gh issue create` prints the new issue's URL; parse the number from its basename. ```bash TRACKING_NUMBER=$(gh issue list --state open --label "$TRACKING_LABEL" \