<?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: André Bremer</title>
    <description>The latest articles on DEV Community by André Bremer (@andr_bremer_81c8990da062).</description>
    <link>https://dev.to/andr_bremer_81c8990da062</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%2F3591967%2Fdaa1b922-43a7-4be9-9e5e-d254d7a5a8c9.jpg</url>
      <title>DEV Community: André Bremer</title>
      <link>https://dev.to/andr_bremer_81c8990da062</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/andr_bremer_81c8990da062"/>
    <language>en</language>
    <item>
      <title>Developing with Claude Code? You should be using Checkmate!</title>
      <dc:creator>André Bremer</dc:creator>
      <pubDate>Thu, 29 Jan 2026 04:37:29 +0000</pubDate>
      <link>https://dev.to/andr_bremer_81c8990da062/developing-with-claude-code-you-should-be-using-checkmate-4nae</link>
      <guid>https://dev.to/andr_bremer_81c8990da062/developing-with-claude-code-you-should-be-using-checkmate-4nae</guid>
      <description>&lt;p&gt;You completed a long Claude Code session and are ready to commit everything. But wait! You still need to run all the pre-commit checks (linting, type-checking, formatting). Now you spend many iterations getting everything fixed, and it gets messy—you're also dealing with potential regressions from refactoring.&lt;/p&gt;

&lt;p&gt;Well, no longer. Checkmate immediately checks Claude Code's work after each file modification. It uses your existing toolchain and configuration, forcing Claude Code to assess and correct issues immediately, so they don't accumulate, resulting in clean commits.&lt;/p&gt;

&lt;p&gt;This simple tool is now a key foundation of my workflow and completely eliminated time-consuming and token-wasting clean-up work, which sometimes could take multiple iterations lasting minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it Works
&lt;/h2&gt;

&lt;p&gt;Checkmate is a simple plugin that executes a script after each file modification. The script determines whether the modified file path matches the checkmate configuration in your project and runs all configured tools in order (for example: format check, linting, then type checking). If there are failures, the script reports a "block" back to Claude Code with all the diagnostics included, causing Claude Code to fix the issue immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;Setup is trivial. First install the plugin:&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="c"&gt;# From marketplace&lt;/span&gt;
/plugin marketplace add rcrsr/claude-plugins
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;checkmate@rcrsr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then configure your project with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/checkmate:checkmate-init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The initialization skill will explore your codebase, identify your stack, and create a configuration for your project with all the tools correctly set up. It will even work with multi-lingual monorepos, automatically detecting your language and folder-specific environments:&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.amazonaws.com%2Fuploads%2Farticles%2F8bvdx6vxdiw0ag3tl36c.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.amazonaws.com%2Fuploads%2Farticles%2F8bvdx6vxdiw0ag3tl36c.png" alt="Checkmate Installation" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During the flow, you can customize or add to your setup if anything was missed.&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.amazonaws.com%2Fuploads%2Farticles%2Fdjygeczsokl0esaea4g4.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.amazonaws.com%2Fuploads%2Farticles%2Fdjygeczsokl0esaea4g4.png" alt="Checkmate Setup Confirmation" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The configuration will be written to &lt;code&gt;.claude/checkmate.json&lt;/code&gt;. You can always edit and adjust the configuration directly or use &lt;code&gt;/checkmate:checkmate-refresh&lt;/code&gt; to apply any changes to your environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;Now, every time Claude Code modifies your files, Checkmate will run any configured tests (or ignore excluded or skipped files) and report back any issues that Claude Code will fix in the next turn:&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.amazonaws.com%2Fuploads%2Farticles%2Felgka9odrkwr58hojf7d.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.amazonaws.com%2Fuploads%2Farticles%2Felgka9odrkwr58hojf7d.png" alt="Checkmate Validation" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's pretty much it! Your commits will be substantially cleaner after your next long session.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advanced Configuration
&lt;/h2&gt;

&lt;p&gt;Checkmate is smart about discovering your toolchain. During initialization, it scans your project for configuration files and package manifests, then sets up the appropriate checks automatically. A TypeScript project with Prettier gets &lt;code&gt;tsc&lt;/code&gt; and &lt;code&gt;prettier&lt;/code&gt; checks. A Python project using Ruff gets &lt;code&gt;ruff check&lt;/code&gt; and &lt;code&gt;ruff format&lt;/code&gt;. It even handles polyglot monorepos—detecting that your &lt;code&gt;backend/&lt;/code&gt; folder needs Python linting while &lt;code&gt;frontend/&lt;/code&gt; needs ESLint.&lt;/p&gt;

&lt;p&gt;Beyond the common tools (ESLint, TypeScript, Prettier, Biome, Ruff, shellcheck, and others), you can add your own checks. Checkmate understands several output formats out of the box, or you can supply a custom regex for parsing errors. I prefer my custom checks to output JSONL—one JSON object per line with &lt;code&gt;file&lt;/code&gt;, &lt;code&gt;line&lt;/code&gt;, and &lt;code&gt;message&lt;/code&gt; fields—which Checkmate parses natively.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reviewer Subagents
&lt;/h3&gt;

&lt;p&gt;If you use specialized subagents for implementation, you can configure reviewer subagents that trigger automatically after an agent completes. For example, you could have a &lt;code&gt;code-reviewer&lt;/code&gt; triggered after a matching &lt;code&gt;engineer&lt;/code&gt; task.&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.amazonaws.com%2Fuploads%2Farticles%2F3xbvmdh8ausexfn3z9wq.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.amazonaws.com%2Fuploads%2Farticles%2F3xbvmdh8ausexfn3z9wq.png" alt="Checkmate Agent Trigger" width="800" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try it on your next session and watch commit cleanups disappear! See the &lt;a href="https://github.com/rcrsr/checkmate" rel="noopener noreferrer"&gt;Checkmate&lt;/a&gt;  GitHub repo for complete documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why am I getting "hook returned blocking errors" twice?
&lt;/h3&gt;

&lt;p&gt;This is a Claude Code quirk. When a hook returns blocking errors, the message appears twice even though the hook was only invoked once. Just ignore the duplicate message.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why not just use Claude Code's built-in LSP plugins?
&lt;/h3&gt;

&lt;p&gt;The LSP plugins work the same, but they may not use your toolchain or your configuration. They are also limited to just type-checking. Checkmate provides a framework for customizations and extensions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why can't Checkmate apply fixes with "--fix"?
&lt;/h3&gt;

&lt;p&gt;This would mess with Claude Code's internal state and also introduce unintended side effects. Sometimes, Claude Code may add code non-atomically, like adding a new import before adding the code that uses it. Auto-fixing would remove the import before Claude Code has the opportunity to add the new code.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>agents</category>
      <category>llm</category>
    </item>
    <item>
      <title>How to Make Claude Code Work Reliably in Large Codebases</title>
      <dc:creator>André Bremer</dc:creator>
      <pubDate>Sat, 01 Nov 2025 00:23:03 +0000</pubDate>
      <link>https://dev.to/andr_bremer_81c8990da062/keeping-your-claude-code-subagents-aligned-1dlh</link>
      <guid>https://dev.to/andr_bremer_81c8990da062/keeping-your-claude-code-subagents-aligned-1dlh</guid>
      <description>&lt;p&gt;Claude Code writes &lt;code&gt;Optional[str]&lt;/code&gt;. You want &lt;code&gt;str | None&lt;/code&gt;. It catches exceptions with bare &lt;code&gt;except Exception:&lt;/code&gt;. You require specific exception types. It uses &lt;code&gt;List[str]&lt;/code&gt; from typing. You've standardized on built-in generics.&lt;/p&gt;

&lt;p&gt;Claude Code is trained on millions of codebases with millions of conventions. Your codebase has one set of conventions: yours. And Claude Code doesn't know them unless you tell it.&lt;/p&gt;

&lt;p&gt;The obvious solution is &lt;code&gt;CLAUDE.md&lt;/code&gt;. Document your standards there, and Claude Code follows them. This works until your standards hit a few dozen lines. Beyond that, problems emerge. At 400 lines of Python conventions, architecture rules, and testing patterns, Claude Code starts missing details buried in the middle. Critical rules get overlooked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alignment Challenges at Scale
&lt;/h2&gt;

&lt;p&gt;It only gets worse in large codebases and monorepos: multiple apps, packages, infrastructure, services, each with their own conventions. Your backend has Python standards. Your frontend has TypeScript conventions. Your data pipeline has its own architecture rules. You could organize these into folders with dedicated &lt;code&gt;CLAUDE.md&lt;/code&gt; files, but domains don't always map cleanly to directories. A service might touch three domains. A shared library might have different rules than the applications consuming it. Standards sprawl across files, and Claude Code loads context it doesn't need while missing context it does.&lt;/p&gt;

&lt;p&gt;The problem compounds when you start using subagents. These are specialized Claude Code instances you spawn for specific tasks. A common scenario is to use an engineer agent for implementation, a code reviewer for validation, and maybe a dedicated architect for design decisions. Each subagent runs in its own context, which is precisely why they're useful: they stay focused on their task with dedicated context and without the baggage of the entire conversation.&lt;/p&gt;

&lt;p&gt;But that isolation creates coordination challenges. In a multi-domain codebase, you might have a core-engineer and core-reviewer for your shared libraries, a backend-engineer and backend-reviewer for your services, an infra-engineer for your deployment code. Each domain has its own conventions. Each engineer-reviewer pair needs to enforce the same standards so the engineer produces code that passes the reviewer's checks, and both need the right standards for their domain.&lt;/p&gt;

&lt;p&gt;Keeping these agents in sync manually is a maintenance nightmare. Update a Python convention and you're touching six agent files. Miss one, and your backend-reviewer enforces rules your backend-engineer doesn't know about.&lt;/p&gt;

&lt;p&gt;The fix isn't better documentation. It's compartmentalized rules that agents fetch on demand. Each agent gets exactly the standards it needs for its task, nothing more. Need-to-know context, guaranteed consistency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Provide the Right Context When It's Needed
&lt;/h2&gt;

&lt;p&gt;What if we could provide all the relevant context dynamically for each agent? Not stuffed into &lt;code&gt;CLAUDE.md&lt;/code&gt;, not duplicated across files, but injected at the moment the agent starts, based on what that specific agent needs.&lt;/p&gt;

&lt;p&gt;Claude Code makes this possible through hooks. Hooks are scripts that run automatically at specific points in Claude Code's lifecycle: before a tool executes, after a file changes, or when a subagent spawns. They let you intercept and augment Claude Code's behavior without modifying your prompts.&lt;/p&gt;

&lt;p&gt;Here's how it works: when a subagent spawns, a hook scans the agent definition file for references to your standards. It finds those references, resolves them, and injects the relevant sections directly into the subagent's prompt. The agent receives its task instructions along with the exact policies it needs to follow. Think of it like handing an employee their assignment along with the relevant sections of the company handbook.&lt;/p&gt;

&lt;p&gt;This works well because the context is strongly associated with the task. We don't have to rely on the agent discovering weakly associated system prompt or memory content.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unambiguous Reference Notation
&lt;/h2&gt;

&lt;p&gt;Here's what that looks like in practice. I came up with a notation system that unambiguously references sections in my standards documents. An agent definition includes a Required Policies section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Required Policies&lt;/span&gt;

["§PY", "§CORE"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before the agent starts, a hook invokes a policy server that scans the agent file for these special references. It resolves them against a set of well-maintained policy files, pulls the specific content, and appends it to the prompt starting the agent.&lt;/p&gt;

&lt;p&gt;To align subagents, just have them reference the same policies. My engineer and code reviewer both include &lt;code&gt;["§PY", "§CORE"]&lt;/code&gt;. When the hook resolves these references, both agents receive identical policy content. No duplication, no drift, no conflicting interpretations.&lt;/p&gt;

&lt;p&gt;The policy server handles the mechanical work: fetch the sections, resolve any cross-references, return exactly what's needed. Request &lt;code&gt;§PY.2&lt;/code&gt; (Runtime Safety), get that section plus any sections it references.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Concrete Example
&lt;/h2&gt;

&lt;p&gt;Policy files live in &lt;code&gt;.claude/policies/&lt;/code&gt;. They're regular markdown with sections marked using &lt;code&gt;§&lt;/code&gt; notation. The system scans all files in the folder, so you can organize standards however you like and files can reference each other. Here's a simplified example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## {§PY.1} Python 3.14 Type Standards&lt;/span&gt;

All Python code MUST use Python 3.14 type syntax.

&lt;span class="gu"&gt;### {§PY.1.1} Built-in Generic Types&lt;/span&gt;

Use built-in generic types. NEVER import &lt;span class="sb"&gt;`List`&lt;/span&gt;, &lt;span class="sb"&gt;`Dict`&lt;/span&gt; from &lt;span class="sb"&gt;`typing`&lt;/span&gt;.

&lt;span class="gu"&gt;### {§PY.1.2} Union Types with Pipe Operator&lt;/span&gt;

Use &lt;span class="sb"&gt;`|`&lt;/span&gt; operator for union types. NEVER import &lt;span class="sb"&gt;`Optional`&lt;/span&gt; or &lt;span class="sb"&gt;`Union`&lt;/span&gt;.

&lt;span class="gu"&gt;## {§PY.2} Runtime Safety&lt;/span&gt;

&lt;span class="gu"&gt;### {§PY.2.1} Specific Exception Handling&lt;/span&gt;

Catch specific exceptions. NEVER use bare &lt;span class="sb"&gt;`except Exception:`&lt;/span&gt;.
See §PY.1 for type syntax in exception handlers.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For guidance on writing effective policies (structure, examples, what good and bad look like), see the &lt;a href="https://github.com/rcrsr/claude-plugins/blob/main/policies/policies/policies-meta.md" rel="noopener noreferrer"&gt;§META policy standards&lt;/a&gt;, which is itself a good example of how policy files should be structured.&lt;/p&gt;

&lt;p&gt;With the policy file in place, subagents can now reference sections by notation. You can cherry-pick what you need, or pull in entire sections or documents.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;§PY&lt;/code&gt; fetches all Python policies (every &lt;code&gt;§PY.*&lt;/code&gt; section)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;§PY.1&lt;/code&gt; fetches the entire Type Standards section with all subsections&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;§PY.2.1&lt;/code&gt; fetches just the Specific Exception Handling subsection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cross-references resolve automatically. When &lt;code&gt;§PY.2.1&lt;/code&gt; mentions &lt;code&gt;§PY.1&lt;/code&gt;, both get included.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;Setup is straightforward. Install the policies plugin:&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 rcrsr/claude-plugins
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;policies@rcrsr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Store your policy files in &lt;code&gt;.claude/policies/&lt;/code&gt; using § notation. Add a "Required Policies" section to your agent files with the references you need. Policies auto-inject when the agent runs.&lt;/p&gt;

&lt;p&gt;The plugin also includes commands for generating policies from existing code patterns (&lt;code&gt;/policies:create-policies&lt;/code&gt;) and auditing them against quality standards (&lt;code&gt;/policies:review-policies&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;For advanced configuration or alternative integration scenarios, see the &lt;a href="https://github.com/rcrsr/mcp-policy-server" rel="noopener noreferrer"&gt;mcp-policy-server&lt;/a&gt; project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Beats Semantic Search
&lt;/h2&gt;

&lt;p&gt;This isn't RAG. There's no "find relevant content" step, no vector embeddings, no semantic matching.&lt;/p&gt;

&lt;p&gt;Request &lt;code&gt;§PY.1.1&lt;/code&gt;, get &lt;code&gt;§PY.1.1&lt;/code&gt;. Exact lookup. Same input always produces the same output.&lt;/p&gt;

&lt;p&gt;Your subagents fetch &lt;code&gt;§PY.2.1&lt;/code&gt; and get identical content about exception handling. Not "similar content about exceptions," but the exact same text. That's what creates alignment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Subagent alignment isn't a prompt engineering problem. It's a shared context problem.&lt;/p&gt;

&lt;p&gt;When subagents share the same policy sections, they enforce the same standards. When cross-references resolve automatically, nothing gets missed.&lt;/p&gt;

&lt;p&gt;Same policies. Same standards. Predictable behavior.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Explore more:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rcrsr/claude-plugins/tree/main/policies" rel="noopener noreferrer"&gt;Policies Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rcrsr/mcp-policy-server" rel="noopener noreferrer"&gt;MCP Policy Server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This article was originally published October 2025 and revised January 2026 to reflect the evolution from MCP server integration to the hooks-based policies plugin, with updated examples focused on software engineering workflows.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>agents</category>
      <category>automation</category>
      <category>subagents</category>
    </item>
  </channel>
</rss>
