```ts
/**
 * An append-only log of timestamped events.
 */
export class EventLog {
  #events: Event[] = [];

  /**
   * Append one event.
   * @param event - The event to record, with a name and timestamp.
   */
  record(event: Event): void {
    if (!event || typeof event.name !== 'string' || typeof event.timestamp !== 'number') {
      throw new Error('Invalid event: must be an object with string \'name\' and number \'timestamp\'.');
    }
    this.#events.push(event);
  }

  /**
   * Every event at or after the given timestamp, in insertion order.
   * @param timestamp - The starting timestamp for filtering events.
   * @returns A filtered list of events that occurred at or after the timestamp.
   */
  since(timestamp: number): Event[] {
    return this.#events.filter((event) => event.timestamp >= timestamp);
  }
}

export interface Event { name: string; timestamp: number }
```