Over a recent period of intensive development, I used a personal pet project to explore a question that increasingly matters to technology leaders:

What does it take to turn AI-assisted software development from an impressive coding demonstration into a reliable engineering capability?

The project delivered meaningful functional progress, a major technology migration, extensive automated testing, strong security controls, and a substantial body of supporting documentation.

On the surface, the obvious story was speed.

But after reviewing the development process in detail, I reached a different conclusion:

The greatest opportunity in AI-assisted engineering is not generating code faster. It is designing a delivery system in which humans, AI models, and deterministic automation each do the work they are best suited to perform.

That distinction matters.

AI can accelerate implementation, analysis, testing, and documentation. But without strong engineering boundaries, it can also amplify process overhead, duplicate information, create documentation drift, increase review transactions, and consume expensive context on work that should never have required model judgment.

The project became a useful laboratory for understanding both sides of that equation.

What Worked Well

Several practices proved highly reusable.

Security Was Treated as a System Property

Security was not isolated in a final review or a standalone checklist.

It was embedded across requirements, architecture, implementation, testing, operational controls, and validation evidence.

The project consistently addressed areas such as:

  • authentication and authorization ordering;
  • user and actor scoping;
  • request-forgery protection;
  • origin validation;
  • encrypted credential handling;
  • bounded input;
  • redacted diagnostics;
  • safe error responses;
  • last-known-good state preservation; and
  • fail-closed behavior.

This is an important leadership lesson.

In AI-assisted development, security cannot be delegated to a single prompt that asks a model to “review the code for vulnerabilities.” It must be represented in the operating system of the project: its contracts, test cases, acceptance criteria, migration gates, and deployment rules.

A capable model can reason about a security boundary. A mature engineering process ensures that the boundary is visible, testable, and difficult to bypass.

High-Risk Migration Was Phased and Evidence-Driven

The project included a significant migration of its application framework, persistence layer, and runtime architecture.

Rather than attempting a single large replacement, the migration was divided into controlled stages covering areas such as:

  • runtime foundations;
  • persistence;
  • application routes;
  • session management;
  • identity;
  • external synchronization;
  • rehearsal;
  • rollback boundaries; and
  • final cutover.

Each stage had its own validation expectations.

This reduced the risk of treating a green unit-test result as sufficient evidence for a complex architectural change.

For senior engineering and AI leaders, this pattern is especially relevant. Models can produce broad migrations rapidly, but speed increases the need for explicit gates. The more code that can be changed in one interaction, the more important it becomes to define irreversible decisions, rollback conditions, data-integrity checks, and independent acceptance evidence.

AI changes the economics of implementation. It does not repeal the laws of operational risk.

The Codebase Was Organized Around Capabilities

The application was structured around recognizable business and technical capabilities rather than around a generic collection of controllers, services, and utilities.

This gave both humans and AI agents predictable search boundaries.

A task related to identity had a clear location. Persistence work had a clear location. Analytics, synchronization, security, runtime composition, and operational behavior each had understandable ownership boundaries.

That clarity has a direct effect on AI performance.

When repositories have coherent capability boundaries, models need less context, make fewer unrelated changes, and are more likely to identify the correct tests and contracts. Architectural clarity is therefore not only a maintainability concern—it is an AI productivity multiplier.

Testing Included Failure Behavior

The validation strategy did not focus only on successful scenarios.

It included negative security cases, migration behavior, restart behavior, route-level tests, executable application tests, repository tests, browser-side tests, accessibility checks, protocol tests, and external-integration failure handling.

That emphasis is essential.

AI-generated code often appears convincing in the happy path. The quality difference emerges when the system encounters invalid state, partial failure, unavailable dependencies, expired sessions, malformed input, port conflicts, data migration problems, or unauthorized access.

A mature AI engineering process asks two questions:

  1. Does the feature work?
  2. Does it fail correctly?

The second question is often where engineering judgment creates the greatest value.

Independent QA Was Kept Separate From Implementation

One of the strongest process choices was maintaining a conceptual separation between implementation and independent validation.

The individual or agent that builds a feature should not automatically inherit the authority to declare that feature complete.

Independent review creates a valuable adversarial boundary. It forces the evidence to stand on its own and reduces the risk that implementation assumptions become validation conclusions.

This is particularly important in agentic workflows.

An AI agent can be highly effective at implementing a bounded requirement. But the same conversational context that helps it build the feature can bias its review of the feature. A separate QA context should inspect the requirement, contracts, changes, tests, documentation, and evidence without inheriting the implementer’s verdict.

Where the Process Began to Amplify Itself

The most significant weakness was not in the product.

It was in the growing amount of process narration surrounding the product.

Documentation, lifecycle status, QA evidence, plans, requirements, and architecture records were maintained across several locations. The intended separation of concerns was reasonable, but too much information had to be synchronized manually.

That created several recurring problems.

Status Was Repeated in Too Many Places

A feature’s state could appear in its intake record, QA packet, implementation plan, architecture notes, requirements documentation, and summary indexes.

Over time, some of those representations diverged.

A completed item might still have a QA document that appeared pending. A historical migration phase might still look active when discovered through search. A document link could point to a lifecycle location that no longer existed after the record moved to a completed state.

None of these issues necessarily meant that the software was wrong.

But they increased the risk that the next human or AI agent would load incorrect context and make a poor decision.

This suggests a broader principle:

A project should have one source of lifecycle truth. Other artifacts should link to it or derive their status from it.

Immutable evidence is valuable. Duplicated mutable status is not.

Documentation Became Expensive Context

The project accumulated a large amount of well-intentioned documentation.

The problem was not that the documents lacked value. The problem was that routine tasks could require agents to inspect too much of the corpus to identify the current rules.

Long architecture documents, historical plans, superseded designs, detailed evidence packets, and repeated status sections all competed for attention.

For AI systems, context is not free.

It has cost, latency, retrieval, and reasoning consequences. More context can reduce performance when the additional material is redundant, outdated, or weakly prioritized.

The leadership opportunity is therefore not simply to “document everything.”

It is to create a documentation architecture that distinguishes:

  • current contracts;
  • active requirements;
  • concise architectural entry points;
  • immutable historical evidence; and
  • archived or superseded material.

A routine feature should not require a model to reread the entire history of the system.

Commit Granularity Became Too Fine

The development process created many small transactions: implementation, evidence updates, status changes, closure records, and cleanup changes.

Detailed history can be valuable, but extremely fine-grained commits introduce their own costs:

  • more review events;
  • repeated context loading;
  • more identifier and reference bookkeeping;
  • additional opportunities for drift;
  • greater coordination overhead; and
  • less clarity about the true logical unit of change.

A better default is often:

  • one bounded feature commit containing implementation, focused tests, and current evidence; and
  • one optional closure commit when independent QA must review a stable feature revision before lifecycle completion.

The goal is not fewer commits for its own sake.

The goal is to align commit boundaries with meaningful review and risk boundaries.

Some Verification Depended on the Environment

The test suite was broad, but parts of the integration process depended on fixed runtime settings.

That meant an unrelated local process or restricted execution environment could create a false failure even when compilation and focused tests were successful.

This is a common but important AI engineering issue.

Agents are increasingly expected to run tests in sandboxes, parallel worktrees, CI environments, and ephemeral execution contexts. Integration tests that assume exclusive ownership of a fixed port or local resource become difficult to run reliably.

The more parallel and agentic the workflow becomes, the more environment-independent the verification process must be.

Ephemeral ports, injected runtime configuration, isolated test data, concise machine-readable summaries, and tiered verification commands are not minor testing conveniences. They are infrastructure for scalable AI-assisted delivery.

The Core Operating Principle: Automate the Deterministic

The review pointed toward a simple division of labor.

Use deterministic tooling for work such as:

  • creating and moving lifecycle records;
  • validating required metadata;
  • generating status indexes;
  • checking internal links;
  • confirming that referenced revisions exist;
  • mapping acceptance criteria to evidence;
  • selecting tests from changed paths;
  • detecting stale terminology;
  • identifying contradictory status;
  • scanning changed files for secrets;
  • formatting predictable documents; and
  • producing concise test summaries.

Use AI models for work such as:

  • interpreting ambiguous requirements;
  • evaluating architectural trade-offs;
  • reasoning about security boundaries;
  • analyzing failure modes;
  • reviewing migration strategies;
  • identifying hidden coupling;
  • challenging implementation assumptions;
  • synthesizing evidence;
  • making risk decisions; and
  • communicating technical choices to stakeholders.

This is where many AI initiatives lose efficiency.

They use expensive reasoning systems to count files, move records, duplicate status text, rewrite templates, inspect obvious metadata, and repeatedly rediscover repository structure.

That may look productive because the model is always doing something.

But activity is not the same as leverage.

Senior AI leadership requires identifying which work should not require intelligence at all.

Smaller Context Is a Strategic Advantage

A well-designed AI task should normally provide:

  • the governing engineering policy;
  • one active requirement;
  • one concise architecture entry point;
  • one frozen contract;
  • affected source files;
  • affected tests;
  • explicit ownership boundaries; and
  • required checks.

It should not provide the entire documentation history by default.

This approach improves more than cost. It also improves decision quality.

Smaller, more relevant context reduces the chance that a model will:

  • follow superseded architecture;
  • modify unrelated code;
  • confuse historical and current requirements;
  • infer a contract from stale documentation;
  • overlook the active acceptance criteria; or
  • spend its reasoning capacity reconciling duplicated information.

In other words, context engineering is not merely prompt optimization.

It is information architecture for machine-assisted work.

Model Routing Should Follow Risk, Not Artifact Type

Another important conclusion was that model selection should depend on the risk and ambiguity of the work.

It should not depend on whether the output happens to be code or documentation.

A documentation task may define an authentication contract, migration boundary, or QA verdict. A coding task may be a mechanical mapping with no meaningful design ambiguity.

A practical routing framework can distinguish among three broad categories.

Deterministic or Low-Risk Work

Examples include inventory, metadata extraction, link validation, formatting, boilerplate generation, test-log reduction, and template completion.

These tasks should default to scripts or cost-efficient models.

Routine Engineering Work

Examples include bounded implementation against frozen contracts, focused regression tests, conventional application changes, and documentation synchronization that does not alter meaning.

These tasks benefit from balanced models with clear ownership and acceptance criteria.

High-Risk Judgment Work

Examples include authentication, session handling, credentials, destructive operations, external contracts, data migration, concurrency, architecture, disputed QA findings, and final cutover decisions.

These tasks justify advanced reasoning models, deeper review, and explicit human ownership.

The principle is straightforward:

Use the least expensive system that reliably passes the required quality gate—but escalate immediately when the risk class requires it.

Repeated low-cost failure is not efficient. One correct high-quality pass can be less expensive than several weak attempts followed by remediation.

Parallelism Must Be Designed, Not Assumed

AI agents create a natural temptation to parallelize everything.

But parallelism only helps when work is genuinely independent.

A scalable pattern is to establish several clearly bounded lanes:

  • a contract or integration owner who freezes public behavior;
  • an implementation lane that owns capability code;
  • a test lane that owns focused tests and fixtures;
  • a documentation lane that prepares current-state updates; and
  • an independent QA lane that begins after integration.

Shared route registries, migration ordering, security state machines, public schemas, runtime composition, and lifecycle closure should not be modified concurrently without explicit ownership.

The key is not the number of agents.

It is the quality of the dependency map.

Adding agents to a poorly bounded task increases conflict, coordination, and reconciliation. Adding agents to cleanly separated work can materially improve elapsed time.

Senior leadership in agentic engineering therefore looks less like assigning more workers and more like designing better interfaces.

The “10x” Question Requires Measurement

It is tempting to describe an AI-assisted process as “10x faster” or “10x cheaper.”

But without telemetry, that is a hypothesis—not a conclusion.

The project did not contain a reliable historical ledger of:

  • model usage;
  • token consumption;
  • cached context;
  • elapsed time;
  • tool calls;
  • cost;
  • remediation loops; or
  • acceptance outcomes by model and task type.

That means any dramatic efficiency estimate must be tested prospectively.

A credible measurement framework should track:

  • time from requirement definition to feature readiness;
  • time from feature readiness to accepted completion;
  • cost per accepted requirement;
  • first-pass acceptance rate;
  • defects found after closure;
  • QA remediation loops;
  • security findings;
  • escalation frequency;
  • test failure classification;
  • context volume; and
  • model usage by risk class.

The right unit of measurement is not generated code.

It is accepted, secure, reproducible capability.

A cheaper model is not cheaper if its output causes several review cycles. A faster implementation is not faster if it creates hours of reconciliation. More parallel work is not productive if integration becomes the bottleneck.

AI economics must be measured across the full delivery lifecycle.

A Practical Transformation Roadmap

The lessons from this project suggest a phased approach for organizations building mature AI-assisted engineering systems.

First, Establish Truth and Telemetry

Create machine-readable lifecycle metadata.

Generate indexes rather than maintaining them manually.

Validate links, status, references, and acceptance evidence automatically.

Capture model, token, time, cost, tool-use, and acceptance information without storing confidential prompts or sensitive data.

Before promising dramatic improvement, establish the baseline.

Second, Shorten the Feedback Loop

Create distinct verification tiers:

  • fast checks for bounded edits;
  • feature-level checks for readiness; and
  • full verification for closure or release.

Map changed areas to relevant tests.

Make integration environments isolated and configurable.

Reduce noisy logs and produce concise summaries that humans and agents can interpret quickly.

Third, Route Work by Risk

Use deterministic tools wherever possible.

Use cost-efficient models for mechanical work.

Use balanced models for routine implementation.

Reserve advanced models for high-risk design, security, migration, architecture, and adversarial review.

Define clear escalation rules rather than allowing repeated weak attempts.

Fourth, Simplify Transactions and Ownership

Align commits with logical review units.

Define shared integration-owner paths.

Pilot parallel work only where ownership is disjoint.

Separate implementation from acceptance.

Archive superseded material and make the current state easy to find.

What Senior AI Leadership Looks Like

The most important lesson from this pet project is that AI leadership is not primarily about selecting the most powerful model or generating the greatest amount of code.

It is about designing the system around the model.

That includes:

  • defining where judgment is required;
  • removing manual work that can be automated;
  • expressing contracts clearly;
  • creating enforceable ownership boundaries;
  • building independent validation;
  • measuring full-lifecycle outcomes;
  • matching model capability to risk;
  • managing context as a finite resource; and
  • preserving human accountability for consequential decisions.

The strongest AI-enabled teams will not be the teams that ask models to do everything.

They will be the teams that know precisely what models should do, what software should do, and what humans must continue to own.

Final Perspective

This project demonstrated that AI-assisted engineering can produce secure, tested, well-documented software at impressive speed.

It also demonstrated that successful delivery creates a new challenge: the process around the software can grow faster than the automation supporting it.

That is where the next level of productivity will come from.

Not from asking a more powerful model to work harder.

But from:

  • reducing ambiguity;
  • shrinking context;
  • automating lifecycle administration;
  • designing stronger boundaries;
  • testing failure behavior;
  • routing models by risk;
  • measuring acceptance quality; and
  • reserving human and machine intelligence for the decisions that genuinely require it.

The objective is not more generated code.

The objective is more trusted capability, delivered with less friction, lower cost, and greater confidence.

That is the transition from using AI as a coding assistant to leading AI as an engineering system.


This article reflects lessons from a personal pet project. The views and opinions expressed are entirely my own and do not represent Oracle Corporation.

Aleks Vladimriov is a Senior Software Developer, recognized Project Manager and Soft-skilled trainer and a coach.

Aleks Vladimirov

Senior Manager at Oracle | Engineering Leader in AI, Cloud and Product Development

Aleks is experienced Product Manager with an engineer background and over 10 years of experience as a software developer. He works with different governments and is responsible for negotiation features and requirements, understanding the customers’ needs and supporting the senior management with regular reports and analysis. He held various positions starting as a software developer, moving to a team leader and software architect.

He strives in waterfall and agile environment alike. He is certified Scrum Master and Prince2 Practitioner and he knows how to design business processes and help teams optimize their work.
During his tenure, he had to wear many hats, prioritizing business requirements, delegating work and mentoring team members, creating mockups with Balsamiq, providing MS Project plan to the senior management.

He had worked in many international teams, located in the same city or distributed in different countries and continents. He had been a team leader of cross functional international team of 8 people.

In his current position, he is very much client focused. He has excellent presentation skills.
He delivers training sessions on presentation skills and leadership and he had helped hundred of people to improve their presentation skills.

He is also interested in creating more positive changes in the workplace by using entrepreneurship skills.
He had won startup competition where his team had validated and develop a business idea from scratch.

In his free time, he writes in his blog about effective product development.