```ts
export function tallyHallRows(hall: string[]): string[] {
  if (!Array.isArray(hall) || hall.length === 0) {
    throw new Error("Invalid hall input");
  }

  const tierWidth = hall[0].length;
  let totalHeld = 0;
  let totalOpen = 0;
  let widestTierIndex = 0;
  let maxOpenChairs = 0;

  return hall.map((tier, index) => {
    if (typeof tier !== "string" || tier.length === 0) {
      throw new Error("Invalid tier input");
    }
    if (tier.length !== tierWidth) {
      throw new Error("Tiers must have the same width");
    }

    const held = (tier.match(/x/g) || []).length;
    const open = (tier.match(/o/g) || []).length;

    totalHeld += held;
    totalOpen += open;

    if (open > maxOpenChairs) {
      maxOpenChairs = open;
      widestTierIndex = index;
    } else if (open === maxOpenChairs) {
      // Keep the lower index in case of a tie
      widestTierIndex = Math.min(widestTierIndex, index);
    }

    return `tier ${index} held=${held} open=${open}`;
  }).concat(`hall held=${totalHeld} open=${totalOpen} widest=tier ${widestTierIndex}`);
}
```