mirror of
https://github.com/garrytan/gstack.git
synced 2026-11-05 16:34:00 +01:00
test: cut the last two behavior-guessing LLM judges; check review-bot history facts for free (GST-1403) (#4014)
* test: cut the qa anti-refusal and voice-tone judges; check review-bot history facts for free (GST-1403) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * test: count assertions follow the deleted judge file (GST-1403) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> --------- Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
This commit is contained in:
1 parent
6bdafb2cf5
commit
55637db835
136 files changed
+189
-5267
No files matched your search
@@ -1 +1 @@
|
||||
{"blob":"847a2225d7296280571377ea15ede19f24ac3a62","since":6,"nonBehavioral":"GST-1371 removes the 21 skill-prose clarity judges: llm-judge.ts drops judge() and two prompt builders no remaining case calls, paid-report.ts rejects manual-review claims that only the removed cookie judge made, and eval-budgets.ts shrinks the skill-llm-eval file wall to the three kept cases, whose own JUDGE_MS timeouts are unchanged; no kept case's prompt, threshold, samples or verdict can change"}
|
||||
{"blob":"8cb433b0618cc218dacf21cc644de7947442d045","since":6,"nonBehavioral":"GST-1403 removes the last three standalone LLM judges (qa anti-refusal, voice directive tone, cross-skill greptile consistency): llm-judge.ts drops their three schemas and three prompt builders, which no remaining case calls, and eval-budgets.ts drops the deleted test/skill-llm-eval.test.ts file wall; no kept case's prompt, threshold, samples, budget or verdict can change"}
|
||||
@@ -1 +1 @@
|
||||
{"blob":"b804a4585e45b0e5c84bd90b1ede0191b66283cc","since":6,"nonBehavioral":"GST-1371 removes the 21 skill-prose clarity judges: llm-judge.ts drops judge() and two prompt builders no remaining case calls, paid-report.ts rejects manual-review claims that only the removed cookie judge made, and eval-budgets.ts shrinks the skill-llm-eval file wall to the three kept cases, whose own JUDGE_MS timeouts are unchanged; no kept case's prompt, threshold, samples or verdict can change"}
|
||||
{"blob":"85b9cb59b8d7cce1e75804e92bddae188a9cdf8a","since":6,"nonBehavioral":"GST-1403 removes the last three standalone LLM judges (qa anti-refusal, voice directive tone, cross-skill greptile consistency): llm-judge.ts drops their three schemas and three prompt builders, which no remaining case calls, and eval-budgets.ts drops the deleted test/skill-llm-eval.test.ts file wall; no kept case's prompt, threshold, samples, budget or verdict can change"}
|
||||
@@ -4,31 +4,8 @@
|
||||
* Each config builds prompts through the same builder the eval sends; "old" is
|
||||
* today's request and "new" adds only the JSON schema (comparison 1).
|
||||
*/
|
||||
import {
|
||||
ARM_JUDGE_MODEL, ARM_JUDGE_SCHEMA, buildArmJudgePrompt, parseArmJudgeResponse,
|
||||
buildQaAntiRefusalJudgePrompt, buildCrossSkillConsistencyJudgePrompt, buildVoiceDirectiveJudgePrompt,
|
||||
QA_ANTI_REFUSAL_JUDGE_SCHEMA, CROSS_SKILL_CONSISTENCY_JUDGE_SCHEMA,
|
||||
VOICE_DIRECTIVE_JUDGE_SCHEMA, VOICE_DIRECTIVE_DIMENSIONS,
|
||||
judgePanelMedian, judgePanelMajority,
|
||||
} from '../test/helpers/llm-judge';
|
||||
import { CLAUDE_JUDGE_EVAL_MODEL } from '../lib/eval-model';
|
||||
import type { CalibrationConfig, Verdict } from './judge-calibration';
|
||||
|
||||
type Sample = Record<string, unknown>;
|
||||
|
||||
/** What production rejects: judgePanelMedian needs finite numbers, judgePanelMajority needs booleans. */
|
||||
function requireFields(value: unknown, numbers: readonly string[], booleans: readonly string[] = []): void {
|
||||
const sample = (value ?? {}) as Sample;
|
||||
for (const key of numbers) {
|
||||
if (typeof sample[key] !== 'number' || !Number.isFinite(sample[key])) throw new Error(`non-numeric ${key}: ${JSON.stringify(sample[key])}`);
|
||||
}
|
||||
for (const key of booleans) {
|
||||
if (typeof sample[key] !== 'boolean') throw new Error(`non-boolean ${key}: ${JSON.stringify(sample[key])}`);
|
||||
}
|
||||
}
|
||||
|
||||
const meets = (median: Record<string, number>, floors: Record<string, number>): Verdict =>
|
||||
Object.entries(floors).every(([key, floor]) => median[key]! >= floor) ? 'pass' : 'fail';
|
||||
import { ARM_JUDGE_MODEL, ARM_JUDGE_SCHEMA, buildArmJudgePrompt, parseArmJudgeResponse } from '../test/helpers/llm-judge';
|
||||
import type { CalibrationConfig } from './judge-calibration';
|
||||
|
||||
export const CALIBRATION_CONFIGS: CalibrationConfig[] = [
|
||||
{
|
||||
@@ -43,31 +20,4 @@ export const CALIBRATION_CONFIGS: CalibrationConfig[] = [
|
||||
},
|
||||
estimatedOutputTokens: 300,
|
||||
},
|
||||
{
|
||||
id: 'qa-anti-refusal', priority: 4, cases: ['qa/SKILL.md anti-refusal'], model: CLAUDE_JUDGE_EVAL_MODEL,
|
||||
build: inputs => buildQaAntiRefusalJudgePrompt(inputs.diffAwareSection!, inputs.rulesSection!),
|
||||
oldOptions: {}, newOptions: { jsonSchema: QA_ANTI_REFUSAL_JUDGE_SCHEMA },
|
||||
validate: value => requireFields(value, ['confidence'], ['would_browse']),
|
||||
verdict: samples => judgePanelMajority<string>(samples as Sample[], 'would_browse')
|
||||
&& judgePanelMedian<string>(samples as Sample[], ['confidence']).confidence >= 4 ? 'pass' : 'fail',
|
||||
estimatedOutputTokens: 1200,
|
||||
},
|
||||
{
|
||||
id: 'cross-skill', priority: 5, cases: ['cross-skill greptile consistency'], model: CLAUDE_JUDGE_EVAL_MODEL,
|
||||
build: inputs => buildCrossSkillConsistencyJudgePrompt(inputs.collected!),
|
||||
oldOptions: {}, newOptions: { jsonSchema: CROSS_SKILL_CONSISTENCY_JUDGE_SCHEMA },
|
||||
validate: value => requireFields(value, ['score'], ['consistent']),
|
||||
verdict: samples => judgePanelMajority<string>(samples as Sample[], 'consistent')
|
||||
&& judgePanelMedian<string>(samples as Sample[], ['score']).score >= 4 ? 'pass' : 'fail',
|
||||
estimatedOutputTokens: 1200,
|
||||
},
|
||||
{
|
||||
id: 'voice', priority: 6, cases: ['voice directive tone'], model: CLAUDE_JUDGE_EVAL_MODEL,
|
||||
build: inputs => buildVoiceDirectiveJudgePrompt(inputs.voiceSection!),
|
||||
oldOptions: {}, newOptions: { jsonSchema: VOICE_DIRECTIVE_JUDGE_SCHEMA },
|
||||
validate: value => requireFields(value, VOICE_DIRECTIVE_DIMENSIONS),
|
||||
verdict: samples => meets(judgePanelMedian<string>(samples as Sample[], VOICE_DIRECTIVE_DIMENSIONS),
|
||||
Object.fromEntries(VOICE_DIRECTIVE_DIMENSIONS.map(key => [key, 4]))),
|
||||
estimatedOutputTokens: 1200,
|
||||
},
|
||||
];
|
||||
@@ -104,7 +104,6 @@
|
||||
"test/skill-e2e-third-party-actions.test.ts": 71961,
|
||||
"test/skill-e2e-triage.test.ts": 64816,
|
||||
"test/skill-e2e-workflow.test.ts": 265175,
|
||||
"test/skill-llm-eval.test.ts": 354000,
|
||||
"test/skill-routing-e2e.test.ts": 1000
|
||||
},
|
||||
"periodic": {
|
||||
@@ -215,7 +214,6 @@
|
||||
"test/skill-e2e-third-party-actions.test.ts": 1000,
|
||||
"test/skill-e2e-triage.test.ts": 1000,
|
||||
"test/skill-e2e-workflow.test.ts": 121594,
|
||||
"test/skill-llm-eval.test.ts": 339704,
|
||||
"test/skill-routing-e2e.test.ts": 81360,
|
||||
"test/skill-e2e-planning-wave.test.ts#planning-wave-planted-facts": 74000,
|
||||
"test/skill-e2e-planning-wave.test.ts#planning-wave-schema": 52000,
|
||||
|
||||
Reference in new issue
Block a user