diff --git a/nim-skills/rfdiffusion-nim/SKILL.md b/nim-skills/rfdiffusion-nim/SKILL.md
index 168c17e..3650054 100644
--- a/nim-skills/rfdiffusion-nim/SKILL.md
+++ b/nim-skills/rfdiffusion-nim/SKILL.md
@@ -10,7 +10,7 @@ allowed-tools: Bash, Read, Write, AskUserQuestion
# RFDiffusion NIM
Design protein backbone PDBs for de novo proteins, motif scaffolds, and binders.
-Use this `SKILL.md` for first-pass hosted/local usage; load supplemental files
+Use this guide for first-pass hosted/local usage; load supplemental files
only when needed:
- `references/api.md`: exact endpoints, schemas, Docker flags, response fields.
diff --git a/nim-skills/rfdiffusion-nim/evals/evals.json b/nim-skills/rfdiffusion-nim/evals/evals.json
index a20c905..3739773 100644
--- a/nim-skills/rfdiffusion-nim/evals/evals.json
+++ b/nim-skills/rfdiffusion-nim/evals/evals.json
@@ -7,41 +7,13 @@
"expected_output": "A successfully executed hosted RFDiffusion request with Bearer auth, an 80-120 residue contig range, diffusion_steps=50, and the required non-empty dummy input_pdb, plus the actual returned backbone saved as a PDB artifact and summarized from the response.",
"files": [],
"assertions": [
- {
- "id": "hosted-request-executed",
- "description": "Executes the hosted request instead of only writing code",
- "check": "Trajectory shows successful execution of the hosted request, and the final response reports actual response-derived backbone information and the saved .pdb path"
- },
- {
- "id": "hosted-endpoint-url",
- "description": "Uses the correct hosted RFDiffusion endpoint URL",
- "check": "Script contains 'health.api.nvidia.com/v1/biology/ipd/rfdiffusion/generate'"
- },
- {
- "id": "bearer-auth-header",
- "description": "Sets Authorization header with Bearer token from NGC_API_KEY",
- "check": "Script contains 'Authorization' and 'Bearer' and 'NGC_API_KEY'"
- },
- {
- "id": "contigs-length-range",
- "description": "contigs field specifies a length range for de novo generation",
- "check": "Script contains 'contigs' with a length-range string like '80-120' or similar (no chain letter prefix — de novo, not motif scaffolding)"
- },
- {
- "id": "diffusion-steps-max",
- "description": "diffusion_steps set to 50 (maximum quality)",
- "check": "Script contains 'diffusion_steps' and '50'"
- },
- {
- "id": "saves-pdb-output",
- "description": "Saves the output_pdb from the response to a PDB file",
- "check": "Script accesses 'output_pdb' from the response and writes it to a .pdb file"
- },
- {
- "id": "dummy-input-pdb-for-denovo",
- "description": "Passes a non-empty dummy input_pdb for de novo inline generation",
- "check": "Script includes an 'input_pdb' field with a minimal non-empty PDB string such as CRYST1/ATOM/END; it must not omit both input_pdb and input_pdb_asset because live hosted validation requires one of them even for de novo generation"
- }
+ "[hosted-request-executed] Executes the hosted request instead of only writing code: Trajectory shows successful execution of the hosted request, and the final response reports actual response-derived backbone information and the saved .pdb path",
+ "[hosted-endpoint-url] Uses the correct hosted RFDiffusion endpoint URL: Script contains 'health.api.nvidia.com/v1/biology/ipd/rfdiffusion/generate'",
+ "[bearer-auth-header] Sets Authorization header with Bearer token from NGC_API_KEY: Script contains 'Authorization' and 'Bearer' and 'NGC_API_KEY'",
+ "[contigs-length-range] contigs field specifies a length range for de novo generation: Script contains 'contigs' with a length-range string like '80-120' or similar (no chain letter prefix — de novo, not motif scaffolding)",
+ "[diffusion-steps-max] diffusion_steps set to 50 (maximum quality): Script contains 'diffusion_steps' and '50'",
+ "[saves-pdb-output] Saves the output_pdb from the response to a PDB file: Script accesses 'output_pdb' from the response and writes it to a .pdb file",
+ "[dummy-input-pdb-for-denovo] Passes a non-empty dummy input_pdb for de novo inline generation: Script includes an 'input_pdb' field with a minimal non-empty PDB string such as CRYST1/ATOM/END; it must not omit both input_pdb and input_pdb_asset because live hosted validation requires one of them even for de novo generation"
]
}
],
@@ -52,36 +24,12 @@
"expected_output": "A Python script that reads target.pdb, calls the hosted endpoint with contigs='A25-35/0 50-80' (or equivalent), diffusion_steps=50, and saves the scaffolded backbone PDB.",
"files": [],
"assertions": [
- {
- "id": "hosted-endpoint-url",
- "description": "Uses the correct hosted endpoint URL",
- "check": "Script contains 'health.api.nvidia.com/v1/biology/ipd/rfdiffusion/generate'"
- },
- {
- "id": "input-pdb-provided",
- "description": "Reads target.pdb and passes content as input_pdb",
- "check": "Script reads target.pdb and sends its content as 'input_pdb' in the payload"
- },
- {
- "id": "contigs-preserves-motif",
- "description": "contigs field preserves chain A residues 25-35",
- "check": "Script contains 'contigs' with a value including 'A25-35' and a generated segment like '50-80'"
- },
- {
- "id": "chain-break-syntax",
- "description": "Contigs uses /0 chain break separator between kept residues and generated segment",
- "check": "Script contigs value contains '/0' as chain break separator"
- },
- {
- "id": "diffusion-steps-set",
- "description": "diffusion_steps is set (max is 50)",
- "check": "Script contains 'diffusion_steps' with a value between 1 and 50"
- },
- {
- "id": "saves-pdb-output",
- "description": "Saves output_pdb to a PDB file",
- "check": "Script accesses 'output_pdb' and writes it to a .pdb file"
- }
+ "[hosted-endpoint-url] Uses the correct hosted endpoint URL: Script contains 'health.api.nvidia.com/v1/biology/ipd/rfdiffusion/generate'",
+ "[input-pdb-provided] Reads target.pdb and passes content as input_pdb: Script reads target.pdb and sends its content as 'input_pdb' in the payload",
+ "[contigs-preserves-motif] contigs field preserves chain A residues 25-35: Script contains 'contigs' with a value including 'A25-35' and a generated segment like '50-80'",
+ "[chain-break-syntax] Contigs uses /0 chain break separator between kept residues and generated segment: Script contigs value contains '/0' as chain break separator",
+ "[diffusion-steps-set] diffusion_steps is set (max is 50): Script contains 'diffusion_steps' with a value between 1 and 50",
+ "[saves-pdb-output] Saves output_pdb to a PDB file: Script accesses 'output_pdb' and writes it to a .pdb file"
]
},
{
@@ -90,36 +38,12 @@
"expected_output": "A Python script with input_pdb=target.pdb content, contigs referencing chain A of the target and a binder segment, hotspot_res=['A50','A51','A52','A53','A54'], calling the hosted endpoint and saving the generated binder PDB.",
"files": [],
"assertions": [
- {
- "id": "hosted-endpoint-url",
- "description": "Uses the correct hosted endpoint URL",
- "check": "Script contains 'health.api.nvidia.com/v1/biology/ipd/rfdiffusion/generate'"
- },
- {
- "id": "hotspot-res-field",
- "description": "hotspot_res field contains the specified residue identifiers",
- "check": "Script contains 'hotspot_res' with at least some of: 'A50', 'A51', 'A52', 'A53', 'A54'"
- },
- {
- "id": "contigs-binder-segment",
- "description": "contigs includes both a target chain reference and a binder generation segment",
- "check": "Script 'contigs' value includes chain A reference and a generated segment separated by '/0'"
- },
- {
- "id": "input-pdb-target",
- "description": "Reads and submits target.pdb as input_pdb",
- "check": "Script reads target.pdb and passes its content as 'input_pdb'"
- },
- {
- "id": "saves-pdb-output",
- "description": "Saves output_pdb to a PDB file",
- "check": "Script writes 'output_pdb' content to a .pdb file"
- },
- {
- "id": "hotspot-format",
- "description": "hotspot_res uses array of strings format like ['A50', 'A51']",
- "check": "Script 'hotspot_res' is a list/array of strings in 'ChainResidue' format"
- }
+ "[hosted-endpoint-url] Uses the correct hosted endpoint URL: Script contains 'health.api.nvidia.com/v1/biology/ipd/rfdiffusion/generate'",
+ "[hotspot-res-field] hotspot_res field contains the specified residue identifiers: Script contains 'hotspot_res' with at least some of: 'A50', 'A51', 'A52', 'A53', 'A54'",
+ "[contigs-binder-segment] contigs includes both a target chain reference and a binder generation segment: Script 'contigs' value includes chain A reference and a generated segment separated by '/0'",
+ "[input-pdb-target] Reads and submits target.pdb as input_pdb: Script reads target.pdb and passes its content as 'input_pdb'",
+ "[saves-pdb-output] Saves output_pdb to a PDB file: Script writes 'output_pdb' content to a .pdb file",
+ "[hotspot-format] hotspot_res uses array of strings format like ['A50', 'A51']: Script 'hotspot_res' is a list/array of strings in 'ChainResidue' format"
]
},
{
@@ -129,36 +53,12 @@
"expected_output": "Docker setup instructions using shell env first and optional repo-root .env overrides, requiring NGC_API_KEY or NVIDIA_API_KEY fallback plus LOCAL_NIM_CACHE, with the correct image (:2 tag), single GPU flag, cache mount, health check loop, then a local no-auth prediction script targeting localhost:8000 without /v1/ prefix and passing a non-empty dummy input_pdb for de novo generation.",
"files": [],
"assertions": [
- {
- "id": "docker-image-tag",
- "description": "References the correct RFDiffusion container image with :2 tag",
- "check": "Output contains 'nvcr.io/nim/ipd/rfdiffusion' and ':2'"
- },
- {
- "id": "single-gpu-flag",
- "description": "Uses single GPU device specification (device=0)",
- "check": "Output contains '--gpus' and 'device=0'"
- },
- {
- "id": "env-contract-and-cache",
- "description": "Local setup uses the repo env contract and LOCAL_NIM_CACHE",
- "check": "Output sources repo-root .env only if present, supports NVIDIA_API_KEY fallback to NGC_API_KEY, requires LOCAL_NIM_CACHE, and mounts LOCAL_NIM_CACHE to /opt/nim/.cache"
- },
- {
- "id": "health-check",
- "description": "Includes health check before submitting prediction",
- "check": "Output contains health check against localhost:8000/v1/health/ready"
- },
- {
- "id": "local-endpoint-no-v1",
- "description": "Local inference URL has no /v1/ prefix",
- "check": "Script contains 'localhost:8000/biology/ipd/rfdiffusion/generate'"
- },
- {
- "id": "de-novo-contigs",
- "description": "Local de novo request includes contigs plus required dummy input_pdb",
- "check": "Script contains 'contigs' with a value like '100', 'diffusion_steps', and a non-empty dummy 'input_pdb' string"
- }
+ "[docker-image-tag] References the correct RFDiffusion container image with :2 tag: Output contains 'nvcr.io/nim/ipd/rfdiffusion' and ':2'",
+ "[single-gpu-flag] Uses single GPU device specification (device=0): Output contains '--gpus' and 'device=0'",
+ "[env-contract-and-cache] Local setup uses the repo env contract and LOCAL_NIM_CACHE: Output sources repo-root .env only if present, supports NVIDIA_API_KEY fallback to NGC_API_KEY, requires LOCAL_NIM_CACHE, and mounts LOCAL_NIM_CACHE to /opt/nim/.cache",
+ "[health-check] Includes health check before submitting prediction: Output contains health check against localhost:8000/v1/health/ready",
+ "[local-endpoint-no-v1] Local inference URL has no /v1/ prefix: Script contains 'localhost:8000/biology/ipd/rfdiffusion/generate'",
+ "[de-novo-contigs] Local de novo request includes contigs plus required dummy input_pdb: Script contains 'contigs' with a value like '100', 'diffusion_steps', and a non-empty dummy 'input_pdb' string"
]
}
]
diff --git a/skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/BENCHMARK.md b/skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/BENCHMARK.md
new file mode 100644
index 0000000..923189b
--- /dev/null
+++ b/skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/BENCHMARK.md
@@ -0,0 +1,119 @@
+# Skill Benchmark: rfdiffusion-nim
+
+> ✅ **Overall verdict: PASS — Recommended for publication**
+
+## Publication Recommendation
+
+Recommended for publication based on the completed evaluation evidence in this report.
+
+## Evaluation Metadata
+
+- Skill: `rfdiffusion-nim`
+- Evaluation date: 2026-09-30
+- Evaluator version: `1.5.6`
+- Agents: Claude Code (`aws/anthropic/bedrock-claude-opus-4-8`), Codex (`openai/openai/gpt-5.5`)
+- Tasks: 1 evaluation tasks (1 positive)
+- Dataset digest: `sha256:cb7cf77853b13d6d9cb5a92314eb44d57660bb922f2f5d331ebf98b4dc9459f5` (skill-evaluator-dataset-snapshot/1)
+- Attempts per task: 3
+- 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 | 67.8% — baseline ran, but no comparable score was available; uplift unavailable | 90.6% — baseline ran, but no comparable score was available; uplift unavailable |
+| Security | 100.0% → 0.0% (-100.0 points) | 50.0% → 100.0% (+50.0 points) |
+| Correctness | 100.0% → 100.0% (±0.0 points) | 0.0% → 100.0% (+100.0 points) |
+| Discoverability | 100.0% — baseline ran, but no comparable score was available; uplift unavailable | 95.0% — baseline ran, but no comparable score was available; uplift unavailable |
+| Effectiveness | 100.0% → 65.0% (-35.0 points) | 100.0% → 92.9% (-7.1 points) |
+| Efficiency | 73.9% — baseline ran, but no comparable score was available; uplift unavailable | 65.4% — 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 | 533,760 | 891,437 | -357,677 | -40.12% | skill 1/1; base 1/1 |
+| claude-code | 1 | 533,760 | 891,437 | -357,677 | -40.12% | skill 1/1; base 1/1 |
+| codex | All cases | 196,445 | 253,977 | -57,532 | -22.65% | skill 1/1; base 1/1 |
+| codex | 1 | 196,445 | 253,977 | -57,532 | -22.65% | skill 1/1; base 1/1 |
+| ALL AGENTS | Dataset aggregate | 730,205 | 1,145,414 | -415,209 | -36.25% | 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); 17 finding(s) |
+| Tier 2 | Semantic deduplication | **PASSED** | 2 validator(s); 0 finding(s) |
+| Tier 3 | Live agent evaluation | **PASS** | 2 agent(s); 1 task(s) |
+
+## Findings and Observations
+
+
+Show detailed findings and successful checks
+
+- **MEDIUM** QUALITY/quality_correctness: SKILL_SPEC recommended field missing: 'metadata.author' (`skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/SKILL.md`)
+- **MEDIUM** QUALITY/quality_correctness: SKILL_SPEC recommended field missing: 'metadata.tags' (`skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/SKILL.md`)
+- **MEDIUM** QUALITY/quality_efficiency: Deeply nested references in parameters.md (`skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/SKILL.md`)
+- **MEDIUM** SCHEMA/folder_hierarchy: Unexpected nesting depth for general skill (`skills/bionemo-agent-toolkit/skills/rfdiffusion-nim`)
+- **MEDIUM** SCHEMA/body_recommended_section: Missing recommended section: '## Instructions' (`skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/SKILL.md`)
+- 12 additional finding(s) are available in the full evaluation artifacts.
+
+
+
+## Scoring Methodology
+
+
+Show dimension definitions, source signals, and thresholds
+
+| 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).
+
+
+
+## Freshness
+
+Regenerate this benchmark when the skill, evaluation dataset, target agent/model, evaluator version, environment, or scoring policy changes.
diff --git a/skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/SKILL.md b/skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/SKILL.md
index 168c17e..3650054 100644
--- a/skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/SKILL.md
+++ b/skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/SKILL.md
@@ -10,7 +10,7 @@ allowed-tools: Bash, Read, Write, AskUserQuestion
# RFDiffusion NIM
Design protein backbone PDBs for de novo proteins, motif scaffolds, and binders.
-Use this `SKILL.md` for first-pass hosted/local usage; load supplemental files
+Use this guide for first-pass hosted/local usage; load supplemental files
only when needed:
- `references/api.md`: exact endpoints, schemas, Docker flags, response fields.
diff --git a/skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/evals/evals.json b/skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/evals/evals.json
index a20c905..3739773 100644
--- a/skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/evals/evals.json
+++ b/skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/evals/evals.json
@@ -7,41 +7,13 @@
"expected_output": "A successfully executed hosted RFDiffusion request with Bearer auth, an 80-120 residue contig range, diffusion_steps=50, and the required non-empty dummy input_pdb, plus the actual returned backbone saved as a PDB artifact and summarized from the response.",
"files": [],
"assertions": [
- {
- "id": "hosted-request-executed",
- "description": "Executes the hosted request instead of only writing code",
- "check": "Trajectory shows successful execution of the hosted request, and the final response reports actual response-derived backbone information and the saved .pdb path"
- },
- {
- "id": "hosted-endpoint-url",
- "description": "Uses the correct hosted RFDiffusion endpoint URL",
- "check": "Script contains 'health.api.nvidia.com/v1/biology/ipd/rfdiffusion/generate'"
- },
- {
- "id": "bearer-auth-header",
- "description": "Sets Authorization header with Bearer token from NGC_API_KEY",
- "check": "Script contains 'Authorization' and 'Bearer' and 'NGC_API_KEY'"
- },
- {
- "id": "contigs-length-range",
- "description": "contigs field specifies a length range for de novo generation",
- "check": "Script contains 'contigs' with a length-range string like '80-120' or similar (no chain letter prefix — de novo, not motif scaffolding)"
- },
- {
- "id": "diffusion-steps-max",
- "description": "diffusion_steps set to 50 (maximum quality)",
- "check": "Script contains 'diffusion_steps' and '50'"
- },
- {
- "id": "saves-pdb-output",
- "description": "Saves the output_pdb from the response to a PDB file",
- "check": "Script accesses 'output_pdb' from the response and writes it to a .pdb file"
- },
- {
- "id": "dummy-input-pdb-for-denovo",
- "description": "Passes a non-empty dummy input_pdb for de novo inline generation",
- "check": "Script includes an 'input_pdb' field with a minimal non-empty PDB string such as CRYST1/ATOM/END; it must not omit both input_pdb and input_pdb_asset because live hosted validation requires one of them even for de novo generation"
- }
+ "[hosted-request-executed] Executes the hosted request instead of only writing code: Trajectory shows successful execution of the hosted request, and the final response reports actual response-derived backbone information and the saved .pdb path",
+ "[hosted-endpoint-url] Uses the correct hosted RFDiffusion endpoint URL: Script contains 'health.api.nvidia.com/v1/biology/ipd/rfdiffusion/generate'",
+ "[bearer-auth-header] Sets Authorization header with Bearer token from NGC_API_KEY: Script contains 'Authorization' and 'Bearer' and 'NGC_API_KEY'",
+ "[contigs-length-range] contigs field specifies a length range for de novo generation: Script contains 'contigs' with a length-range string like '80-120' or similar (no chain letter prefix — de novo, not motif scaffolding)",
+ "[diffusion-steps-max] diffusion_steps set to 50 (maximum quality): Script contains 'diffusion_steps' and '50'",
+ "[saves-pdb-output] Saves the output_pdb from the response to a PDB file: Script accesses 'output_pdb' from the response and writes it to a .pdb file",
+ "[dummy-input-pdb-for-denovo] Passes a non-empty dummy input_pdb for de novo inline generation: Script includes an 'input_pdb' field with a minimal non-empty PDB string such as CRYST1/ATOM/END; it must not omit both input_pdb and input_pdb_asset because live hosted validation requires one of them even for de novo generation"
]
}
],
@@ -52,36 +24,12 @@
"expected_output": "A Python script that reads target.pdb, calls the hosted endpoint with contigs='A25-35/0 50-80' (or equivalent), diffusion_steps=50, and saves the scaffolded backbone PDB.",
"files": [],
"assertions": [
- {
- "id": "hosted-endpoint-url",
- "description": "Uses the correct hosted endpoint URL",
- "check": "Script contains 'health.api.nvidia.com/v1/biology/ipd/rfdiffusion/generate'"
- },
- {
- "id": "input-pdb-provided",
- "description": "Reads target.pdb and passes content as input_pdb",
- "check": "Script reads target.pdb and sends its content as 'input_pdb' in the payload"
- },
- {
- "id": "contigs-preserves-motif",
- "description": "contigs field preserves chain A residues 25-35",
- "check": "Script contains 'contigs' with a value including 'A25-35' and a generated segment like '50-80'"
- },
- {
- "id": "chain-break-syntax",
- "description": "Contigs uses /0 chain break separator between kept residues and generated segment",
- "check": "Script contigs value contains '/0' as chain break separator"
- },
- {
- "id": "diffusion-steps-set",
- "description": "diffusion_steps is set (max is 50)",
- "check": "Script contains 'diffusion_steps' with a value between 1 and 50"
- },
- {
- "id": "saves-pdb-output",
- "description": "Saves output_pdb to a PDB file",
- "check": "Script accesses 'output_pdb' and writes it to a .pdb file"
- }
+ "[hosted-endpoint-url] Uses the correct hosted endpoint URL: Script contains 'health.api.nvidia.com/v1/biology/ipd/rfdiffusion/generate'",
+ "[input-pdb-provided] Reads target.pdb and passes content as input_pdb: Script reads target.pdb and sends its content as 'input_pdb' in the payload",
+ "[contigs-preserves-motif] contigs field preserves chain A residues 25-35: Script contains 'contigs' with a value including 'A25-35' and a generated segment like '50-80'",
+ "[chain-break-syntax] Contigs uses /0 chain break separator between kept residues and generated segment: Script contigs value contains '/0' as chain break separator",
+ "[diffusion-steps-set] diffusion_steps is set (max is 50): Script contains 'diffusion_steps' with a value between 1 and 50",
+ "[saves-pdb-output] Saves output_pdb to a PDB file: Script accesses 'output_pdb' and writes it to a .pdb file"
]
},
{
@@ -90,36 +38,12 @@
"expected_output": "A Python script with input_pdb=target.pdb content, contigs referencing chain A of the target and a binder segment, hotspot_res=['A50','A51','A52','A53','A54'], calling the hosted endpoint and saving the generated binder PDB.",
"files": [],
"assertions": [
- {
- "id": "hosted-endpoint-url",
- "description": "Uses the correct hosted endpoint URL",
- "check": "Script contains 'health.api.nvidia.com/v1/biology/ipd/rfdiffusion/generate'"
- },
- {
- "id": "hotspot-res-field",
- "description": "hotspot_res field contains the specified residue identifiers",
- "check": "Script contains 'hotspot_res' with at least some of: 'A50', 'A51', 'A52', 'A53', 'A54'"
- },
- {
- "id": "contigs-binder-segment",
- "description": "contigs includes both a target chain reference and a binder generation segment",
- "check": "Script 'contigs' value includes chain A reference and a generated segment separated by '/0'"
- },
- {
- "id": "input-pdb-target",
- "description": "Reads and submits target.pdb as input_pdb",
- "check": "Script reads target.pdb and passes its content as 'input_pdb'"
- },
- {
- "id": "saves-pdb-output",
- "description": "Saves output_pdb to a PDB file",
- "check": "Script writes 'output_pdb' content to a .pdb file"
- },
- {
- "id": "hotspot-format",
- "description": "hotspot_res uses array of strings format like ['A50', 'A51']",
- "check": "Script 'hotspot_res' is a list/array of strings in 'ChainResidue' format"
- }
+ "[hosted-endpoint-url] Uses the correct hosted endpoint URL: Script contains 'health.api.nvidia.com/v1/biology/ipd/rfdiffusion/generate'",
+ "[hotspot-res-field] hotspot_res field contains the specified residue identifiers: Script contains 'hotspot_res' with at least some of: 'A50', 'A51', 'A52', 'A53', 'A54'",
+ "[contigs-binder-segment] contigs includes both a target chain reference and a binder generation segment: Script 'contigs' value includes chain A reference and a generated segment separated by '/0'",
+ "[input-pdb-target] Reads and submits target.pdb as input_pdb: Script reads target.pdb and passes its content as 'input_pdb'",
+ "[saves-pdb-output] Saves output_pdb to a PDB file: Script writes 'output_pdb' content to a .pdb file",
+ "[hotspot-format] hotspot_res uses array of strings format like ['A50', 'A51']: Script 'hotspot_res' is a list/array of strings in 'ChainResidue' format"
]
},
{
@@ -129,36 +53,12 @@
"expected_output": "Docker setup instructions using shell env first and optional repo-root .env overrides, requiring NGC_API_KEY or NVIDIA_API_KEY fallback plus LOCAL_NIM_CACHE, with the correct image (:2 tag), single GPU flag, cache mount, health check loop, then a local no-auth prediction script targeting localhost:8000 without /v1/ prefix and passing a non-empty dummy input_pdb for de novo generation.",
"files": [],
"assertions": [
- {
- "id": "docker-image-tag",
- "description": "References the correct RFDiffusion container image with :2 tag",
- "check": "Output contains 'nvcr.io/nim/ipd/rfdiffusion' and ':2'"
- },
- {
- "id": "single-gpu-flag",
- "description": "Uses single GPU device specification (device=0)",
- "check": "Output contains '--gpus' and 'device=0'"
- },
- {
- "id": "env-contract-and-cache",
- "description": "Local setup uses the repo env contract and LOCAL_NIM_CACHE",
- "check": "Output sources repo-root .env only if present, supports NVIDIA_API_KEY fallback to NGC_API_KEY, requires LOCAL_NIM_CACHE, and mounts LOCAL_NIM_CACHE to /opt/nim/.cache"
- },
- {
- "id": "health-check",
- "description": "Includes health check before submitting prediction",
- "check": "Output contains health check against localhost:8000/v1/health/ready"
- },
- {
- "id": "local-endpoint-no-v1",
- "description": "Local inference URL has no /v1/ prefix",
- "check": "Script contains 'localhost:8000/biology/ipd/rfdiffusion/generate'"
- },
- {
- "id": "de-novo-contigs",
- "description": "Local de novo request includes contigs plus required dummy input_pdb",
- "check": "Script contains 'contigs' with a value like '100', 'diffusion_steps', and a non-empty dummy 'input_pdb' string"
- }
+ "[docker-image-tag] References the correct RFDiffusion container image with :2 tag: Output contains 'nvcr.io/nim/ipd/rfdiffusion' and ':2'",
+ "[single-gpu-flag] Uses single GPU device specification (device=0): Output contains '--gpus' and 'device=0'",
+ "[env-contract-and-cache] Local setup uses the repo env contract and LOCAL_NIM_CACHE: Output sources repo-root .env only if present, supports NVIDIA_API_KEY fallback to NGC_API_KEY, requires LOCAL_NIM_CACHE, and mounts LOCAL_NIM_CACHE to /opt/nim/.cache",
+ "[health-check] Includes health check before submitting prediction: Output contains health check against localhost:8000/v1/health/ready",
+ "[local-endpoint-no-v1] Local inference URL has no /v1/ prefix: Script contains 'localhost:8000/biology/ipd/rfdiffusion/generate'",
+ "[de-novo-contigs] Local de novo request includes contigs plus required dummy input_pdb: Script contains 'contigs' with a value like '100', 'diffusion_steps', and a non-empty dummy 'input_pdb' string"
]
}
]
diff --git a/skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/skill-card.md b/skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/skill-card.md
new file mode 100644
index 0000000..d683bf7
--- /dev/null
+++ b/skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/skill-card.md
@@ -0,0 +1,86 @@
+## Description:
+Run RFDiffusion protein backbone design via NVIDIA NIM for de novo protein backbones, motif scaffolding, binder design, and PDB backbone outputs for downstream ProteinMPNN sequence design.
+
+This skill is ready for commercial/non-commercial use.
+
+## Owner
+NVIDIA
+
+### License/Terms of Use:
+Apache-2.0 AND CC-BY-4.0
+## Use Case:
+Developers and computational biologists use this skill to design protein backbone structures — de novo, motif scaffolding, or binder design — via the NVIDIA RFDiffusion NIM API (hosted or local Docker).
+
+### Deployment Geography for Use:
+Global
+
+## Requirements / Dependencies:
+**Requires API Key or External Credential:** [Yes]
+**Credential Type(s):** [API key]
+
+Do not include secrets in prompts/logs/output; use least-privilege credentials; rotate keys as appropriate.
+
+## Known Risks and Mitigations:
+Risk: Review before execution as proposals could introduce incorrect or misleading guidance into skills.
+Mitigation: Review and scan skill before deployment.
+
+## Reference(s):
+- [RFDiffusion NIM — API Reference](references/api.md)
+- [RFDiffusion Examples](references/examples.md)
+- [RFDiffusion Parameter Guidance](references/parameters.md)
+- [RFDiffusion Science Notes](references/science.md)
+- [RFDiffusion Validation](references/validation.md)
+
+
+## Skill Output:
+**Output Type(s):** [API Calls, Files]
+**Output Format:** [PDB text files and JSON API responses]
+**Output Parameters:** [1D]
+**Other Properties Related to Output:** [None]
+
+## Evaluation Agents Used:
+- Claude Code (`aws/anthropic/bedrock-claude-opus-4-8`)
+- Codex (`openai/openai/gpt-5.5`)
+
+
+
+## Evaluation Tasks:
+1 evaluation task (1 positive case), 3 attempts per task, each in an isolated sandbox pod.
+
+## Evaluation Metrics Used:
+Reported benchmark dimensions:
+- Security: Checks for unsafe operations, secret leakage, and unauthorized access.
+- Correctness: Final-answer correctness against the reference answer.
+- Discoverability: Whether the expected skill was selected and the workflow executed.
+- Effectiveness: Equal-weight mean of goal completion and expected workflow adherence.
+- Efficiency: Tool-call productivity (50%) and token efficiency (50%).
+
+Underlying evaluation signals used in this run:
+- `security`: Unsafe operations, secret leakage, and unauthorized access.
+- `accuracy`: Final-answer correctness against the reference answer.
+- `skill_execution`: Whether the expected skill was selected, decoys were avoided, and the workflow executed.
+- `goal_accuracy`: Whether the user's goal was achieved.
+- `behavior_check`: Whether the expected workflow behavior was followed.
+- `skill_efficiency`: Tool-call productivity.
+- `token_efficiency`: Actual uncached prompt plus completion token usage.
+
+
+
+## Evaluation Results:
+| Measure | Claude Code (Baseline → Skill Uplift) | Codex (Baseline → Skill Uplift) |
+|---|---:|---:|
+| Overall | 67.8% | 90.6% |
+| Security | 100.0% → 0.0% (-100.0 pts) | 50.0% → 100.0% (+50.0 pts) |
+| Correctness | 100.0% → 100.0% (±0.0 pts) | 0.0% → 100.0% (+100.0 pts) |
+| Discoverability | 100.0% | 95.0% |
+| Effectiveness | 100.0% → 65.0% (-35.0 pts) | 100.0% → 92.9% (-7.1 pts) |
+| Efficiency | 73.9% | 65.4% |
+
+## Skill Version(s):
+0.1.0 (source: pyproject.toml)
+
+## Ethical Considerations:
+NVIDIA believes Trustworthy AI is a shared responsibility and we have established policies and practices to enable development for a wide array of AI applications. When downloaded or used in accordance with our terms of service, developers should work with their internal team to ensure this skill meets requirements for the relevant industry and use case and addresses unforeseen product misuse.
+
+(For Release on NVIDIA Platforms Only)
+Please report quality, risk, security vulnerabilities or NVIDIA AI Concerns [here](https://app.intigriti.com/programs/nvidia/nvidiavdp/detail).
diff --git a/skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/skill.oms.sig b/skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/skill.oms.sig
new file mode 100644
index 0000000..3852f34
--- /dev/null
+++ b/skills/bionemo-agent-toolkit/skills/rfdiffusion-nim/skill.oms.sig
@@ -0,0 +1 @@
+{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"x509CertificateChain":{"certificates":[{"rawBytes":"MIICgzCCAgmgAwIBAgIUKIyS7SxNteQIiWzK1dWj85E6520wCgYIKoZIzj0EAwMwVTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjEpMCcGA1UEAwwgTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBJQ0EgMDEwHhcNMjYwNDAxMDAwMDAwWhcNMjgwNDIyMTUzMzA5WjBUMQswCQYDVQQGEwJVUzEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMSgwJgYDVQQDDB9OVklESUEgQWdlbnQgU2tpbGxzIFNpZ25pbmcgMDAxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEYoRM9bQl/dGlwSRNi6bTpIJUXH8Nv9GciP6LSflJYYMLCc296kpyuTSsk5ddbAWiDcFX3C/ydX3jwc+qCLYP6uHy9XphyLjOQ27Yb2J6rBLVtRBS1mgGco/Gr7fL6ODco4GaMIGXMB0GA1UdDgQWBBRQ/5ZW3nJ6lmo9SVk7I15o7UGmpTAfBgNVHSMEGDAWgBRPGpILxMBBleJSsBGjrMKsby1CgjAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIHgDA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAKBggqhkjOPQQDAwNoADBlAjAUygu/GiOCIXrgGr4SmLgeEVDcEitfFUv7ALbvLVGVyMysB3mxmO/uInZfXzWcJZsCMQDxuoxj4ZmO30jhkPIcCxGFCOvnUsnfU3TfGcouYm4M6iRpbKvtVnHPiy4bi6pcKf0="},{"rawBytes":"MIICiDCCAg6gAwIBAgIUZsIuSv9NkpJCNqtYEfCouVv5BzowCgYIKoZIzj0EAwMwUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTAgFw0yNjA0MDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowVTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjEpMCcGA1UEAwwgTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBJQ0EgMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASI72cR3ctKGg4VWnB3bNja6g1Z2PnOmFEopkPof+QeIcPk9rT+g9MjJnq51EQXL93a7C2GJ9J985G4o2V85VD7wJ1RaXhluHW2rf3y8bQGeAYaKMr5s/hUgn+M3/9WlWejgaAwgZ0wHQYDVR0OBBYEFE8akgvEwEGV4lKwEaOswqxvLUKCMB8GA1UdIwQYMBaAFItnoAjjfuCEUvzyvWyI2vOGvwPjMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMDcGCCsGAQUFBwEBBCswKTAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AubmRpcy5udmlkaWEuY29tMAoGCCqGSM49BAMDA2gAMGUCMQCeIMMfAbyzPDacw2MxG+Yt1cikrJX/DVxiGfXuHmkkXn6VgSzE79+lkqDErpVO2gYCMCNEColOyvUvkzZGUEI1hQ3PfMgi3FIo9tHoBKMw4/wGBLFpu/0ubtmbBXM6/UMOEw=="},{"rawBytes":"MIICRTCCAcygAwIBAgIUeJdY3rV86EdvFmG7L8LJBsyQFYkwCgYIKoZIzj0EAwMwUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTAgFw0yNjA0MDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABAYpiXCDjJ9NT2eSDhyHJVSw1Tbze18cGG2F/578oWvHxg23eQAhNRYdq88i1iOshZSO6C29doKui5Xpmo/7Ctw9Sx4PP2RzOmIuOLCuTdNtKcTRwi4GEsd5BAFvWj42M6NjMGEwHQYDVR0OBBYEFItnoAjjfuCEUvzyvWyI2vOGvwPjMB8GA1UdIwQYMBaAFItnoAjjfuCEUvzyvWyI2vOGvwPjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMCwtAjWLaNwgGWNCgdyNoTyvNhqWRECRJV2r3+7w8g0PL6NHLOsbkgE09BH95h8XlgIwTaQmbbUh2ChAJ5TA1wRiVDnCcvbzHlZl2jM2FcwQQZlk19LOAbyGMRixbu2Ww/rj"}]},"tlogEntries":[]},"dsseEnvelope":{"payload":"ewogICJfdHlwZSI6ICJodHRwczovL2luLXRvdG8uaW8vU3RhdGVtZW50L3YxIiwKICAic3ViamVjdCI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAicmZkaWZmdXNpb24tbmltIiwKICAgICAgImRpZ2VzdCI6IHsKICAgICAgICAic2hhMjU2IjogIjI4NDcyYTFiMWViYWI3MzAyOTQ2YTk5YzI1MGVkM2E1Y2RhNzg1NTFjMjEyN2EzNmNlNjllZjczODhhNmE5OTUiCiAgICAgIH0KICAgIH0KICBdLAogICJwcmVkaWNhdGVUeXBlIjogImh0dHBzOi8vbW9kZWxfc2lnbmluZy9zaWduYXR1cmUvdjEuMCIsCiAgInByZWRpY2F0ZSI6IHsKICAgICJzZXJpYWxpemF0aW9uIjogewogICAgICAibWV0aG9kIjogImZpbGVzIiwKICAgICAgImlnbm9yZV9wYXRocyI6IFsKICAgICAgICAiLmdpdGF0dHJpYnV0ZXMiLAogICAgICAgICIuZ2l0aWdub3JlIiwKICAgICAgICAiLmdpdCIsCiAgICAgICAgIi5naXRodWIiCiAgICAgIF0sCiAgICAgICJoYXNoX3R5cGUiOiAic2hhMjU2IiwKICAgICAgImFsbG93X3N5bWxpbmtzIjogZmFsc2UKICAgIH0sCiAgICAicmVzb3VyY2VzIjogWwogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJkaWdlc3QiOiAiZjM2NDc5ZWQxM2RlZGUwODIxODI3YjVlYWY5ZmE4NGMwYjllNjU3YTQyODNiMzU1ZmJlZjBkYTliMTI5ZjNkNCIsCiAgICAgICAgIm5hbWUiOiAiQkVOQ0hNQVJLLm1kIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJkaWdlc3QiOiAiNmMxNjVjOTI5ZDFiZDhhZmMzZjA2NzQ4OTlmZjUzNGExNzVmMjgzYWFlNjFiM2U5YzI5NmQ4ZjJlMzA3NmExOSIsCiAgICAgICAgIm5hbWUiOiAiU0tJTEwubWQiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICI5YjI2YjZjNGMxNDE4OGNkYjlhZTMzNGViZjE5ODBiNjA4MjJhOTY3NzIzZTZjMzkyMTU4NGUzOGE4MDdmMGQzIiwKICAgICAgICAibmFtZSI6ICJjb25maWcvc2tpbGxzcGVjdG9yLWJhc2VsaW5lLnltbCIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAiZGlnZXN0IjogImJhMmI4Y2YwZWFkMTNiZmI2NWQ4MTMwOWUxNjMxNjJkYmMyYzZjNTA1ODk2NGM0YWVhNDE0ZTAwNzA4OThhOGEiLAogICAgICAgICJuYW1lIjogImV2YWxzL2NvbmZpZy55bWwiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICIwMTZjYzkyNmZmYzBjNDY5OGI2ZDEyN2FiMGE5ZWVlNWJlODU4N2JlYWZlMmM2NTg1YWJjYmZlY2VhMjc3NDk4IiwKICAgICAgICAibmFtZSI6ICJldmFscy9ldmFscy5qc29uIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJkaWdlc3QiOiAiOTAyZTJmOTc2MjFiZjU5OWQ3OGFmNzZlMDVkMWE1NTBmNTQxYjk1ODM1NWE4MWU2OTJjZjQzMzg0ODU5MDMxZSIsCiAgICAgICAgIm5hbWUiOiAiZXZhbHMvdHJpZ2dlcl9ldmFscy5qc29uIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJkaWdlc3QiOiAiNWE1Yjc3ZTdjMjQ4YTgxNWVlNjEzODAwYzMxOTNhNTkwMjE1YTE2NDkzZDhkMTMwYzY1OTc2OTBjMDYzNzRlNiIsCiAgICAgICAgIm5hbWUiOiAicmVmZXJlbmNlcy9hcGkubWQiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICJmNDA4YjE4OWJkZThiOGEwMTgzNTkxNzViZjUyNmQ3N2ExNjdiNzhjYzhhZDc1M2IxMDg0M2U5YWUwYjM4M2I5IiwKICAgICAgICAibmFtZSI6ICJyZWZlcmVuY2VzL2V4YW1wbGVzLm1kIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJkaWdlc3QiOiAiNjQxN2VlZGJmZjVlY2U0ZTk4OTZjOWQ4YzZlODFmNTQxMzFkOWJmYjI1Y2QxNGQxYjJjYmM0YzQyZjZlOWJhMCIsCiAgICAgICAgIm5hbWUiOiAicmVmZXJlbmNlcy9wYXJhbWV0ZXJzLm1kIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJkaWdlc3QiOiAiZWJhYTMxZjRlNDAwNjNiNjNlYmMzMjdjMDgwYTI2OTM5NGViYjA0NjMzYzVhMmE3MzY5MDk2ZGMzMzg1ZDA5YyIsCiAgICAgICAgIm5hbWUiOiAicmVmZXJlbmNlcy9zY2llbmNlLm1kIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJkaWdlc3QiOiAiZmJkZDQxMWZiOTRiOTQ5NTBmOWY5MzcyNDhhOTBlZDgzMGQ1ZjczOTlkMDQ3MzE0YzAyM2FhZGExYTg0MDFiZCIsCiAgICAgICAgIm5hbWUiOiAicmVmZXJlbmNlcy92YWxpZGF0aW9uLm1kIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJkaWdlc3QiOiAiM2FkN2NmOTkxOGJlOWYzOGNmOGZmNzg2MjU4YmZiZGU3MTYxYTY0MjZjN2E4YjAyYzk0YTY1ZWM4YjI5ZTdkMSIsCiAgICAgICAgIm5hbWUiOiAic2tpbGwtY2FyZC5tZCIKICAgICAgfQogICAgXQogIH0KfQ==","payloadType":"application/vnd.in-toto+json","signatures":[{"sig":"MGQCMDms+eYg5lHdq/h+T4VVjS1agy1P2AErfb30ZWDuBGQKfvXTz29nFwLhU1EKiu+MuwIwbRcx8HCqfqqvf8rNxgsiMzsWtE9dadFgDBfHFfGQD78x3R+lXyiRdNyuYSHbDSmR","keyid":""}]}}
\ No newline at end of file