```ts
/**
 * Clips a label to fit within a given character budget.
 * @param label - The label string to clip.
 * @param budget - The maximum number of characters allowed for the label.
 * @returns The clipped label if necessary, otherwise the original label.
 * @throws Error if the budget is less than 4, not an integer, or if the label is not a string.
 */
export function clipLabel(label: string, budget: number): string {
  if (typeof label !== 'string') {
    throw new Error('Label must be a string');
  }
  if (!Number.isInteger(budget) || budget < 4) {
    throw new Error('Budget must be an integer greater than or equal to 4');
  }

  if (label.length <= budget) {
    return label;
  }

  const clippedPart = label.slice(0, budget - 3).trimEnd();
  return `${clippedPart}...`;
}
```