fix(nc-review): render findings as blocks, not a table - #1212
Conversation
Findings run to a paragraph or more. A table cell forces all of that onto one
line with newlines collapsed, squeezed into a narrow column — run 7's single
finding was a 200-word cell and effectively unreadable.
Each finding is now its own block: a bold heading carrying severity, area and
location, then the detail at full width. Findings are sorted blocking first,
then important, then nit, so the thing that matters is at the top rather than
wherever the model happened to emit it.
This also removes a constraint rather than just moving markup around. The table
required gsub("\n"; " ") on every detail, so the agent could never quote code.
It can now, and the rubric says so with an example — for a finding like "this
captured reference is never used", quoting the two offending lines makes the
point faster than any description of them.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PZY52ePXLjwG9TaQgq2cHT
No changeset foundThis PR does not add a changeset, so it will not appear in the changelog or trigger a release. If the change is user-facing, add one: pnpm changesetPick a bump (patch / minor / major) and write the changelog entry in our usual voice ("Added X... Thanks to @you. Closes #123."), then commit the generated If this PR is docs-only or a chore that needs no release note, you can ignore this - or run |
nc-review: nothing to raiseWorkflow and rubric change to render nc-review findings as block-quoted markdown blocks instead of a table, sorted blocking → important → nit. The jq sorts via a numeric 🔴 blocking · 🟠 a reviewer would ask for a change · ⚪ optional Automated code review — correctness, security, design, tests, plus duplicates and scope. A human still decides; this is not a substitute for review and is not exhaustive. The required status checks separately cover lint, formatting, types, unused dependencies, the test suite and the build. This bot never merges. Maintainers can rerun with |
Findings run to a paragraph or more. A table cell forces all of that onto one line with newlines collapsed, squeezed into a narrow column — run 7's single finding was a 200-word cell and effectively unreadable.
Each finding is now its own block: a bold heading carrying severity, area and location, then the detail at full width. Sorted blocking → important → nit, so the thing that matters is at the top rather than wherever the model happened to emit it.
Before
After
Not just markup
The table required
gsub("\n"; " ")on every detail, so the agent could never quote code. It can now, and the rubric says so with an example — for a finding like "this captured reference is never used", quoting the two offending lines makes the point faster than any description of them.Verified against a three-finding fixture covering all severities, a finding with
fileandline, one withfileonly, and one with neither (location line omitted cleanly).