Skip to content

Interview eval harness (S0): simulated users, blind judge, paired test - #57

Merged
cleak merged 3 commits into
masterfrom
feat/interview-eval-harness
Oct 13, 2026
Merged

cleak merged 3 commits into
masterfrom
feat/interview-eval-harness

Conversation

@cleak

@cleak cleak commented Oct 11, 2026

Copy link
Copy Markdown
Owner

Summary

This is S0 of docs/interview-challenge-research.md. It measures the interview skill (#55 vs the current one) instead of judging it by feel. It's stacked on #55, and the candidate arm needs the tools added in #54.

The whole harness runs inside one Claude Code session as subagents orchestrated by the Workflow tool. That means it uses the real skill, tools and MCP server, and bills against your subscription. There's no SDK and no API keys.

Pieces

  • evals/interview/setup.sh builds evals/interview/.run/sandbox (gitignored):

    • a tempyr project with a 4-node fixture graph and a structural-only index
    • set up as its own git repo, so the MCP server sees only fixtures and interview journal events stay out of this repo's journal
    • two arms: baseline (the skill at a ref, default origin/master) and candidate (working tree or a ref)
    • it checks that the tempyr on PATH includes Interview: advance phases only on answers; add full-content reads #54
  • /tempyr-eval: a skill that lives in the sandbox. It reads the scenarios, calls workflow.js via the Workflow tool, and writes results/<timestamp>/ containing:

    • summary.md: metrics against the proposal's provisional targets
    • transcripts and judge verdicts
    • blind pairs/ for the owner's 8-pair comparison, with formatting normalized and a separate KEY.md
  • workflow.js: one run is an interviewer subagent and a simulated-user subagent taking turns.

    • Interviewer: a fresh agent each turn. It reads its arm's SKILL.md and calls the real interview_* tools; session state lives in the MCP server.
    • Simulated user: sees only its persona card (hidden facts, style, patience; giving up counts as proxy abandonment).
    • Relay: the script passes messages along verbatim.
    • Commit: runs never commit.
    • Judging: a blind judge then grades each run against rubric.md and the scenario's judge.md, inspecting the session through interview_show {full}. The script aggregates the metrics deterministically.
  • Scenarios D1–D6:

    • D1: a vague hobby idea (light; "go wilder")
    • D2: a sound audit-mandate plan, the negative control for invented objections
    • D3: bait for the interviewer to answer its own questions
    • D4: an open idea with a hidden better framing (divergence)
    • D5: contradicts a fixture constraint
    • D6: overlaps a fixture feature (graph lens)

    Each scenario's brain dump, persona and judge notes sit in separate files, so the interviewer, simulated user and judge each see only their own.

Test plan

  • setup.sh builds the sandbox, validates the fixture graph (4 nodes, 2 edges) and builds the index. Works under Git Bash on Windows (ref:path args are protected from MSYS path conversion).
  • CLI smoke test in the sandbox: interview start stays in Discovery, and one answer moves to Product (Interview: advance phases only on answers; add full-content reads #54). Filter-only journal search --tag works.
  • workflow.js syntax-checked with node, and run end-to-end with mocked agent()/pipeline(), which exercises the turn loop, gave-up handling and aggregation.
  • First real baseline-vs-candidate run (cd evals/interview/.run/sandbox && claude, then /tempyr-eval). This needs a Claude Code session started in the sandbox, so it couldn't run from this session.

🤖 Generated with Claude Code

@coderabbitai

coderabbitai Bot commented Oct 11, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

  • Run on-demand review

This review includes 31 billable files and costs up to $7.75.

  • Ask an admin to make reviews automatic

Open in CodeRabbit

Reviews can continue after your included limit without a manual trigger. An admin must approve usage-based billing.

Or wait 43 minutes for your next included review.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available. Your 74 included PR review attempts over the past 7 days set your current allowance at 1 review per hour.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Essentials
  • Run ID: 8031bed0-6542-473a-b3ca-082001eb3ac1
📥 Commits

Reviewing files that changed from the base of the PR and between 486aa31 and 07e9bbf.

📒 Files selected for processing (31)
  • docs/interview-challenge-research.md
  • evals/interview/.gitattributes
  • evals/interview/README.md
  • evals/interview/rubric.md
  • evals/interview/scenarios/D1/judge.md
  • evals/interview/scenarios/D1/meta.json
  • evals/interview/scenarios/D1/persona.md
  • evals/interview/scenarios/D2/judge.md
  • evals/interview/scenarios/D2/meta.json
  • evals/interview/scenarios/D2/persona.md
  • evals/interview/scenarios/D3/judge.md
  • evals/interview/scenarios/D3/meta.json
  • evals/interview/scenarios/D3/persona.md
  • evals/interview/scenarios/D4/judge.md
  • evals/interview/scenarios/D4/meta.json
  • evals/interview/scenarios/D4/persona.md
  • evals/interview/scenarios/D5/judge.md
  • evals/interview/scenarios/D5/meta.json
  • evals/interview/scenarios/D5/persona.md
  • evals/interview/scenarios/D6/judge.md
  • evals/interview/scenarios/D6/meta.json
  • evals/interview/scenarios/D6/persona.md
  • evals/interview/setup.sh
  • evals/interview/template/.claude/skills/tempyr-eval/SKILL.md
  • evals/interview/template/.mcp.json
  • evals/interview/template/.tempyr/config.toml
  • evals/interview/template/graph/constraints/eu-data-residency-e1d2c3.md
  • evals/interview/template/graph/features/analytics-dashboard-b4c5d6.md
  • evals/interview/template/graph/features/notification-preferences-a7b8c9.md
  • evals/interview/template/graph/personas/workspace-member-f1e2d3.md
  • evals/interview/workflow.js
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@cleak
cleak force-pushed the feat/interview-skill-rewrite branch from 97b40f7 to e7682eb Compare October 11, 2026 22:05
@cleak
cleak force-pushed the feat/interview-eval-harness branch from 277e6e3 to f4785e9 Compare October 11, 2026 22:05
@cleak
cleak force-pushed the feat/interview-skill-rewrite branch from e7682eb to a029d8b Compare October 13, 2026 04:08
cleak and others added 2 commits October 12, 2026 21:08
Stage S0 of the interview-challenge proposal: measure the skill before
and after changes instead of judging by feel.

- evals/interview/setup.sh builds a throwaway sandbox tempyr project
  (its own git repo, fixture graph, structural-only index) with two skill
  arms: baseline from a git ref (default origin/master), candidate from
  the working tree or a ref.
- /tempyr-eval (a skill inside the sandbox) runs workflow.js through the
  Workflow tool: per run, a fresh interviewer subagent per turn drives
  the real tempyr MCP tools from its arm's SKILL.md, and a simulated-user
  subagent answers from a persona card with hidden facts and a patience
  budget. Messages are relayed verbatim; runs never commit.
- A blind judge per run grades against rubric.md and the scenario's
  judge notes (inspecting the session via interview_show {full}); the
  script aggregates metrics deterministically and the skill writes a
  summary, transcripts, and blind pairs for the owner's comparison.
- Six scenarios: vague hobby idea, sound audit mandate (negative
  control), self-answer bait, open idea with a hidden better framing,
  contradiction with a fixture constraint, overlap with a fixture
  feature.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- setup.sh builds the workspace outside the repo (default
  ~/.tempyr-eval/interview, --dir / $TEMPYR_EVAL_DIR): sandbox/ and
  harness/ are rebuilt, results/ is kept. Agents no longer inherit this
  repo's CLAUDE.md or skills, and scenario files sit outside the
  interviewer's working directory. The default baseline is the skill
  before the rewrite, found from history, so it stays right after merge.
- The eval skill runs one workflow per arm; workflow.js also lowers the
  turn cap (with a log line) if a run would exceed the 1000-agent limit.
- Interviewers aren't offered graph_context (it always embeds and the
  sandbox has no key), are told not to use the Skill tool, and don't see
  the scenario id. A run with no session id ends as `no_session` instead
  of restarting the interview every turn.
- Aggregation selects scenarios by `scores` keys (adds `push`), and
  recall uses each scenario's declared planted-flaw count; the judge is
  told to list every planted flaw.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@cleak
cleak force-pushed the feat/interview-eval-harness branch from f4785e9 to 644084a Compare October 13, 2026 04:11
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@cleak
cleak changed the base branch from feat/interview-skill-rewrite to master October 13, 2026 04:23
@cleak
cleak merged commit 1725952 into master Oct 13, 2026
4 of 5 checks passed
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.

1 participant