Skip to content

ci: retire the orphaned coverage badge pipeline - #520

Merged
EricAndrechek merged 3 commits into
mainfrom
ci-509
Aug 26, 2026
Merged

ci: retire the orphaned coverage badge pipeline#520
EricAndrechek merged 3 commits into
mainfrom
ci-509

Conversation

@EricAndrechek

@EricAndrechek EricAndrechek commented Aug 26, 2026

Copy link
Copy Markdown
Member

Summary

#502 rewrote the README badge row and dropped the Go Coverage badge, but nothing removed what fed it. For the six days since, 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 renders.

Retired rather than restored (#509). This removes:

  • the badge job and its two producer steps in coverage (cov badge + the go-coverage-badge artifact)
  • scripts/ci/publish-badge.sh
  • the cov badge subcommand (badgeData, badgeColor, and the now-unused encoding/json import)
  • the stale comments in ci.yml, .github/workflows/README.md, .testcoverage.yml, and AGENTS.md that still described a badge the README hadn't had in weeks

The coverage gate is completely untouched. make cov, .testcoverage.yml's threshold.total and 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.yml now declares no contents: write in any job. The badge job 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 :write scopes anywhere in ci.yml are code-quality: write on coverage and issues/pull-requests: write on docs-preview.

Restoring a coverage badge later means restoring that permission if it is done in this shape — publishing into the repo. .github/workflows/README.md now 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's needs list still contained badge. A needs pointing 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 by actionlint.

Permission comments corrected

Two claims in ci.yml were wrong and are fixed here, since this PR is about not leaving false permission statements lying around:

  • The "sole holder of contents:write" comments were repo-wide claims only ever true within ci.ymlrelease.yml:9 and publish-npm.yml:195 hold it too.
  • The workflow header said docs-preview was the only job holding a write scope. That undercounted coverage's code-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: #502 had 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 by make lint-go in CI.

Test plan

  • make lint-gha (actionlint) ✅ — the load-bearing check here; catches dangling needs
  • make 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/ ✅ and go run ./scripts/cov threshold total80 (config parsing intact after the surgery)
  • Structural parse of ci.yml: badge job absent, zero dangling needs, zero contents: write
  • make ci green end-to-end, and make verify green via the pre-commit hook (both run as GOTOOLCHAIN=go1.26.6, matching go.mod and 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)
  • Two rounds of the pre-push code and docs reviewers; round 1 returned iterate on four documentation-accuracy findings, all fixed in the second commit

⚠️ Required post-merge step

The orphan badges branch still exists and must be deleted after this merges — the command is a --delete push of the badges ref to origin.

It cannot be deleted before merge: while the badge job still exists on main, 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 says Refs, not Closes — close #509 by 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 badges branch), #133, #502, #501

Spun out of review on this PR: #521WH001 (no-hard-wrapped-prose) is disabled under .github/ and .claude/, contradicting CONTRIBUTING.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.

EricAndrechek and others added 2 commits August 26, 2026 09:24
#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
@github-actions github-actions Bot added github_actions Pull requests that update GitHub Actions code go Pull requests that update go code area/docs Documentation, site/, README area/infra CI, build, deploy, Docker, release labels Aug 26, 2026
@coderabbitai

coderabbitai Bot commented Aug 26, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 6966865d-50ca-4082-b651-9d073c0ce539

📥 Commits

Reviewing files that changed from the base of the PR and between d1e022c and 0cf7470.

📒 Files selected for processing (1)
  • .github/workflows/README.md

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)
  • GitHub Check: Timing summary
  • GitHub Check: CI
  • GitHub Check: Lint
  • GitHub Check: Detect changes
  • GitHub Check: PR title
🔇 Additional comments (1)
.github/workflows/README.md (1)

151-151: LGTM!


📝 Walkthrough

Summary by CodeRabbit

  • Removed

    • Retired README coverage badge generation and publishing.
    • Removed the standalone badge workflow and related badge command.
    • Removed the orphan badge branch and associated write permissions.
  • Documentation

    • Updated CI and coverage documentation to reflect the current publishing process.
    • Added changelog details for the retired coverage badge pipeline.
  • CI Improvements

    • Clarified which workflow jobs are non-gating.
    • Simplified coverage aggregation and job dependencies.

Walkthrough

The README coverage-badge pipeline was retired. CI no longer generates or publishes badge data, the badge job and publishing script were removed, the cov badge command was deleted, and related documentation was updated.

Changes

Coverage badge retirement

Layer / File(s) Summary
Retire the CI badge pipeline
.github/workflows/ci.yml, .github/workflows/README.md
The coverage job no longer generates or uploads badge data. The badge job and its timing dependency were removed. CI documentation now states that no job has contents: write.
Remove badge tooling
scripts/ci/publish-badge.sh, scripts/cov/main.go
The badge publishing script was deleted. The cov command usage no longer lists badge.
Align coverage documentation
.testcoverage.yml, AGENTS.md, CHANGELOG.md, .github/workflows/README.md
Documentation records the retired README badge while retaining coverage publishing, PR comments, and existing coverage gates.

Estimated code review effort: 2 (Simple) | ~10 minutes

Merge Risk: ⚪ Minimal · up to 0cf74

The PR removes an unused coverage badge pipeline while preserving the coverage gate and related checks; no actionable merge-blocking risk remains.

Suggested reviewers: taitelee

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning 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… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The PR satisfies the coding requirements in [#509] by removing the badge job, badge producers, publishing script, cov badge command, dangling timing dependency, and stale documentation. The badges bra…
Out of Scope Changes check ✅ Passed The workflow comment corrections, changelog entry, timing dependency fix, and related documentation updates support the badge pipeline retirement. No unrelated code changes are evident.
Title check ✅ Passed The title clearly and concisely summarizes the main change: retiring the orphaned coverage badge pipeline.
Description check ✅ Passed The description is directly related to the changeset and explains the removed badge pipeline, retained coverage checks, permission changes, validation, and required post-merge branch deletion.
Full details: Linked Issues check

Explanation

The PR satisfies the coding requirements in [#509] by removing the badge job, badge producers, publishing script, cov badge command, dangling timing dependency, and stale documentation. The badges branch deletion is correctly identified as a required post-merge operational step.

Full details: Docstring Coverage

Explanation

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.)

  • Fix all pre-merge checks with AI
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ci-509
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch ci-509

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between b2eee9d and d1e022c.

📒 Files selected for processing (7)
  • .github/workflows/README.md
  • .github/workflows/ci.yml
  • .testcoverage.yml
  • AGENTS.md
  • CHANGELOG.md
  • scripts/ci/publish-badge.sh
  • scripts/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.md
  • AGENTS.md
  • scripts/cov/main.go
Never hard-wrap prose. One paragraph is one line.

📄 CodeRabbit inference engine (AGENTS.md)

Files:

  • CHANGELOG.md
  • AGENTS.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.md
  • AGENTS.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)

Comment thread .github/workflows/README.md Outdated
@github-project-automation github-project-automation Bot moved this from Backlog to In review in WaveHouse Task Board Aug 26, 2026
@github-code-quality

github-code-quality Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: Go

Go

The overall line coverage in commit 0cf7470 in the ci-509 branch remains at 91%, unchanged from commit b2eee9d in the main branch.


Updated August 26, 2026 17:21 UTC

@github-actions

github-actions Bot commented Aug 26, 2026

Copy link
Copy Markdown

📚 Docs preview is livehttps://69c5a819-wavehouse-docs.wave-rf.workers.dev

  • Commit0cf7470: docs: unwrap the badge-retirement bullet to one line
  • Author@EricAndrechek, Claude Opus 5 (1M context)
  • Committed — 2026-08-26 11:18 (UTC-04:00)
  • Deployed — 2026-08-26 13:20 EDT

coderabbitai[bot]
coderabbitai Bot previously approved these changes Aug 26, 2026
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
@EricAndrechek
EricAndrechek marked this pull request as ready for review August 26, 2026 15:29
@EricAndrechek
EricAndrechek requested review from a team and taitelee August 26, 2026 15:29
@EricAndrechek
EricAndrechek marked this pull request as draft August 26, 2026 15:31
@EricAndrechek
EricAndrechek marked this pull request as ready for review August 26, 2026 15:31
@EricAndrechek
EricAndrechek marked this pull request as draft August 26, 2026 17:06
@EricAndrechek
EricAndrechek marked this pull request as ready for review August 26, 2026 17:06
@github-project-automation github-project-automation Bot moved this from In review to Done in WaveHouse Task Board Aug 26, 2026
@EricAndrechek EricAndrechek reopened this Aug 26, 2026
@github-project-automation github-project-automation Bot moved this from Done to Ready in WaveHouse Task Board Aug 26, 2026
@EricAndrechek
EricAndrechek merged commit e2e7103 into main Aug 26, 2026
35 of 50 checks passed
@EricAndrechek
EricAndrechek deleted the ci-509 branch August 26, 2026 17:32
@github-project-automation github-project-automation Bot moved this from Ready to Done in WaveHouse Task Board Aug 26, 2026
EricAndrechek added a commit that referenced this pull request Aug 26, 2026
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
EricAndrechek added a commit that referenced this pull request Aug 26, 2026
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/docs Documentation, site/, README area/infra CI, build, deploy, Docker, release github_actions Pull requests that update GitHub Actions code go Pull requests that update go code

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant