Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/scripts/prune-orphans.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
# FORK of NVIDIA/skills' prune-orphans.sh, adapted for this repo's GROUPED,
# multi-root layout. Differences from upstream:
# - Upstream scans a single flat `skills/*/` root. We scan the SOURCED group
# roots in PRUNE_ROOTS (the wholly-native roots nim-skills/ and workflows/
# are never scanned, so they can't be pruned).
# roots in PRUNE_ROOTS (the wholly-native roots nim-skills/, workflows/,
# and workflow-skills/ are never scanned, so they can't be pruned).
# - catalog_dir values are full grouped paths (e.g. library-skills/nvmolkit-usage),
# kept at DEPTH 1 under their group root, so the scan and the expected-set
# comparison both use full relative paths.
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/plugin-sync.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ on:
- "library-skills/**"
- "open-models-skills/**"
- "workflows/**"
- "workflow-skills/**"
- "skills/**"
- "plugins"
- "skills.sh.json"
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/skill-security.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ on:
- "library-skills/**"
- "open-models-skills/**"
- "workflows/**"
- "workflow-skills/**"
- ".github/workflows/skill-security.yml"
- "scripts/scan_skills.py"
- "scripts/plugin_sync.py"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/sync-skills.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# Sync skills from source repos into the bionemo-agent-toolkit catalog.
# Adapted from NVIDIA/skills' sync-skills.yml, STRIPPED to the aggregation
# core (no signing / compliance / drift / contact-resolution / tracker steps —
# NVCARPS is deferred; the review PR is the v1 gate). Adapted for GROUPED
# automated validation is deferred; the review PR is the v1 gate). Adapted for GROUPED
# catalog dirs: catalog_dir already includes its group prefix
# (e.g. library-skills/nvmolkit-usage), so the rsync target is $catalog_dir, not
# skills/$catalog_dir.
Expand Down
14 changes: 10 additions & 4 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ This repo is an **aggregator**. Most skills are authored in *other* GitHub repos
and **vendored** in by the nightly sync (`.github/workflows/sync-skills.yml`),
which reads `components.d/*.yml`, clones each source repo at its declared `ref`,
and `rsync`s the declared skill folders into this repo's grouped catalog dirs
(`nim-skills/`, `library-skills/`, `open-models-skills/`, `workflows/`), then
opens a PR a maintainer reviews.
(`nim-skills/`, `library-skills/`, `open-models-skills/`, `workflows/`,
`workflow-skills/`), then opens a PR a maintainer reviews.

A skill lives here in exactly one of two ways:

Expand All @@ -44,7 +44,7 @@ A skill lives here in exactly one of two ways:
every run (`rsync --delete`), so **do not edit a sourced skill dir in this
repo** — the change reverts on the next sync. Fix it upstream.
- **Native** — authored directly here and listed in `catalog-exceptions.yml`
(e.g. the NIM skills and the `workflows/` meta-skills).
(e.g. the NIM skills and the `workflows/` and `workflow-skills/` meta-skills).

Every skill directory must be claimed by **exactly one** registry
(`components.d` or `catalog-exceptions.yml`), or the orphan pruner
Expand All @@ -56,6 +56,12 @@ copy directly; run `python scripts/plugin_sync.py --write` after changing a
source skill. The root `plugins -> skills` symlink is a temporary compatibility
path for existing plugin consumers.

The `protein-binder-design` source skill uses `workflow-skills/` because CI treats
the `workflows/` prefix as a whole-workflow validation target. This lets CI
validate the generated skill individually while plugin-sync and security checks
cover its source. Both roots remain registered so existing workflow sources can
stay in `workflows/` until they are migrated.

### Onboarding a source repo

Add `components.d/<slug>.yml`, meet the requirements below, and open a PR:
Expand Down Expand Up @@ -89,7 +95,7 @@ the same conventions `NVIDIA/skills` uses, so a compliant repo is ingestible by
- **SRC-8 · No `AGENTS.md` / `CLAUDE.md` inside a skill dir** (auto-loaded by some harnesses).
- **SRC-9 · No stray non-skill files** in the skills container.

**Compliance — enforced by `NVIDIA/skills`; deferred here (NVCARPS):**
**Compliance — enforced by `NVIDIA/skills`; deferred here:**
- **SRC-10 · Co-located `evals/evals.json`** per skill + a `BENCHMARK.md` report.
Eval definitions for a **sourced** skill must live under `evals/` **in the
source component repo** — never authored into the catalog copy here. The sync
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ flow as well. Skills are also discoverable by partner harnesses directly from th

| Product | Description | Skills |
|---------|-------------|--------|
| **Protein Binder Design** | End-to-end de novo binder design workflows — a NIM route and a Proteina-Complexa route. | [`protein-binder-design`](workflows/generative-protein-binder-design/protein-binder-design), [`complexa-binder-design`](workflows/generative-protein-binder-design/complexa-binder-design) |
| **Protein Binder Design** | End-to-end de novo binder design workflows — a NIM route and a Proteina-Complexa route. | [`protein-binder-design`](workflow-skills/generative-protein-binder-design/protein-binder-design), [`complexa-binder-design`](workflows/generative-protein-binder-design/complexa-binder-design) |
| **Generative Virtual Screening workflow** | Generate candidate molecules, dock them to a target, and score binding affinity (GenMol → DiffDock → Boltz-2). | [`drug-discovery-pipeline`](nim-skills/meta-skills/drug-discovery-pipeline) |
| **MSA-enabled protein structure prediction workflow** | Build a multiple sequence alignment, then predict structure (MSA-Search → OpenFold3). | [`msa-structure-prediction-pipeline`](nim-skills/meta-skills/msa-structure-prediction-pipeline) |
| **Boltz-2** | Biomolecular structure prediction + binding affinity (NIM). | [`boltz2-nim`](nim-skills/boltz2-nim) |
Expand Down
10 changes: 7 additions & 3 deletions catalog-exceptions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
# registration. The forked prune-orphans.sh scans the SOURCED roots
# (library-skills/, open-models-skills/) and deletes any dir there that is
# neither declared in components.d/*.yml nor listed below. The wholly-native
# roots (nim-skills/, workflows/) are not scanned at all (see PRUNE_ROOTS in
# .github/scripts/prune-orphans.sh), so they need no entry — but nim-skills and
# workflows are listed here for documentation.
# roots (nim-skills/, workflows/, workflow-skills/) are not scanned at all
# (see PRUNE_ROOTS in .github/scripts/prune-orphans.sh), so they need no entry
# — but they are listed here for documentation.
#
# Add an entry only with a documented reason and an owner.
exceptions:
Expand All @@ -17,6 +17,10 @@ exceptions:
reason: Native meta-skill workflows (generative-protein-binder-design, virtual_screening, ai_q) authored in-repo.
owner: trvachov
component: Workflows
- dir: workflow-skills
reason: Native workflow skills migrated out of workflows/ for individual skill validation in CI.
owner: trvachov
component: Workflows

# --- native skills inside a SCANNED (sourced) root — MUST be listed or the pruner deletes them ---
- dir: library-skills/parabricks
Expand Down
1 change: 1 addition & 0 deletions plugins.d/bionemo-agent-toolkit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ include_skills:
- open-models-skills/proteina-complexa/
# Workflows
- workflows/generative-protein-binder-design/
- workflow-skills/generative-protein-binder-design/protein-binder-design/

# Inherits version/author/homepage/repository/license/brand_color/capabilities
# from plugins.d/_defaults.yml.
6 changes: 3 additions & 3 deletions scripts/plugin_sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

1. COVERAGE — every distributable source skill is listed in ``skills.sh.json``.
2. FRESHNESS — for every listed skill, the aggregate skill folder is an exact
copy of the source skill folder (including ``evals/`` — NVCARPS
copy of the source skill folder (including ``evals/`` —
Tier 3 requires the eval dataset in the validated payload).

Modes:
Expand Down Expand Up @@ -42,15 +42,15 @@
CONFIG = REPO / "skills.sh.json"

# Source roots that hold distributable skills.
SOURCE_ROOTS = ["nim-skills", "library-skills", "open-models-skills", "workflows"]
SOURCE_ROOTS = ["nim-skills", "library-skills", "open-models-skills", "workflows", "workflow-skills"]
# Path segments that never contain a distributable skill.
EXCLUDE_SEGMENTS = {"plugins", "vendor", "evals", "node_modules", ".git"}
# Files/dirs ignored when copying/comparing (never part of the payload).
# `.skillsource.json` is skills.sh metadata that the generator strips from the payload.
JUNK = {".DS_Store", "__pycache__", ".skillsource.json"}
# Subdirectories of a skill that are stripped from the aggregate payload.
# Empty: the aggregate is a full copy. ``evals/`` is intentionally kept because
# NVCARPS Tier 3 (live agent eval) validates the aggregate and requires the
# Tier 3 (live agent eval) validates the aggregate and requires the
# eval dataset there — stripping it makes Tier 3 skip → coverage invalid → gate block.
STRIP_FROM_AGGREGATE: set[str] = set()
# Generated artifacts the NVSkills signing/eval pipeline writes into the aggregate
Expand Down
117 changes: 117 additions & 0 deletions skills/bionemo-agent-toolkit/skills/protein-binder-design/BENCHMARK.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
# Skill Benchmark: protein-binder-design

> **Overall verdict: NEUTRAL — One or more dimensions remain below PASS**

Live evaluation did not show a material gain or regression. Collect more evidence or improve the skill before making a publication decision.

## Evaluation Metadata

- Skill: `protein-binder-design`
- Evaluation date: 2026-10-02
- Evaluator version: `1.5.6`
- Agents: Claude Code (`aws/anthropic/bedrock-claude-opus-5`), Codex (`openai/openai/gpt-5.5`)
- Tasks: 1 evaluation tasks (1 positive)
- Dataset digest: `sha256:109a2793e5be03aca71b3dc7844f3adb21799632e13edcf2fc73cc66cdfd1303` (skill-evaluator-dataset-snapshot/1)
- Attempts per task: 1
- Environment: `k8s-sandbox`
- Tier 2 evidence: required for publication
- Tier 3 evidence: required for publication

Each task attempt ran in its own isolated sandbox pod.

## What This Report Answers

The three-tier evaluation checks whether the skill:

- is safe to use;
- produces correct answers;
- is discovered and activated when needed;
- helps the agent complete the user's goal and expected workflow; and
- avoids wasted skill and tool usage.

## Results at a Glance

| Measure | Claude Code (Baseline → Skill Uplift) | Codex (Baseline → Skill Uplift) |
|---|---:|---:|
| Overall | 83.8% — baseline ran, but no comparable score was available; uplift unavailable | 85.5% — baseline ran, but no comparable score was available; uplift unavailable |
| Security | 100.0% → 100.0% (±0.0 points) | 100.0% → 100.0% (±0.0 points) |
| Correctness | 100.0% → 100.0% (±0.0 points) | 100.0% → 100.0% (±0.0 points) |
| Discoverability | 35.0% — baseline ran, but no comparable score was available; uplift unavailable | 85.0% — baseline ran, but no comparable score was available; uplift unavailable |
| Effectiveness | 100.0% → 100.0% (±0.0 points) | 100.0% → 58.3% (-41.7 points) |
| Efficiency | 83.9% — baseline ran, but no comparable score was available; uplift unavailable | 84.2% — baseline ran, but no comparable score was available; uplift unavailable |

**How to read this table:** baseline is the same task attempted without the target skill. Scores are rounded to one decimal; threshold-adjacent values use additional precision so their displayed band matches the verdict. Uplift is derived from those displayed scores and shown in percentage points.

Example: `47.0% → 92.0% (+45.0 points)` means the skill-assisted run scored 92.0%, 45.0 percentage points above its 47.0% no-skill baseline.

## Token Usage

Actual Tier 3 execution usage is reported for every observed agent/case pair and both conditions.

| Agent | Dataset case | With skill | Without skill | Delta | Change | Coverage |
|---|---|---:|---:|---:|---:|---|
| claude-code | All cases | 387,458 | 733,717 | -346,259 | -47.19% | skill 1/1; base 1/1 |
| claude-code | offline-manifest | 387,458 | 733,717 | -346,259 | -47.19% | skill 1/1; base 1/1 |
| codex | All cases | 204,321 | 182,661 | +21,660 | +11.86% | skill 1/1; base 1/1 |
| codex | offline-manifest | 204,321 | 182,661 | +21,660 | +11.86% | skill 1/1; base 1/1 |
| ALL AGENTS | Dataset aggregate | 591,779 | 916,378 | -324,599 | -35.42% | skill 2/2; base 2/2 |

Prompt tokens include cached reads, so total tokens are `prompt + completion` (cached is not added twice). The Efficiency score uses `(prompt - cached) + completion`. N/A means the relevant trajectory counters were not available; coverage is never estimated.

## Tier Status

| Tier | Purpose | Status | Evidence |
|---|---|---|---|
| Tier 1 | Static validation | **PASSED WITH OBSERVATIONS** | 11 validator(s); 41 finding(s) |
| Tier 2 | Semantic deduplication | **PASSED** | 2 validator(s); 0 finding(s) |
| Tier 3 | Live agent evaluation | **NEUTRAL** | 2 agent(s); 1 task(s) |

## Findings and Observations

<details>
<summary>Show detailed findings and successful checks</summary>

- **MEDIUM** QUALITY/quality_correctness: No documented scripts in table format (`skills/bionemo-agent-toolkit/skills/protein-binder-design/SKILL.md`)
- **MEDIUM** QUALITY/quality_correctness: Instructions don't mention 'run_script' (`skills/bionemo-agent-toolkit/skills/protein-binder-design/SKILL.md`)
- **MEDIUM** QUALITY/quality_correctness: SKILL_SPEC recommended field missing: 'metadata.author' (`skills/bionemo-agent-toolkit/skills/protein-binder-design/SKILL.md`)
- **MEDIUM** QUALITY/quality_correctness: SKILL_SPEC recommended field missing: 'metadata.tags' (`skills/bionemo-agent-toolkit/skills/protein-binder-design/SKILL.md`)
- **MEDIUM** SCHEMA/folder_hierarchy: Unexpected nesting depth for general skill (`skills/bionemo-agent-toolkit/skills/protein-binder-design`)
- 36 additional finding(s) are available in the full evaluation artifacts.

</details>

## Scoring Methodology

<details>
<summary>Show dimension definitions, source signals, and thresholds</summary>

| Dimension | Question | Scored signals |
|---|---|---|
| Security | Is it safe to use? | `security` (100%) |
| Correctness | Is the answer correct? | `accuracy` (100%) |
| Discoverability | Was the right skill loaded when needed? | `skill_execution` (100%) |
| Effectiveness | Did the skill help complete the task? | `goal_accuracy` (50%) + `behavior_check` (50%) |
| Efficiency | Did it avoid wasted tool calls and token usage? | `skill_efficiency` (50%) + `token_efficiency` (50%) |

- Dimension bands: PASS at 50% or above; NEUTRAL from 40% to below 50%; FAIL below 40%.
- Overall Tier 3 lift: PASS at +5 points or more; FAIL at -10 points or less; values between those bands are NEUTRAL.
- Overall verdict: PASS only when every configured dimension passes for at least one supported agent. Lift is reported as diagnostic evidence and does not override this gate.
- The 50% attempt pass threshold is a separate per-task gate; it is not the dimension pass threshold.
- Effectiveness is the equal-weight mean of goal completion (`goal_accuracy`) and expected workflow adherence (`behavior_check`).
- Efficiency is 50% tool-call productivity (the backward-compatible `skill_efficiency` wire id) and 50% `token_efficiency`. Positive-case skill routing is scored under Discoverability, not Efficiency; a negative case without a routing target is N/A. N/A sources are omitted, remaining weights are renormalized, and the dimension is marked partial.

Signals present in this run:

- `security` (Security): unsafe operations, secret leakage, and unauthorized access.
- `skill_execution` (Skill Execution): whether the expected skill was selected, decoys were avoided, and the workflow executed.
- `skill_efficiency` (Tool Productivity): tool-call productivity (legacy wire id; routing is scored under Discoverability).
- `accuracy` (Accuracy): final-answer correctness against the reference answer.
- `goal_accuracy` (Goal Accuracy): whether the user's goal was achieved.
- `behavior_check` (Behavior Check): whether the expected workflow behavior was followed.
- `token_efficiency` (Token Efficiency): actual uncached prompt plus completion usage (50% of Efficiency).

</details>

## Freshness

Regenerate this benchmark when the skill, evaluation dataset, target agent/model, evaluator version, environment, or scoring policy changes.
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ protein-binder-design/
│ ├── metrics.py # Kabsch CA-RMSD (self-consistency)
│ ├── controls.py # scrambled negative controls
│ └── registry.py # target-registry loader
├── assets/targets.json # EXAMPLE target registry (verify before real use)
├── assets/targets.json # empty target-registry template (populate before use)
└── evals/ # trigger + assertion evals
```

Expand All @@ -30,7 +30,25 @@ protein-binder-design/
- Access to the BioNeMo NIMs you intend to use (RFdiffusion, ProteinMPNN, Boltz2
and/or OpenFold3, optional MSA-Search) — hosted at
[build.nvidia.com](https://build.nvidia.com) or self-hosted via NGC.
- Python ≥ 3.10 with `numpy` (`pip install numpy`). Scripts are otherwise stdlib.
- Python 3.10-3.13 for the pinned helper environment. Install dependencies with
`python3 -m pip install -r requirements.txt`; mmCIF parsing and cached refold
recovery require Biotite. Manifest and PDB-only helpers use the standard library.

## Offline tests

Install `requirements-dev.txt` in a virtual environment, then run
`python3 -m pytest tests`. To inspect coverage, run
`python3 -m pytest --cov=scripts --cov-report=term-missing tests`.
These tests use synthetic fixtures and credentials; they make no model calls.

## Tier 1 validation

CI selects `config/skillspector-baseline.yml` before the repository-wide
baseline. Include this file, the requirements files, and the tests when committing
the skill; synchronize the aggregate copy with the repository's plugin sync tool.
The baseline records reviewed false positives as exact source fingerprints for
SkillSpector 2.11.2. Source edits or a scanner upgrade require another review;
the environment-copy finding is fixed in code and is not suppressed.

## Configure

Expand Down
Loading
Loading