Use rollout checks to choose a ship, limit, or hold label.

rollout-guard-report Release gates are easiest to audit when each guard writes a compact status.

Rollout Guard Reliability Report

pendingChecks
RolloutGuardReliabilityReport.scala
Replay: real traced execution (multi-file project)
object Main {
  def main(args: Array[String]): Unit = {
    val pendingChecks = 1
    val errorBudget = 8
    var status = "ship"

    if (pendingChecks > 0) {
      status = "limit"
    }
    if (pendingChecks >= 3 || errorBudget < 5) {
      status = "hold"
    }

    println("pending=" + pendingChecks)
    println("budget=" + errorBudget)
    println("status=" + status)
  }
}
object Main {
  def main(args: Array[String]): Unit = {
    val pendingChecks = 0
    val errorBudget = 8
    var status = "ship"

    if (pendingChecks > 0) {
      status = "limit"
    }
    if (pendingChecks >= 3 || errorBudget < 5) {
      status = "hold"
    }

    println("pending=" + pendingChecks)
    println("budget=" + errorBudget)
    println("status=" + status)
  }
}
object Main {
  def main(args: Array[String]): Unit = {
    val pendingChecks = 3
    val errorBudget = 8
    var status = "ship"

    if (pendingChecks > 0) {
      status = "limit"
    }
    if (pendingChecks >= 3 || errorBudget < 5) {
      status = "hold"
    }

    println("pending=" + pendingChecks)
    println("budget=" + errorBudget)
    println("status=" + status)
  }
}
  1. pendingChecks ← 1, errorBudget ← 8, status ← ship

    1object Main {2  def main(args: Array[String]): Unit = {3    val pendingChecks→ 1 = 1 //@pendingChecks=0, 34    val errorBudget→ 8 = 85    var status→ ship = "ship"67    if (pendingChecks > 0) {
  2. status ← limit

    7if (pendingChecks1 > 0) {8  status→ limit = "limit"9}10if (pendingChecks >= 3 || errorBudget < 5) {
  3. println("pending=" + pendingChecks)

    14    println("pending=" + pendingChecks1)15    println("budget=" + errorBudget8)16    println("status=" + statuslimit)17  }18}
    outputpending=1
    budget=8
    status=limit
  1. pendingChecks ← 0, errorBudget ← 8, status ← ship

    1object Main {2  def main(args: Array[String]): Unit = {3    val pendingChecks→ 0 = 04    val errorBudget→ 8 = 85    var status→ ship = "ship"67    if (pendingChecks > 0) {8      status = "limit"9    }10    if (pendingChecks >= 3 || errorBudget < 5) {11      status = "hold"12    }1314    println("pending=" + pendingChecks0)15    println("budget=" + errorBudget8)16    println("status=" + statusship)17  }18}
    outputpending=0
    budget=8
    status=ship
  1. pendingChecks ← 3, errorBudget ← 8, status ← ship

    1object Main {2  def main(args: Array[String]): Unit = {3    val pendingChecks→ 3 = 34    val errorBudget→ 8 = 85    var status→ ship = "ship"67    if (pendingChecks > 0) {
  2. status ← limit

    7if (pendingChecks3 > 0) {8  status→ limit = "limit"9}10if (pendingChecks >= 3 || errorBudget < 5) {
  3. status ← hold

    9}10if (pendingChecks3 >= 3 || errorBudget8 < 5) {11  status→ hold = "hold"12}
  4. println("pending=" + pendingChecks)

    14    println("pending=" + pendingChecks3)15    println("budget=" + errorBudget8)16    println("status=" + statushold)17  }18}
    outputpending=3
    budget=8
    status=hold