mirror of https://github.com/garrytan/gstack.git
fix(test-infra): judge uses resolveClaudeBinary; eval:watch reads the real partials dir
judgePtyState spawned the bare string 'claude' three definitions below the resolveClaudeBinary() helper this same file exports — broken under hermetic PATHs where every other launch in the file resolves correctly. eval:watch read _partial-e2e.json from the legacy global ~/.gstack-dev/evals/ while EvalCollector writes it into the per-project eval dir (or GSTACK_EVAL_DIR) — so the dashboard's completed-tests panel was empty whenever slug detection succeeded, i.e. the normal case. The heartbeat and per-run progress logs stay global by design (session-runner.ts: 'heartbeat stays global'). The three eval-CLI docstrings stop claiming the legacy dir is the primary location. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
dcc6b9d628
commit
7ef96ed0bd
|
|
@ -1,6 +1,7 @@
|
||||||
#!/usr/bin/env bun
|
#!/usr/bin/env bun
|
||||||
/**
|
/**
|
||||||
* Compare two eval runs from ~/.gstack-dev/evals/
|
* Compare two eval runs from the project eval dir (~/.gstack/projects/<slug>/evals;
|
||||||
|
* legacy fallback ~/.gstack-dev/evals)
|
||||||
*
|
*
|
||||||
* Usage:
|
* Usage:
|
||||||
* bun run eval:compare # compare two most recent of same tier
|
* bun run eval:compare # compare two most recent of same tier
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
#!/usr/bin/env bun
|
#!/usr/bin/env bun
|
||||||
/**
|
/**
|
||||||
* List eval runs from ~/.gstack-dev/evals/
|
* List eval runs from the project eval dir (~/.gstack/projects/<slug>/evals;
|
||||||
|
* legacy fallback ~/.gstack-dev/evals)
|
||||||
*
|
*
|
||||||
* Usage: bun run eval:list [--branch <name>] [--tier e2e|llm-judge] [--limit N]
|
* Usage: bun run eval:list [--branch <name>] [--tier e2e|llm-judge] [--limit N]
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
#!/usr/bin/env bun
|
#!/usr/bin/env bun
|
||||||
/**
|
/**
|
||||||
* Aggregate summary of all eval runs from ~/.gstack-dev/evals/
|
* Aggregate summary of eval runs from the project eval dir
|
||||||
|
* (~/.gstack/projects/<slug>/evals; legacy fallback ~/.gstack-dev/evals)
|
||||||
*
|
*
|
||||||
* Usage: bun run eval:summary
|
* Usage: bun run eval:summary
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -11,10 +11,19 @@
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as os from 'os';
|
import * as os from 'os';
|
||||||
|
import { getProjectEvalDir } from '../test/helpers/eval-store';
|
||||||
|
|
||||||
const GSTACK_DEV_DIR = path.join(os.homedir(), '.gstack-dev');
|
const GSTACK_DEV_DIR = path.join(os.homedir(), '.gstack-dev');
|
||||||
|
// Heartbeat + per-run progress logs are GLOBAL by design — session-runner.ts
|
||||||
|
// writes ~/.gstack-dev/e2e-live.json regardless of project ("heartbeat stays
|
||||||
|
// global"). The PARTIAL file is per-project: EvalCollector writes it into
|
||||||
|
// getProjectEvalDir() (or GSTACK_EVAL_DIR), so watching the legacy global
|
||||||
|
// path missed it whenever slug detection succeeded — i.e. the normal case.
|
||||||
const HEARTBEAT_PATH = path.join(GSTACK_DEV_DIR, 'e2e-live.json');
|
const HEARTBEAT_PATH = path.join(GSTACK_DEV_DIR, 'e2e-live.json');
|
||||||
const PARTIAL_PATH = path.join(GSTACK_DEV_DIR, 'evals', '_partial-e2e.json');
|
const PARTIAL_PATH = path.join(
|
||||||
|
process.env.GSTACK_EVAL_DIR || getProjectEvalDir(),
|
||||||
|
'_partial-e2e.json',
|
||||||
|
);
|
||||||
const STALE_THRESHOLD_SEC = 600; // 10 minutes
|
const STALE_THRESHOLD_SEC = 600; // 10 minutes
|
||||||
|
|
||||||
export interface HeartbeatData {
|
export interface HeartbeatData {
|
||||||
|
|
|
||||||
|
|
@ -454,8 +454,11 @@ ${tail}
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// Use the same binary resolution as every PTY launch in this file —
|
||||||
|
// judgePtyState previously hardcoded bare 'claude' three definitions
|
||||||
|
// below resolveClaudeBinary(), breaking under hermetic PATHs.
|
||||||
const result = nodeSpawnSync(
|
const result = nodeSpawnSync(
|
||||||
'claude',
|
resolveClaudeBinary() ?? 'claude',
|
||||||
['-p', '--model', 'claude-haiku-4-5', '--max-turns', '1'],
|
['-p', '--model', 'claude-haiku-4-5', '--max-turns', '1'],
|
||||||
{
|
{
|
||||||
input: prompt,
|
input: prompt,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue