Uh oh!
There was an error while loading. Please reload this page.
fix(kanban): advance-deploy-env advances closing ISSUES, not just PRs (backend#1600) - #168
Conversation
… PR (backend#1600) advance-deploy-env advanced only PRs; issues closed by a develop-merged PR were parked at On dev by the closure-router and never advanced when their code shipped, drifting permanently. For each PR in the push, resolve closingIssuesReferences (cross-repo aware) and advance each closing issue with the same monotonic guard, archived-skip and (new) dry-run behaviour. Adds a dry_run input; update_field short-circuits under it so both the PR and issue paths can be tested without writes.
LukasWodka
commented
Aug 6, 2026
Reviewing this from a parallel session that reached the same diagnosis independently — the core change is right and I'm dropping my version in favour of it. Three findings, one of which I'd treat as must-fix before merge. 🔴 Must-fix: this reverts a SHA pin- - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0+ - uses: actions/checkout@v4That undoes the D10 pinning work from backend#1491 / #1490 on the single most-consumed reusable workflow in the org. A mutable Nothing will catch it for you. I checked: 🟠 Silent cap at 30 closing issues
🟡 Two structural notes (take or leave)
✅ What's right, for the recordCross-repo resolution via Corroborating measurement from my side, if useful in the PR body: of the 10 issues currently in The three |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 528d243. Configure here.
Uh oh!
There was an error while loading. Please reload this page.
…igh) PRs merge to develop (not the default branch), so closingIssuesReferences lists still-OPEN issues; advancing those into deploy columns is wrong and reconcile bounces them to Backlog. Gate the advancement on issue.state == CLOSED.
…1603) (#171) * feat(ci): run the org's own code-quality suite on this repo (backend#1603) This repo publishes code-quality.yml -- and its action-pins job -- to all 19 other repos, and was the only repo that never ran it. The exemption was invisible because actionlint.yml looks like coverage: it type-checks every expression, validates needs/uses wiring, and shellchecks every run: block. What it does not do is look at action REFS. So the pinning rule this repo defines was the one rule this repo was not subject to. That is not theoretical. On 2026-08-06 .github#168 -- an otherwise correct fix -- reverted actions/checkout from its pinned commit SHA back to the mutable @v4 tag, in advance-deploy-env.yml, the most-consumed reusable workflow in the org and one that runs with PROJECTS_KANBAN_TOKEN in scope. action-pins exists to fail exactly that diff. It did not run. A human reading the diff caught it, which is the review path D10 was written to stop depending on. Armed from day one rather than soft-failed into a backlog, because the tree was measured first: shellcheck --severity=error clean over both shell scripts, house-rules.sh clean over the same, and 24 `uses:` refs across 23 workflows with zero pin violations. ruff and gitleaks could not be run locally and get their first honest look on this PR; whatever they surface is fixed or baselined here rather than the gate being softened -- the same bargain e2e-test-agent's caller records in its own comment. action-pins-soft-fail is set to false explicitly rather than left to inherit soft-fail. It is the check whose absence let #168 through, and every other repo consumes these workflows at @main and inherits whatever refs they pin, so this repo has a specific duty to enforce it on itself. actionlint.yml stays separate. The two gates have deliberately different postures -- actionlint blocks from day one against a tree cleaned in the same change; code-quality ships soft-fail: true for repos still clearing backlog -- and folding them together would force one posture onto both. No paths: filter, so the check can be made required without leaving workflow-free PRs waiting on a status that never reports. Refs backend#1603, backend#1491 (D10), backend#1276. * fix(ci): drop the action-pins inputs -- @main does not declare them yet First push of this branch produced a startup_failure on the reusable call (run 31086491251): every other check reported normally and `Code quality` never started. Cause: `action-pins` and `action-pins-soft-fail` were added in #159, which is on `develop`; `main` still carries the five-job version of code-quality.yml. Callers must reference @main (Q3), and passing an input the @main callee does not declare fails the entire call before any job runs. Same merge-order trap as the #160 audit red: a change becomes consumable by @main callers when it is PROMOTED, not when it is merged. The other five jobs still run armed, so most of backend#1603 closes now. The arming diff is written verbatim in the file so the follow-up is mechanical once #159 reaches main. Refs backend#1603.
This branch changed `actions/checkout@11d5960a…` to the mutable `@v4` tag in advance-deploy-env.yml — the most-consumed reusable workflow in the org, and one that runs with PROJECTS_KANBAN_TOKEN in scope. A floating major tag can be repointed by the upstream owner at any commit, which is exactly what D10 pinning removes. Nothing in CI would have caught it: tracebloc/.github runs only its own actionlint.yml, which does not inspect action refs, and it does not call the code-quality workflow whose action-pins job exists to fail this diff. That gap is now backend#1603 (.github#171, merged) — but action-pins itself cannot arm here until #159 reaches main, so for the moment this restore is the only thing standing between the unpin and every repo that consumes these workflows at @main. No functional change to the backend#1600 fix.
LukasWodka
commented
Aug 6, 2026
Pushed the must-fix myself as Context for why I didn't just leave it to CI: I checked, and nothing here would have caught it. The other two findings from my earlier review are still open and still yours to take or leave: the Separately: I ran the one-time backfill for the already-stranded cards, since this fix only advances on future pushes — 7 issues moved to their closing PR's column, receipted on backend#1600. No overlap with anything this PR does at runtime. |
Uh oh!
There was an error while loading. Please reload this page.

Fixes the root cause of the recurring "On dev" board drift — see backend#1600.
Problem
advance-deploy-envadvances only the PRs in a push. An issue closed by a develop-merged PR is parked at On dev by the closure-router and then never advanced when its code ships to staging/prod. Evidence: on 2026-08-06 all 20 drifted cards were closed Issues, 0 PRs.Change (additive, low-risk)
pullRequest.closingIssuesReferencesand advance each closing issue's card with the samerank()monotonic guard, archived-skip, andupdate_fieldhelper.backendissues.dry_runinput;update_fieldshort-circuits under it, so both the PR and issue paths log intended moves without writing.RUN_FAILEDstill propagates and a failed issue update fails the run, matching the PR path.dry_run: trueon one repo's caller (or a controlled run) and confirm the[DRY] would set …logs list the right issues + columns, with no writes.clientPR closing abackendissue) resolve and advance in the logs.dry_runoff and roll out.Backstop (kanban-reconcile sweep for already-drifted closed issues) is tracked separately in backend#1600.
Do not fast-merge — this is the workflow that advances the whole board.
Note
Medium Risk
Extends the workflow that bulk-updates kanban Status/Deploy on every develop/staging/prod push; wrong issue selection or state checks could move many cards, though behavior mirrors the existing PR loop and dry_run supports safe validation.
Overview
Fixes On dev drift for issue cards: after deploy pushes, the workflow still advances PRs on the board, and now also advances closed issues linked via each PR’s
closingIssuesReferences, including cross-repo closers, using the same monotonicrank()guard, archived skip, andupdate_fieldpath as PRs. Open closing issues are skipped so in-progress cards aren’t promoted when merges land ondevelopwithout auto-closing.Adds a
dry_runworkflow_callinput: when enabled,update_fieldonly logs[DRY] would set …for both PR and issue updates with no GraphQL writes.Reviewed by Cursor Bugbot for commit b980f98. Bugbot is set up for automated code reviews on this repo. Configure here.