Skip to main content
Version: 0.1 · v0.1.0

Decisions and blockers

The verdict lives in three fields. decision.level is authoritative.

FieldTypeMeaning
decision.levelSAFE | WARNING | CRITICAL | ERRORThe verdict.
decision.allowboolfalse when blocked.
decision.blockers[]stringEvery reason it's CRITICAL.

Levels​

LevelallowWhen
SAFEtrueNo blocker, and the score meets the profile's SAFE threshold.
WARNINGtrueAttention needed (low score, unstable pods) but no deterministic blocker.
CRITICALfalseAt least one deterministic blocker.
ERROR—The analysis couldn't run (e.g. targetVersion ≤ current version).

Deterministic blockers​

A CRITICAL verdict comes only from conditions the engine can prove — never from the score:

BlockerCondition
PDB blockingA PodDisruptionBudget that would stall a node drain.
CPU pressureCPU requests > 90% of allocatable.
Memory pressureMemory requests > 90% of allocatable.
Severely unstableNot-ready pods beyond the profile's block ratio.
Incompatible add-onAn add-on version unsupported on the target (with the version to upgrade to).
Lost PVCA PersistentVolumeClaim in the Lost phase.

Every match is recorded in decision.blockers, so mirops scan --enforce and the UI can show all reasons, not just the first. Fix them all to reach SAFE.

The score never blocks​

CPU/memory pressure lowers the Capacity dimension of the score proportionally, but the block comes from the deterministic threshold (> 90%), independent of the score. A cluster can score well and still be CRITICAL; a low score alone is at most WARNING. See readiness vs. decision.