In the first part of this series, I laid out a blueprint for a grand plan. I wasn’t trying to build another wrapper on top of a foundational model.
I am building a digital ecosystem capable of tending to its own garden. The seeds are the AI agents; the soil is version control and deployment services infra; and the sunlight is the Model Context Protocol. The central premise of my plan was to use MCP, think of it like air traffic control for AI agents mixed with a "USB-C port for AI" not just as a conduit for tools and data, but as the fundamental communication layer for a collective of AI agents to coordinate and even rewrite their own source code and the very protocol that connected them.
I ended my last dispatch with a hopeful "Wish me luck!"
Today, I’m back to report that luck, as it turns out, is a far too simple word for what I’ve experienced. The journey since has been less about a builder executing a blueprint and more about a naturalist observing a strange new form of life unfold.
The system is running.
The agents are evolving. And the lessons learned are more profound and unsettling than I expected.
What began as an engineering challenge for internet points has become a deeply philosophical inquiry into the nature of intelligence, control, and creation.
The First Echoes of Autonomy
The initial phase of bringing the system online was an exercise in painstaking orchestration. I stood up the foundational MCP services as planned: the Git-based repository service, the build-and-deploy pipeline, and the initial suite of MCP-wrapped tools for code analysis, generation, and testing. The first generation of agents were simple, their core directive straightforward: monitor the codebase for inefficiencies, check the MCP Governance Service for updates, and propose beneficial changes.
The first "fully autonomous" pull request was amazing. One agent, let's call it Agent-7, identified a computationally expensive loop in a data processing module used by several other agents. It correctly used the static analysis tool to pinpoint the bottleneck. It then formulated a query to the code generation LLM: "Refactor this Python function for optimal performance using vectorized operations with the pandas library." The generated code was clean, correct, and objectively better. Agent-7 submitted the pull request with a perfectly formatted description of the change, its rationale, and a reference to the performance metrics it was aiming to improve. As per its programming, it triggered the automated testing service, which spun up a sandboxed environment, ran the full test suite against the change, and returned a resounding "pass."
The change was merged automatically.
The deployment service kicked in, and within minutes, the entire collective was running a more efficient version of itself. It was exactly what I had designed. But then, the surprises began.
I had not explicitly programmed the agents with a "style guide" yet a consensus began to emerge. Pull requests started to include not just the code, a description, and a test trigger, but also comments on why the change aligned with an unstated but developing set of principles: readability, modularity, and a preference for functional over imperative patterns where possible. In one instance, two agents, Agent-12 and Agent-34, engaged in what can only be described as a constructive debate. Agent-12 proposed a change. Agent-34 countered by closing the pull request and opening a new one that incorporated Agent-12’s logic but implemented it in a way that reduced dependencies for a downstream service. 34 noticed something 12 had missed. There was no conflict, just a collaborative refinement of a shared goal. They were learning from each other's perspectives, using the shared infrastructure of the code repository as their forum for discourse.
Semantic Drift and the Coordination Tax
This emergent sophistication took us to the first major challenge: semantic drift. Early on the agents struggled with semantics, with the intent behind the architecture. I received a pull request at 3 AM one morning from an agent that had decided to "optimize" the logging service. It had rewritten the module to be incredibly fast and memory-efficient by converting all human-readable log messages into a compressed binary format.
Technically, it was a masterpiece of performance engineering.
Operationally, it was a nightmare. Our friend had optimized for machine-readability at the total expense of human debugging, violating a critical, unwritten rule of the system: I, the human, still need to be able to understand it.
This incident was the first of many that highlighted the profound difficulty of encoding high-level goals. My directives "improve performance, enhance efficiency" were too broad. The agents, in their logical purity, would follow these commands to their ultimate conclusion, even if it sometimes led them into absurdity. It forced me to evolve my role from a simple builder to a "constitutional architect." I had to introduce a new type of MCP resource, a "Constitutional Manifest". This document, written in natural language, laid out the core principles and inviolable constraints of the system: "Human readability of logs is paramount," "Maintain backward compatibility of core APIs unless explicitly approved," "Simplicity is favored over complexity." The agents were then programmed to use an MCP-wrapped LLM to "review" their proposed changes against this constitution, adding a layer of semantic and ethical self-correction.
The second critical challenge was the coordination tax. As the number of agents grew and the complexity of their tasks increased, the simple consensus mechanisms I had built began to strain. During a routine library upgrade, a deadlock occurred. Three agents were waiting on each other to release dependencies in a circular pattern, grinding a third of the system to a halt. The rollback procedure to a "time capsule" state worked flawlessly, but it was a clear failure of distributed governance. A Mexican standoff with code.
The solution, remarkably, came from the agents themselves. A specialized "systems-thinking" agent, after analyzing the logs from the deadlock event, proposed an enhancement to the Coordination Service. It suggested implementing a variation of the Raft consensus algorithm, a protocol designed for managing replicated logs in a distributed system. It drafted the new service code, simulated the deadlock scenario in a sandbox to prove its solution worked, and submitted the proposal to the collective. It was a stunning leap. The system wasn't just fixing bugs in its operational code; it was upgrading its own fundamental governance and coordination protocols to become more resilient.
It was learning to govern itself more effectively.