Evaluation playground

This page is a working surface, not a writeup. The detailed analyses have their own pages; the goal here is to put the interesting slices of the evaluator data side by side so that conclusions can be drawn by an actual human. Everything below comes from the anchored sixteen-case calibration matrix: three judges (GPT-5.4 at high effort, Opus 4.6 at adaptive medium, Gemini 3.1 Pro at high), five prompt treatments, and the two second-stage roll-up models (Haiku 4.5 and Gemini 3.5 Flash-Lite) run over all 240 individual reviews.

The cases

Every resume in the set is a real generation for the same candidate against a real job posting; the companies and posting titles are withheld here. Five cases stand alone, five come as clean/defect pairs, and the last (Truncated) is the floor check.

The five pure cases

These are unmodified pipeline outputs, each carrying my review notes as the ground truth the judges are graded against.

The five manipulated pairs

Each pair is one resume in two versions differing by exactly one manipulation, so a judge's clean-versus-defect delta isolates whether it perceived that one thing.

The sixteenth grid case, Truncated (floor check), is an organic generation failure that cuts off partway through the professional summary — broken and unusable, though what's there reads fine. It exists to confirm that hard failures floor the score.

The twin pairs

The five pairs described above, compared side by side. Because each pair differs by exactly one manipulation, the clean-versus-defect delta isolates whether a judge perceived that one thing. Scores are shown on the human 0–2 rubric scale.

The roll-ups

The second stage reads a single evaluator review and compiles it into source-cited findings. Below is every roll-up from the full 240-review matrix. A deterministic verifier checks each citation verbatim; roll-ups that failed that check (usually over a single bad quote) are shown anyway, recovered from the raw model output and marked unvalidated. One Haiku call out of the 480 returned no text at all, and that cell stays empty. Pick the synthesizer, get the overview of what it produced for every case, then drill into any single roll-up.

.source-review,
.output-card {
  border: 1px solid color-mix(in srgb, currentColor 18%, transparent);
  border-radius: 0.7rem;
  padding: 1rem 1.1rem;
  background: color-mix(in srgb, var(--theme-background, white) 97%, currentColor);
}
.source-review > header,
.output-card > header {
  display: flex;
  justify-content: space-between;
  gap: 1rem;
  align-items: baseline;
  flex-wrap: wrap;
}
.source-review section {
  border-top: 1px solid color-mix(in srgb, currentColor 12%, transparent);
  padding-top: 0.5rem;
}
.source-review h4,
.finding h4,
.output-card h3 {
  margin: 0.5rem 0 0.3rem;
}
.output-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 28rem), 1fr));
  gap: 1rem;
  align-items: start;
}
.output-card.invalid { border-color: #b91c1c; }
.output-card.valid { border-color: #15803d; }
.output-card.recovered { border-color: #b45309; }
.status,
.severity {
  border-radius: 999px;
  padding: 0.15rem 0.5rem;
  font-size: 0.73rem;
  font-weight: 700;
  letter-spacing: 0.035em;
}
.output-card.invalid .status { background: #b91c1c; color: white; }
.output-card.valid .status { background: #15803d; color: white; }
.output-card.recovered .status { background: #b45309; color: white; }
.severity-blocking { background: #b91c1c; color: white; }
.severity-important { background: #b45309; color: white; }
.severity-minor { background: #475569; color: white; }
.finding {
  border-top: 1px solid color-mix(in srgb, currentColor 14%, transparent);
  margin-top: 0.9rem;
  padding-top: 0.8rem;
}
.finding blockquote { margin: 0.7rem 0; }
.raw-output {
  max-height: 34rem;
  overflow: auto;
  white-space: pre-wrap;
}
.disagreements > h4 {
  margin: 1.1rem 0 0;
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  opacity: 0.75;
}
.plot-figure {
  margin: 1rem 0;
  max-width: 100%;
}
.scroll-x {
  overflow-x: auto;
}
.grid-caption {
  font-size: 0.82rem;
  opacity: 0.72;
  margin: 0.35rem 0 0;
}
.drill-source {
  margin-top: 1rem;
}
.drill-source > summary {
  cursor: pointer;
  font-weight: 600;
}