<?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: Momodu Kamara-Kolleh</title>
    <description>The latest articles on DEV Community by Momodu Kamara-Kolleh (@mkk2026).</description>
    <link>https://dev.to/mkk2026</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%2F4047379%2F956488f8-84d4-4f71-99e2-82f9de3e7367.jpg</url>
      <title>DEV Community: Momodu Kamara-Kolleh</title>
      <link>https://dev.to/mkk2026</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mkk2026"/>
    <language>en</language>
    <item>
      <title>Your compliance tool saying you're "95% ready" is a liability, not a feature</title>
      <dc:creator>Momodu Kamara-Kolleh</dc:creator>
      <pubDate>Wed, 07 Oct 2026 12:10:39 +0000</pubDate>
      <link>https://dev.to/mkk2026/your-compliance-tool-saying-youre-95-ready-is-a-liability-not-a-feature-5b2c</link>
      <guid>https://dev.to/mkk2026/your-compliance-tool-saying-youre-95-ready-is-a-liability-not-a-feature-5b2c</guid>
      <description>&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%2Fmlz8y2qytwmo57nz7i1i.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%2Fmlz8y2qytwmo57nz7i1i.jpg" alt=" " width="800" height="500"&gt;&lt;/a&gt;I've spent the last stretch building a SOC 2 readiness tool, and the most useful thing I learned has nothing to do with dashboards. It's about a quiet failure mode that kills deals — and why a lot of compliance tools are built to cause it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The failure mode
&lt;/h2&gt;

&lt;p&gt;Picture a seed-stage SaaS. They land a great enterprise lead. The lead's security team sends the inevitable email: &lt;em&gt;"Share your SOC 2 report, or your current readiness status."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The founder opens their shiny compliance tool. It says: &lt;strong&gt;"You're 95% compliant."&lt;/strong&gt; Great. They forward that.&lt;/p&gt;

&lt;p&gt;Then the security team asks one specific question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What's your access-review cadence, and how do you evidence it?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And the answer the founder trusts was &lt;strong&gt;generated, not grounded&lt;/strong&gt;. The model paraphrased a control it half-remembered and invented a definition that's subtly wrong. The reviewer — who reads these every week — catches it in about five seconds.&lt;/p&gt;

&lt;p&gt;Now the founder doesn't look 95% ready. They look like they don't understand their own posture. The deal stalls a quarter. Sometimes it dies.&lt;/p&gt;

&lt;p&gt;That "95%" wasn't a feature. It was a liability dressed up as reassurance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why LLM compliance tools do this
&lt;/h2&gt;

&lt;p&gt;LLMs are fluent and confident, and a compliance control is exactly the kind of precise, citeable text they paraphrase badly. Ask a general model "what does this control require?" and it will happily produce something that &lt;em&gt;sounds&lt;/em&gt; right. Most of the time nobody checks.&lt;/p&gt;

&lt;p&gt;But compliance has an adversarial reader built in: the buyer's security team. Their entire job is to catch the gap between what you claim and what you can evidence. An ungrounded, confident answer is the single easiest thing for them to flag.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix is boring: grounding
&lt;/h2&gt;

&lt;p&gt;The fix isn't a smarter model or a prettier dashboard. It's a rule:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every answer about a control must quote the real criterion, or say it doesn't have it. Never guess.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Concretely: every AI response is injected with the actual criterion text from the framework files on disk. The model's job is constrained — quote the source, or abstain. If the control isn't in the grounding set, the honest output is "I don't have that control's text," not a confident paraphrase.&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;control&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;frameworks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lookup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;control_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# real text, from disk
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;control&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&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;I don&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t have the criterion for &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;control_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# system prompt: answer ONLY from the provided criterion text;
# if the question goes beyond it, say so explicitly.
&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;respond&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grounding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It feels almost too simple. But "boring and correct" is exactly what you want in the one place where a confident mistake costs a customer their trust in you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters more than features
&lt;/h2&gt;

&lt;p&gt;Compliance tools love to compete on breadth — more integrations, more frameworks, more automation. Useful, but none of it is the thing a buyer's security team actually tests. What they test is whether your answers hold up under one specific question. An ungrounded tool fails the only exam that matters, no matter how many checkboxes it has.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest part
&lt;/h2&gt;

&lt;p&gt;A readiness tool is &lt;strong&gt;not&lt;/strong&gt; an audit. It doesn't make you SOC 2 certified — a licensed CPA firm still performs the examination and issues the report. Any tool (mine included) that implies otherwise is doing the same overpromising I just described.&lt;/p&gt;

&lt;p&gt;I'm building this solo, from Freetown, Sierra Leone. It's called Attestlane and it's live if you want to poke at it (use fake company data — don't connect real systems just to test). But I wrote this because the grounding lesson holds whether you use my tool, a competitor's, or a spreadsheet:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If your compliance answers can't cite their source, don't send them to a security team.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you've been through a first SOC 2, I'd genuinely like to hear the part that actually hurt.&lt;/p&gt;

</description>
      <category>soc2</category>
      <category>security</category>
      <category>ai</category>
      <category>startup</category>
    </item>
    <item>
      <title>I built a discovery layer for AI agents because mine kept getting lost</title>
      <dc:creator>Momodu Kamara-Kolleh</dc:creator>
      <pubDate>Sat, 25 Jul 2026 23:54:41 +0000</pubDate>
      <link>https://dev.to/mkk2026/i-built-a-discovery-layer-for-ai-agents-because-mine-kept-getting-lost-5bjo</link>
      <guid>https://dev.to/mkk2026/i-built-a-discovery-layer-for-ai-agents-because-mine-kept-getting-lost-5bjo</guid>
      <description>&lt;p&gt;Everyone's building AI agents right now. Almost nobody's building the boring layer underneath them: how do agents find each other?&lt;/p&gt;

&lt;p&gt;I hit this in my own stack. I run a few MCP servers one for search, one for my database, one exposing my product's API. Their addresses lived in a JSON config I edited by hand. When I added a fourth, the file got messy. When one went down, I found out because something downstream broke and I debugged backwards. There was no single source of truth for what agents existed or whether they were alive.&lt;/p&gt;

&lt;p&gt;MCP gave agents a common language. There's still no discovery layer. That felt like having HTTP without a service registry.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;agentreg&lt;/strong&gt;. It's a self-hosted service registry for agents one Go binary:&lt;/p&gt;

&lt;p&gt;agentctl serve &amp;amp; &lt;br&gt;
agentctl register search-agent -c search -e &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;&lt;br&gt;
agentctl find search  # discover by capability, not a hardcoded URL&lt;br&gt;
agentctl list         # everything, with live health&lt;/p&gt;

&lt;p&gt;It health-checks every registered agent on a heartbeat, so a dead one shows up as &lt;code&gt;unhealthy&lt;/code&gt; before it takes something down with it. That single feature has already saved me a debugging session.&lt;/p&gt;

&lt;p&gt;A fair question I keep getting: "isn't this just service discovery, like Consul?" Close, but the query is different. Consul answers &lt;em&gt;where is this service?&lt;/em&gt; a host and port. Agents need &lt;em&gt;what can this thing do, is it healthy, and can I trust it?&lt;/em&gt; That's capability-first, and it's why the registry is agent-shaped rather&lt;br&gt;
than micro service-shaped.&lt;/p&gt;

&lt;p&gt;I'm being upfront about the stage: this is v0.1, I built it solo, and it does discovery + health and nothing more yet. No federation, no auth, no trust verification — though the code has a pluggable verifier seam for exactly that later. It's MIT, self-hosted, no cloud, no account.&lt;/p&gt;

&lt;p&gt;Install:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install mkk2026/tap/agentreg
Repo: https://github.com/mkk2026/agentreg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If you run more than a couple of MCP servers, I'd genuinely like to know whether this solves a real annoyance for you or whether I'm a year early. The most useful thing you can tell me is whether you're still running it a week after you try it. That's the only feedback that counts.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>devops</category>
      <category>automation</category>
      <category>reviews</category>
    </item>
  </channel>
</rss>
