Problem
ApiTracker.hasDifferences(report) gates only on the differentApi count. When every upstream fetch fails (404, HTTP error, network error), each class is reported with status UPSTREAM_ERROR, which increments missingUpstream — a counter that gates nothing. The daily workflow then sees has_differences=false and reports all-clear.
This is exactly the failure mode that blinded the tracker from 2026-02-05 to 2026-04-11 after upstream moved to the jdk.incubator.json module: every scheduled run was green while the detector was 100% blind (see issue #145 history).
Why
A drift detector whose total-failure mode reports "no drift" is worse than no detector: it manufactures false confidence. Upstream unreachability or path rot must surface as an issue, not vanish.
What
Treat UPSTREAM_ERROR as drift:
hasDifferences returns true when differentApi > 0 OR missingUpstream > 0
- the fingerprint includes
UPSTREAM_ERROR classes (stable, distinct per class set) so issue dedup works for fetch-failure drift
- the summary markdown renders a "Missing Upstream" section listing the affected classes and errors, so the auto-created issue is actionable
Problem
ApiTracker.hasDifferences(report)gates only on thedifferentApicount. When every upstream fetch fails (404, HTTP error, network error), each class is reported with statusUPSTREAM_ERROR, which incrementsmissingUpstream— a counter that gates nothing. The daily workflow then seeshas_differences=falseand reports all-clear.This is exactly the failure mode that blinded the tracker from 2026-02-05 to 2026-04-11 after upstream moved to the
jdk.incubator.jsonmodule: every scheduled run was green while the detector was 100% blind (see issue #145 history).Why
A drift detector whose total-failure mode reports "no drift" is worse than no detector: it manufactures false confidence. Upstream unreachability or path rot must surface as an issue, not vanish.
What
Treat
UPSTREAM_ERRORas drift:hasDifferencesreturns true whendifferentApi > 0ORmissingUpstream > 0UPSTREAM_ERRORclasses (stable, distinct per class set) so issue dedup works for fetch-failure drift