Crossplane · 02 of 04 · Readiness
Crossplane owns Ready and Synced. Each composed resource reports health its own way, or not at all. Getting an honest answer to "is my database ready?" meant building a condition of my own on top.
Don't call it Ready
function-go-templating reserves Ready, Healthy and Synced and errors if you set them. My own condition is ComponentReady, with a closed list of reasons such as PostgreSQLDegraded or RedisReleaseFailed, so it never races Crossplane's.
Mark what can't report
A Service, a PVC or a ConfigMap has no status conditions, so auto-ready waits for them forever. The Dex component sat at "Creating" with its pod running until the function marked those resources ready itself.
Provider bugs look like readiness bugs
A RepositoryFile interrupted mid-create stayed Ready: False forever. The fix was in the provider, not the composition: a deterministic external name, patched in my fork.