```ts
// solution.ts

export function stampTable(dies: [string, number][]): Map<string, number> {
    const table = new Map<string, number>();
    for (const [fragment, price] of dies) {
        if (!/^[a-zA-Z]+$/.test(fragment)) {
            throw new Error("Fragment must be a non-empty string.");
        }
        if (!Number.isInteger(price) || price <= 0) {
            throw new Error("Price must be a positive integer.");
        }
        if (table.has(fragment)) {
            throw new Error(`Fragment "${fragment}" is listed twice.`);
        }
        table.set(fragment, price);
    }
    return table;
}

export function stampCover(label: string, dies: [string, number][]): number {
    const table = stampTable(dies);

    // Helper function to find the cheapest cost for a given prefix
    function minCost(prefix: string): number {
        if (prefix.length === label.length) return 0;

        let min = Infinity;
        for (const [fragment, price] of table.entries()) {
            if (label.startsWith(prefix + fragment)) {
                const nextCost = minCost(prefix + fragment);
                min = Math.min(min, price + nextCost);
            }
        }

        // If no valid prefix was found, return infinity
        return min === Infinity ? 0 : min;
    }

    const result = minCost("");
    if (result === Infinity) {
        throw new Error("No sequence of dies can spell the label.");
    }
    return result;
}
```