Skip to content

feat(skills): add Experimentalist workflow - #1088

Open
gaiadilorenzo wants to merge 6 commits into
mainfrom
experimentalist-plugin-skill/gdilorenzo
Open

feat(skills): add Experimentalist workflow#1088
gaiadilorenzo wants to merge 6 commits into
mainfrom
experimentalist-plugin-skill/gdilorenzo

Conversation

@gaiadilorenzo

@gaiadilorenzo gaiadilorenzo commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add the platform-bundled nemo-experimentalist skill
  • document agent, spec, dataset, run, and review inputs
  • add routing fixtures and platform skill-loader coverage

Validation

  • uv run --frozen --python <arm64-python> pytest packages/nemo_platform_ext/tests/cli/commands/skills/test_skill_content.py -q (12 passed)

Summary by CodeRabbit

  • New Features

    • Added the nemo-experimentalist skill with guidance for selecting optimization modes, configuring environments, preparing datasets, running evaluations, and validating results.
    • Added support for both Insight-driven and explicit-evaluation workflows, including smoke testing and winner review steps.
  • Tests

    • Added routing tests covering valid explicit and implicit requests, along with negative cases that should use other skills.

@github-actions github-actions Bot added the feat label Aug 5, 2026
@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor
Suite Lines Covered Line Rate Branch Rate
Unit Tests 30741/39237 78.3% 62.7%
Integration Tests 18062/37189 48.6% 21.0%

with each run so another operator can reproduce it. If the agent or its spec
does not exist yet, use `nemo-explore` to design it and `nemo-spec` to create
the spec before returning here.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Once the pr with the harbor dataset conversion, it should be referenced here

Signed-off-by: Gaia Di Lorenzo <gdilorenzo@ethz.ch>
@gaiadilorenzo
gaiadilorenzo force-pushed the experimentalist-plugin-skill/gdilorenzo branch 2 times, most recently from 7031bca to 1cd0253 Compare August 5, 2026 12:24
Gaia Di Lorenzo and others added 4 commits August 5, 2026 15:05
Signed-off-by: Gaia Di Lorenzo <gdilorenzo@ethz.ch>
Signed-off-by: Gaia Di Lorenzo <gdilorenzo@ethz.ch>
Signed-off-by: Gaia Di Lorenzo <gdilorenzo@ethz.ch>
@gaiadilorenzo
gaiadilorenzo marked this pull request as ready for review August 5, 2026 13:41
@gaiadilorenzo
gaiadilorenzo requested review from a team as code owners August 5, 2026 13:41
@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Added the nemo-experimentalist skill documentation. It covers setup, execution modes, optimizer configuration, dataset handling, run commands, and result verification. Added six routing tests for explicit, implicit, and negative-control prompts.

Changes

Experimentalist skill

Layer / File(s) Summary
Skill scope and setup
packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-experimentalist/SKILL.md
Defines skill selection, prerequisites, environment configuration, credentials, and pre-flight checks.
Run modes and optimizer configuration
packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-experimentalist/SKILL.md
Documents Insight-driven and explicit-evaluation modes, CLI inputs, optimizer settings, smoke runs, and dataset preparation.
Execution and result verification
packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-experimentalist/SKILL.md, packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-experimentalist/tests.json
Adds execution workflows, source handling, post-run verification, and six routing test cases.

Possibly related PRs

Suggested labels: docs

Suggested reviewers: aleckhoury, arpitsardhana, schuellc-nvidia

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the added Experimentalist workflow skill.
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.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch experimentalist-plugin-skill/gdilorenzo

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

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

Actionable comments posted: 2

🤖 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
`@packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-experimentalist/SKILL.md`:
- Around line 276-277: Insert a blank line between the closing fenced code block
and the following “For a Git source, append a ref such as” paragraph in
SKILL.md, preserving the existing content and formatting otherwise.
- Line 5: Update the SKILL.md content around the fenced command block in the
nemo-experimentalist skill so there is a blank line after the closing fence
before the following prose. Keep the existing command block content unchanged
and only adjust the Markdown spacing immediately after the fenced block.
🪄 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: fc3cd401-5fca-4255-a512-317199222dc2

📥 Commits

Reviewing files that changed from the base of the PR and between 1fa5b1c and 534b923.

📒 Files selected for processing (2)
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-experimentalist/SKILL.md
  • packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-experimentalist/tests.json

name: nemo-experimentalist
description: Improve an existing NeMo agent from an Insight or explicit Harbor-compatible evaluation datasets. Run the Experimentalist, validate candidate changes against a held-out split, and optionally publish a changed winner as a draft PR or MR.
triggers:
- run experimentalist

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 | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -e
printf '%s\n' '--- target skill ---'
cat -n packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-experimentalist/SKILL.md | sed -n '1,40p;260,285p'
printf '%s\n' '--- skill trigger definitions ---'
rg -n --hidden -S 'run experimentalist|experimentalist|trigger|built-in|builtin' \
  packages/nemo_platform_ext/src/nemo_platform_ext/skills \
  packages/nemo_platform_ext/src/nemo_platform_ext \
  2>/dev/null | head -300
printf '%s\n' '--- relevant skill files ---'
find packages/nemo_platform_ext/src/nemo_platform_ext/skills -name SKILL.md -print | sort

Repository: NVIDIA-NeMo/nemo-platform

Length of output: 22379


🏁 Script executed:

#!/bin/bash
set -e
printf '%s\n' '--- target skill ---'
cat -n packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-experimentalist/SKILL.md | sed -n '1,40p;260,285p'
printf '%s\n' '--- trigger definitions ---'
rg -n --hidden -S 'run experimentalist|experimentalist|trigger|built-in|builtin' \
  packages/nemo_platform_ext/src/nemo_platform_ext/skills \
  packages/nemo_platform_ext/src/nemo_platform_ext \
  2>/dev/null | head -300
printf '%s\n' '--- skill files ---'
find packages/nemo_platform_ext/src/nemo_platform_ext/skills -name SKILL.md -print | sort

Repository: NVIDIA-NeMo/nemo-platform

Length of output: 22364


🏁 Script executed:

#!/bin/bash
set -e
printf '%s\n' '--- skill registry and matcher references ---'
cat -n packages/nemo_platform_ext/src/nemo_platform_ext/skills/__init__.py | sed -n '1,220p'
rg -n --hidden -S 'triggers|user-invocable|skill.*match|match.*skill|load.*skill|discover.*skill' \
  --glob '*.py' --glob '*.md' --glob '*.json' . 2>/dev/null | head -400
printf '%s\n' '--- every declared trigger ---'
python3 - <<'PY'
from pathlib import Path
import re
for p in sorted(Path("packages/nemo_platform_ext/src/nemo_platform_ext/skills").glob("**/SKILL.md")):
    lines=p.read_text().splitlines()
    in_triggers=False
    vals=[]
    for line in lines:
        if line == "triggers:":
            in_triggers=True
            continue
        if in_triggers:
            m=re.match(r"\s+-\s+(.+)$", line)
            if m:
                vals.append(m.group(1))
            elif line and not line.startswith(" "):
                break
    print(f"{p}: {vals}")
PY
printf '%s\n' '--- target formatting context ---'
sed -n '250,282p' packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-experimentalist/SKILL.md
printf '%s\n' '--- markdown configuration and lint references ---'
find . -maxdepth 3 -type f \( -iname '*markdown*' -o -name '.markdownlint*' -o -name 'pyproject.toml' \) -print
rg -n --hidden -S 'MD031|fenced|markdownlint|pre-commit' . \
  --glob '.markdownlint*' --glob '.pre-commit-config.yaml' --glob 'pyproject.toml' --glob 'Makefile' 2>/dev/null | head -200

Repository: NVIDIA-NeMo/nemo-platform

Length of output: 50381


🏁 Script executed:

#!/bin/bash
set -e
printf '%s\n' '--- skill-test matcher ---'
cat -n scripts/skill-test.py | sed -n '1,180p'
printf '%s\n' '--- experimentalist skill tests ---'
cat -n packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-experimentalist/tests.json
printf '%s\n' '--- all trigger blocks ---'
python3 - <<'PY'
from pathlib import Path
for p in sorted(Path("packages/nemo_platform_ext/src/nemo_platform_ext/skills").glob("**/SKILL.md")):
    lines=p.read_text().splitlines()
    start=next((i for i,x in enumerate(lines) if x=="triggers:"),None)
    if start is None:
        continue
    print(f"\n{p}")
    for x in lines[start:start+12]:
        print(x)
        if x and not x.startswith(("triggers:", " ")):
            break
PY
printf '%s\n' '--- fence-spacing check ---'
python3 - <<'PY'
from pathlib import Path
p=Path("packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-experimentalist/SKILL.md")
lines=p.read_text().splitlines()
for i,line in enumerate(lines):
    if line.strip()=="```":
        before=lines[i-1] if i else ""
        after=lines[i+1] if i+1<len(lines) else ""
        print(f"line {i+1}: before={before!r}, after={after!r}")
PY
printf '%s\n' '--- markdown lint configuration ---'
for f in .markdownlint.json .markdownlint.yaml .markdownlint.yml .markdownlint-cli2.json .markdownlint-cli2.yaml .markdownlint-cli2.mjs .pre-commit-config.yaml; do
  [ -f "$f" ] && { echo "### $f"; cat "$f"; }
done

Repository: NVIDIA-NeMo/nemo-platform

Length of output: 18187


🏁 Script executed:

#!/bin/bash
set -e
python3 - <<'PY'
from pathlib import Path
import re

paths = sorted(
    set(Path(".").glob("**/SKILL.md"))
    - {p for p in Path("node_modules").glob("**/SKILL.md")}
)
triggers = []
for path in paths:
    lines = path.read_text(errors="replace").splitlines()
    try:
        start = lines.index("triggers:") + 1
    except ValueError:
        continue
    for line in lines[start:]:
        if line and not line.startswith((" ", "\t")):
            break
        m = re.match(r"\s*-\s+(.+?)\s*$", line)
        if m:
            triggers.append((path, m.group(1).strip().lower()))

print("--- triggers containing standalone 'run' ---")
for path, trigger in triggers:
    words = re.findall(r"[a-z][a-z0-9_-]+", trigger)
    if "run" in words:
        print(path, repr(trigger))

print("--- exact trigger duplicates ---")
seen = {}
for path, trigger in triggers:
    seen.setdefault(trigger, []).append(path)
for trigger, owners in sorted(seen.items()):
    if len(owners) > 1:
        print(repr(trigger), owners)

print("--- target fence spacing violations ---")
path = Path("packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-experimentalist/SKILL.md")
lines = path.read_text().splitlines()
for i, line in enumerate(lines):
    if line.strip() == "```":
        if i + 1 < len(lines) and lines[i + 1].strip():
            print(f"closing fence at line {i + 1} is not followed by a blank line")
PY

Repository: NVIDIA-NeMo/nemo-platform

Length of output: 21162


Add a blank line after the fenced command block.

Line 276 is followed immediately by prose, which violates Markdown fence spacing.

🧰 Tools
🪛 SkillSpector (2.5.1)

[warning] 1: [TR2] Shadow Command Trigger: Shadow Command Trigger: 'run experimentalist' conflicts with built-in command 'run'

Remediation: Choose triggers that do not conflict with built-in commands or other skills. Prefix with a unique namespace if necessary.

(Trigger Abuse (TR2))

🤖 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
`@packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-experimentalist/SKILL.md`
at line 5, Update the SKILL.md content around the fenced command block in the
nemo-experimentalist skill so there is a blank line after the closing fence
before the following prose. Keep the existing command block content unchanged
and only adjust the Markdown spacing immediately after the fenced block.

Source: Linters/SAST tools

Comment on lines +276 to +277
```
For a Git source, append a ref such as

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.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Add a blank line after the fenced block.

Markdownlint requires a blank line between the closing fence and the following paragraph.

Proposed fix
   --config path/to/experimentalist.yaml

For a Git source, append a ref such as

</details>

<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
--config path/to/experimentalist.yaml
🧰 Tools
🪛 markdownlint-cli2 (0.23.2)

[warning] 276-276: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)

🪛 SkillSpector (2.5.1)

[warning] 1: [TR2] Shadow Command Trigger: Shadow Command Trigger: 'run experimentalist' conflicts with built-in command 'run'

Remediation: Choose triggers that do not conflict with built-in commands or other skills. Prefix with a unique namespace if necessary.

(Trigger Abuse (TR2))

🤖 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
`@packages/nemo_platform_ext/src/nemo_platform_ext/skills/nemo-experimentalist/SKILL.md`
around lines 276 - 277, Insert a blank line between the closing fenced code
block and the following “For a Git source, append a ref such as” paragraph in
SKILL.md, preserving the existing content and formatting otherwise.

Source: Linters/SAST tools

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant