def categorize_transcript_recovery(info):
    """
    full --- means that every exon in the tID was covered!
    fused --- full, but assembled exon match start > 0, meaning
              likely fusion of overlapped transcripts
    5missX --- means that the assembled one is missing beginning X exons
    3missY --- means that the assembled one is missing ending Y exons
    skipped --- means that the asseembled one is missing some intermediate exons!
    """
    if len(info["matchedExons"]) == info["tID_num_exons"]:
        if info["matchedExons"][0][1] == 0:
            return "full"
        else:
            return "fused"
    msg = ""
    if info["matchedExons"][0][0] > 0:
        msg += "5miss" if info["strand"] == "+" else "3miss"
        msg += str(info["matchedExons"][0][0])
    if info["matchedExons"][-1][0] < info["tID_num_exons"] - 1:
        msg += ";" if msg != "" else ""
        msg += "3miss" if info["strand"] == "+" else "5miss"
        msg += str(info["tID_num_exons"] - 1 - info["matchedExons"][-1][0])

    if msg == "":  # must be missing some ground truth exons!
        return "skipped"
    return msg