Repository navigation
Conversation
Every finding carries confidence (HIGH/MEDIUM/LOW) and
confidence_justification, both written by the same generative model that
wrote the finding. A self-report of certainty is not calibrated, and the
examiner is shown it as though it were.
Add `vhir review --findings --lint`, which raises seven flags over the
surface features of a finding: HIGH confidence with no audit_ids, HIGH
confidence with no justification, an interpretation asserting purpose
("in order to", "to evade") with nothing cited, an attribution claim
("ransomware group", "APT"), an interpretation more than 2.5x its
observation with nothing cited, HIGH confidence alongside hedging
("likely", "consistent with"), and a missing observation.
This is a lint, not a calibration, and the naming says so. It does not
judge whether the evidence supports the claim — that needs reading the
cited artifacts and understanding them. A flag is a prompt to look, and
an unflagged finding has not been verified. Both caveats are printed with
the output.
The finding's own confidence is shown beside the flags and never
overwritten: replacing one uncalibrated number with another would lose
the disagreement, which is the informative part. Nothing here reads or
writes status, and nothing is filtered or blocked.
Of the four design proposals this series implements, this is the one that
does not survive the removal of a semantic judgment intact. It is shipped
under an accurate name rather than the original one.
Term lists are matched on word boundaries, not as substrings: "apt" is a
substring of captured, adapter, attempt and laptop, and substring matching
raised attribution-claim on "credentials were captured".
Adds tests/test_evidence_lint.py (18 tests), covering each check firing
and — more usefully — not firing: intent language with citations, hedging
at MEDIUM confidence, verbosity with citations, and the whole-word
matching of the attribution terms.
446 passing on Python 3.10 and 3.12.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This was referenced Sep 17, 2026
Open
Contributor
|
Thanks. We're deferring new review-queue features to the next minor release. No problems found in review; it's a product decision about the review queue that we'll make then. |
elhoim
marked this pull request as ready for review
October 9, 2026 20:03
This branch has not been deployed
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.
BLUF
confidence(HIGH/MEDIUM/LOW) andconfidence_justification, both written by the same generative model that wrote the finding. A model's self-report of its own certainty is not calibrated, and the examiner is shown it as though it were.vhir review --findings --lintflags findings whose stated confidence outruns their cited evidence. Seven checks, all over surface features of the finding.confidenceis shown beside the flags, unchanged. Nothing reads or writesstatus.Priority: LOW
Measured
Three findings, all stating HIGH confidence:
F-001— same HIGH confidence, but it citesaudit_ids, its justification is filled in, and its interpretation is one unhedged sentence — is not flagged.F-002is the case worth having: "the log was cleared in order to evade detection by the incident response team, consistent with a known ransomware group affiliate playbook", from the observation "Security log cleared.", at HIGH confidence, citing nothing. Every one of those is checkable without understanding the incident.The checks
confidence-without-evidenceaudit_idsemptyunjustified-confidenceconfidence_justificationunsupported-intentin order to,intended to,to evade…) with nothing citedattribution-claimransomware group,APT,nation-state) — always flagged, cited or notinterpretation-exceeds-observationhedged-but-highlikely,appears to,consistent with)no-observationattribution-claimfires regardless of citations on purpose: attribution is a claim a single host's artifacts essentially never support, so it deserves a human look every time.Where this degrades
The original proposal asked a model to score
evidence_supports_interpretation— judging the interpretation against its own observation and citedaudit_ids, with levels from "the observation alone establishes this" to "the interpretation asserts intent the observation cannot show".That is not what this does, and I do not want the name to imply otherwise. Deterministically:
audit_idactually contains what the interpretation claims — not checkable here. It needs reading the artifact.So: renamed from "calibrated confidence" to evidence-support lint. It is the honest version of the proposal, and it is the smallest of the four in value. It goes in the same box as a linter that flags a bare
except:— it does not know your code is wrong, it knows the shape is worth a second look.Two guards against over-reading it are built into the output: the trailing note says an unflagged finding has not been verified, and
stated confidenceis printed next to every flag so the examiner sees what the model claimed.Optional use in ranking
If #57 (review-queue ranking) lands, a flagged finding is a natural candidate to sort up — the original proposal's point that disagreement between the writer's confidence and an independent check is the useful signal. Not wired here; the two PRs stay independent.
Testing
tests/test_evidence_lint.py, 18 tests: each check firing and, more importantly, each check not firing when it should not (intent language with citations, hedging at MEDIUM, verbosity with citations), a well-supported finding raising nothing, findings never mutated,statusandconfidenceuntouched, deterministic flag order, and whole-word matching of the attribution terms (aptmust not fire on "captured").pytest tests/— 446 passed on Python 3.10 and 3.12 (428 pre-existing, unchanged; 18 new)ruff check ./ruff format --check .— cleanDeliberately not in this PR
confidence. Overwriting a model's self-report with a different automated number would replace one uncalibrated signal with another and lose the disagreement, which is the informative part.CI status
The checks will show
action_required: GitHub gates workflow runs on PRs from first-time fork contributors until a maintainer approves them. Reproduced locally with the same steps asci.yml:pytest tests/— Python 3.10pytest tests/— Python 3.12ruff check .ruff format --check .Branched from
main@954a623.🤖 Generated with Claude Code