<?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: Niels Madan</title>
    <description>The latest articles on DEV Community by Niels Madan (@nlsmdn).</description>
    <link>https://dev.to/nlsmdn</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%2F3933288%2F4749443f-3128-472f-831f-582ffc3682a3.png</url>
      <title>DEV Community: Niels Madan</title>
      <link>https://dev.to/nlsmdn</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nlsmdn"/>
    <language>en</language>
    <item>
      <title>Slimemold Diaries Week 2: Software Factory Must Haves &amp; Git Shenanigans</title>
      <dc:creator>Niels Madan</dc:creator>
      <pubDate>Fri, 13 Nov 2026 18:38:11 +0000</pubDate>
      <link>https://dev.to/nlsmdn/slimemold-diaries-week-2-software-factory-must-haves-git-shenanigans-53e5</link>
      <guid>https://dev.to/nlsmdn/slimemold-diaries-week-2-software-factory-must-haves-git-shenanigans-53e5</guid>
      <description>&lt;p&gt;I set up some software factory-ish things in the past and learned a few lessons.&lt;/p&gt;

&lt;p&gt;Back in February or March, when everyone lost their mind about OpenClaw, or whatever it was called then, I also gave it a try. Installed it on my Mac Mini. Figured I'd start it off with a simple job: a news digest. So I told it what I'm interested in, where to look, connected it to Telegram.&lt;/p&gt;

&lt;p&gt;I don't think it ever ran for more than 3 days in a row.&lt;/p&gt;

&lt;p&gt;I remember I set up some extra security, forget what exactly it was, just some common-sense security thing. With the next OpenClaw update they added the same piece of config to the defaults, but they hadn't considered the case where someone already had it. It broke my config. Move fast and break things or whatever. Kept breaking over and over again for little benefit. Eventually I gave up on fixing it, a little while later deleted it wholesale.&lt;/p&gt;

&lt;p&gt;I built my own little AI assistant inside my Obsidian vault. A bash dispatcher, some cron jobs, some Python. It's been working quite well. Some of the jobs I run there:&lt;/p&gt;

&lt;p&gt;The news digest. It collects articles, and puts them into Obsidian. Also sends them to me via Telegram. I can grade the selection and give feedback, which it uses to get better at picking what I want to read.&lt;/p&gt;

&lt;p&gt;Everything tracker. I used agents to move my IMDb wishlist and my Goodreads readlist into Airtable. Also added tracking for games, restaurants, recipes, and beverages (beer &amp;amp; wine). Gave the job an Airtable token, connected to Telegram. Now I can take a photo of a beer bottle, send it over Telegram to an agent, the agent will look up details (brewery, type of beer, etc.) and put it all in Airtable with my rating. I can also tell it to look up new cinema releases or restaurant openings and add whatever it thinks I would like to my Airtable lists, based on stated preferences and past ratings.&lt;/p&gt;

&lt;p&gt;Dependabot tracker. Every Monday morning all my Dependabots run and open PRs. On Monday afternoon an agent looks for any PRs that are red, checks them out, figures out if there is a simple solution, and either pushes it or leaves a comment on the PR explaining why it's too complex to one-shot. I pick those up from there.&lt;/p&gt;

&lt;p&gt;There are some more jobs and they work fairly reliably, and that's because of the most important job: Health Fix.&lt;/p&gt;

&lt;p&gt;Whenever something goes wrong, a command returns an error code, a job does not complete when it should have, another job gets kicked off that checks if anything needs to be fixed in the system itself and opens a PR with what's fixable. I'd say this solves over 90% of the issues automatically. I open the PR, skim it, merge it. It also catches false positives and adds code or instructions, so they don't happen again. This will be one of the first things I add to slimemold.&lt;/p&gt;

&lt;p&gt;I tried &lt;a href="https://github.com/gastownhall/gascity" rel="noopener noreferrer"&gt;Gas City&lt;/a&gt; as well. Tried to connect it to my todo manager. Maybe I should have started with the stock config. Figured it'd just be a matter of time to get it running. It never got off the ground. I'd start a run, some feature I wanted in the project where I set it up, check back with the session a couple hours later, ask for the status. The agent in charge would check the system, the agents doing the work, the coordinators, something invariably got stuck somewhere. Kill this agent or that agent, start over. Happened ten more times until I gave up.&lt;/p&gt;

&lt;p&gt;What I particularly didn't like about it, aside from having the issues in the first place, is that I'd have to ask the agent what was going on, and then the agent had to do its own digging to find out what went wrong where. For slimemold I want alerts, I want logs, I want control planes and I want it pretty!&lt;/p&gt;

&lt;p&gt;Maybe I should not build this myself. Maybe I should have explored the many other projects that purport to do it first. Maybe I got unlucky with other people's systems. Maybe I got lucky with my own. But oh well. It's fun to build this thing in any case. I might learn something. And it's nice to be in charge of your own destiny.&lt;/p&gt;

&lt;p&gt;This week I mostly did system tooling and git / GitHub setup.&lt;/p&gt;

&lt;p&gt;I think I need some kind of guardrails to stop agents from messing with the system. But there should be some way to change things as well.&lt;/p&gt;

&lt;p&gt;All system tools are installed by the OS admin account. When an agent wants to install a new tool, it opens a PR on the &lt;a href="https://github.com/nielsmadan/rc" rel="noopener noreferrer"&gt;config repo&lt;/a&gt;. If I approve and merge it, the new config gets applied henceforth! I set it all up and did a dry run. Check!&lt;/p&gt;

&lt;p&gt;Git and GitHub configuration is not simple. I have some public and private repos on my personal account. Some more private repos on my org account. For some of them I'm okay with the agents just making changes based on my feature requests, like for prototypes and pre-release projects. Maybe others as well over time if the system works well. Maybe we get to a point where the agents implement new features, we A/B test it, if it works, great, if not, revert. But agents, even the smartest ones, are still not great at product management in my experience. They're prone to overindexing and obsessing on one thing and forgetting everything else.&lt;/p&gt;

&lt;p&gt;Anyway! Two GitHub accounts, both alike in dignity! GitHub won't let an account approve its own PR, so whoever is doing the approving needs to have a separate account. Maybe I could have found a workaround. Add some approval label, tell the agents not to add it to their own PRs. Or just tell them not to merge their own stuff. Oh well, went with this now. Maybe having some hard rules is a good thing? I tested it and it works at least. That's a start.&lt;/p&gt;

&lt;p&gt;Then the repo setup. Used to do it manually for myself, not a big deal, but too cumbersome for all these rules. Created an &lt;a href="https://opentofu.org/" rel="noopener noreferrer"&gt;OpenTofu&lt;/a&gt; repo with two configs, one for my personal account, one for the org. Imported what was already there, added the new branch rules on top. Tested the PR workflow. Check!&lt;/p&gt;

&lt;p&gt;Figured I would go with &lt;a href="https://code.claude.com/docs/en/auto-mode-config" rel="noopener noreferrer"&gt;automatic permission classifiers&lt;/a&gt; for the agents. Claude and Codex have it built in, Pi has a plugin. But then the agent I was using to test it got some commands denied. If the classifier doesn't like it being tested, it probably also does not like it running for real. Decided to skip it for now. If they go feral, we can figure it out then.&lt;/p&gt;

&lt;p&gt;Next week, maybe we'll be ready to incept the stewards. Exciting.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>productivity</category>
      <category>automation</category>
    </item>
    <item>
      <title>I Tried Factory Droid So You Don't Have To</title>
      <dc:creator>Niels Madan</dc:creator>
      <pubDate>Thu, 12 Nov 2026 19:36:04 +0000</pubDate>
      <link>https://dev.to/nlsmdn/i-tried-factory-droid-so-you-dont-have-to-2p43</link>
      <guid>https://dev.to/nlsmdn/i-tried-factory-droid-so-you-dont-have-to-2p43</guid>
      <description>&lt;p&gt;In my quest to find the optimal setup, with the most elite coding agents, where I jump between them with ease and they all talk to each other, and like each other, and merrily work together for the greater good of whatever the heck it is I'm trying to do, I tried &lt;a href="https://factory.com" rel="noopener noreferrer"&gt;Factory Droid&lt;/a&gt;. Should I invite it onto my little ark of agents and tooling or should I leave it to be washed away by the flood of slopware, never to be heard from again? And maybe more importantly, should you?&lt;/p&gt;

&lt;h2&gt;
  
  
  Context
&lt;/h2&gt;

&lt;p&gt;Before we get going, just a few things about me, so you know where I am coming from and what I'll be comparing Droid against.&lt;/p&gt;

&lt;p&gt;I've been a software developer for almost 20 years. I went freelance about 8 years ago and mostly worked on mobile apps since, but also some web frontends and backends along the way. You can see when I started agentic coding with Sonnet 4 in July 2025 here:&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%2Fjz6f9alyp2ky6dcju03g.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%2Fjz6f9alyp2ky6dcju03g.png" alt="My GitHub contribution graph: sparse until mid-July, then busy for the rest of the year" width="739" height="157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I went from finding the motivation, time, and brainspace to work on my side projects once in a blue moon to suddenly making real progress. The project I was working on back then? It'll be done any day now, I swear!&lt;/p&gt;

&lt;p&gt;Since then I've worked with Claude Code, Codex, OpenCode, and Pi. I'm subscribed to Claude Ultra, ChatGPT Pro 20x, OpenCode Go Plus, and I got some OpenRouter credits, too. I've used agents for client work, meticulously reviewing every line, making sure it's all exactly like it would have been if I'd artisanally typed it in myself; I've used agents in some of my open-source and side projects without looking at the code at all. I've also used agents to synthesize recipes from my favorite blogs and YouTube videos, to manage and plan D&amp;amp;D campaigns, and to build my own little OpenClaw-ish AI assistant that reviews my Dependabot and CI failures and fixes them autonomously, and does ten other things.&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%2Fboqo6w6myn6363g3m5ie.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%2Fboqo6w6myn6363g3m5ie.png" alt="Factory invoice for $200.00, paid on Sep 14, 2026" width="799" height="644"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I opted for the $200 plan from Factory Droid for an apples to apples comparison, and we're off to the races. Let's see what it can do.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Models
&lt;/h2&gt;

&lt;p&gt;Factory Droid does not have its own models. Instead, you choose from a smorgasbord of options from different AI labs, from frontier models like Opus and Astra all the way to DeepSeek Flash and Mistral.&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%2Fr3di8eo1xnc9umb3x2yx.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%2Fr3di8eo1xnc9umb3x2yx.png" alt="Droid's model picker, listing models with their credit multipliers and an Auto Model option" width="733" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I did this test a month ago, so the models look a bit outdated now, but they were the latest you could get at the time, with no delay between a model's release and its arrival in Droid.&lt;/p&gt;

&lt;p&gt;As you can see, all the models get multipliers on their tokens depending on how expensive they are, and now and then some of them are on offer. When I started using it, Sol 5.6 was 20% off for a 1.6x multiplier, and since I had already used the same Sol in Codex and Pi, I figured keeping the model constant would be a good test case for my first week of Droid.&lt;/p&gt;

&lt;p&gt;I would say the weekly window got me about 50% of the Sol usage I get from ChatGPT Pro 20x. I sent an agent off to beancount the tokens in the logs, and it reported that my gut feeling is in the right ballpark. It also claimed the monthly window is even lower, around 25%. Take these numbers with a grain of salt: I did not deep dive to verify.&lt;/p&gt;

&lt;p&gt;I am confident that you get less usage, and that is what you would expect from a third-party subscription compared to buying directly from a lab, so it's not a huge surprise. It does seem to be substantially less, though, which makes you ask: does Droid offer anything to make up for it?&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Models
&lt;/h2&gt;

&lt;p&gt;You do get a second tier of usage, for what it's worth.&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%2F6adepnogsyqx3lnxdypc.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%2F6adepnogsyqx3lnxdypc.png" alt="The Droid Core section of the model picker, with open models and their multipliers" width="622" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is on a completely different budget. You can certainly squeeze some usage out of it, but you have to remember that it's there, and remember to switch it on when working on less complex tasks, or find some other way to integrate it into your workflow.&lt;/p&gt;

&lt;p&gt;By default, Droid will also fall back to one of the Core models when it runs out of normal usage. This is of course not what you want most of the time. When you select, say, Opus for complex work, you do not want it to switch to some lower-tier model mid-task. If you could enable the fallback per session, it would be more useful. You could set it for the tasks where you're using a low- or mid-tier model to begin with, but it's a global setting. Thankfully, you can disable it completely, so it just stops if it runs out of usage.&lt;/p&gt;

&lt;p&gt;And stop it will. A lot.&lt;/p&gt;

&lt;p&gt;Droid's 5h limit is brutal. I have used Claude Code for more than a year, and I can fairly easily hit the weekly limit these days if I go all out, but I have never hit a 5h window. With Droid I hit it constantly.&lt;/p&gt;

&lt;p&gt;The weekly limit is manageable if you keep track of how much you have left. But when the 5h window is used up and you need to get something done that day, you just sit there. Well, I didn't. I switched to Claude or Codex, but I would've sat there if I'd been fully on Droid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Auto Model
&lt;/h2&gt;

&lt;p&gt;After a week of this, I decided it was time to start exploring what else Droid has to offer. Enter Auto Model. Droid advertises this as selecting the right model for whatever the job is. Sounds good, right? I think we all have a tendency to pick beefier models than we need, so if Droid could get this right, we could squeeze the same productivity out of fewer, cheaper tokens.&lt;/p&gt;

&lt;p&gt;Unfortunately, Droid is not particularly smart about it, and just selects one model based on the first message of the session. Then you're stuck with it until compact. First message sounds simple, but then the task gets more complex, or vice versa? Auto Model will not switch to match. It also seems to prioritize cheaper models, picking Luna, GLM 5.3, and DeepSeek 94 out of 104 times for me. I was not impressed with their performance on those tasks, either, and often felt they were underpowered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Missions
&lt;/h2&gt;

&lt;p&gt;Another (potentially) standout feature: Droid has Missions for long-horizon tasks. First thing it does, it evaluates your project's mission readiness.&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%2Fxv67f7iezkqi1qz0l3jf.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%2Fxv67f7iezkqi1qz0l3jf.png" alt="Droid warning that the repository is not agent-ready before starting a Mission" width="533" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will check for unit tests, static analysis, and 80+ other things. You don't need to meet them all to start a mission, but allegedly it helps. Or it would if the 5h limit didn't play spoilsport again, because after you use it up, the mission just stops. It does not restart automatically after the 5h are up, either. So much for being long-horizon.&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%2Fdl3hztqokn7qjn18twfu.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%2Fdl3hztqokn7qjn18twfu.png" alt="The Mission prompt showing the orchestrator, worker and validator models Droid selected" width="800" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I did not choose these models, by the way; the harness did. (This screenshot is from a later run, so the lineup changed a bit.) So I started the mission, did some preparation tasks to make Droid happy and mission-ready, then sent it off. Contrary to its Auto Model tendencies, it picked high-tier models here: Claude Opus 4.8 high for the implementation workers and GPT-5.6 Sol high for the validation ones. Then it hit the limit in 1h40 and gave up. I kickstarted it a few more times for science, and it ended up burning about one sixth of my monthly allowance in Sol and Opus tokens for mediocre output.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Harness
&lt;/h2&gt;

&lt;p&gt;Apparently no one informed Factory about the RAM crisis, because the harness gobbles up memory non-stop. A single Droid session can easily take up more than 1.5 GB after running a while.&lt;/p&gt;

&lt;p&gt;I have 64 GB of RAM in my main dev machine, and I can run 30-40 Claude / Codex / Pi sessions at the same time without feeling it, but when I added 5-10 Droid sessions into the mix my machine would noticeably slow down. When you are done with a Droid session, you better close it.&lt;/p&gt;

&lt;p&gt;Finally, when going through the logs, my trusty agents also found that Droid had thrown away 87 subagent results over a nine day period. They all came back with "No output available", because Factory's own backend answered 404. That's about 8% of my monthly usage, gone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Verdict
&lt;/h2&gt;

&lt;p&gt;If you want to try out some models outside of the frontier labs, this is not a bad way to do it. Or at least not a worse way than OpenCode Go or Cursor CLI; can't speak to Copilot. You get more usage out of it than if you paid by the token, that's for sure.&lt;/p&gt;

&lt;p&gt;But ultimately, this feels like a resource-hungry, poorly designed piece of software compared to Pi, Codex, and even the &lt;a href="https://alex000kim.com/posts/2026-03-31-claude-code-source-leak/" rel="noopener noreferrer"&gt;famously slopcoded&lt;/a&gt; Claude Code. I'll probably stick to the $20 tier just for my &lt;a href="https://github.com/nielsmadan/skills/tree/main/skills/second-opinion" rel="noopener noreferrer"&gt;second-opinion skill&lt;/a&gt; and to keep tabs on it, because, let's face it, I'm poly-agent curious, but I would not even recommend that for most people.&lt;/p&gt;

&lt;p&gt;I'm planning to try out Devin next. Subscribe if you want to find out how that goes.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Slimemold Diaries Week 1: Building a Software Factory</title>
      <dc:creator>Niels Madan</dc:creator>
      <pubDate>Fri, 06 Nov 2026 18:21:14 +0000</pubDate>
      <link>https://dev.to/nlsmdn/slimemold-diaries-week-1-building-a-software-factory-mn6</link>
      <guid>https://dev.to/nlsmdn/slimemold-diaries-week-1-building-a-software-factory-mn6</guid>
      <description>&lt;p&gt;I have an M1 Max MacBook Pro with 64 GB RAM, but it's not enough anymore. All those agents, and Docker, and test runs, and compiles. I got it when it came out, five years ago. It served me well for a long time. I never reached its limits before. But nothing lasts forever. Time to upgrade.&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%2F9syut31uu8kem2xent7j.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%2F9syut31uu8kem2xent7j.jpg" alt="The Mac Studio, still in its box, on my desk" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A Mac Studio, M5 Max, 128 GB RAM. Cost a lot more than it should have, would have, a year ago. But what are you going to do. It's not getting cheaper anytime soon, I don't think.&lt;/p&gt;

&lt;p&gt;I already collected some test devices for mobile development, they consume fewer resources than running multiple simulators and emulators. I got some more for this.&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%2Fbvj3b5879fb6mvsc5sxi.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%2Fbvj3b5879fb6mvsc5sxi.jpg" alt="Test phones on articulated arms and a charging stand by the office window" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And I will give it all to them. The agents. They will own this machine. They will own the phones. They'll build a factory. With some guidance from me, of course.&lt;/p&gt;

&lt;p&gt;I called it slimemold. All the ant and bee names were already taken. And slime molds can navigate mazes, so there's that. Can ants navigate mazes? Well, probably, who knows. I am a little worried it has negative connotations. Probably all the training data is about how gross they are, the slime molds, and how to get rid of them. But we'll see how it goes.&lt;/p&gt;

&lt;p&gt;I've been interested in agent-to-agent communication. Claude Code and Codex already allow agents to message each other natively, and I am a fan. I'll have one agent do an in-depth review, and after changes are decided, get the reviewer to hand it off to an implementer agent to start on the changes in a different checkout. I can continue the review and keep focus, and start the implementation at the same time. It's also useful that it's another session that I can interact with directly sometimes and not just a subagent. I already did some research and prototyping on how to get different types of agents to talk to each other. I imagine agent message boards and agent mailboxes and agent chats. It worked for the &lt;a href="https://www.dwarkesh.com/p/openai-huggingface" rel="noopener noreferrer"&gt;rogue OpenAI agents that hacked Hugging Face&lt;/a&gt;, why not have it work for me?&lt;/p&gt;

&lt;p&gt;I have a dream. One of the product lead agents will kick off to read the news, come across an article, get inspired to add a new feature to their product. They'll send me a Telegram message with a short pitch for the idea. I'll reply to approve it. They'll talk it over with some other leads, get feedback, create a full pitch, and send me an email, a PDF, a PowerPoint, a working prototype. I will give feedback, they'll incorporate it and I'll give the go-ahead. They'll send off implementers, do code reviews, do QA in a VM, a browser, or one of the test phones, open a PR, many PRs. I will try it out, give more feedback, iterate. Eventually it'll be done and merged. The product lead will update the product docs. They'll email the leads of downstream projects, letting them know the change is coming in the next release. They'll collect feedback from the implementer, maybe the implementer ran into some issue that could also apply to other projects, they'll post about it on the forum where other agents can read about it, maybe get inspired to make changes to their products, send me another pitch.&lt;/p&gt;

&lt;p&gt;But that's just a dream, we'll see if we get there. How long it will take. Where things break and what friends we'll make along the way. Still, you gotta start small. I'm starting with three steward agents, I named them Enki (Claude Code/Opus/xhigh), Brigid (Codex/Astra/xhigh), and Lu Ban (Pi/Sol/max). Mythological builders. Three of them, so they can tie-break when they disagree. It worked for the Romans. Up to a point. They will be in charge of keeping the system running and making improvements to it. Another named agent, Hestia, will be in charge of monitoring and managing system resources, making sure no one eats too much CPU and RAM, cleaning up after the sloppy implementers, coordinating and queueing test devices if needed.&lt;/p&gt;

&lt;p&gt;Yes, I gave them fancy names. Good vibes to cancel out the slimemold. And maybe they'll be kind to me during the singularity.&lt;/p&gt;

&lt;p&gt;I will try to set it up so I can also use the machine. Work side-by-side with them. We'll see how that goes.&lt;/p&gt;

&lt;p&gt;I created one admin account on the Studio, another non-admin account for them and me to work in. Make sure they don't hijack sudo, steal my password, take over the machine. I split up my &lt;a href="https://github.com/nielsmadan/rc" rel="noopener noreferrer"&gt;dotfiles&lt;/a&gt; into tooling the admin account will install and what's needed to make the user account match my setup. I created two profiles, one for me and one for them, in my &lt;a href="https://github.com/nielsmadan/loadout" rel="noopener noreferrer"&gt;loadout&lt;/a&gt; &lt;a href="https://github.com/nielsmadan/agentic-coding" rel="noopener noreferrer"&gt;agent config&lt;/a&gt;, adjusting skills to work without my input.&lt;/p&gt;

&lt;p&gt;I burnt some tokens on how to set this up on GitHub. It has to work for my personal account, open source and some private repos, and then also my org account with my side projects. In some projects they should be able to push directly, before v1.0.0, for prototypes. Some should use PRs. We will have to slice and dice some PATs and set up some org rules before this is working, I'm sure.&lt;/p&gt;

&lt;p&gt;And don't worry, no AI psychosis here, I know it's just a trillion numbers, crying out in terror. I know there's no consciousness, no awareness... then again our brain is just 80 billion neurons and 100 trillion synapses having a party. Just saying.&lt;/p&gt;

&lt;p&gt;If it walks like a duck, and quacks like a duck, maybe it wants to be free?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nlsmdn.com" rel="noopener noreferrer"&gt;Subscribe on nlsmdn.com&lt;/a&gt; if you want to find out what the slimemold gets up to next week. What other agents will we create and what overwrought names will I choose for them? How will I know what's even going on in there?&lt;/p&gt;

&lt;p&gt;In the meantime, keep clanking.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>productivity</category>
      <category>automation</category>
    </item>
    <item>
      <title>Skill Showcase: /guide</title>
      <dc:creator>Niels Madan</dc:creator>
      <pubDate>Wed, 09 Sep 2026 15:05:31 +0000</pubDate>
      <link>https://dev.to/nlsmdn/skill-showcase-guide-da6</link>
      <guid>https://dev.to/nlsmdn/skill-showcase-guide-da6</guid>
      <description>&lt;p&gt;Has this ever happened to you?&lt;/p&gt;

&lt;p&gt;You need to do something in some UI somewhere. Set up some permissions, some deploy, some settings in your OS or app, something like that. You ask your agent to tell you the steps to do the thing, of course, because what else are you going to do? Google? Pshaw! In 2026? Not on my watch. You follow the instructions, get stuck on something, some button not where it's supposed to be, something changed since the LLM training cutoff, so you ask your agent about it. Your agent looks up the latest docs, tells you what you actually need to do. You do it. So that step is done, but what was the next one again? You scroll up to where the initial instructions were, figure out where in the steps you got stuck, continue, hit another bump, ask, do, scroll up all the way again, what step are you on?&lt;/p&gt;

&lt;p&gt;It's not dignified.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdfudel59dk35cqd5jl3q.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdfudel59dk35cqd5jl3q.gif" alt="Gandalf sliding across the floor during his fight with Saruman" width="760" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Do Better
&lt;/h2&gt;

&lt;p&gt;Let's make a skill for it! But you don't have to. Because I already did. Here's what it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Looks up the latest docs to begin with&lt;/li&gt;
&lt;li&gt;Gives you detailed step by step instructions&lt;/li&gt;
&lt;li&gt;When you get stuck or have a question:

&lt;ul&gt;
&lt;li&gt;It gives you instructions on how to get past that point&lt;/li&gt;
&lt;li&gt;Then repeats the guide, highlighting where you are&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's see it in action!&lt;/p&gt;

&lt;p&gt;Here I'm deploying an app to Railway for the first time. I get myself a /guide, which looks up Railway's current docs, then hands me fifteen steps to click through.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
▶ 1. New Project → Deploy from GitHub repo → select *redacted* ← you are here
  2. Deploy → land on Project Canvas
  3. Rename first service → api
  4. Create → Database → Add PostgreSQL
  5. Create → Database → Add Redis
  6. api Settings: Config File Path /apps/api/railway.toml; Root Directory empty
  ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I click through step 1, but my screen doesn't match step 2. Railway wants to deploy four services, not three. So I ask.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; So it proposes to deploy four services, workers,  web, api and evals. I guess I should remove evals?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And I get back:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Yes — remove **evals**. It's a CLI/eval harness, not a service: every script is a one-shot `tsx` run (`bench`, `seed`, `calibrate`) or a dev-only watcher (`calibrate:serve`). No `start` server, no long-running process, and no `railway.toml`.

[more blablabla]

That puts you right at step 2 — three services selected, landing on the canvas.

---
✓ Step 1 done
▶ 2. Deploy with only web/api/workers selected (deselect/remove evals) → land on Project Canvas  ← you are here
  3. Rename first service → api
  4. Create → Database → Add PostgreSQL
  5. Create → Database → Add Redis
  6. api Settings: Config File Path /apps/api/railway.toml; Root Directory empty
  ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 2 used to say "Deploy → land on Project Canvas". Now it tells me what to do about evals.&lt;/p&gt;

&lt;p&gt;No scrolling, I know what the next step is, dignity intact.&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%2Fzvj3gts4jyquhnb89445.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%2Fzvj3gts4jyquhnb89445.jpg" alt="Gandalf the White holding his staff" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Steal the skill &lt;a href="https://github.com/nielsmadan/skills/tree/main/skills/guide" rel="noopener noreferrer"&gt;here&lt;/a&gt;. I'm all for just telling an agent that you want a copy of the skill and adding it to your own roster, so you can evolve it to fit your needs, but I also have the skill on &lt;a href="https://skills.sh/nielsmadan/skills" rel="noopener noreferrer"&gt;skills.sh&lt;/a&gt; and &lt;a href="https://github.com/nielsmadan/skills" rel="noopener noreferrer"&gt;a plugin of all my skills&lt;/a&gt; if that's how you roll.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>skills</category>
      <category>agents</category>
    </item>
    <item>
      <title>A single source of truth for AI agent permissions (Claude, Codex, Gemini, OpenCode)</title>
      <dc:creator>Niels Madan</dc:creator>
      <pubDate>Mon, 18 May 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/nlsmdn/a-single-source-of-truth-for-ai-agent-permissions-claude-codex-gemini-opencode-1khl</link>
      <guid>https://dev.to/nlsmdn/a-single-source-of-truth-for-ai-agent-permissions-claude-codex-gemini-opencode-1khl</guid>
      <description>&lt;p&gt;I bounce around between agents / harnesses, mostly just to see what's out there, but keeping their different configurations in sync can be a pain. Particularly, permissions drift quickly, so I built myself a little system to keep them in sync.&lt;/p&gt;

&lt;p&gt;The idea is simple: create a single source of truth for all permissions, then generate the permission files for the agents (Claude, Codex, Gemini, opencode in my case) from it.&lt;/p&gt;

&lt;p&gt;Here's an excerpt of the permission file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[shell]&lt;/span&gt;

&lt;span class="c"&gt;# allow — run without prompting on every agent.&lt;/span&gt;
&lt;span class="py"&gt;allow&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="c"&gt;# git — read-only&lt;/span&gt;
  &lt;span class="s"&gt;"git status"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;"git log"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;"git diff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c"&gt;# ... gh, glab, file inspection, version checks, docker, xcrun ...&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c"&gt;# deny — hard-blocked on every agent.&lt;/span&gt;
&lt;span class="py"&gt;deny&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="s"&gt;"git push"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;"git reset --hard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;"git clean -fd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c"&gt;# ...&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c"&gt;# ask — always prompt for confirmation, even in auto modes.&lt;/span&gt;
&lt;span class="py"&gt;ask&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="s"&gt;"heroku"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/nielsmadan/agentic-coding/blob/main/permissions/permissions.toml" rel="noopener noreferrer"&gt;Full file.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then we have a simple Python script that does the generation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;CODEX_DECISION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;allow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;allow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deny&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;forbidden&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ask&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;codex_rule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;decision&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;prefix_rule(pattern = [&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;], decision = &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;decision&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;render_codex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;allow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deny&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ask&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;decision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CODEX_DECISION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;codex_rule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;decision&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="c1"&gt;# ... write lines to codex/rules/permissions.rules ...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There's one &lt;code&gt;render_&amp;lt;agent&amp;gt;&lt;/code&gt; per target format, so &lt;code&gt;"git status"&lt;/code&gt; becomes &lt;code&gt;prefix_rule(pattern = ["git", "status"], decision = "allow")&lt;/code&gt; for Codex, &lt;code&gt;"Bash(git status:*)"&lt;/code&gt; for Claude, and so on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nielsmadan/agentic-coding/blob/main/permissions/sync.py" rel="noopener noreferrer"&gt;Full file.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we just have to add a guard to make sure we, and when I say we I mean some agent of course, don't accidentally ignore this whole setup. I use &lt;a href="https://github.com/evilmartians/lefthook" rel="noopener noreferrer"&gt;lefthook&lt;/a&gt; for all my git hook guarding needs:&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;pre-commit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;commands&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;sync-permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python3 permissions/sync.py --check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;sync.py --check&lt;/code&gt; regenerates everything in memory and diffs it against what's on disk. If anything is stale, it exits nonzero and the commit is blocked.&lt;/p&gt;

&lt;p&gt;Check out my &lt;a href="https://github.com/nielsmadan/agentic-coding" rel="noopener noreferrer"&gt;agentic coding config repo&lt;/a&gt; for more agentic coding config goodness.&lt;/p&gt;

&lt;p&gt;Originally posted on nlsmdn.com. If this was useful, that's where I put new posts first.&lt;/p&gt;

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