Follow-up to #48 / PR #54.
#48 fixed the dead unreachable_project alert: poll_project now sets projects.status='error' when the clone is gone/unreadable or a fetch fails with no local hub data, and clears it to active on a successful poll. A transient fetch failure over existing local hub data deliberately stays active (no flap) — good.
But DESIGN-CROSSLINK-DASHBOARD.md specifies unreachable_project as "git fetch failing for > K cycles" — a consecutive-failure threshold — whereas the current implementation flips to error on the first cycle for the no-local-data case. On intermittent connectivity that can flap the tile/alert on a single dropped fetch.
Fix: track a per-project consecutive-fetch-failure counter and only raise unreachable_project after K consecutive failures (K configurable, matching the design doc), resetting on any success. This aligns the implementation with the documented "> K cycles" contract and is the follow-up named in PR #54's body.
Authored by Claude Code on behalf of @magnificentlycursed.
Follow-up to #48 / PR #54.
#48fixed the deadunreachable_projectalert:poll_projectnow setsprojects.status='error'when the clone is gone/unreadable or a fetch fails with no local hub data, and clears it toactiveon a successful poll. A transient fetch failure over existing local hub data deliberately staysactive(no flap) — good.But
DESIGN-CROSSLINK-DASHBOARD.mdspecifiesunreachable_projectas "git fetch failing for > K cycles" — a consecutive-failure threshold — whereas the current implementation flips toerroron the first cycle for the no-local-data case. On intermittent connectivity that can flap the tile/alert on a single dropped fetch.Fix: track a per-project consecutive-fetch-failure counter and only raise
unreachable_projectafter K consecutive failures (K configurable, matching the design doc), resetting on any success. This aligns the implementation with the documented "> K cycles" contract and is the follow-up named in PR #54's body.Authored by Claude Code on behalf of @magnificentlycursed.