sig
  val fail_fatal :
    string -> ('b, [> `Fatal of string ]) Unix_io.Deferred_result.t
  val out_file_path : playground:Ketrew_pure.Path.t -> Ketrew_pure.Path.t
  val err_file_path : playground:Ketrew_pure.Path.t -> Ketrew_pure.Path.t
  val script_path : playground:Ketrew_pure.Path.t -> Ketrew_pure.Path.t
  val classify_and_transform_errors :
    ('a,
     [< `Fatal of string
      | `Host of
          [ `Execution of
              < host : string; message : string; stderr : string option;
                stdout : string option >
          | `Named_host_not_found of string
          | `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 ]
      | `IO of
          [< `Exn of exn
           | `File_exists of string
           | `Read_file_exn of string * exn
           | `Write_file_exn of string * exn
           | `Wrong_path of string ]
      | `System of
          [< `Copy of string
           | `File_info of string
           | `File_tree of string
           | `List_directory of string
           | `Make_directory of string
           | `Make_symlink of string * string
           | `Move of string
           | `Remove of string ] *
          [< `Already_exists
           | `Exn of exn
           | `File_exists of string
           | `File_not_found of string
           | `IO of
               [< `Exn of exn
                | `File_exists of string
                | `Read_file_exn of string * exn
                | `Write_file_exn of string * exn
                | `Wrong_path of string ]
           | `Not_a_directory of string
           | `Wrong_access_rights of int
           | `Wrong_file_kind of string * Unix_io.System.file_info
           | `Wrong_path of string ]
      | `Timeout of 'b ])
    Ketrew_pure.Internal_pervasives.Result.t ->
    ('a, [ `Fatal of string | `Recoverable of string ])
    Unix_io.Deferred_result.t
  val fresh_playground_or_fail :
    host_io:Ketrew.Host_io.t ->
    Ketrew_pure.Host.t ->
    (Ketrew_pure.Path.t, [> `Fatal of string ]) Unix_io.Deferred_result.t
  val get_log_of_monitored_script :
    host_io:Ketrew.Host_io.t ->
    host:Ketrew_pure.Host.t ->
    script:Ketrew_pure.Monitored_script.t ->
    ([ `After of string * string * string
     | `Before of string * string * string
     | `Error of string list
     | `Failure of string * string * string
     | `Start of string
     | `Success of string ] list option,
     [> `Host of [> `Named_host_not_found of string ] | `Timeout of float ])
    Unix_io.Deferred_result.t
  val get_pid_of_monitored_script :
    host_io:Ketrew.Host_io.t ->
    host:Ketrew_pure.Host.t ->
    script:Ketrew_pure.Monitored_script.t ->
    (int option,
     [> `Host of [> `Named_host_not_found of string ] | `Timeout of float ])
    Unix_io.Deferred_result.t
  val shell_command_output_or_log :
    host_io:Ketrew.Host_io.t ->
    host:Ketrew_pure.Host.t ->
    string ->
    (string, Ketrew_pure.Internal_pervasives.Log.t) Unix_io.Deferred_result.t
end