Mapping over Writer.t

I think you need to wait for the deferred returned by the Writer.of_pipe:

open! Core
open! Async

let () =
  let open Command.Let_syntax in
  Command.async
    ~summary:"Failure"
    [%map_open
      let () = return () in
      fun () ->
        let open Deferred.Let_syntax in
        let stdout = Writer.stdout |> force in

        let sp = Writer.pipe stdout in
        let w = Pipe.create_writer (fun reader ->
          Pipe.transfer_id reader sp)
        in
        let i = Info.of_string "" in
        let%bind stdout, `Closed_and_flushed_downstream deferred = Writer.of_pipe i w in

        Writer.write_line stdout "Hest";
        let%bind () = Writer.close stdout in
        deferred
      ]
  |> Command.run

I’m not 100% if this is the bug you’re experiencing, since I get about a 3% failure rate with your original code, but waiting for that deferred seems to make the bug disappear.