<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hoi</title>
    <description>The latest articles on DEV Community by Hoi (@hoiung).</description>
    <link>https://dev.to/hoiung</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3916353%2F323a25a4-db12-4de5-9a4c-1fe2be33f99a.jpeg</url>
      <title>DEV Community: Hoi</title>
      <link>https://dev.to/hoiung</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hoiung"/>
    <language>en</language>
    <item>
      <title>Shipped Ralph Review Trio, But What Is It?</title>
      <dc:creator>Hoi</dc:creator>
      <pubDate>Wed, 06 May 2026 16:40:31 +0000</pubDate>
      <link>https://dev.to/hoiung/shipped-ralph-review-trio-but-what-is-it-44id</link>
      <guid>https://dev.to/hoiung/shipped-ralph-review-trio-but-what-is-it-44id</guid>
      <description>&lt;p&gt;There is a moment when you ship a tool and then point the tool at itself.&lt;/p&gt;

&lt;p&gt;This afternoon, a few hours after pushing Ralph Review Trio to a public GitHub repo, I installed it into my own Claude Code session and ran it on the branch that contained the ship. Three tiers. Haiku surface. Sonnet logic. Opus deep. Ten and a half minutes, 235,000 tokens, 116 tool uses. All three came back clean. Five non-blocking observations flagged, none of them about the ship itself.&lt;/p&gt;

&lt;p&gt;The tool reviewed its own shipping.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it actually is
&lt;/h2&gt;

&lt;p&gt;Three Claude models reading the same diff at increasing depth. Haiku runs first and does the cheap surface checks (file structure, commit hygiene, debug code, visible magic numbers). If it passes, Sonnet runs next and does logic tracing (cross-boundary contracts, null propagation, config wiring, real call-site inspection). If that passes, Opus runs last and does architectural review plus a factual-claims audit on anything the diff writes into documentation.&lt;/p&gt;

&lt;p&gt;If any of the three tiers fails, the whole loop restarts from Tier 1.&lt;/p&gt;

&lt;p&gt;Not continue-with-a-flag. Not "note the finding and keep going". Restart.&lt;/p&gt;

&lt;p&gt;That one rule is what makes the review actually work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why restart-on-fail sounds harsh (and isn't)
&lt;/h2&gt;

&lt;p&gt;Here is why the rule matters. Haiku passes a file. Sonnet, tracing deeper, finds a silent exception handler in that same file. The fix touches the file. Haiku's earlier pass is now against a stale version.&lt;/p&gt;

&lt;p&gt;The pragmatic move is to pretend the stale approval still holds. After all, it was only a small change. You fix. You mark Sonnet PASS. You move on.&lt;/p&gt;

&lt;p&gt;The problem is that "only a small change" is exactly the class of thing Haiku was supposed to catch. Maybe the fix introduced a debug print. Maybe it changed a magic number. Maybe it added a commented-out &lt;code&gt;# TODO&lt;/code&gt;. Surface-level mistakes that Haiku would have caught the first time... but Haiku already ran. You cannot go back.&lt;/p&gt;

&lt;p&gt;Unless you can. The fix is trivial: any tier failure restarts the whole loop from Tier 1. Pass means all three tiers passed in a row against the same final state.&lt;/p&gt;

&lt;p&gt;Yes, it costs more tokens. A hundred Haiku seconds instead of zero. In exchange, every file in the final diff has actually been surface-reviewed in its final form.&lt;/p&gt;

&lt;p&gt;It feels harsh on day one. After a month, you stop noticing the extra Haiku cycles and you start trusting the reviews in a way you did not before.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the pattern comes from
&lt;/h2&gt;

&lt;p&gt;Ralph is not mine. It comes from &lt;a href="https://ghuntley.com/ralph" rel="noopener noreferrer"&gt;Geoffrey Huntley&lt;/a&gt;: a while-true loop that re-feeds the same prompt to an agent until it emits a completion promise. Anthropic published an official &lt;code&gt;ralph-loop&lt;/code&gt; plugin implementing the mechanic as a slash command, and that plugin is what powers each tier inside mine.&lt;/p&gt;

&lt;p&gt;What I layered on top is the three-tier cost-stratified orchestration. One Ralph loop per tier, not one long loop for the whole review. Haiku runs its own ralph-loop against the surface checklist until it emits &lt;code&gt;&amp;lt;promise&amp;gt;HAIKU_PASS&amp;lt;/promise&amp;gt;&lt;/code&gt;. Sonnet runs its own loop against the logic checklist. Opus runs its own loop against the architectural checklist. The controller dispatches them in order, and any deep-tier failure restarts the whole stack from Tier 1.&lt;/p&gt;

&lt;p&gt;The 3-tier stack entered &lt;a href="https://github.com/hoiung/sst3-ai-harness" rel="noopener noreferrer"&gt;SST3-AI-Harness&lt;/a&gt; on 8 January 2026. The initial scaffolding (three tier checklists, a dispatch controller, a restart rule, ~142 combined lines) was all in place within a single evening, committed against &lt;code&gt;dotfiles#391&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Three and a half months later, the same three files add up to 416 lines and the checklists have been pulled into more than 430 issues across my two main repos, with ~155 of those closing with all three tier-pass tokens emitted. Over 250 commits across the two repos reference Ralph activity directly. Every new line in a checklist traces back to a class of bug that slipped through an earlier review. The evolution has been bursty-reactive, not gradual: a long quiet middle, then 21 tier-checklist upgrades in 19 days after a cross-boundary contract post-mortem (&lt;code&gt;auto_pb#1407&lt;/code&gt;) triggered a cascade of governance integrations (Sample Invocation Gate, MCP availability discriminator, Checkbox-MCP audit, Proof of Work canonical signal).&lt;/p&gt;

&lt;p&gt;A few catches worth naming, so you do not have to take the shape on faith. Ralph flagged its own hardcoded repository-path assumption hiding in the Haiku tier (&lt;code&gt;dotfiles#399&lt;/code&gt;). It caught a database helper returning dict-row cursors while callers still indexed by &lt;code&gt;[0]&lt;/code&gt; tuple style: eight latent bugs across hot paths, one of which was silently writing NULL foreign keys for roughly three out of four audit rows (&lt;code&gt;auto_pb#1415&lt;/code&gt;). It caught a cache helper quietly substituting a default argument whenever callers forgot to pass one, pretending the code was fine; the fix made the argument required and raised loudly on omission (&lt;code&gt;auto_pb#1442&lt;/code&gt;). The pattern earns its keep by catching things I was sure were fine.&lt;/p&gt;

&lt;p&gt;This is the kind of thing I think of as elegant engineering. Small idea on top of someone else's small idea, neither complicated on its own, both tightening each other. Since it went live in January Ralph has been a reliable bug-catching machine. It just works.&lt;/p&gt;

&lt;p&gt;The reviewers lived inside my private dotfiles. Good for me. Useless to anyone else. The Anthropic Agent Skills open standard (December 2025) gave a clean format to publish in: a Skill file, a Plugin package, a marketplace manifest. Two lines to install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin marketplace add hoiung/sst3-skills
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;ralph-review-trio@sst3-skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That was the plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two things that broke on ship day
&lt;/h2&gt;

&lt;p&gt;The plan did not survive first contact. It rarely does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First break&lt;/strong&gt;: I packaged the plugin, pushed it to GitHub, ran the marketplace add from Claude Code. Succeeded. Ran the install. Failed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Failed to install: invalid manifest file
Validation errors: repository: Invalid input: expected string, received object
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My &lt;code&gt;plugin.json&lt;/code&gt; had &lt;code&gt;repository&lt;/code&gt; as an npm-style &lt;code&gt;{type, url}&lt;/code&gt; object. Claude Code expected a plain URL string. JSON syntax was valid. Schema validation passed. The real install loader rejected it on a structural mismatch that no offline check would have caught.&lt;/p&gt;

&lt;p&gt;Fix was one character pair of braces. The lesson was not. A structural JSON-is-valid check is not a schema-conformance check. The only way to know your plugin spec is right is to run the install loader against it. (AP #18 in my harness exists for exactly this reason.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second break&lt;/strong&gt;: install succeeded after the fix. &lt;code&gt;/reload-plugins&lt;/code&gt; showed the skill registered. I ran the trio on a test branch. The controller dispatched a subagent named &lt;code&gt;haiku-reviewer&lt;/code&gt; and got:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent type 'haiku-reviewer' not found.
Available agents: ralph-review-trio:haiku-reviewer, ralph-review-trio:sonnet-reviewer, ralph-review-trio:opus-reviewer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code namespaces plugin-bundled agents as &lt;code&gt;&amp;lt;plugin-name&amp;gt;:&amp;lt;agent-name&amp;gt;&lt;/code&gt;. My command file said "dispatch &lt;code&gt;haiku-reviewer&lt;/code&gt;". Wrong. Needed to say "dispatch &lt;code&gt;ralph-review-trio:haiku-reviewer&lt;/code&gt;".&lt;/p&gt;

&lt;p&gt;Another one-line fix. Pushed as v0.2 an hour later. But that is what the dogfood test is for: the real user session, the real controller, the real dispatch. No unit test against a mock loader would have shown me either bug.&lt;/p&gt;

&lt;p&gt;I shipped v0.2 before the dogfood run even started.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the dogfood run actually found
&lt;/h2&gt;

&lt;p&gt;After both fixes, the trio ran cleanly. On a non-trivial target: 4 Markdown files, 462 insertions, 42 deletions, 8 commits ahead of master. Not a toy review target.&lt;/p&gt;

&lt;p&gt;Haiku finished in 101 seconds. Walked the file structure, commit hygiene, checkbox evidence, governance evidence audit, surface-level common-culprit scan. Passed.&lt;/p&gt;

&lt;p&gt;Sonnet took five minutes and fifty-two seconds. Ran 60 tool uses, tracing call sites, reading migrations, opening function bodies, verifying null-propagation. Not skimming. Passed.&lt;/p&gt;

&lt;p&gt;Opus took two minutes fifty-six seconds. Reviewed the Sonnet result, ran the governance drift audit, overengineering check, factual claims audit. Passed.&lt;/p&gt;

&lt;p&gt;Five non-blocking observations flagged, all about other work on the same branch, none about the ship. The review was honest.&lt;/p&gt;

&lt;p&gt;Ten and a half minutes of wall clock. 235,000 tokens. 116 tool uses. Against your Claude Code subscription, cheap for the depth. Against one human review... an embarrassing saving.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes this pack different from a generic 3-tier
&lt;/h2&gt;

&lt;p&gt;There are already several 3-tier review packs on the marketplaces. Using three models at three depths is not a differentiator on its own.&lt;/p&gt;

&lt;p&gt;The three-tier Ralph orchestration itself is the first differentiator (covered above). The other three hooks are the SST3-specific layers that earn their keep:&lt;/p&gt;

&lt;p&gt;Sample Invocation Gate: for any change that touches a pipeline, CLI wiring, cross-module function-argument propagation, or a persistent-state write, Sonnet will not pass without evidence of a real command invocation against a real database. Exit code zero is not enough. AP #18 in the harness exists because exit-zero runs that wrote zero rows are a silent-failure class the harness was built to catch.&lt;/p&gt;

&lt;p&gt;Proof of Work governance signal: if you use a governance MCP server for checkbox tracking (I have one), Opus checks that every checked box has a matching evidence entry in a canonical &lt;code&gt;## Proof of Work&lt;/code&gt; section of the issue body. It refuses narrative-only progress. The rule is strict because soft governance produces shipped products where nobody can reconstruct what was verified against what.&lt;/p&gt;

&lt;p&gt;MCP availability discriminator: every reviewer subagent that touches code-graph queries must state &lt;code&gt;mcp_graph_available: yes | no&lt;/code&gt; on the first line of its result block. &lt;code&gt;yes&lt;/code&gt; plus grep-only evidence is a fail; &lt;code&gt;no&lt;/code&gt; plus documented grep fallback is a pass. This one line kills the class of lazy-fallback bugs that would otherwise hide silently in review output.&lt;/p&gt;

&lt;p&gt;None of these are new inventions. What is new is packaging them as one installable plugin with an opinionated controller loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the provenance ends up
&lt;/h2&gt;

&lt;p&gt;The reviewers are scrubbed from my private dotfiles at commit &lt;code&gt;9249dbf&lt;/code&gt;. That scrub pin goes into the public README so any future drift between the private canonical and the public pack is auditable. Business identifiers, private trading internals, machine-specific paths... all stripped before the first commit landed in the public repo.&lt;/p&gt;

&lt;p&gt;What stays is the pattern teeth. The sequential restart rule. The Sample Invocation Gate. The Proof of Work signal. The MCP availability discriminator. Those are the things worth shipping; the rest was scaffolding.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this pack does NOT do
&lt;/h2&gt;

&lt;p&gt;It does not replace human review. It is the pre-human-review floor where every tier's checklist got walked and structured findings are ready for the human. It does not guarantee bug-free code. Three reviewers at three depths will miss things. It does not work on work-in-progress branches; the checklist assumes the change is code-complete, and running it mid-implementation floods you with false positives.&lt;/p&gt;

&lt;p&gt;It also works alone, but it works better inside a harness. The same three tier checklists ship as part of &lt;a href="https://github.com/hoiung/sst3-ai-harness" rel="noopener noreferrer"&gt;SST3-AI-Harness&lt;/a&gt;. The standalone plugin exists for people who want to dissect the pattern, or wire the same loop into a review for an LLM other than Claude.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin marketplace add hoiung/sst3-skills
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;ralph-review-trio@sst3-skills
/reload-plugins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, when a branch is code-complete, &lt;code&gt;/ralph-review-trio&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;MIT licensed. Fork it, adapt it, ship your own flavour. Repository: &lt;a href="https://github.com/hoiung/sst3-skills" rel="noopener noreferrer"&gt;github.com/hoiung/sst3-skills&lt;/a&gt;. Issues and PRs welcome. If you find a class of bug the checklist misses, tell me and I will fold it in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What comes next
&lt;/h2&gt;

&lt;p&gt;Two more packs drafted privately. Solo workflow governance (phase-checkpoint discipline, branch safety, merge gates) and subagent swarm patterns (layered cross-checking, RESULT schema, frozen scope snippets). Both need their own validation.&lt;/p&gt;

&lt;p&gt;If the Ralph Review Trio pack gets traction, the other two follow. If it does not, neither do they.&lt;/p&gt;

&lt;p&gt;Ninety-day kill date. No stars, no installs, no signups, no inbound leads at the end of that window and the project comes home. No ego in the kill.&lt;/p&gt;

&lt;p&gt;The bet is the distribution surface. The packs are the test.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>opensource</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
