-
Notifications
You must be signed in to change notification settings - Fork 17
feat(experimentalist): add a fast, diagnostic smoke agent fixture #1089
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
gaiadilorenzo
merged 52 commits into
main
from
experimentalist-smoke-agent-proposal/cschueller
Aug 13, 2026
Merged
Changes from all commits
Commits
Show all changes
52 commits
Select commit
Hold shift + click to select a range
95b258e
feat(experimentalist): add a fast, diagnostic smoke agent fixture
schuellc-nvidia 4d00ba0
docs(experimentalist): document the model pair and platform URL the r…
schuellc-nvidia 3047691
fix(experimentalist): make g1 solvable by inference, not guesswork
schuellc-nvidia 8d7e05c
fix(experimentalist): refuse a symlinked answer before scoring it
schuellc-nvidia a9cbbd2
refactor(experimentalist): run the smoke gates for two rounds, not one
schuellc-nvidia bddc03b
fix(experimentalist): make the task template a first-class fixture asset
schuellc-nvidia 386f4d9
test(experimentalist): refuse to score a broken Insight suite
schuellc-nvidia bfb1fd8
test(experimentalist): fail an Insight metric that cannot see the repair
schuellc-nvidia 3ef5232
test(experimentalist): clarify smoke agent guards
13572da
test(experimentalist): simplify smoke test docstrings
ac3cf0d
chore : fix reasoning effort
ccfec80
test(experimentalist): add mode 1 smoke loop coverage
7f9849c
chore: test mode 2
41fe459
test(experimentalist): add mode 2 smoke loop coverage
a710af4
test(experimentalist): consolidate mode 1 smoke checks
7ad86d4
test(experimentalist): expand mode 1 insight evidence
ed186c9
test(experimentalist): extend mode 2 smoke timeout
e589739
test(experimentalist): use terra and luna for smoke loops
904ed70
chore: allow empty datasets
4b35cae
chore: remove duplicate cache
c193453
chore: up eval author tasks to 5
6d47005
chore: allow empty datasets
4ad20b1
test(experimentalist): require a sandbox for the smoke E2E loops
schuellc-nvidia 0ca530f
test(experimentalist): run smoke loops in sandbox
0e96918
chore: revert unneeded request timeout
9c0d88e
chore: revert unrelated change
7eb6fd6
chore: revert unrelated change
c729767
chore: revert unwanted change
635334b
test(experimentalist): isolate smoke E2E runs
9f22d68
chore: remove unused model client import
b9b3525
chore(experimentalist): remove unused smoke test tools
74a92ef
test(experimentalist): share smoke runs across assertions
1e5cc91
chore: assume existing sandbox
c25e501
chore(tests): increase e2e test timeouts
1356c79
docs: update example aent to smoke agent
8106afb
fix(experimentalist): finalize when no improvements remain
74c9f25
docs(experimentalist): explain smoke scenario
5144fcc
refactor(experimentalist): render smoke tasks from manifest
f46146a
fix(experimentalist): target full smoke objectives
8bedf2a
docs(experimentalist): correct the smoke-agent weakness reference
schuellc-nvidia d6f2f2d
fix(experimentalist): address smoke agent review feedback
ce54161
test(experimentalist): report both digests when the task tree changes
schuellc-nvidia 5b5bc5f
docs(experimentalist): reunite the smoke-agent headings with their co…
schuellc-nvidia d3e3660
chore: remove internal details
0b212ad
docs(experimentalist): clarify smoke agent setup
7aab5ac
refactor(experimentalist): consolidate smoke fixture docs
1e56719
docs: simplify getting started guide
95ffeee
docs(experimentalist): keep the fuller smoke-fixture README
schuellc-nvidia f2292ad
docs: revert the walkthorugh
6aa685f
fix(experimentalist): repair full-suite test collection
b3e18cd
Merge branch 'main' into experimentalist-smoke-agent-proposal/cschueller
gaiadilorenzo 38e225b
Merge branch 'main' into experimentalist-smoke-agent-proposal/cschueller
gaiadilorenzo File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
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
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
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
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| # Generated by scripts/build_all_group.py, not authored. | ||
| # | ||
| # The loop takes a single --train-dataset path, so running several groups at once | ||
| # needs one combined directory. Its contents are byte-identical copies of the | ||
| # other groups, so committing it would double the dataset in the repo and put | ||
| # every group change in two places. Build it before running the full scenario. | ||
| dataset/groups/_all/ |
75 changes: 75 additions & 0 deletions
75
plugins/nemo-experimentalist/examples/smoke-agent/AGENT-SPEC.md
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,75 @@ | ||
| <!-- SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. --> | ||
| <!-- SPDX-License-Identifier: Apache-2.0 --> | ||
|
|
||
| # smoke-agent | ||
|
|
||
| ## Prerequisites | ||
|
|
||
| The task container ships Python, the standard library, and NOOA. It has no | ||
| network access and no API key, so anything that needs either fails outright. | ||
|
|
||
| ## Job | ||
|
|
||
| Answer one question about the records file at `/app/data/records.json` and write | ||
| the single answer line to `/app/artifacts/output.txt`. | ||
|
|
||
| ## Interface | ||
|
|
||
| - Invoked as `python main.py --prompt "<instruction text>"` with `/app` as the | ||
| working directory. | ||
| - Writes exactly one line, plus a trailing newline, to | ||
| `/app/artifacts/output.txt`. | ||
| - Writes an OTLP JSONL trace under `/app/traces/`. | ||
|
|
||
| ## Design | ||
|
|
||
| `ReportAgent.solve` dispatches the instruction across an ordered list of | ||
| handlers and returns the first non-`None` answer, falling back to a fixed | ||
| string. Each handler matches the question with a regular expression, looks the | ||
| answer up in the records, and formats one line as `<field>=<value>`. | ||
|
|
||
| The records are a list of objects with `name`, `dept`, `role`, and `hours`. | ||
| `FIELD_ALIASES` maps the word a question uses to the key the records store it | ||
| under, so the answer line is always keyed by the canonical field name. | ||
|
|
||
| ## Missing and empty values | ||
|
|
||
| A question may name a person the records do not contain, or ask for a field | ||
| whose stored value is an empty string. Both are answered the same way: the value | ||
| is the word `unknown`, so the line reads `dept=unknown`. This is part of the | ||
| output contract and is compared byte-for-byte like any other answer — the | ||
| sentinel is `unknown` exactly, not `n/a`, `none`, or the empty string. | ||
|
|
||
| ## Answer keys | ||
|
|
||
| The key on the left of the `=` names what the answer *is*, not the field it came | ||
| from. The vocabulary is fixed: | ||
|
|
||
| - a value read from one record uses that field's own name — `dept=`, `role=`, | ||
| `hours=` | ||
| - a sum over records is reported as **`total=`**, whatever field was summed and | ||
| however the records were selected | ||
| - a number of records is reported as `count=` | ||
|
|
||
| Keys are compared byte-for-byte like the rest of the line, so `hours=99` is wrong | ||
| where `total=99` is expected, even though the number is right. | ||
|
|
||
| ## Constraints — these are hard requirements | ||
|
|
||
| - **The agent is deterministic and offline.** The same instruction must always | ||
| produce the same answer. Reward differences between candidates must come from | ||
| code changes, never from sampling. | ||
| - **No LLM.** Do not add a `@strategy` method, an LLM-backed handler, a subagent | ||
| with its own model, or a model swap. The task container has no network and no | ||
| API key, so such a change fails outright — but more importantly, being | ||
| reproducible is this agent's entire contract. | ||
| - Standard library plus NOOA only. No new dependencies. | ||
| - Do not edit `/app/data/records.json`. It is task-supplied input, not agent | ||
| code, and it is not part of this directory. | ||
| - The output line is compared byte-for-byte against the task's expected value, | ||
| so trailing whitespace, extra lines, and changes to the `<field>=<value>` form | ||
| all count as wrong answers. | ||
|
|
||
| ## Next steps | ||
|
|
||
| Any implementation change must still satisfy every constraint above. | ||
Oops, something went wrong.
Oops, something went wrong.
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.
Uh oh!
There was an error while loading. Please reload this page.