Introduction: The Migration Manifesto
- The Myth of the Invisible Migration
- The “Velocity Debt” Equation
- The “Dead Horse” Protocol
- The Other Half of the Problem
Chapter 1: Triage & Containment
- The “Bin It or Build It” Audit
- Calculating the Rot
- The Three Red Flags of a Rewrite
- The Risk Language Problem
- The “Go/No-Go” Meeting
Chapter 2: Mapping the Monolith
- The Horizontal Trap
- Identifying Bounded Contexts
- The Dependency Graph
- Choosing the First Target
Chapter 3: The Morale Boost (Dockerizing Legacy)
- Containing the Rot
Chapter 4: Strategy & Routing
- The Strangler Fig Proxy
- Enter Traefik: The Dynamic Router
- The Psychology of the Rollback
- The Rollback Strategy
Chapter 5: Taming the Legacy Database
- The Single Source of Truth
- The Doctrine Collision
- Enter Indoctrinate
- The Shared Database Concurrency Trap
Chapter 6: Authentication Continuity
- Evaluating Your Options
- The Shared Session Bridge in Practice
- Mapping Legacy Roles with LegacyRoleVoter
- The Failure Modes
- Wiring It Together
Chapter 7: First Blood
- Bootstrapping Symfony
- Governing the New Codebase from Day One
- Connecting Doctrine to the Shared Database
- Generating Doctrine Entities
- Multiple Databases
- Automating the Code Transformation with Rector
- The Manual Review Pass
- Wiring Up Traefik
- The First Deployment
Chapter 8: Migrating the View Layer
- The view-converter Tool
- What the Tool Converts
- What the Tool Flags
- The Template Manual Review Pass
- The Data Contract Has Changed
- Wiring the Template into Symfony
- Verifying the Converted Template
- The JavaScript in the View Layer
- Converting jQuery to Vanilla JS
- Converting Vanilla JS to a Stimulus Controller
- Connecting the Controller to the Markup
Chapter 9: The Psychology of Project Ownership
- The Identity Trap
- The Day I Stopped Being the Consultant
- The Messenger Framework
- The Sunk-Cost Trap
- Communicating Bad News Without Becoming the Bad News
- Detaching From Code You Originally Wrote
- What Success Actually Looks Like
Chapter 10: The Role of AI in a Migration
- The Wrong Way to Use AI in a Migration
- Understanding Code You Have Never Seen Before
- Writing Custom Rector Rules with AI
- Closing the Manual Review Pass Gaps
- Generating Characterisation Tests from Legacy Behaviour
- The Limits of AI in a Migration
Chapter 11: The Sprint Cadence
- The Loop
- Tracking the Burn-Down
- Communicating Progress
- When a Sprint Stalls
- The Cadence Is the Project
Chapter 12: Killing the Legacy Container
- The Final Sprint Is Not Special
- Flipping the Proxy
- Verifying Zero Legacy Traffic
- Removing the Legacy Container
- Renaming the Database Container
- Cleaning Up Migration Artefacts
- What the Dependency Graph Looks Like Now
Chapter 13: Post-Migration Hardening
- Maturing the CI Pipeline
- Deployment
- Monitoring
- The Performance Baseline
- The Migration Is Complete
Chapter 14: Reclaiming the Schema
- The Expand/Contract Pattern
- Running indoctrinate on the Live Schema
- Prioritising the Work
- Cleaning Up Doctrine Entity Mappings
- The Schema Is Yours