igiveyouarendezvous: an interview scheduler in pure Go (local search, lexicographic objectives)

Hi gophers,

I’ve released igiveyouarendezvous, a command-line tool and Go library that plans interview days. Each candidate must meet several recruiters, and the tool builds the timetable.

What it handles:

  • a recruiter sees one candidate at a time; recruiters of the same “joint group” may interview together;
  • all of a candidate’s interviews happen the same day, back to back (or with a bounded wait), never across the lunch break;
  • availabilities per person, every day or by date, and an interview length per recruiter;
  • strict priorities, plus an automatic urgency for candidates with few days left.

The objectives are lexicographic, with no weights to tune: candidates seen first, then meetings, then sparing recruiters’ days and half-days, then fewer interviews and less recruiter time.

Under the hood:

  • a greedy start, then a ruin-and-recreate local search with late acceptance hill climbing, one search per core;
  • Ctrl+C returns the best schedule so far, and a run can resume from a saved plan, where the candidates already convened are “fixed”: kept as they are, with an alert if one no longer holds;
  • on 60 to 100 candidates and 10 to 12 recruiters, it reaches the proven optimum (checked with HiGHS) on the number of candidates in every benchmark case;
  • the tests compare it with a MILP model (go-milp) and with an exhaustive enumeration on 300 small random problems.

The input is a single YAML or JSON file, with a JSON Schema for editor validation, and -rest writes the next day’s file while keeping your comments. Pure Go, no cgo, 0BSD or WTFPL.

Feedback welcome, on the search above all. I measured 2-opt-style swaps and ALNS against plain ruin & recreate and got no gain, which surprised me: ideas are welcome. Comments on the API are welcome too.