mirror of
https://github.com/garrytan/gstack.git
synced 2026-09-17 18:32:19 +02:00
feat(evals): with-skill vs without-skill arm benchmark — measures whether gstack's behavioral layer earns its tokens
Ponytail's honest-benchmark method pointed at gstack itself: 3 build-shaped
tasks (native-platform over-build trap, CRUD endpoint, bug fix with planted
decoys) x 2 arms, real claude -p sessions, scored on the git diff left
behind. A research instrument, not a release gate — no assertion compares
arm scores.
Arms use the PROVEN project-scope pattern: the with-arm installs a
build-discipline skill (extracted reuse-ladder + bounded-closer content, not
whole-file copies) into the fixture's .claude/skills/ with a CLAUDE.md
routing line and an explicit invocation; a live spike confirmed claude -p
discovers and invokes project-scope skills via the Skill tool (3 turns,
exact-output probe). Fixtures are git init + local bare origin; diff capture
is three lines of git, no worktree machinery.
Failure taxonomy: zero-diff arms are VALID scored cells (deterministic
0/none, no API call), harvest failures record harvest:null, judge_error
cells are excluded from aggregates but named in the report — nothing drops
silently. armJudge: fixed sonnet judge, 0-3 unrequested-structure rubric,
must name the construct or say none, bounded retry-on-malformed; callJudge
gains optional temperature/max_tokens (defaults unchanged). recordE2E now
populates tokens_used for every E2E. Eval schema v2: harvest gains
{insertions, deletions, net}, tolerant reads keep v1 runs comparable.
Registered periodic in E2E_TIERS + touchfiles (with the auq-repetition-cut
A/B); periodic detach timeout raised to the new shard-census floor. Free
selftest (8 tests, zero API) pins fixtures, extraction, arm asymmetry, diff
capture, judge plumbing, and the retry bound.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
781f46d025
commit
4c20eca33b
@@ -13,7 +13,11 @@ import * as path from 'path';
|
||||
import * as os from 'os';
|
||||
import { spawnSync } from 'child_process';
|
||||
|
||||
const SCHEMA_VERSION = 1;
|
||||
// v2: EvalTestEntry.harvest gains optional {insertions, deletions, net} and
|
||||
// may be explicitly null (arm-benchmark harvest-failure taxonomy). Readers
|
||||
// stay tolerant of v1 runs: no reader requires the new fields, and
|
||||
// eval-compare only warns on version mismatch.
|
||||
const SCHEMA_VERSION = 2;
|
||||
const LEGACY_EVAL_DIR = path.join(os.homedir(), '.gstack-dev', 'evals');
|
||||
|
||||
/**
|
||||
@@ -91,12 +95,20 @@ export interface EvalTestEntry {
|
||||
|
||||
error?: string;
|
||||
|
||||
// Worktree harvest data
|
||||
// Diff harvest data. Two writers today:
|
||||
// - WorktreeManager harvests set {filesChanged, patchPath, isDuplicate}.
|
||||
// - Arm-benchmark cells (schema v2) set {filesChanged, insertions,
|
||||
// deletions, net} from `git add -A && git diff --cached --stat`, and
|
||||
// record an explicit `null` when harvest itself failed (failure
|
||||
// taxonomy: a failed harvest is never silently dropped).
|
||||
harvest?: {
|
||||
filesChanged: number;
|
||||
patchPath: string;
|
||||
isDuplicate: boolean;
|
||||
};
|
||||
patchPath?: string;
|
||||
isDuplicate?: boolean;
|
||||
insertions?: number;
|
||||
deletions?: number;
|
||||
net?: number;
|
||||
} | null;
|
||||
}
|
||||
|
||||
export interface EvalResult {
|
||||
|
||||
Reference in New Issue
Block a user