feat(tools): backlog-lint — gating consistency checks for the issue backlog - #1997
Open
jcschaff wants to merge 1 commit into
Open
feat(tools): backlog-lint — gating consistency checks for the issue backlog#1997jcschaff wants to merge 1 commit into
jcschaff wants to merge 1 commit into
Conversation
…ue backlog Nine mechanical checks over the open backlog and project board #1. Facts only - each rule is decidable from metadata alone. Judgment stays with people; the reasoning behind the current backlog lives in docs/backlog/ (PR #1996). Gates rather than reports. Findings are compared against a committed baseline of accepted violations and the run fails only on findings NOT in it, so accepting a new one is a deliberate reviewable act. This follows the BMDB nightly, which was changed to fail on changed results after the report version went unread. Checks: not-on-board, priority-formula, scored-not-ranked, half-scored, done-but-open, stale-active, shipped-release-label, many-assignees, queued-thin-body. Verified against live data before committing: - reproduces the hand counts exactly (55 unboarded, 53 half-scored, 4 done-but-open, 15 stale-active, 45 shipped-release labels, 33 many-assignees, 28 thin Queued bodies) - 233 findings, now the baseline - priority-formula and scored-not-ranked report 0, independently confirming the five board score corrections landed - negative control: un-accepting two baseline entries makes it exit 1 and name exactly those two, then restoring makes it exit 0 - failure paths exit non-zero rather than passing silently - bad token 1, missing token 2, and the workflow fails explicitly when GH_PROJECT_TOKEN is absent Requires the repo secret GH_PROJECT_TOKEN (PAT with read:project); GITHUB_TOKEN cannot read organization ProjectV2 boards. Runs Mondays, on workflow_dispatch with strict/fix_board toggles, and on PRs touching this directory. The one write it can do is adding unboarded issues to the board, opt-in behind --fix-board. It deliberately does not detect duplicates (tested: TF-IDF found 5 of 12 hand-identified pairs and its top hit was a deliberate split), close anything, write issue bodies, or assign Importance. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018kr8SbzXtwW3gMVUgMfDDt
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Nine mechanical consistency checks over the open backlog and
project board #1, wired to a weekly Action.
Follow-on from #1996 (the backlog triage docs), but independent of it — this branches from
masterand does not depend on that PR merging.What it checks
Facts only. Every rule is decidable from metadata alone; nothing here decides whether an issue
matters.
not-on-boardpriority-formulaPriority ≠ Importance + Simplicityscored-not-rankedImportanceset,Prioritynever computedhalf-scoredSimplicityset,Importancenotdone-but-openDone, issue still openstale-activeActiveand untouched 30+ daysshipped-release-labelmany-assigneesqueued-thin-bodyQueuedwith a body under 200 charsIt gates, it does not report
A scheduled job that posts a report gets ignored — this repo already learned that with the BMDB
nightly, which was changed to fail on changed results after the report version went unread.
So findings are compared against a committed baseline (
tools/backlog-lint/baseline.json) and therun fails only on findings not in it. Accepting a new violation means regenerating the
baseline, reading the diff, and committing it — a deliberate act, not a silent drift.
The baseline shrinking is grooming getting done. The baseline growing is someone deciding to
accept something.
Verified before committing, not assumed
stale-active, 45 shipped-release labels, 33 many-assignees, 28 thin
Queuedbodies. 233findings total, which is now the baseline.
priority-formulaandscored-not-rankedreport 0, independently confirming the five boardscore corrections landed.
two; restoring makes it exit 0 again.
and the workflow fails with an explicit message when the secret is absent.
Before this can run: one secret
GH_PROJECT_TOKEN— a PAT withread:projectscope.GITHUB_TOKENcannot readorganization ProjectV2 boards, so there is no way around this. Until the secret exists the
workflow fails loudly on purpose, rather than reporting a false pass.
Add
projectscope too only if you want to use thefix_boardtoggle.Scheduling
Mondays 08:00 UTC, plus
workflow_dispatch(withstrictandfix_boardtoggles), plus PRstouching
tools/backlog-lint/**so the tool is exercised by its own changes.What it deliberately does not do
TF-IDF similarity over title+body found only 5 of 12 hand-identified duplicate pairs, missed
the two that matter most (
#1008/#1199ranked 579th,#1604/#1606ranked 9377th),and its highest-scoring hit was a deliberate split (
#1046/#1069). Lexical similarity findssibling issues in a subsystem, which is a different thing.
produces confident prose that is really invention. A blank body is honestly blank.
Importance. That is a judgment about users and belongs to people.The single write it can perform is adding unboarded issues to the board, opt-in behind
--fix-board/ thefix_boardinput, off by default.A note on the scoring model
tools/backlog-lint/README.mddocumentsPriority = Importance + Simplicity, which existednowhere but in the board data (exact on 56 of 57 ranked issues). Worth considering making
Prioritya computed column — hand-entry is what let#1495drift out of sync.🤖 Generated with Claude Code
https://claude.ai/code/session_018kr8SbzXtwW3gMVUgMfDDt