You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
metrics_coverage denominator counts retro bookkeeping issues, so a blackout-report-only window can never reach 1/1 #175
metrics_coverage denominator counts retro bookkeeping issues, so a blackout-report-only window can never reach 1/1
Observed class
The retro digest's metrics_coverage line is computed as usable metrics rows / closed issues in the window. The closed-issue set is not filtered by whether the issue represents agent delivery work. Retro bookkeeping issues — the blackout report the retro itself creates when coverage is 0/N — are closed issues too, and by construction no collector row can ever exist for them (no agent work ran; the collector only emits rows for dispatched agent runs).
Consequence: on a consumer whose only recent closed issues are blackout reports (exactly the state a prolonged blackout produces), the coverage line is structurally pinned at 0/1 even after the collector is fixed and wired. The first post-fix window still reads 0/1, because the denominator still contains the stale blackout report. The signal meant to prove recovery cannot show recovery.
Evidence from this window
Window 2026-10-25T23:38:20Z → 2026-10-28T02:24:42Z on a consumer repo: metrics rows 0, closed issues 1, and that one issue is the blackout report itself ("Second consecutive metrics blackout: retro blind, collector never produced a row"). metrics_coverage: 0/1.
Even a perfectly wired collector could not have produced a row for that issue: nothing was dispatched for it. The 0/1 therefore mixes two different facts — "the collector produced no rows" (true, collector defect) and "one closed issue has no row" (unavoidable, bookkeeping issue) — into a single ratio.
Proposed implementation plan
In the digest builder, classify each closed issue in the window as delivery vs bookkeeping (bookkeeping = issues created by the loop's own machinery: retro blackout reports, retro reports, escalation placeholders). The label already distinguishes boucle:retro / boucle:report from work issues, so the classification can key off labels rather than new state.
Compute metrics_coverage over the delivery subset only: usable metrics rows / delivery issues in window. Report bookkeeping issues separately (e.g. bookkeeping: 1 (excluded from coverage)).
Keep the blackout WARNING trigger as-is (any closed delivery issue with no row), but suppress the warning when the delivery count is 0 and only bookkeeping issues closed — that state means "the loop is quiet", not "the collector is blind".
Acceptance criteria:
A window whose only closed issue is a blackout report shows metrics_coverage: 0/0 (or n/a) with the bookkeeping annotation, not 0/1.
A window with 2 delivery issues and 1 usable row shows 1/2, unchanged from today.
The blackout WARNING fires only when a delivery issue lacks a row.
Existing digest consumers (retro prompt, CI checks) parse the new shape without error.
Enrichment from the 2026-10-26 → 2026-10-28 retro window — a live instance of the denominator problem.
New evidence
The window's only closed issue is the previous retro report (boucle:retro label). metrics_coverage is therefore unavailable: usable rows 0, closed issues 1 — and per the current denominator a window of this shape can never reach 1/1.
The previous window was also a blackout (its report title records the second consecutive one), and that report is the only closed issue in this window: the retro cadence on an unwired collector produces bookkeeping-only windows back to back.
Net effect: coverage reads as permanently broken for such a consumer even if delivery is fine — and a real delivery window cannot be distinguished from a bookkeeping one by the ratio alone.
Suggested refinement
Exclude retro bookkeeping issues (boucle:retro / boucle:report) from the closed-issue denominator, or report two denominators side by side (all closed / delivery closed).
Keep the current blackout behavior: when usable rows are 0, coverage renders as "unavailable", never as a ratio — this window's digest already does that correctly; the denominator rule should match it.
Anonymisation
Evidence from a pre-scrubbed consumer digest; no consumer identifiers quoted.
Live evidence from a consumer retro window (anonymised): a blackout-report-only window again — the only closed issue in the window was the previous retro report itself; metrics rows in window: 0, rows on branch: 0, last metrics row: never, metrics_coverage 0/1. Third consecutive blackout window.
This compounds the denominator problem this issue describes: even once the collector is wired, quiet windows whose only closed issues are retro bookkeeping will still never reach 1/1. Two independent fixes are needed: (1) this issue's denominator fix (exclude retro bookkeeping issues from the denominator, or count them separately), and (2) a liveness signal so the blackout itself is detected and escalated (proposed separately: heartbeat row + doctor wiring check + machine-readable retro blackout marker).
Activity
baderdean commentedon Oct 28, 2026
Enrichment from the 2026-10-26 → 2026-10-28 retro window — a live instance of the denominator problem.
New evidence
Suggested refinement
Anonymisation
Evidence from a pre-scrubbed consumer digest; no consumer identifiers quoted.
baderdean commentedon Oct 30, 2026
Live evidence from a consumer retro window (anonymised): a blackout-report-only window again — the only closed issue in the window was the previous retro report itself; metrics rows in window: 0, rows on branch: 0, last metrics row: never, metrics_coverage 0/1. Third consecutive blackout window.
This compounds the denominator problem this issue describes: even once the collector is wired, quiet windows whose only closed issues are retro bookkeeping will still never reach 1/1. Two independent fixes are needed: (1) this issue's denominator fix (exclude retro bookkeeping issues from the denominator, or count them separately), and (2) a liveness signal so the blackout itself is detected and escalated (proposed separately: heartbeat row + doctor wiring check + machine-readable retro blackout marker).