<?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: Tomas Rampas</title>
    <description>The latest articles on DEV Community by Tomas Rampas (@tomasrampas).</description>
    <link>https://dev.to/tomasrampas</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3648135%2F46c797f9-b29c-4814-b130-5967429e5d7d.jpeg</url>
      <title>DEV Community: Tomas Rampas</title>
      <link>https://dev.to/tomasrampas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tomasrampas"/>
    <language>en</language>
    <item>
      <title>The security check that never ran — shipping agentic-framework v4.1</title>
      <dc:creator>Tomas Rampas</dc:creator>
      <pubDate>Wed, 05 Aug 2026 13:27:08 +0000</pubDate>
      <link>https://dev.to/tomasrampas/shipping-v410-and-v411-of-agentic-framework-including-the-grep-bug-that-made-a-security-check-3m5k</link>
      <guid>https://dev.to/tomasrampas/shipping-v410-and-v411-of-agentic-framework-including-the-grep-bug-that-made-a-security-check-3m5k</guid>
      <description>&lt;p&gt;This week the framework caught one of its own security checks doing absolutely nothing.&lt;/p&gt;

&lt;p&gt;The private-key scanner had been reporting “No private keys detected” on every single run. It looked healthy. It was green in CI. And it was completely broken.&lt;/p&gt;

&lt;p&gt;That’s the kind of quiet failure that only shows up when the review chain is willing to dig past the green checkmark. It became the headline of v4.1.1. But the story actually started a few days earlier with a more ordinary kind of drift.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tomas-rampas/agentic-framework" rel="noopener noreferrer"&gt;agentic-framework&lt;/a&gt; is a Claude Code plugin that turns Claude into an orchestrated team: 21 specialist subagents, 10 slash commands, 9 skills, and 5 hooks — including a peer-review Stop gate that refuses to let a session end when committed work hasn’t been through review. The repo also validates itself. A consistency battery keeps agent frontmatter, the model registry, MCP tool grants, and hook wiring in agreement. When that agreement breaks, the battery is supposed to notice.&lt;/p&gt;

&lt;h2&gt;
  
  
  v4.1.0 — cleaning up the drift
&lt;/h2&gt;

&lt;p&gt;Most of the week went into fixing configuration that had slowly diverged from what the validators actually enforced.&lt;/p&gt;

&lt;p&gt;I canonicalized &lt;code&gt;effort:&lt;/code&gt; across all 21 agents, added &lt;code&gt;mcpServers:&lt;/code&gt; to 17 of them, wrote explicit &lt;code&gt;tools:&lt;/code&gt; allowlists for the seven language experts, and moved eight agents (the six language experts plus security-specialist and spec-compliance-reviewer) from sonnet to opus. The model registry in &lt;code&gt;claude.json&lt;/code&gt; was updated in the same commit so the model-parity check stayed green.&lt;/p&gt;

&lt;p&gt;To keep this from happening again, I added validator check 15. It now confirms that &lt;code&gt;effort&lt;/code&gt; is a known tier, that every &lt;code&gt;mcpServers&lt;/code&gt; entry exists in the MCP plugin manifest, that every &lt;code&gt;mcp__&amp;lt;server&amp;gt;__&lt;/code&gt; tool in an allowlist has its server declared, and that any serena tool grant includes serena’s two required bootstrap tools. The rule exists because a real version of this defect had already shipped mid-branch and taken two follow-up commits to clean up. The check came after the pain.&lt;/p&gt;

&lt;p&gt;The other half of the release was hardening &lt;code&gt;migrate-legacy&lt;/code&gt;, the script that moves a legacy &lt;code&gt;~/.claude&lt;/code&gt; install onto the plugin pipeline. It had two quiet bugs: it could delete tracked hook files during its own run, dirty the checkout, and still exit 0; and it dead-ended for anyone whose tracked &lt;code&gt;CLAUDE.md&lt;/code&gt; contained personal edits. I added a live dirty-guard filtered by a protected-paths list (CLAUDE.md included) and by paths the run itself touches, changed the exit code to 2 with the offending paths named, and wrote four test topologies covering tracked hooks, a modified CLAUDE.md that must survive byte-exact, genuine dirt that must abort, and unpushed commits that must also abort.&lt;/p&gt;

&lt;p&gt;I ran the migration on my own machine as the final test. The legacy checkout is gone. Everything is now plugin-served. The peer-review Stop gate is live — a real reviewer run wrote the per-session verdict marker the gate actually reads.&lt;/p&gt;

&lt;p&gt;PR #40 landed as twelve commits. The adversarial peer review took three rounds. It first found a false positive in the new check, then found that the fix for that false positive had opened a recall hole — a spelling of the tools list that let the original defect slip back through. It only approved after the tokenizer treated every single-line spelling the same way.&lt;/p&gt;

&lt;h2&gt;
  
  
  v4.1.1 — the check that never ran
&lt;/h2&gt;

&lt;p&gt;The smaller release fixed three things and uncovered one that had been broken the entire time.&lt;/p&gt;

&lt;p&gt;The stats table in the team-presentation doc became a fully generated block; every row, including the validator check count, is now read at runtime from the check registry. The hand-maintained assertion-count row that had drifted three times in a single branch was deleted. Check 15 received a real frontmatter parser after review discovered the first draft silently skipped validation on malformed shapes — it now fails loudly on a missing or unterminated fence. And the secret scanner stopped flagging quoted values that start with &lt;code&gt;$&lt;/code&gt; (variable expansions and command substitutions), after a variable named &lt;code&gt;tool_tokens&lt;/code&gt; burned a full CI round.&lt;/p&gt;

&lt;p&gt;Then came the private-key rule.&lt;/p&gt;

&lt;p&gt;The scanner contained this line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nt"&gt;--exclude-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;.git &lt;span class="s2"&gt;"-----BEGIN.*PRIVATE KEY-----"&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;grep treats the leading dashes as an option cluster and exits with status 2. The fail-open redirect treated that exit code as “clean.” So the script printed “No private keys detected” on every run — including runs that contained a planted PEM sitting in the tree.&lt;br&gt;
The security-specialist found it. The peer-review-critic then reproduced the failure at root cause before approving the fix. The change was simple: add -e, and exclude the scanner’s own source now that the pattern actually matches its own lines. We verified it red with a planted key and green on a clean directory.&lt;br&gt;
PR #41 was five commits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Process note
&lt;/h2&gt;

&lt;p&gt;Both pull requests travelled the same path: code-review-gatekeeper, then security-specialist for a focused pass, then peer-review-critic doing multi-round adversarial review that verifies its own findings with probes, then all four CI jobs green (validate + tests on Ubuntu, the lint job, and the macOS and Windows hook legs).&lt;br&gt;
This framework’s own Claude Code agents wrote and reviewed these changes, through the framework’s own gates. No claim beyond that.&lt;br&gt;
Current measured state: 15 validator checks, 88 assertions in the consistency suite, 103 in the migration suite, 34 in plugin-manifests. All exit 0.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/tomas-rampas/agentic-framework" rel="noopener noreferrer"&gt;https://github.com/tomas-rampas/agentic-framework&lt;/a&gt;&lt;br&gt;
text&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>claudecode</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Framework that forces Claude Code to follow a proper Spec Build Review process</title>
      <dc:creator>Tomas Rampas</dc:creator>
      <pubDate>Tue, 21 Jul 2026 07:18:59 +0000</pubDate>
      <link>https://dev.to/tomasrampas/framework-that-forces-claude-code-to-follow-a-proper-spec-build-review-process-1ig5</link>
      <guid>https://dev.to/tomasrampas/framework-that-forces-claude-code-to-follow-a-proper-spec-build-review-process-1ig5</guid>
      <description>&lt;p&gt;For some time I was not happy with how Claude Code (and other coding agents) behave. They often start coding too early, skip proper requirements, or declare the work finished when it is still incomplete. So I decided to create something that puts real structure around the agent.&lt;/p&gt;

&lt;p&gt;The result is this repository:&lt;br&gt;
&lt;a href="https://github.com/tomas-rampas/claude-agentic-framework" rel="noopener noreferrer"&gt;https://github.com/tomas-rampas/claude-agentic-framework&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxykmxr4r9agi083mjqqb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxykmxr4r9agi083mjqqb.png" alt="Framework Overview End To End" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is not a new AI tool. It is a configuration layer that sits on top of Claude Code CLI and tries to make the agent more disciplined.&lt;/p&gt;

&lt;h2&gt;
  
  
  The core idea
&lt;/h2&gt;

&lt;p&gt;I designed a clear pipeline:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spec → Build → Review&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Everything starts with the &lt;code&gt;/delegate&lt;/code&gt; command. If there is no specification yet, the system automatically runs &lt;code&gt;/spec&lt;/code&gt;. In the specification phase the agent asks questions one by one, then scores its own understanding. Only when I approve the status, the work can continue to the build stage.&lt;/p&gt;

&lt;p&gt;During &lt;code&gt;/build&lt;/code&gt; the system first maps every requirement to concrete files. Then it starts implementing. After that comes the Review &amp;amp; Fix Loop. This loop can run maximum three times. If the reviewers are not happy, the agent has to fix the issues and go through the review again. Only when the final status becomes “built”, the process is considered done.&lt;/p&gt;

&lt;p&gt;There is also a Quality Bar that shows the progress (from red to green) and a per-todo BDD style loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two important mechanisms
&lt;/h2&gt;

&lt;p&gt;I added a Review Chain with three different roles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;spec-compliance-reviewer&lt;/code&gt; — checks every requirement one by one&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;code-review-gatekeeper&lt;/code&gt; — looks at code quality before commit&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;peer-review-critic&lt;/code&gt; — final independent review (this is the last gate)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And a Self-Scoring Loop that the agent uses when it needs to improve its own non-code output. It follows five steps: Rubric → Score → Name Weak points → Rewrite → Rescore. It continues until the improvement becomes very small.&lt;/p&gt;

&lt;p&gt;At the bottom of the process there is an Enforced Stop Gate. Two PowerShell hooks make sure the agent cannot just end the session if the peer review is not satisfied.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is inside the framework
&lt;/h2&gt;

&lt;p&gt;Currently it contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Around 20 specialized agents (language experts + roles like product-owner, system-architect, security-specialist, etc.)&lt;/li&gt;
&lt;li&gt;Real enforcement hooks written in PowerShell&lt;/li&gt;
&lt;li&gt;Commands such as &lt;code&gt;/delegate&lt;/code&gt;, &lt;code&gt;/spec&lt;/code&gt;, &lt;code&gt;/build&lt;/code&gt;, &lt;code&gt;/review-spec&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;An anti-drift system that tries to keep the agent registry, documentation and files consistent&lt;/li&gt;
&lt;li&gt;Integration with several MCP servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You still need Claude Code CLI. This project only configures and constrains it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I made it
&lt;/h2&gt;

&lt;p&gt;I wanted less “hope the agent does the right thing” and more real process. The agent should not decide by itself when the work is finished. There are hard limits and gates.&lt;/p&gt;

&lt;p&gt;Of course the quality still depends a lot on how good the individual agent definitions are. But at least the structure is there.&lt;/p&gt;

&lt;p&gt;If you use Claude Code and sometimes feel that the agent drifts or finishes too early, you can try this setup. Installation instructions are in the repository.&lt;/p&gt;

&lt;p&gt;I’m still improving it, so feedback is welcome.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Claude Agentic Framework: Turning Claude Code into a Real Engineering Team with Verdict Gates and Self-Scoring Loops</title>
      <dc:creator>Tomas Rampas</dc:creator>
      <pubDate>Sun, 19 Jul 2026 09:27:37 +0000</pubDate>
      <link>https://dev.to/tomasrampas/claude-agentic-framework-turning-claude-code-into-a-real-engineering-team-with-verdict-gates-and-16oc</link>
      <guid>https://dev.to/tomasrampas/claude-agentic-framework-turning-claude-code-into-a-real-engineering-team-with-verdict-gates-and-16oc</guid>
      <description>&lt;p&gt;I have been working on this &lt;a href="https://github.com/tomas-rampas/claude-agentic-framework" rel="noopener noreferrer"&gt;Agentic Framework&lt;/a&gt; for some time now, and I want to share where the Claude Agentic Framework stands today. It is a configuration layer that sits on top of Claude Code CLI and turns a single chat session into a disciplined team of 21 specialized agents. The agents do the work. Hooks enforce the quality. A consistency system keeps everything honest. Recent changes made the reviews much stronger and finally gave us a proper self-scoring loop for non-code work.&lt;br&gt;
This is not another prompt collection. It is real enforcement.&lt;/p&gt;
&lt;h2&gt;
  
  
  From Chatbot to Agent
&lt;/h2&gt;

&lt;p&gt;Most people still treat Claude like a chatbot. You ask a question, you get an answer, then you copy the code, run it, fix the errors yourself, and ask again. The model never sees the result of its own work.&lt;br&gt;
An agent works differently. You give it a goal. It plans, edits files, runs commands, reads the output, and keeps going until the outcome is finished or it hits a real decision point. Context is gathered by the agent itself. Memory lives in CLAUDE.md and memory files. Tools are full — filesystem, shell, git, MCP servers. Feedback loops exist. Guardrails are hard.&lt;br&gt;
The difference shows most clearly in context economics. A single long session fills the window with every file and log until early decisions fall out of memory. In the agentic setup the orchestrator stays lean. Heavy reading happens in disposable child windows that return only short summaries. During the last overhaul of this repository itself, the two review agents alone burned around 357k tokens inside their own windows. The coordinating session received two reports of roughly 1,500 tokens each.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjrqjswn2kk2hox9982e5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjrqjswn2kk2hox9982e5.jpg" alt="Chatbot vs. Agentic Frawork" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Architecture in Practice
&lt;/h2&gt;

&lt;p&gt;Everything starts from one objective. Routing (driven by CLAUDE.md rules, the /delegate command, and agent descriptions) sends the work to the right specialist. Skills and MCP servers support that specialist. When the specialist finishes, the code-review-gatekeeper looks at quality. Findings get fixed. Then the peer-review-critic runs an independent final review with a deliberately read-only toolset. A stop gate checks that a real review was recorded. Only then can the session end.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffn0v7l1kwsmnc9rteqxy.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffn0v7l1kwsmnc9rteqxy.jpg" alt="Pipeline" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The framework recently went through its own pipeline. A multi-agent audit found the gaps, ten commits fixed them, both review agents signed off, three CI jobs passed, and the stop gate enforced the final review live.&lt;/p&gt;
&lt;h2&gt;
  
  
  Stronger Reviews That Actually Block
&lt;/h2&gt;

&lt;p&gt;The biggest recent change is the verdict-aware peer-review stop gate. Before, the system only checked whether a review had happened. Now the peer-review-critic must emit a clear VERDICT: APPROVED or VERDICT: CHANGES_REQUIRED line. Recorder hooks log the decision. The stop gate refuses to let the session end if the verdict is not APPROVED. There is no quiet bypass.&lt;br&gt;
New and improved commands support this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;/build runs an autonomous loop that builds exactly what the spec says and iterates with the spec-compliance-reviewer until it receives APPROVED (max three iterations).&lt;/li&gt;
&lt;li&gt;/review-spec performs a manual conformance check.&lt;/li&gt;
&lt;li&gt;/delegate now consumes specifications more cleanly and avoids earlier per-todo deadlocks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The enforcement finally feels mature. It is no longer “was there a review?” It is “what was the actual verdict and did the system respect it?”&lt;/p&gt;
&lt;h2&gt;
  
  
  Self-Scoring Loop for Specs, Plans and Documents
&lt;/h2&gt;

&lt;p&gt;Code already has the review gates. Everything else — specifications, architecture notes, project plans, proposals — used to rely on vague “make this better” instructions. The new self-scoring-loop skill changes that.&lt;br&gt;
The loop is simple and strict:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write a rubric first (5–7 weighted criteria that sum to 100). The rubric stays fixed for the whole loop.&lt;/li&gt;
&lt;li&gt;Score the current version 0–100 against each criterion with a short justification.&lt;/li&gt;
&lt;li&gt;Name the one or two weakest criteria and explain exactly why points were lost.&lt;/li&gt;
&lt;li&gt;Rewrite only the weak parts. Keep what already scored well.&lt;/li&gt;
&lt;li&gt;Rescore. Stop if the score improves by less than 3 points, reaches 90+, or hits three iterations.&lt;/li&gt;
&lt;li&gt;Return the polished version together with the final scores and the trajectory (for example 68 → 81 → 87).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk68popwxto7z1l38k4xu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk68popwxto7z1l38k4xu.jpg" alt="Self-Scoring Loop" width="784" height="1168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Guardrails are deliberate. No mid-loop rubric changes. Scoring without a visible rubric is invalid. The skill is advisory and never replaces the peer-review gates for code.&lt;br&gt;
I use this myself before I present any non-code deliverable. The improvement is measurable and the stopping rules prevent endless churn.&lt;/p&gt;
&lt;h2&gt;
  
  
  Related Discipline in vouchfx
&lt;/h2&gt;

&lt;p&gt;The same mindset shows up in my other project, &lt;a href="https://vouchfx.io" rel="noopener noreferrer"&gt;vouchfx&lt;/a&gt;. There the “delegate runs” idea appears in a different form: declarative .e2e.yaml specs are compiled once into memory-safe C# delegates via Roslyn. Those delegates then execute against a full container topology orchestrated by .NET Aspire and Testcontainers. Verdicts are explicit (Pass, Fail, EnvironmentError, Inconclusive) and map cleanly into CI exit codes and reports. The self-scoring idea from the agentic framework and the strict delegate-based execution in vouchfx come from the same place — quality must be measurable and enforced, not hoped for.&lt;/p&gt;
&lt;h2&gt;
  
  
  Numbers and Getting Started
&lt;/h2&gt;

&lt;p&gt;Today the framework ships with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;21 specialized agents across seven categories and three model tiers&lt;/li&gt;
&lt;li&gt;4 registered hooks (one hard blocking gate)&lt;/li&gt;
&lt;li&gt;Several operational skills including the self-scoring-loop&lt;/li&gt;
&lt;li&gt;5 MCP servers&lt;/li&gt;
&lt;li&gt;A consistency validator that derives truth at runtime and fails the build on any drift
3 CI jobs that include a Windows leg&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Installation is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/tomas-rampas/claude-agentic-framework ~/.claude
pwsh &lt;span class="nt"&gt;-NoProfile&lt;/span&gt; &lt;span class="nt"&gt;-File&lt;/span&gt; ~/.claude/scripts/install.ps1
bash ~/.claude/scripts/validate-consistency.sh   &lt;span class="c"&gt;# expect RESULT: PASS&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You need Claude Code CLI, PowerShell 7+, bash, jq, and the usual Node/uv pieces for the MCP servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;I built this because I was tired of agents that sound confident and then quietly skip the hard parts. The combination of real stop gates, verdict recording, and a structured self-scoring loop for everything that has no test suite makes the system feel much closer to a real engineering team.&lt;br&gt;
The framework is open. The presentation that started this write-up lives in the repository under docs/team-presentation.md. The Medium post that covered the review and scoring changes is already public. Feedback, issues, and better rubrics are welcome.&lt;br&gt;
Agents write the code. Hooks make quality non-negotiable. The consistency system keeps the whole thing honest. That is the current state, and I plan to keep tightening it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>agents</category>
      <category>agenticai</category>
    </item>
    <item>
      <title>VouchFx: Write End-to-End Tests in YAML and Run Them Against Real Distributed Systems</title>
      <dc:creator>Tomas Rampas</dc:creator>
      <pubDate>Thu, 16 Jul 2026 12:06:40 +0000</pubDate>
      <link>https://dev.to/tomasrampas/vouchfx-write-end-to-end-tests-in-yaml-and-run-them-against-real-distributed-systems-1o60</link>
      <guid>https://dev.to/tomasrampas/vouchfx-write-end-to-end-tests-in-yaml-and-run-them-against-real-distributed-systems-1o60</guid>
      <description>&lt;p&gt;When I started working on distributed systems, one of the most painful parts was always end-to-end testing. You have services in different languages, they talk through REST, Kafka, databases, and webhooks, and you need to verify that a full business flow actually works. Most tools either force you to write everything in code or become very flaky in CI.&lt;/p&gt;

&lt;p&gt;That’s why I built &lt;strong&gt;VouchFx&lt;/strong&gt; — a declarative end-to-end testing platform that lets you describe tests in simple YAML, while still running them against real containers with proper orchestration.&lt;/p&gt;

&lt;h3&gt;
  
  
  How VouchFx works
&lt;/h3&gt;

&lt;p&gt;The idea is quite simple but powerful. You write a test in &lt;code&gt;.e2e.yaml&lt;/code&gt;. VouchFx validates it, compiles it to real C# code (only once), and then executes it against containers that are started and managed properly.&lt;/p&gt;

&lt;p&gt;Here’s the flow:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feau8f4eb03k7i4fqn9am.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feau8f4eb03k7i4fqn9am.jpg" alt="vouchfx flow" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This approach gives you several advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tests are written in readable YAML&lt;/li&gt;
&lt;li&gt;You get the full power of C# when you need it (via &lt;code&gt;script.csharp&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Real containers are used (not mocks)&lt;/li&gt;
&lt;li&gt;The tool works with any language on the service side&lt;/li&gt;
&lt;li&gt;Memory is handled safely and CI exit codes are meaningful&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A simple example
&lt;/h3&gt;

&lt;p&gt;Here’s what a basic test can look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;simple-order-flow&lt;/span&gt;
  &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;smoke&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mycompany/orders-api:latest&lt;/span&gt;
    &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:16&lt;/span&gt;

&lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;create-order&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http.rest&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;POST&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://{api}/orders&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;customerId"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;42&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;amount"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;99.5&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;capture&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;orderId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$.id&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;verify-in-db&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;db-assert.postgres&lt;/span&gt;
    &lt;span class="na"&gt;connection&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;db&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SELECT status FROM orders WHERE id = {orderId}&lt;/span&gt;
    &lt;span class="na"&gt;expected&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CREATED"&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You describe what should happen. VouchFx takes care of starting the containers, waiting for them to be healthy, running the steps with retries, and collecting clear results.&lt;/p&gt;

&lt;h3&gt;
  
  
  When YAML is not enough
&lt;/h3&gt;

&lt;p&gt;Most of the time, writing tests in declarative YAML is enough and actually very pleasant. However, sometimes a test scenario becomes really complex — for example when you need custom logic, loops, or advanced calculations.&lt;/p&gt;

&lt;p&gt;In those cases you can use &lt;strong&gt;C# scripts directly&lt;/strong&gt;. VouchFx supports the &lt;code&gt;script.csharp&lt;/code&gt; step type, where you can write C# code inline or even load external &lt;code&gt;.csx&lt;/code&gt; files. This gives you the full power of the C# language when you need it, while the framework still handles container orchestration, resilience, variable capturing, and reporting.&lt;/p&gt;

&lt;p&gt;So you don’t have to choose between simple YAML and full code — you can mix both approaches in the same test suite.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why I built it this way
&lt;/h3&gt;

&lt;p&gt;I wanted something that feels natural to write, but still reliable when it runs in CI. Many testing tools either become too complex or produce flaky results because they don’t handle infrastructure properly.&lt;/p&gt;

&lt;p&gt;With VouchFx you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clear separation between &lt;strong&gt;Pass&lt;/strong&gt;, &lt;strong&gt;Fail&lt;/strong&gt;, &lt;strong&gt;Environment Error&lt;/strong&gt;, and &lt;strong&gt;Inconclusive&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Proper exit codes so your pipeline only breaks on real test failures&lt;/li&gt;
&lt;li&gt;Good reporting (terminal, HTML, JUnit)&lt;/li&gt;
&lt;li&gt;VSCode support with autocomplete and Test Explorer integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also works well in polyglot environments. Your services can be in Java, Python, Node.js, Go — VouchFx doesn’t care. It only cares about the seams between them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Honest comparison with other tools
&lt;/h3&gt;

&lt;p&gt;Here’s a comparison with some popular tools in this space. I tried to be honest about the strengths and weaknesses:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;VouchFx&lt;/th&gt;
&lt;th&gt;NBomber&lt;/th&gt;
&lt;th&gt;Testcontainers + xUnit&lt;/th&gt;
&lt;th&gt;Aspire.Hosting.Testing&lt;/th&gt;
&lt;th&gt;Reqnroll (SpecFlow)&lt;/th&gt;
&lt;th&gt;Karate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Main style&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Declarative YAML&lt;/td&gt;
&lt;td&gt;C# code&lt;/td&gt;
&lt;td&gt;C# code&lt;/td&gt;
&lt;td&gt;C# code&lt;/td&gt;
&lt;td&gt;Gherkin + C#&lt;/td&gt;
&lt;td&gt;Declarative (DSL)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Polyglot support&lt;/strong&gt; (any service language)&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;.NET only&lt;/td&gt;
&lt;td&gt;.NET only&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Real container orchestration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Built-in (Aspire + Testcontainers)&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CI integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ready-to-use templates (GitHub + GitLab)&lt;/td&gt;
&lt;td&gt;You build it yourself&lt;/td&gt;
&lt;td&gt;You build it yourself&lt;/td&gt;
&lt;td&gt;You build it yourself&lt;/td&gt;
&lt;td&gt;You build it yourself&lt;/td&gt;
&lt;td&gt;You build it yourself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exit code handling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clear (Fail / Env Error / Inconclusive)&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory safety &amp;amp; performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Verified (collectible ALC)&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Depends on your code&lt;/td&gt;
&lt;td&gt;Depends on your code&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;JVM-based&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Extensibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Provider SDK + Community hub&lt;/td&gt;
&lt;td&gt;Plugins&lt;/td&gt;
&lt;td&gt;Write your own&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Step definitions&lt;/td&gt;
&lt;td&gt;Custom steps (Java/Kotlin)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Polyglot distributed systems&lt;/td&gt;
&lt;td&gt;Load &amp;amp; performance testing&lt;/td&gt;
&lt;td&gt;.NET teams using containers&lt;/td&gt;
&lt;td&gt;.NET Aspire projects&lt;/td&gt;
&lt;td&gt;BDD-style .NET teams&lt;/td&gt;
&lt;td&gt;Teams comfortable with JVM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Quick summary of VouchFx advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strong focus on &lt;strong&gt;polyglot&lt;/strong&gt; systems (your services don’t need to be .NET)&lt;/li&gt;
&lt;li&gt;Much better &lt;strong&gt;CI reliability&lt;/strong&gt; thanks to proper exit codes and ready templates&lt;/li&gt;
&lt;li&gt;Declarative YAML makes tests easier to read and maintain for complex flows&lt;/li&gt;
&lt;li&gt;Built-in support for both simple YAML and powerful C# scripts when needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other tools can be better if you are doing heavy load testing (NBomber), pure BDD (Reqnroll), or if you are already deep in the Java ecosystem (Karate).&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting started
&lt;/h3&gt;

&lt;p&gt;Installation is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet tool &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--global&lt;/span&gt; vouchfx &lt;span class="nt"&gt;--prerelease&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you can run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vouchfx run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are also ready-to-use GitHub Actions and GitLab CI templates if you don’t want to set everything up yourself.&lt;/p&gt;

&lt;p&gt;You can find the full documentation and examples here:&lt;br&gt;&lt;br&gt;
&lt;a href="https://tomas-rampas.github.io/vouchfx/" rel="noopener noreferrer"&gt;https://tomas-rampas.github.io/vouchfx/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Would love your feedback
&lt;/h3&gt;

&lt;p&gt;VouchFx is still relatively new. I’ve been using it on my own projects and I think it solves some real pain points, but I would really like to hear from other people who do integration and end-to-end testing regularly.&lt;/p&gt;

&lt;p&gt;If you work with distributed systems and have 30–60 minutes, I would appreciate it if you could try it on one of your flows (or just look at the samples) and tell me what you think — what feels good, what’s confusing, or what’s missing.&lt;/p&gt;

&lt;p&gt;No pressure at all. Honest feedback is very valuable at this stage.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://tomas-rampas.github.io/vouchfx/" rel="noopener noreferrer"&gt;https://tomas-rampas.github.io/vouchfx/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Samples: &lt;a href="https://tomas-rampas.github.io/vouchfx-samples/" rel="noopener noreferrer"&gt;https://tomas-rampas.github.io/vouchfx-samples/&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>integrationtesting</category>
      <category>opensource</category>
      <category>automation</category>
      <category>vouchfx</category>
    </item>
    <item>
      <title>Integration testing</title>
      <dc:creator>Tomas Rampas</dc:creator>
      <pubDate>Thu, 16 Jul 2026 11:12:31 +0000</pubDate>
      <link>https://dev.to/tomasrampas/integration-testing-3nei</link>
      <guid>https://dev.to/tomasrampas/integration-testing-3nei</guid>
      <description></description>
    </item>
  </channel>
</rss>
