fix(renovate): the dashboard exporter did not know "PR Closed (Blocked)" #438

Sammanfogat
supernaut sammanfogade 1 incheckning från fix/renovate-dashboard-pr-closed-section in i main 2026-08-18 14:40:36 +00:00
Ägare

The ageing guard from #437 found its own blind spot on its first production run, which is the
unknown-section counter earning its keep on day one.

What happened

I ran the exporter by hand on bitborg-prod to verify the apply rather than waiting for the nightly:

renovate-dashboard: 30 held across 8 repo(s), oldest 0.0d, unknown sections 1, status 0

unknown sections 1. bitborg-web's dashboard carries a heading nothing in SECTIONS matched, so
RenovateDashboardGuardDegraded would have raised within two hours — correctly.

The heading is PR Closed (Blocked), which Renovate renders as:

The following updates are blocked by an existing closed PR. To recreate the PR, click on a checkbox
below.

with a recreate-branch action, holding a TypeScript v7 and a pako v3 major.

Why it is mapped as NOT held

A human closed those PRs to reject the updates, and Renovate never recreates them unaided. The entry
is terminal, not waiting. Ageing it would raise RenovateUpdateHeldTooLong for ever about a decision
someone already made deliberately — noise that would train the alert to be ignored, which is worse
than not having it.

Only the observed heading is added

Deliberately not guessing at other section names. Mapping a genuinely waiting section as terminal
would create a silent blind spot, whereas an unmapped section stays loud. That asymmetry is the
entire point of the counter, so the rest is left to it: if another heading appears, it announces
itself the same way this one did, in two hours rather than never.

Verified — both failure directions, neither silent

  • 23/23 logic tests, up 2 from #437. The fixture now carries the section exactly as bitborg-web
    renders it, including both real entries.
  • Removing the mapping fails the two unknown-section checks (got=1 expected=0, got=2 expected=1).
  • Mis-mapping it as holding — the dangerous mistake, since it produces a permanent false alarm —
    fails the three "not held" checks.
  • ruff 0.16.1, ansible-lint (production profile), --syntax-check, check-metric-names.py clean.

Apply

Prod only, --tags renovate: one changed task, re-copying the exporter. Nothing restarts. #437's
apply is already in production and reconciled clean on both hosts (3/3 and 2/2), with a second
--check returning changed=0, so this is the only outstanding delta.

Refs #430

The ageing guard from #437 found its own blind spot on its first production run, which is the unknown-section counter earning its keep on day one. ## What happened I ran the exporter by hand on `bitborg-prod` to verify the apply rather than waiting for the nightly: ``` renovate-dashboard: 30 held across 8 repo(s), oldest 0.0d, unknown sections 1, status 0 ``` `unknown sections 1`. `bitborg-web`'s dashboard carries a heading nothing in `SECTIONS` matched, so `RenovateDashboardGuardDegraded` would have raised within two hours — correctly. The heading is **`PR Closed (Blocked)`**, which Renovate renders as: > The following updates are blocked by an existing closed PR. To recreate the PR, click on a checkbox > below. with a `recreate-branch` action, holding a TypeScript v7 and a pako v3 major. ## Why it is mapped as NOT held A human closed those PRs to reject the updates, and Renovate never recreates them unaided. The entry is terminal, not waiting. Ageing it would raise `RenovateUpdateHeldTooLong` for ever about a decision someone already made deliberately — noise that would train the alert to be ignored, which is worse than not having it. ## Only the observed heading is added Deliberately not guessing at other section names. Mapping a genuinely *waiting* section as terminal would create a **silent** blind spot, whereas an unmapped section stays loud. That asymmetry is the entire point of the counter, so the rest is left to it: if another heading appears, it announces itself the same way this one did, in two hours rather than never. ## Verified — both failure directions, neither silent - **23/23** logic tests, up 2 from #437. The fixture now carries the section exactly as `bitborg-web` renders it, including both real entries. - Removing the mapping fails the two unknown-section checks (`got=1 expected=0`, `got=2 expected=1`). - Mis-mapping it as **holding** — the dangerous mistake, since it produces a permanent false alarm — fails the three "not held" checks. - `ruff` 0.16.1, `ansible-lint` (production profile), `--syntax-check`, `check-metric-names.py` clean. ## Apply Prod only, `--tags renovate`: one changed task, re-copying the exporter. Nothing restarts. #437's apply is already in production and reconciled clean on both hosts (3/3 and 2/2), with a second `--check` returning `changed=0`, so this is the only outstanding delta. Refs #430
supernaut lade till 1 incheckning 2026-08-18 13:32:50 +00:00
fix(renovate): the dashboard exporter did not know "PR Closed (Blocked)"
Alla kontroller lyckades
ci / ci (pull_request) Successful in 1m41s
82421e87f6
Found by the exporter's own unknown-section counter on its first production run, which is that
counter earning its keep. bitborg-web's dashboard carries a heading nothing in SECTIONS matched, so
the exporter reported `bitborg_renovate_dashboard_unknown_sections 1` and would have raised
RenovateDashboardGuardDegraded within two hours.

Renovate renders the section as "The following updates are blocked by an existing closed PR. To
recreate the PR, click on a checkbox below", with a `recreate-branch` action. A human closed that PR
to reject the update and Renovate never recreates it unaided, so the entry is terminal, not waiting.
Mapped as NOT held: ageing it would alert for ever about a decision someone already made
deliberately — there, a TypeScript v7 and a pako v3 major.

Only the observed heading is added. Guessing at other section names would risk mapping a genuinely
waiting section as terminal, which is a SILENT blind spot; an unmapped section stays loud instead.
That asymmetry is the whole point of the counter, so it is left to do its job.

Verified, both failure directions:

- 23/23 logic tests, up 2. Removing the mapping fails the two unknown-section checks; mis-mapping it
  as HOLDING fails the three "not held" checks. Neither mistake is silent.
- ruff, ansible-lint (production profile), --syntax-check, check-metric-names.py clean.

Refs #430
supernaut sammanfogade incheckning b7dce947ca till main 2026-08-18 14:40:36 +00:00
supernaut tog bort grenen fix/renovate-dashboard-pr-closed-section 2026-08-18 14:40:36 +00:00
Logga in för att delta i denna konversation.
Inga granskare
Ingen milstolpe
Inget projekt
Inga tilldelade
1 deltagare
Notiser
Förfallodatum
Förfallodatumet är ogiltigt eller utanför gränserna. Använd formatet "åååå-mm-dd".

Inget förfallodatum satt.

Beroenden

Inga beroenden satta

Referens
bitborg/bitborg-infra!438
Ingen beskrivning angiven.