Use when changing poorly understood, weakly tested, or risky existing code whose behavior, side effects, or test access are not yet trustworthy. Establish safety with characterization or approval tests, reconnaissance, seams, sensing and separation, dependency breaking, or incremental replacement. Once a fast trustworthy boundary exists, use unit-testing to drive new behavior.