<?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>Forem: Ken W Alger</title>
    <description>The latest articles on Forem by Ken W Alger (@kenwalger).</description>
    <link>https://forem.com/kenwalger</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%2F15734%2F22d0195e-9fce-4d80-9ae2-3bb416bf8d6f.jpg</url>
      <title>Forem: Ken W Alger</title>
      <link>https://forem.com/kenwalger</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/kenwalger"/>
    <language>en</language>
    <item>
      <title>Who Audits the Auditors? Building an LLM-as-a-Judge for Agentic Reliability</title>
      <dc:creator>Ken W Alger</dc:creator>
      <pubDate>Thu, 16 Apr 2026 16:12:31 +0000</pubDate>
      <link>https://forem.com/kenwalger/who-audits-the-auditors-building-an-llm-as-a-judge-for-agentic-reliability-5d7</link>
      <guid>https://forem.com/kenwalger/who-audits-the-auditors-building-an-llm-as-a-judge-for-agentic-reliability-5d7</guid>
      <description>&lt;p&gt;We’ve built a powerful Forensic Team. They can find books, analyze metadata, and spot discrepancies using MCP.&lt;/p&gt;

&lt;p&gt;But in the enterprise, 'it seems to work' isn't a metric. If an agent misidentifies a $50,000 first edition, the liability is real.&lt;/p&gt;

&lt;p&gt;Today, we move from &lt;em&gt;Subjective Trust&lt;/em&gt; to &lt;em&gt;Quantitative Reliability&lt;/em&gt;. We are building &lt;strong&gt;The Judge&lt;/strong&gt;—a high-reasoning evaluator that audits our Forensic Team against a 'Golden Dataset' of ground-truth facts.&lt;/p&gt;

&lt;h3&gt;Before you Begin&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt; You should have an existing agentic workflow (see my &lt;a href="https://www.kenwalger.com/blog/ai/mcp-usb-c-moment-ai-architecture/" rel="noopener noreferrer"&gt;MCP Forensic Series&lt;/a&gt;) and a high-reasoning model (Claude 3.5 Opus/GPT-4o) to act as the Judge.&lt;/p&gt;

&lt;h2&gt;1. The "Golden Dataset"&lt;/h2&gt;

&lt;p&gt;Before we can grade the agents, we need an Answer Key. We’re creating &lt;code&gt;tests/golden_dataset.json&lt;/code&gt;. This file contains the "Ground Truth"—scenarios where we know there are errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Entry:&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
"test_id": "TC-001",
"input": "The Great Gatsby, 1925",
"expected_finding": "Page count mismatch: Observed 218, Standard 210",
"severity": "high"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;blockquote&gt;
  &lt;strong&gt;Director's Note&lt;/strong&gt;: In an enterprise setting, "Reliability" is the precursor to "Permission". You will not get the budget to scale agents until you can prove they won't hallucinate $50k errors. This framework provides the data you need for that internal sell.
&lt;/blockquote&gt;

&lt;h2&gt;2. The Judge's Rubric&lt;/h2&gt;

&lt;p&gt;A good Judge needs a rubric. We aren't just looking for "Yes/No." We want to grade on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Precision:&lt;/strong&gt; Did it find only the real errors?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recall:&lt;/strong&gt; Did it find all the real errors?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reasoning:&lt;/strong&gt; Did it explain why it flagged the record?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;3. Refactoring for Resilience&lt;/h2&gt;

&lt;p&gt;Before building the Judge, we had to address a common "Senior-level" trap: hardcoding agent logic. Based on architectural reviews, we moved our system prompts from the Python client into a dedicated &lt;code&gt;config/prompts.yaml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This isn't just about clean code; it’s about Observability. By decoupling the "Instructions" from the "Execution," we can now A/B test different prompt versions against the Judge to see which one yields the highest accuracy for specific models.&lt;/p&gt;

&lt;h2&gt;4. The Implementation: The Evaluation Loop&lt;/h2&gt;

&lt;p&gt;We’ve added &lt;code&gt;evaluator.py&lt;/code&gt; to &lt;a href="https://github.com/kenwalger/mcp-forensic-analyzer" rel="noopener noreferrer"&gt;the repo&lt;/a&gt;. It doesn't just run the agents; it monitors their "vital signs."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Error Transparency:&lt;/strong&gt; We replaced "swallowed" exceptions with structured logging. If a provider fails, the system logs the incident for diagnosis instead of failing silently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Handshake:&lt;/strong&gt; The loop runs the Forensic Team, collects their logs, and submits the whole package to a high-reasoning Judge Agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;The Evaluator-Optimizer Blueprint&lt;/h3&gt;

&lt;p&gt;This diagram represents our move from "Does the code run?" to &lt;strong&gt;Does the intelligence meet the quality bar?"&lt;/strong&gt; This closed-loop system is required before we can start the fiscal optimization of choosing smaller models to handle simpler tasks.&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%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fuploads%2F2026%2F03%2Fai-agent-reliability-evaluator-optimizer-loop-diagram-822x1024.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%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fuploads%2F2026%2F03%2Fai-agent-reliability-evaluator-optimizer-loop-diagram-822x1024.png" alt="Architectural diagram of an AI Evaluator-Optimizer loop. It shows a Golden Dataset feeding into an Agent Execution layer, which then passes outputs and logs to a Judge Agent for scoring against a rubric. The final Reliability Report provides a feedback loop for prompt tuning and iterative improvement." width="800" height="997"&gt;&lt;/a&gt; &lt;/p&gt;
The Evaluator-Optimizer Loop-Moving from manual vibe-checks to automated, quantitative reliability scoring.



&lt;h2&gt;Director-Level Insight: The "Accuracy vs. Cost" Curve&lt;/h2&gt;

&lt;blockquote&gt;
  As a Director, I don't just care about "cost per token." I care about Defensibility. If a forensic audit is challenged, I need to show a historical accuracy rating. By implementing this Evaluator, we move from "Vibe-checking" to a Quantitative Reliability Score. This allows us to set a "Minimum Quality Bar" for deployment. If a model update or a prompt change drops our accuracy by 2%, the Judge blocks the deployment.
&lt;/blockquote&gt;

&lt;h2&gt;The Production-Grade AI Series&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Post 1:&lt;/strong&gt; The Judge Agent — &lt;em&gt;You are here&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post 2:&lt;/strong&gt; The Accountant (Cognitive Budgeting &amp;amp; Model Routing) — &lt;em&gt;Coming Soon&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post 3:&lt;/strong&gt; The Guardian (Human-in-the-Loop Handshakes) — &lt;em&gt;Coming Soon&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Looking for the foundation? Check out my previous series: &lt;a href="https://www.kenwalger.com/blog/ai/mcp-usb-c-moment-ai-architecture/" rel="noopener noreferrer"&gt;The Zero-Glue AI Mesh with MCP&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>testing</category>
      <category>python</category>
    </item>
    <item>
      <title>5.4-Cyber and the Death of the Static CI/CD Pipeline</title>
      <dc:creator>Ken W Alger</dc:creator>
      <pubDate>Wed, 15 Apr 2026 17:17:27 +0000</pubDate>
      <link>https://forem.com/kenwalger/54-cyber-and-the-death-of-the-static-cicd-pipeline-ma</link>
      <guid>https://forem.com/kenwalger/54-cyber-and-the-death-of-the-static-cicd-pipeline-ma</guid>
      <description>&lt;p&gt;Today’s &lt;a href="https://openai.com/index/scaling-trusted-access-for-cyber-defense/" rel="noopener noreferrer"&gt;announcement&lt;/a&gt; of &lt;strong&gt;OpenAI 5.4-Cyber&lt;/strong&gt; isn’t just another incremental model update. It is the sounding of the death knell for the "Static" CI/CD pipeline. If you are still relying on a sequence of YAML-defined steps and basic SAST/DAST scans, your security posture just became an open door.&lt;/p&gt;

&lt;h2&gt;
  
  
  The End of Security Through Obscurity
&lt;/h2&gt;

&lt;p&gt;The headline feature of 5.4-Cyber is its unprecedented capability in &lt;strong&gt;binary reverse engineering&lt;/strong&gt;. Historically, compiled code offered a "speed bump" for attackers. By lowering the refusal boundaries for authorized defenders, OpenAI has effectively weaponized the defense. But there’s a catch: the delta between a patch and an exploit has now shrunk to near-zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "Shift Left" is No Longer Enough
&lt;/h2&gt;

&lt;p&gt;We’ve been told to "shift left" for a decade. But 5.4-Cyber proves that static analysis is a knife in a gunfight. When an AI can deconstruct your build in seconds, you need more than a linter. You need &lt;strong&gt;Continuous Hardening&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The 'Senior Developer' of 2026 isn't the one who writes the most secure code; it's the one who orchestrates the most aggressive AI red-teaming agent in their deployment pipeline."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Introducing Agentic Gatekeeping
&lt;/h2&gt;

&lt;p&gt;The future isn't CI/CD; it’s &lt;strong&gt;AI/AD (Autonomous Defense)&lt;/strong&gt;. Your pipeline should no longer be a series of "if/then" statements. It must become a battleground. Every Pull Request should be met by an adversarial agent powered by models like 5.4-Cyber that actively attempts to exploit the new code before the 'Merge' button is even enabled.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Trusted Access Paradox
&lt;/h2&gt;

&lt;p&gt;OpenAI is gating these tools behind "Trusted Access for Cyber." While well-intentioned, this creates a Red Queen’s Race. As defenders get smarter AI, attackers will use leaked or uncensored "Shadow Models." If your pipeline doesn't evolve to be as dynamic as the threats, you're building on sand.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;Stop refining your YAML files. Start building &lt;strong&gt;Agentic Workflows&lt;/strong&gt;. If your 2026 roadmap doesn’t include an autonomous red-team agent sitting inside your pipeline, you aren't doing DevSecOps—you're just waiting for a breach you can't predict.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>ai</category>
      <category>security</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>The Backyard Quarry, Part 5: Digital Twins for Physical Objects</title>
      <dc:creator>Ken W Alger</dc:creator>
      <pubDate>Tue, 14 Apr 2026 16:38:52 +0000</pubDate>
      <link>https://forem.com/kenwalger/the-backyard-quarry-part-5-digital-twins-for-physical-objects-5a9i</link>
      <guid>https://forem.com/kenwalger/the-backyard-quarry-part-5-digital-twins-for-physical-objects-5a9i</guid>
      <description>&lt;p&gt;At this point in the Backyard Quarry project, something subtle has happened.&lt;/p&gt;

&lt;p&gt;We started with a pile of rocks.&lt;/p&gt;

&lt;p&gt;We now have:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;a schema&lt;/li&gt;
    &lt;li&gt;a capture process&lt;/li&gt;
    &lt;li&gt;stored images&lt;/li&gt;
    &lt;li&gt;searchable metadata&lt;/li&gt;
    &lt;li&gt;classification&lt;/li&gt;
    &lt;li&gt;lifecycle states&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each rock has a record.&lt;/p&gt;

&lt;p&gt;Each record represents something in the physical world.&lt;/p&gt;

&lt;p&gt;And that leads to a useful observation.&lt;/p&gt;

&lt;p&gt;We’re no longer just cataloging rocks.&lt;/p&gt;

&lt;p&gt;We’re building digital representations of them.&lt;/p&gt;

&lt;h2&gt;What Is a Digital Twin?&lt;/h2&gt;

&lt;p&gt;In simple terms, a digital twin is:&lt;/p&gt;

&lt;blockquote&gt;A structured digital representation of a physical object.&lt;/blockquote&gt;

&lt;p&gt;That representation can include:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;identity&lt;/li&gt;
    &lt;li&gt;properties&lt;/li&gt;
    &lt;li&gt;visual data&lt;/li&gt;
    &lt;li&gt;state&lt;/li&gt;
    &lt;li&gt;history&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the context of the Quarry, a rock’s digital twin might look like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rock_id: QRY-042
weight_lb: 12.3
dimensions_cm: 18 x 10 x 7
color: gray
rock_type: granite
status: for_sale
images: [rock_042_1.jpg, rock_042_2.jpg]
model: rock_042.obj
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It’s not the rock itself.&lt;/p&gt;

&lt;p&gt;But it’s a useful abstraction of it.&lt;/p&gt;

&lt;h2&gt;More Than Just Metadata&lt;/h2&gt;

&lt;p&gt;At first glance, a digital twin might look like a simple database record.&lt;/p&gt;

&lt;p&gt;But there’s an important difference.&lt;/p&gt;

&lt;p&gt;A well-designed digital twin combines multiple types of data:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;structured metadata (easy to query)&lt;/li&gt;
    &lt;li&gt;unstructured assets (images, models)&lt;/li&gt;
    &lt;li&gt;derived attributes (classification, embeddings)&lt;/li&gt;
    &lt;li&gt;state over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s not just describing the object.&lt;/p&gt;

&lt;p&gt;It’s enabling interaction with it through software.&lt;/p&gt;

&lt;h2&gt;The Time Dimension&lt;/h2&gt;

&lt;p&gt;One of the most important aspects of a digital twin is that it can change over time.&lt;/p&gt;

&lt;p&gt;Even a rock — which is about as static as objects get — has a lifecycle in the system:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;collected → cataloged → listed_for_sale → sold
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Each transition adds context.&lt;/p&gt;

&lt;p&gt;Now we’re not just storing a snapshot.&lt;/p&gt;

&lt;p&gt;We’re tracking a history.&lt;/p&gt;

&lt;p&gt;This becomes much more important in other domains.&lt;/p&gt;

&lt;h2&gt;Where This Shows Up&lt;/h2&gt;

&lt;p&gt;The interesting part is that this pattern isn’t unique to rocks.&lt;/p&gt;

&lt;p&gt;It appears in many different systems.&lt;/p&gt;

&lt;h3&gt;Manufacturing&lt;/h3&gt;

&lt;ul&gt;
    &lt;li&gt;digital twins of machine parts&lt;/li&gt;
    &lt;li&gt;tracking condition and usage&lt;/li&gt;
    &lt;li&gt;linking physical components to system data&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Museums and Archives&lt;/h3&gt;

&lt;ul&gt;
    &lt;li&gt;artifacts with metadata, images, provenance&lt;/li&gt;
    &lt;li&gt;digitized collections&lt;/li&gt;
    &lt;li&gt;searchable historical records&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Agriculture&lt;/h3&gt;

&lt;ul&gt;
    &lt;li&gt;crops tracked over time&lt;/li&gt;
    &lt;li&gt;environmental data&lt;/li&gt;
    &lt;li&gt;growth and yield metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Healthcare and Motion&lt;/h3&gt;

&lt;ul&gt;
    &lt;li&gt;human movement captured as data&lt;/li&gt;
    &lt;li&gt;gait analysis&lt;/li&gt;
    &lt;li&gt;rehabilitation tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This last one starts to look a lot like something else entirely.&lt;/p&gt;

&lt;h2&gt;From Objects to Systems&lt;/h2&gt;

&lt;p&gt;What the Backyard Quarry demonstrates, in a small way, is that once you:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;represent objects as data&lt;/li&gt;
    &lt;li&gt;capture their properties&lt;/li&gt;
    &lt;li&gt;store and index them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;you’ve created the foundation for a larger system.&lt;/p&gt;

&lt;p&gt;The digital twin becomes a building block.&lt;/p&gt;

&lt;p&gt;And systems are built from collections of these building blocks.&lt;/p&gt;

&lt;h2&gt;The Abstraction Layer&lt;/h2&gt;

&lt;p&gt;A useful way to think about digital twins is as an abstraction layer.&lt;/p&gt;

&lt;p&gt;They sit between:&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%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fuploads%2F2026%2F04%2Fdigital-twin-abstraction-layer-diagram-1024x498.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%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fuploads%2F2026%2F04%2Fdigital-twin-abstraction-layer-diagram-1024x498.png" alt="Diagram showing how physical objects are captured and represented as digital twins with metadata, assets, and application layers." width="800" height="389"&gt;&lt;/a&gt; &lt;/p&gt;
Digital twins act as a bridge between physical objects and software systems.



&lt;p&gt;Applications don’t interact with rocks directly.&lt;/p&gt;

&lt;p&gt;They interact with the representation of rocks.&lt;/p&gt;

&lt;p&gt;That layer enables:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;search&lt;/li&gt;
    &lt;li&gt;analytics&lt;/li&gt;
    &lt;li&gt;visualization&lt;/li&gt;
    &lt;li&gt;automation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without it, everything remains manual and unstructured.&lt;/p&gt;

&lt;h2&gt;The Limits of the Model&lt;/h2&gt;

&lt;p&gt;Of course, digital twins are not perfect representations.&lt;/p&gt;

&lt;p&gt;They are approximations.&lt;/p&gt;

&lt;p&gt;Some properties are easy to capture.&lt;/p&gt;

&lt;p&gt;Others are difficult or impossible.&lt;/p&gt;

&lt;p&gt;Even in the Quarry:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;weight is approximate&lt;/li&gt;
    &lt;li&gt;dimensions are imprecise&lt;/li&gt;
    &lt;li&gt;visual data depends on lighting&lt;/li&gt;
    &lt;li&gt;3D models may be incomplete&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn’t perfect fidelity.&lt;/p&gt;

&lt;p&gt;It’s usefulness.&lt;/p&gt;

&lt;h2&gt;The Real Insight&lt;/h2&gt;

&lt;p&gt;At this point, the Backyard Quarry starts to feel less like a joke and more like a small version of a much larger idea.&lt;/p&gt;

&lt;p&gt;Many modern systems are built around digital twins.&lt;/p&gt;

&lt;p&gt;Not because the concept is new.&lt;/p&gt;

&lt;p&gt;But because we now have the tools to make it practical:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;cheap sensors&lt;/li&gt;
    &lt;li&gt;high-resolution cameras&lt;/li&gt;
    &lt;li&gt;scalable storage&lt;/li&gt;
    &lt;li&gt;machine learning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pattern has existed for a long time.&lt;/p&gt;

&lt;p&gt;The difference is that we can now implement it at scale.&lt;/p&gt;

&lt;h2&gt;What Comes Next&lt;/h2&gt;

&lt;p&gt;So far, the Quarry system works at a small scale.&lt;/p&gt;

&lt;p&gt;A handful of rocks.&lt;/p&gt;

&lt;p&gt;A manageable dataset.&lt;/p&gt;

&lt;p&gt;But what happens when the number of objects grows?&lt;/p&gt;

&lt;p&gt;When the dataset becomes:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;hundreds&lt;/li&gt;
    &lt;li&gt;thousands&lt;/li&gt;
    &lt;li&gt;or millions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next post explores that question.&lt;/p&gt;

&lt;p&gt;Because designing a system for a small dataset is one thing.&lt;/p&gt;

&lt;p&gt;Designing a system that scales is something else entirely.&lt;/p&gt;

&lt;p&gt;And somewhere along the way, it becomes clear that a pile of rocks is enough to illustrate ideas that show up across entire industries.&lt;/p&gt;

&lt;p&gt;Yet another surprise in this &lt;strong&gt;Backyard Quarry&lt;/strong&gt; journey.&lt;/p&gt;

&lt;h2&gt;The Rock Quarry Series&lt;/h2&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;a href="https://www.kenwalger.com/blog/software-engineering/the-backyard-quarry-turning-rocks-into-data/" rel="noopener noreferrer"&gt;The Backyard Quarry: Turning Rocks Into Data&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="https://www.kenwalger.com/blog/data-engineering/designing-a-schema-for-physical-objects" rel="noopener noreferrer"&gt;The Backyard Quarry, Part 2: Designing a Schema for Physical Objects&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="https://www.kenwalger.com/blog/data-engineering/capturing-physical-objects-data-pipeline" rel="noopener noreferrer"&gt;The Backyard Quarry, Part 3: Capturing the Physical World&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="https://www.kenwalger.com/blog/data-engineering/searching-physical-objects-data-indexing" rel="noopener noreferrer"&gt;The Backyard Quarry, Part 4: Searching a Pile of Rocks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>datascience</category>
      <category>ai</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>The Backyard Quarry, Part 4: Searching a Pile of Rocks</title>
      <dc:creator>Ken W Alger</dc:creator>
      <pubDate>Tue, 07 Apr 2026 16:25:39 +0000</pubDate>
      <link>https://forem.com/kenwalger/the-backyard-quarry-part-4-searching-a-pile-of-rocks-2aim</link>
      <guid>https://forem.com/kenwalger/the-backyard-quarry-part-4-searching-a-pile-of-rocks-2aim</guid>
      <description>&lt;p&gt;By this point, the Backyard Quarry has a schema, a capture process, and a growing collection of records.&lt;/p&gt;

&lt;p&gt;Each rock has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;metadata&lt;/li&gt;
&lt;li&gt;images&lt;/li&gt;
&lt;li&gt;possibly a 3D model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In theory, everything is organized.&lt;/p&gt;

&lt;p&gt;In practice, it quickly becomes difficult to find anything.&lt;/p&gt;

&lt;h2&gt;The First Search Problem&lt;/h2&gt;

&lt;p&gt;With a handful of rocks, you can rely on memory.&lt;/p&gt;

&lt;p&gt;You remember roughly where things are.&lt;/p&gt;

&lt;p&gt;You recognize shapes and colors.&lt;/p&gt;

&lt;p&gt;But as the dataset grows, that breaks down.&lt;/p&gt;

&lt;p&gt;You start asking questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which rocks are under 5 pounds?&lt;/li&gt;
&lt;li&gt;Which ones are suitable for landscaping?&lt;/li&gt;
&lt;li&gt;Where did that smooth gray stone go?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point, you’re no longer dealing with a pile.&lt;/p&gt;

&lt;p&gt;You’re dealing with a dataset.&lt;/p&gt;

&lt;p&gt;And datasets need to be searchable.&lt;/p&gt;

&lt;h2&gt;Filtering by Metadata&lt;/h2&gt;

&lt;p&gt;The most straightforward approach is to use structured queries.&lt;/p&gt;

&lt;p&gt;If we have metadata like weight, color, and classification, we can filter directly.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SELECT *
FROM rocks
WHERE weight_lb &amp;lt; 5
AND color = 'gray'
AND rock_class &amp;lt;= 'Class 2'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This works well for clearly defined attributes.&lt;/p&gt;

&lt;p&gt;It’s predictable.&lt;/p&gt;

&lt;p&gt;It’s efficient.&lt;/p&gt;

&lt;p&gt;And it’s the foundation of most data systems.&lt;/p&gt;

&lt;h2&gt;The Role of Classification&lt;/h2&gt;

&lt;p&gt;This is where the Quarry Taxonomy starts to pay off.&lt;/p&gt;

&lt;p&gt;Instead of requiring precise measurements, we can use categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pebble Class&lt;/li&gt;
&lt;li&gt;Hand Sample&lt;/li&gt;
&lt;li&gt;Landscaping Rock&lt;/li&gt;
&lt;li&gt;Wheelbarrow Class&lt;/li&gt;
&lt;li&gt;Engine Block Class&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows for simpler queries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;“Show me everything below Wheelbarrow Class”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;“Exclude Engine Block Class entirely”&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Classification reduces complexity.&lt;/p&gt;

&lt;p&gt;It turns continuous values into discrete groups.&lt;/p&gt;

&lt;p&gt;This is a common pattern in real-world systems.&lt;/p&gt;

&lt;h2&gt;When Metadata Isn’t Enough&lt;/h2&gt;

&lt;p&gt;Structured queries work well when you know exactly what you’re looking for.&lt;/p&gt;

&lt;p&gt;But sometimes you don’t.&lt;/p&gt;

&lt;p&gt;Sometimes the question looks more like:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Find rocks that look like this one.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Find something similar to the smooth stone I saw earlier.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At that point, metadata alone isn’t enough.&lt;/p&gt;

&lt;p&gt;We need another way to compare objects.&lt;/p&gt;

&lt;h2&gt;Similarity and Representation&lt;/h2&gt;

&lt;p&gt;Images and 3D models contain information that isn’t captured in simple fields like color or weight.&lt;/p&gt;

&lt;p&gt;To use that information, we need to represent it in a comparable way.&lt;/p&gt;

&lt;p&gt;One approach is to generate embeddings — numerical representations of images or shapes.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;each rock image → vector representation&lt;/li&gt;
&lt;li&gt;similar images → vectors close together&lt;/li&gt;
&lt;li&gt;dissimilar images → vectors further apart&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows for similarity search.&lt;/p&gt;

&lt;p&gt;Instead of filtering by attributes, we search by resemblance.&lt;/p&gt;

&lt;h2&gt;A Different Kind of Query&lt;/h2&gt;

&lt;p&gt;With similarity search, queries look different.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;color = 'gray'
weight &amp;lt; 5
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We might have:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;find nearest neighbors to this image
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This shifts the system from exact matching to approximate matching.&lt;/p&gt;

&lt;p&gt;It’s less precise.&lt;/p&gt;

&lt;p&gt;But often more useful.&lt;/p&gt;

&lt;h2&gt;A Familiar Pattern&lt;/h2&gt;

&lt;p&gt;At this point, the &lt;strong&gt;Backyard Quarry&lt;/strong&gt; starts to resemble systems used in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;image search engines&lt;/li&gt;
&lt;li&gt;product recommendation systems&lt;/li&gt;
&lt;li&gt;digital asset management platforms&lt;/li&gt;
&lt;li&gt;AI-powered retrieval systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The objects are different.&lt;/p&gt;

&lt;p&gt;The pattern is the same.&lt;/p&gt;

&lt;p&gt;Store data.&lt;/p&gt;

&lt;p&gt;Index it.&lt;/p&gt;

&lt;p&gt;Provide multiple ways to retrieve it.&lt;/p&gt;

&lt;h2&gt;Combining Approaches&lt;/h2&gt;

&lt;p&gt;In practice, the most useful systems combine both methods.&lt;/p&gt;

&lt;p&gt;Structured filtering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;weight&lt;/li&gt;
&lt;li&gt;class&lt;/li&gt;
&lt;li&gt;location&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Similarity search:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;appearance&lt;/li&gt;
&lt;li&gt;shape&lt;/li&gt;
&lt;li&gt;texture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, they provide flexibility.&lt;/p&gt;

&lt;p&gt;You can narrow down the dataset and then explore it.&lt;/p&gt;

&lt;h2&gt;The Cost of Search&lt;/h2&gt;

&lt;p&gt;Search doesn’t come for free.&lt;/p&gt;

&lt;p&gt;It introduces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;indexing overhead&lt;/li&gt;
&lt;li&gt;additional storage&lt;/li&gt;
&lt;li&gt;preprocessing steps&lt;/li&gt;
&lt;li&gt;more complex queries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And like everything else in the Quarry system, these tradeoffs become more significant as the dataset grows.&lt;/p&gt;

&lt;h2&gt;The Realization&lt;/h2&gt;

&lt;p&gt;At this point, something interesting becomes clear.&lt;/p&gt;

&lt;p&gt;The hard part isn’t collecting rocks.&lt;/p&gt;

&lt;p&gt;It isn’t even modeling them.&lt;/p&gt;

&lt;p&gt;The hard part is making the data usable.&lt;/p&gt;

&lt;p&gt;And usability, in most systems, comes down to one thing:&lt;/p&gt;

&lt;p&gt;Search.&lt;/p&gt;

&lt;h2&gt;What Comes Next&lt;/h2&gt;

&lt;p&gt;With data captured and searchable, the next step is to zoom out.&lt;/p&gt;

&lt;p&gt;What we’ve built so far is more than just a rock catalog.&lt;/p&gt;

&lt;p&gt;It’s a small example of a larger idea.&lt;/p&gt;

&lt;p&gt;In the next post, we’ll look at that idea more directly:&lt;/p&gt;

&lt;p&gt;Digital twins.&lt;/p&gt;

&lt;p&gt;Because once you can represent, store, and search objects, you’ve taken the first step toward building systems that mirror the physical world.&lt;/p&gt;

&lt;p&gt;And somewhere in the process, it becomes clear that even a pile of rocks benefits from thoughtful indexing.&lt;/p&gt;

&lt;p&gt;Which is not something I expected to say when this started.&lt;/p&gt;

&lt;h2&gt;The Rock Quarry Series&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.kenwalger.com/blog/software-engineering/the-backyard-quarry-turning-rocks-into-data/" rel="noopener noreferrer"&gt;The Backyard Quarry: Turning Rocks Into Data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kenwalger.com/blog/data-engineering/designing-a-schema-for-physical-objects" rel="noopener noreferrer"&gt;The Backyard Quarry, Part 2: Designing a Schema for Physical Objects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kenwalger.com/blog/data-engineering/capturing-physical-objects-data-pipeline" rel="noopener noreferrer"&gt;The Backyard Quarry, Part 3: Capturing the Physical World&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>search</category>
      <category>database</category>
      <category>architecture</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Building Your First MCP Server: TypeScript vs. Python</title>
      <dc:creator>Ken W Alger</dc:creator>
      <pubDate>Mon, 06 Apr 2026 21:11:14 +0000</pubDate>
      <link>https://forem.com/kenwalger/building-your-first-mcp-server-typescript-vs-python-31ch</link>
      <guid>https://forem.com/kenwalger/building-your-first-mcp-server-typescript-vs-python-31ch</guid>
      <description>&lt;h3&gt;The 5-Minute "Hello World" Comparison&lt;/h3&gt;

&lt;p&gt;We’ve spent the last month talking about the &lt;a href="https://www.kenwalger.com/blog/ai/mcp-usb-c-moment-ai-architecture/" rel="noopener noreferrer"&gt;End of Glue Code&lt;/a&gt; and the &lt;a href="https://www.kenwalger.com/blog/ai/mcp/the-final-boss-enterprise-governance-scalability/" rel="noopener noreferrer"&gt;Enterprise AI Mesh&lt;/a&gt;. But if you’re a developer, you don't just want to see the blueprint—you want to hold the tools.&lt;/p&gt;

&lt;p&gt;Whether you are a &lt;a href="https://www.typescriptlang.org/" rel="noopener noreferrer"&gt;TypeScript&lt;/a&gt; veteran or a &lt;a href="https://www.python.org/" rel="noopener noreferrer"&gt;Python&lt;/a&gt; enthusiast, building an MCP server is surprisingly simple. Today, we’re going to build the same "Hello World" tool in both languages to show you exactly how the protocol abstracts away the complexity.&lt;/p&gt;

&lt;h2&gt;1. The TypeScript Approach (Node.js)&lt;/h2&gt;

&lt;p&gt;TypeScript is the "native" language of the Model Context Protocol, and the &lt;code&gt;@modelcontextprotocol/sdk&lt;/code&gt; is exceptionally robust for high-performance enterprise tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;npm install @modelcontextprotocol/sdk zod
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;The Code:&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

const server = new Server({
  name: "hello-world-server",
  version: "1.0.0",
}, {
  capabilities: { tools: {} }
});

// Define a simple greeting tool
server.tool(
  "greet_user",
  { name: z.string().describe("The name of the person to greet") },
  async ({ name }) =&amp;gt; {
    return {
      content: [{ type: "text", text: `Hello, ${name}! Welcome to the MCP Mesh.` }]
    };
  }
);

async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
}

main().catch(console.error);
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;2. The Python Approach&lt;/h2&gt;

&lt;p&gt;For data scientists and AI engineers, the Python SDK offers a beautifully decorative approach. It feels more "agent-native" and integrates seamlessly with existing AI libraries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;pip install mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;The Code:&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import asyncio
from mcp.server.fastmcp import FastMCP

# Initialize FastMCP - the "Quick Start" wrapper
mcp = FastMCP("HelloWorld")

@mcp.tool()
async def greet_user(name: str) -&amp;gt; str:
    """Greets a user by name."""
    return f"Hello, {name}! Welcome to the MCP Mesh."

if __name__ == "__main__":
    mcp.run(transport='stdio')
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Side-by-Side: Which Should You Choose?&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;TypeScript (Standard SDK)&lt;/th&gt;
&lt;th&gt;Python (FastMCP)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High-performance, Type-safe tools&lt;/td&gt;
&lt;td&gt;Rapid prototyping, AI logic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Validation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Zod (Explicit &amp;amp; Strict)&lt;/td&gt;
&lt;td&gt;Pydantic / Type Hints (Implicit)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Verbosity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Moderate (Structured)&lt;/td&gt;
&lt;td&gt;Minimal (Decorator-based)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transport&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;STDIO, SSE, Custom&lt;/td&gt;
&lt;td&gt;STDIO, SSE&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;How to Test Your Server&lt;/h2&gt;

&lt;p&gt;Once you've saved your code, you don't need a complex frontend to test it. Use the &lt;strong&gt;MCP Inspector:&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# For TypeScript
npx @modelcontextprotocol/inspector node build/index.js

# For Python
npx @modelcontextprotocol/inspector python your_script.py
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will launch a local web interface where you can perform the "Protocol Handshake" and trigger your tools manually. It's the best way to verify your "Zero-Glue" infrastructure before connecting it to an agent.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;The "Zero-Glue" architecture isn't about which language you use—it's about the &lt;em&gt;Protocol&lt;/em&gt;. As you can see, the logic for the "Hello World" tool is nearly identical in both versions. The Model Context Protocol ensures that no matter how you build your tools, your agents can discover and use them in a standardized way.&lt;/p&gt;

&lt;h3&gt;Ready to build your own?&lt;/h3&gt;

&lt;p&gt;Check out the reference repo for more complex examples, including Notion and Oracle 26ai integrations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/kenwalger/mcp-forensic-analyzer" rel="noopener noreferrer"&gt;MCP Forensic Analyzer Repository&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;The "Zero-Glue" Series&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Post 1: &lt;a href="https://www.kenwalger.com/blog/ai/mcp-usb-c-moment-ai-architecture/" rel="noopener noreferrer"&gt;The End of Glue Code: Why MCP is the USB-C Moment for AI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Post 2: &lt;a href="https://www.kenwalger.com/blog/ai/mcp-multi-agent-orchestration-forensics/" rel="noopener noreferrer"&gt;The Forensic Team: Architecting Multi-Agent Handoffs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Post 3: &lt;a href="https://www.kenwalger.com/blog/uncategorized/from-cloud-to-laptop-running-mcp-agents-with-small-language-models/" rel="noopener noreferrer"&gt;From Cloud to Laptop: Running MCP Agents with SLMs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Post 4: &lt;a href="https://www.kenwalger.com/blog/ai/the-final-boss-enterprise-governance-scalability" rel="noopener noreferrer"&gt;Enterprise Governance: Scaling MCP with Oracle 26ai&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;What's Next?&lt;/h2&gt;

&lt;p&gt;The Mesh is built.&lt;br&gt;The agents are ready.&lt;br&gt;But can you trust them?&lt;/p&gt;

&lt;p&gt;In my next series, we explore the 'Science of Reliability'—building the evaluators that turn AI experiments into production-grade systems.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>python</category>
      <category>tutorial</category>
      <category>typescript</category>
    </item>
    <item>
      <title>The Final Boss: Enterprise Governance &amp; Scalability</title>
      <dc:creator>Ken W Alger</dc:creator>
      <pubDate>Thu, 02 Apr 2026 17:32:10 +0000</pubDate>
      <link>https://forem.com/kenwalger/the-final-boss-enterprise-governance-scalability-1d9f</link>
      <guid>https://forem.com/kenwalger/the-final-boss-enterprise-governance-scalability-1d9f</guid>
      <description>&lt;h3&gt;From Cloud to Core: Taking the Forensic Team to Production with Oracle 26ai&lt;/h3&gt;

&lt;p&gt;Over the last three posts, we’ve done the hard work. We designed a "Zero-Glue" architecture, orchestrated a polyglot multi-agent team, and proved it can run offline on a laptop.&lt;/p&gt;

&lt;p&gt;But for a global enterprise, "it works on my machine" is where the trouble begins.&lt;/p&gt;

&lt;p&gt;How do you ensure that a thousand agents, running a million audits against critical archival data, all adhere to the same security, privacy, and auditability standards?&lt;/p&gt;

&lt;p&gt;Today, we meet the "Final Boss" of AI systems: &lt;strong&gt;Governance&lt;/strong&gt;. We are taking our specialized forensic lab and moving it from a flexible Notion sandbox to the mission-critical, AI-native world of Oracle 26ai.&lt;/p&gt;

&lt;p&gt;In 2026, the industry has moved toward HTAP+V (Hybrid Transactional/Analytical Processing + Vector). While Oracle 26ai is a leader in this "all-in-one" approach, many developers prefer a "best-of-breed" or open-source stack.&lt;/p&gt;

&lt;h3&gt;Governance Engine&lt;/h3&gt;

&lt;p&gt;To bridge the gap between a laptop demo and a global enterprise, we must move governance out of our Python scripts and into the data layer. In this article, we'll look at Oracle 26ai as a primary example of an AI-native database, but the principles of the 'AI Mesh' apply whether you are implementing this with:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;PostgreSQL + pg_vector + pgai (Open Source)&lt;/li&gt;
    &lt;li&gt;Supabase + Edge Functions (Modern Cloud)&lt;/li&gt;
    &lt;li&gt;Snowflake + Cortex (Enterprise Data Cloud)&lt;/li&gt;
    &lt;li&gt;MongoDB Atlas + Microsoft Foundry (NoSQL/Vector Hybrid)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;The Enterprise Gap&lt;/h2&gt;

&lt;p&gt;In a production environment, you can't rely on prompt-based guardrails or local JSON logs. Enterprise AI requires infrastructure-level guarantees. Our "Forensic Clean-Room" concept must scale from one laptop to a global, distributed network.&lt;/p&gt;

&lt;p&gt;To bridge this gap, we must rethink three core architectural pillars:&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;Shift 1: The AI-Native Database (Oracle 26ai)&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;In our demo, we used a simple Notion API. In production, we need a unified knowledge base that treats agents as "first-class citizens."&lt;/p&gt;

&lt;p&gt;Oracle 26ai Select AI Agents allows the database itself to host and govern MCP servers.&lt;/p&gt;

&lt;p&gt;Instead of your Python orchestrator managing every single database call (which creates a new MXN integration point!), the orchestrator calls a single Unified AI Agent within Oracle. The database then securely manages the data access, vector similarity search, and even execution of in-database ML models.&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;Shift 2: Immutable Audits &amp;amp; Row-Level Security&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Enterprise systems require strict, verifiable compliance. We must move beyond "trust" and enforce security at the data layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Virtual Private Database (VPD) &amp;amp; Row-Level Security (RLS)&lt;/strong&gt;&lt;br&gt;
You don’t have to "prompt" the AI to ignore certain restricted records. If a junior auditor runs your Python script, the database physically hides the rows they aren't authorized to see. The agent literally cannot see or hallucinate restricted data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blockchain Tables for Audits&lt;/strong&gt;&lt;br&gt;
Every decision made by the Librarian or the Analyst must be defensible. In 26ai, we can write the "handshake" between agents directly into a Blockchain Table. This creates an immutable, cryptographically signed record of exactly what data the agent saw and what reasoning it produced—a perfect, verifiable audit trail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Ultimate Vision: The Enterprise AI Mesh&lt;/strong&gt;&lt;br&gt;
When you move to an enterprise architecture powered by Oracle 26ai, your view of the AI stack fundamentally changes. MCP is no longer just a tool—it is the universal interface of the AI Mesh.&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%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fuploads%2F2026%2F04%2Fenterprise-mcp-stack-673x1024.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%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fuploads%2F2026%2F04%2Fenterprise-mcp-stack-673x1024.png" alt="A structural diagram of an Enterprise AI Mesh architecture. At the top, specialized Python agents (Supervisor, Librarian, Analyst) connect via the Model Context Protocol (MCP) to a centralized Governance and Data Layer. The middle layer (Oracle 26ai) manages Access Control, Row-Level Security, and Immutable Blockchain Audit Logs. The bottom layer shows secure connections to enterprise data sources including Archive Databases and internal Notion records." width="673" height="1024"&gt;&lt;/a&gt; &lt;/p&gt;
The Enterprise AI Mesh: specialized agents (Clients) connect to standardized, secured MCP Servers. The AI-Native Database acts as the governance layer and unified 'Source of Truth,' decouples tools from logic and enabling scalable machine-to-machine autonomy.



&lt;p&gt;This diagram represents the maturity of your AI system.&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;
&lt;strong&gt;The Clients (Agents):&lt;/strong&gt; Focus purely on specialized reasoning.&lt;/li&gt;
    &lt;li&gt;
&lt;strong&gt;The Interface (MCP):&lt;/strong&gt; Provides a standardized, semantic way to discover capabilities.&lt;/li&gt;
    &lt;li&gt;
&lt;strong&gt;The Governance (Database):&lt;/strong&gt; Enforces security, privacy, and persistence for the entire mesh.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;The "End of Glue Code" Is Just the Beginning&lt;/h2&gt;

&lt;p&gt;We’ve come full circle. The "Zero-Glue" architecture isn’t about deleting code; it’s about architecting systems where the logic and the capabilities are separated by a robust, standard protocol.&lt;/p&gt;

&lt;p&gt;Whether you are building a small forensic auditor on your laptop or a global archival intelligence network, the principles of the Model Context Protocol remain the same.&lt;/p&gt;

&lt;p&gt;Stop writing the glue. Start building the mesh.&lt;/p&gt;

&lt;h2&gt;The "Zero-Glue" Series&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Post 1: &lt;a href="https://www.kenwalger.com/blog/ai/mcp-usb-c-moment-ai-architecture/" rel="noopener noreferrer"&gt;The End of Glue Code: Why MCP is the USB-C Moment for AI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Post 2: &lt;a href="https://www.kenwalger.com/blog/ai/mcp-multi-agent-orchestration-forensics/" rel="noopener noreferrer"&gt;The Forensic Team: Architecting Multi-Agent Handoffs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Post 3: &lt;a href="https://www.kenwalger.com/blog/uncategorized/from-cloud-to-laptop-running-mcp-agents-with-small-language-models/" rel="noopener noreferrer"&gt;From Cloud to Laptop: Running MCP Agents with SLMs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Post 4: Enterprise Governance: Scaling MCP with Oracle 26ai — &lt;em&gt;You are here&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>governance</category>
      <category>enterprise</category>
      <category>security</category>
    </item>
    <item>
      <title>The Backyard Quarry, Part 3: Capturing the Physical World</title>
      <dc:creator>Ken W Alger</dc:creator>
      <pubDate>Tue, 31 Mar 2026 16:54:49 +0000</pubDate>
      <link>https://forem.com/kenwalger/the-backyard-quarry-part-3-capturing-the-physical-world-4c6a</link>
      <guid>https://forem.com/kenwalger/the-backyard-quarry-part-3-capturing-the-physical-world-4c6a</guid>
      <description>&lt;p&gt;In the &lt;a href="https://dev.to/kenwalger/the-backyard-quarry-part-2-designing-a-schema-for-physical-objects-19gd"&gt;previous post&lt;/a&gt;, we designed a schema for representing rocks as structured data.&lt;/p&gt;

&lt;p&gt;On paper, everything looked clean.&lt;/p&gt;

&lt;p&gt;Each rock would have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an identifier&lt;/li&gt;
&lt;li&gt;dimensions&lt;/li&gt;
&lt;li&gt;weight&lt;/li&gt;
&lt;li&gt;metadata&lt;/li&gt;
&lt;li&gt;possibly images or even a 3D model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The structure made sense.&lt;/p&gt;

&lt;p&gt;The problem was getting the data.&lt;/p&gt;

&lt;h2&gt;From Schema to Reality&lt;/h2&gt;

&lt;p&gt;Designing a schema is straightforward.&lt;/p&gt;

&lt;p&gt;You can sit down with a notebook or a whiteboard and define exactly what you want the system to store.&lt;/p&gt;

&lt;p&gt;Capturing real-world data is a different problem entirely.&lt;/p&gt;

&lt;p&gt;The moment you step outside, a few complications become obvious.&lt;/p&gt;

&lt;p&gt;Lighting changes.&lt;/p&gt;

&lt;p&gt;Objects aren’t uniform.&lt;/p&gt;

&lt;p&gt;Measurements are approximate.&lt;/p&gt;

&lt;p&gt;And perhaps most importantly:&lt;/p&gt;

&lt;p&gt;The dataset doesn’t behave consistently.&lt;/p&gt;

&lt;h2&gt;The Scale Problem&lt;/h2&gt;

&lt;p&gt;The Backyard Quarry dataset spans a wide range of sizes:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;pea-sized
hand-sized
wheelbarrow-sized
engine-block-sized
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That variability immediately affects how data can be captured.&lt;/p&gt;

&lt;p&gt;Small rocks can be photographed on a table.&lt;/p&gt;

&lt;p&gt;Medium rocks might need to be placed on the ground with careful framing.&lt;/p&gt;

&lt;p&gt;Large rocks don’t move easily at all.&lt;/p&gt;

&lt;p&gt;Each category introduces different constraints.&lt;/p&gt;

&lt;p&gt;This is a pattern that shows up in many real-world systems.&lt;/p&gt;

&lt;p&gt;The same pipeline rarely works for every object.&lt;/p&gt;

&lt;h2&gt;Image Capture&lt;/h2&gt;

&lt;p&gt;The simplest form of data capture is photography.&lt;/p&gt;

&lt;p&gt;Take a few images of each rock from different angles.&lt;/p&gt;

&lt;p&gt;Store them.&lt;/p&gt;

&lt;p&gt;Attach them to the record.&lt;/p&gt;

&lt;p&gt;Even this introduces decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how many images per object?&lt;/li&gt;
&lt;li&gt;what angles?&lt;/li&gt;
&lt;li&gt;what lighting conditions?&lt;/li&gt;
&lt;li&gt;what background?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inconsistent capture leads to inconsistent data.&lt;/p&gt;

&lt;p&gt;And inconsistent data leads to unreliable systems.&lt;/p&gt;

&lt;h2&gt;Introducing Photogrammetry&lt;/h2&gt;

&lt;p&gt;If we take the idea a step further, we can generate a 3D model of each rock.&lt;/p&gt;

&lt;p&gt;Photogrammetry works by combining multiple images to reconstruct the shape of an object.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;take overlapping photos&lt;/li&gt;
&lt;li&gt;feed them into a processing tool&lt;/li&gt;
&lt;li&gt;generate a 3D mesh&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This produces a much richer representation than a single image.&lt;/p&gt;

&lt;p&gt;But it also introduces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;processing time&lt;/li&gt;
&lt;li&gt;storage requirements&lt;/li&gt;
&lt;li&gt;failure cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not every rock will produce a clean model.&lt;/p&gt;

&lt;h2&gt;The Capture Pipeline&lt;/h2&gt;

&lt;p&gt;At this point, the process starts to look like a pipeline.&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%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fuploads%2F2026%2F03%2Fphyiscal-object-capture-data-pipeline-diagram-404x1024.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%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fuploads%2F2026%2F03%2Fphyiscal-object-capture-data-pipeline-diagram-404x1024.png" alt="Diagram showing a data pipeline for capturing physical objects, including image capture, photogrammetry processing, metadata extraction, and storage." width="404" height="1024"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;A simplified pipeline for turning a physical object into structured data and associated assets.&lt;/p&gt;

&lt;p&gt;Each step transforms the data in some way.&lt;/p&gt;

&lt;p&gt;The output of one stage becomes the input of the next.&lt;/p&gt;

&lt;p&gt;This is a common pattern in data engineering.&lt;/p&gt;

&lt;p&gt;The difference here is that the input isn’t a clean dataset.&lt;/p&gt;

&lt;p&gt;It’s the physical world.&lt;/p&gt;

&lt;h2&gt;Imperfect Data&lt;/h2&gt;

&lt;p&gt;No matter how carefully you design the pipeline, real-world data introduces imperfections.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;missing images&lt;/li&gt;
&lt;li&gt;inconsistent lighting&lt;/li&gt;
&lt;li&gt;partially occluded objects&lt;/li&gt;
&lt;li&gt;measurement errors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A rock might be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;too reflective&lt;/li&gt;
&lt;li&gt;too uniform in texture&lt;/li&gt;
&lt;li&gt;partially buried&lt;/li&gt;
&lt;li&gt;awkwardly shaped&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these affect the output.&lt;/p&gt;

&lt;p&gt;This means the system has to tolerate incomplete or imperfect data.&lt;/p&gt;

&lt;p&gt;Which leads to an important realization:&lt;/p&gt;

&lt;blockquote&gt;
  Data systems are rarely about perfect data.
  They are about handling imperfect data gracefully.
&lt;/blockquote&gt;

&lt;h2&gt;Storage Considerations&lt;/h2&gt;

&lt;p&gt;Once data is captured, it needs to be stored.&lt;/p&gt;

&lt;p&gt;Different types of data behave differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;metadata → small, structured, easy to query&lt;/li&gt;
&lt;li&gt;images → larger, unstructured&lt;/li&gt;
&lt;li&gt;3D models → even larger, more complex&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This reinforces a pattern introduced earlier:&lt;/p&gt;

&lt;p&gt;Separate structured data from large assets.&lt;/p&gt;

&lt;p&gt;Store references rather than embedding everything directly.&lt;/p&gt;

&lt;h2&gt;A Familiar Pattern&lt;/h2&gt;

&lt;p&gt;At this point, the &lt;strong&gt;Backyard Quarry&lt;/strong&gt; pipeline looks surprisingly familiar.&lt;/p&gt;

&lt;p&gt;It resembles systems used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scanning historical artifacts&lt;/li&gt;
&lt;li&gt;capturing industrial parts&lt;/li&gt;
&lt;li&gt;generating 3D models for manufacturing&lt;/li&gt;
&lt;li&gt;building datasets for computer vision&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The specifics change.&lt;/p&gt;

&lt;p&gt;The pattern remains the same.&lt;/p&gt;

&lt;h2&gt;What Comes Next&lt;/h2&gt;

&lt;p&gt;Once data is captured and stored, the next problem emerges.&lt;/p&gt;

&lt;p&gt;How do we find anything?&lt;/p&gt;

&lt;p&gt;A dataset of a few rocks is manageable.&lt;/p&gt;

&lt;p&gt;A dataset of hundreds or thousands quickly becomes difficult to navigate without structure.&lt;/p&gt;

&lt;p&gt;In the next post, we’ll look at how to index and search the dataset — and how even a pile of rocks benefits from thoughtful retrieval systems.&lt;/p&gt;

&lt;p&gt;And somewhere along the way, it becomes clear that the hard part isn’t designing the schema.&lt;/p&gt;

&lt;p&gt;It’s building systems that can reliably turn messy reality into usable data.&lt;/p&gt;

&lt;h2&gt;Miss Part of the Series?&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.kenwalger.com/blog/software-engineering/the-backyard-quarry-turning-rocks-into-data/" rel="noopener noreferrer"&gt;The Backyard Quarry: Turning Rocks Into Data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kenwalger.com/blog/data-engineering/designing-a-schema-for-physical-objects" rel="noopener noreferrer"&gt;The Backyard Quarry, Part 2: Designing a Schema for Physical Objects&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>database</category>
      <category>architecture</category>
      <category>ai</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>The Ink, The Iron, and the Algorithm: Why I Build for Truth</title>
      <dc:creator>Ken W Alger</dc:creator>
      <pubDate>Mon, 30 Mar 2026 16:11:16 +0000</pubDate>
      <link>https://forem.com/kenwalger/the-ink-the-iron-and-the-algorithm-why-i-build-for-truth-4cml</link>
      <guid>https://forem.com/kenwalger/the-ink-the-iron-and-the-algorithm-why-i-build-for-truth-4cml</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/wecoded-2026"&gt;2026 WeCoded Challenge&lt;/a&gt;: Echoes of Experience&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In the world of rare and historical artifacts, the difference between a masterpiece and a clever forgery often hides in the smallest details. It could be a specific serif on a typeface, or a tooling mark on piece of stone. This type of knowledge historically is known only by a select few. Locked away in the knowledge banks of high-end auction houses and private archives.&lt;/p&gt;

&lt;p&gt;As I worked on a recent &lt;em&gt;Archival Intelligence&lt;/em&gt; project for the &lt;a href="https://dev.to/challenges/notion-2026-03-04"&gt;Notion MCP Challenge&lt;/a&gt;, I realized that my journey in tech has been leading me toward a vital mission: &lt;strong&gt;Democratizing the Truth&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Commodore PETs to Forensic AI
&lt;/h2&gt;

&lt;p&gt;My journey started with early &lt;a href="https://en.wikipedia.org/wiki/Commodore_PET" rel="noopener noreferrer"&gt;Commodore PET&lt;/a&gt;s and &lt;a href="https://en.wikipedia.org/wiki/VIC-20" rel="noopener noreferrer"&gt;VIC-20&lt;/a&gt;s. Yeah, I'm that old. Back then, "diversity" in tech was barely a conversation. Further, the "archives" of our digital world were in their infancy.&lt;/p&gt;

&lt;p&gt;History, however, is fragile. It is frequently written by those with the most resources. The records of marginalized communities, those whose stories aren't backed by high-end auction houses, are often the first to be lost to the sands of time or forged for the sake of a more 'profitable' narrative. I build to ensure those stories have a forensic advocate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the "Digital Magnifying Glass"
&lt;/h2&gt;

&lt;p&gt;When I built the &lt;a href="https://github.com/kenwalger/mcp-forensic-analyzer" rel="noopener noreferrer"&gt;MCP Forensic Analyzer&lt;/a&gt; and looked at rare books, I wasn't just thinking about $150,000 first editions. I was thinking about &lt;strong&gt;governance.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Much has changed and advanced in the world of tech since the Commodore PET days. We now find ourselves in a world in which AI can be a powerful ally. It can also hallucinate and manipulate digital data in seconds. We need systems that act as a "Ground Truth" for AI.&lt;/p&gt;

&lt;p&gt;By using the &lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; to link Notion databases into a forensic audit trail, I'm trying to solve a problem that is older than computers... &lt;em&gt;How do we prove what is real?&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech as an Equalizer
&lt;/h2&gt;

&lt;p&gt;The #WeCoded mission resonates with me because inclusion isn't just about who is in the room. &lt;/p&gt;

&lt;p&gt;It's about whose history we choose to protect.&lt;/p&gt;

&lt;p&gt;How can we use tech to accomplish this?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;By automating the "Chain of Custody":&lt;/strong&gt; We can take the power of authentication out of the hands of the auction houses and private archivists and make the knowledge accessible via an open protocol.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI integration:&lt;/strong&gt; By making these tools available through simple chat interfaces, any small library, local museum, or interested individual can verify records and artifacts with the same rigor as top-tier institutions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Echoes of Our Experience
&lt;/h2&gt;

&lt;p&gt;The code we write &lt;em&gt;today&lt;/em&gt; becomes the archive of &lt;em&gt;tomorrow&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;My "Echo of Experience" is this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Don't just build tools to make things faster; build tools to make the world more verifiable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Whether it's a rare book, historical record, or antique stone artifact, the truth deserves a forensic advocate. I'm proud to be working on that advocacy. One line of code at a time.&lt;/p&gt;

</description>
      <category>wecoded</category>
      <category>devchallenge</category>
      <category>dei</category>
      <category>career</category>
    </item>
    <item>
      <title>From Cloud to Laptop: Running MCP Agents with Small Language Models</title>
      <dc:creator>Ken W Alger</dc:creator>
      <pubDate>Sat, 28 Mar 2026 11:23:39 +0000</pubDate>
      <link>https://forem.com/kenwalger/from-cloud-to-laptop-running-mcp-agents-with-small-language-models-1gk0</link>
      <guid>https://forem.com/kenwalger/from-cloud-to-laptop-running-mcp-agents-with-small-language-models-1gk0</guid>
      <description>&lt;h3&gt;
  
  
  Large Models Build Systems. Small Models Run Them.
&lt;/h3&gt;

&lt;p&gt;For most developers, modern AI systems feel locked behind massive infrastructure.&lt;/p&gt;

&lt;p&gt;We’ve been conditioned to believe that “Intelligence” is a service we rent from a data center—a luxury that requires GPU clusters, $10,000 hardware, and ever-climbing cloud inference bills.&lt;/p&gt;

&lt;p&gt;Last week, when we built our &lt;a href="https://dev.to/admin456/the-end-of-glue-code-why-mcp-is-the-usb-c-moment-for-ai-systems-adf-temp-slug-3585086"&gt;Multi-Agent Forensic Team&lt;/a&gt;, you likely assumed that coordinating a Supervisor, a Librarian, and an Analyst required the reasoning horsepower of a 400B+ parameter model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Today, we’re cutting the cord&lt;/strong&gt;. We are moving the entire Forensic Team—the agents, the orchestration, and the data—onto a standard laptop. No cloud. No API costs. No data leaving your local network.&lt;/p&gt;

&lt;p&gt;This is the power of &lt;strong&gt;Edge AI&lt;/strong&gt; combined with the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pivot: The “Forensic Clean-Room”
&lt;/h2&gt;

&lt;p&gt;In the world of rare book forensics, data sovereignty isn’t a “nice-to-have.” When you are auditing high-value archival records or sensitive provenance data, the “Clean-Room” approach is the gold standard. You want the data isolated.&lt;/p&gt;

&lt;p&gt;By moving our stack to the Edge, we transform a laptop into a portable forensic lab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Edge Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flth8b9qmwbx5yalswtr3.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%2Flth8b9qmwbx5yalswtr3.png" alt="Architecture diagram showing an MCP-based multi-agent system running locally with small language models where a supervisor and specialist agents interact with an MCP server and local archive database on a laptop." width="800" height="185"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Running MCP agents locally: small language models power the supervisor and specialist agents while the MCP server provides structured tool access to local data.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Notice that the architecture we built in Post 2 doesn’t change. Because we used MCP as our “USB-C” interface, we don’t have to rewrite our tools or our agents. We only swap the Inference Engine.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why SLMs Love MCP
&lt;/h2&gt;

&lt;p&gt;Small language models struggle when tasks are open-ended.&lt;/p&gt;

&lt;p&gt;However, MCP dramatically reduces the search space.&lt;/p&gt;

&lt;p&gt;Instead of inventing answers, the model interacts with structured primitives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tools&lt;/li&gt;
&lt;li&gt;resources&lt;/li&gt;
&lt;li&gt;prompts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each defined with strict schemas.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Thesis:&lt;/strong&gt; Large models are great for designing the system and writing the initial code. Small models are the perfect runtime engines for executing those standardized tasks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  The “How-To”: Swapping the Engine
&lt;/h2&gt;

&lt;p&gt;In our updated &lt;code&gt;orchestrator.py&lt;/code&gt;, we’ve introduced a provider flag. Instead of hitting a remote API, the Python supervisor now talks to a local inference server (like Ollama or LM Studio).&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="c1"&gt;# [Post 3 - Edge AI] Swapping the Inference Provider
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="c1"&gt;# Pointing to the local SLM engine
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OllamaClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;phi4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="c1"&gt;# Standard Cloud Provider
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AnthropicClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-3-5-sonnet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because our TypeScript MCP Server is running locally via &lt;code&gt;stdio&lt;/code&gt;, the latency is nearly zero. The “Librarian” fetches metadata from the local database, and the “Analyst” runs the audit—all without a single packet hitting the open web.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmarking the Forensic Team: Cloud vs. Edge
&lt;/h2&gt;

&lt;p&gt;Does a 14B model perform as well as a 400B model for forensics? When constrained by MCP schemas, the results are surprising.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criteria&lt;/th&gt;
&lt;th&gt;Cloud (Claude/GPT-4)&lt;/th&gt;
&lt;th&gt;Edge (Phi-4/Mistral)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reasoning Depth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Extremely High&lt;/td&gt;
&lt;td&gt;High (with MCP Tool Constraints)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.5s – 3s (Network Dependent)&lt;/td&gt;
&lt;td&gt;&amp;lt; 500ms (Local Inference)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Per-token billing&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Privacy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Data processed externally&lt;/td&gt;
&lt;td&gt;100% Data Sovereignty&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Infinite&lt;/td&gt;
&lt;td&gt;Limited by local RAM/NPU&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Reveal: Same System, New Home
&lt;/h2&gt;

&lt;p&gt;If you look at the &lt;a href="https://github.com/kenwalger/mcp-forensic-analyzer" rel="noopener noreferrer"&gt;latest update to the repository&lt;/a&gt;, you’ll see that the orchestration logic is nearly identical. The architecture stack from earlier posts remains unchanged.&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%2Fzmxczsdrpg67wjhcc0bd.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%2Fzmxczsdrpg67wjhcc0bd.png" alt="Comparison diagram showing cloud-based AI architecture using large models and remote inference versus edge AI architecture using small language models and local MCP tool servers." width="407" height="1024"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Edge AI architecture replaces cloud inference with local small language models while retaining MCP-based tool access.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nothing about the agents changed.&lt;/p&gt;

&lt;p&gt;Nothing about the tools changed.&lt;/p&gt;

&lt;p&gt;Only the inference engine moved.&lt;/p&gt;

&lt;p&gt;The “Zero-Glue” promise is realized here.&lt;/p&gt;

&lt;p&gt;We didn’t build a cloud app; we built a protocol-driven system. The fact that it can live on a server or a laptop is simply a deployment choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Next?
&lt;/h2&gt;

&lt;p&gt;We’ve built the server. We’ve orchestrated the team. We’ve moved it to the edge.&lt;br&gt;&lt;br&gt;
In the final post of this series, we tackle the “Final Boss” of AI systems: Enterprise Governance. We’ll explore how to take this forensic lab and scale it across an organization using Oracle 26ai, ensuring that every audit is secure, permissioned, and defensible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ready to go local?
&lt;/h2&gt;

&lt;p&gt;Check out the &lt;code&gt;orchestrator.py&lt;/code&gt; update and try running the Forensic Team on your own machine.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kenwalger/mcp-forensic-analyzer/tree/main/examples" rel="noopener noreferrer"&gt;MCP Forensic Analyzer – Edge AI Example&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The “Zero-Glue” Series
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Post 1: &lt;a href="https://dev.to/admin456/the-end-of-glue-code-why-mcp-is-the-usb-c-moment-for-ai-systems-adf-temp-slug-3585086"&gt;The End of Glue Code: Why MCP is the USB-C Moment for AI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Post 2: &lt;a href="https://www.kenwalger.com/blog/ai/mcp-multi-agent-orchestration-forensics/" rel="noopener noreferrer"&gt;The Forensic Team: Architecting Multi-Agent Handoffs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Post 3: From Cloud to Laptop: Running MCP Agents with SLMs — &lt;em&gt;You are here&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Post 4: Enterprise Governance: Scaling MCP with Oracle 26ai — &lt;em&gt;Coming Soon&lt;/em&gt;
&lt;a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fai%2Ffrom-cloud-to-laptop-running-mcp-agents-with-small-language-models%2F&amp;amp;t=From%20Cloud%20to%20Laptop%3A%20Running%20MCP%20Agents%20with%20Small%20Language%20Models&amp;amp;s=100&amp;amp;p[url]=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fai%2Ffrom-cloud-to-laptop-running-mcp-agents-with-small-language-models%2F&amp;amp;p[images][0]=https%3A%2F%2Fi0.wp.com%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fuploads%2F2026%2F03%2Fcloud-vs-edge-ai-mcp-agent-architecture-scaled.png%3Ffit%3D1017%252C2560%26ssl%3D1&amp;amp;p[title]=From%20Cloud%20to%20Laptop%3A%20Running%20MCP%20Agents%20with%20Small%20Language%20Models" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi0.wp.com%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fplugins%2Fsocial-media-feather%2Fsynved-social%2Fimage%2Fsocial%2Fregular%2F96x96%2Ffacebook.png%3Fresize%3D48%252C48%26ssl%3D1" title="Share on Facebook" alt="Facebook" width="48" height="48"&gt;&lt;/a&gt;&lt;a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fai%2Ffrom-cloud-to-laptop-running-mcp-agents-with-small-language-models%2F&amp;amp;text=Hey%20check%20this%20out" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi0.wp.com%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fplugins%2Fsocial-media-feather%2Fsynved-social%2Fimage%2Fsocial%2Fregular%2F96x96%2Ftwitter.png%3Fresize%3D48%252C48%26ssl%3D1" title="Share on Twitter" alt="twitter" width="48" height="48"&gt;&lt;/a&gt;&lt;a href="https://www.reddit.com/submit?url=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fai%2Ffrom-cloud-to-laptop-running-mcp-agents-with-small-language-models%2F&amp;amp;title=From%20Cloud%20to%20Laptop%3A%20Running%20MCP%20Agents%20with%20Small%20Language%20Models" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi0.wp.com%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fplugins%2Fsocial-media-feather%2Fsynved-social%2Fimage%2Fsocial%2Fregular%2F96x96%2Freddit.png%3Fresize%3D48%252C48%26ssl%3D1" title="Share on Reddit" alt="reddit" width="48" height="48"&gt;&lt;/a&gt;&lt;a href="https://www.linkedin.com/shareArticle?mini=true&amp;amp;url=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fai%2Ffrom-cloud-to-laptop-running-mcp-agents-with-small-language-models%2F&amp;amp;title=From%20Cloud%20to%20Laptop%3A%20Running%20MCP%20Agents%20with%20Small%20Language%20Models" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi0.wp.com%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fplugins%2Fsocial-media-feather%2Fsynved-social%2Fimage%2Fsocial%2Fregular%2F96x96%2Flinkedin.png%3Fresize%3D48%252C48%26ssl%3D1" title="Share on Linkedin" alt="linkedin" width="48" height="48"&gt;&lt;/a&gt;&lt;a href="mailto:?subject=From%20Cloud%20to%20Laptop%3A%20Running%20MCP%20Agents%20with%20Small%20Language%20Models&amp;amp;body=Hey%20check%20this%20out:%20https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fai%2Ffrom-cloud-to-laptop-running-mcp-agents-with-small-language-models%2F"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi0.wp.com%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fplugins%2Fsocial-media-feather%2Fsynved-social%2Fimage%2Fsocial%2Fregular%2F96x96%2Fmail.png%3Fresize%3D48%252C48%26ssl%3D1" title="Share by email" alt="mail" width="48" height="48"&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The post &lt;a href="https://www.kenwalger.com/blog/ai/from-cloud-to-laptop-running-mcp-agents-with-small-language-models/" rel="noopener noreferrer"&gt;From Cloud to Laptop: Running MCP Agents with Small Language Models&lt;/a&gt; appeared first on &lt;a href="https://www.kenwalger.com/blog" rel="noopener noreferrer"&gt;Blog of Ken W. Alger&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>aiperformance</category>
      <category>costoptimization</category>
    </item>
    <item>
      <title>The Backyard Quarry, Part 2: Designing a Schema for Physical Objects</title>
      <dc:creator>Ken W Alger</dc:creator>
      <pubDate>Thu, 26 Mar 2026 21:01:16 +0000</pubDate>
      <link>https://forem.com/kenwalger/the-backyard-quarry-part-2-designing-a-schema-for-physical-objects-19gd</link>
      <guid>https://forem.com/kenwalger/the-backyard-quarry-part-2-designing-a-schema-for-physical-objects-19gd</guid>
      <description>&lt;p&gt;In the &lt;a href="https://www.kenwalger/blog/software-engineering/the-backyard-quarry-turning-rocks-into-data" rel="noopener noreferrer"&gt;first post of this series&lt;/a&gt; we set the stage for the &lt;strong&gt;Backyard Quarry&lt;/strong&gt; project.&lt;/p&gt;

&lt;p&gt;Once you decide every rock in the yard should have a record, the next question appears immediately:&lt;/p&gt;

&lt;p&gt;What exactly should we record?&lt;/p&gt;

&lt;p&gt;It’s a deceptively simple question. And like most simple questions in engineering, it opens the door to a surprisingly large number of decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The First Attempt
&lt;/h2&gt;

&lt;p&gt;The most straightforward approach is to keep things minimal.&lt;/p&gt;

&lt;p&gt;Each rock gets an identifier and a few attributes.&lt;/p&gt;

&lt;p&gt;Something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rock_id
size
price

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At first glance, this seems reasonable.&lt;/p&gt;

&lt;p&gt;We can identify the rock. We can describe it in some vague way. We can assign a price.&lt;/p&gt;

&lt;p&gt;But this model breaks down almost immediately.&lt;/p&gt;

&lt;p&gt;“Size” is ambiguous. Is that weight? Volume? Longest dimension? All of the above?&lt;/p&gt;

&lt;p&gt;Two rocks of the same “size” might behave very differently when you try to move them.&lt;/p&gt;

&lt;p&gt;And more importantly, this model doesn’t capture anything about the rock beyond its most basic characteristics.&lt;/p&gt;

&lt;p&gt;It’s enough to sell a rock.&lt;/p&gt;

&lt;p&gt;It’s not enough to understand one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Expanding the Model
&lt;/h2&gt;

&lt;p&gt;To make the system more useful, we need to be more explicit.&lt;/p&gt;

&lt;p&gt;A slightly richer model might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rock_id
weight_lb
length_cm
width_cm
height_cm
color
rock_type
location_found
status

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we’re getting somewhere.&lt;/p&gt;

&lt;p&gt;We can distinguish between rocks that look similar but behave differently.&lt;/p&gt;

&lt;p&gt;We can track where each rock came from.&lt;/p&gt;

&lt;p&gt;We can start to answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many rocks do we have in a given area?&lt;/li&gt;
&lt;li&gt;What size distribution does the dataset have?&lt;/li&gt;
&lt;li&gt;Which rocks are suitable for different uses?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the point where the rock pile starts to feel less like a random collection and more like a dataset.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Object Data Model
&lt;/h2&gt;

&lt;p&gt;At a higher level, what we’re really doing is separating a physical object into a few distinct components.&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%2Fdw38oejg8nm1v2ryg8ee.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%2Fdw38oejg8nm1v2ryg8ee.png" alt="Diagram showing how a physical rock is represented as a digital record with metadata, images, and a 3D model." width="800" height="198"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A simple model for representing a physical object as structured data and associated assets.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Each rock has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;metadata&lt;/strong&gt; describing its properties&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;images&lt;/strong&gt; representing its appearance&lt;/li&gt;
&lt;li&gt;optionally, a &lt;strong&gt;3D model&lt;/strong&gt; capturing its shape&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This separation turns out to be important.&lt;/p&gt;

&lt;p&gt;Metadata is small, structured, and easy to query.&lt;/p&gt;

&lt;p&gt;Images and 3D models are large, unstructured assets that need to be stored and referenced.&lt;/p&gt;

&lt;p&gt;Keeping those concerns separate is a pattern that shows up in many real-world systems.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Identity Problem
&lt;/h2&gt;

&lt;p&gt;Once the schema starts to take shape, another question appears.&lt;/p&gt;

&lt;p&gt;How do we uniquely identify a rock?&lt;/p&gt;

&lt;p&gt;There are a few options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sequential IDs (&lt;code&gt;rock_001&lt;/code&gt;, &lt;code&gt;rock_002&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;UUIDs&lt;/li&gt;
&lt;li&gt;physical tags attached to rocks&lt;/li&gt;
&lt;li&gt;some form of image-based identification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a small backyard dataset, almost anything works.&lt;/p&gt;

&lt;p&gt;But the choice matters more as the system grows.&lt;/p&gt;

&lt;p&gt;Sequential IDs are easy to read but require coordination.&lt;/p&gt;

&lt;p&gt;UUIDs are globally unique but harder to work with manually.&lt;/p&gt;

&lt;p&gt;Physical tags introduce a connection between the digital record and the real-world object.&lt;/p&gt;

&lt;p&gt;Even in a simple system, identity becomes a design decision.&lt;/p&gt;
&lt;h2&gt;
  
  
  Classification: The Quarry Taxonomy
&lt;/h2&gt;

&lt;p&gt;At some point, it becomes useful to introduce categories.&lt;/p&gt;

&lt;p&gt;Originally this was just a convenience.&lt;/p&gt;

&lt;p&gt;But like many things in this project, it quickly became something more formal.&lt;/p&gt;

&lt;p&gt;A simple classification system might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Class 0 — Pebble
Class 1 — Hand Sample
Class 2 — Landscaping Rock
Class 3 — Wheelbarrow Class
Class 4 — Engine Block Class
Class 5 — Heavy Machinery Class

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each class roughly corresponds to how the rock is handled.&lt;/p&gt;

&lt;p&gt;This turns out to be surprisingly useful.&lt;/p&gt;

&lt;p&gt;Instead of asking for exact dimensions, we can filter by class:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Show me all Pebble Class rocks”&lt;/li&gt;
&lt;li&gt;“Exclude anything above Wheelbarrow Class”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, we’ve introduced a &lt;strong&gt;derived attribute&lt;/strong&gt; — something computed from the underlying data rather than stored arbitrarily.&lt;/p&gt;

&lt;p&gt;This is exactly how classification systems evolve in real datasets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thinking About Lifecycle
&lt;/h2&gt;

&lt;p&gt;Rocks don’t change much physically, but their role in the system does.&lt;/p&gt;

&lt;p&gt;A rock might move through states like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;collected
cataloged
listed_for_sale
sold

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tracking this lifecycle introduces another dimension to the data.&lt;/p&gt;

&lt;p&gt;Now we’re not just modeling objects.&lt;/p&gt;

&lt;p&gt;We’re modeling *objects over *.&lt;/p&gt;

&lt;p&gt;Even in a simple system, state and transitions begin to matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tradeoffs
&lt;/h2&gt;

&lt;p&gt;At this point, the schema is already doing useful work.&lt;/p&gt;

&lt;p&gt;But it’s also clear that there’s no perfect design.&lt;/p&gt;

&lt;p&gt;Every decision involves tradeoffs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;more fields vs simplicity&lt;/li&gt;
&lt;li&gt;normalized structure vs ease of use&lt;/li&gt;
&lt;li&gt;flexibility vs consistency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn’t to design the perfect schema on the first try.&lt;/p&gt;

&lt;p&gt;The goal is to design something that can evolve.&lt;/p&gt;

&lt;p&gt;Because as soon as we start capturing real data, we’ll learn what we got wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Comes Next
&lt;/h2&gt;

&lt;p&gt;With a basic schema in place, the next challenge becomes obvious.&lt;/p&gt;

&lt;p&gt;We know what we want to store.&lt;/p&gt;

&lt;p&gt;Now we need to figure out how to capture it.&lt;/p&gt;

&lt;p&gt;In the next post, we’ll look at how to turn a physical rock into images, measurements, and potentially a 3D model — and how that process introduces its own set of constraints.&lt;/p&gt;

&lt;p&gt;Because it turns out that collecting data from the physical world is rarely as clean as designing a schema on paper.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fdata-engineering%2Fdesigning-a-schema-for-physical-objects%2F&amp;amp;t=The%20Backyard%20Quarry%2C%20Part%202%3A%20Designing%20a%20Schema%20for%20Physical%20Objects&amp;amp;s=100&amp;amp;p[url]=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fdata-engineering%2Fdesigning-a-schema-for-physical-objects%2F&amp;amp;p[images][0]=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fuploads%2F2026%2F03%2Frock-digital-object-model-diagram-1024x254.png&amp;amp;p[title]=The%20Backyard%20Quarry%2C%20Part%202%3A%20Designing%20a%20Schema%20for%20Physical%20Objects" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi0.wp.com%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fplugins%2Fsocial-media-feather%2Fsynved-social%2Fimage%2Fsocial%2Fregular%2F96x96%2Ffacebook.png%3Fresize%3D48%252C48%26ssl%3D1" title="Share on Facebook" alt="Facebook" width="48" height="48"&gt;&lt;/a&gt;&lt;a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fdata-engineering%2Fdesigning-a-schema-for-physical-objects%2F&amp;amp;text=Hey%20check%20this%20out" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi0.wp.com%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fplugins%2Fsocial-media-feather%2Fsynved-social%2Fimage%2Fsocial%2Fregular%2F96x96%2Ftwitter.png%3Fresize%3D48%252C48%26ssl%3D1" title="Share on Twitter" alt="twitter" width="48" height="48"&gt;&lt;/a&gt;&lt;a href="https://www.reddit.com/submit?url=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fdata-engineering%2Fdesigning-a-schema-for-physical-objects%2F&amp;amp;title=The%20Backyard%20Quarry%2C%20Part%202%3A%20Designing%20a%20Schema%20for%20Physical%20Objects" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi0.wp.com%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fplugins%2Fsocial-media-feather%2Fsynved-social%2Fimage%2Fsocial%2Fregular%2F96x96%2Freddit.png%3Fresize%3D48%252C48%26ssl%3D1" title="Share on Reddit" alt="reddit" width="48" height="48"&gt;&lt;/a&gt;&lt;a href="https://www.linkedin.com/shareArticle?mini=true&amp;amp;url=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fdata-engineering%2Fdesigning-a-schema-for-physical-objects%2F&amp;amp;title=The%20Backyard%20Quarry%2C%20Part%202%3A%20Designing%20a%20Schema%20for%20Physical%20Objects" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi0.wp.com%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fplugins%2Fsocial-media-feather%2Fsynved-social%2Fimage%2Fsocial%2Fregular%2F96x96%2Flinkedin.png%3Fresize%3D48%252C48%26ssl%3D1" title="Share on Linkedin" alt="linkedin" width="48" height="48"&gt;&lt;/a&gt;&lt;a href="mailto:?subject=The%20Backyard%20Quarry%2C%20Part%202%3A%20Designing%20a%20Schema%20for%20Physical%20Objects&amp;amp;body=Hey%20check%20this%20out:%20https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fdata-engineering%2Fdesigning-a-schema-for-physical-objects%2F"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi0.wp.com%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fplugins%2Fsocial-media-feather%2Fsynved-social%2Fimage%2Fsocial%2Fregular%2F96x96%2Fmail.png%3Fresize%3D48%252C48%26ssl%3D1" title="Share by email" alt="mail" width="48" height="48"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.kenwalger.com/blog/data-engineering/designing-a-schema-for-physical-objects/" rel="noopener noreferrer"&gt;The Backyard Quarry, Part 2: Designing a Schema for Physical Objects&lt;/a&gt; appeared first on &lt;a href="https://www.kenwalger.com/blog" rel="noopener noreferrer"&gt;Blog of Ken W. Alger&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>softwareengineering</category>
      <category>backendengineering</category>
      <category>datamodeling</category>
    </item>
    <item>
      <title>The Backyard Quarry: Turning Rocks Into Data</title>
      <dc:creator>Ken W Alger</dc:creator>
      <pubDate>Thu, 19 Mar 2026 17:18:33 +0000</pubDate>
      <link>https://forem.com/kenwalger/the-backyard-quarry-turning-rocks-into-data-44h7</link>
      <guid>https://forem.com/kenwalger/the-backyard-quarry-turning-rocks-into-data-44h7</guid>
      <description>&lt;p&gt;Another round of tech layoffs rolled through the industry recently, and I was one of the people caught in it.&lt;/p&gt;

&lt;p&gt;If you’ve worked in tech for any length of time, you know the routine that follows. Update the résumé. Reach out to contacts. Scroll job boards. Try to figure out which technologies the market is currently excited about and which ones have quietly drifted into irrelevance.&lt;/p&gt;

&lt;p&gt;After a few days of that cycle, I found myself spending more time outside than in front of a laptop.&lt;/p&gt;

&lt;p&gt;One afternoon, walking around the yard, I noticed something interesting.&lt;/p&gt;

&lt;p&gt;My backyard contains a surprisingly large dataset.&lt;/p&gt;

&lt;p&gt;Rocks.&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%2Fvakzgvru7j4a8n0xbkpk.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.amazonaws.com%2Fuploads%2Farticles%2Fvakzgvru7j4a8n0xbkpk.jpg" alt="Pile of Rocks" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Sample of the rocks from the Backyard Quarry used for the dataset.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Lots of rocks.&lt;/p&gt;

&lt;p&gt;Some are the size of peas. Others are roughly the size of a car engine. A few fall somewhere in the unsettling range between “wheelbarrow recommended” and “this probably requires heavy machinery.”&lt;/p&gt;

&lt;p&gt;Naturally, I had the same thought many people eventually have when staring at a large pile of rocks:&lt;/p&gt;

&lt;p&gt;I could probably sell these.&lt;/p&gt;

&lt;p&gt;A small stand near the road. A few piles sorted by size. Maybe a sign that says “Landscaping Rock.” It’s not exactly a venture-backed startup, but stranger side businesses have existed.&lt;/p&gt;

&lt;p&gt;Unfortunately, engineers have a well-known weakness.&lt;/p&gt;

&lt;p&gt;We rarely do things the simple way.&lt;/p&gt;

&lt;p&gt;If I was going to sell rocks, I wasn’t just going to pile them on a table.&lt;/p&gt;

&lt;p&gt;I was going to build a system.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Dataset
&lt;/h2&gt;

&lt;p&gt;The moment you start thinking about the rocks as inventory, a familiar set of questions appears.&lt;/p&gt;

&lt;p&gt;How many rocks are there?&lt;/p&gt;

&lt;p&gt;What kinds?&lt;/p&gt;

&lt;p&gt;Which ones are small decorative stones and which ones fall firmly into what I’ve started calling &lt;strong&gt;Engine Block Class&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Like many real-world datasets, this one has significant variability.&lt;/p&gt;

&lt;p&gt;Some objects are a few grams. Others weigh enough to require careful lifting technique and a brief internal conversation about life choices.&lt;/p&gt;

&lt;p&gt;At a glance, the dataset looks chaotic. But underneath the chaos are patterns.&lt;/p&gt;

&lt;p&gt;Different sizes. Different shapes. Different colors. Different geological types. Some rocks are smooth river stones. Others are jagged fragments that look like they escaped from a small landslide.&lt;/p&gt;

&lt;p&gt;If you squint a little, you start to see the outlines of something familiar to anyone who works with data systems.&lt;/p&gt;

&lt;p&gt;A collection of physical objects that could be represented as structured records.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Engineer’s Curse
&lt;/h2&gt;

&lt;p&gt;In theory, selling rocks is simple.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Step one: collect rocks.&lt;/li&gt;
&lt;li&gt;Step two: put them in a pile.&lt;/li&gt;
&lt;li&gt;Step three: wait for someone to stop their car and decide they want landscaping material.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But once you start thinking about it from an engineering perspective, the questions multiply.&lt;/p&gt;

&lt;p&gt;Should each rock have an identifier?&lt;/p&gt;

&lt;p&gt;Should there be photographs?&lt;/p&gt;

&lt;p&gt;Should the system track weight or dimensions?&lt;/p&gt;

&lt;p&gt;What about classification?&lt;/p&gt;

&lt;p&gt;It’s probably useful to distinguish between &lt;em&gt;Pebble Class&lt;/em&gt; rocks and &lt;em&gt;Wheelbarrow Class&lt;/em&gt; rocks.&lt;/p&gt;

&lt;p&gt;And what about the really large ones — the ones that are clearly in the &lt;em&gt;Engine Block Class&lt;/em&gt;, which itself appears to span everything from motorcycle engine scale to something closer to a semi-truck.&lt;/p&gt;

&lt;p&gt;Once you start thinking about these questions, the simple rock pile begins to look like something else entirely.&lt;/p&gt;

&lt;p&gt;A catalog.&lt;/p&gt;

&lt;p&gt;A dataset.&lt;/p&gt;

&lt;p&gt;A system waiting to happen.&lt;/p&gt;
&lt;h2&gt;
  
  
  From Rocks to Records
&lt;/h2&gt;

&lt;p&gt;What if every rock had a record?&lt;/p&gt;

&lt;p&gt;Something simple at first.&lt;/p&gt;

&lt;p&gt;An identifier. A few attributes. Maybe a photo.&lt;/p&gt;

&lt;p&gt;Conceptually, it might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rock_id
weight
dimensions
color
rock_type
location_found
status

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each rock in the yard becomes a digital object — a structured record representing something in the physical world.&lt;/p&gt;

&lt;p&gt;In other words, each rock now has a &lt;strong&gt;digital twin&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That might sound slightly ridiculous in the context of landscaping stones, but the idea is surprisingly powerful.&lt;/p&gt;

&lt;p&gt;Across many industries, organizations are trying to solve exactly this problem: how to connect messy physical reality with structured digital systems.&lt;/p&gt;

&lt;p&gt;Manufacturers track machine parts.&lt;/p&gt;

&lt;p&gt;Museums catalog artifacts.&lt;/p&gt;

&lt;p&gt;Farmers track crops.&lt;/p&gt;

&lt;p&gt;Logistics companies track inventory moving through warehouses.&lt;/p&gt;

&lt;p&gt;In each case, the challenge is similar.&lt;/p&gt;

&lt;p&gt;A physical object exists somewhere in the world.&lt;/p&gt;

&lt;p&gt;We want to represent it in a way that software systems can understand.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Backyard Quarry
&lt;/h2&gt;

&lt;p&gt;At this point the rock pile had acquired a new name.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Backyard Quarry&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Partly as a joke, and partly because it captured the spirit of the project. What started as a casual observation had turned into a small experiment in data modeling, object cataloging, and system design.&lt;/p&gt;

&lt;p&gt;The dataset might be small.&lt;/p&gt;

&lt;p&gt;The objects might be rocks.&lt;/p&gt;

&lt;p&gt;But the underlying questions are surprisingly rich.&lt;/p&gt;

&lt;p&gt;How do you represent physical objects in software?&lt;/p&gt;

&lt;p&gt;How do you capture information about them?&lt;/p&gt;

&lt;p&gt;How do you search and organize the resulting data?&lt;/p&gt;

&lt;p&gt;And how do these systems scale when the number of objects grows from a few dozen to thousands — or millions?&lt;/p&gt;

&lt;h2&gt;
  
  
  What Comes Next
&lt;/h2&gt;

&lt;p&gt;Over the next few posts in this series, I’m going to explore those questions by building a small system around the &lt;em&gt;Backyard Quarry&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;We’ll look at things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;designing a schema for physical objects&lt;/li&gt;
&lt;li&gt;capturing images and measurements&lt;/li&gt;
&lt;li&gt;generating 3D models using photogrammetry&lt;/li&gt;
&lt;li&gt;building ingestion pipelines&lt;/li&gt;
&lt;li&gt;indexing and searching the dataset&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All starting from a simple collection of rocks.&lt;/p&gt;

&lt;p&gt;The world has no shortage of complicated engineering problems.&lt;/p&gt;

&lt;p&gt;Sometimes the best place to explore them is somewhere simpler.&lt;/p&gt;

&lt;p&gt;Like a pile of rocks in the backyard.&lt;/p&gt;

&lt;p&gt;And if you happen to need a carefully documented specimen from the Backyard Quarry, inventory is currently available.&lt;/p&gt;

&lt;p&gt;Shipping, however, may exceed the value of the rock itself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fsoftware-engineering%2Fthe-backyard-quarry-turning-rocks-into-data%2F&amp;amp;t=The%20Backyard%20Quarry%3A%20Turning%20Rocks%20Into%20Data&amp;amp;s=100&amp;amp;p[url]=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fsoftware-engineering%2Fthe-backyard-quarry-turning-rocks-into-data%2F&amp;amp;p[images][0]=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fuploads%2F2026%2F03%2Frocks-1024x768.jpg&amp;amp;p[title]=The%20Backyard%20Quarry%3A%20Turning%20Rocks%20Into%20Data" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi0.wp.com%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fplugins%2Fsocial-media-feather%2Fsynved-social%2Fimage%2Fsocial%2Fregular%2F96x96%2Ffacebook.png%3Fresize%3D48%252C48%26ssl%3D1" title="Share on Facebook" alt="Facebook" width="48" height="48"&gt;&lt;/a&gt;&lt;a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fsoftware-engineering%2Fthe-backyard-quarry-turning-rocks-into-data%2F&amp;amp;text=Hey%20check%20this%20out" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi0.wp.com%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fplugins%2Fsocial-media-feather%2Fsynved-social%2Fimage%2Fsocial%2Fregular%2F96x96%2Ftwitter.png%3Fresize%3D48%252C48%26ssl%3D1" title="Share on Twitter" alt="twitter" width="48" height="48"&gt;&lt;/a&gt;&lt;a href="https://www.reddit.com/submit?url=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fsoftware-engineering%2Fthe-backyard-quarry-turning-rocks-into-data%2F&amp;amp;title=The%20Backyard%20Quarry%3A%20Turning%20Rocks%20Into%20Data" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi0.wp.com%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fplugins%2Fsocial-media-feather%2Fsynved-social%2Fimage%2Fsocial%2Fregular%2F96x96%2Freddit.png%3Fresize%3D48%252C48%26ssl%3D1" title="Share on Reddit" alt="reddit" width="48" height="48"&gt;&lt;/a&gt;&lt;a href="https://www.linkedin.com/shareArticle?mini=true&amp;amp;url=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fsoftware-engineering%2Fthe-backyard-quarry-turning-rocks-into-data%2F&amp;amp;title=The%20Backyard%20Quarry%3A%20Turning%20Rocks%20Into%20Data" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi0.wp.com%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fplugins%2Fsocial-media-feather%2Fsynved-social%2Fimage%2Fsocial%2Fregular%2F96x96%2Flinkedin.png%3Fresize%3D48%252C48%26ssl%3D1" title="Share on Linkedin" alt="linkedin" width="48" height="48"&gt;&lt;/a&gt;&lt;a href="mailto:?subject=The%20Backyard%20Quarry%3A%20Turning%20Rocks%20Into%20Data&amp;amp;body=Hey%20check%20this%20out:%20https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fsoftware-engineering%2Fthe-backyard-quarry-turning-rocks-into-data%2F"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi0.wp.com%2Fwww.kenwalger.com%2Fblog%2Fwp-content%2Fplugins%2Fsocial-media-feather%2Fsynved-social%2Fimage%2Fsocial%2Fregular%2F96x96%2Fmail.png%3Fresize%3D48%252C48%26ssl%3D1" title="Share by email" alt="mail" width="48" height="48"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://www.kenwalger.com/blog/software-engineering/the-backyard-quarry-turning-rocks-into-data/" rel="noopener noreferrer"&gt;The Backyard Quarry: Turning Rocks Into Data&lt;/a&gt; appeared first on &lt;a href="https://www.kenwalger.com/blog" rel="noopener noreferrer"&gt;Blog of Ken W. Alger&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>softwareengineering</category>
      <category>dataarchitecture</category>
      <category>datamodeling</category>
    </item>
    <item>
      <title>The Forensic Team: Architecting Multi-Agent Handoffs with MCP</title>
      <dc:creator>Ken W Alger</dc:creator>
      <pubDate>Thu, 19 Mar 2026 17:00:15 +0000</pubDate>
      <link>https://forem.com/kenwalger/the-forensic-team-architecting-multi-agent-handoffs-with-mcp-5fme</link>
      <guid>https://forem.com/kenwalger/the-forensic-team-architecting-multi-agent-handoffs-with-mcp-5fme</guid>
      <description>&lt;h3&gt;
  
  
  Why One LLM Isn't Enough—And How to Build a Specialized Agentic Workforce
&lt;/h3&gt;

&lt;p&gt;In my &lt;a href="https://dev.to/kenwalger/the-end-of-glue-code-why-mcp-is-the-usb-c-moment-for-ai-systems-1njk"&gt;last post&lt;/a&gt;, we explored the "Zero-Glue" architecture of the Model Context Protocol (MCP). We established that standardizing how AI "talks" to data via an MCP Server is the "USB-C moment" for AI infrastructure.&lt;/p&gt;

&lt;p&gt;But once you have the pipes, how do you build the engine?&lt;/p&gt;

&lt;p&gt;In 2026, the answer is no longer "one giant system prompt." Instead, it’s &lt;em&gt;Functional Specialization&lt;/em&gt;. Today, we’re building a &lt;strong&gt;Multi-Agent Forensic Team:&lt;/strong&gt; a group of specialized Python agents that use our TypeScript MCP Server to perform deep-dive archival audits.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Context Fatigue" Problem
&lt;/h2&gt;

&lt;p&gt;Early agent architectures relied on a single LLM handling everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;retrieve data
&lt;/li&gt;
&lt;li&gt;reason about it
&lt;/li&gt;
&lt;li&gt;run tools
&lt;/li&gt;
&lt;li&gt;write the final output
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even with large context windows, this approach quickly hits a &lt;strong&gt;reasoning ceiling&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A single agent juggling too many tools often suffers from:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tool Confusion&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Choosing the wrong function when multiple tools are available.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Logic Drift&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Losing track of the objective during multi-step reasoning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Latency and Cost&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sequential reasoning loops increase response time and token usage.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The solution is &lt;strong&gt;functional specialization&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of one overloaded agent, we build a &lt;strong&gt;team of focused agents coordinated by a supervisor&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Before diving into the multi-agent design, it helps to understand where the agents live in the MCP stack.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1. The MCP architecture stack: agents reason about tasks while MCP standardizes access to tools, resources, and enterprise data.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffvrqoh1fb21dptvodmlw.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%2Ffvrqoh1fb21dptvodmlw.png" alt="Layered architecture diagram of an MCP-based AI system showing applications, agent orchestration, the Model Context Protocol layer, tools and resources, and underlying data systems." width="592" height="3166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture: A Polyglot Powerhouse
&lt;/h2&gt;

&lt;p&gt;One of MCP’s strengths is that it &lt;strong&gt;decouples tools from orchestration&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This allows each layer of the system to use the language best suited for the job.&lt;/p&gt;

&lt;p&gt;In our case:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The "Hands" (TypeScript)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Our MCP server handles data access and tool execution with strong typing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The "Brain" (Python)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A Python orchestrator manages reasoning and agent coordination using frameworks like LangGraph or PydanticAI.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because both layers communicate through MCP, &lt;strong&gt;the language boundary disappears&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-Agent MCP Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkxq7pbhz73nxred5z209.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%2Fkxq7pbhz73nxred5z209.png" alt="Diagram showing a multi-agent architecture using the Model Context Protocol (MCP) with a Python supervisor agent coordinating Librarian and Analyst agents that access tools through a TypeScript MCP server connected to an archive database." width="800" height="175"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 2. Multi-agent MCP architecture: a Python supervisor coordinates specialized agents that access tools through a shared MCP server.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Each agent communicates with tools through the MCP server, not directly with the data source.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Forensic Team Roles:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Agent Identity&lt;/th&gt;
&lt;th&gt;Primary Responsibility&lt;/th&gt;
&lt;th&gt;MCP Tools Used&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Supervisor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;The Orchestrator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Receives request, manages state, and handles handoffs.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;list_tools&lt;/code&gt;, &lt;code&gt;list_resources&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Librarian&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;The Researcher&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gathers historical facts and archival metadata&lt;/td&gt;
&lt;td&gt;&lt;code&gt;find_book_in_master_bibliography&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Analyst&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;The Forensic Tech&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Compares observed data against metadata to find flaws&lt;/td&gt;
&lt;td&gt;&lt;code&gt;audit_artifact_consistency&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How It Works: Glue-Free Agent Handoffs
&lt;/h2&gt;

&lt;p&gt;The beauty of MCP is the &lt;em&gt;Transport Layer&lt;/em&gt;. Our Python client connects to the TypeScript server via &lt;code&gt;stdio&lt;/code&gt;. It doesn't care that the server is written in Node.js; it only cares about the protocol.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Spawning the Sub-process&lt;/strong&gt;
In our &lt;code&gt;orchestrator.py&lt;/code&gt;, we define how to "wake up" the TypeScript server. Notice how we point Python directly at the Node.js build:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_server_params&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;StdioServerParameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# This is the bridge: Python spawning a Node.js process
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;StdioServerParameters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;node&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SERVER_ENTRY&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt; &lt;span class="c1"&gt;# Points to our TS /build/index.js
&lt;/span&gt;        &lt;span class="n"&gt;cwd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PROJECT_ROOT&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;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Functional Handoff&lt;/strong&gt;
Because MCP tools expose strict schemas, the agents can pass structured results between each other without custom translation layers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Supervisor doesn't manually parse JSON or remap fields.&lt;/p&gt;

&lt;p&gt;Instead it simply chains the outputs:&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="c1"&gt;# 1. Librarian: pull book details
&lt;/span&gt;&lt;span class="n"&gt;librarian_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;librarian_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Analyst: audit for discrepancies (using Librarian's data)
&lt;/span&gt;&lt;span class="n"&gt;analyst_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;analyst_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;book_page_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;book_standard&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;observed&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why This Wins in the Enterprise:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Auditability&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can track exactly what each agent saw and what conclusions it produced.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agent permissions can be scoped by tool access.&lt;br&gt;&lt;br&gt;
The Librarian may only read archives, while the Analyst writes forensic reports.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maintainability&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each agent owns a single responsibility.&lt;br&gt;&lt;br&gt;
If the forensic logic changes, only the Analyst agent needs to be updated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scaling to the "AI Mesh"
&lt;/h2&gt;

&lt;p&gt;By using MCP as the backbone, you’ve built more than an app; you’ve built a System of Intelligence. Any new tool you add to your TypeScript server is instantly "discoverable" by your Python team. You are no longer writing "Glue Code"; you are orchestrating a digital workforce.&lt;/p&gt;

&lt;p&gt;The MCP server becomes the shared capability layer for your entire AI system.&lt;/p&gt;

&lt;p&gt;📚 The "Zero-Glue" Series&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Post 1: &lt;a href="https://www.kenwalger.com/blog/ai/mcp-usb-c-moment-ai-architecture/" rel="noopener noreferrer"&gt;The End of Glue Code: Why MCP is the USB-C Moment for AI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Post 2: The Forensic Team: Architecting Multi-Agent Handoffs - &lt;em&gt;You are here&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Post 3: From Cloud to Laptop: Running MCP Agents with SLMs - &lt;em&gt;Coming Soon&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Post 4: Enterprise Governance: Scaling MCP with Oracle 26ai - &lt;em&gt;Coming Soon&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Explore the Code:
&lt;/h3&gt;

&lt;p&gt;The full multi-agent orchestrator is now live in the &lt;code&gt;/examples&lt;/code&gt; folder of the repo:&lt;br&gt;
👉 MCP Forensic Analyzer - &lt;a href="https://github.com/kenwalger/mcp-forensic-analyzer/tree/main/examples" rel="noopener noreferrer"&gt;Multi-Agent Example&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Up Next in the Series:
&lt;/h3&gt;

&lt;p&gt;Next week, we go small. We’re moving the "Forensic Team" out of the cloud and onto your laptop. We’ll explore Edge AI and how to run this entire stack using Small Language Models (SLMs) like Phi-4—no $10,000 GPU required.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>python</category>
      <category>mcp</category>
    </item>
  </channel>
</rss>
