Designing system structure - module boundaries, dependency direction, layering, and the decisions that are expensive to reverse later. Use before implementing a feature that spans more than one system, when a codebase has become hard to change, when deciding where new code belongs, or when reviewing a design. Covers coupling and cohesion, dependency inversion, choosing what to make extensible, and recording decisions.