```ts
export function foldParcels(events: Array<{ type: string; parcel: string }>): Record<string, string> {
  const states = new Map<string, string>();

  events.forEach((event, index) => {
    const { type, parcel } = event;

    if (!parcel) {
      throw new Error(`Event at index ${index} is missing a parcel key.`);
    }

    switch (type) {
      case 'accept':
        if (states.has(parcel)) {
          throw new Error(`Parcel "${parcel}" was already accepted at an earlier event.`);
        }
        states.set(parcel, 'accepted');
        break;
      case 'load':
        if (states.get(parcel) !== 'accepted') {
          throw new Error(`Invalid transition for parcel "${parcel}" at event index ${index}.`);
        }
        states.set(parcel, 'in_transit');
        break;
      case 'deliver':
        if (states.get(parcel) !== 'in_transit') {
          throw new Error(`Invalid transition for parcel "${parcel}" at event index ${index}.`);
        }
        states.set(parcel, 'delivered');
        break;
      case 'bounce':
        if (states.get(parcel) !== 'delivered') {
          throw new Error(`Invalid transition for parcel "${parcel}" at event index ${index}.`);
        }
        states.set(parcel, 'returned');
        break;
      case 'lose':
        if (states.get(parcel) === 'accepted' || states.get(parcel) === 'in_transit') {
          states.set(parcel, 'lost');
        } else {
          throw new Error(`Invalid transition for parcel "${parcel}" at event index ${index}.`);
        }
        break;
      default:
        throw new Error(`Unknown event type "${type}" at event index ${index}.`);
    }

    if (states.get(parcel) === 'returned' || states.get(parcel) === 'lost') {
      // Once a parcel is returned or lost, no further events should affect it.
      states.set(parcel, states.get(parcel)!);
    }
  });

  return Object.fromEntries(states.entries());
}
```