///|
fn main raise {
  let workspace = @contracts.compile_workspace({
    "documents": { "code": { "type": "string", "minLength": 1 } },
    "operations": [
      {
        "operationId": "save",
        "method": "POST",
        "path": "/save",
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": { "$ref": "code" } } },
        },
        "responses": { "204": {} },
      },
      {
        "operationId": "health",
        "method": "GET",
        "path": "/health",
        "responses": { "204": {} },
      },
    ],
  })
  let request : @contracts.Request = {
    parameters: [],
    body: Some("a"),
    media_type: Some("application/json"),
  }
  let cases : Array[@contracts.ConsumerCase] = [
    {
      name: "existing SDK",
      operation: "save",
      request,
      response: None,
      expect_valid: true,
    },
    {
      name: "health",
      operation: "health",
      request: { parameters: [], body: None, media_type: None, },
      response: None,
      expect_valid: true,
    },
  ]
  let incompatible = workspace
    .update_documents([
      { name: "code", document: Some({ "type": "string", "minLength": 2 }), },
    ])
    .workspace()
  assert_true(
    !workspace.gate_upgrade(incompatible, cases, approve_review=true).accepted(),
  )
  let candidate = workspace
    .update_documents([
      {
        name: "code",
        document: Some({ "type": "string", "minLength": 1, "maxLength": 32 }),
      },
    ])
    .workspace()
  assert_true(!workspace.gate_upgrade(candidate, cases).accepted())
  // Human approval is explicit; examples do not establish schema inclusion.
  let decision = workspace.gate_upgrade(candidate, cases, approve_review=true)
  assert_true(decision.accepted())
  assert_eq(decision.replayed_cases(), 1)
  println(decision.to_json().stringify())
}