Maintainer Radar uses deterministic rules. The score is not truth. It is a routing hint for maintainer attention.
Every analyzed PR includes a score_breakdown list. Each item names the
heuristic, shows its risk_delta, and marks it as a signal or flag. Positive
values raise risk. Negative values lower risk. The final risk score is clamped to
the 0 to 100 range, then reviewability is calculated as 100 - risk.
Each analyzed PR also includes next_step, a deterministic sentence that turns
the selected action and strongest flags into a concrete maintainer move.
Example:
[
{ "label": "CI passed", "risk_delta": -8, "kind": "signal" },
{ "label": "code changed without tests", "risk_delta": 10, "kind": "flag" }
]
docs-only shape requires a complete file list with every file classified as
documentation. A README alongside a lockfile, test, or unclassified file does
not receive the docs-only score adjustment or shorter review estimate.
When the supplied file list contains fewer entries than the reported changed
file count, Radar shows incomplete file list. It still uses visible evidence,
such as a test file that was returned, but does not infer that tests are absent.
The incomplete-list warning itself does not add risk points.
Blocker detection intentionally looks for plain maintainer feedback patterns:
This is not sentiment analysis. The goal is to catch comments that usually mean “do not spend full review time until the author follows up.”
Label detection looks for labels that usually mean the PR is not ready for review:
These labels route the PR to author follow-up even when CI is green.
Hydrated GitHub scans also read merge readiness fields such as mergeable,
mergeStateStatus, and requested reviewers.
The test suite includes tests/fixtures/blocker-prs.json to keep blocker
detection concrete. Add new fixture cases when a real maintainer pattern should
be detected.