Bumps this repo's own add-to-kanban caller, and flips repo-inventory.yml so
v2.0.0 is the fleet norm rather than the drift.
v1.0.2 declares `using: node20`. Node 20 is deprecated on GitHub-hosted
runners, so GitHub force-runs this action on Node 24 today and prints the
deprecation notice on every run -- including the 542 that succeeded. That
fallback is temporary; when it is withdrawn every repo still on v1.0.2 breaks
at once. v2.0.0 declares node24 and needs no fallback.
Not an outage fix: re-running the reported failed job unchanged on the v1.0.2
pin succeeded, so that failure was a transient TLS condition, not a runtime
incompatibility. cli and release-train have run this exact v2.0.0 pin
successfully (12/12 recent runs). v2.0.0 is input-compatible: it declares
project-url, github-token, labeled and label-operator; our callers pass the
first two.
Inventory changes:
* cli's add-to-kanban.yml goes divergent -> required. Its copy now matches
the canonical one byte-for-byte (blob 603751a), and leaving it
divergent would fail the guard with "marked divergent but now matches".
* release-train's entry stays divergent -- its header comment still differs
-- but the half of its reason claiming the v2.0.0 pin is drift is now
false, so the reason is corrected to name the header alone.
* stale-backlog.yml's divergent entries and devex-bootstrap's exemption are
untouched.
README.md told a new repo to pin v1.0.2, which would reintroduce the node20
pin this sweep removes.
This must merge AFTER the other 16 caller PRs: copies are compared by blob id
against the canonical file in the checkout, so until they land the audit
correctly reports 16 drifted copies. Documented awkwardness, fail-closed
direction, resolves itself.
Refs: tracebloc/backend#1816
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
What this changes
Three things, all one topic — this repo's own
add-to-kanbancaller, and theinventory that declares what the fleet's caller is supposed to be. Part of the
17-repo sweep for tracebloc/backend#1816.
1. This repo's caller (
.github/workflows/add-to-kanban.yml), same one-line bumpas the other 16:
2.
repo-inventory.yml— v2.0.0 becomes the norm, not the drift.cli'sadd-to-kanban.ymlentry goes fromdivergent(with a reason that said"cli's copy has drifted: it pins v2.0.0 where every other repo pins v1.0.2") to a
plain
required. Its "drift" is now the standard. The guard proves this ratherthan asserting it: with this PR's canonical copy in place,
cli's blob matchesbyte-for-byte (
603751a070de), socopiesreads OK forcli— and had itstayed
divergent, the guard would now fail it with "markeddivergentbut nowmatches tracebloc/.github exactly".
release-train's entry staysdivergent, but its reason was half false and iscorrected. It read: "adds a header … and pins v2.0.0 rather than v1.0.2. The
comment is wanted; the version pin is drift." After this PR the pin is not drift,
so the reason now names the header comment as the only remaining difference. The
entry has to stay
divergentbecause that header genuinely makes the file differfrom the canonical copy.
stale-backlog.yml's separatedivergententries are untouched, anddevex-bootstrap'sexempt(no.githubdirectory at all) is untouched.3.
README.md— the onboarding checklist told a new repo to pinactions/add-to-project@v1.0.2. Following it after this PR would reintroduce thenode20pin the sweep just removed, so the example is updated. The"
@v1does not exist" note stays true and gains the equally true note that a bare@v2moves.grep -rn 244f685across this repo now returns nothing.Why the bump
v1.0.2declaresusing: node20. Node 20 is deprecated on GitHub-hosted runners, soGitHub force-runs the action on Node 24 today and prints the deprecation notice on
every run. That fallback is explicitly temporary; when it is withdrawn, every repo
still on
v1.0.2breaks at the same moment.v2.0.0declaresusing: node24.This is planned maintenance, not an outage fix
add-to-kanbanfailure on a backend PR. Re-running that exactjob, unchanged, on the unchanged
v1.0.2pin succeeded — a transient TLScondition on the runner, not a runtime incompatibility.
second unrelated, from April). The
Node 20 is being deprecated … running with Node 24line appears on the 542 successes too.cliandrelease-trainhave run this exactv2.0.0pin successfully (12/12recent runs) — a proven-good config in our own fleet, not a leap.
action.ymlat the pinned SHA:it declares
project-url,github-token,labeled,label-operator; our callerspass the first two.
gh api repos/actions/add-to-project/git/ref/tags/v2.0.0→
5afcf98fcd03f1c2f92c3c83f58ae24323cc57fd.Blast radius if a run did fail anyway:
kanban-reconcile.yml(Mondays 04:00 UTC) addsanything
add-to-kanbanmissed, so a miss self-heals within a week.developThis is the guard's own documented awkwardness (
caller-drift.pydocstring: "theinventory is read from the checkout, but every repo's state … is read from its audit
branch over the API"). Copies are compared by git blob id against the canonical
file in this checkout. So while the other 16 PRs are still open, this PR's
canonical copy is
v2.0.0and theirdevelopbranches are stillv1.0.2— and theaudit correctly reports 16 drifted copies:
cliOK,release-trainOK,devex-bootstrapOK,.githubOK(source of truth, presence only) — i.e. every finding is a repo whose sweep PR has not
merged yet, and every one is the same blob pair.
conformance-gateis a requiredcheck here, so this PR stays red until the 16 are on
develop. That is thefail-closed direction and it resolves itself; nothing to override.
The resolution is deterministic, not hopeful: each of the 16 branches produces a file
that hashes to exactly
603751a070de6d5f0b8760240fa5da5ecba55b71, the same blob asthis PR's canonical copy and as
cli's file ondeveloptoday. Verified withgit hash-objecton all 17 edited files — one distinct hash across all of them.Verification run
develop:EXIT=0, "No drift. Everyrepo read, every entry matched." 20/20 repos, all five families OK. So the 16
findings above are caused by this batch being mid-flight, not by a pre-existing mess.
python3 scripts/tests/caller-drift-selftest.py→ pass=123 fail=0.python3 scripts/caller-drift.py --inventory repo-inventory.yml --source-dir .(exactly as
caller-drift.ymlinvokes it) → output above.python3 -c "import yaml; yaml.safe_load(open('repo-inventory.yml'))"— parses; 20repos;
cli→required,release-train→divergentwith the corrected reason.python3 -c "import yaml; yaml.safe_load(open('.github/workflows/add-to-kanban.yml'))"— parses.actionlintover the whole tree, asactionlint.ymlruns it, at the version itpins (1.7.12) → clean, exit 0.
This PR tested itself
For
pull_requestevents GitHub reads the workflow file from the PR's head, sothis PR's own
add-to-kanbanrun executed the new pin, before any merge:17/17 of this sweep's PRs added their card successfully on the v2.0.0 pin, and the
Node 20 is being deprecatedline is absent from those logs — which is the point ofthe change.
Review
Reviewer intentionally not requested yet — see tracebloc/backend#1816; this is
queued behind the current review batch. 17 simultaneous review requests would bury
the team, so the batch gets sequenced by hand. Note the merge-last ordering above when
sequencing this one.
Refs tracebloc/backend#1816