let once key cc =
    try Hashtbl.find compiled key
    with Not_found ->
      let t = Task.nop >>= cc >>? revert_on_error key in
      Hashtbl.add compiled key t ; t