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

    for (let i = 0; i < program.length; i++) {
        const [instruction, value] = program[i];

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

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