tri triage currently sorts open issues into three classes — journal, plan, actionable — and actionable is the default: anything that does not look like a journal entry lands there. That default is the defect.
Three kinds of issue cannot be picked up and finished by a loop, yet all three are counted as available work:
- one waiting on hardware, an upstream release, or a human decision;
- one asking a research question, where "done" is a judgement and not a check;
- one that duplicates or has been superseded by another.
So the reported "~26 actionable" is an upper bound being read as an estimate, and a loop that takes its next item from that list will periodically pick something it cannot finish, and then either stall or misreport.
Required classification
Every entry must be classified as exactly one of, in this order:
actionable a defect or change with a checkable completion condition
research an open question; done is judgement, not a check
tracking journal entry, plan or epic; records or aggregates, never closes
blocked needs something outside the tool: hardware, upstream, a human, a credential
duplicate superseded, obsolete, or the same subject as an earlier issue
The ordering is part of the requirement. blocked must be tested before actionable, so that a blocked defect is never advertised as available. duplicate is tested last, because a duplicate that is also blocked is more usefully reported as blocked.
Autoclose is forbidden
The tool prints and exits. It must not close, label, or otherwise mutate the tracker, and no output of it licenses a bulk action. 80% of this tracker is journal records with no completion condition; a bulk close driven by a title regex would destroy the record while claiming to tidy it. The classification is a composition estimate, never a verdict on an individual issue, and the output must say so in as many words.
Acceptance
- Five classes, matched in the stated order, first match wins.
- Every open issue receives exactly one class and a machine-readable reason for it.
--json output carries counts for all five classes even when a class is empty, so that an empty class is visibly zero rather than silently absent.
- No mutation of any kind.
tri triagecurrently sorts open issues into three classes —journal,plan,actionable— andactionableis the default: anything that does not look like a journal entry lands there. That default is the defect.Three kinds of issue cannot be picked up and finished by a loop, yet all three are counted as available work:
So the reported "~26 actionable" is an upper bound being read as an estimate, and a loop that takes its next item from that list will periodically pick something it cannot finish, and then either stall or misreport.
Required classification
Every entry must be classified as exactly one of, in this order:
The ordering is part of the requirement.
blockedmust be tested beforeactionable, so that a blocked defect is never advertised as available.duplicateis tested last, because a duplicate that is also blocked is more usefully reported as blocked.Autoclose is forbidden
The tool prints and exits. It must not close, label, or otherwise mutate the tracker, and no output of it licenses a bulk action. 80% of this tracker is journal records with no completion condition; a bulk close driven by a title regex would destroy the record while claiming to tidy it. The classification is a composition estimate, never a verdict on an individual issue, and the output must say so in as many words.
Acceptance
--jsonoutput carriescountsfor all five classes even when a class is empty, so that an empty class is visibly zero rather than silently absent.