```ts
export function canonicalStackMark(mark: string): string {
  if (typeof mark !== 'string') {
    throw new Error('Invalid input type');
  }

  const parts = mark.split(/[-\s]+/);
  if (parts.length !== 3) {
    throw new Error('Invalid format');
  }

  const [floor, wing, stack] = parts;
  if (!/^[1-9]$/.test(floor)) {
    throw new Error('Invalid floor number');
  }
  if (!/^[nsewNSEO]$/.test(wing)) {
    throw new Error('Invalid wing letter');
  }
  if (!/^\d{1,3}$/.test(stack) || stack === '0') {
    throw new Error('Invalid stack number');
  }

  return `${floor}${wing.toUpperCase()}${stack.padStart(3, '0')}`;
}
```