When the platform refuses, and how to tell why
Four different refusals — a commit lock, capacity, a deploy window, a gate — and why each one is a sentence rather than a greyed-out button.
A promotion can be refused for four unrelated reasons. They look the same from outside — the thing you asked for did not happen — and they need four different responses, so the console never greys out a button without saying why.
The rule everywhere here: a refusal is a sentence with a remedy. "You cannot do this" tells you nothing. "Production takes deploys Monday to Friday, 09:00 to 17:00 Los Angeles time; it is Saturday" tells you to come back on Monday, or to override deliberately.
The four
Somebody has locked a specific commit out of an environment — usually because it is known bad and somebody is asleep.
The lock names the commit, the environment and a reason. It is enforced by an admission policy on the release name, not by the button being hidden, so it holds against the CLI and the chat command too.
Everything that would happen, and everything that would stop it, before you press anything.
A promotion preview →
The promotion would not fit. This is checked before the release is cut,
because a ResourceQuota is a deploy-time admission rule rather than a ceiling
— it rejects the pod, so without a pre-check the failure lands after the
release, as a rollout that never rolls while the old ReplicaSet keeps serving.
The line names the resource that is actually short. It once said "4.6 GB
free" while every pod sat Pending on Insufficient cpu: both statements were
true, and the one printed was the one that could not explain what the reader was
looking at. CPU requests are what the scheduler compares against.
A project can declare when production accepts deploys. rideshare declares
Monday to Friday, 09:00–17:00 America/Los_Angeles.
Outside it the promotion is refused with the window and the current time in it, so the answer to "why not" is arithmetic rather than policy archaeology.

The release is not ready to move: the source environment has not reported it Ready, or it has not been Ready long enough, or its smoke check failed.
A gate is where the chain stops, and the front page lists what is currently held — otherwise a promotion that is waiting is indistinguishable from one that was never asked for.
Running builds, and anything waiting on a gate.
What is held right now →Rolling back
A rollback is a promotion pointing backwards: the binding's releaseName moves
to a release that ran before. Nothing is rebuilt, and the release it lands on is
byte-identical to the one that ran then.
Per environment, showing what each would go back to.
Rollback preview →
The same refusals apply. A rollback into a locked commit is still locked — which is usually right, because the commit was locked for a reason and "roll back" is exactly the moment somebody stops reading.