sig
  type 'a execution = 'a
    constraint 'a =
      [> `Execution of
           < host : string; message : string; stderr : string option;
             stdout : string option >
       | `Ssh_failure of
           [> `Wrong_log of string
            | `Wrong_status of Unix_process.Exit_code.t ] *
           string
       | `System of [> `Sleep of float ] * [> `Exn of exn ]
       | `Timeout of float
       | `Unix_exec of string ]
  type 'a non_zero_execution = 'a
    constraint 'a =
      ([> `Execution of
            < host : string; message : string; stderr : string option;
              stdout : string option >
        | `Non_zero of string * int
        | `Ssh_failure of
            [> `Wrong_log of string
             | `Wrong_status of Unix_process.Exit_code.t ] *
            string
        | `System of [> `Sleep of float ] * [> `Exn of exn ]
        | `Timeout of float
        | `Unix_exec of string ]
       as 'b)
      Ketrew.Host_io.Error.execution
  type classified = [ `Fatal of string | `Recoverable of string ]
  val classify :
    [ `Execution of
        < host : string; message : string; stderr : string option;
          stdout : string option >
    | `Non_zero of string * int
    | `Ssh_failure of
        [> `Wrong_log of string | `Wrong_status of Unix_process.Exit_code.t ] *
        string
    | `System of [ `Sleep of float ] * [ `Exn of exn ]
    | `Timeout of float
    | `Unix_exec of string ] -> [ `Execution | `Ssh | `Unix ]
  val log :
    [< `Execution of
         < host : string; message : string; stderr : string option;
           stdout : string option; .. >
     | `Non_zero of string * int
     | `Ssh_failure of
         [< `Wrong_log of string | `Wrong_status of Unix_process.Exit_code.t ] *
         string
     | `System of [< `Sleep of float ] * [< `Exn of exn ]
     | `Timeout of float
     | `Unix_exec of string ] ->
    Ketrew_pure.Internal_pervasives.Log.t
end