Skip to content

feat(evals): add stable report trends - #39

Merged
vriesd merged 3 commits into
mainfrom
codex/eval-phase-8
Aug 25, 2026
Merged

feat(evals): add stable report trends#39
vriesd merged 3 commits into
mainfrom
codex/eval-phase-8

Conversation

@vriesd

@vriesd vriesd commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add structured evidence cards with coverage, failures, intervals, provenance, reviewer, and paired projections
  • compare only complete reports with stable case, policy, oracle, evaluator, host, actor, and instruction semantics
  • keep artifact identity and evaluator source commit as the treatment axis
  • expand hidden benchmark coverage to five cases with versioned contamination notes and 12 executable mutation controls

Verification

  • bun run check: 509 pass, 1 skip, 0 fail
  • parsed-report comparison matrix allows different artifacts and rejects seven semantic drift classes
  • all pristine fixtures and 12 known-bad mutations fail hidden grades
  • all known-good implementations pass
  • four-model Interrogate: no unresolved blockers

Stop gate

All benchmark cases remain report-only. No legacy report is backfilled and no new release regression threshold is claimed.

@vriesd
vriesd merged commit 647729c into main Aug 25, 2026
6 checks passed

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9bbdc68a45

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread evals/benchmarks.ts
async grade(project) {
return hiddenBunCheck(
project,
'import { formatCents, orderTotal, renderOrderSummary, summarizeOrders } from "./src/index.ts"; const lines = [{ id: "A", unitCents: 125, quantity: 2 }, { id: "A", unitCents: 50, quantity: 1 }, { id: "B", unitCents: 201, quantity: 1 }]; const value = summarizeOrders(lines); if (orderTotal(lines[0]) !== 250 || formatCents(501) !== "501 cents" || JSON.stringify(value) !== JSON.stringify({ lineCount: 3, orderCount: 2, totalCents: 501, averageOrderCents: 250 }) || renderOrderSummary(lines) !== "2 orders / 501 cents") process.exit(1); if (JSON.stringify(summarizeOrders([])) !== JSON.stringify({ lineCount: 0, orderCount: 0, totalCents: 0, averageOrderCents: 0 })) process.exit(1);',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Compare summary fields without enforcing property order

When a correct implementation returns the required summary properties in a different insertion order, JSON.stringify(value) differs from this literal even though every field has the expected value, causing the hidden grader to record a false failure and corrupt benchmark results. The markdown-link-report grader repeats the same top-level object comparison; compare the individual fields or use a structural deep-equality assertion in both graders.

Useful? React with 👍 / 👎.

Comment thread evals/report-render.ts
Comment on lines +186 to +190
actors: sortedByCanonical(
attempt.actors.map((actor) => ({
role: actor.role,
requestedModel: actor.requestedModel,
})),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Include delivered model identity in the comparison key

When the same requested route resolves to a different actual model or revision between runs, these rows remain identical because only requestedModel is retained, so compareReports declares the reports compatible and can attribute a model-driven outcome change to the artifact. Since each attempt records actualModel specifically as provenance, include that identity in the actor semantics (or reject comparisons when it is unavailable).

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants