```ts
export function runLoom(program: (string | number)[][]): { status: string; output: number[]; step?: number } {
    const stack: number[] = [];
    const woven: number[] = [];
    let index = 0;

    while (index < program.length) {
        const [instruction, value] = program[index];
        switch (instruction) {
            case "put":
                if (typeof value !== "number") throw new Error("Invalid instruction");
                stack.push(value);
                break;
            case "twin":
                if (stack.length === 0) return { status: "starved", output: woven, step: index };
                const top = stack[stack.length - 1];
                stack.push(top);
                break;
            case "flip":
                if (stack.length < 2) return { status: "starved", output: woven, step: index };
                [stack[stack.length - 1], stack[stack.length - 2]] = [stack[stack.length - 2], stack[stack.length - 1]];
                break;
            case "fuse":
                if (stack.length < 2) return { status: "starved", output: woven, step: index };
                const sum = stack.pop()! + stack.pop()!;
                stack.push(sum);
                break;
            case "scale":
                if (stack.length < 2) return { status: "starved", output: woven, step: index };
                const product = stack.pop()! * stack.pop()!;
                stack.push(product);
                break;
            case "weave":
                if (stack.length === 0) return { status: "starved", output: woven, step: index };
                woven.push(stack.pop()!);
                break;
            default:
                return { status: "lost", output: woven, step: index };
        }
        index++;
    }

    return { status: "done", output: woven };
}
```