Whether a revalidation row belongs in the repair queue: a failed
test run, or a row we could not self-verify at all.
skipped only ever arises for 'outdated' or 'permissive' rows (the
'compatible' branch in revalidateAgainstSdk always resolves to
'pass' without touching the test runner), so any skip means we could
not self-verify a row the compatibility check itself flagged as
needing a re-test. Narrowing to 'outdated' silently dropped
'permissive' extensions (e.g. wildcard engine ranges) that crossed a
major SDK bump with no declared tests to confirm they still work.
This is the single definition of that rule. Both the
RevalidationSummary.needsRepair bucket and the viewer's repair
panel — which decides per row whether to render a Repair button —
call it, so the queue count and the actionable rows cannot disagree.
They previously each carried their own copy of the predicate, and
updating one of them was exactly how they came apart.
Whether a revalidation row belongs in the repair queue: a failed test run, or a row we could not self-verify at all.
skippedonly ever arises for 'outdated' or 'permissive' rows (the 'compatible' branch inrevalidateAgainstSdkalways resolves to 'pass' without touching the test runner), so any skip means we could not self-verify a row the compatibility check itself flagged as needing a re-test. Narrowing to 'outdated' silently dropped 'permissive' extensions (e.g. wildcard engine ranges) that crossed a major SDK bump with no declared tests to confirm they still work.This is the single definition of that rule. Both the
RevalidationSummary.needsRepairbucket and the viewer's repair panel — which decides per row whether to render a Repair button — call it, so the queue count and the actionable rows cannot disagree. They previously each carried their own copy of the predicate, and updating one of them was exactly how they came apart.