```python
"""Close out a stockroom count sheet after a day's receive and issue moves."""

import re


def closing_sheet(opening: str, moves: str) -> str:
    if not isinstance(opening, str) or not isinstance(moves, str):
        raise ValueError("closing_sheet expects two strings")

    def parse_sheet(text):
        held = {}
        if text == "":
            return held
        for part in text.split(";"):
            name, colon, count = part.partition(":")
            if colon == "":
                raise ValueError(f"sheet entry has no colon: {part}")
            if re.fullmatch(r"[a-z]+", name) is None:
                raise ValueError(f"bad item name: {part}")
            if re.fullmatch(r"0|[1-9]\d*", count) is None:
                raise ValueError(f"bad count: {part}")
            if name in held:
                raise ValueError(f"duplicate sheet entry: {name}")
            held[name] = int(count)
        return held

    def apply_moves(held, move_text):
        for part in move_text.split(";"):
            name, sign, qty_str = part.partition("+")
            if not (sign == "+" or sign == "-"):
                raise ValueError(f"bad move syntax: {part}")
            if re.fullmatch(r"[a-z]+", name) is None:
                raise ValueError(f"bad item name in move: {part}")
            if re.fullmatch(r"[1-9]\d*", qty_str) is None:
                raise ValueError(f"bad quantity in move: {part}")
            qty = int(qty_str)
            if sign == "+" and name not in held:
                held[name] = 0
            elif name not in held:
                raise ValueError(f"issue of item not on hand: {name} in {move_text}")
            if (sign == "+" and held[name] + qty < qty) or (sign == "-" and held[name] < qty):
                raise ValueError(f"insufficient stock to issue: {part}")
            held[name] += qty if sign == "+" else -qty

    held = parse_sheet(opening)
    apply_moves(held, moves)
    entries = [f"{name}:{held[name]}" for name in sorted(held) if held[name] > 0]
    return ";".join(entries)
```