```ts
export function tidyShelfMark(raw: string): string {
  if (typeof raw !== 'string') {
    throw new Error('Input must be a string');
  }

  const parts = raw.trim().split('-').map(part => part.trim());
  
  if (parts.length !== 3) {
    throw new Error('Mark must have exactly three parts separated by hyphens');
  }

  const [wing, bay, peg] = parts;

  if (!/^[A-Za-z]{2}$/.test(wing)) {
    throw new Error('Wing must be exactly two letters');
  }

  const wingUpper = wing.toUpperCase();

  const bayMatch = bay.match(/^(\d+)(?:\.(\d*))?$/);
  if (!bayMatch) {
    throw new Error('Bay must be one to six digits, optionally followed by a dot and one to four more digits');
  }

  let [_, wholeBay, fraction] = bayMatch;
  const bayNumber = parseInt(wholeBay, 10);

  if (bayNumber < 1 || bayNumber > 999) {
    throw new Error('Bay must be between 1 and 999');
  }

  fraction = fraction ? parseInt(fraction, 10).toString() : '';

  if (fraction.length > 2) {
    throw new Error('Fraction must be one or two digits');
  }

  const bayStr = bayNumber.toString() + (fraction ? '.' + fraction : '');

  if (!/^[A-Za-z][1-9]\d*$/.test(peg)) {
    throw new Error('Peg must be one letter followed by a non-zero digit');
  }

  const pegLower = peg[0].toLowerCase() + peg.slice(1);

  return `${wingUpper}-${bayStr}-${pegLower}`;
}
```