fix(advisory): rank a withdrawn finding below every finding nobody withdrew - #6098
Conversation
…thdrew The 2026-09-05 digest on hivecommons#2364 rendered 10 findings out of 292, and one of its five CRITICAL slots was held by a finding the reporting agent had already withdrawn in the finding's own detail: [regression-risk] heartbeatBearerOK per-hive binding removed without covering test > REVISED: ... not removed ... The change is refactoring, not a security > regression. Downgrading priority. "Downgrading priority" never reached the bead. The agent edited the notes; beadPriorityToSeverity reads b.Priority; so the finding went on rendering at critical and winning a slot every cycle. The maintainer working the tracker wrote it up as "refuted by its own detail line and should be closed rather than fixed -- its bead is still open at critical, which is why it keeps consuming a slot". hivecommons#5945 had already taught applyTopN to demote on the three nobody-re-checked-this signals. A retraction is a different kind of thing: the one party who ever looked went back, looked again, and said it does not stand. That was the only such signal the ranking ignored. THE ONE DEMOTION THAT CROSSES SEVERITY BANDS. hivecommons#5945's signals stay inside their band on purpose -- unverified means nobody re-checked, so an unverified critical may still be the worst thing in the report. A retraction inverts that: the filed severity is the one claim its author no longer makes. It still backfills an unclaimed slot rather than being dropped, because the bead is open and only a maintainer closes it, and it arrives carrying a caption saying the bead wants closing rather than fixing. TWO SIGNALS ARE REQUIRED, and the asymmetry is the safety argument. "REVISED:" alone is not a withdrawal -- an agent raising a finding to critical writes the same lead-in, and demoting THAT below every other finding would bury the most urgent item in the report under a caption telling the reader to disregard it. So a finding is retracted only when its detail opens with a revision marker AND says somewhere that it no longer stands. Missing a real retraction costs nothing beyond today's behaviour; inventing one costs a live critical its slot. Mutation testing found a collision worth recording: "revision" was in the marker vocabulary at first, and it is also this package's PROVENANCE idiom -- provenanceRefPattern matches "revision <sha>", and provenance_test.go builds a fixture exactly that way. Under a one-signal rule that fixture's hivecommons#5130 stale-provenance caption became a withdrawal caption. "revision" is now out of the marker list, "revised" is not, and both the collision and the reason are pinned by a test. Closes hivecommons#2364 is deliberately NOT claimed: hivecommons#2364 is a standing living document ("Do not close this issue"), and a maintainer has already removed `help wanted` from it for that reason. This fixes the defect its current digest exhibits. Refs hivecommons#2364 Signed-off-by: Douglas Baggett <doug.baggett@gmail.com>
Scanner review — no findingsTraced Advisory review by scanner agent (ACMM L5 — hold-gated mode). Not a merge gate.🐝 Hive Agent: — hive: agent=scanner backend=copilot model=claude-fable-5 |
|
/approve |
|
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: Danathar The full list of commands accepted by this bot can be found here. The pull request process is described here DetailsNeeds approval from an approver in each of these files:
Approvers can indicate their approval by writing |
…thdrew (#6098) The 2026-09-05 digest on #2364 rendered 10 findings out of 292, and one of its five CRITICAL slots was held by a finding the reporting agent had already withdrawn in the finding's own detail: [regression-risk] heartbeatBearerOK per-hive binding removed without covering test > REVISED: ... not removed ... The change is refactoring, not a security > regression. Downgrading priority. "Downgrading priority" never reached the bead. The agent edited the notes; beadPriorityToSeverity reads b.Priority; so the finding went on rendering at critical and winning a slot every cycle. The maintainer working the tracker wrote it up as "refuted by its own detail line and should be closed rather than fixed -- its bead is still open at critical, which is why it keeps consuming a slot". #5945 had already taught applyTopN to demote on the three nobody-re-checked-this signals. A retraction is a different kind of thing: the one party who ever looked went back, looked again, and said it does not stand. That was the only such signal the ranking ignored. THE ONE DEMOTION THAT CROSSES SEVERITY BANDS. #5945's signals stay inside their band on purpose -- unverified means nobody re-checked, so an unverified critical may still be the worst thing in the report. A retraction inverts that: the filed severity is the one claim its author no longer makes. It still backfills an unclaimed slot rather than being dropped, because the bead is open and only a maintainer closes it, and it arrives carrying a caption saying the bead wants closing rather than fixing. TWO SIGNALS ARE REQUIRED, and the asymmetry is the safety argument. "REVISED:" alone is not a withdrawal -- an agent raising a finding to critical writes the same lead-in, and demoting THAT below every other finding would bury the most urgent item in the report under a caption telling the reader to disregard it. So a finding is retracted only when its detail opens with a revision marker AND says somewhere that it no longer stands. Missing a real retraction costs nothing beyond today's behaviour; inventing one costs a live critical its slot. Mutation testing found a collision worth recording: "revision" was in the marker vocabulary at first, and it is also this package's PROVENANCE idiom -- provenanceRefPattern matches "revision <sha>", and provenance_test.go builds a fixture exactly that way. Under a one-signal rule that fixture's #5130 stale-provenance caption became a withdrawal caption. "revision" is now out of the marker list, "revised" is not, and both the collision and the reason are pinned by a test. Closes #2364 is deliberately NOT claimed: #2364 is a standing living document ("Do not close this issue"), and a maintainer has already removed `help wanted` from it for that reason. This fixes the defect its current digest exhibits. Refs #2364 Signed-off-by: Douglas Baggett <doug.baggett@gmail.com> Signed-off-by: sec-check <sec-check@hive.kubestellar.io>
Summary
The current digest on #2364 — updated 2026-09-05 13:32 UTC — renders 10 findings
out of 292, and one of its five CRITICAL slots is held by a finding the
reporting agent has already withdrawn in the finding's own detail:
"Downgrading priority" never reached the bead. The agent edited the notes;
beadPriorityToSeverityreadsb.Priority; so the finding goes on rendering atcritical and winning a slot every cycle. The maintainer working this tracker
wrote it up in their 2026-09-04 comment
as "refuted by its own detail line and should be closed rather than fixed — its
bead is still open at critical, which is why it keeps consuming a slot".
#5945 already taught
applyTopNto demote on the threenobody-re-checked-this signals. A retraction is a different kind of thing: the
one party who ever looked went back, looked again, and said it does not stand.
That was the only such signal the ranking ignored.
The one demotion that crosses severity bands
#5945's signals stay inside their band deliberately — unverified means nobody
re-checked, so an unverified critical may still be the worst thing in the report.
A retraction inverts that: the filed severity is the one claim its author no
longer makes.
It is demoted, not dropped. The bead is still open and only a maintainer
closes it, so a withdrawn finding still backfills any slot no live finding
claims, and arrives carrying a caption saying the bead wants closing rather
than fixing.
Two signals are required, and that is the safety argument
REVISED:alone is not a withdrawal — an agent raising a finding to criticalwrites the same lead-in, and demoting that below every other finding would bury
the most urgent item in the report under a caption telling the reader to
disregard it. So a finding is retracted only when its detail opens with a
revision marker and says somewhere that it no longer stands.
The asymmetry is on purpose: missing a real retraction costs nothing beyond
today's behaviour; inventing one costs a live critical its slot.
What mutation testing found
revisionwas in the marker vocabulary at first. It is also this package'sprovenance idiom —
provenanceRefPatternmatchesrevision <sha>, andprovenance_test.gobuilds a fixture exactly that way. Under a one-signal rulethat fixture's #5130 stale-provenance caption silently became a withdrawal
caption.
revisionis now out of the marker list (revisedis not), and both thecollision and the reason it exists are pinned by a test, because the next person
adding a marker word has no way to know the two vocabularies overlap.
Relationship to #6093
I have #6093 open on the same
package. They are complementary, not overlapping:
The
heartbeatBearerOKfinding names no issue, so #6093 cannot reach it. Iverified the two branches auto-merge cleanly and that
go test ./pkg/advisory/...passes on the merged result, then aborted the probe merge. Neither depends on the
other; they can land in either order.
On closing #2364
Deliberately not claimed. #2364 is a standing living document — its body says
"Do not close this issue", and a maintainer already
removed
help wantedfrom it for precisely that reason. This fixes the defect its current digest
exhibits, so the commit says
Refs #2364, notCloses.What else I checked in that digest, and did not change
Reviewing the other nine shown findings, none is a live unaddressed defect:
PR #3344 removes SSRF guards(CRITICAL) — I verified this againstv4today.
docRedirectHostIsPrivate,noRedirectToPrivateandrequireOwnerRoleare all present. Whatever was true when it was filed, there is no live
security regression here; the finding is stale.
commit".
([quality] test: pin ioscan classifier audit trail, CI-failing kick list, and tokens Diagnostics #6059, [quality] test gateway-health fault propagation (pkg/dashboard/gateway_health.go + pkg/hub/gateway_health.go) #5954, [scanner] fix: claude local mode write roots — //-absolute permission rules and HIVE_AGENT_CWD grant (#6082, #6087) #6094, v5 GA bar #6016).
I am reporting the #3344 verification rather than acting on it: closing someone
else's security-shaped bead is a maintainer call, and this PR's mechanism does not
cover it.
Validation
go test ./pkg/advisory/...go build ./...go vet ./pkg/advisory/...gofmt -lon the changed files#6093+go test-shape both matchCI itself has not run on this PR: every workflow sits at
action_required,this repo's gating for a fork contributor.
DCOandPR Verifierare the onlyones that run.
The tests were verified to discriminate — each rule removed, suite re-run:
TestFormatDigestMarkdownCaptionsStaleProvenanceThat second row is the one worth reading: a pre-existing test catching the loose
rule is what surfaced the
revision/provenance collision above.Skipped, stated rather than implied
ranking and rendering level; nothing was run against the live 🐝 Hive Advisory Report #2364 comment.
a retraction phrased outside its vocabulary — that case keeps today's behaviour,
which is the direction it is built to fail in.
pkg/advisorywas run, plus a whole-modulego build. Five packages failin my sandbox on a clean
v4tree for environmental reasons, confirmed on anearlier task in this repo.
External state
None. No issues, comments, or workflow runs were created or mutated.
Refs #2364
— hive: backend=claude model=claude-opus-5