From fe2a7bb4e9f799e50969defbbeea7a840853a772 Mon Sep 17 00:00:00 2001 From: Prad Nukala Date: Thu, 27 Aug 2026 15:46:14 -0400 Subject: [PATCH] ci(ci): add project set/difficulty reconciliation step to close-solved workflow --- .github/workflows/close-solved.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/.github/workflows/close-solved.yml b/.github/workflows/close-solved.yml index fcd150c..8271e70 100644 --- a/.github/workflows/close-solved.yml +++ b/.github/workflows/close-solved.yml @@ -39,3 +39,25 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} DRY_RUN: ${{ inputs.dry_run }} SRS_ADMIN_KEY: ${{ secrets.SRS_ADMIN_KEY }} + + # Project fields are a projection of the issue labels, so the same push + # that adds a solution (and any issue filed since the last run) can leave + # the board's Set/Difficulty empty. Reconciling here keeps the one + # "solution landed" entry point responsible for the whole fan-out; the + # script is idempotent, so a run with nothing to do writes nothing. + # + # Needs the `project` scope, which GITHUB_TOKEN does not have — hence + # PROJECT_PAT. Unset = skip, matching SRS_ADMIN_KEY above. Best-effort by + # design: D1 and the issues are the truth, so a Project failure must not + # fail a run that already closed issues and logged the solve. + - name: Reconcile Project Set/Difficulty + continue-on-error: true + env: + GH_TOKEN: ${{ secrets.PROJECT_PAT }} + DRY_RUN: ${{ inputs.dry_run }} + run: | + if [ -z "$GH_TOKEN" ]; then + echo "PROJECT_PAT unset — skipping the Project field reconcile" + exit 0 + fi + bun apps/cli/sync-project-fields.ts