Share a RuboCop report

A big Ruby codebase adopting RuboCop produces a number nobody can act on: 812 offenses detected. The terminal output that explains it is four thousand lines long and lives in a CI log that expires.

RuboCop ships an HTML formatter for exactly this:

rubocop --format progress --format html --out rubocop.html

Two formatters, one command: dots in the terminal, a browsable report on disk. It groups by file, expands to the offending source line, and links each offense to the cop that raised it.

Publish it

Drag rubocop.html into the app, or from CI:

bundle exec rubocop --format html --out rubocop.html || true

curl -fsS -X PATCH "https://commareports.com/api/v1/reports/$REPORT_ID" \
  -H "Authorization: Bearer $COMMA_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --rawfile html rubocop.html \
        --arg title "RuboCop — $GITHUB_SHA" '{title: $title, html: $html}')"

Run the publish step with if: always() (GitHub Actions), when: always (GitLab, CircleCI) or post { always { … } } (Jenkins). A clean lint report is not the one anyone needs.

The conversation lint actually needs

Style enforcement is a social negotiation with a config file attached. The decisions are worth keeping:

  • Anchored threads on the cop or the file — "we're disabling Metrics/ClassLength for app/services, here's why". See commenting on HTML.
  • Revisions — one report id per repo, one revision per run, so a .rubocop_todo.yml regeneration shows up as movement instead of a vibe.
  • Access per report — private, team, domain-gated, or named reviewers. See the sharing model.

Let the agent read the offenses

If a coding agent is doing the cleanup, point it at the report through MCP: it can read the published offenses and the human comments on them in the same call, which is a cheaper context than re-running the linter and re-deriving what the team already decided. See give an agent feedback.

Limits

  • Entry HTML: 5 MB. An 800-offense report is comfortably under; a 50,000-offense first run may not be — scope with --only or by directory.
  • 60 requests/minute per token.

Try it

Comma is free — unlimited reports, unlimited commenters, unlimited revision history.

Publish a lint report →

Related