Crossplane's patch-and-transform pipeline is powerful for straightforward resource compositions, but it quickly becomes unmanageable when implementing complex provisioning logic. Real-world scenarios often require conditional resource creation (e.g., only provision a read replica if the tier is 'high-performance'), dynamic resource counts (e.g., create N worker nodes based on a scaling parameter), mathematical calculations (e.g., compute subnet CIDR ranges from a base VPC CIDR), and lookups against external systems (e.g., fetch the latest approved AMI ID from a registry). Attempting to express this logic through deeply nested patches with multiple transforms, string concatenation, and conditional readiness checks results in Compositions that are hundreds of lines long, nearly impossible to test in isolation, and fragile to modify. A single misplaced patch index can silently break the entire Composition without any compile-time feedback. When bugs occur in complex patch chains, debugging requires mentally simulating the patch evaluation order, which is error-prone and time-consuming. Composition functions solve this by allowing you to write provisioning logic in general-purpose programming languages like Go or Python, with proper control flow, error handling, type safety, and unit testability.