Skip to content

[skill] evaluation: align nel-next TB2.1/SWE-bench with golden toolchain - #2063

Open
cjluo-nv wants to merge 3 commits into
mainfrom
chenjiel/eval-nel-next-tb21-toolchain
Open

[skill] evaluation: align nel-next TB2.1/SWE-bench with golden toolchain#2063
cjluo-nv wants to merge 3 commits into
mainfrom
chenjiel/eval-nel-next-tb21-toolchain

Conversation

@cjluo-nv

@cjluo-nv cjluo-nv commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

What does this PR do?

Type of change: Documentation / tooling (agent skill)

Terminal-Bench 2.1 configs generated from the evaluation skill had drifted from the
canonical eval-factory config (configs/benchmarks/terminal-bench-2.1/bench.yaml). The
scoring contract already matched golden exactly — playbook, repeats: 8,
timeout_strategy: max, run_timeout: 7200, llm_kwargs.timeout: 3600, concurrency. What
had drifted was the toolchain and a few proxy-level defaults.

The drift was in the skill, not in individual configs: a config generated fresh from the
skill reproduced every stale value, so patching configs alone would not have held.

  • nel-next.sh installs from the public upstream repo
    (github.com/NVIDIA-NeMo/Evaluator, default branch → 0.4.0) instead of PyPI. PyPI
    nemo-evaluator tops out at 0.3.0 and cannot reach the 0.4.x toolchain golden runs on.
    NEL_NEXT_SPEC becomes the PyPI escape hatch and now takes precedence when explicitly set;
    NEL_NEXT_ORIGIN stays overridable from .env so internal mirrors stay out of this repo.
  • eval_image: document the golden pin 0.5.0.1-harbor (single source of truth:
    configs/shared/nel_next_containers.yaml) rather than 0.3.1.1-harbor as a floor.
  • proxy.request_timeout 1800 → 3600 — must be >= the solver's llm_kwargs.timeout,
    else the proxy truncates long agent turns the harness is still awaiting.
  • drop_params: add max_input_tokens_per_task, no_rebuild — sent by the 0.5.x harbor
    eval image; vLLM returns 400 unless stripped.
  • exclude_patterns: add model_traffic.jsonl so captured request bodies stay in the run
    dir and never reach MLflow.
  • http_pairs_dump interceptor (last in chain) for HTTP diagnostics.
  • Sharding documented: max_concurrent/sandbox.concurrency are per shard, so
    shards: N multiplies both serving capacity and live sandboxes (N x concurrency).
  • .gitignore: broaden .env / .env-* to .env* so secret backups such as
    .env.bak-tb21 cannot be staged.

This does not move the benchmark. The TB2.1 task set is pinned by a vendored registry
override that has not changed since 2026-06-03, and both 0.3.1.1-harbor and
0.5.0.1-harbor score 89 samples — so the image bump is a toolchain fix and scores stay
comparable across it.

Usage

set -a && source .env && set +a
.agents/scripts/nel-next.sh --version        # 0.4.0 (public upstream build)
.agents/scripts/nel-next.sh eval run <tb21-config>.yaml --dry-run

Testing

  • nel-next.sh --version0.4.0, built from Evaluator.git@9dcca2ae (matches golden's
    toolchain; golden manifest.yaml evidence SHAs resolve in the public repo).
  • Both TB2.1 run configs pass eval run --dry-run on that CLI with no schema errors — these
    schemas are extra="forbid", so http_pairs_dump and the new drop_params would hard-fail
    if unsupported.
  • 0.5.0.1-harbor confirmed in the generated nel_eval.sbatch for both.
  • pre-commit run --files <changed> — all hooks pass, no file modifications.
  • Golden cross-checked against dl/JoC/competitive_evaluation/nvidia-eval-factory-benchmarking
    @ main and a reference oci-hsg run (Qwen3.6-35B-A3B TB2.1, pass@1 0.4438 over 89x8).

Not yet run: a live 2-problem canary on the new toolchain. --dry-run does not exercise
enroot credentials for the new image, the harbor agent handshake, or request-shape acceptance.

Before your PR is "Ready for review"

  • Is this change backward compatible?: ✅ — NEL_NEXT_SPEC restores the previous PyPI install.
  • If you copied code from any other sources or added a new PIP dependency, did you follow guidance in CONTRIBUTING.md: N/A
  • Did you write any new necessary tests?: N/A — agent-skill docs/config; validated via --dry-run + pre-commit.
  • Did you update Changelog?: N/A — no library API change.
  • Did you get Claude approval on this PR?: ❌ — pending.

Additional Information

Personal run configs under .agents/skills/evaluation/runs/ are deliberately not included:
they carry internal cluster hostnames, lustre paths, account names and an AWS account id, which
do not belong in this public repo.

Summary by CodeRabbit

  • Documentation

    • Updated evaluation setup guidance with current Harbor image references, canonical benchmark configurations, timeout requirements, request filtering, diagnostics, and MLflow exclusions.
    • Added guidance for sharding, capacity planning, concurrency, replay behavior, and deployment verification across supported benchmarks.
  • Configuration

    • Evaluation tooling now defaults to an upstream Git-based nemo-evaluator installation with optional version pinning.
    • Environment files with any .env-prefixed name are now ignored.

Terminal-Bench 2.1 configs generated from this skill drifted from the
canonical eval-factory config (configs/benchmarks/terminal-bench-2.1/
bench.yaml). The scoring contract (playbook, repeats=8, timeout_strategy,
run_timeout, concurrency) already matched; the toolchain and several
proxy-level defaults did not.

- nel-next.sh: install from the public upstream repo
  (github.com/NVIDIA-NeMo/Evaluator, default branch -> 0.4.0) instead of
  PyPI. PyPI nemo-evaluator tops out at 0.3.0 and cannot reach the 0.4.x
  toolchain golden runs on. NEL_NEXT_SPEC becomes the PyPI escape hatch and
  now takes precedence when explicitly set; NEL_NEXT_ORIGIN stays
  overridable from .env so internal mirrors stay out of this repo.
- eval_image: document the golden pin 0.5.0.1-harbor (single source of
  truth: configs/shared/nel_next_containers.yaml) rather than 0.3.1.1-harbor
  as a floor. The TB2.1 task set is unchanged across those versions -- the
  vendored registry override has not moved since 2026-06-03 and both score
  89 samples -- so this is a toolchain fix, not a benchmark change.
- proxy.request_timeout 1800 -> 3600: it must be >= the solver's
  llm_kwargs.timeout (3600), otherwise the proxy truncates long agent turns
  the harness is still waiting on.
- drop_params: add max_input_tokens_per_task and no_rebuild, which the 0.5.x
  harbor eval image sends and vLLM rejects unless stripped.
- exclude_patterns: add model_traffic.jsonl so captured request bodies stay
  in the run dir and never reach MLflow.
- add the http_pairs_dump interceptor (last in chain) for HTTP diagnostics.
- document sharding: max_concurrent/sandbox.concurrency are per shard, so
  shards:N multiplies both serving capacity and live sandboxes.
- .gitignore: broaden .env/.env-* to .env* so secret backups such as
  .env.bak-tb21 cannot be staged.

Verified: nel-next.sh --version reports 0.4.0 built from
Evaluator.git@9dcca2ae; both TB2.1 run configs pass `eval run --dry-run` on
that CLI with 0.5.0.1-harbor in the generated sbatch.

Signed-off-by: Chenjie Luo <chenjiel@nvidia.com>
@copy-pr-bot

copy-pr-bot Bot commented Aug 4, 2026

Copy link
Copy Markdown

Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually.

Contributors can view more details about this message here.

@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The PR changes nemo-evaluator installation defaults, updates AA-next evaluation configurations and benchmark guidance, and broadens .env file ignores.

Changes

AA-next evaluation configuration

Layer / File(s) Summary
Git-based evaluator installation
.agents/scripts/nel-next.sh, .agents/skills/evaluation/references/nel-next.md
The default installation uses the upstream Git repository. NEL_NEXT_REF can pin a revision, and NEL_NEXT_SPEC overrides the source.
Shared evaluation settings
.agents/skills/evaluation/recipes/examples/example_eval_next.yaml, .agents/skills/evaluation/references/nel-next.md
Evaluation settings use a 3600-second proxy timeout, the 0.5.0.1-harbor image, expanded request filtering, HTTP-pair diagnostics, and additional MLflow exclusions.
Benchmark execution guidance
.agents/skills/evaluation/recipes/tasks/aa_next/*
SWE-bench Verified and Terminal-Bench guidance now uses canonical configurations, prompt verification, replay rules, and sharding capacity calculations.

Environment file ignore rules

Layer / File(s) Summary
Environment file pattern
.gitignore
The ignore rules now match all names beginning with .env.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

Suggested reviewers: aanoosheh

🚥 Pre-merge checks | ✅ 6
✅ Passed checks (6 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: aligning nel-next Terminal-Bench 2.1 and SWE-bench configurations with the canonical toolchain.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Security Anti-Patterns ✅ Passed The PR range changes only shell, YAML, Markdown, and .gitignore files; it contains no modelopt package or examples Python changes to review.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chenjiel/eval-nel-next-tb21-toolchain

Comment @coderabbitai help to get the list of available commands.

@codecov

codecov Bot commented Aug 4, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 66.28%. Comparing base (14b20c0) to head (595cf48).
⚠️ Report is 26 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2063      +/-   ##
==========================================
- Coverage   67.00%   66.28%   -0.73%     
==========================================
  Files         520      522       +2     
  Lines       59545    62009    +2464     
==========================================
+ Hits        39900    41101    +1201     
- Misses      19645    20908    +1263     
Flag Coverage Δ
unit 55.39% <ø> (+0.13%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Same golden cross-check as the TB2.1 change, against the canonical
configs/benchmarks/swe-bench-verified/bench.yaml and a reference oci-hsg run
(Qwen3.6-35B-A3B, pass@1 0.7012 over 500 tasks x r5).

- fix the stale source-of-truth path (configs/benchmarks/nel_next/
  swebench_verified/ -> configs/benchmarks/swe-bench-verified/) and point at the
  shared eval-image pin.
- correct the interceptor ORDER: SWE-bench differs from TB2.1 --
  http_pairs_dump is FIRST, and drop_params comes BEFORE consolidate_system.
- turn_counter gains position: system_message.
- drop_params: add max_input_tokens_per_task and no_rebuild.
- exclude_patterns: add model_traffic.jsonl; document
  proxy.model_traffic.capture_request_body.
- document that the instruction_template CONTENT is scoring-relevant, and that
  the public built-in in nemo_evaluator/templates/ is a DIFFERENT prompt whose
  results are not comparable to the canonical one.
- state plainly that omitting the system_message interceptor is a scoring
  change, not a simplification.
- reasoning_replay.mode is per MODEL, not per benchmark: think_tags (Qwen),
  native (GLM), omitted (MiniMax). Taking it from another model's config is a
  silent output-parsing bug.
- max_concurrent: bench.yaml sets 15, but per-model leaves override it.
- document sharding: concurrency is per shard; the reference run uses shards:10
  for 500 x r5 = 2500 trials.

Signed-off-by: Chenjie Luo <chenjiel@nvidia.com>
@cjluo-nv
cjluo-nv force-pushed the chenjiel/eval-nel-next-tb21-toolchain branch from 69c56cf to 821ed92 Compare August 4, 2026 22:49
Follow-up to the two prior commits on this branch. They carried the reasoning
behind each value (version history, task-set stability, sample counts) into the
skill files. The skill's job is producing a correct config, and that rationale
does not change any value it emits -- it belongs in the PR description, not in
five files that will drift apart.

Also drop the term "golden" throughout. It is internal shorthand for the
reference eval-factory configs and means nothing to an external reader of this
repo; the files now name the config or state the value directly.

- nel-next.sh: 19-line install-source essay -> 5 lines.
- references/nel-next.md: keep the value + the rejection rule for stale
  arch-suffixed tags; drop the version archaeology.
- terminal_bench_2_1.md / swebench_verified.md: move settings into the existing
  task-values tables; keep only the non-obvious constraints (proxy timeout >=
  llm timeout, per-benchmark interceptor order, per-model reasoning_replay.mode,
  scoring impact of instruction_template and system_message).
- swebench_verified.md: make the snippets use the canonical
  /configs/prompts/swebench_instruction.md consistently; the table and prose had
  been updated but the bash/yaml examples still showed the old hyphenated path.

Net 128 -> 99 added lines. No config value changed.

Signed-off-by: Chenjie Luo <chenjiel@nvidia.com>
@cjluo-nv
cjluo-nv marked this pull request as ready for review August 9, 2026 03:09
@cjluo-nv
cjluo-nv requested a review from a team as a code owner August 9, 2026 03:09
@cjluo-nv

cjluo-nv commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator Author

Validation: end-to-end eval runs on the aligned configs

Configs generated from these skill changes were run end-to-end on aws-cmh (4x GB300
aarch64, sm_103) against an NVFP4 checkpoint of Qwen3.6-35B-A3B, and compared to the
reference BF16 results for the same base model.

Benchmark Reference (BF16) This run (NVFP4) Delta
Terminal-Bench 2.1 0.4438 [0.4215, 0.4661] 0.4438 [0.4233, 0.4644] 0.0000
SWE-bench Verified 0.7012 [0.6920, 0.7104] 0.7040 [0.6950, 0.7130] +0.0028 (+0.40%)

Both pass@1, full task sets (89 x r8 = 712 trials; 500 x r5 = 2500 trials), 95% CIs
overlapping in both cases.

This exercises the changes in this PR specifically: the 0.5.0.1-harbor eval image, the
proxy.request_timeout >= llm_kwargs.timeout fix, the four-param drop_params, the
per-benchmark interceptor ordering, and the SWE-bench system_message /
instruction_template requirements. A wrong tool-call parser, the wrong sampling preset,
or the wrong instruction template would each have moved these numbers materially.

Note: the checklist item "Did you get Claude approval on this PR?" is still open --
/claude review has not been run against this branch.

NEL_NEXT_SPEC="${NEL_NEXT_SPEC:-nemo-evaluator[harbor,export]==0.3.*}"
NEL_NEXT_ORIGIN="${NEL_NEXT_ORIGIN:-}"
NEL_NEXT_SPEC="${NEL_NEXT_SPEC:-}"
NEL_NEXT_ORIGIN="${NEL_NEXT_ORIGIN:-git+https://github.com/NVIDIA-NeMo/Evaluator.git}"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[IMPORTANT Compatibility] The new default install is an unpinned git branch, which is weaker pinning than what it replaces and undercuts this PR's own goal.

Before: NEL_NEXT_SPEC defaulted to nemo-evaluator[harbor,export]==0.3.* — a version-constrained resolve that a user could tighten to an exact 0.3.x.
After: NEL_NEXT_ORIGIN defaults to git+https://github.com/NVIDIA-NeMo/Evaluator.git with NEL_NEXT_REF empty, so INSTALL_SPEC resolves to whatever the default branch HEAD happens to be.

Why it matters for this specific script:

  1. INSTALL_SPEC is now a constant string across upstream commits. The header's premise — "uv caches the resolved env and refreshes it when the spec changes" — no longer holds: the spec never changes while HEAD moves. uv caches the resolved git commit, so machine A (first run in June) and machine B (first run in August) silently run different toolchains under an identical spec, and neither run needs --refresh to notice.
  2. --version cannot disambiguate. The PR body notes there is no v0.4.0 tag, so nemo_evaluator.__version__ prints 0.4.0 for every commit on the branch. There is no way for a user (or an agent following the skill) to answer "which build produced this score."
  3. The validated toolchain is a specific SHA. The PR's own testing section cites Evaluator.git@9dcca2ae as the build that matches golden, and the header tells the user to "set NEL_NEXT_REF to a commit SHA to pin" — but the shipped default does not do that, so the default path is the unreproducible one.

For a script whose entire purpose is producing benchmark numbers that are comparable across runs and across the BF16/NVFP4 sides of a comparison, the default should be the reproducible build.

Suggested fix — default NEL_NEXT_REF to the validated SHA, keeping both override paths intact:

NEL_NEXT_SPEC="${NEL_NEXT_SPEC:-}"
NEL_NEXT_ORIGIN="${NEL_NEXT_ORIGIN:-git+https://github.com/NVIDIA-NeMo/Evaluator.git}"
# Pinned to the build golden runs on (0.4.0, no tag exists). Set to a branch name
# (e.g. main) to track upstream, at the cost of reproducibility.
NEL_NEXT_REF="${NEL_NEXT_REF:-9dcca2ae}"

and update the header + references/nel-next.md to state the default is pinned rather than instructing the user to pin it themselves. If tracking HEAD is genuinely intended, then --version / --which should surface the resolved commit so a run is at least attributable after the fact.

Secondary, smaller point in the same hunk: precedence between the two variables inverted (NEL_NEXT_ORIGIN used to win when both were set; now NEL_NEXT_SPEC does). That is intentional per the comment, but anyone with both already in their .env flips from a git build to a PyPI build with no signal — worth a line in references/nel-next.md.

vLLM 400s on them if they aren't stripped.
- **`exclude_patterns`** = `["shard*", "model_traffic.jsonl"]` — captured request bodies
stay in the run dir, never MLflow.
- **`http_pairs_dump`** — `config: {dump_path: $${NEL_OUTPUT_DIR}/http_pairs_metrics.json,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[SUGGESTION] This snippet is not valid YAML if copied verbatim. In a flow mapping ({...}), {, }, [, ], and , are indicator characters and cannot appear in a plain (unquoted) scalar — so dump_path: $${NEL_OUTPUT_DIR}/http_pairs_metrics.json inside the braces is a parse error, not just a style nit.

recipes/examples/example_eval_next.yaml:54 and swebench_verified.md:87 both quote it correctly; only this reference line doesn't. Since these skill docs are copied into generated configs, the unquoted form would fail at config load rather than at --dry-run schema validation.

Suggested change
- **`http_pairs_dump`** — `config: {dump_path: $${NEL_OUTPUT_DIR}/http_pairs_metrics.json,
- **`http_pairs_dump`** — `config: {dump_path: "$${NEL_OUTPUT_DIR}/http_pairs_metrics.json",

Comment on lines 52 to +54
# SWE-bench (OpenHands, multi-turn) adds turn_counter + consolidate_system + a system_message — see swebench_verified.md
- name: http_pairs_dump # FEP-1104/1120 diagnostics; canonical LAST in the chain
config: {dump_path: "$${NEL_OUTPUT_DIR}/http_pairs_metrics.json", first_n: 50} # $$ defers expansion to run time

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[SUGGESTION] The comment says http_pairs_dump is "canonical LAST in the chain", which is right for TB2.1 (the benchmark this template's benchmarks: block is configured for), but swebench_verified.md:78 documents that SWE-bench needs it first and drop_params before consolidate_system. This template is the stated starting point for both recipes ("Start from recipes/examples/example_eval_next.yaml"), and the adjacent SWE-bench pointer on line 52 only mentions the added interceptors, not that the ordering changes.

Given the PR body calls "per-benchmark interceptor ordering" one of the things this change gets right, making the template say so avoids someone lifting the TB2.1 order into a SWE-bench config. Suggest extending the existing pointer comment:

        # SWE-bench (OpenHands, multi-turn) adds turn_counter + consolidate_system + a
        # system_message, AND reorders this chain (http_pairs_dump first, drop_params before
        # consolidate_system) — see swebench_verified.md

Comment thread .gitignore
# Environments
.env
.env-*
.env*

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[SUGGESTION] .env* is broader than the stated goal ("secret backups such as .env.bak-tb21 cannot be staged") and will also swallow any future .env.example / .env.template at the repo root — the exact files you want tracked. The skill already relies on a committed template (.agents/skills/evaluation/recipes/env.example, referenced from SKILL.md:84 and four task recipes); that path is safe today only because it lacks the leading dot.

Cheap insurance, since a silently-untracked template is a confusing failure mode:

.env*
!.env.example

Comment on lines +54 to +62

**Which file you mount changes the score.** Mount the canonical `swebench_instruction.md`
(underscore) at `/configs/prompts/swebench_instruction.md`, taken from the reference config or
run dir. The built-in in the `nemo_evaluator/templates/` venv directory is a **different
prompt** (`swebench-instruction.md`, hyphen) — it runs, but results are not comparable. Keep
whichever you use fixed across both sides of a comparison.

```bash
VENV="${NEL_NEXT_VENV:-$HOME/.local/share/nel/venvs/nel-next}" # same default as nel-next.sh (NEL_NEXT_VENV may be unset)
cp "$VENV/lib/python3.12/site-packages/nemo_evaluator/templates/swebench-instruction.md" /tmp/
ssh <login> 'mkdir -p <lustre>/<user>/prompts' && scp /tmp/swebench-instruction.md <login>:<lustre>/<user>/prompts/
ssh <login> 'mkdir -p <lustre>/<user>/prompts'

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[SUGGESTION] The rewritten gotcha loses the one thing that made the old version actionable: where to get the file.

The previous text gave a concrete cp from the venv ($VENV/lib/python3.12/site-packages/nemo_evaluator/templates/swebench-instruction.md). The new text correctly explains that the built-in is a different prompt and not comparable — good, that's a real scoring trap — but then the scp on line 64 sources a bare swebench_instruction.md from the caller's cwd, with the provenance only as "taken from the reference config or run dir." An agent following this recipe has no path to fetch, and the instruction "verify sha256 against the source" names no source to verify against.

The two other source-of-truth pointers in this file are precise (configs/benchmarks/swe-bench-verified/bench.yaml, configs/shared/nel_next_containers.yaml), so this one stands out. Suggest naming the repo-relative path the same way, e.g.:

# canonical prompt: configs/prompts/swebench_instruction.md in nvidia-eval-factory-benchmarking
# (dl/JoC/competitive_evaluation/…) — record its sha256 alongside the score
ssh <login> 'mkdir -p <lustre>/<user>/prompts'
scp swebench_instruction.md <login>:<lustre>/<user>/prompts/

Also worth stating explicitly that both sides of a BF16-vs-quantized comparison must mount the same file — the current "Keep whichever you use fixed across both sides of a comparison" implies it, but this is the highest-leverage sentence in the section.

| `max_concurrent` / `sandbox.concurrency` | `15` |
| `max_concurrent` / `sandbox.concurrency` | `15` in `bench.yaml`; per-model configs override it (MiniMax-M2.7 uses `20`) |
| `solver` | `timeout_strategy: max`, `run_timeout: 10800` (3h), `agent_kwargs.llm_kwargs.timeout: 3600` |
| `sandbox.region` | `us-east-2` |

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[SUGGESTION] Two small consistency issues in this table row and the block below it.

  1. The row now says 15 in bench.yaml but "per-model configs override it (MiniMax-M2.7 uses 20)", while the YAML at line 33 still hardcodes max_concurrent: 15 with no note. Since sandbox.concurrency must track max_concurrent (the TB2.1 example flags keep == sandbox.concurrency), a reader who bumps one per the table may not bump the other. A trailing comment on line 33 would close it.

  2. The new Sharding section recommends shards: 10 at concurrency: 15 → 150 live Fargate sandboxes, whereas TB2.1's parallel section recommends shards: 4 at concurrency: 50 → 200. Both then say "check N × concurrency against the Fargate quota" without giving the quota. Naming the actual limit once (in references/nel-next.md, since it's account-level rather than per-benchmark) would make both checks performable instead of advisory.


Default install is public PyPI `nemo-evaluator[harbor]==0.3.*`; set
`NEL_NEXT_ORIGIN`/`NEL_NEXT_REF` for the internal git build (see script header).
Default install is a git build from `github.com/NVIDIA-NeMo/Evaluator` via `NEL_NEXT_ORIGIN`

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[SUGGESTION] This paragraph now correctly says the default resolves to 0.4.0, but the version labels elsewhere still say 0.3.x and were not updated — so the doc contradicts itself a few lines apart:

  • references/nel-next.md:14 — comparison table: package | `nemo-evaluator-launcher` 0.2.6 | `nemo-evaluator[harbor]` 0.3.x
  • references/nel-next.md:23 — "Installing 0.3.x into the 0.2.6 env clobbers nel"
  • SKILL.md:39 — "(nemo-evaluator[harbor] 0.3.x)"
  • scripts/nel-next.sh:17,20,23,55 — header and _uvx comment all say "nel 0.3.x" / "0.3.x environment"

The 0.2.6-vs-next separation argument holds regardless of which minor the "next" side is, so nothing is functionally wrong — but "0.3.x" is the value a reader will quote when sanity-checking --version output against the docs, and it now prints 0.4.0. Since the point of this PR is removing exactly this kind of drift, worth relabeling these to 0.3.x/0.4.x (or just "next") in the same pass.

@coderabbitai coderabbitai Bot 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.

Warning

CodeRabbit couldn't request changes on this pull request because it doesn't have sufficient GitHub permissions.

Please grant CodeRabbit Pull requests: Read and write permission and re-run the review.

👉 Steps to fix this

Actionable comments posted: 2

🧹 Nitpick comments (2)
.agents/skills/evaluation/references/nel-next.md (1)

30-33: 🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick win

Align the nel-next version contract. The installer uses the upstream default branch when NEL_NEXT_REF is unset, while the reference and skill files still describe a 0.3.x environment. Pin the installer to the documented 0.3.x release, or update the CLI, schema, and templates to 0.4.0.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.agents/skills/evaluation/references/nel-next.md around lines 30 - 33, Align
the nel-next version contract across the installer and its documentation: either
pin the installer’s default NEL_NEXT_REF to the documented 0.3.x release, or
consistently update the CLI, schema, templates, and reference/skill files to
0.4.0. Ensure the default branch is not used implicitly when the documented
version is expected.
.agents/scripts/nel-next.sh (1)

43-51: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Preserve the required extras in NEL_NEXT_SPEC.

If NEL_NEXT_SPEC omits [export], mlflow-push lacks the mlflow dependency. Document the required nemo-evaluator[harbor,export] syntax and reject incomplete overrides, or install the exporter separately.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.agents/scripts/nel-next.sh around lines 43 - 51, Update the NEL_NEXT_SPEC
override handling in the installation setup to ensure it includes the required
nemo-evaluator[harbor,export] extras, rejecting incomplete overrides with a
clear message or installing the exporter dependencies separately. Document the
required override syntax while preserving valid custom specifications.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.agents/skills/evaluation/recipes/tasks/aa_next/swebench_verified.md:
- Around line 92-93: Update the reasoning interceptor examples in the model
configuration section so they are model-specific: retain both reasoning and
reasoning_replay for reasoning models, use reasoning_replay.mode "think_tags"
for Qwen-style models, "native" for GLM models, and omit reasoning_replay for
MiniMax; ensure instruct-model examples include neither interceptor.
- Around line 66-70: Update the NEL schema reference in references/nel-next.md
to document cluster.container_mounts under the cluster configuration, noting
that it mounts files into the evaluator container for NEL SLURM jobs. Do not add
a service-level mount or alter the recipe configuration.

---

Nitpick comments:
In @.agents/scripts/nel-next.sh:
- Around line 43-51: Update the NEL_NEXT_SPEC override handling in the
installation setup to ensure it includes the required
nemo-evaluator[harbor,export] extras, rejecting incomplete overrides with a
clear message or installing the exporter dependencies separately. Document the
required override syntax while preserving valid custom specifications.

In @.agents/skills/evaluation/references/nel-next.md:
- Around line 30-33: Align the nel-next version contract across the installer
and its documentation: either pin the installer’s default NEL_NEXT_REF to the
documented 0.3.x release, or consistently update the CLI, schema, templates, and
reference/skill files to 0.4.0. Ensure the default branch is not used implicitly
when the documented version is expected.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 84c9459f-a486-4872-8a1b-e40ebcd7a48d

📥 Commits

Reviewing files that changed from the base of the PR and between 2d4be28 and 595cf48.

📒 Files selected for processing (6)
  • .agents/scripts/nel-next.sh
  • .agents/skills/evaluation/recipes/examples/example_eval_next.yaml
  • .agents/skills/evaluation/recipes/tasks/aa_next/swebench_verified.md
  • .agents/skills/evaluation/recipes/tasks/aa_next/terminal_bench_2_1.md
  • .agents/skills/evaluation/references/nel-next.md
  • .gitignore

Comment on lines 66 to 70
```yaml
benchmarks: [{playbook: swebench_verified, instruction_template: /configs/swebench-instruction.md}]
benchmarks: [{playbook: swebench_verified, instruction_template: /configs/prompts/swebench_instruction.md}]
cluster:
container_mounts: ["<lustre>/<user>/prompts/swebench-instruction.md:/configs/swebench-instruction.md:ro"]
container_mounts: ["<lustre>/<user>/prompts/swebench_instruction.md:/configs/prompts/swebench_instruction.md:ro"]
```

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.

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

rg -n -C 8 \
  'container_mounts|^services:|^cluster:' \
  .agents/skills/evaluation/references/nel-next.md \
  .agents/skills/evaluation/recipes/examples/example_eval_next.yaml \
  .agents/skills/evaluation/recipes/tasks/aa_next/swebench_verified.md

Repository: NVIDIA/Model-Optimizer

Length of output: 13010


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- relevant files ---'
git ls-files '.agents/skills/evaluation' | sed -n '1,160p'

printf '%s\n' '--- mount and eval-image references ---'
rg -n -C 4 \
  'container_mounts|eval_image|instruction_template|eval.image|mount' \
  .agents/skills/evaluation \
  --glob '*.md' --glob '*.yaml' --glob '*.yml' --glob '*.py' --glob '*.sh' \
  | sed -n '1,260p'

printf '%s\n' '--- recipe context ---'
cat -n .agents/skills/evaluation/recipes/tasks/aa_next/swebench_verified.md | sed -n '45,90p'

Repository: NVIDIA/Model-Optimizer

Length of output: 34115


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- NEL schema reference ---'
cat -n .agents/skills/evaluation/references/nel-next.md | sed -n '58,125p'

printf '%s\n' '--- all repository references to cluster.container_mounts and evaluation mounts ---'
rg -n -C 5 \
  'cluster\.container_mounts|container_mounts|mounts:|eval_image|evaluation:|eval-image|eval image' \
  . \
  --glob '!*.lock' --glob '!*.jsonl' \
  | sed -n '1,360p'

printf '%s\n' '--- possible schema/parser sources ---'
rg -n -C 3 \
  'extra="forbid"|extra.*forbid|class .*Config|container_mounts|eval_image' \
  . \
  --glob '*.py' --glob '*.pyi' --glob '*.yaml' --glob '*.yml' --glob '*.toml' \
  | sed -n '1,360p'

Repository: NVIDIA/Model-Optimizer

Length of output: 50380


🌐 Web query:

NEL next configuration schema eval_image container_mounts evaluation container mounts nemo evaluator

💡 Result:

In the NVIDIA NeMo Evaluator (including configurations used with NeMo Evaluator Launcher/NEL), the eval_image and container_mounts parameters are primary configuration options used when deploying evaluation jobs to containerized environments, such as SLURM clusters or Docker-based executors [1][2]. 1. eval_image: This parameter specifies the container image (e.g., Apptainer, Enroot, or Docker) used to execute the evaluation harness [1][2]. It provides the isolated environment where the evaluation code runs [3]. In some advanced workflows, this can be dynamically set via environment variables (e.g., ${NEL_NEXT_EVAL_IMAGE}) to ensure the correct architecture-matched or version-pinned image is used [4]. 2. container_mounts: This parameter accepts a list of host paths to mount into the evaluation container [1][2]. It is essential for providing the containerized environment access to required data on the host machine, such as: - Datasets (if they are not automatically managed by the task's dataset directory mounting feature) [5][6] - Caching directories (e.g., for vLLM or HuggingFace) [4] - Configuration files [4] - Results output directories [7] Usage Contexts: - SLURM Deployment: Both parameters are typically defined under the cluster configuration block (e.g., cluster.eval_image and cluster.container_mounts) [1][2]. - NeMo Run: When using NeMo Run, these are set as properties on the executor object (e.g., executor.container_image and executor.container_mounts) [8]. - Dataset-Specific Mounting: Beyond general container mounts, tasks that require specific local datasets can also use the dataset_dir and optional dataset_mount_path fields within the evaluation task configuration [5][6]. The system automatically handles these mounts and sets the corresponding NEMO_EVALUATOR_DATASET_DIR environment variable [5][6]. For further details on specific schema structures, users should refer to the official documentation for the respective version of the NeMo Evaluator SDK, as configurations may vary between stable releases and development branches [5][9][10].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- official SLURM documentation ---'
for url in \
  'https://docs.nvidia.com/nemo/evaluator/deployment/slurm' \
  'https://docs.nvidia.com/nemo/evaluator/nightly/deployment/slurm' \
  'https://docs.nvidia.com/nemo/evaluator/latest/libraries/nemo-evaluator-launcher/configuration/executors/slurm.html'
do
  printf '\nURL: %s\n' "$url"
  curl -L --fail --silent --show-error "$url" |
    tr '\n' ' ' |
    sed 's/<[^>]*>/ /g' |
    grep -oE '.{0,180}(container_mounts|eval_image|eval image|mounts).{0,260}' |
    head -n 12 || true
done

printf '%s\n' '--- referenced repository commit ---'
if git cat-file -e a05850bffad6f254f265d7e30b46823a6064d8f7^{commit} 2>/dev/null; then
  git show --stat --oneline a05850bffad6f254f265d7e30b46823a6064d8f7
  git show a05850bffad6f254f265d7e30b46823a6064d8f7 -- \
    '.agents/skills/evaluation/references/nel-next.md' \
    '.agents/skills/evaluation/recipes/tasks/aa_next/swebench_verified.md' \
    | sed -n '1,260p'
else
  echo 'commit not present locally'
fi

Repository: NVIDIA/Model-Optimizer

Length of output: 18435


Document cluster.container_mounts in the NEL schema reference.

cluster.container_mounts is supported for NEL SLURM jobs and mounts files into the evaluator container. The recipe does not need a service-level mount. Update references/nel-next.md to list this field under cluster and clarify its target.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.agents/skills/evaluation/recipes/tasks/aa_next/swebench_verified.md around
lines 66 - 70, Update the NEL schema reference in references/nel-next.md to
document cluster.container_mounts under the cluster configuration, noting that
it mounts files into the evaluator container for NEL SLURM jobs. Do not add a
service-level mount or alter the recipe configuration.

Comment on lines 92 to +93
- {name: reasoning} # reasoning models: normalize reasoning field …
- {name: reasoning_replay} # … and replay it across turns (drop both for instruct)
- {name: reasoning_replay} # … and replay across turns. Drop both for instruct models.

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.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -eu

file='.agents/skills/evaluation/recipes/tasks/aa_next/swebench_verified.md'
printf '%s\n' '--- target excerpt ---'
sed -n '70,115p' "$file"

printf '%s\n' '--- related reasoning terms ---'
rg -n -C 3 'reasoning_replay|think_tags|MiniMax|Qwen|GLM|instruct|native' .agents/skills/evaluation/recipes/tasks/aa_next .agents/skills/evaluation 2>/dev/null | head -n 240

Repository: NVIDIA/Model-Optimizer

Length of output: 33100


🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- interceptor definitions and usage ---'
rg -n -C 4 'reasoning_replay|name:\s*reasoning|think_tags|reasoning.*mode|native.*GLM' . --glob '!*.md' --glob '!*.lock' --glob '!package-lock.json' 2>/dev/null | head -n 320

printf '%s\n' '--- all likely proxy/config files ---'
git ls-files | rg '(^|/)(bench\.yaml|.*(proxy|interceptor|nel.*config|config).*\.(ya?ml|json|py|ts|js|md))$' | head -n 240

Repository: NVIDIA/Model-Optimizer

Length of output: 18764


🌐 Web query:

NeMo Evaluator Launcher reasoning_replay interceptor mode think_tags native MiniMax

💡 Result:

In the NVIDIA NeMo Evaluator, reasoning_replay is a specialized interceptor designed to manage chain-of-thought (CoT) reasoning across multi-turn agentic interactions [1][2]. It addresses the issue where certain agent SDKs drop reasoning_content during replay, which can lead to a loss of CoT context and increased turn counts in agentic rollouts [1][3]. The reasoning_replay interceptor caches reasoning_content from upstream model responses (keyed by tool call ID or content hash) and re-injects it into subsequent outbound requests [1]. Regarding the requested modes and features: 1. Interceptor Mode (Native): The reasoning_replay interceptor supports a native mode [3]. In this mode, it ensures compatibility with backends (such as vLLM versions >=0.19) that may require specific reasoning field representations [3]. Recent updates ensure that in native (and both) modes, the interceptor preserves and writes both reasoning and reasoning_content fields to accommodate differences in how various backends parse chat input [3]. 2. Think Tags: The interceptor integrates with the configured reasoning pipeline to wrap cached hidden chains of thought with configured think tokens (e.g., ...) [3][4]. While NeMo Evaluator generally allows customization of these tokens (e.g., in reasoning interceptor configuration) [4], the reasoning_replay interceptor uses these settings to maintain consistent reasoning formatting during re-injection [3]. 3. MiniMax: There is no direct mention of native MiniMax integration specifically within the NeMo Evaluator reasoning_replay interceptor documentation or commit history [1][3]. NeMo Evaluator interceptors are modular and typically built to be backend-agnostic by using standard OpenAI-compatible interfaces [4][5], meaning they would process reasoning content based on standard fields (like reasoning_content) regardless of the specific underlying model provider, provided the provider follows that protocol. In summary, the reasoning_replay interceptor is a tool to ensure continuity of reasoning in long-running agentic evaluations, with native modes specifically tuned to handle backend-specific field requirements (like vLLM) and standard think-tag wrapping [1][3].

Citations:


🌐 Web query:

site:github.com/NVIDIA/NeMo-Evaluator-Launcher reasoning_replay think_tags

💡 Result:

I couldn’t find an indexed match for reasoning_replay or think_tags in NVIDIA/NeMo-Evaluator-Launcher.

The relevant repository appears to be NVIDIA-NeMo/Evaluator, whose launcher package is located under packages/nemo-evaluator-launcher/. (github.com)

Note: GitHub’s current repository path is likely:

NVIDIA-NeMo/Evaluator

Citations:


🏁 Script executed:

#!/bin/bash
set -eu

for sha in 751d1f7cc2b078ac90a161e49db361da487d741a fce9256690e99c5905e74ba03fea482f2e9f9a75 e4cc20c94e4dd9dbdcd3c5a2d05b878bbfc22907; do
  printf '\n--- commit %s ---\n' "$sha"
  curl -fsSL "https://api.github.com/repos/NVIDIA-NeMo/Evaluator/commits/$sha" |
    jq -r '.commit.message, (.files[]? | "FILE: \(.filename)\n\(.patch // "")")' |
    rg -n -C 5 'reasoning_replay|think_tags|native|MiniMax|mode|reasoning_content' | head -n 240 || true
done

printf '\n--- current upstream interceptor docs ---\n'
curl -fsSL 'https://raw.githubusercontent.com/NVIDIA-NeMo/Evaluator/main/docs/about/concepts/interceptors.md' |
  rg -n -C 5 'reasoning_replay|think_tags|native|MiniMax|reasoning_content' | head -n 240 || true

Repository: NVIDIA/Model-Optimizer

Length of output: 570


🌐 Web query:

site:docs.nvidia.com/nemo/evaluator reasoning_replay mode think_tags

💡 Result:

In the context of LLM evaluation frameworks, specifically the NVIDIA NeMo Evaluator SDK, the concepts of reasoning traces and think tags are utilized to process and analyze the step-by-step thinking processes of reasoning-capable models [1][2]. Think tags (e.g., and ) are special tokens used by many modern LLMs to encapsulate their chain-of-thought reasoning process—the intermediate logical steps, calculations, and deliberations performed before arriving at a final answer [1][2]. Reasoning replay or reasoning interception is a functional component within the NeMo Evaluator that manages these traces [2][3]. Because many benchmarks and evaluation pipelines expect only the final answer from a model, the Reasoning Interceptor serves several key roles: - Extraction and Removal: It identifies the reasoning trace within the model's output (using the specified start and end tokens), removes it from the content to ensure the evaluation receives only the final answer, and optionally isolates it for further analysis [1][2][4]. - Statistics and Metrics Tracking: The interceptor tracks metrics related to the reasoning process, such as the number of responses that included reasoning, whether the reasoning completed (i.e., reached the end token), and the average length of the reasoning trace (in tokens or words) [2][4][5]. This data is typically saved to an evaluation metrics file (e.g., eval_factory_metrics.json), allowing developers to analyze model behavior, compute costs, or evaluate the quality of the chain-of-thought [1][4][5]. While "reasoning_replay" is not a singular standard term, it appears in this technical ecosystem as part of the operational workflow for handling, logging, and re-evaluating the reasoning traces generated during model inference [2][6]. Configuration of these interceptors allows users to specify custom tokens if their model uses different markers than the standard tags [2][7].

Citations:


🌐 Web query:

site:github.com/NVIDIA-NeMo/Evaluator "reasoning_replay" "think_tags"

💡 Result:

In the context of the NVIDIA NeMo Evaluator framework, reasoning_replay and think_tags are components designed to manage and preserve Chain-of-Thought (CoT) reasoning processes across multi-turn agent interactions [1][2]. reasoning_replay is an interceptor designed to solve the problem where certain agent SDKs (such as OpenHands or pi-ai) drop reasoning_content during conversation replays, causing the model to lose its reasoning context in subsequent turns [2]. The interceptor functions by caching the reasoning_content from upstream model responses and automatically re-injecting it into the next outbound request [3][2]. This ensures that the model's intermediate "thinking" remains available throughout the session [2]. think_tags refer to the configuration used to wrap this cached reasoning content [3]. Because different model backends and APIs may use different fields or formats for reasoning (e.g., specific tags or normalized fields like reasoning_content), the system uses think_tags to standardize how the hidden chain of thought is presented when re-injected [3]. The interceptor can be configured to operate in different modes (such as native or both), ensuring compatibility across various backends like vLLM and SGLang by reading and writing the appropriate reasoning fields [3].

Citations:


🌐 Web query:

site:github.com/NVIDIA-NeMo/Evaluator "reasoning_replay" "MiniMax"

💡 Result:

The term reasoning_replay refers to a specific interceptor component within the NVIDIA NeMo Evaluator framework, not a standalone model or feature from MiniMax [1][2]. It was developed to solve the issue where certain agent SDKs (such as OpenHands or older implementations) would drop an LLM's reasoning content—its Chain-of-Thought (CoT)—during multi-turn interactions [1][2]. When agentic workflows replay previous turns, the loss of this reasoning can cause models to lose context, leading to redundant or inefficient rollouts [2]. Key technical aspects of the reasoning_replay interceptor include: Caching and Re-injection: It intercepts model responses to cache reasoning content (typically identified by fields like reasoning_content or reasoning) and re-injects that content into subsequent outbound requests [1][2]. Cross-Backend Compatibility: The interceptor manages differences in how various inference backends (such as vLLM versions or SGLang) represent reasoning fields [2]. For example, it ensures compatibility with vLLM ≥0.19 by writing both reasoning and reasoning_content fields, as different backends rely on different keys [2]. Deterministic Operation: It is designed to compose deterministically with other framework components, such as reasoning normalizers and caching interceptors, ensuring the CoT is preserved consistently across long agentic benchmark runs [1]. While NeMo Evaluator is used to evaluate various models, including those with reasoning capabilities, reasoning_replay is a utility within the evaluation infrastructure designed to maintain data integrity during testing, rather than a feature of any specific model provider like MiniMax [1][3][4].

Citations:


Make the reasoning interceptor configuration model-specific.

Reasoning models require reasoning and reasoning_replay; instruct models require neither. Set reasoning_replay.mode per model: think_tags for Qwen-style models, native for GLM models, and omit it for MiniMax. Update the examples at lines 92–93 and 96–100.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.agents/skills/evaluation/recipes/tasks/aa_next/swebench_verified.md around
lines 92 - 93, Update the reasoning interceptor examples in the model
configuration section so they are model-specific: retain both reasoning and
reasoning_replay for reasoning models, use reasoning_replay.mode "think_tags"
for Qwen-style models, "native" for GLM models, and omit reasoning_replay for
MiniMax; ensure instruct-model examples include neither interceptor.

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Claude review — [skill] evaluation: align nel-next TB2.1/SWE-bench with golden toolchain

Scope applied: full review per the standard procedure. The triggering comment supplied end-to-end validation evidence but no scoping instruction, so nothing was narrowed. All 6 changed files reviewed (99 additions / 43 deletions) — no modelopt/ source is touched, so the mode-registration, config-schema, and export-compatibility categories don't apply here; the review focused on the agent-skill contract: are the documented values self-consistent, reproducible, and copy-pasteable.

Note on the diff: a .agents/skills/deployment/references/trtllm.md hunk shows up in the two-dot diff against origin/main. That is main-side drift (the checkout is shallow, so no merge base is available), not part of this PR's file list — I excluded it.

Findings: CRITICAL: 0 · IMPORTANT: 1 · SUGGESTION: 5

The one blocking item

nel-next.sh:44 — the new default install is an unpinned git branch. This is the only finding I'd hold the PR for, because it works against the PR's own thesis.

The change is correct in its diagnosis: PyPI tops out at 0.3.0 and cannot reach the 0.4.x toolchain, so a git install is the right move. But NEL_NEXT_REF defaults to empty, so INSTALL_SPEC resolves to whatever the default branch HEAD happens to be. Three consequences specific to this script:

  • INSTALL_SPEC is now a constant string while HEAD moves, which breaks the header's own stated invariant that "uv caches the resolved env and refreshes it when the spec changes." Two machines first running this in different months get different toolchains under an identical spec, and neither needs --refresh to notice.
  • --version can't disambiguate them — the PR body confirms no v0.4.0 tag exists, so every commit on the branch prints 0.4.0. A score becomes unattributable to a build.
  • The PR's own testing section names Evaluator.git@9dcca2ae as the build matching golden, and the new header tells the user to "set NEL_NEXT_REF to a commit SHA to pin" — but the shipped default doesn't, so the default path is the unreproducible one.

Fix is one line (NEL_NEXT_REF="${NEL_NEXT_REF:-9dcca2ae}"), details inline. If tracking HEAD is deliberate, then --version/--which should surface the resolved commit so runs stay attributable after the fact.

Also flagged there: the precedence between NEL_NEXT_SPEC and NEL_NEXT_ORIGIN inverted. That's intentional per the new comment, but anyone with both already in .env silently flips from a git build to a PyPI build — worth a line in the reference doc.

Suggestions (non-blocking)

  • references/nel-next.md:147 — the http_pairs_dump snippet isn't valid YAML as written: unquoted $${NEL_OUTPUT_DIR}/… inside a flow mapping terminates the plain scalar at {. The two other copies of this snippet (example_eval_next.yaml:54, swebench_verified.md:87) quote it correctly; only the reference doesn't. Since these get copied into generated configs, it'd fail at config load rather than at --dry-run.
  • references/nel-next.md:30 — the doc now says the default resolves to 0.4.0, but the version labels four lines up (:14, :23), in SKILL.md:39, and in the script header (:17,20,23,55) still say "0.3.x". Nothing is functionally wrong, but that's the value a reader quotes when checking --version output — and removing exactly this kind of drift is the point of the PR.
  • swebench_verified.md:54-62 — the rewritten instruction-template gotcha adds the genuinely valuable warning (the venv built-in is a different prompt and not comparable) but drops the concrete path to fetch the canonical file, so the scp now sources a bare filename from cwd and "verify sha256 against the source" names no source. The other two source-of-truth pointers in the same file are precise; this one should be too.
  • example_eval_next.yaml:52-54 — the template is the documented starting point for both recipes and says http_pairs_dump is "canonical LAST", which is TB2.1-only; the adjacent SWE-bench pointer mentions the added interceptors but not that the ordering itself changes.
  • .gitignore:32.env* is broader than the stated goal and would also swallow a future root .env.example; a !.env.example negation is cheap insurance. (Today's committed template, .agents/skills/evaluation/recipes/env.example, is safe only because it lacks the leading dot.)
  • swebench_verified.md:21 — the max_concurrent row now documents a per-model override (MiniMax uses 20) but the YAML below still hardcodes 15 with no note, and sandbox.concurrency has to track it. Separately, the two new sharding sections recommend fan-outs that differ by 25% in live sandboxes (150 vs 200) while both say "check against the Fargate quota" without naming it.

Risk assessment

Low. Docs and one shell script; no library code, no public API, no modelopt_state schema, no export path — the checkpoint/config backward-compatibility concerns in CONTRIBUTING.md don't come into play, and the PR's own N/A answers on tests and CHANGELOG are appropriate.

The substantive value-check items are well supported. I confirmed the internal consistency of the aligned values that carry scoring weight: proxy.request_timeout: 3600 >= llm_kwargs.timeout: 3600 holds in the example, both task recipes, and the reference; the four-param drop_params list is identical across all four sites; exclude_patterns is consistent across all five; and the model_traffic: {capture_request_body: true} addition is correctly paired with its exclude_patterns entry, which is the pairing that keeps captured request bodies out of MLflow. The end-to-end evidence in the triggering comment (TB2.1 delta 0.0000, SWE-bench +0.40%, overlapping CIs on full task sets) is the right validation for a change of this kind and covers the scoring-relevant surface — the interceptor ordering, sampling preset, and instruction template — better than any static review could.

The remaining reproducibility gap is the unpinned ref: that eval run pinned a specific build implicitly, but the config as shipped doesn't let the next person reproduce it. Worth closing before merge, since the whole purpose here is scores that stay comparable across runs and across both sides of a quantization comparison.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant