Repository navigation
Description
Problem
The row metrics (run.py, _run_metrics_adapter) reads three sources. Each read has its own except Exception:
- the project metrics (needs the clone);
- the GitHub status page;
- the Cloudflare status page.
A failed read is logged and skipped. The row counts success and stamps schedule.json. So the ledger, the counter devops_cli_service_jobs_total{row="metrics",result="error"} and the alert RoadmapServiceJobsFailing never see a failed collection.
The status page readers already raise ServiceStatusError on a failed read (telemetry/service_status.py). The row hides it.
Expected
Split the row into three rows. Remove the three except Exception blocks. A failed read raises, and the row of that source fails alone.
Row names:
metricsstays. It reads the project metrics and needs the clone.github_statusis new. It needs no clone.cloudflare_statusis new. It needs no clone.
The status lane order becomes metrics, implement, stage_ready, release_comments, github_status, cloudflare_status. The two new rows come last, so a slow status page never delays implement. The sentences that say implement follows metrics stay true.
Each row has its own entry in schedule.json, its own entry in the ledger file service-failures.json, and its own value of the row label. The label appears in devops_cli_service_jobs_total and devops_cli_service_job_suspended. Only metrics sends GitHub API requests, so its devops_cli_github_requests_total series do not change.
Change no interval. The two new rows use DEFAULT_ROADMAP_METRICS_INTERVAL_MINUTES. The three reads are the same calls under three rows.
Places that name the row list and change:
- run.py:
STATUS_LANE_ROWS,build_stub_table, and the docstrings. - k8s/README.md: item 17 of the Roadmap service list.
- openspec/specs/roadmap-implement-job/spec.md (line 435): the requirement of the status lane order.
- tests/roadmap/test_roadmap_run.py, tests/roadmap/test_roadmap_status_round.py, tests/roadmap/implement/test_roadmap_implement_submit.py (line 145) and tests/roadmap/stage/test_roadmap_stage_ready.py (line 407). Each lists the four row names.
Acceptance criteria
-
uv run pytest tests/roadmap/test_roadmap_status_rows.py -k source_failed- a failed GitHub status read countsresult=errorfor the rowgithub_statusonly.metricsandcloudflare_statusstill count success and stampschedule.json. -
uv run pytest tests/roadmap/test_roadmap_status_rows.py -k row_names- the status lane holdsmetrics,implement,stage_ready,release_comments,github_statusandcloudflare_statusin this order. -
uv run pytest tests/roadmap/test_roadmap_status_rows.py -k ledger_per_row- three rounds of a failed Cloudflare read suspendcloudflare_statusand no other row. -
grep -q 'github_status' openspec/specs/roadmap-implement-job/spec.md && grep -q 'cloudflare_status' k8s/README.md- the spec and the service list name the new rows (both fail today).
Every command above fails on the unchanged code. The pull request cites the fail-to-pass run (devops ci fail-to-pass --base <ref>).
Feasibility
I read these files at origin/main: run.py (_run_metrics_adapter, STATUS_LANE_ROWS, build_stub_table), telemetry/service_status.py, server/counter_series.py (it reads STATUS_LANE_ROWS), k8s/README.md items 15 to 20 and the spec roadmap-implement-job. I searched for the row name metrics and listed the files that name it. I did not run the Service.
I searched k8s/monitoring for a row label selector and found none. So no alert or dashboard names a row.
Existing tool considered
The row table JobRow and the ledger of run.py. No library is needed.
Cost
Build: about 45k tokens and 2.5 h (two rows, the table, 4 test files, 3 documents). Keep: about 2k tokens per quarter. Fix: about 10k tokens and 0.5 h.
Related
Part of #3027. #3941 and #3996 (request cost of the metrics row only), #3666, #3655. Order: after the issue #4048. Both change run.py and k8s/README.md.
Activity
dan-petty commentedon Nov 7, 2026
Intake placed this item to the backlog: intake puts every new item in the backlog. A person plans the milestones.
fixprefix of the title gives the type.(roadmap)scope of the title gives the scope.Failed reads are silently swallowed, so the ledger and alerts never fire, but the service still delivers data.Restores correct failure counting and alerting for two status page reads without changing the data they deliver.Split one row into three, update the lane order, four test files, and three documents; the candidate estimates about 2.5 h.Both fix failure isolation in roadmap rows, but #3493 stops one failed item from suspending the stage_ready row, while the candidate stops one failed read from hiding the error inside the metrics row.