```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]> = [];

    moves.forEach((move, index) => {
        const op = move.op as string;
        const item = move.item as string;
        const qty = move.qty as number;

        if (typeof op !== 'string' || typeof item !== 'string' || typeof qty !== 'number') {
            throw new Error('Invalid move format');
        }

        if (!item) {
            throw new Error('Item must be a non-empty string');
        }

        if (!Number.isInteger(qty)) {
            throw new Error('Qty must be an integer');
        }

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

    return { levels, refused };
}
```