<?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: Cédric Magne</title>
    <description>The latest articles on DEV Community by Cédric Magne (@cedricmagne).</description>
    <link>https://dev.to/cedricmagne</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%2F1835545%2F98a3eb6c-d5fd-4287-8328-a04dbfd577fd.jpeg</url>
      <title>DEV Community: Cédric Magne</title>
      <link>https://dev.to/cedricmagne</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cedricmagne"/>
    <language>en</language>
    <item>
      <title>Why I built Rness: governing AI coding agents across repositories</title>
      <dc:creator>Cédric Magne</dc:creator>
      <pubDate>Wed, 07 Oct 2026 19:37:50 +0000</pubDate>
      <link>https://dev.to/cedricmagne/why-i-built-rness-governing-ai-coding-agents-across-repositories-5c15</link>
      <guid>https://dev.to/cedricmagne/why-i-built-rness-governing-ai-coding-agents-across-repositories-5c15</guid>
      <description>&lt;p&gt;I build with coding agents every day: Claude Code most of the time, Codex for a second opinion, Cursor or Devin in the editor. My GitHub organization has five repositories. An agent can know how a related repository works, if the configuration of the one it is in tells it. That is extra configuration in every repository, and keeping all of it in sync by hand is heavy.&lt;/p&gt;

&lt;p&gt;Governing those agents from one place, across every repository, was the hard part. I started Rness to solve it. This is what it is, what it already does in my own organization, and where it is going.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every agent has its own picture of your organization
&lt;/h2&gt;

&lt;p&gt;Look at a team that codes with agents. One repository has a &lt;code&gt;CLAUDE.md&lt;/code&gt;, an &lt;code&gt;AGENTS.md&lt;/code&gt; and a &lt;code&gt;.cursor/rules&lt;/code&gt; folder. The next has a &lt;code&gt;CLAUDE.md&lt;/code&gt; copied from the first months ago and edited since. A third has &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt; and nothing else. The architecture decision the team took last month sits in a document no agent opens.&lt;/p&gt;

&lt;p&gt;Each agent works from the file in front of it, so each one carries its own picture of the organization, and the pictures disagree. The more code the agents write, the more that disagreement lands in the code.&lt;/p&gt;

&lt;h2&gt;
  
  
  A governance layer above the agents
&lt;/h2&gt;

&lt;p&gt;Models provide the intelligence and agents do the work. Rness is the layer above them that holds what the organization has decided: its standards, its architecture decisions and the reasons behind them, the specifications and plans in progress. Agents execute; Rness governs.&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%2Fhqetreq1aa7fyi7o2eyl.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%2Fhqetreq1aa7fyi7o2eyl.png" alt="Three layers: Rness on top, with the standards, ADRs, specs and plans decided once; the coding agents (Claude Code, Codex, Cursor), which read them through AGENTS.md at every session; and the repositories, whose code the agents change." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It rests on three ideas.&lt;/p&gt;

&lt;p&gt;Everything lives in one place. The standards, decisions (ADRs), specifications and plans are Markdown files in one repository, &lt;code&gt;.rness&lt;/code&gt;, cloned next to the others, with a &lt;code&gt;rness.json&lt;/code&gt; that says which rules apply where. A rule is written once.&lt;/p&gt;

&lt;p&gt;Rness writes where the agents already look. Claude Code reads &lt;code&gt;CLAUDE.md&lt;/code&gt;; Codex, Cursor and GitHub Copilot read &lt;code&gt;AGENTS.md&lt;/code&gt;. Rness writes into those files, so every developer keeps their agent, their editor and their workflow. Governance is centralized and development stays where it is.&lt;/p&gt;

&lt;p&gt;Decisions carry their reasons and their status. An ADR goes from &lt;code&gt;Proposed&lt;/code&gt; to &lt;code&gt;Accepted&lt;/code&gt;, a plan from &lt;code&gt;In progress&lt;/code&gt; to &lt;code&gt;Completed&lt;/code&gt; once its proofs pass. An agent in any repository can find what was decided, why, and what is under way.&lt;/p&gt;

&lt;h2&gt;
  
  
  One rule, one file
&lt;/h2&gt;

&lt;p&gt;Setting a rule for every agent of an organization is a count of files. Claude Code reads &lt;code&gt;CLAUDE.md&lt;/code&gt;; Codex, Cursor and GitHub Copilot read &lt;code&gt;AGENTS.md&lt;/code&gt;. A rule kept by hand goes into at least two files per repository, and more once &lt;code&gt;.cursor/rules&lt;/code&gt; and &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt; are in the mix. Three repositories mean six files or more, forty mean eighty or more. When the rule changes, the count starts again, and nothing tells you which copy 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvsgba2gbxvzc3fmrqzwc.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%2Fvsgba2gbxvzc3fmrqzwc.png" alt="Without Rness, three repositories hold seven agent files kept by hand. With Rness, the rule lives in one file of .rness, and rness sync keeps the CLAUDE.md and AGENTS.md of every repository current; the agents still read their own files." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With Rness the rule is written once, in a standard under &lt;code&gt;.rness/&lt;/code&gt;. &lt;code&gt;rness sync&lt;/code&gt; rewrites the generated block of every repository from it, and each &lt;code&gt;CLAUDE.md&lt;/code&gt; already points to that block. Each repository gets one small commit, and &lt;code&gt;rness sync --check&lt;/code&gt; in CI fails any repository whose block falls behind. When I decided that nothing I publish should carry an em dash, it took three lines in one file and one command, and every repository of my workspace had the rule.&lt;/p&gt;

&lt;h2&gt;
  
  
  One request, three repositories, one release
&lt;/h2&gt;

&lt;p&gt;Here is what that looks like on a real change. I wanted to rename a command of the CLI, &lt;code&gt;rness pulse&lt;/code&gt;, to &lt;code&gt;rness board&lt;/code&gt;. The old name had come to mean three different things, and &lt;code&gt;rness pulse sync&lt;/code&gt; sat next to &lt;code&gt;rness sync&lt;/code&gt; with nothing to tell them apart.&lt;/p&gt;

&lt;p&gt;I asked for it once, as a specification in &lt;code&gt;.rness&lt;/code&gt;, and the agent turned it into a plan. The agent works from the workspace, where the CLI, the documentation and the website sit side by side under the same rules, so it saw everything the rename touched. In under half an hour it committed the new command and its tests in the CLI, then the renamed pages in the documentation. It also updated the website's &lt;code&gt;llms.txt&lt;/code&gt;, the file other AI agents read to learn how to use the tool. About two hours after the specification, the new version was on npm.&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%2F287t4fagjxd47n3qwj8m.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%2F287t4fagjxd47n3qwj8m.png" alt="A spec and a plan in .rness lead to commits in three repositories of one workspace in under 30 minutes, each to what it changes: the CLI to npm as @rness/cli, the docs to rness.dev/docs, the website to the llms.txt of rness.dev. About two hours from the spec to npm." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nothing in that list was a separate request. A rename in the CLI is also a change to the docs and to what the site tells other agents, and the agent knew it because it could see all three.&lt;/p&gt;

&lt;h2&gt;
  
  
  One decision, checked everywhere
&lt;/h2&gt;

&lt;p&gt;The second case is a decision. My CLI required Node 24. One day a Claude Code session in one of my own projects, which runs Node 22, opened with a single line: &lt;code&gt;rness needs Node 24 or newer (running v22.22.0)&lt;/code&gt;. The hook that loads the workspace's context had refused to start, so Rness was switched off in that project, and that line was the only sign.&lt;/p&gt;

&lt;p&gt;Lowering the floor to Node 22.17 took a few lines of code. The decision reached much further: the version guard, the &lt;code&gt;engines&lt;/code&gt; of three packages, the CI matrix, the CLI's README, the documentation and the website. I recorded it as an ADR, with a plan that gave each change a proof. Minutes after I accepted the ADR, the CLI, the documentation and the website each had a commit citing it.&lt;/p&gt;

&lt;p&gt;Then &lt;code&gt;/rness:plan check&lt;/code&gt; ran every proof again before closing the plan, and a wider search found two lines the first pass had missed. Both were on the website: its &lt;code&gt;llms.txt&lt;/code&gt; still said "Node 24 or later", and so did its structured data. They were fixed the same evening, and only then did the plan close. Two days later the CLI's dependency rule moved to the new floor, to prefer what Node 22.17 already ships, and &lt;code&gt;rness sync&lt;/code&gt; wrote it into the CLI's &lt;code&gt;AGENTS.md&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the rules reach every agent
&lt;/h2&gt;

&lt;p&gt;A workspace is one folder per person: the governance repository and a clone of each repository, side by side.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;your-org&amp;gt;/
├── AGENTS.md          the root block, for a session started here (CLAUDE.md beside it)
├── .rness/            the governance repository
│   ├── standards/     the rules
│   ├── adr/           the architecture decisions, and why
│   ├── specs/         what to build
│   ├── plans/         how, task by task, each with its proof
│   └── rness.json     the repositories, and which rules apply where
└── org/               one clone per repository
    ├── web/
    │   ├── AGENTS.md  the generated block, between its markers
    │   └── CLAUDE.md  points to AGENTS.md
    ├── api/
    └── contracts/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;rness sync&lt;/code&gt; writes the rules that apply into a generated block of each repository's &lt;code&gt;AGENTS.md&lt;/code&gt;, with a &lt;code&gt;CLAUDE.md&lt;/code&gt; that points to it. Here is the top of the block in my landing page's repository:&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="c"&gt;&amp;lt;!-- BEGIN rness --&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- rness · scope: web · contract: 1 · hash: 69ac389a2b6b · generated: run `rness sync`, never edit inside this block --&amp;gt;&lt;/span&gt;
...
&lt;span class="c"&gt;&amp;lt;!-- rness: standards/architecture.md --&amp;gt;&lt;/span&gt;
&lt;span class="gh"&gt;# Architecture and repository strategy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each standard names its file in &lt;code&gt;.rness&lt;/code&gt;, so a reader knows where to change it. Claude Code also gets hooks: one loads the workspace's context when a session starts, another refuses an edit inside the generated block. MCP clients get the same context, read-only, from &lt;code&gt;rness mcp&lt;/code&gt;. I have checked Claude Code, Codex, Cursor and GitHub Copilot, and any agent that reads &lt;code&gt;AGENTS.md&lt;/code&gt; gets the rules the day it reads the file.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rness board push&lt;/code&gt; puts every decision, specification and plan on a GitHub Project, one issue each, and marks the card an agent is working on while it works. I open the board and see what the agents are doing, and why.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it is going
&lt;/h2&gt;

&lt;p&gt;What ships today governs what agents know and what has been decided. The next layer governs what they may do: policies with a scope, from the organization down to a directory or a file pattern, so the right rule applies at the right level; a view of the whole organization that shows which repository drifted from them; GitLab and Bitbucket beside GitHub. All of it is specified and none of it is built. The landing page marks it "not shipped yet", and it keeps that mark until it ships.&lt;/p&gt;

&lt;p&gt;Some things are by design. Rness reads Markdown and writes Markdown. It runs no model, and your code and context stay in your repositories and on your Git provider. While it is at 0.x, commands and the &lt;code&gt;rness.json&lt;/code&gt; contract can change between minor versions, and each release says what did.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built with Rness, in the open
&lt;/h2&gt;

&lt;p&gt;Rness is built with Rness. Its repositories are members of a Rness workspace and their &lt;code&gt;AGENTS.md&lt;/code&gt; blocks are generated. Its &lt;code&gt;.rness&lt;/code&gt; holds more than 10 ADRs, 30 specifications and 40 plans, the rename and the Node decision among them. The launch runs there too: this article is a card with a status and a checklist on a GitHub Project.&lt;/p&gt;

&lt;p&gt;The code is MIT-licensed on GitHub. Issues labelled &lt;code&gt;good first issue&lt;/code&gt; are a way in, and the Discussions take ideas and questions. If your organization codes with agents across several repositories, the problems you hit are the ones I want to work on next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm create rness
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It asks for your GitHub organization, or makes a workspace without one with &lt;code&gt;--blank&lt;/code&gt;. &lt;code&gt;rness sync&lt;/code&gt; writes the blocks and &lt;code&gt;rness status&lt;/code&gt; shows every decision, specification and plan. The guide is at &lt;a href="https://rness.dev/docs?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_content=why-rness" rel="noopener noreferrer"&gt;rness.dev/docs&lt;/a&gt; and the code at &lt;a href="https://github.com/rness-dev/rness" rel="noopener noreferrer"&gt;github.com/rness-dev/rness&lt;/a&gt;. Star the repository to follow where &lt;a href="https://rness.dev?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_content=why-rness" rel="noopener noreferrer"&gt;Rness&lt;/a&gt; goes.&lt;/p&gt;

&lt;p&gt;What has your organization decided that your agents still don't know?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
