Skip to content

Commit 64ed604

Browse files
Sinter Testclaude
andcommitted
feat(gauntlet): add bounded Hydra washout retry
When Hydra render is washed out (near-white), retry once with an anti-washout prompt that keeps .brightness() in validator-safe range (0.75-0.85) while avoiding .colorama() combination. The retry is bounded to 1 attempt and only fires for Hydra domain. Results: 5/5 Hydra PASS (was 0/2 before), including 1 successful washout recovery via retry. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 33bdf71 commit 64ed604

1 file changed

Lines changed: 20 additions & 3 deletions

File tree

scripts/domains/gauntlet.mjs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -547,15 +547,32 @@ async function writeCodeArtifact(domain, code, outDir, runId) {
547547
async function runDomain(domain, options, runId) {
548548
const startedAt = new Date().toISOString();
549549
const prompt = promptFor(domain, runId);
550-
const generated = await generateForDomain(domain, prompt, options.timeoutMs);
550+
let generated = await generateForDomain(domain, prompt, options.timeoutMs);
551551
if (generated.ok) {
552552
generated.artifact = await writeCodeArtifact(domain, generated.code, options.outDir, runId);
553553
}
554554

555-
const validation = generated.ok
555+
let validation = generated.ok
556556
? validateForDomain(domain, generated.code)
557557
: { ok: false, cleanedCode: '', cleanedBytes: 0, errors: ['generation failed'], validator: `CodeValidator(${domain.validationDomain})` };
558-
const render = await renderOrReceipt(domain, validation, options.outDir, runId, options.renderWaitMs);
558+
let render = await renderOrReceipt(domain, validation, options.outDir, runId, options.renderWaitMs);
559+
560+
// Bounded washout retry: if Hydra render is washed out (near-white), retry once
561+
// with an anti-washout prompt. Generation-side brightness clamp is impossible,
562+
// but an explicit anti-brightness prompt sometimes avoids the issue.
563+
if (domain.id === 'hydra' && render.ok === false && render.errors?.some((e) => /washed out/i.test(e))) {
564+
console.log(`[gauntlet] ${domain.id}: washout detected, retrying with anti-washout prompt`);
565+
const antiWashoutPrompt = prompt + '\n\nIMPORTANT: Avoid additive washout. Keep .brightness() at 0.75-0.85 (no higher). Do NOT combine .brightness() with .colorama() — together they push the scene to pure white. Use .contrast(1.2-1.5) and .saturate() for visual richness instead of stacking brightening effects.';
566+
generated = await generateForDomain(domain, antiWashoutPrompt, options.timeoutMs);
567+
if (generated.ok) {
568+
generated.artifact = await writeCodeArtifact(domain, generated.code, options.outDir, runId);
569+
}
570+
validation = generated.ok
571+
? validateForDomain(domain, generated.code)
572+
: { ok: false, cleanedCode: '', cleanedBytes: 0, errors: ['generation failed'], validator: `CodeValidator(${domain.validationDomain})` };
573+
render = await renderOrReceipt(domain, validation, options.outDir, runId, options.renderWaitMs);
574+
}
575+
559576
const finishedAt = new Date().toISOString();
560577
const receipt = buildDomainReceipt({ domain: domain.id, prompt, generated: redactCode(generated), validation: redactCode(validation), render, startedAt, finishedAt });
561578
const receiptPath = path.join(options.outDir, `${runId}-${domain.id}.receipt.json`);

0 commit comments

Comments
 (0)