Skip to content

matthias/eval-gates-trail-show - #2988

Draft
matthiaswenz wants to merge 3 commits into
mainfrom
matthias/eval-gates-trail-show
Draft

matthiaswenz wants to merge 3 commits into
mainfrom
matthias/eval-gates-trail-show

Conversation

@matthiaswenz

@matthiaswenz matthiaswenz commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

This draft pull request was opened by Entire to back a trail. Feel free to edit the title or body, but keep the hidden marker below: Entire uses it to close this pull request when the trail closes.


Note

Medium Risk
Changes the merge command's user-visible behavior (stderr warnings) and gate messaging on a sensitive workflow, though blocking rules are unchanged.

Overview
Adds first-class support for agent eval merge gates in the CLI mergeability snapshot.

entire trail show (text) now splits eval gates under an Evals: section with agent names, readings vs thresholds (percent/size/yes-no), and labels for passed, blocks merge, needs attention, or not enforced. A Needs attention: list summarizes non-blocking failed/errored gates. trail show --json still passes each gate's value through unchanged; new API types document the eval shape (agent_name, threshold, configuration_issue, etc.).

entire trail merge reuses the same readiness view, names eval blockers by agent rationale, and warns on stderr (including with --json) right before a successful merge when it proceeds past advisory failures or skipped/not-enforced eval gates—without changing what counts as blocking. Agent-help text for project trail show is updated to describe eval gates.

Coverage is mostly new unit/integration tests around rendering, JSON passthrough, merge warnings, and blocking eval behavior.

Reviewed by Cursor Bugbot for commit cc99df3. Configure here.

entire-api now reports gates on an agent's eval (gate_type "eval"). The
gate key is the agent id, so the old one-row-per-gate view printed a
ULID with no reading or threshold.

trail show now groups eval gates under "Evals:", named by the agent,
with the reading against the threshold ("72%  must be ≤ 40%") and
whether it passed, blocks the merge, or needs attention. A gate skipped
for a configuration issue prints "not enforced: <reason>". Non-blocking
gates that failed or errored, of any type, are listed under "Needs
attention:". --json already passes each gate's value through untouched.

trail merge keeps what blocks unchanged. Before it merges, it prints the
gates that need attention and the eval gates that are not enforced as
warnings on stderr, so --json keeps them too. A blocking eval gate is
listed by its rationale, which names the agent, instead of its id.

Part of https://entire.com/gh/entirehq/-/trails/19610 (design:
https://entire.com/et/entirehq/-/trails/620).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entire-Checkpoint: 01M67M72S4GBC0ETT6VMR2K4WQ
Copilot AI balanced review requested due to automatic review settings October 31, 2026 00:16

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error: Your billing is not configured or you have Copilot licenses from multiple standalone organizations or enterprises. To use premium requests, select a billing entity via the GitHub site, under Settings > Copilot > Features.

matthiaswenz and others added 2 commits October 31, 2026 08:57
trail show listed a disabled eval gate with its last result, so a gate
turned off while its agent was paused still read "not enforced", and
trail merge warned about it. A result for an earlier commit printed its
old verdict, also as a merge blocker. Disabled eval gates are now left
out, an outdated one says it isn't judged on this commit yet, and a gate
without an agent name is named "agent <id>".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
entire-api now stores the answer a yes/no eval gate requires as its
threshold ("yes" or "no"), and the agent's polarity no longer decides it.
trail show printed the requirement from polarity; it now prints the
threshold, and nothing when there is none.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants