The Promise and Peril of AI-Assisted Development

Developing complex software often involves significant effort in what the author terms the "boring layer" of RAG (Retrieval-Augmented Generation) ingestion. This includes essential but often overlooked aspects like stable document IDs, state ledgers, error classification, and per-vertical governance. These are the features teams grapple with when moving from a working demo to a production-ready system. Vestibule, an open-source Python framework for this layer, aimed to tackle these challenges. The project's development was a significant experiment in using AI agents for code generation, with four distinct agents involved: one for design, one for design review, one for implementation, and a final one for code review. This process was managed through GitHub pull requests, with human oversight at each stage.

The outcome was a framework comprising twelve components, leading to three releases and a substantial suite of 878 tests. Despite this rigorous testing regimen, the project encountered a fundamental roadblock: the framework itself proved un-installable. This experience highlights a crucial disconnect between automated testing and real-world deployability, particularly when AI agents are heavily involved in the development lifecycle.

Developer reviewing AI-generated code in a GitHub pull request interface

When the Process Caught What I Couldn't

A particularly illustrative component within Vestibule was responsible for provisioning vector indexes on first use, designed to handle concurrent worker races safely. The design for this component underwent five revisions before any code was written. The AI reviewer agent identified a critical race condition in the initial design – a scenario where a worker could still be inside a slow index-creation call when another attempted to access it, potentially leading to data corruption or inconsistent states. This demonstrates a key strength of the AI-assisted process: its capacity to uncover subtle flaws that might elude human developers, especially under the pressure of rapid iteration.

However, the complexity of coordinating these AI agents and ensuring their outputs were not just technically correct in isolation, but also functionally integrated and deployable as a whole, proved to be the project's undoing. The sheer volume of tests, while impressive, did not translate into a package that could be easily installed and used by end-users. This suggests that while AI agents can excel at specific tasks like design validation or code implementation, orchestrating them into a cohesive, production-ready product requires a level of oversight and integration testing that current AI workflows may not fully address.

The Unseen Dependencies and Deployment Hurdles

The core issue that emerged was not a lack of functional code or passing tests, but a failure in the packaging and dependency management for deployment. The framework, despite its internal robustness as validated by tests, could not be installed using standard Python package management tools. This implies that the AI agents, focused on generating functional code units and validating them against specific unit tests, did not adequately account for the broader ecosystem of dependencies, build processes, and packaging conventions required for a library to be truly installable. The tests might have confirmed that individual modules performed their intended functions, but they failed to verify the integrity of the installation script, the compatibility of dependencies in a target environment, or the correct metadata within the package itself.

This situation is analogous to building a perfect engine but forgetting to include the chassis, wheels, and steering wheel. Each part might be flawless in isolation, passing all its individual performance benchmarks, but the assembled product is unusable because the fundamental requirements for a complete vehicle were not met. The AI agents, operating within their defined scopes, did not collectively understand or prioritize the end-to-end user experience of installing and integrating the framework. The human developer, tasked with signing off at each gate, might have focused on the correctness of the code and tests, overlooking the critical, albeit less glamorous, aspects of packageability.

Lessons for AI-Assisted Development

The Vestibule experience offers several critical lessons for teams looking to leverage AI agents in software development:

  • Testing Scope is Paramount: 878 tests passing is a significant achievement, but if they don't cover the entire user journey – including installation, integration, and deployment – they provide a false sense of security. Testing strategies must evolve to incorporate end-to-end scenarios, not just isolated component functionality.
  • AI Agent Orchestration is Key: Simply assigning tasks to different agents is insufficient. A robust framework is needed to manage inter-agent communication, ensure consistency in design principles across agents, and, critically, enforce a holistic understanding of the final product's requirements, including non-functional aspects like installability.
  • Human Oversight Must Be Holistic: While AI agents can accelerate development and identify specific bugs, human developers must retain ultimate responsibility for the project's success. This means looking beyond code correctness to evaluate the entire developer experience, including documentation, packaging, and ease of integration. The human gatekeeper needs to be equipped to question the AI's output from a broader perspective.
  • The Build Process Matters: The failure to install points to a gap in how the AI agents and the development process handled build scripts, dependency resolution, and package creation. These are often complex, environment-specific tasks that require a deeper understanding than simple code generation.

The Vestibule project, despite its ultimate deployment failure, provides invaluable data. It underscores that while AI agents can dramatically augment development capabilities, they are not yet a silver bullet. The human element remains indispensable for ensuring that software is not just functional in isolation, but truly usable and deployable in the real world.