fix(ci): unbreak the Manage Issues lock job - #3880
Conversation
The Lock job has failed on every scheduled run since at least 2026-08-31 with `"github-token" length must be less than or equal to 100 characters long`. dessant/lock-threads v6.0.0 validates the input with `Joi.string().trim().max(100)`; the runner-issued GITHUB_TOKEN outgrew that bound, so the action rejected a perfectly valid credential before doing any work. v6.0.2 raises the limit to 1000 (upstream issue #55) and changes nothing else functional. Renovate sees the update on the dependency dashboard but will never open a PR for it: `.github/renovate.json5` disables patch updates for everything except python and typescript. Upstream bug-fix patches to pinned actions are therefore a standing blind spot, which is how a broken job stayed broken for ten days. Pin moved to the commit that tag v6.0.2 dereferences to.
Fro Bot — Remediation Pass (categories 1–4)Daily reactive autohealing sweep for 1. Errored PRs — noneThree open PRs, all green on both signal sources:
All three authors are trusted, all head branches are local, nothing to repair. 2. Security — nothing actionableOne open Dependabot alert: Code scanning shows four open alerts, all of them OpenSSF Scorecard probe results ( 3. Control-plane integrity — clean
4. Code quality — clean
The one thing that was actually brokenManage Issues → Lock has failed on every scheduled run since at least 2026-08-31 — ten consecutive days of silent decay in a job nobody watches. Root cause and repair are in this PR's description. Short version: Version truth comes from the upstream release source — the Needs Human Attention1. Renovate's patch-disable rule is a standing blind spot for upstream bug fixes
2.
3. Durable knowledge this run could not persist This job delivers via
🤖 Generated by Fro Bot · run 34435374053 |
The Manage Issues → Lock job has failed on every scheduled run for at least ten consecutive days. Not flaky, not rate-limited — rejected at the door.
Root cause
dessant/lock-threadsv6.0.0 — the SHA this workflow pins — validates its token input withJoi.string().trim().max(100)(src/schema.js:116@ v6.0.0). The runner-issuedGITHUB_TOKENoutgrew 100 characters, so the action refuses a perfectly valid credential before it does any work. Nothing in this repo is misconfigured; the ceiling moved underneath us.Upstream fixed it in v6.0.2 —
.max(1000), closing dessant/lock-threads#55. The v6.0.0 → v6.0.2 span is two patch releases:6.0.1bumps dependencies,6.0.2is the schema fix. No major drift, no behavior change beyond the validation bound.The fix
One line: repin
7266a7c(v6.0.0) →89ae32b(v6.0.2), the commit that the annotated tagv6.0.2dereferences to, plus a comment explaining why the pin can't drift back.Why a bot is touching a version pin at all
Renovate owns routine bumps, and it does see this one — it's on the dependency dashboard (#2828) as
dessant/lock-threads v6.0.0 → Updates: v6.0.2. It will never open a PR for it:Patch updates are off repo-wide. That rule is fine for reducing churn and wrong for upstream bug-fix patches to pinned actions, which is the only channel those fixes travel through. The blind spot is the actual finding here; the repin is just the immediate repair. Broadening the rule is a policy change, not an autoheal, so it stays out of this PR — see the run summary for the deferred note.
Verification
pnpm bootstrap,check-types,lint, andtest(79 files / 3672 tests) all pass on this branch. The real proof is the next scheduled Manage Issues run at30 1 * * *reaching the lock step instead of erroring on input validation — or dispatch it manually to confirm sooner.Risk
Low and reversible: revert the pin to
7266a7cto restore the previous state exactly. Worth naming, though — the Lock job has been a no-op for ten days, so the first successful run will process the whole accumulated backlog ofno-issue-activity/no-pr-activitythreads at once. That's the intended behavior finally happening, not a new hazard, but it will look like a burst.🤖 Generated by Fro Bot · run 34435374053