feat(evalforge-yaml-gate): scenario lint, confirm-on-fail, and quarantine list - #935
Open
danshw wants to merge 11 commits into
Open
feat(evalforge-yaml-gate): scenario lint, confirm-on-fail, and quarantine list#935danshw wants to merge 11 commits into
danshw wants to merge 11 commits into
Conversation
danshw
marked this pull request as draft
August 9, 2026 10:39
danshw
marked this pull request as ready for review
August 9, 2026 10:39
This was referenced Aug 13, 2026
danshw
force-pushed
the
feat/gate-decision-layer
branch
from
August 13, 2026 06:59
d34a109 to
492b66c
Compare
Contributor
✅ EvalForge YAML Gate: No Gated ChangesNothing under |
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…d PRs Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…onfirmed failures Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…, lint-first ordering, composed PR comment Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> - Load quarantine.yaml from the base checkout, not the PR head, so a PR can no longer quarantine its own covering scenario and skip it in the same run. - Run scenario lint (and everything it depends on) before ensureMcpVersion, so lint failures short-circuit before any EvalForge mutation; MCP version creation still runs before the remote scenario listing/sync. - Add composeSections() to join PR comment sections without losing earlier ones (quarantine notice, comparison table, confirm-on-fail summary) to a single upsert comment. - Split ConfirmResult's retriesSkipped boolean into a skipReason so the confirm-on-fail comment text distinguishes a broad-failure cap from a retry-infrastructure error. - Use the shared render() helper in formatConfirmOnFail instead of hand assembling the comment marker and heading. - Raise the gate workflow's timeout-minutes from 60 to 120: confirm-on-fail's worst case is ~3 sequential 30-minute polls (~90 minutes), which left little headroom under the previous limit.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Quarantine (a flaky-scenario suppression list separate from confirm-on-fail's retry-and-majority-vote) is being split out for review on its own — the gate still ships scenario lint and confirm-on-fail here. Removes quarantine.ts, quarantine.yaml, quarantine.test.ts, and quarantine's wiring in gate.ts/ comment.ts/scenariosToRun; reverts scenariosToRun to its plain Map return. 104 vitest tests, tsc --noEmit clean, dist rebuilt.
danshw
force-pushed
the
feat/gate-decision-layer
branch
from
August 13, 2026 09:39
5695910 to
155d230
Compare
This was referenced Aug 13, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds a decision layer to the wix-manage eval gate so a single noisy eval run no longer decides a PR's fate, scenario-authoring standards are enforced instead of documented-only, and known-flaky scenarios stop blocking unrelated PRs.
Scenario lint
Every scenario a PR adds or modifies is linted before any EvalForge call, and violations fail the check with a per-rule table comment:
three-assertionscoverage-assertionparams.articleUrlon the skill doctwo-llm-judgesllm_judgeassertions (outcome + tool-call path)min-score-floorminScore≥ 6judge-fail-criteriatask-shaped-prompttriggerPromptis a task with concrete values, not "how do I…"max-tokensmaxTokenssetScenarios untouched by the PR are never linted, so existing content is ratcheted up only when edited.
Confirm-on-fail
Eval runs are not deterministic, so the gate no longer blocks on a single failed attempt. Scenarios that fail the comparison (LLM-judge or token budget) are rerun — up to two targeted retries of just the failing scenario IDs — and the gate blocks only when a majority of attempts fail. The PR comment separates confirmed failures from recovered flaky runs. Guardrails:
Quarantine list
yaml/wix-manage-evals/quarantine.yamllists flaky scenarios awaiting rewrite. A quarantined scenario is skipped when a PR pulls it in only via doc coverage, but still runs when the PR edits the scenario's own YAML. Entries are loaded from the base branch, so a PR cannot quarantine scenarios for its own run — entries take effect only after their own reviewed PR merges.Also
docs/eval-scenarios.md, confirm-on-fail + quarantine indocs/skill-evaluation.md, CONTRIBUTING checklist pointerTesting
tsc --noEmitclean,distrebuilt🤖 Generated with Claude Code