docs: triage role vocabulary, agent-brief format, and a settled-questions KB - #156
Merged
juemerson-at-purestorage merged 1 commit intoSep 23, 2026
Conversation
The issue labels became a machine interface when the status/priority/size/ area/source taxonomy landed: a queue reads them to decide what is workable, and automated filing will read them to avoid duplicating itself. Nothing wrote down what they mean, which transitions are legal, or the one-label-per-axis invariant that several of those consumers assume. Three documents, no source changes. docs/TRIAGE-ROLES.md pins the vocabulary. Two rules in it exist because a machine reads the labels rather than a person: status:triage is the honest default and must never be scored as ready work, and status:agent-ready means an agent brief is attached rather than that the issue looked tractable. Deliberately no wontfix state -- a GitHub closing reason is finer-grained, and "not planned" misrepresents an issue describing a fix we want but cannot yet make. docs/AGENT-BRIEF.md is the brief format, with a worked example taken from issue dmann000#136 rather than an invented one. It adds two sections a generic brief has no reason to carry: a Verification line, and acceptance criteria that name the two gates invisible from a clean local run -- the four derived artifact pairs that move on a parameter-block change, and the force-import ratio check on a new test file. docs/settled/ records questions closed against, so the reasoning outlives the closed issue and automated filing has something to deduplicate against. Seeded with three: a false finding, a rejected approach, and a rejected design. Every entry carries a Premise and a "what would reopen this" line, because a rejection that outlives its reasoning becomes the thing that blocks correct work, with the authority of a written decision behind it. An already-implemented feature must never be recorded here; that would poison the deduplication with a false negative. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.
What this adds
Three documents under
docs/. No source changes.The issue labels became a machine interface when the
status:/priority:/size:/area:/source:taxonomy went on. A queue reads them to decide what is workable, andautomated issue-filing will read them to avoid duplicating itself. Nothing wrote down what
they mean, which transitions are legal, or the one-label-per-axis invariant that several of
those consumers already assume.
docs/TRIAGE-ROLES.mdThe vocabulary, the state machine, the axes, and a snippet that asserts the invariant.
Two rules in it exist specifically because a machine reads the labels rather than a person:
status:triageis not a scoring input. It means "nobody has assessed this". Twenty ofthe forty-three open issues sit there; a scorer treating them as workable would be wrong
about half the backlog.
status:agent-readymeans a brief is attached, not that the issue looked small. Thelabel points at a contract.
Deliberately no
wontfixstate — a GitHub closing reason is finer-grained, andnot plannedmisrepresents an issue describing a fix we want but cannot yet make (those stayopen with
status:blockedand the blocker named).docs/AGENT-BRIEF.mdThe brief format, with a worked example taken from #136 rather than an invented one.
Two sections beyond the usual template, both earned by gates that are invisible from a clean
local run:
Verification:line — live-verified, not verified, or cannot-reach-the-wire;parameter-block change (not two), and the force-import
BeforeAlla new test file needs.docs/settled/Questions closed against, so the reasoning outlives the closed issue.
docs/design/holdsquestions we answered; this holds questions we settled against. It is also what automated
filing needs in order to deduplicate: matching against open issues is not enough, because the
finding declined last month is the one a scanner rediscovers next month.
Seeded with three — a false finding (#89), a rejected design (typed object model), and a
rejected approach (splitting #65 by family).
Every entry carries a
Premiseand aWhat would reopen thisline. That is the partworth arguing about: a rejection that outlives its reasoning becomes the thing that blocks
correct work, with the authority of a written decision behind it. If a
Premisecannot bewritten, the thing is a deferral and does not belong in the directory.
One rule stated explicitly in the README: an already-implemented feature must never be
recorded there. It would poison the deduplication with a false negative — a scanner would see
a match and stay silent about a real gap.
Live-testing
Exempt. Verdict produced mechanically by
Test-PfbWireExemption.ps1, not by reading thediff:
Notes for review
docs/settled/is a process imposition, not a code change. If you would rather notcarry a directory for it, the same content collapses into a single
docs/settled.md— sayso and I will squash it. Your repo, your call.
describes the current state rather than proposing a migration.
CHANGELOG.md.🤖 Generated with Claude Code