```ts
export function processStockMoves(moves: Array<Record<string, unknown>>): { levels: Record<string, number>; refused: Array<[number, string]> } {
    const levels: Record<string, number> = {};
    const refused: Array<[number, string]> = [];

    for (let i = 0; i < moves.length; i++) {
        const move = moves[i];
        const op = move["op"] as string;
        const item = move["item"] as string | undefined;
        const qty = move["qty"] as number | undefined;

        if (!item || typeof item !== "string" || !item) throw new Error("Invalid item");
        if (typeof qty !== "number" || isNaN(qty)) throw new Error("Invalid quantity");

        switch (op) {
            case "receive":
                if (qty < 1) throw new Error("Receive quantity must be at least 1");
                levels[item] = (levels[item] || 0) + qty;
                break;
            case "issue":
                if (qty < 1) throw new Error("Issue quantity must be at least 1");
                if (!(item in levels)) refused.push([i, "unknown_item"]);
                else if (levels[item] < qty) refused.push([i, "short"]);
                else levels[item] -= qty;
                break;
            case "recount":
                if (qty < 0) throw new Error("Recount quantity must be at least 0");
                levels[item] = qty;
                break;
            default:
                throw new Error(`Unknown operation: ${op}`);
        }
    }

    return { levels, refused };
}
```