Skip to content

eval: the trajectory-eval gate is non-blocking with 3 goldens — broaden the corpus so review can safely shorten #16115

Open

Description

@mrveiss

Parent: #16108

The lever

.github/workflows/trajectory-eval.yml replays golden trajectories and checks deterministic
tool-sequence drift
alongside quality drift — the exact gate that lets review get shorter
without losing quality. Its own header states it is non-blocking and is to be promoted "once the
golden corpus is broad enough" by dropping continue-on-error and passing --fail-on-regression.

autobot-backend/eval/golden/ holds 3 trajectories: code_fix_null_guard.json,
qa_deploy_role.json, triage_502_websocket.json.

So the gate is written, wired to CI, and inert for want of a corpus.

Why this is the throughput item

Throughput bought by shortening review is only safe if something else holds the quality floor.
This is that something, and it is 3 files wide. Broadening the corpus is what makes faster review
defensible — it is the opposite of the reference's own model, which raised throughput by removing
review entirely.

Acceptance criteria

  • Golden corpus covers the recurring task classes actually seen in the backlog, not 3 samples
  • Per-task-class pass/regress reporting is meaningful at that breadth
  • A documented promotion criterion for dropping continue-on-error
  • Promotion to a blocking gate proposed as a follow-up with the measured false-positive rate

Relates to #10546, #11062.

Activity

  1. mrveiss commented on Sep 9, 2026

    @mrveiss
    OwnerAuthor

    Took this as "answer how many goldens and chosen how, before make it blocking". The measurements say the corpus is not the first problem, and broadening it first would make things worse rather than better.

    The gate cannot fail, at any corpus size

    CI runs the harness with no injected runner:

    .github/workflows/trajectory-eval.yml     python -m eval.run --json trajectory-eval-report.json
    eval/run.py:55                            report = await replayer.run(goldens, candidate or baseline_candidate)
    eval/candidates.py:33                     """Echo the golden's own recorded outcome (self-consistency check)."""
                                              tool_sequence=list(golden.expected_tools)
    

    So _check_tools(golden.expected_tools, actual) compares the golden against itself. The response text and final status are echoed from the same file. There is no candidate to drift from the baseline, so no input can turn this red.

    The real path exists but is a seam, not an implementation:

    eval/candidates.py:53   async def live_replay_candidate(...)  # pragma: no cover - wiring seam
                            raise NotImplementedError(...)
    

    This is the finding that reorders the issue. Adding goldens multiplies a check that always passes; promoting it to blocking adds a gate that cannot fire while looking like a quality floor. A green that asserts nothing is worse than an absent check, because the absent one does not get cited as evidence.

    None of that is a criticism of the harness — baseline_candidate documents itself honestly as a self-consistency check, and the seam is labelled. The defect is that CI runs the self-check and the workflow header describes the result as drift detection.

    It also almost never runs

    Trigger paths are autobot-backend/eval/**, rlm/**, llc/**/replay*, and the workflow file.

    Measurement Result
    Last 60 merged PRs that would have triggered it 0
    Entire run history 12 runs, all 2026-09-06, all on issue-15812-budget-scope + one push

    So its trigger population is the harness itself, not the behaviour the harness exists to protect. Nothing that changes agent behaviour under agents/ (97 files) or the wider llc/ tree (379 files) brings the eval with it. Promoted today, it would gate 0% of merges — and the corpus question would still be unanswered, because breadth of goldens does not widen when a gate runs.

    What the corpus question actually needs

    The three goldens cover code_fix, knowledge_qa, troubleshooting. task_class is free-form — the runner only carries it into reporting — so growth needs no schema change.

    Measuring the backlog by the repo's own work-type vocabulary, across 400 open issues:

    bug 65 · tech-debt 29 · ci 26 · docs 18 · test 17 · feat 17
    security 16 · fix 16 · refactor 12 · chore 12 · guard 14 · perf 5
    

    Stated as a limit rather than buried: 129 of those issues carry no conventional prefix, so this classifies about two-thirds of the backlog and the tail is unmeasured. A corpus proportioned on this alone would be proportioned on the part that was easy to count.

    On that partial view, bug+fix (81) maps to the one class already covered, and the largest uncovered neighbours are test authoring, docs, refactor, security review and CI configuration.

    Suggested ordering, and the promotion criterion

    1. Implement a real candidate (or wire live_replay_candidate). Until then every other criterion here is unfalsifiable.
    2. Widen the trigger to the behaviour the gate protects, and state the intended population — a gate whose reach is its own source tree measures itself.
    3. Then broaden the corpus, proportioned to a backlog measure that accounts for the unprefixed third.
    4. Then promote, on a criterion of the form: N consecutive runs against real candidates on real PRs, with a measured false-positive rate below X — which cannot be evaluated at all until (1), and is what AC 4 is already asking for.

    Happy to file 1–3 as children of this issue and take the first. Flagging rather than proceeding, because this changes the issue's premise and that is a call for whoever owns #16108's shape rather than mine to make unilaterally.

  2. modified the milestones: Backlog, v0.16.0 on Sep 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions