ci: retire the orphaned coverage badge pipeline - #520
Conversation
#502 dropped the Go Coverage badge from the README but left everything that fed it running: the non-gating `badge` job kept firing on every main push, holding ci.yml's only `contents: write`, publishing coverage-go.json to the orphan `badges` branch for a badge no page rendered. Retire rather than restore (#509). Removes the `badge` job, its two producer steps in `coverage`, scripts/ci/publish-badge.sh, and the `cov badge` subcommand. The coverage GATE is untouched — make cov, threshold.total, per-suite minima, and the Code Quality PR comments all still run; only the published badge surface is gone. ci.yml now declares no `contents: write` in any job. Also fixes a latent break this surfaced: `timing`'s needs still listed `badge`, which is a workflow-level error once the job is gone. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MB4oPy9yfUHSe8FjnDmeZH
Four documentation-accuracy fixes from the pre-push code and docs reviewers, both of which independently flagged the first two: - The `badges` branch was described in the past tense as already gone. It isn't, and it can't be until this merges — while the `badge` job still exists on main, the next code push would recreate it. Both the workflows README and the CHANGELOG now state that sequencing. - "for weeks" was wrong: #502 merged 2026-08-20, six days ago. - ci.yml's header claimed docs-preview was the only job holding a write scope, undercounting coverage's `code-quality: write` — which it holds while executing the PR tree. Pre-existing, but exactly the class of stale permission claim this PR set out to correct. - The "restoring a badge means restoring contents: write" note asserted an implication and then offered the alternative that disproves it. A shields endpoint hosted outside the repo needs no write scope at all. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MB4oPy9yfUHSe8FjnDmeZH
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review. 📜 Recent review details⏰ Context from checks skipped due to timeout. (5)
🔇 Additional comments (1)
📝 WalkthroughSummary by CodeRabbit
WalkthroughThe README coverage-badge pipeline was retired. CI no longer generates or publishes badge data, the badge job and publishing script were removed, the ChangesCoverage badge retirement
Estimated code review effort: 2 (Simple) | ~10 minutes Merge Risk: ⚪ Minimal · up to The PR removes an unused coverage badge pipeline while preserving the coverage gate and related checks; no actionable merge-blocking risk remains. Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Full details: Linked Issues checkExplanation The PR satisfies the coding requirements in [ Full details: Docstring CoverageExplanation Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 4 functions across 1 files. (1 skipped: 1 unsupported.)
✨ Finishing Touches🧪 Generate unit tests (beta)
✨ Simplify code
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 183aa2dd-5e94-4663-ae24-98cf32faab5e
📒 Files selected for processing (7)
.github/workflows/README.md.github/workflows/ci.yml.testcoverage.ymlAGENTS.mdCHANGELOG.mdscripts/ci/publish-badge.shscripts/cov/main.go
💤 Files with no reviewable changes (1)
- scripts/ci/publish-badge.sh
Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.
📜 Review details
⏰ Context from checks skipped due to timeout. (8)
- GitHub Check: Integration tests
- GitHub Check: Docs build
- GitHub Check: Unit tests
- GitHub Check: Coverage
- GitHub Check: E2E tests
- GitHub Check: Lint
- GitHub Check: Analyze (go)
- GitHub Check: Analyze (go)
🧰 Additional context used
📓 Path-based instructions (3)
Column-level access control is a hard cap on every read path.
📄 CodeRabbit inference engine (AGENTS.md)
Files:
scripts/cov/main.go
DRY — one source of truth.
📄 CodeRabbit inference engine (AGENTS.md)
Files:
CHANGELOG.mdAGENTS.mdscripts/cov/main.go
Never hard-wrap prose. One paragraph is one line.
📄 CodeRabbit inference engine (AGENTS.md)
Files:
CHANGELOG.mdAGENTS.md
🧠 Learnings (1)
📚 Learning: 2026-06-10T15:01:09.027Z
Learnt from: EricAndrechek
Repo: Wave-RF/WaveHouse PR: 312
File: docs/src/content/docs/development.md:0-0
Timestamp: 2026-06-10T15:01:09.027Z
Learning: In this repo’s Markdown review (all .md files), do not flag capitalization/style issues for literal paths starting with ".github/" (or any substring that is a path beginning with ".github/"). Treat ".github" as the correct lowercase dotfile directory name, even when it appears inside prose or code spans; automated checks such as LanguageTool’s "(GITHUB)" rule commonly produce false positives for this literal filesystem path.
Applied to files:
CHANGELOG.mdAGENTS.md
🪛 LanguageTool
CHANGELOG.md
[uncategorized] ~20-~20: The official name of this software platform is spelled with a capital “H”.
Context: ...ge and its whole publishing pipeline** (.github/workflows/ci.yml, `scripts/ci/publish-...
(GITHUB)
[uncategorized] ~20-~20: The official name of this software platform is spelled with a capital “H”.
Context: ...e.sh(deleted),scripts/cov/main.go, .github/workflows/README.md, .testcoverage.ym...
(GITHUB)
AGENTS.md
[uncategorized] ~128-~128: The official name of this software platform is spelled with a capital “H”.
Context: ... comments via GitHub Code Quality — see .github/workflows/README.md "Coverage publishi...
(GITHUB)
|
📚 Docs preview is live → https://69c5a819-wavehouse-docs.wave-rf.workers.dev
|
CodeRabbit flagged the new bullet in .github/workflows/README.md as hard-wrapped, and it was right. I initially pushed back because .github/.markdownlint.json sets "WH001": false — but that exclusion contradicts CONTRIBUTING.md, which promises the rule is enforced "everywhere", and AGENTS.md, which states it with no carve-out. The config is the thing that's wrong, not the finding. This commit fixes only the prose this PR introduced, so the change stays scoped to the badge retirement. Removing both WH001 exclusions (.github/ and .claude/) and reflowing the 53 hard-wrapped paragraphs they were hiding (292 WH001 violation lines, since the rule reports one per line) is tracked in #521. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MB4oPy9yfUHSe8FjnDmeZH
Two review findings. The workflows README still told readers the orphan `badges` branch "is deleted separately once this lands: while the job still exists on main, the next code push would just recreate it." Both clauses stopped being true when #520 merged and the branch was deleted — so the canonical CI reference was handing readers an open action item that is already done. Past-tensed, keeping the reason it had to be sequenced that way. The twin sentence in CHANGELOG.md is deliberately NOT changed: that entry records what #520 did and planned at the time, and Keep a Changelog entries aren't rewritten as reality moves. The living reference doc tracks current state; the changelog tracks history. Also rewrapped a 112-character comment line in .markdownlint-cli2.jsonc to match the ~80 of its neighbours — hand-wrapped prose maintenance cost, in the file that configures the rule against it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MB4oPy9yfUHSe8FjnDmeZH
Two path-scoped configs — `.github/.markdownlint.json` and `.claude/.markdownlint.json` — held nothing but `"WH001": false`, silently switching the no-hard-wrapped-prose rule off for CI docs and agent prompts ever since #489 introduced it. `CONTRIBUTING.md:97` tells contributors `make lint` enforces WH001 **everywhere**, while `AGENTS.md:342` and the `.markdownlint-cli2.jsonc` header wrote up the carve-out — three descriptions of one rule, disagreeing. That cost a round trip on #520: a reviewer correctly flagged a hard-wrapped bullet in `.github/workflows/README.md`, an agent pointed at `"WH001": false` for that path and pushed back, and the reviewer recorded a persistent *learning* never to flag WH001 there — the wrong invariant, learned off the wrong side of the contradiction. ## What changed - **Both configs deleted.** Each held only `extends` + the override, so the root `.markdownlint.json` (`"WH001": true`) governs again. The `ignores` array is untouched — there is now **no path-scoped carve-out of any kind**. - **51 hard-wrapped paragraphs reflowed** by `make fix`: 41 in `.github/workflows/README.md` (378 → 171 lines), 10 in `.claude/skills/pm-triage/references/routine.md`. Mechanical joins; no wording changed. - **The vendored PostHog skill is deleted** — `.claude/skills/integration-astro-view-transitions/`, 9 files / ~1,456 lines including an 809-line `EXAMPLE.md` copied wholesale from `PostHog/context-mill`. Its integration job finished in #277, nothing in the repo calls it, and the live docs-site setup is documented in `docs/src/components/PostHog.astro` and the CHANGELOG. Unowned third-party prose drifts silently on every upstream bump and nobody here reviews it — and it was the single file that would have needed a special-case exclusion, so removing it is what lets the rule apply with **no exception at all** rather than one documented one. - **Docs reconciled** so all four descriptions agree. `AGENTS.md:342` and the config header rewritten; `AGENTS.md:326` and `CONTRIBUTING.md:97` already said "everywhere" and are now true. `AGENTS.md:342` also tells future readers *not* to reintroduce a subtree override, pointing at an in-file `markdownlint-disable` as the visible escape hatch — verified to actually work, block form only. - **Two dead denylist entries swept.** `docs/posthog-setup-report.md` (the wizard's other artifact, deleted in #502) and `PERF-CLAIMS-REVIEW.md` — which was never tracked at all, so it guarded a file that has never existed. The list's other general cases are patterns (`*.draft.md`, `*.old.md`) that already cover a one-off review document. Removed from all four lockstep locations; `scripts/docs-prose.sh all` still resolves the same 27-file prose set. ## What review turned up None of this was in #521's scope. All of it is the same defect class — documentation asserting a state of the world that had moved on — which is what made a whole-file read worth doing. - **WH001 has a blind spot.** `no-hard-wrapped-prose.mjs:139` classifies any line indented four or more spaces as an indented code block, so a **nested** list item is never joined. Three hard-wrapped bullets sat in `.github/workflows/README.md` — in the very file this PR reflowed — invisible to the autofix. Unwrapped by hand; they were the last hard-wrapped prose paragraphs in the repo. - **That made a documented rule false.** `AGENTS.md:326` and `development.md:432` both promised "a list item is joined as a unit". Not for nested items — a contributor would expect `make fix` to unwrap one and it silently doesn't. Both now state the four-space caveat. - **`scripts/docs-prose.sh`'s header undercounted its own lockstep set**, naming two sibling copies of the denylist when there are three. The missed one is `.claude/agents/docs-reviewer.md` — the gating subagent's own system prompt — which `git log -S` shows had been out of sync for the entire life of the `posthog-setup-report.md` exclusion, and agreed only by accident of this branch removing it. - **The job graph contradicted itself.** `docs-deploy` was drawn without its `needs` edges from `unit`, `integration`, and `e2e`, and `ci`/`docs-preview` were missing `changes` — while the legend three lines below states "Solid arrows are `needs` edges" and `changes --> deploy` *was* drawn. Five edges added; the diagram now matches `ci.yml` edge-for-edge in both directions. - **`claude-code.md` deferred to work that had already shipped.** It told readers that "when #121 lands a SigNoz dev stack with `make dev-obs`" Grafana MCP would become useful. #121 closed as *completed* in May, `dev-obs` exists nowhere in the tree (the real targets are `obs-aspire` / `obs-grafana` / `obs-front`), and `deployment.md` states outright that no heavy multi-node cluster like SigNoz is maintained for local development. Now points at `make obs-grafana`. Filed rather than fixed here: **#523**, where `deployment.md` claims all three local observability stacks publish OTLP `4318`, but only `obs-front` does. ## Test plan - `make ci` green end to end on the final tree, marker matches HEAD. - `markdownlint-cli2` reports 0 issues over all 42 tracked `.md`, and `pnpm lint:md` 0 over all 48 tracked `.md` + `.mdx` — "every tracked Markdown file" is literally, not approximately, true. `make fix` is a fixpoint. - **Reflow safety proven, not eyeballed.** Reviewers reconstructed the pre-image files, re-ran the repo's own `markdownlint-cli2 --fix`, and diffed: the branch files are **byte-identical to the autofix output**, ruling out a hand-edit in the reflow. Independently, word-level diffs against `main` show `routine.md` is word-for-word identical and `.github/workflows/README.md`'s only content changes are the five graph edges and the past-tensed badges sentence. - **"Last hard-wrapped prose in the repo" was checked against WH001's own blind spot** rather than its 0-issue result: a scan of all 48 tracked files for nested list items with 4-space continuations found four hits, all YAML frontmatter. No prose. - Every drawn graph edge verified against `ci.yml`'s `needs`, both directions — nine into `ci`, seven into `docs-deploy`, two into `docs-preview`, none spurious. - `shellcheck` + `bash -n` clean on `docs-prose.sh`; the new `/deployment#local-observability-stack` anchor is validated by `starlight-links-validator` during `make ci`'s docs build. Closes #521 --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Summary
#502rewrote the README badge row and dropped the Go Coverage badge, but nothing removed what fed it. For the six days since, the non-gatingbadgejob kept firing on every main push — holdingci.yml's onlycontents: write, publishingcoverage-go.jsonto the orphanbadgesbranch — for a badge no page renders.Retired rather than restored (
#509). This removes:badgejob and its two producer steps incoverage(cov badge+ thego-coverage-badgeartifact)scripts/ci/publish-badge.shcov badgesubcommand (badgeData,badgeColor, and the now-unusedencoding/jsonimport)ci.yml,.github/workflows/README.md,.testcoverage.yml, andAGENTS.mdthat still described a badge the README hadn't had in weeksThe coverage gate is completely untouched.
make cov,.testcoverage.yml'sthreshold.totaland per-suite minima, and the GitHub Code Quality PR comments (the other half of#133) all still run. Only the published badge surface is gone.The reason to prefer retiring over restoring
ci.ymlnow declares nocontents: writein any job. Thebadgejob was its only holder, so the workflow that executes PR-authored code can no longer write to the repository under any path. Verified by parsing the workflow: the only remaining:writescopes anywhere inci.ymlarecode-quality: writeoncoverageandissues/pull-requests: writeondocs-preview.Restoring a coverage badge later means restoring that permission if it is done in this shape — publishing into the repo.
.github/workflows/README.mdnow says so explicitly, and points at the cheaper alternative: a shields endpoint hosted outside the repo costs no write scope at all.Latent break fixed in passing
timing'sneedslist still containedbadge. Aneedspointing at a job that no longer exists is a workflow-level error, so removing the job without this would have broken every CI run. Caught by a structural parse of the workflow, then confirmed byactionlint.Permission comments corrected
Two claims in
ci.ymlwere wrong and are fixed here, since this PR is about not leaving false permission statements lying around:contents:write" comments were repo-wide claims only ever true withinci.yml—release.yml:9andpublish-npm.yml:195hold it too.docs-previewwas the only job holding a write scope. That undercountedcoverage'scode-quality: write— which it holds while checking out and executing the PR tree.Go Report Card
Also retired, per
#509— but there is no diff for it:#502had already removed the repo's only reference. Recorded in the CHANGELOG so the decision is written down rather than rediscovered. It isn't coming back: goreportcard.com is deprecated upstream, and what it graded (gofmt, vet, lint, misspell) is gated far more strictly bymake lint-goin CI.Test plan
make lint-gha(actionlint) ✅ — the load-bearing check here; catches danglingneedsmake lint-sh✅ (shellcheck, after the script deletion)make lint-md/lint-prose/test-md-rules✅tidy,fmt-go,vulncheck,typecheck-ts,check-docs,test-classify-paths,test-release-channel✅go vet ./scripts/cov/✅ andgo run ./scripts/cov threshold total→80(config parsing intact after the surgery)ci.yml:badgejob absent, zero danglingneeds, zerocontents: writemake cigreen end-to-end, andmake verifygreen via the pre-commit hook (both run asGOTOOLCHAIN=go1.26.6, matchinggo.modand CI exactly; the repo-pinned golangci-lint v2.11.4 panics against this machine's local Go 1.27, which is environmental and does not affect CI)iterateon four documentation-accuracy findings, all fixed in the second commitThe orphan
badgesbranch still exists and must be deleted after this merges — the command is a--deletepush of thebadgesref to origin.It cannot be deleted before merge: while the
badgejob still exists onmain, the next code push recreates it (if: push && ref == main && changes.code == 'true').This is part of
#509's scope, so the issue should not be closed until the branch is gone. This PR therefore saysRefs, notCloses— close#509by hand once the branch is deleted, so the last step keeps its tracker instead of relying on a CHANGELOG sentence to carry it.Related Issues
Refs #509 (close manually after deleting the
badgesbranch), #133, #502, #501Spun out of review on this PR: #521 —
WH001(no-hard-wrapped-prose) is disabled under.github/and.claude/, contradictingCONTRIBUTING.md's promise that it's enforced everywhere. That exclusion is why the hard-wrapped bullet in this PR reached review at all. Fixed here for this PR's own prose; the reflow (53 hard-wrapped paragraphs, which WH001 reports as 292 violation lines since it emits one per line) and the config removal are tracked there.