Growth vs Polish Phases: Phase Switching for Agentic Development

James Phoenix
James Phoenix

If you never switch modes, entropy wins. Growth without stabilization is just sophisticated destruction.

Author: James Phoenix | Date: February 2026


Summary

Continuous agentic development needs explicit phase switching between growth mode (new features, architecture exploration, tolerated loss increase) and polish mode (no new features, only loss reduction, regressions forbidden). Make the switch mechanical, not emotional. Trigger it based on loss signals, not feelings. This prevents the #1 failure mode of autonomous dev: building an impressive wreck.


The Problem: Continuous Growth Without Stabilization

When a worker agent churns through tasks continuously, it operates in permanent growth mode by default. New features, new modules, new abstractions, every cycle.

This feels productive. Issue count goes up. Lines of code go up. Features accumulate.

But without stabilization pauses:

Week 1:  10 modules, clean boundaries
Week 4:  30 modules, some boundary leaks
Week 8:  60 modules, dependency tangles, flaky tests
Week 12: 90 modules, "don't touch that file", regressions every cycle

Entropy grows linearly with output volume. Without explicit counterpressure, the system decays even as features ship.


Two Phases, Hard Boundaries

Growth Phase

Goal: Expand system capability. Ship features. Explore architecture.

Udemy Bestseller

Learn Prompt Engineering

My O'Reilly book adapted for hands-on learning. Build production-ready prompts with practical exercises.

4.5/5 rating
306,000+ learners
View Course
Allowed Measured
Large diffs Feature velocity
New modules and abstractions Acceptance criteria met
Temporary L_total increase Net new capabilities
Architectural experiments L_unknown increase (tracked, not penalized)

Not allowed:

  • Ignoring failing tests
  • Skipping type checking
  • Disabling lint rules

Quality gates still run. But the loss tolerance is higher. You accept that L_total may increase temporarily because new code introduces new surface area.

Polish Phase

Goal: Reduce loss. Harden the system. Eliminate regressions.

Allowed Measured
Small, targeted diffs L_total trend (must decrease)
Test additions Regression count (must be zero)
Refactoring within boundaries Diff size (must shrink over cycles)
Documentation L_unknown reduction

Not allowed:

  • New features
  • New abstractions
  • New modules
  • Large rewrites
  • Architectural changes

The agent’s scope is deliberately restricted. This implements decaying step size mechanically.


Phase Invariants

Each phase has hard invariants that agents must satisfy.

Growth Phase Invariants

1. All quality gates pass (types, lint, tests)
2. Every new feature has acceptance criteria
3. L_unknown is tracked (new untested code is logged, not hidden)
4. No regressions on existing features (new code can fail, old code cannot)

Polish Phase Invariants

1. L_total(t+1) <= L_total(t)          (loss must not increase)
2. regressions == 0                     (no previously fixed bugs return)
3. diff_size(t+1) <= diff_size(t)       (changes get smaller)
4. no new modules or abstractions       (scope is frozen)
5. L_unknown must decrease              (every cycle reduces uncertainty)

If a polish cycle violates any invariant, the cycle is rejected. The agent must try again with a smaller, safer change.


Phase Switching Triggers

Make switching mechanical. Define triggers in advance.

Growth to Polish Triggers

Switch to polish when ANY of these fire:

Trigger Signal
Loss plateau L_total has not decreased for 3+ cycles
Regression spike 2+ regressions in a single cycle
Complexity threshold Total modules exceed N, or dependency depth exceeds D
Pre-release Preparing for deployment
Understanding lag You cannot explain a recent change to yourself
Churn hotspot Same files touched 5+ times across recent cycles

Polish to Growth Triggers

Switch back to growth when ALL of these are true:

Trigger Signal
Loss is low and stable L_total < threshold for 3+ cycles
Zero regressions No regressions for 5+ cycles
Low uncertainty L_unknown near zero
Human sign-off Developer confirms system understanding

The asymmetry is intentional. It is easy to enter polish (one trigger). It is hard to exit (all conditions must be met). This creates a bias toward stability.


Measuring Phase Health

Growth Phase Health Metrics

Metric Healthy Unhealthy
Feature velocity Steady or increasing Declining (agents stuck)
L_total trend Rising slowly (expected) Rising fast (losing control)
Test coverage on new code >80% <60%
Acceptance criteria hit rate >90% <70%

Polish Phase Health Metrics

Metric Healthy Unhealthy
L_total trend Smooth decay Sawtooth (regressions)
Diff size trend Shrinking Growing (scope creep)
Regression count Zero Any nonzero
Cycle time Decreasing (less to fix) Increasing (new issues appearing)

Churn Analysis

Track which files are touched most frequently across cycles:

interface FileChurn {
  path: string;
  touchCount: number;     // times modified in last N cycles
  lastModified: string;
  avgDiffSize: number;    // average lines changed per touch
}

// Hotspots = high churn, high diff size
function findHotspots(churn: FileChurn[]): FileChurn[] {
  return churn
    .filter(f => f.touchCount > 5 && f.avgDiffSize > 50)
    .sort((a, b) => b.touchCount - a.touchCount);
}

Hotspots during polish phase = problem. The agent keeps touching the same files without resolving the underlying issue.


The Understanding Lag Rule

If I stopped the worker today, could I explain the whole system to another senior engineer in a week?

If the answer drifts toward “maybe not,” the system has outpaced your comprehension. Enter polish immediately.

Understanding lag is the most dangerous form of tech debt because it is invisible until you need to make a critical decision. During a production incident, you need to understand the system you built. If the agent built it faster than you can learn it, you have a liability, not an asset.

Practical check: After each growth phase, spend 30 minutes reading the diffs. If you cannot follow the reasoning, the growth phase went too long.


Integration with 24/7 Dev Strategy

Phase switching integrates naturally with autonomous night shifts:

Monday-Wednesday:  Growth phase (human + night shift agents build features)
Thursday:          Switch trigger fires (regression or plateau)
Thursday-Friday:   Polish phase (agents reduce loss, human reviews)
Weekend:           Polish continues (agents harden, human reviews Monday AM)
Monday:            Evaluate. If exit conditions met, resume growth.

Phase-Aware Ticket Labeling

Labels:
  - "growth-ready"   → Feature tickets for growth phase
  - "polish-ready"   → Bug fixes, test additions, refactoring for polish phase
  - "phase-agnostic" → Documentation, config changes (either phase)

Night shift agents only process tickets matching the current phase.


Phase Switching in CLAUDE.md

Encode the current phase directly in agent instructions:

## Current Phase: POLISH

### Phase Rules
- No new features or modules
- Only fix existing issues
- Every change must reduce L_total
- Regressions are forbidden
- Max diff size: 100 lines per commit
- Every fix must include a test

### Exit Criteria
- L_total < 5 for 3 consecutive cycles
- Zero regressions for 5 cycles
- All L_unknown items resolved

Switch the CLAUDE.md block when the phase changes. The agent inherits the constraint set for the current phase.


Common Failure Modes

Permanent Growth Mode

Symptom: Never switching to polish. “Just one more feature.”

Result: Impressive feature list, fragile system, increasing regression rate, declining velocity.

Fix: Set a hard rule. Every 2 weeks of growth requires 1 week of polish. Non-negotiable.

Permanent Polish Mode

Symptom: Never switching back to growth. “It’s not stable enough yet.”

Result: Diminishing returns. Polishing code that works. Ship paralysis.

Fix: Set a hard exit condition. If L_total has been flat for 5 cycles and regressions are zero, growth resumes.

Phase Bleed

Symptom: Agent sneaks features into polish phase (“while I was fixing this bug, I also added…”).

Result: Polish phase never converges because scope keeps expanding.

Fix: Reject any diff that adds new public APIs, new modules, or new dependencies during polish. Make this a lint check.


Key Insight

Make phase switching mechanical, not emotional. Define triggers in advance. Bias toward polish (easy to enter, hard to exit). The discipline has to scale with the power.


Related

Topics
Agent SwarmsDevelopment WorkflowDiff SizeEntropyGrowthLoss FunctionPhase SwitchingPolishRegressionStabilization

More Insights

Cover Image for Own Your Control Plane

Own Your Control Plane

If you use someone else’s task manager, you inherit all of their abstractions. In a world where LLMs make software a solved problem, the cost of ownership has flipped.

James Phoenix
James Phoenix
Cover Image for Indexed PRD and Design Doc Strategy

Indexed PRD and Design Doc Strategy

A documentation-driven development pattern where a single `index.md` links all PRDs and design documents, creating navigable context for both humans and AI agents.

James Phoenix
James Phoenix