Skip to content

fix(dashboard): parse managed-repos.yaml as real YAML, not regex - #79

Merged
ry-ops merged 1 commit into
mainfrom
fix/dashboard-repo-parser
Jun 24, 2026
Merged

fix(dashboard): parse managed-repos.yaml as real YAML, not regex#79
ry-ops merged 1 commit into
mainfrom
fix/dashboard-repo-parser

Conversation

@ry-ops

@ry-ops ry-ops commented Jun 24, 2026

Copy link
Copy Markdown
Owner

The bug (fleet-wide observability failure)

ci-dashboard.mjs getManagedRepos() parsed config/managed-repos.yaml with /^\s*-\s+(.+)$/. The file's actual schema is:

repos:
  - owner: ry-ops
    name: DriveIQ
    policies: []

So the regex captured owner: ry-ops off every entry, collapsing all 43 managed repos to a single bogus name. The scan then queried garbage repo names, every request errored, and the dashboard reported 0 open alerts across the entire fleet β†’ fixRate: 1.0.

This is the same class of bug #77 fixed in heartbeat.yml β€” but ci-dashboard.mjs was never updated. It silently made the public dashboard (and the new status.json) report a falsely-clean fleet, masking real CVE backlog on every repo.

Surfaced by

The status.json emitter (PR #78) reported totalOpenAlerts: 0 / fixRate: 1.0 while simultaneously listing 4 repos in escalation.hardStop (incl. DriveIQ, which has 71 open Dependabot alerts). The escalation list comes from persisted state and is real; the scan was blind.

Fix

Parse with the yaml package (already a direct dep, ^2.3.0) and map owner/name pairs. Tolerates a legacy flat - owner/name list for safety.

Verified: now yields 43 unique repos including ry-ops/DriveIQ (was 1 malformed entry).

πŸ€– Generated with Claude Code

getManagedRepos() used `/^\s*-\s+(.+)$/` which, against the actual
`repos: [{owner, name, policies}]` schema, captured `owner: ry-ops` off
every entry β€” collapsing all 43 managed repos to one bogus name. The
dashboard scan then queried garbage repo names, every request errored,
and it reported 0 open alerts across the whole fleet (fixRate 1.0). The
new status.json inherited the same false "fleet is clean" picture while
simultaneously listing hard-stopped repos β€” the contradiction that
surfaced this bug.

Parse with the `yaml` package (already a dep) and map owner/name pairs,
mirroring the #77 fix to heartbeat.yml. Tolerates a legacy flat
`- owner/name` list too. Verified: now yields 43 unique repos incl.
ry-ops/DriveIQ instead of 1 malformed entry.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@ry-ops
ry-ops merged commit 4635680 into main Jun 24, 2026
2 checks passed
@ry-ops
ry-ops deleted the fix/dashboard-repo-parser branch June 24, 2026 11:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant