Skip to content

Upgrade the AI code review post: cut the second audience, add the cover - #642

Merged
pftg merged 8 commits into
masterfrom
blog/upgrade-ai-code-review-trust
Aug 28, 2026
Merged

pftg merged 8 commits into
masterfrom
blog/upgrade-ai-code-review-trust

Conversation

@pftg

@pftg pftg commented Aug 28, 2026

Copy link
Copy Markdown
Member

Paul: "a lot of AI slops and hard to read voice, no cover image."

Root cause was structural, not voice

The post welded a first-hand engineering incident to a founder checklist that already ships as dev-shop-ai-code-review-what-to-ask (08-26). To cross that seam it had to generalise, and the bridge was the slop. A four-lens panel (ICP, voice, AI-tells, cold reader) proposed four different local fixes and all pointed at the same seam. The ICP reader said it outright: "my four questions are a guest paragraph inside somebody else's engineering post."

Cutting the second audience took it 934 -> 563 words. The AI-tells left with the section.

Commits

30250d34b Cut the second audience, add the cover

Cut: the "Why this is not a Ruby problem" section, the four-questions table (the sibling owns it), the padded Sources block, and the trailing link paragraph - the post ended on three consecutive link solicitations.

Factual corrections, each verified at the primary source:

Post said workflow.rb says
"The fix was not a better prompt" L21 deletes the field AND L54 instructs "do not state an overall verdict" False - it was both
"a model produced structured output" L9 REVIEW_MODEL = 'nvidia/nemotron-3-super-120b-a12b:free' Overclaim - one free-tier model, now named
"the security specialist set its verdict to approve" one commit, arrived already fixed; review.md is the post-fix run Unprovable - attribution removed

Also: the proof link 404'd (blob/main on a repo whose only branch is master), the cover image was missing, and the diagram SVG was carrying the exact aphorisms cut from the prose - no ratchet reads inside an SVG.

ddd7f113f Mark up the post so it can be scanned

Voice guide section 2: three bolds, each a conclusion, one per paragraph so approve stays loudest. Identifiers backticked. A callout after the ruby fence, per 2604's finding that a mid-scroll viewport of pure code leaves a non-technical reader no escape hatch.

Evidence

  • bin/hugo-build green; bin/rake test:links 0 errors across 32,048 unique links
  • Visual gate PASS at 1280x800 and 390x844: zero console errors, zero 404s, no horizontal overflow
  • The claim line was re-measured after a mobile failure - it wrapped and split immediately before the bold, dropping approve flush at the left margin. Shortened to 31 chars; now holds one line
  • External proof link curl-checked 200 (the link job excludes external URLs)

Also in this branch

  • docs/workflows/cover-images.md named two gitignored reference files; points at tracked ones now
  • 20.09 section 13p scheduled 09-09 as a section 5 durable-news swap displacing 13l (RubyLLM 2.0 loop decomposition)
  • .okf/ - three durable learnings incl. a new shell-editing-gotchas concept

Open, needs a call

Cover badge reads "AI Code Review 2026", byline reads "JAN 16, 2025" - same fold. Publishing-policy question on an upgrade-in-place, not decided here.

🤖 Generated with Claude Code

https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg

@coderabbitai

coderabbitai Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: eb3926f6-3c17-44d6-9cda-7bb7921a4f2a


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.

pftg and others added 8 commits August 28, 2026 21:00
…he duplicate

UPGRADE IN PLACE per 20.09 S2. Same URL, rewritten around something we can prove
instead of numbers we could not.

WHAT WAS THERE. The post opened on "70% faster review cycles", "catching 85%
more potential issues" and "82% of developers use AI tools weekly". None of the
three traces to either source it listed - the Sources block was added by the
batch-cite sweep without anyone checking that the body's headline figures came
from it. It also had one H2 and eight orphaned H3s, so the heading hierarchy
skipped a level throughout.

WHAT IT RESTS ON NOW. Building `jetthoughts/ruby_llm-team`, a code-review
workflow reported a SQL injection, listed it, and wrote "approve" on the line
directly above. Same response, structured output contradicting its own verdict.
The fix was to delete the verdict field and compute it in Ruby: any specialist
reporting findings means changes are requested. Both the workflow and the
comment we left ourselves are public in examples/code_review/workflow.rb, so a
reader can check the whole claim.

Framed for the founder rather than the Ruby developer, per the row: the question
is whether you can trust what the AI reviewer told you, and the four closing
questions need no code to ask. The general rule is stated language-agnostically,
because nothing about the failure is Ruby-specific.

Constraints honoured: the library is described as public, never as published or
adopted, because it is neither on RubyGems nor used by anyone. No invented
incident - this came from building a library and says so. A "what we are not
claiming" section states plainly that this is one team's finding and not a rate.

DUPLICATE RESOLVED. `...-workflows-2025` deleted and its URL added as an alias on
the survivor, so the old path redirects. Neither URL had any GSC data in 90 days,
so there was no equity to weigh - the survivor was chosen for the cleaner slug
without a stale year in it.

Added a diagram contrasting the two designs. Verified in the browser at mobile
width: 9.3 screens, longest prose run 924 chars, no overflow, alias redirect
emitted.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg
Ten findings from building jetthoughts/ruby_llm-team, each carrying the
file or commit that proves it so the fabrication ratchet has something
to check against.

§14 of the content plan carries four candidate rows, already deduped
against the seven-post RubyLLM cluster. Most of the material would have
cannibalised multi-agent-llm-rails-rubyllm, evaluating-rubyllm-agents-rails
or debugging-rubyllm-agents-rails, so only what survived that audit is
listed — and S2 is marked upgrade-in-place rather than a new slot, which
is the row this branch is drafting.
The post welded a first-hand incident to a founder checklist that already
ships as dev-shop-ai-code-review-what-to-ask. It had to generalise to cross
that seam, which is where the AI-tells lived. 934 -> 563 words.

- Fixed two false claims about our own fix: it was a schema deletion AND a
  prompt instruction, and the model was one free-tier default, not models.
- Dropped an unprovable attribution. No artifact preserves the failing
  response; workflow.rb has one commit and arrived already fixed.
- Proof link 404d: blob/main on a repo whose only branch is master.
- Added the missing cover; rewrote the diagram's text, which was carrying
  the exact aphorisms cut from the prose. No ratchet reads inside an SVG.
- cover-images.md named two gitignored reference files. Points at tracked
  ones now.
- 20.09 §13p scheduled 09-09 as a §5 swap displacing §13l.

Gates: hugo-build green, test:links 0 errors, visual gate PASS at 1280x800
and 390x844.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg
Three bolds, each a conclusion and one per paragraph, so approve stays the
loudest mark. Identifiers get backticks. A long paragraph splits in two.

A one-line callout now sits directly after the ruby fence - 2604's
findings-2026-04-30 flagged that a mid-scroll viewport of pure code leaves a
non-technical reader no escape hatch.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg
Measured: the free-model qualifier carried 9.5x the rendered bold ink of
approve, same weight and colour, and the two shared a viewport - so a scanner
took away the hedge, not the finding. Unbolded; it is a qualifier and does not
need to shout.

The remaining bold is now isolated on its own line, 3,000px from approve, so
the two can no longer compete. Also trimmed a clause that restated the callout
two lines below it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg
Two findings from gating this post. The longest-unbroken-run metric cannot be
moved by splitting a paragraph - a one-line paragraph is still prose, so a
split adds to the run instead of breaking it. Measured: 720px/23 lines mobile
and 609px/16 desktop, identical across the split. Only a non-prose element
moves it, which means the metric can push a writer into adding furniture to
satisfy a gate.

The measurement that did discriminate was rendered bold ink - client-rect area,
not a count of <strong>. One bold per paragraph was satisfied while the page's
loudest mark was a hedge carrying 9.5x the ink of the hook.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg
The URL survived the upgrade; the content did not. Thesis, evidence and
nearly every sentence are new, and the incident is from 2026 - a JAN 16 2025
byline sitting in the same fold as a 2026 cover badge misstated the currency
to both the reader and search. created_at keeps the original date as the
historical record.

Side effect worth knowing: this moves the post to blog index page 1, which is
exactly the content churn the blog/index screenshot mask fails to absorb.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg
13q (09-30) forged handoff: an agent emitted the fixed relay header itself and
fabricated an approval from a coworker that never ran. Fix verified in shipped
code. The row requires stating the nonce is 32 bits rather than implying a
crypto boundary.

13r (10-07) the simplification comparison, opening on the concession that plain
Ruby is shorter. Every line count in the README table is unverified and must be
re-derived before writing, not quoted.

Both carry the positioning-drift flag: fifth and sixth consecutive AI-tooling
posts, stated so the mix is a choice rather than an accident.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg
@pftg
pftg force-pushed the blog/upgrade-ai-code-review-trust branch from b474633 to c834544 Compare August 28, 2026 19:01
@pftg
pftg merged commit 99f37fd into master Aug 28, 2026
4 checks passed
@pftg
pftg deleted the blog/upgrade-ai-code-review-trust branch August 28, 2026 19:01
pftg added a commit that referenced this pull request Aug 28, 2026
#642 and #643 are in. The typography audit is closed: the surface measures
good and 2604 built it, so the only live finding was the dek reading smaller
than the body it introduces - not actioned, because the real ask turned out to
be content formatting rather than CSS.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg
pftg added a commit that referenced this pull request Aug 28, 2026
* Delete the mobile fence rule that never applied

.blog pre code { font-size: 14.5px } sat inside a max-width:768px block, but
the global rule at style.css:539 sorts later and media queries add no
specificity - mobile has always rendered 15.5px. 2604 chose 14.5px to reduce
horizontal-scroll feel; re-measured at 390x844, fences wrap and scroll is
contained, so the concern does not reproduce. Ratified, not restored, and the
supersession is recorded where the decision was made.

Gate: blog/index fails on origin/master BEFORE this change - control run with
the change reverted gives the same difference level 0.0015653935 twice. The
diff is the featured-post title and thumbnail, which the .blog-post /
.post-feature masks do not cover, so the test breaks on content churn. Not
caused by this commit; not papered over by re-recording.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg

* Point STATUS at what actually merged

#642 and #643 are in. The typography audit is closed: the surface measures
good and 2604 built it, so the only live finding was the dek reading smaller
than the body it introduces - not actioned, because the real ask turned out to
be content formatting rather than CSS.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PUkwFTsiv7EB2DYKogbpg

---------

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

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant