<?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: Elena Romanova</title>
    <description>The latest articles on Forem by Elena Romanova (@elena_romanova_pl).</description>
    <link>https://forem.com/elena_romanova_pl</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%2F3867070%2F7515d935-53da-4f02-a6be-729121743e97.jpeg</url>
      <title>Forem: Elena Romanova</title>
      <link>https://forem.com/elena_romanova_pl</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/elena_romanova_pl"/>
    <language>en</language>
    <item>
      <title>AI-Assisted Development: When orchestration starts collapsing under its own weight</title>
      <dc:creator>Elena Romanova</dc:creator>
      <pubDate>Tue, 14 Apr 2026 16:23:01 +0000</pubDate>
      <link>https://forem.com/elena_romanova_pl/ai-assisted-development-when-orchestration-starts-collapsing-under-its-own-weight-40k8</link>
      <guid>https://forem.com/elena_romanova_pl/ai-assisted-development-when-orchestration-starts-collapsing-under-its-own-weight-40k8</guid>
      <description>&lt;p&gt;I thought adding more control would make my AI-assisted coding workflow more reliable. Instead, it made the whole system heavier, slower, and more fragile. This article is about that failure — and about the redesign that finally made the workflow stable enough to keep using.&lt;/p&gt;

&lt;p&gt;This is the second article in the series, to get a bit more context about the experiment — please check &lt;a href="https://dev.to/elena_romanova_pl/from-ai-hype-to-controlled-enterprise-ai-assisted-development-22o0"&gt;AI-Assisted Development: Part I&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;After my first attempts to build an agentic workflow that could be used not only for nice demos, but for something closer to real enterprise development, it became clear that moving forward “as is” made no sense.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/for-alisia/delivery-flow/tree/feature-1-v1" rel="noopener noreferrer"&gt;first working version&lt;/a&gt; showed that orchestrating roles really can improve the result compared to one big generation. The code became more structured, intermediate artifacts started to appear, handoffs (passing results and context from one agent to another) became part of the flow, and there was at least some process discipline. But the limits also became visible: requirements were getting lost on the way, the review gate was still too soft, and confidence in the result was often higher than the result itself deserved.&lt;/p&gt;

&lt;p&gt;That is why the &lt;a href="https://github.com/for-alisia/delivery-flow/tree/feature-1-v2" rel="noopener noreferrer"&gt;next iteration&lt;/a&gt; was not just “one more version” for me. It was an attempt to make the workflow more controllable. At this stage, I was not trying to improve code generation itself as much as I was trying to strengthen control around it: preserve requirements, add more independent validation, and make the process itself easier to understand from one version to another.&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%2Fyrzd60sk2kq3xw4jjwdn.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%2Fyrzd60sk2kq3xw4jjwdn.png" alt="Agentic flow planned for this iteration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I was trying to fix after the first version
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Drifting requirements
&lt;/h3&gt;

&lt;p&gt;One of the most visible problems in the first version was that some requirements simply disappeared on the way. The original prompt, the user story, and the final implementation no longer fully matched each other. The system could generate fairly clean code, but that still did not mean it preserved the actual meaning of the task all the way through.&lt;/p&gt;

&lt;p&gt;To reduce this drift, I added a &lt;strong&gt;requirement lock&lt;/strong&gt; — a separate layer of explicitly fixed constraints that the &lt;strong&gt;Team Lead&lt;/strong&gt; had to pass further down the chain. The idea was simple: models should not “fill in the blanks” for things that look unimportant to them, and they should not silently narrow the task into a shape that is easier for them to implement.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## Requirement Lock
Before delegating, extract and pass a requirement lock that captures:
- Source-of-truth inputs and configuration dependencies
- Required request/response contract constraints
- Default behaviors and mandatory validations
- Explicit exclusions and non-goals
- Unresolved questions that must not be guessed away
Read `documentation/project-overview.md` and scan `documentation/constitution.md` principle titles for constraint relevance. Ask clarification only when docs do not resolve ambiguity.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Validation was still too soft
&lt;/h3&gt;

&lt;p&gt;In the previous stage, responsibility for judging the quality of the result was still mostly falling on the &lt;strong&gt;Team Lead&lt;/strong&gt;, and that was not enough.&lt;/p&gt;

&lt;p&gt;So I added a separate &lt;strong&gt;&lt;a href="https://github.com/for-alisia/delivery-flow/blob/feature-1-v2/.github/agents/reviewer.agent.md" rel="noopener noreferrer"&gt;Reviewer&lt;/a&gt;&lt;/strong&gt; agent whose job was to validate the &lt;a href="https://github.com/for-alisia/delivery-flow/blob/feature-1-v2/artifacts/implementation-reports/first-issues-api.md" rel="noopener noreferrer"&gt;implementation plan&lt;/a&gt; written by the &lt;strong&gt;&lt;a href="https://github.com/for-alisia/delivery-flow/blob/feature-1-v2/.github/agents/java-architect.agent.md" rel="noopener noreferrer"&gt;Architect&lt;/a&gt;&lt;/strong&gt; against the requirements and project documents, and then review the final implementation itself: check whether it followed the plan, whether it respected the general project rules, and whether the code actually worked instead of just looking believable.&lt;/p&gt;

&lt;p&gt;At the same time, I decided to strengthen the final quality gate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;add &lt;strong&gt;Sonar&lt;/strong&gt; as a required part of final validation&lt;/li&gt;
&lt;li&gt;introduce mandatory &lt;strong&gt;smoke tests&lt;/strong&gt; (a quick check that the application starts and the main scenario actually works) before passing the implementation further down the chain&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  No transparency between versions
&lt;/h3&gt;

&lt;p&gt;Once the workflow configuration started changing quickly, I myself started losing track of what was actually helping and what was not. So I added &lt;strong&gt;&lt;a href="https://github.com/for-alisia/delivery-flow/tree/feature-1-v2/.github/agentic-flow/logs" rel="noopener noreferrer"&gt;run logs&lt;/a&gt;&lt;/strong&gt; for each iteration — a way to record not only what changed in the setup, but also what really happened during each run.&lt;/p&gt;

&lt;p&gt;Final iteration code you can check on &lt;a href="https://github.com/for-alisia/delivery-flow/tree/feature-1-v2" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The workflow looked stricter — but became heavier
&lt;/h2&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%2F5w53a73udzf4yzwj4aql.webp" 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%2F5w53a73udzf4yzwj4aql.webp" alt="Scorecard for version v2.0.0"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you only looked at the final code, the next iteration really was a step forward.&lt;/p&gt;

&lt;p&gt;The generated implementation matched the technical task much better: the task itself was quite simple — an API that returns a list of GitLab issues. This time the result was noticeably closer to the original intent. The code was more structured, covered with tests, the application started successfully, and the endpoint really returned a valid result.&lt;/p&gt;

&lt;p&gt;Compared to the previous version, this was already a meaningful improvement.&lt;/p&gt;

&lt;p&gt;But the main failure of this iteration was not in the code itself. It was in the process.&lt;/p&gt;

&lt;h3&gt;
  
  
  What went wrong
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;the full cycle took &lt;strong&gt;more than two hours&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;there were four return loops between &lt;strong&gt;Team Lead&lt;/strong&gt; and &lt;strong&gt;Coder&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;the &lt;a href="https://github.com/for-alisia/delivery-flow/blob/feature-1-v2/artifacts/implementation-signoffs/first-issues-api.signoff.md" rel="noopener noreferrer"&gt;final review artifact&lt;/a&gt; ended up corrupted&lt;/li&gt;
&lt;li&gt;some of the control mechanisms added more friction than actual stability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And at that point something became much more obvious: good, or at least acceptable, code does not automatically mean that the orchestration system itself is reliable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Context rotting became the first inevitable cost of complex orchestration
&lt;/h2&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%2F23gjvcuvy7wkpyp8bkuv.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%2F23gjvcuvy7wkpyp8bkuv.png" alt="Execution flow for v2.0.0"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The main problem turned out to be &lt;strong&gt;context rotting&lt;/strong&gt; — the degradation of quality caused by overloaded context, too many artifacts, and compaction inside a long session.&lt;/p&gt;

&lt;p&gt;As the workflow became more complex, the number of artifacts that agents had to read, pass to each other, and generate again also grew. On top of that there was chat history. By the time I reached the second call to the Coder, I could already see signs of compaction, and it was clearly starting to affect agent performance.&lt;/p&gt;

&lt;p&gt;Formally, there were now more control points. But that did not make the system more stable — it made it heavier.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why formal control did not create stability
&lt;/h3&gt;

&lt;p&gt;The problem was not only the size of the context.&lt;/p&gt;

&lt;p&gt;Yes, &lt;strong&gt;Sonar&lt;/strong&gt; turned out to be too expensive and too noisy as a quality gate for this kind of process. Yes, the wrong model was again picked up for the &lt;strong&gt;Architect&lt;/strong&gt; role. Yes, the implementation plan was still not specific enough and did not help the &lt;strong&gt;Coder&lt;/strong&gt; as much as it should have. Yes, the Coder remained the weakest part of the system: it returned invalid results, skipped the required structured handoff (a structured batch summary with changed files, checks, and status), got lost in terminal commands, and in general consumed a disproportionate amount of time compared to the real value of the feature.&lt;/p&gt;

&lt;p&gt;But these were no longer separate small failures. They were symptoms of a much bigger problem: I was trying to strengthen the workflow by adding more roles, more artifacts, and more review stages. As a result, the system became not more reliable, but heavier.&lt;/p&gt;

&lt;p&gt;By the end of that run, one thing was clear to me: &lt;em&gt;reasonably valid code alone does not mean the orchestration is successful&lt;/em&gt;. Generation time is a resource just like tokens are. If a simple feature requires more than two hours, several repeat loops, and still does not produce a stable final review, then the problem is no longer in one specific agent. It is in the process design itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  The next step was not “more control”, but a lighter system
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/for-alisia/delivery-flow/tree/feature-1-v2.1.0" rel="noopener noreferrer"&gt;next iteration&lt;/a&gt; was no longer just a series of small fixes. It was an attempt to redesign the workflow so that it would consume less context, create fewer chances for drift, and rely on more deterministic validation.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Lighter handoff artifacts
&lt;/h3&gt;

&lt;p&gt;The main goal was to reduce the risk of context rotting.&lt;/p&gt;

&lt;p&gt;To do that, I:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;replaced heavy markdown &lt;a href="https://github.com/for-alisia/delivery-flow/tree/feature-1-v2.1.0/artifacts" rel="noopener noreferrer"&gt;handoff artifacts&lt;/a&gt; (artifacts passed between agents) with JSON wherever possible&lt;/li&gt;
&lt;li&gt;kept markdown only where the artifact really had to be readable as a document by a human — for example, user story and implementation plan&lt;/li&gt;
&lt;li&gt;shortened and simplified the agent prompts&lt;/li&gt;
&lt;li&gt;cleaned up part of the context documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Circuit breaker and red card logic
&lt;/h3&gt;

&lt;p&gt;Another important change was a circuit breaker — a mechanism that prevents the same fix loop from running forever.&lt;/p&gt;

&lt;p&gt;Now the &lt;strong&gt;&lt;a href="https://github.com/for-alisia/delivery-flow/blob/feature-1-v2.1.0/.github/agents/team-lead.agent.md" rel="noopener noreferrer"&gt;Team Lead&lt;/a&gt;&lt;/strong&gt; had to re-check the &lt;strong&gt;&lt;a href="https://github.com/for-alisia/delivery-flow/blob/feature-1-v2.1.0/.github/agents/java-coder.agent.md" rel="noopener noreferrer"&gt;Coder’s&lt;/a&gt;&lt;/strong&gt; results, and the system got a &lt;strong&gt;red card mechanism&lt;/strong&gt;: if an agent returned a false-positive or incomplete result several times in a row, the task would not just go through the same loop again — it would go back to the &lt;strong&gt;Architect&lt;/strong&gt; for plan revision.&lt;/p&gt;

&lt;p&gt;This was a simple change, but it was the first time the workflow started behaving more like a real engineering escalation process instead of an endless retry loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Local tooling instead of heavy external gates
&lt;/h3&gt;

&lt;p&gt;Tooling changed a lot too. I moved away from a heavy external quality gate and switched to a local toolset:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Checkstyle&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PMD/CPD&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SpotBugs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;JaCoCo check&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also created separate &lt;a href="https://github.com/for-alisia/delivery-flow/blob/feature-1-v2.1.0/.github/instructions/test-instructions.instructions.md" rel="noopener noreferrer"&gt;test instructions&lt;/a&gt; with clearer test types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;unit&lt;/li&gt;
&lt;li&gt;component&lt;/li&gt;
&lt;li&gt;integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And to reduce terminal chaos, I added local scripts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[verify-quick.sh](https://github.com/for-alisia/delivery-flow/blob/feature-1-v2.1.0/scripts/verify-quick.sh)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[quality-check.sh](https://github.com/for-alisia/delivery-flow/blob/feature-1-v2.1.0/scripts/quality-check.sh)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Their job was very practical: replace a stream of random terminal commands with more predictable and repeatable validation steps.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. A more useful plan for the Coder
&lt;/h3&gt;

&lt;p&gt;Finally, I strengthened the requirements for the &lt;strong&gt;&lt;a href="https://github.com/for-alisia/delivery-flow/blob/feature-1-v2.1.0/.github/agents/java-architect.agent.md" rel="noopener noreferrer"&gt;Architect&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Now I expected not just “a plan in general terms”, but something actually useful for the &lt;strong&gt;Coder&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;task split into slices&lt;/li&gt;
&lt;li&gt;required payload examples&lt;/li&gt;
&lt;li&gt;expected class structure&lt;/li&gt;
&lt;li&gt;logging expectations&lt;/li&gt;
&lt;li&gt;test coverage expectations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal was to reduce guesswork before coding even started.&lt;/p&gt;




&lt;h2&gt;
  
  
  What actually stabilized the process
&lt;/h2&gt;

&lt;p&gt;This iteration did not make the workflow perfect. But it became the first one where the main problem from the previous run — overloaded and degrading context — stopped being the biggest risk.&lt;/p&gt;

&lt;p&gt;In the previous run, the system looked stricter on paper: more artifacts, more steps, more checks. But in practice it produced the opposite effect. The context kept growing, handoff artifacts became too heavy, Reviewer Phase 2 broke, and the Coder spent too much time in loops and unstable validation.&lt;/p&gt;

&lt;p&gt;After simplifying handoffs, reducing agent instructions, and moving toward more local and deterministic checks, the workflow finally stopped collapsing halfway through the run. Reviewer artifacts were no longer damaged. JSON handoffs really did stabilize state transfer. Context usage improved noticeably. In this run, the Coder stopped giving false-positive reports. And the total run time dropped by roughly half.&lt;/p&gt;

&lt;p&gt;For a quick comparison, it looked like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fstr283mi47cgg63uwjl7.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%2Fstr283mi47cgg63uwjl7.png" alt="Comparison between v2.0.0 and v2.1.0"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The main conclusion here was simple: the problem was not only the quality of specific models, but how much operational noise the workflow itself was creating. Once the handoff became lighter and the checks became closer, simpler, and cheaper, orchestration stopped degrading so early.&lt;/p&gt;

&lt;h2&gt;
  
  
  But process stability still did not mean system maturity
&lt;/h2&gt;

&lt;p&gt;At the same time, this new iteration did not solve everything.&lt;/p&gt;

&lt;h3&gt;
  
  
  What was still a problem
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The plan was still too long.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even a good plan should not blow up downstream context. If the implementation plan itself becomes a heavy artifact, it starts hurting the very stability it was supposed to support. A harder limit was needed here — no more than 200 lines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There was still no mandatory early smoke check for the API.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Coder still tended to treat the work as finished after tests. But green tests are not the same as a working API. Happy path and error path should be checked before Reviewer Phase 2, not later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Handoff discipline was still not fully there.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each batch still needed a proper structured handoff, and agents still should not be allowed to create side files outside the scope of the plan and checkpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Red card logic existed, but was not fully wired into execution.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The counters and checkpoint state were already there, but the mechanism still had to become automatic and formal instead of situational.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tooling still missed some code-style issues.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repeated string literals&lt;/li&gt;
&lt;li&gt;one consistent constructor style&lt;/li&gt;
&lt;li&gt;standardized Mockito matcher practices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the process became more stable, but code-shape quality still needed separate attention.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why I decided to keep this code
&lt;/h3&gt;

&lt;p&gt;This was the point where something important changed for me.&lt;/p&gt;

&lt;p&gt;This iteration was not perfect. But it was the first version that I decided not just to document and move on from, but to keep as the basis for future runs. Not as a final result, but as the first truly usable &lt;strong&gt;seed version&lt;/strong&gt; for further generation.&lt;/p&gt;

&lt;p&gt;And maybe the main lesson was not even about agents themselves. It was about the engineering practice around them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local tools&lt;/strong&gt; — the ones we almost started forgetting in the era of heavy IDE mega-platforms and all-in-one systems — suddenly felt useful again. They were simple, local, understandable, and cheap to run. And that was exactly what gave the workflow the stability it had been missing.&lt;/p&gt;

&lt;p&gt;After that, the focus shifted naturally.&lt;/p&gt;

&lt;p&gt;Once the main context problem was significantly reduced, the next question became different: not will the orchestration collapse halfway through, but &lt;strong&gt;what kind of code does it produce&lt;/strong&gt; now — and how much does that code look like something I would actually want to maintain further.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>softwaredevelopment</category>
      <category>agents</category>
    </item>
    <item>
      <title>From AI Hype to Controlled Enterprise AI-Assisted Development</title>
      <dc:creator>Elena Romanova</dc:creator>
      <pubDate>Wed, 08 Apr 2026 13:58:54 +0000</pubDate>
      <link>https://forem.com/elena_romanova_pl/from-ai-hype-to-controlled-enterprise-ai-assisted-development-22o0</link>
      <guid>https://forem.com/elena_romanova_pl/from-ai-hype-to-controlled-enterprise-ai-assisted-development-22o0</guid>
      <description>&lt;p&gt;Most AI coding demos answer the easiest question: can a model generate something that runs?&lt;/p&gt;

&lt;p&gt;This experiment asks a harder one: &lt;strong&gt;can a multi-agent workflow produce code that stays aligned with requirements, respects project constraints, and remains reviewable enough for a long-lived enterprise codebase&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;This article covers the first iteration of that experiment: a four-role orchestration setup, the artifacts around it, and the lessons that came from requirement drift, weak review gates, and over-optimistic test confidence.&lt;/p&gt;




&lt;p&gt;The AI wave of the last few years did not pass my company by.&lt;/p&gt;

&lt;p&gt;Presentations, workshops, ambitious plans to improve productivity by double-digit percentages before the end of the year through AI adoption — all of that quickly became part of everyday engineering life. We recently got access to GitHub Copilot, and for me that was the final signal: there is no going back. These tools are here, and I need to adapt to this new reality seriously.&lt;/p&gt;

&lt;p&gt;I work in a large financial enterprise — thousands of engineers across the globe, strict regulatory and security constraints, projects that live for decades, and release processes that can take a week to prepare and involve a pile of tickets, approvals, and governance steps. In that world, Java 8 is still a perfectly normal tool, and getting a project on Java 17 already feels like a gift. I am a full-stack developer (Java + React) and a Delivery Lead in a 13-person team, so for me it matters a lot that our processes stay effective and our releases remain predictable.&lt;/p&gt;

&lt;p&gt;When I started digging deeper into AI-assisted development, one problem became obvious very quickly: almost every tutorial and demo looks the same. Usually it is a React TODO app, a portfolio page, or some neat little proof of concept that a model or a swarm of agents generates from scratch. Then the video author checks whether it runs, and that is treated as success.&lt;/p&gt;

&lt;p&gt;But almost nobody looks deeper:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how maintainable the code is&lt;/li&gt;
&lt;li&gt;whether it actually fits the architecture&lt;/li&gt;
&lt;li&gt;what the test coverage looks like&lt;/li&gt;
&lt;li&gt;how it behaves in edge cases&lt;/li&gt;
&lt;li&gt;whether it can be evolved further without a full rewrite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The “&lt;em&gt;if it doesn’t work, delete it and generate again&lt;/em&gt;” approach works perfectly well for throwaway code: tiny demos, pet projects, one-page apps, or presentation-ready POCs. It is a good starting point if you want to get familiar with AI code generation. &lt;strong&gt;But it has very little to do with real enterprise development.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And this is where things got interesting: finding something genuinely useful for the day-to-day life of a working developer turned out to be much harder than I expected. The experiments my team started trying in practice were often chaotic and, quite often, brought more new problems than real value.&lt;/p&gt;




&lt;h2&gt;
  
  
  What problems we ran into
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Unpredictable generation
&lt;/h4&gt;

&lt;p&gt;Very often, debugging and fixing generated code — or simply figuring out why it did not work or behaved differently than expected — took more time than implementing the same functionality manually.&lt;/p&gt;

&lt;p&gt;That is the moment when AI stops being an accelerator and starts becoming an expensive detour. Instead of saving time, the team gets a new layer of noise that still has to be untangled by hand.&lt;/p&gt;

&lt;h4&gt;
  
  
  Constant violations of project rules and engineering principles
&lt;/h4&gt;

&lt;p&gt;We were slowly turning into &lt;strong&gt;code police&lt;/strong&gt;: adding more and more restrictions to instructions, refining wording, documenting anti-patterns — and the model still kept either ignoring the rules or finding a new creative way to break them.&lt;/p&gt;

&lt;p&gt;General phrases like “&lt;em&gt;write production-ready code&lt;/em&gt;” or “&lt;em&gt;follow clean architecture&lt;/em&gt;” sound nice, but in practice they guarantee almost nothing. Without concrete boundaries and checks, they remain far too vague.&lt;/p&gt;

&lt;h4&gt;
  
  
  No structured project context
&lt;/h4&gt;

&lt;p&gt;Developers inside a team know a lot of things that are never explicitly written down. For example, a specific Elasticsearch query used by Flowable may not exist in the codebase as a normal .ftl file at all, but instead live inside a .zip archive in a specific directory or be accessible only through a designer UI. To a human, that is normal working knowledge. To the model, it is a blank spot.&lt;/p&gt;

&lt;p&gt;So the model starts hallucinating, and the team compensates by piling on more context files, more instructions, more notes, and more workarounds.&lt;/p&gt;

&lt;p&gt;The problem got worse because there was no unified team-level approach. Everyone kept their own local context files, prompt snippets, and notes based on what they personally thought was important. As a result, &lt;strong&gt;outputs became unpredictable and inconsistent from one developer to another&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Uncontrolled merge request style
&lt;/h4&gt;

&lt;p&gt;The code started looking so unlike its supposed author that it was obvious it had been generated almost end-to-end. Which meant the extra burden immediately shifted to the reviewer.&lt;/p&gt;

&lt;p&gt;The reviewer no longer just had to assess logic and task fit. First, they had to convince themselves that the code was even safe to merge into the project, that it did not hide surprises, and that it would not introduce additional technical debt.&lt;/p&gt;

&lt;p&gt;Very quickly it became clear that developers get especially annoyed reviewing AI-generated code when the author has not cleaned it up, adapted it, and made it feel like part of the existing codebase before opening the MR. As a result, &lt;strong&gt;tension inside the team grew, and trust in each other’s code dropped noticeably&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Unrealistic expectations of AI as a “magic box”
&lt;/h4&gt;

&lt;p&gt;Some people — especially in management, though not only there — started treating AI as a kind of magic box: put a good prompt in, and a great result will automatically come out.&lt;/p&gt;

&lt;p&gt;That mindset says a lot not only about inflated expectations, but also about how poorly many people still understand how models actually work, where their limits are, and why &lt;strong&gt;good results do not appear on their own without context, verification, and engineering control&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sometimes this became almost absurd. At one point I was asked to take a 35-page SAD (Software Architecture Document) template in Word, run it through Opus, and generate documentation for a two-year-old project with thousands of classes.&lt;/p&gt;

&lt;p&gt;Requests like that make it painfully obvious how little many people still understand about the real cost of context, verification, and engineering accountability.&lt;/p&gt;

&lt;h4&gt;
  
  
  No clear model for a large real-world project
&lt;/h4&gt;

&lt;p&gt;And this was probably the biggest problem of all. Even in engineering environments, there often was no clear understanding of how to adapt all this AI enthusiasm to a large real project — one with architecture, standards, code reviews, security constraints, support burden, and a long history of decisions.&lt;/p&gt;

&lt;p&gt;We had all seen success stories about React TODO apps. &lt;strong&gt;We had seen much fewer examples of how AI-assisted development could actually work in a serious team environment&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The experiment: trying to build an enterprise-friendly approach
&lt;/h2&gt;

&lt;p&gt;I do not have a silver bullet.&lt;/p&gt;

&lt;p&gt;I am not going to pretend I found some universal solution that removes all of these problems in a few hours. Quite the opposite: my goal is to show the path honestly — the hypotheses I am testing, the decisions I am making, and the mistakes I am making along the way — so others can reuse what works and avoid at least some of what does not.&lt;/p&gt;

&lt;p&gt;At its core, I want to test whether it is possible to build an AI-assisted workflow that is reliable enough for a serious project.&lt;/p&gt;

&lt;h3&gt;
  
  
  What “good” looks like for me
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code&lt;/strong&gt; that is as &lt;strong&gt;indistinguishable&lt;/strong&gt; as possible from something written by me or a teammate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reasonably stable output&lt;/strong&gt; from one iteration to the next&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Strong test coverage&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Code that &lt;strong&gt;actually works&lt;/strong&gt;, not just compiles&lt;/li&gt;
&lt;li&gt;Null-safe implementations that handle edge cases properly&lt;/li&gt;
&lt;li&gt;No need for complicated prompt engineering before every generation&lt;/li&gt;
&lt;li&gt;Developer control preserved throughout the process: final responsibility for quality stays with a human, and there is &lt;strong&gt;always a human in the loop&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This part matters a lot: I am not trying to build a magical system that “writes everything by itself.” I am trying to build a controlled process where AI helps accelerate development, while the developer remains the one who sets boundaries, validates the outcome, and owns quality.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why I chose a pet project
&lt;/h3&gt;

&lt;p&gt;I did not want to run these experiments directly on a work project.&lt;/p&gt;

&lt;p&gt;First, the cost of mistakes there is too high. Second, I was interested in a harder challenge: starting from a blank slate.&lt;/p&gt;

&lt;p&gt;In my experience, models struggle the most when they have to produce good code with no real project context at all. When there are no established conventions, no patterns to anchor to, and no domain-specific structure yet, the output becomes especially unpredictable. Quite often, it is the kind of code you want to throw away immediately, without even trying to refactor it.&lt;/p&gt;

&lt;p&gt;So I started building my own project — &lt;strong&gt;Delivery Orchestrator&lt;/strong&gt;, a Java application with an MCP server acting as its client layer.&lt;/p&gt;

&lt;p&gt;This is not a toy application and not yet another TODO list. I deliberately chose a project that is expected to become complex, scalable, and architecture-sensitive over time. It will grow step by step — story by story, generation by generation. Readability, refactorability, package structure, class boundaries, and architecture matter from the very beginning.&lt;/p&gt;

&lt;p&gt;But at the first stage, it serves another purpose too: it is my playground for answering one bigger question — whether AI-assisted development can be turned from a pretty demo into a &lt;strong&gt;controlled, reviewable, and engineering-sound process&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where I started: the initial orchestration model
&lt;/h3&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%2Ftsgzuvcpfb7ullfte3bn.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%2Ftsgzuvcpfb7ullfte3bn.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At that point, I already knew that a great prompt plus a shared instruction file would not be enough. Yes, that improves the output noticeably, and I still think it should be the first step in any project. But for a large backend codebase, it is nowhere near sufficient.&lt;/p&gt;

&lt;p&gt;That is why I became interested in the idea of agent orchestration, which I first picked up from Burke Holland. What I liked was the core idea itself: instead of trying to squeeze everything out of one “smart” request, split the work into several roles with clear responsibility and explicit handoffs between them.&lt;/p&gt;

&lt;h3&gt;
  
  
  The initial idea
&lt;/h3&gt;

&lt;p&gt;The first working model was fairly simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Team Lead&lt;/strong&gt; — takes in the task, sets the boundaries, and assembles the final result&lt;br&gt;
&lt;strong&gt;Product Manager&lt;/strong&gt; — formulates the user story&lt;br&gt;
&lt;strong&gt;Java Architect&lt;/strong&gt; — proposes the implementation plan&lt;br&gt;
&lt;strong&gt;Java Coder&lt;/strong&gt; — writes the code, tests, and verification evidence&lt;/p&gt;

&lt;p&gt;The point was not to “give agents freedom,” but the opposite — to narrow their area of responsibility. Each step had to produce a clear artifact that could be reviewed with human eyes, instead of just passing along vague context.&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%2Ft0te41hblqbpli8mrplh.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%2Ft0te41hblqbpli8mrplh.png" alt=" " width="800" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What I added right away
&lt;/h3&gt;

&lt;p&gt;At this stage, I already had the basic ingredients that, to me, are required before any serious work even starts.&lt;/p&gt;

&lt;p&gt;First, there was a shared layer of project instructions — &lt;a href="https://github.com/for-alisia/delivery-flow/blob/feature-1-v1/.github/copilot-instructions.md" rel="noopener noreferrer"&gt;copilot-instructions.md&lt;/a&gt; - defining the baseline architectural and process context.&lt;/p&gt;

&lt;p&gt;Second, there was a dedicated &lt;a href="https://github.com/for-alisia/delivery-flow/blob/feature-1-v1/artifacts/code-guidance.md" rel="noopener noreferrer"&gt;code-guidance.md&lt;/a&gt; file with rules for code style, structure, and quality.&lt;/p&gt;

&lt;p&gt;But the most important layer from the start was &lt;a href="https://github.com/for-alisia/delivery-flow/blob/feature-1-v1/artifacts/constitution.md" rel="noopener noreferrer"&gt;constitution.md&lt;/a&gt; - a set of &lt;strong&gt;technology-agnostic rules&lt;/strong&gt; that should not be violated regardless of which part of the system an agent is working on. In practice, this was a layer of invariants: not “nice-to-have recommendations,” but constraints that should survive changes in models, prompts, and even the workflow itself. And interestingly, this layer has remained one of the most resilient so far: when these rules are explicit and live in the repository, agents tend to check them first.&lt;/p&gt;

&lt;p&gt;On top of that, I already had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;intermediate artifacts between stages&lt;/li&gt;
&lt;li&gt;expectations not only around code, but also tests, documentation, and signs of verification&lt;/li&gt;
&lt;li&gt;dedicated folders for &lt;a href="https://github.com/for-alisia/delivery-flow/tree/feature-1-v1/artifacts/implementation-reports" rel="noopener noreferrer"&gt;implementation reports&lt;/a&gt;, agent setup in &lt;a href="https://github.com/for-alisia/delivery-flow/tree/feature-1-v1/.github/agents" rel="noopener noreferrer"&gt;.github/agents&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So even at an early stage, the goal was not “generate an endpoint,” but create a &lt;strong&gt;minimally disciplined delivery flow&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The first meaningful run: what worked
&lt;/h3&gt;

&lt;p&gt;One of the early setups already produced something useful.&lt;/p&gt;

&lt;p&gt;What came out was not random code, but a fairly clean, more enterprise-style skeleton:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a layered Spring structure&lt;/li&gt;
&lt;li&gt;basic validation&lt;/li&gt;
&lt;li&gt;error mapping&lt;/li&gt;
&lt;li&gt;API documentation&lt;/li&gt;
&lt;li&gt;unit tests and &lt;code&gt;@WebMvcTest&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;overall, a much more disciplined result than one-shot generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That was an important moment: it became clear that &lt;strong&gt;orchestration really can improve the quality&lt;/strong&gt; of the first output compared to the classic “here is a prompt, generate the whole thing” approach.&lt;/p&gt;

&lt;p&gt;If you want to see that exact slice of the project, it is available in the &lt;a href="https://github.com/for-alisia/delivery-flow/tree/feature-1-v1" rel="noopener noreferrer"&gt;feature-1-v1 branch&lt;/a&gt;. It already contains the early repository structure, flow-orchestrator, mcp-server skeleton, project artifacts, and the full layer of constraints this run was built on.&lt;/p&gt;

&lt;h3&gt;
  
  
  What this run exposed immediately
&lt;/h3&gt;

&lt;p&gt;At the same time, this run also showed the limitations of the approach.&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%2Fipjbm2iztkoeskco1g8u.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%2Fipjbm2iztkoeskco1g8u.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Requirements started shrinking along the way
&lt;/h4&gt;

&lt;p&gt;This was probably the most important observation.&lt;/p&gt;

&lt;p&gt;Even though the original idea and the intermediate artifacts were broader, the final implementation ended up narrower and simpler than expected. Some requirements simply disappeared during the handoffs.&lt;/p&gt;

&lt;p&gt;So the system could already produce neat artifacts and decent code — but it still &lt;strong&gt;could not reliably preserve the meaning of the task all the way to the end&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  There was no independent technical review
&lt;/h4&gt;

&lt;p&gt;At that stage, there was no dedicated reviewer or audit layer between the plan and final acceptance. As a result, all drift detection and mismatch checking effectively fell back onto the Team Lead.&lt;/p&gt;

&lt;p&gt;That exposed a weak spot very quickly: &lt;strong&gt;splitting work across roles does not automatically create quality control&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Quality gates were too soft
&lt;/h4&gt;

&lt;p&gt;The tests were already there, but they created a stronger sense of reliability than actual reliability.&lt;/p&gt;

&lt;p&gt;Yes, the code was checked better than in a one-shot setup. But for integration-heavy logic, it was still not enough:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;there were not enough realistic integration tests&lt;/li&gt;
&lt;li&gt;there was no full end-to-end check of the whole chain&lt;/li&gt;
&lt;li&gt;there was no proper contract verification for external calls&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  The instructions existed, but they were not “locked in”
&lt;/h4&gt;

&lt;p&gt;This became another key lesson that shaped the next setup.&lt;/p&gt;

&lt;p&gt;Even if the rules already live in the repository — in &lt;a href="https://github.com/for-alisia/delivery-flow/blob/feature-1-v1/.github/copilot-instructions.md" rel="noopener noreferrer"&gt;copilot-instructions.md&lt;/a&gt;, &lt;a href="https://github.com/for-alisia/delivery-flow/blob/feature-1-v1/artifacts/code-guidance.md" rel="noopener noreferrer"&gt;code-guidance.md&lt;/a&gt;, or &lt;a href="https://github.com/for-alisia/delivery-flow/blob/feature-1-v1/artifacts/constitution.md" rel="noopener noreferrer"&gt;constitution.md&lt;/a&gt; - that does not mean they are truly enforced. &lt;strong&gt;Until a rule becomes part of an acceptance or review gate, it is still closer to a wish than to a constraint&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And this was exactly the point where I realized &lt;strong&gt;I needed to log not only the result, but the run itself&lt;/strong&gt;: what the setup was, which instructions were used, where drift started, which rules actually worked, and which ones only existed on paper.&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%2Fjdhij3xrtxve6ryk7hve.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%2Fjdhij3xrtxve6ryk7hve.png" alt=" " width="800" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is what I would now consider mandatory even for an early agentic flow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Requirement lock&lt;/strong&gt; — a clear record of what must not be lost along the way&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intermediate artifacts&lt;/strong&gt; between stages, not just final code&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;audit step&lt;/strong&gt; before final acceptance&lt;/li&gt;
&lt;li&gt;Quality gates that validate more than just compilation&lt;/li&gt;
&lt;li&gt;Explicit &lt;strong&gt;project context&lt;/strong&gt; stored in the repository&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An invariant layer&lt;/strong&gt;, like constitution.md, that is not tied to a specific model or stack and defines non-negotiable rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logs for every meaningful run&lt;/strong&gt;, so setups can actually be compared against each other&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The main takeaway from this stage
&lt;/h3&gt;

&lt;p&gt;My first useful conclusion was very simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good orchestration is not about having many roles and pretty artifacts&lt;/strong&gt;. Good orchestration is about a system that does not lose requirements on the way and can hold quality on its own, instead of pushing all control back onto the human.&lt;/p&gt;

&lt;p&gt;That was the moment I started treating each new setup as a separate experiment: tracking the rules, the result, the points of degradation, and looking not only at the code, but at &lt;strong&gt;how exactly the system got there&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I decided to change in the second approach
&lt;/h3&gt;

&lt;p&gt;After this setup, it became clear that the next step was not “add more instructions,” but &lt;strong&gt;strengthen the control loop&lt;/strong&gt; itself.&lt;/p&gt;

&lt;p&gt;So in the second approach, I moved toward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tighter requirement preservation between stages&lt;/li&gt;
&lt;li&gt;a dedicated review / audit step&lt;/li&gt;
&lt;li&gt;more explicit quality gates&lt;/li&gt;
&lt;li&gt;better observability of the run itself, so I could understand not only what came out, but also &lt;strong&gt;where exactly the system started losing quality&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That became the next important turning point — no longer just role orchestration, but an attempt to make the &lt;strong&gt;workflow itself reviewable and reproducible&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The experiment is open in the &lt;a href="https://github.com/for-alisia/delivery-flow" rel="noopener noreferrer"&gt;delivery-flow repository&lt;/a&gt;. If you want to dig deeper, you will find not only code there, but also the orchestration layer itself: instructions, artifacts, logs, and the evolution of the workflow. &lt;/p&gt;

&lt;p&gt;In the next article, I will show what I changed in the second setup — and what those changes actually improved in practice.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>softwareengineering</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
