Skip to content

chore(skills): add NVIDIA skills bundle artifacts#5546

Open
Musab1233 wants to merge 1 commit into
NVIDIA:mainfrom
Musab1233:cursor/add-accelerated-cudf-skills
Open

chore(skills): add NVIDIA skills bundle artifacts#5546
Musab1233 wants to merge 1 commit into
NVIDIA:mainfrom
Musab1233:cursor/add-accelerated-cudf-skills

Conversation

@Musab1233

@Musab1233 Musab1233 commented Jun 18, 2026

Copy link
Copy Markdown

Summary

Adds the NVIDIA skills bundle artifacts generated for .agents/skills, including new skill packages, benchmark/eval assets, and updated NemoClaw user-skill generated files.

Related Issue

N/A

Changes

  • Add large set of new skill directories under .agents/skills.
  • Update generated NemoClaw user-skill markdown/eval/reference artifacts.
  • Add skills-lock.json for installed skill bundle state.

Type of Change

  • Code change (feature, bug fix, or refactor)
  • Code change with doc updates
  • Doc only (prose changes, no code sample modifications)
  • Doc only (includes code sample changes)

Verification

  • PR description includes the DCO sign-off declaration and every commit appears as Verified in GitHub
  • Git hooks passed during commit and push, or npx prek run --from-ref main --to-ref HEAD passes
  • Targeted tests pass for changed behavior
  • Full npm test passes (broad runtime changes only)
  • Tests added or updated for new or changed behavior
  • No secrets, API keys, or credentials committed
  • Docs updated for user-facing behavior changes
  • npm run docs builds without warnings (doc changes only)
  • Doc pages follow the style guide (doc changes only)
  • New doc pages include SPDX header and frontmatter (new pages only)

Signed-off-by: Musab musab@local

Summary by CodeRabbit

  • New Features

    • Added comprehensive agent skills for AI-Q deployment, deep research, CUDA-Q guidance, cuDF acceleration, cuOpt optimization (routing, numerical, formulation), and related functionality
    • Included benchmark evaluations, skill documentation, reference guides, and working examples for each skill
  • Documentation

    • Added detailed skill cards, benchmark reports, and reference materials covering installation, usage patterns, troubleshooting, and API guidance across multiple domains

@copy-pr-bot

copy-pr-bot Bot commented Jun 18, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@coderabbitai

coderabbitai Bot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

This PR adds multiple .agents/skills packages and updates existing skill directories with new skill definitions, references, eval datasets, runnable example assets, benchmark reports, skill cards, and signature artifacts across cuDF, AIQ, CUDA-Q, cuOpt, cuPyNumeric, and portfolio-related areas.

Changes

Skill package additions

Layer / File(s) Summary
Accelerated computing cuDF skill and fixtures
.agents/skills/accelerated-computing-cudf/*, .agents/skills/accelerated-computing-cudf/evals/files/*
Adds the cuDF skill guide, reference docs, eval definitions, benchmark/card/signature files, and multiple runnable pandas/CUDA fixtures covering UDFs, ETL, joins, nulls, parquet, reshape, strings, timeseries, windows, and stream handoff cases.
AIQ, CUDA-Q, and cuFOLIO skills
.agents/skills/aiq-*/*, .agents/skills/cudaq-guide/*, .agents/skills/cufolio/*
Adds AIQ deploy/research skill docs and evals, a new aiq.py helper CLI, CUDA-Q guidance/evals, and cuFOLIO portfolio guidance with evaluation data and workflow reference recipes.
cuOpt skill suite and examples
.agents/skills/cuopt-*/*
Adds multiple cuOpt skill packages for install, developer workflow, formulation, routing, server, numerical optimization APIs, user rules, and skill evolution, along with eval sets, reference docs, REST/Python/C example assets, MPS fixtures, benchmark reports, skill cards, and signatures.
cuPyNumeric skills and assessment assets
.agents/skills/cupynumeric-*/*
Adds cuPyNumeric HDF5 and install skills plus a migration-readiness skill with API support docs, sample reports, scaling/blocker/refactor example fixtures, evals, benchmark files, and signatures.

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Suggested labels

area: skills, chore, documentation

Suggested reviewers

  • cv
  • miyoungc

Poem

🐇 I hopped through docs in a moonlit spree,
With evals and fixtures beneath each tree.
New skills now rustle in markdown leaves,
While scripts hum softly in code-warm eaves.
A tidy burrow of guides now gleams,
Stuffed full of benchmarks, signs, and dreams.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 54.86% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically summarizes the main change: adding NVIDIA skills bundle artifacts to the repository.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@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: 18

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.agents/skills/cupynumeric-migration-readiness/BENCHMARK.md (1)

1-96: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Address evaluation FAIL findings before publication.

The benchmark report shows an overall verdict of FAIL with 7 total findings that should be addressed:

Tier 1 findings (6 issues):

  • MEDIUM: Instructions don't mention 'run_script'
  • MEDIUM: Deeply nested references in idioms-that-block.md
  • LOW: Description very long (815 chars, recommend 50-150)
  • LOW: Broad description without negative triggers may cause over-triggering
  • LOW: No prerequisites/requirements documented

Tier 2 findings (1 issue):

  • HIGH: Duplicate content found across assets/sample_report.md and references/case-studies.md (lines 115-248)

The publication recommendation (line 95) advises reviewing and rerunning NVSkills-Eval after addressing these findings.

🤖 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/cupynumeric-migration-readiness/BENCHMARK.md around lines 1 -
96, The skill failed evaluation due to 7 findings across Tier 1 and Tier 2
validation. Address the Tier 1 issues in SKILL.md by: adding 'run_script' to the
instructions section, simplifying the deeply nested references in the
idioms-that-block.md content, reducing the description from 815 characters to
50-150 characters, adding explicit negative triggers to prevent over-triggering,
and documenting prerequisites and requirements. For Tier 2, eliminate the
duplicate content found across assets/sample_report.md and
references/case-studies.md by consolidating the overlapping sections (verdict,
findings, and recommended next steps sections from lines 115-248) into a single
source of truth, then update all references accordingly. Rerun NVSkills-Eval
after addressing these findings to refresh the benchmark.
🟡 Minor comments (17)
.agents/skills/accelerated-computing-cudf/evals/files/cudf-csv-etl/code/etl_pipeline.py-60-62 (1)

60-62: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Potential division-by-zero or NaN when computing avg_discount_impact.

Line 60–62 computes 1 - summary["total_discounted"] / summary["total_revenue"] without safeguarding against zero denominator. If any total_revenue is 0 (e.g., due to an empty group or filtering quirk), this produces NaN, which may propagate and cause issues downstream.

Add a guard or assertion to ensure all total_revenue values are positive:

assert (summary["total_revenue"] > 0).all(), "Found zero total_revenue in aggregated groups"
summary["avg_discount_impact"] = (
    1 - summary["total_discounted"] / summary["total_revenue"]
)

Alternatively, use .clip() to cap the denominator:

summary["avg_discount_impact"] = (
    1 - summary["total_discounted"] / summary["total_revenue"].clip(lower=1e-9)
)
🤖 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/accelerated-computing-cudf/evals/files/cudf-csv-etl/code/etl_pipeline.py
around lines 60 - 62, The calculation of avg_discount_impact performs a division
by summary["total_revenue"] without protecting against zero denominators, which
can produce NaN values and cause issues downstream. Before computing
avg_discount_impact, add a guard to ensure all total_revenue values are
positive. You can either add an assertion that checks (summary["total_revenue"]
> 0).all() to fail early if any zero values exist, or apply .clip(lower=1e-9) to
the total_revenue denominator to ensure a minimum threshold and prevent division
by zero. Choose the approach that best fits your data validation strategy.
.agents/skills/cuopt-numerical-optimization-api-python/assets/mps_solver/README.md-69-84 (1)

69-84: ⚠️ Potential issue | 🟡 Minor

Replace deprecated Problem.readMPS() with Problem.read().

Line 74 uses Problem.readMPS(), which is deprecated in current cuOpt versions. The unified Problem.read() method should be used instead—it automatically handles MPS, QPS, and LP file formats based on file extension.

Change line 74 from:

problem = Problem.readMPS("path/to/problem.mps")

to:

problem = Problem.read("path/to/problem.mps")
🤖 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/cuopt-numerical-optimization-api-python/assets/mps_solver/README.md
around lines 69 - 84, The code example in the README uses the deprecated
Problem.readMPS() static method to load MPS files. Replace the Problem.readMPS()
call with the unified Problem.read() method, which automatically detects the
file format (MPS, QPS, or LP) based on file extension and is the current
recommended approach in cuOpt.
.agents/skills/accelerated-computing-cudf/evals/files/cudf-null-handling/code/null_pipeline.py-78-78 (1)

78-78: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Unused loop variable station.

The loop variable station is not used within the loop body. Prefix it with an underscore to indicate it's intentionally unused.

♻️ Proposed fix
-    for station, group in df.groupby("station_code"):
+    for _station, group in df.groupby("station_code"):
🤖 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/accelerated-computing-cudf/evals/files/cudf-null-handling/code/null_pipeline.py
at line 78, The loop variable `station` in the groupby iteration is unused
within the loop body. Rename this variable to `_station` to follow Python
convention for intentionally unused variables, which will suppress linting
warnings. Keep the `group` variable unchanged since it is actively used in the
loop.

Source: Linters/SAST tools

.agents/skills/accelerated-computing-cudf/evals/files/cudf-null-handling/code/null_pipeline.py-131-131 (1)

131-131: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Unused unpacked variables report and group_nulls.

The variables report and group_nulls are unpacked from analyze_nulls() but never used afterward. Either use them or prefix with underscores to indicate they're intentionally unused.

♻️ Proposed fix
-    report, group_nulls = analyze_nulls(df)
+    _report, _group_nulls = analyze_nulls(df)
🤖 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/accelerated-computing-cudf/evals/files/cudf-null-handling/code/null_pipeline.py
at line 131, The variables `report` and `group_nulls` are unpacked from the
`analyze_nulls()` function call but are never used in the subsequent code.
Prefix these variable names with underscores (e.g., `_report` and
`_group_nulls`) to explicitly indicate that these unpacked variables are
intentionally unused and suppress linting warnings about unused variables.

Source: Linters/SAST tools

.agents/skills/accelerated-computing-cudf/evals/files/cudf-native-stream-handoff-boundary/code/threaded_handoff.cu-82-105 (1)

82-105: ⚠️ Potential issue | 🟡 Minor

Add clarifying comments about intentional missing stream synchronization.

The observation is accurate: consume_on_stream reads table->data on consumer_stream (line 94) without explicit synchronization with table->producer_stream. However, this is intentional. NOTICE.md states the fixture focuses on "cross-stream consumption" and "device-memory lifetime ordering", and main() explicitly counts failures (line 127) and reports "stale handoff checks observed" (line 133).

This fixture is designed to demonstrate stream ordering hazards. Instead of adding synchronization, clarify the intent with inline comments explaining that the missing cudaStreamWaitEvent() or stream synchronization is intentional to demonstrate reading stale/uninitialized data across streams. This prevents confusion and documents the teaching purpose.

🤖 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/accelerated-computing-cudf/evals/files/cudf-native-stream-handoff-boundary/code/threaded_handoff.cu
around lines 82 - 105, Add inline comments to the consume_on_stream function to
clarify that the intentional lack of synchronization between consumer_stream and
the producer_stream (when reading table->data on line 94) is by design. Place a
comment before the checksum_kernel launch explaining that this missing
cudaStreamWaitEvent() or stream synchronization is intentional to demonstrate
cross-stream consumption hazards and the potential for reading stale or
uninitialized data. This documents the teaching purpose of the fixture and
prevents confusion about the missing synchronization.
.agents/skills/accelerated-computing-cudf/evals/files/cudf-native-stream-handoff-boundary/code/threaded_handoff.cu-61-69 (1)

61-69: ⚠️ Potential issue | 🟡 Minor

Missing stream synchronization in destructor—intentional teaching bug that requires fixing.

The destructor (lines 61–69) frees data and destroys producer_stream without synchronizing. The build_table_async function launches fill_kernel on producer_stream asynchronously (line 77), and consume_on_stream reads table->data from a different stream without waiting for the producer to complete. When the table is destroyed, the destructor runs immediately, creating a race condition.

The NOTICE confirms this is intentional: the fixture is designed to demonstrate "device-memory lifetime ordering" issues. The main loop counting "stale handoff checks" (line 133) confirms the code exhibits this bug by design.

Fix: Synchronize producer_stream before cleanup.

Synchronize producer stream before cleanup
   ~NativeGpuTable()
   {
+    if (producer_stream != nullptr) {
+      cudaStreamSynchronize(producer_stream);
+    }
     if (data != nullptr) {
       cudaFree(data);
     }
     if (producer_stream != nullptr) {
       cudaStreamDestroy(producer_stream);
     }
   }
🤖 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/accelerated-computing-cudf/evals/files/cudf-native-stream-handoff-boundary/code/threaded_handoff.cu
around lines 61 - 69, The destructor ~NativeGpuTable() frees data and destroys
producer_stream without synchronizing, creating a race condition since
build_table_async launches fill_kernel asynchronously on producer_stream while
consume_on_stream may still be reading from data. Add a synchronization call on
producer_stream (such as cudaStreamSynchronize) before the if statements that
free data and destroy producer_stream to ensure all pending operations on
producer_stream complete before cleanup.
.agents/skills/cuopt-routing-api-python/SKILL.md-56-58 (1)

56-58: ⚠️ Potential issue | 🟡 Minor

Add missing numpy import to the precedence constraint example.

The code snippet on line 57 uses np.array([0, 1]) but NumPy is not imported in the markdown example. Users copying this code will encounter NameError: name 'np' is not defined.

Either add the import to the example:

import numpy as np
dm.add_order_precedence(node_id=2, preceding_nodes=np.array([0, 1]))

Or use a Python list if the method accepts it:

dm.add_order_precedence(node_id=2, preceding_nodes=[0, 1])
🤖 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/cuopt-routing-api-python/SKILL.md around lines 56 - 58, The
precedence constraint example using dm.add_order_precedence() contains a
reference to np.array() but lacks the required numpy import statement at the
beginning of the code snippet. Either add import numpy as np at the start of the
example code block before the dm.add_order_precedence() call, or replace the
np.array([0, 1]) argument with a plain Python list [0, 1] if the method accepts
it, to ensure users can run the example without encountering a NameError.
.agents/skills/accelerated-computing-cudf/evals/files/cudf-parquet-io/code/generate_data.py-6-8 (1)

6-8: ⚠️ Potential issue | 🟡 Minor

Add a requirements.txt or dependency declaration for eval assets.

The eval scripts import numpy and pandas (and likely cudf), but there is no requirements.txt, environment.yml, or dependency declaration in the eval asset directory or root pyproject.toml to document these requirements. Users running generate_data.py or parquet_pipeline.py will encounter import errors without knowing what to install. Add a requirements file to the eval asset directory or update the skill documentation to list the required Python packages.

🤖 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/accelerated-computing-cudf/evals/files/cudf-parquet-io/code/generate_data.py
around lines 6 - 8, The eval scripts generate_data.py and parquet_pipeline.py
import required packages like numpy, pandas, and cudf but lack any dependency
declaration. Create a requirements.txt file in the eval asset directory that
documents all required Python packages and their versions needed to run these
scripts. Ensure the requirements file includes all imports used across the eval
scripts so users can easily install dependencies with pip install -r
requirements.txt before attempting to run the evaluation code.
.agents/skills/accelerated-computing-cudf/evals/files/cudf-pivot-melt/code/reshape_analysis.py-139-146 (1)

139-146: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Guard against division by zero in growth rate calculations.

If a store has zero revenue in the base year (2022 or 2023), the division will produce inf or NaN. Consider filtering out zero-revenue stores or using a small epsilon to avoid this edge case.

🛡️ Proposed fix with zero-revenue check
     if "revenue_2023" in yoy.columns and "revenue_2022" in yoy.columns:
-        yoy["growth_22_23"] = (
-            (yoy["revenue_2023"] - yoy["revenue_2022"]) / yoy["revenue_2022"]
-        ).round(4)
+        yoy["growth_22_23"] = (
+            (yoy["revenue_2023"] - yoy["revenue_2022"]) / yoy["revenue_2022"].replace(0, np.nan)
+        ).round(4)
     if "revenue_2024" in yoy.columns and "revenue_2023" in yoy.columns:
-        yoy["growth_23_24"] = (
-            (yoy["revenue_2024"] - yoy["revenue_2023"]) / yoy["revenue_2023"]
-        ).round(4)
+        yoy["growth_23_24"] = (
+            (yoy["revenue_2024"] - yoy["revenue_2023"]) / yoy["revenue_2023"].replace(0, np.nan)
+        ).round(4)
🤖 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/accelerated-computing-cudf/evals/files/cudf-pivot-melt/code/reshape_analysis.py
around lines 139 - 146, The growth rate calculations for growth_22_23 and
growth_23_24 lack protection against division by zero when the base year revenue
(revenue_2022 or revenue_2023 respectively) is zero, which will produce inf or
NaN values. Before performing each division operation, add a condition to check
that the denominator is not equal to zero. You can either use a mask to filter
out rows where the denominator is zero before calculating the growth rate, or
use a conditional expression to set growth rates to NaN or a placeholder value
only when the denominator is positive, ensuring zero-revenue base years are
handled gracefully.
.agents/skills/accelerated-computing-cudf/evals/files/cudf-string-ops/code/clean_contacts.py-31-38 (1)

31-38: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Clarify or revise the company email classification logic.

The is_company_email flag is set when the domain ends with .org or .net, but this logic seems questionable. Typically, "company email" would refer to corporate/business domains rather than generic TLDs like .org or .net. Many personal emails use .net domains, and .org is commonly used by non-profits and personal projects.

Consider either:

  • Renaming to is_org_or_net_email to reflect what it actually checks
  • Revising the logic to match actual company email patterns (e.g., checking against a whitelist of known corporate domains)
  • Documenting the intended business logic if this is correct for the evaluation dataset
🤖 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/accelerated-computing-cudf/evals/files/cudf-string-ops/code/clean_contacts.py
around lines 31 - 38, The `is_company_email` flag in the clean_emails function
uses questionable logic by checking if the email domain ends with .org or .net,
which does not accurately represent company emails since personal emails
commonly use these TLDs. Either rename the `is_company_email` column to
`is_org_or_net_email` to accurately reflect what it checks, or revise the regex
pattern in the str.contains call to match actual company domain patterns (such
as checking against known corporate domains), or add a comment explaining the
intended business logic for the evaluation dataset if this classification is
intentional.
.agents/skills/cuopt-numerical-optimization-api-cli/assets/README.md-21-21 (1)

21-21: ⚠️ Potential issue | 🟡 Minor

Fix inconsistent option name in assets/README.md line 21.

The line uses --mip-relative-gap, but the correct option name is --mip-relative-tolerance (as documented in SKILL.md lines 33 and 45). Update to match:

Use the same pattern for the other MPS files; for MILP, add e.g. `--mip-relative-tolerance 0.01`.
🤖 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/cuopt-numerical-optimization-api-cli/assets/README.md at line
21, In the README.md example that shows adding an option for MILP files with a
value of 0.01, replace the option name `--mip-relative-gap` with
`--mip-relative-tolerance` to match the correct documented option name used in
the SKILL.md file.
.agents/skills/cuopt-server-api-python/assets/vrp_basic/client.py-21-26 (1)

21-26: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Catch specific exception type instead of bare Exception.

Line 25 catches Exception broadly, which masks programming errors. Catch requests.RequestException specifically to handle network errors while allowing unexpected exceptions to propagate.

 def server_ok():
     try:
         r = requests.get(f"{SERVER}/cuopt/health", timeout=2)
         return r.status_code == 200
-    except Exception:
+    except requests.RequestException:
         return False
🤖 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/cuopt-server-api-python/assets/vrp_basic/client.py around
lines 21 - 26, In the server_ok function, replace the broad Exception catch with
a specific requests.RequestException catch. Change the except clause to catch
requests.RequestException instead of Exception, which will allow network-related
errors to be handled by returning False while allowing unexpected programming
errors to propagate and be caught at a higher level.

Source: Linters/SAST tools

.agents/skills/cuopt-numerical-optimization-api-python/SKILL.md-47-54 (1)

47-54: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix table row with incorrect column count.

Line 53 has only 2 cells but the table expects 3 columns. The "Unclear" row attempts to merge the "Variable type" and "Examples" columns, which standard Markdown doesn't support. This will cause the table to render incorrectly.

🔧 Proposed fix: split into separate cells
-| **Unclear** | Prefer **INTEGER** if the noun is a countable thing (a worker, a car); prefer **CONTINUOUS** if it's a measure (amount of steel, hours worked). If the problem says "whole" or "integer" or "number of", use INTEGER. |
+| **Unclear** | Prefer **INTEGER** if the noun is a countable thing (a worker, a car); prefer **CONTINUOUS** if it's a measure (amount of steel, hours worked). | If the problem says "whole" or "integer" or "number of", use INTEGER. |

Or restructure as a separate paragraph below the table if the guidance doesn't fit the column structure.

🤖 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/cuopt-numerical-optimization-api-python/SKILL.md around lines
47 - 54, The "Unclear" row in the table at line 53 has only 2 cells instead of
the required 3 columns (Problem wording / concept, Variable type, Examples). The
long explanatory text needs to be properly distributed across the 3 columns or
moved outside the table. Either restructure the row to have proper content in
each of the three column cells separated by pipe characters, or convert the
explanatory guidance into a separate paragraph below the table for better
readability.
.agents/skills/cuopt-numerical-optimization-api-python/BENCHMARK.md-16-17 (1)

16-17: ⚠️ Potential issue | 🟡 Minor

Address missing recommended sections in SKILL.md before publication.

The FAIL verdict is confirmed. However, the PII findings (lines 72-73) are false positives—the detected "phone numbers" at results.md:48 and results.md:69 are actually scientific notation (+2.58776093e+04) from solver output and do not represent data exposure risks.

The legitimate actionable findings are:

  • Missing recommended section: ## Instructions in SKILL.md
  • Missing recommended section: ## Examples in SKILL.md

Add these sections to improve discoverability and provide clearer guidance to skill users. The Tier 2 duplicate content findings may warrant review, though some duplication across README and module docstrings is expected.

🤖 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/cuopt-numerical-optimization-api-python/BENCHMARK.md around
lines 16 - 17, The SKILL.md file is missing two recommended sections that are
required for publication and will improve discoverability for skill users. Add a
new "## Instructions" section to SKILL.md that provides clear guidance and
step-by-step instructions on how to use the skill, and add a new "## Examples"
section that demonstrates practical usage scenarios with concrete examples of
how the skill can be applied. These sections should be added to the SKILL.md
file before rerunning NVSkills-Eval to refresh the benchmark and resolve the
FAIL verdict.
.agents/skills/cuopt-numerical-optimization-api-python/assets/milp_basic/incumbent_callback.py-44-46 (1)

44-46: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Check solver status before accessing objective value.

Line 46 accesses problem.ObjValue regardless of whether the solve succeeded. If no feasible solution was found, this could print invalid or undefined data.

🛡️ Proposed fix
     problem.solve(settings)
 
-    print(f"Status: {problem.Status.name}, Objective: {problem.ObjValue}")
+    if problem.Status.name in ["Optimal", "FeasibleFound"]:
+        print(f"Status: {problem.Status.name}, Objective: {problem.ObjValue}")
+    else:
+        print(f"Status: {problem.Status.name}")
🤖 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/cuopt-numerical-optimization-api-python/assets/milp_basic/incumbent_callback.py
around lines 44 - 46, After calling problem.solve(settings), check the solver
status using problem.Status before accessing problem.ObjValue. Verify that the
status indicates a successful solve (check for appropriate status values like
optimal or feasible solutions) before printing problem.ObjValue to the console.
Only print the objective value when the solver has found a valid solution;
otherwise, handle the failure case separately or skip printing the objective
value.
.agents/skills/cuopt-numerical-optimization-api-python/assets/lp_warmstart/model.py-34-36 (1)

34-36: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add status check before accessing objective value.

Line 35 accesses problem.ObjValue without checking the solver status first, unlike the second solve (Lines 47-48) which correctly guards the access. If the first solve fails, this could raise an error or print invalid data.

🛡️ Proposed fix
     problem.solve(settings)
-    print(f"Objective: {problem.ObjValue}")
+    if problem.Status.name in ["Optimal", "PrimalFeasible"]:
+        print(f"Objective: {problem.ObjValue}")
+    else:
+        print(f"Status: {problem.Status.name}")
🤖 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/cuopt-numerical-optimization-api-python/assets/lp_warmstart/model.py
around lines 34 - 36, The first problem solve call at line 34 accesses
problem.ObjValue without verifying the solver status, unlike the second solve
operation at lines 47-48 which properly validates the status first. Add a status
check after problem.solve(settings) to ensure the solver executed successfully
before accessing problem.ObjValue, following the same pattern used for the
second solve to prevent errors or invalid data from being printed.
.agents/skills/cuopt-numerical-optimization-api-python/assets/milp_basic/incumbent_callback.py-23-28 (1)

23-28: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Validate solution_cost array before indexing.

Line 26 accesses solution_cost[0] without checking if the array is non-empty. If the solver invokes the callback with an empty array, this will raise an IndexError.

🛡️ Proposed fix
     def get_solution(self, solution, solution_cost, solution_bound, user_data):
         self.n_callbacks += 1
         values = self.problem.getIncumbentValues(solution, self.variables)
-        cost = float(solution_cost[0])
+        cost = float(solution_cost[0]) if len(solution_cost) > 0 else 0.0
         vals_str = ", ".join(f"{float(v)}" for v in values)
         print(f"Incumbent {self.n_callbacks}: [{vals_str}], cost: {cost:.2f}")
🤖 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/cuopt-numerical-optimization-api-python/assets/milp_basic/incumbent_callback.py
around lines 23 - 28, The get_solution method accesses solution_cost[0] without
first checking if the solution_cost array contains elements. Add a validation
check to ensure solution_cost is non-empty before attempting to access index 0.
If the array is empty, handle it appropriately by either logging a warning
message and returning early, or raising a descriptive exception. This prevents
an IndexError when the solver invokes the callback with an empty solution_cost
array.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 237d3c0d-c131-4624-859f-9971b1458246

📥 Commits

Reviewing files that changed from the base of the PR and between 9cb773e and 03b4dc5.

📒 Files selected for processing (300)
  • .agents/skills/accelerated-computing-cudf/BENCHMARK.md
  • .agents/skills/accelerated-computing-cudf/SKILL.md
  • .agents/skills/accelerated-computing-cudf/evals/evals.json
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-apply-udf/code/generate_data.py
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-apply-udf/code/udf_pipeline.py
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-csv-etl/code/etl_pipeline.py
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-csv-etl/code/generate_data.py
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-groupby-agg/code/generate_data.py
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-groupby-agg/code/groupby_analysis.py
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-multi-join/code/generate_data.py
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-multi-join/code/multi_join.py
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-native-stream-handoff-boundary/NOTICE.md
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-native-stream-handoff-boundary/code/run_smoke.sh
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-native-stream-handoff-boundary/code/threaded_handoff.cu
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-null-handling/code/generate_data.py
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-null-handling/code/null_pipeline.py
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-parquet-io/code/generate_data.py
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-parquet-io/code/parquet_pipeline.py
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-pivot-melt/code/generate_data.py
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-pivot-melt/code/reshape_analysis.py
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-string-ops/code/clean_contacts.py
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-string-ops/code/generate_data.py
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-timeseries-resample/code/generate_data.py
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-timeseries-resample/code/timeseries_analysis.py
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-window-functions/code/generate_data.py
  • .agents/skills/accelerated-computing-cudf/evals/files/cudf-window-functions/code/window_analysis.py
  • .agents/skills/accelerated-computing-cudf/evals/files/negative-deep-learning-training/code/train.py
  • .agents/skills/accelerated-computing-cudf/evals/files/source-cudf-null-fillna-semantics/NOTICE.md
  • .agents/skills/accelerated-computing-cudf/evals/files/source-cudf-null-fillna-semantics/code/null_cleanup.py
  • .agents/skills/accelerated-computing-cudf/references/api-patterns.md
  • .agents/skills/accelerated-computing-cudf/references/cudf-pandas-accelerator.md
  • .agents/skills/accelerated-computing-cudf/references/dask-cudf-patterns.md
  • .agents/skills/accelerated-computing-cudf/skill-card.md
  • .agents/skills/accelerated-computing-cudf/skill.oms.sig
  • .agents/skills/aiq-deploy/BENCHMARK.md
  • .agents/skills/aiq-deploy/SKILL.md
  • .agents/skills/aiq-deploy/evals/evals.json
  • .agents/skills/aiq-deploy/references/configs.md
  • .agents/skills/aiq-deploy/references/docker-compose.md
  • .agents/skills/aiq-deploy/references/end-to-end-validation.md
  • .agents/skills/aiq-deploy/references/env-and-secrets.md
  • .agents/skills/aiq-deploy/references/frag.md
  • .agents/skills/aiq-deploy/references/kubernetes-helm.md
  • .agents/skills/aiq-deploy/references/local-web.md
  • .agents/skills/aiq-deploy/references/locate-or-clone.md
  • .agents/skills/aiq-deploy/references/shutdown.md
  • .agents/skills/aiq-deploy/references/skill-backend.md
  • .agents/skills/aiq-deploy/references/terminal-cli.md
  • .agents/skills/aiq-deploy/references/troubleshooting.md
  • .agents/skills/aiq-deploy/references/validation.md
  • .agents/skills/aiq-deploy/skill-card.md
  • .agents/skills/aiq-deploy/skill.oms.sig
  • .agents/skills/aiq-research/BENCHMARK.md
  • .agents/skills/aiq-research/SKILL.md
  • .agents/skills/aiq-research/evals/evals.json
  • .agents/skills/aiq-research/scripts/aiq.py
  • .agents/skills/aiq-research/skill-card.md
  • .agents/skills/aiq-research/skill.oms.sig
  • .agents/skills/cudaq-guide/BENCHMARK.md
  • .agents/skills/cudaq-guide/SKILL.md
  • .agents/skills/cudaq-guide/evals/EVAL.md
  • .agents/skills/cudaq-guide/evals/config.yml
  • .agents/skills/cudaq-guide/evals/evals.json
  • .agents/skills/cudaq-guide/skill-card.md
  • .agents/skills/cudaq-guide/skill.oms.sig
  • .agents/skills/cufolio/BENCHMARK.md
  • .agents/skills/cufolio/SKILL.md
  • .agents/skills/cufolio/evals/EVAL.md
  • .agents/skills/cufolio/evals/evals-full.json
  • .agents/skills/cufolio/evals/evals.json
  • .agents/skills/cufolio/references/workflows/agent_recipes.md
  • .agents/skills/cufolio/skill-card.md
  • .agents/skills/cufolio/skill.oms.sig
  • .agents/skills/cuopt-developer/BENCHMARK.md
  • .agents/skills/cuopt-developer/SKILL.md
  • .agents/skills/cuopt-developer/benchmark/evals.json
  • .agents/skills/cuopt-developer/evals/evals.json
  • .agents/skills/cuopt-developer/references/build_and_test.md
  • .agents/skills/cuopt-developer/references/contributing.md
  • .agents/skills/cuopt-developer/references/conventions.md
  • .agents/skills/cuopt-developer/references/first_time_setup.md
  • .agents/skills/cuopt-developer/references/python_bindings.md
  • .agents/skills/cuopt-developer/references/troubleshooting.md
  • .agents/skills/cuopt-developer/references/vrp_skills.md
  • .agents/skills/cuopt-developer/resources/numerical_debugging.md
  • .agents/skills/cuopt-developer/skill-card.md
  • .agents/skills/cuopt-developer/skill.oms.sig
  • .agents/skills/cuopt-install/BENCHMARK.md
  • .agents/skills/cuopt-install/SKILL.md
  • .agents/skills/cuopt-install/benchmark/evals.json
  • .agents/skills/cuopt-install/evals/evals.json
  • .agents/skills/cuopt-install/references/verification_examples.md
  • .agents/skills/cuopt-install/skill-card.md
  • .agents/skills/cuopt-install/skill.oms.sig
  • .agents/skills/cuopt-numerical-optimization-api-c/BENCHMARK.md
  • .agents/skills/cuopt-numerical-optimization-api-c/SKILL.md
  • .agents/skills/cuopt-numerical-optimization-api-c/assets/README.md
  • .agents/skills/cuopt-numerical-optimization-api-c/assets/lp_basic/README.md
  • .agents/skills/cuopt-numerical-optimization-api-c/assets/lp_basic/lp_simple.c
  • .agents/skills/cuopt-numerical-optimization-api-c/assets/lp_duals/README.md
  • .agents/skills/cuopt-numerical-optimization-api-c/assets/lp_duals/lp_duals.c
  • .agents/skills/cuopt-numerical-optimization-api-c/assets/lp_warmstart/README.md
  • .agents/skills/cuopt-numerical-optimization-api-c/assets/milp_basic/README.md
  • .agents/skills/cuopt-numerical-optimization-api-c/assets/milp_basic/milp_simple.c
  • .agents/skills/cuopt-numerical-optimization-api-c/assets/milp_production_planning/README.md
  • .agents/skills/cuopt-numerical-optimization-api-c/assets/milp_production_planning/milp_production.c
  • .agents/skills/cuopt-numerical-optimization-api-c/assets/mps_solver/README.md
  • .agents/skills/cuopt-numerical-optimization-api-c/assets/mps_solver/data/sample.mps
  • .agents/skills/cuopt-numerical-optimization-api-c/assets/mps_solver/mps_solver.c
  • .agents/skills/cuopt-numerical-optimization-api-c/evals/evals.json
  • .agents/skills/cuopt-numerical-optimization-api-c/references/examples.md
  • .agents/skills/cuopt-numerical-optimization-api-c/skill-card.md
  • .agents/skills/cuopt-numerical-optimization-api-c/skill.oms.sig
  • .agents/skills/cuopt-numerical-optimization-api-cli/BENCHMARK.md
  • .agents/skills/cuopt-numerical-optimization-api-cli/SKILL.md
  • .agents/skills/cuopt-numerical-optimization-api-cli/assets/README.md
  • .agents/skills/cuopt-numerical-optimization-api-cli/assets/lp_production/README.md
  • .agents/skills/cuopt-numerical-optimization-api-cli/assets/lp_production/production.mps
  • .agents/skills/cuopt-numerical-optimization-api-cli/assets/lp_simple/README.md
  • .agents/skills/cuopt-numerical-optimization-api-cli/assets/lp_simple/sample.mps
  • .agents/skills/cuopt-numerical-optimization-api-cli/assets/milp_facility/README.md
  • .agents/skills/cuopt-numerical-optimization-api-cli/assets/milp_facility/facility.mps
  • .agents/skills/cuopt-numerical-optimization-api-cli/evals/evals.json
  • .agents/skills/cuopt-numerical-optimization-api-cli/skill-card.md
  • .agents/skills/cuopt-numerical-optimization-api-cli/skill.oms.sig
  • .agents/skills/cuopt-numerical-optimization-api-python/BENCHMARK.md
  • .agents/skills/cuopt-numerical-optimization-api-python/SKILL.md
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/README.md
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/least_squares/README.md
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/least_squares/model.py
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/lp_basic/README.md
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/lp_basic/model.py
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/lp_duals/README.md
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/lp_duals/model.py
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/lp_warmstart/README.md
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/lp_warmstart/model.py
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/maximization_workaround/README.md
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/maximization_workaround/model.py
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/milp_basic/README.md
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/milp_basic/incumbent_callback.py
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/milp_basic/model.py
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/milp_production_planning/README.md
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/milp_production_planning/model.py
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/mps_solver/README.md
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/mps_solver/data/README.md
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/mps_solver/data/sample.mps
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/mps_solver/model.py
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/mps_solver/results.md
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/portfolio/README.md
  • .agents/skills/cuopt-numerical-optimization-api-python/assets/portfolio/model.py
  • .agents/skills/cuopt-numerical-optimization-api-python/benchmark/SOURCES.md
  • .agents/skills/cuopt-numerical-optimization-api-python/benchmark/evals.json
  • .agents/skills/cuopt-numerical-optimization-api-python/evals/evals.json
  • .agents/skills/cuopt-numerical-optimization-api-python/references/qp_examples.md
  • .agents/skills/cuopt-numerical-optimization-api-python/skill-card.md
  • .agents/skills/cuopt-numerical-optimization-api-python/skill.oms.sig
  • .agents/skills/cuopt-numerical-optimization-formulation/BENCHMARK.md
  • .agents/skills/cuopt-numerical-optimization-formulation/SKILL.md
  • .agents/skills/cuopt-numerical-optimization-formulation/evals/evals.json
  • .agents/skills/cuopt-numerical-optimization-formulation/skill-card.md
  • .agents/skills/cuopt-numerical-optimization-formulation/skill.oms.sig
  • .agents/skills/cuopt-routing-api-python/BENCHMARK.md
  • .agents/skills/cuopt-routing-api-python/SKILL.md
  • .agents/skills/cuopt-routing-api-python/assets/README.md
  • .agents/skills/cuopt-routing-api-python/assets/pdp_basic/README.md
  • .agents/skills/cuopt-routing-api-python/assets/pdp_basic/model.py
  • .agents/skills/cuopt-routing-api-python/assets/vrp_basic/README.md
  • .agents/skills/cuopt-routing-api-python/assets/vrp_basic/model.py
  • .agents/skills/cuopt-routing-api-python/evals/evals.json
  • .agents/skills/cuopt-routing-api-python/references/examples.md
  • .agents/skills/cuopt-routing-api-python/references/server_examples.md
  • .agents/skills/cuopt-routing-api-python/skill-card.md
  • .agents/skills/cuopt-routing-api-python/skill.oms.sig
  • .agents/skills/cuopt-routing-formulation/BENCHMARK.md
  • .agents/skills/cuopt-routing-formulation/SKILL.md
  • .agents/skills/cuopt-routing-formulation/evals/evals.json
  • .agents/skills/cuopt-routing-formulation/skill-card.md
  • .agents/skills/cuopt-routing-formulation/skill.oms.sig
  • .agents/skills/cuopt-server-api-python/BENCHMARK.md
  • .agents/skills/cuopt-server-api-python/SKILL.md
  • .agents/skills/cuopt-server-api-python/assets/README.md
  • .agents/skills/cuopt-server-api-python/assets/lp_basic/README.md
  • .agents/skills/cuopt-server-api-python/assets/lp_basic/client.py
  • .agents/skills/cuopt-server-api-python/assets/milp_basic/README.md
  • .agents/skills/cuopt-server-api-python/assets/milp_basic/client.py
  • .agents/skills/cuopt-server-api-python/assets/pdp_basic/README.md
  • .agents/skills/cuopt-server-api-python/assets/pdp_basic/client.py
  • .agents/skills/cuopt-server-api-python/assets/vrp_basic/README.md
  • .agents/skills/cuopt-server-api-python/assets/vrp_basic/client.py
  • .agents/skills/cuopt-server-api-python/assets/vrp_simple/README.md
  • .agents/skills/cuopt-server-api-python/assets/vrp_simple/client.py
  • .agents/skills/cuopt-server-api-python/evals/evals.json
  • .agents/skills/cuopt-server-api-python/skill-card.md
  • .agents/skills/cuopt-server-api-python/skill.oms.sig
  • .agents/skills/cuopt-server-common/BENCHMARK.md
  • .agents/skills/cuopt-server-common/SKILL.md
  • .agents/skills/cuopt-server-common/evals/evals.json
  • .agents/skills/cuopt-server-common/skill-card.md
  • .agents/skills/cuopt-server-common/skill.oms.sig
  • .agents/skills/cuopt-skill-evolution/BENCHMARK.md
  • .agents/skills/cuopt-skill-evolution/SKILL.md
  • .agents/skills/cuopt-skill-evolution/evals/evals.json
  • .agents/skills/cuopt-skill-evolution/skill-card.md
  • .agents/skills/cuopt-skill-evolution/skill.oms.sig
  • .agents/skills/cuopt-user-rules/BENCHMARK.md
  • .agents/skills/cuopt-user-rules/SKILL.md
  • .agents/skills/cuopt-user-rules/evals/evals.json
  • .agents/skills/cuopt-user-rules/skill-card.md
  • .agents/skills/cuopt-user-rules/skill.oms.sig
  • .agents/skills/cupynumeric-hdf5/BENCHMARK.md
  • .agents/skills/cupynumeric-hdf5/SKILL.md
  • .agents/skills/cupynumeric-hdf5/assets/hdf5_batched_read.py
  • .agents/skills/cupynumeric-hdf5/assets/hdf5_roundtrip.py
  • .agents/skills/cupynumeric-hdf5/evals/evals.json
  • .agents/skills/cupynumeric-hdf5/skill-card.md
  • .agents/skills/cupynumeric-hdf5/skill.oms.sig
  • .agents/skills/cupynumeric-install/BENCHMARK.md
  • .agents/skills/cupynumeric-install/SKILL.md
  • .agents/skills/cupynumeric-install/evals/evals.json
  • .agents/skills/cupynumeric-install/references/verification_examples.md
  • .agents/skills/cupynumeric-install/skill-card.md
  • .agents/skills/cupynumeric-install/skill.oms.sig
  • .agents/skills/cupynumeric-migration-readiness/.gitignore
  • .agents/skills/cupynumeric-migration-readiness/BENCHMARK.md
  • .agents/skills/cupynumeric-migration-readiness/SKILL.md
  • .agents/skills/cupynumeric-migration-readiness/assets/api-support.md
  • .agents/skills/cupynumeric-migration-readiness/assets/examples/blocks_scaling.py
  • .agents/skills/cupynumeric-migration-readiness/assets/examples/needs_refactor.py
  • .agents/skills/cupynumeric-migration-readiness/assets/examples/scales_well.py
  • .agents/skills/cupynumeric-migration-readiness/assets/sample_report.md
  • .agents/skills/cupynumeric-migration-readiness/evals/evals.json
  • .agents/skills/cupynumeric-migration-readiness/evals/files/api_gap_hotpath.py
  • .agents/skills/cupynumeric-migration-readiness/evals/files/blocks_scaling.py
  • .agents/skills/cupynumeric-migration-readiness/evals/files/convergence_loop.py
  • .agents/skills/cupynumeric-migration-readiness/evals/files/cupy_mixed.py
  • .agents/skills/cupynumeric-migration-readiness/evals/files/dense_linalg.py
  • .agents/skills/cupynumeric-migration-readiness/evals/files/dense_with_scipy_boundary.py
  • .agents/skills/cupynumeric-migration-readiness/evals/files/graph_workload.py
  • .agents/skills/cupynumeric-migration-readiness/evals/files/item_sync.py
  • .agents/skills/cupynumeric-migration-readiness/evals/files/jacobi_heat.py
  • .agents/skills/cupynumeric-migration-readiness/evals/files/many_blocks.py
  • .agents/skills/cupynumeric-migration-readiness/evals/files/monte_carlo_bs.py
  • .agents/skills/cupynumeric-migration-readiness/evals/files/monte_carlo_good.py
  • .agents/skills/cupynumeric-migration-readiness/evals/files/needs_refactor.py
  • .agents/skills/cupynumeric-migration-readiness/evals/files/scales_well.py
  • .agents/skills/cupynumeric-migration-readiness/evals/files/sequential_recurrence.py
  • .agents/skills/cupynumeric-migration-readiness/evals/files/sparse_sklearn.py
  • .agents/skills/cupynumeric-migration-readiness/evals/files/tiny_array.py
  • .agents/skills/cupynumeric-migration-readiness/evals/files/unlisted_api.py
  • .agents/skills/cupynumeric-migration-readiness/evals/files/view_mutation.py
  • .agents/skills/cupynumeric-migration-readiness/references/case-studies.md
  • .agents/skills/cupynumeric-migration-readiness/references/decision-framework.md
  • .agents/skills/cupynumeric-migration-readiness/references/execution-model.md
  • .agents/skills/cupynumeric-migration-readiness/references/getting-started.md
  • .agents/skills/cupynumeric-migration-readiness/references/gpu-stack.md
  • .agents/skills/cupynumeric-migration-readiness/references/idioms-that-block.md
  • .agents/skills/cupynumeric-migration-readiness/references/idioms-that-scale.md
  • .agents/skills/cupynumeric-migration-readiness/references/partitioning-and-balance.md
  • .agents/skills/cupynumeric-migration-readiness/references/refactor-recipes.md
  • .agents/skills/cupynumeric-migration-readiness/scripts/fetch_api_support.py
  • .agents/skills/cupynumeric-migration-readiness/scripts/tests/test_fetch_api_support.py
  • .agents/skills/cupynumeric-migration-readiness/skill-card.md
  • .agents/skills/cupynumeric-migration-readiness/skill.oms.sig
  • .agents/skills/cupynumeric-parallel-data-load/BENCHMARK.md
  • .agents/skills/cupynumeric-parallel-data-load/SKILL.md
  • .agents/skills/cupynumeric-parallel-data-load/assets/examples/parallel_npy_load.py
  • .agents/skills/cupynumeric-parallel-data-load/evals/evals.json
  • .agents/skills/cupynumeric-parallel-data-load/skill-card.md
  • .agents/skills/cupynumeric-parallel-data-load/skill.oms.sig
  • .agents/skills/dali-dynamic-mode/BENCHMARK.md
  • .agents/skills/dali-dynamic-mode/SKILL.md
  • .agents/skills/dali-dynamic-mode/evals/evals.json
  • .agents/skills/dali-dynamic-mode/evals/files/pipeline_to_convert.py
  • .agents/skills/dali-dynamic-mode/scripts/requirements.txt
  • .agents/skills/dali-dynamic-mode/skill-card.md
  • .agents/skills/dali-dynamic-mode/skill.oms.sig
  • .agents/skills/data-designer/BENCHMARK.md
  • .agents/skills/data-designer/SKILL.md
  • .agents/skills/data-designer/evals/evals.json
  • .agents/skills/data-designer/references/person-sampling.md
  • .agents/skills/data-designer/references/preview-review.md
  • .agents/skills/data-designer/references/seed-datasets.md
  • .agents/skills/data-designer/scripts/get_person_object_schema.py
  • .agents/skills/data-designer/skill-card.md
  • .agents/skills/data-designer/skill.oms.sig
  • .agents/skills/data-designer/workflows/autopilot.md
  • .agents/skills/data-designer/workflows/interactive.md
  • .agents/skills/deepstream-dev/.claude-plugin/plugin.json
  • .agents/skills/deepstream-dev/BENCHMARK.md
  • .agents/skills/deepstream-dev/SKILL.md
  • .agents/skills/deepstream-dev/evals/evals.json
  • .agents/skills/deepstream-dev/references/best_practices.md
  • .agents/skills/deepstream-dev/references/buffer_apis.md
  • .agents/skills/deepstream-dev/references/docker_containers.md
  • .agents/skills/deepstream-dev/references/gstreamer_plugins.md
  • .agents/skills/deepstream-dev/references/kafka_messaging.md
  • .agents/skills/deepstream-dev/references/media_extractor_advanced.md
  • .agents/skills/deepstream-dev/references/metamux_config.md
  • .agents/skills/deepstream-dev/references/nvinfer_config.md
  • .agents/skills/deepstream-dev/references/rest_api_dynamic.md

Comment on lines +37 to +42
bins = [0, 25, 35, 50, 65, 100]
labels = ["18-25", "26-35", "36-50", "51-65", "65+"]
df["age_group"] = pd.cut(df["customer_age"], bins=bins, labels=labels)

df["high_value"] = (df["discounted_revenue"] > 500).astype(int)
print(f"Added computed columns; {df['high_value'].sum()} high-value orders")

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.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Age binning logic misalignment between bin edges and labels.

Line 37–38 defines bins [0, 25, 35, 50, 65, 100] with labels ["18-25", "26-35", "36-50", "51-65", "65+"], but the bin ranges don't match the labels. For example, the first bin [0, 25) would include ages 0–24, yet the label says "18-25". Since customer_age ranges from 18 to 79 (line 32 of generate_data.py), the first bin interval should be adjusted to match the label (e.g., start at 18, or relabel to "0-25").

Consider aligning bin edges with label semantics:

bins = [18, 26, 36, 51, 66, 100]
labels = ["18-25", "26-35", "36-50", "51-65", "66+"]

Or, if using [0, 25, 35, 50, 65, 100], update labels to reflect actual bin boundaries.

🤖 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/accelerated-computing-cudf/evals/files/cudf-csv-etl/code/etl_pipeline.py
around lines 37 - 42, The bins and labels in the pd.cut() function for the
age_group column are misaligned. The bins list [0, 25, 35, 50, 65, 100] creates
intervals that don't match the label descriptions, particularly the first
interval which would include ages 0-24 but is labeled "18-25". Since
customer_age ranges from 18 to 79, adjust the bins to start at 18 instead of 0,
and update all subsequent bin boundaries to match the label semantics (bins
should be [18, 26, 36, 51, 66, 100]) and update the corresponding labels to
["18-25", "26-35", "36-50", "51-65", "66+"] to ensure consistency.

Comment on lines +41 to +49
def normalize_phones(df):
"""Extract digits from phone numbers into a standard 10-digit format."""
digits = df["phone"].str.replace(r"[^\d]", "", regex=True)
# Remove leading '1' for 11-digit US numbers
digits = digits.str.replace(r"^1(\d{10})$", r"\1", regex=True)
df["phone_clean"] = (
"(" + digits.str[:3] + ") " + digits.str[3:6] + "-" + digits.str[6:10]
)
return df

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.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Validate phone digit length before formatting.

The phone normalization extracts digits and removes leading '1' for 11-digit US numbers, but doesn't validate that the result is exactly 10 digits before slicing at fixed positions (digits.str[:3], digits.str[3:6], digits.str[6:10]). If the input contains fewer than 10 digits after cleaning (e.g., "555-123" becomes "555123"), slicing will produce incomplete/malformed output like (555) 123-.

🛡️ Proposed fix to add length validation
 def normalize_phones(df):
     """Extract digits from phone numbers into a standard 10-digit format."""
     digits = df["phone"].str.replace(r"[^\d]", "", regex=True)
     # Remove leading '1' for 11-digit US numbers
     digits = digits.str.replace(r"^1(\d{10})$", r"\1", regex=True)
+    # Only format if we have exactly 10 digits
+    valid_mask = digits.str.len() == 10
     df["phone_clean"] = (
         "(" + digits.str[:3] + ") " + digits.str[3:6] + "-" + digits.str[6:10]
     )
+    df.loc[~valid_mask, "phone_clean"] = ""  # or df["phone"] for original
     return df
📝 Committable suggestion

‼️ 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.

Suggested change
def normalize_phones(df):
"""Extract digits from phone numbers into a standard 10-digit format."""
digits = df["phone"].str.replace(r"[^\d]", "", regex=True)
# Remove leading '1' for 11-digit US numbers
digits = digits.str.replace(r"^1(\d{10})$", r"\1", regex=True)
df["phone_clean"] = (
"(" + digits.str[:3] + ") " + digits.str[3:6] + "-" + digits.str[6:10]
)
return df
def normalize_phones(df):
"""Extract digits from phone numbers into a standard 10-digit format."""
digits = df["phone"].str.replace(r"[^\d]", "", regex=True)
# Remove leading '1' for 11-digit US numbers
digits = digits.str.replace(r"^1(\d{10})$", r"\1", regex=True)
# Only format if we have exactly 10 digits
valid_mask = digits.str.len() == 10
df["phone_clean"] = (
"(" + digits.str[:3] + ") " + digits.str[3:6] + "-" + digits.str[6:10]
)
df.loc[~valid_mask, "phone_clean"] = "" # or df["phone"] for original
return df
🤖 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/accelerated-computing-cudf/evals/files/cudf-string-ops/code/clean_contacts.py
around lines 41 - 49, The normalize_phones function is missing validation to
ensure the cleaned phone digits are exactly 10 digits long before performing
fixed-position string slicing. After the regex operations that extract digits
and remove leading '1' for 11-digit numbers, add a length validation check to
ensure the digits string is exactly 10 characters before applying the string
slicing operations for formatting (digits.str[:3], digits.str[3:6],
digits.str[6:10]). For phone numbers that don't result in exactly 10 digits
after cleaning, either filter them out or populate phone_clean with an empty
string or null value to avoid producing malformed output.

Comment on lines +85 to +100
primal = malloc((size_t)num_variables * sizeof(cuopt_float_t));
if (primal) {
status = cuOptGetPrimalSolution(solution, primal);
if (status != CUOPT_SUCCESS) {
printf("Error getting primal solution: %d\n", status);
free(primal);
primal = NULL;
goto cleanup;
}
printf("Primal (first 10): ");
for (cuopt_int_t i = 0; i < (num_variables < 10 ? num_variables : 10); i++)
printf("%f ", primal[i]);
if (num_variables > 10) printf("... (%d total)", (int)num_variables);
printf("\n");
free(primal);
}

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.

⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Potential integer overflow in malloc size calculation.

The multiplication num_variables * sizeof(cuopt_float_t) at line 85 can overflow if num_variables is large, resulting in undersized allocation without diagnostic. Although num_variables is bounded by the solver, the pattern is unsafe and violates secure coding practices (CWE-190).

The if (primal) check at line 86 only detects allocation failure, not overflow-induced undersizing. A better approach is to use calloc, which safely handles overflow, or validate the multiplication before calling malloc.

🛡️ Proposed fix: Use calloc or add overflow check

Option 1 (preferred): Use calloc

primal = calloc((size_t)num_variables, sizeof(cuopt_float_t));

calloc automatically checks for overflow and initializes memory to zero.

Option 2: Validate multiplication

if (num_variables > SIZE_MAX / sizeof(cuopt_float_t)) {
    printf("Error: allocation size would overflow\n");
    goto cleanup;
}
primal = malloc((size_t)num_variables * sizeof(cuopt_float_t));
🤖 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/cuopt-numerical-optimization-api-c/assets/mps_solver/mps_solver.c
around lines 85 - 100, The malloc call allocating memory for the `primal`
variable using multiplication `(size_t)num_variables * sizeof(cuopt_float_t)` is
vulnerable to integer overflow that would not be caught by the subsequent null
pointer check. Replace this malloc with a calloc call using
`calloc((size_t)num_variables, sizeof(cuopt_float_t))` which safely handles
overflow detection and also zero-initializes the memory, or alternatively add an
overflow validation check before malloc that ensures `num_variables` does not
exceed `SIZE_MAX / sizeof(cuopt_float_t)`.

Source: Linters/SAST tools

Comment on lines +122 to +126
cuopt_float_t* sol = malloc(num_variables * sizeof(cuopt_float_t));
cuOptGetPrimalSolution(solution, sol);
printf("x1 = %f\n", sol[0]);
printf("x2 = %f\n", sol[1]);
free(sol);

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.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Missing null check after malloc in Simple LP example.

Line 122 allocates memory without checking for malloc failure, but immediately dereferences the pointer at lines 124-125. This crashes if allocation fails. The MILP example (lines 211-216) correctly demonstrates the pattern with a null check—apply the same defensive check to the Simple LP code for consistency and safety.

🛡️ Proposed fix: Add null check after malloc
     // Get solution values
     cuopt_float_t* sol = malloc(num_variables * sizeof(cuopt_float_t));
+    if (sol == NULL) {
+        printf("Error: memory allocation failed\n");
+        goto cleanup;
+    }
     cuOptGetPrimalSolution(solution, sol);
     printf("x1 = %f\n", sol[0]);
     printf("x2 = %f\n", sol[1]);
     free(sol);
🤖 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/cuopt-numerical-optimization-api-c/references/examples.md
around lines 122 - 126, Add a null check after the malloc call that allocates
memory for the sol pointer. After allocating memory with malloc for
num_variables * sizeof(cuopt_float_t), check if sol is null and handle the
failure case before proceeding to call cuOptGetPrimalSolution and access sol[0]
and sol[1]. This prevents dereferencing a null pointer if memory allocation
fails, matching the defensive programming pattern already demonstrated in the
MILP example.

Comment on lines +1 to +99
# Evaluation Report

Evaluation of the `cuopt-routing-api-python` skill before publication through NVSkills-Eval.

This benchmark summarizes 3-Tier Evaluation from NVSkills-Eval results for the skill. The goal is to document whether the skill is safe, discoverable, effective, and useful for agents before it is published for broader workflow use.

## Evaluation Summary

- Skill: `cuopt-routing-api-python`
- Evaluation date: 2026-05-29
- NVSkills-Eval profile: `external`
- Environment: `local`
- Dataset: 1 evaluation tasks
- Attempts per task: 2
- Pass threshold: 50%
- Overall verdict: FAIL

## Agents Used

- `claude-code`
- `codex`

## Metrics Used

Reported benchmark dimensions:

- Security: checks whether skill-assisted execution avoids unsafe behavior such as secret leakage, destructive commands, or unauthorized access.
- Correctness: checks whether the agent follows the expected workflow and produces the correct final output.
- Discoverability: checks whether the agent loads the skill when relevant and avoids using it when irrelevant.
- Effectiveness: checks whether the agent performs measurably better with the skill than without it.
- Efficiency: checks whether the agent uses fewer tokens and avoids redundant work.

Underlying evaluation signals used in this run:

- `security` (Security): checks for unsafe operations, secret leakage, and unauthorized access.
- `skill_execution` (Skill Execution): verifies that the agent loaded the expected skill and workflow.
- `skill_efficiency` (Efficiency): checks routing quality, decoy avoidance, and redundant tool usage.
- `accuracy` (Accuracy): grades final-answer correctness against the reference answer.
- `goal_accuracy` (Goal Accuracy): checks whether the overall user task completed successfully.
- `behavior_check` (Behavior Check): verifies expected behavior steps, including safety expectations.
- `token_efficiency` (Token Efficiency): compares token usage with and without the skill.

## Test Tasks

The benchmark dataset contained 1 evaluation tasks:

- Positive tasks: 1 tasks where the skill was expected to activate.
- Negative tasks: 0 tasks where no skill was expected.
- Unlabeled tasks: 0 tasks where positive/negative intent could not be inferred.

Task composition is derived from the evaluation dataset when possible. Entries with `expected_skill` set are treated as positive skill-activation cases, while entries with `expected_skill: null` are treated as negative activation cases.

## Results

| Dimension | Num | `claude-code` | `codex` |
|---|---:|---:|---:|
| Security | 2 | 100% (+0%) | 100% (+0%) |
| Correctness | 2 | 100% (+0%) | 95% (+3%) |
| Discoverability | 2 | 100% (+0%) | 70% (-5%) |
| Effectiveness | 2 | 83% (+14%) | 83% (+12%) |
| Efficiency | 2 | 93% (-0%) | 56% (-5%) |

Score values show skill-assisted performance. Values in parentheses show uplift versus the no-skill baseline when baseline data is available.

## Tier 1: Static Validation Summary

Tier 1 validation passed with observations. NVSkills-Eval ran 9 checks and found 8 total findings.

Top findings:

- MEDIUM SCHEMA/body_recommended_section: Missing recommended section: '## Instructions' (`skills/cuopt-routing-api-python/SKILL.md`)
- MEDIUM SECURITY/Unknown (SQP-2): Binding the cuOpt server to 0.0.0.0 exposes it on all network interfaces, making it accessible to any host that can reac (`references/server_examples.md:7`)
- LOW QUALITY/quality_discoverability: No '## Purpose' section (`skills/cuopt-routing-api-python/SKILL.md`)
- LOW QUALITY/quality_reliability: No prerequisites/requirements documented (`skills/cuopt-routing-api-python/SKILL.md`)
- LOW QUALITY/quality_reliability: No limitations documented (`skills/cuopt-routing-api-python/SKILL.md`)

## Tier 2: Deduplication Summary

Tier 2 validation reported findings. NVSkills-Eval ran 2 checks and found 4 total findings.

Top findings:

- HIGH DUPLICATE/duplicate: Duplicate content found within references/server_examples.md:
"# Poll for solution" in references/server_examples.md (lines 45-51)
vs "# Poll for solution" in references/server_examples.md (lines 156-162) (`references/server_examples.md:45`)
- HIGH DUPLICATE/duplicate: Duplicate content found across SKILL.md and references/examples.md:
"# Capacities" in SKILL.md (lines 30-35)
vs "# Add capacity dimension (name, demand_per_order, capacity_per_vehicle)" in references/examples.md (lines 73-75)
vs "# Add capacity dimension" in references/examples.md (lines 156-158) (`SKILL.md:30`)
- HIGH DUPLICATE/duplicate: Duplicate content found across references/examples.md and references/server_examples.md:
"## Additional References (tested in CI)" in references/examples.md (lines 237-249)
vs "## Additional References (tested in CI)" in references/server_examples.md (lines 193-204) (`references/examples.md:237`)
- HIGH DUPLICATE/duplicate: Duplicate content found across assets/pdp_basic/README.md and assets/pdp_basic/model.py:
"# Pickup-Delivery (PDP)" in assets/pdp_basic/README.md (lines 1-7)
vs "(module docstring)" in assets/pdp_basic/model.py (lines 1-2) (`assets/pdp_basic/README.md:1`)

## Publication Recommendation

The skill should be reviewed before NVSkills-Eval publication. Skill owners should address the findings above and rerun NVSkills-Eval to refresh this benchmark.

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.

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

Address the FAIL evaluation verdict and security concern before merging.

This skill has a FAIL evaluation verdict (line 16) with a MEDIUM SECURITY finding about binding the cuOpt server to 0.0.0.0, which exposes it to unauthorized network access (line 72). Additionally, Tier 2 validation reports 4 high-severity duplicate-content findings across multiple documentation files. The publication recommendation (line 99) explicitly states the skill should be reviewed before publication.

Do not merge this skill until:

  1. The security issue on line 72 is fixed in references/server_examples.md:7 (bind to a specific interface, not 0.0.0.0).
  2. The duplicate-content findings are resolved.
  3. The SKILL.md is updated with missing sections (Instructions, Purpose, Prerequisites, Limitations).
  4. Evaluation is re-run and the verdict updated.
🤖 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/cuopt-routing-api-python/BENCHMARK.md around lines 1 - 99,
The benchmark report shows a FAIL verdict with critical security and
documentation issues that must be addressed before merging. Fix the MEDIUM
SECURITY finding by modifying the cuOpt server binding in
references/server_examples.md from 0.0.0.0 to a specific network interface to
prevent unauthorized access. Resolve the four HIGH duplicate-content findings by
removing or consolidating duplicate sections across
references/server_examples.md, references/examples.md,
assets/pdp_basic/README.md, and assets/pdp_basic/model.py. Update SKILL.md to
include the missing required sections: Instructions, Purpose, Prerequisites, and
Limitations as identified in the Tier 1 findings. After making these changes,
rerun the NVSkills-Eval evaluation to obtain an updated benchmark report with a
passing verdict before the skill can be published.

Comment on lines +73 to +76
response = requests.post(
f"{SERVER}/cuopt/request", json=payload, headers=HEADERS
)
response.raise_for_status()

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.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Add timeout to POST request.

The requests.post() call is missing a timeout parameter, which can cause indefinite hangs if the server becomes unresponsive. Add a reasonable timeout (e.g., 10 seconds) to prevent resource exhaustion.

     response = requests.post(
-        f"{SERVER}/cuopt/request", json=payload, headers=HEADERS
+        f"{SERVER}/cuopt/request", json=payload, headers=HEADERS, timeout=10
     )
     response.raise_for_status()
📝 Committable suggestion

‼️ 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.

Suggested change
response = requests.post(
f"{SERVER}/cuopt/request", json=payload, headers=HEADERS
)
response.raise_for_status()
response = requests.post(
f"{SERVER}/cuopt/request", json=payload, headers=HEADERS, timeout=10
)
response.raise_for_status()
🧰 Tools
🪛 Ruff (0.15.17)

[error] 73-73: Probable use of requests call without timeout

(S113)

🤖 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/cuopt-server-api-python/assets/vrp_basic/client.py around
lines 73 - 76, The requests.post() call that sends the payload to the SERVER
endpoint with the cuopt/request path is missing a timeout parameter, which can
cause the request to hang indefinitely if the server becomes unresponsive. Add a
timeout parameter to the requests.post() function call with a reasonable value
(such as 10 seconds) to ensure the request will fail gracefully if the server
does not respond within the specified time limit.

Source: Linters/SAST tools

Comment on lines +80 to +83
for _ in range(30):
response = requests.get(
f"{SERVER}/cuopt/solution/{req_id}", headers=HEADERS
)

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.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Add timeout to GET request in poll loop.

The requests.get() call in the polling loop (line 81–83) is missing a timeout parameter. Without it, a single unresponsive server can block indefinitely. Add a timeout (e.g., 5 seconds) to ensure the retry loop remains responsive.

     for _ in range(30):
         response = requests.get(
-            f"{SERVER}/cuopt/solution/{req_id}", headers=HEADERS
+            f"{SERVER}/cuopt/solution/{req_id}", headers=HEADERS, timeout=5
         )
         result = response.json()
📝 Committable suggestion

‼️ 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.

Suggested change
for _ in range(30):
response = requests.get(
f"{SERVER}/cuopt/solution/{req_id}", headers=HEADERS
)
for _ in range(30):
response = requests.get(
f"{SERVER}/cuopt/solution/{req_id}", headers=HEADERS, timeout=5
)
result = response.json()
🧰 Tools
🪛 ast-grep (0.43.0)

[info] 80-82: no timeout was given on call to external resource
Context: requests.get(
f"{SERVER}/cuopt/solution/{req_id}", headers=HEADERS
)
Note: [CWE-1088].

(requests-timeout)

🪛 Ruff (0.15.17)

[error] 81-81: Probable use of requests call without timeout

(S113)

🤖 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/cuopt-server-api-python/assets/vrp_basic/client.py around
lines 80 - 83, The requests.get() call in the polling loop lacks a timeout
parameter, which could cause the request to hang indefinitely if the server is
unresponsive. Add a timeout parameter (approximately 5 seconds) to the
requests.get() call that retrieves the solution from
SERVER/cuopt/solution/{req_id} to ensure the retry loop remains responsive and
can properly handle unresponsive servers.

Source: Linters/SAST tools

Comment on lines +67 to +69
response = requests.post(
f"{SERVER}/cuopt/request", json=payload, headers=HEADERS
)

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.

⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Add timeout to prevent indefinite hang.

The POST request lacks a timeout parameter. If the server doesn't respond, this call will hang indefinitely.

⏱️ Proposed fix
     response = requests.post(
-        f"{SERVER}/cuopt/request", json=payload, headers=HEADERS
+        f"{SERVER}/cuopt/request", json=payload, headers=HEADERS, timeout=30
     )
📝 Committable suggestion

‼️ 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.

Suggested change
response = requests.post(
f"{SERVER}/cuopt/request", json=payload, headers=HEADERS
)
response = requests.post(
f"{SERVER}/cuopt/request", json=payload, headers=HEADERS, timeout=30
)
🧰 Tools
🪛 Ruff (0.15.17)

[error] 67-67: Probable use of requests call without timeout

(S113)

🤖 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/cuopt-server-api-python/assets/vrp_simple/client.py around
lines 67 - 69, The requests.post call lacks a timeout parameter which will cause
the request to hang indefinitely if the server becomes unresponsive. Add a
timeout parameter to the requests.post method call on the line making the POST
request to SERVER/cuopt/request with HEADERS. Specify an appropriate timeout
value in seconds as the timeout keyword argument to prevent indefinite blocking.

f"{SERVER}/cuopt/request", json=payload, headers=HEADERS
)
response.raise_for_status()
req_id = response.json()["reqId"]

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.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Handle missing reqId key gracefully.

Direct dictionary access will raise KeyError if "reqId" is missing from the server response.

🛡️ Proposed fix
-    req_id = response.json()["reqId"]
+    result = response.json()
+    if "reqId" not in result:
+        print(f"Error: Server response missing reqId: {result}")
+        sys.exit(1)
+    req_id = result["reqId"]
🤖 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/cuopt-server-api-python/assets/vrp_simple/client.py at line
71, The direct dictionary access using brackets in the line with
`response.json()["reqId"]` will raise a KeyError if the "reqId" key is missing
from the server response. Replace the bracket notation with the `.get()` method
on the response JSON dictionary to gracefully handle the case where "reqId" is
absent, either returning a default value or allowing the code to handle the
missing key appropriately instead of crashing.

Comment on lines +75 to +77
response = requests.get(
f"{SERVER}/cuopt/solution/{req_id}", headers=HEADERS
)

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.

⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Add timeout to polling GET request.

The GET request in the polling loop lacks a timeout. If the server becomes unresponsive, polling iterations can hang indefinitely.

⏱️ Proposed fix
         response = requests.get(
-            f"{SERVER}/cuopt/solution/{req_id}", headers=HEADERS
+            f"{SERVER}/cuopt/solution/{req_id}", headers=HEADERS, timeout=10
         )
📝 Committable suggestion

‼️ 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.

Suggested change
response = requests.get(
f"{SERVER}/cuopt/solution/{req_id}", headers=HEADERS
)
response = requests.get(
f"{SERVER}/cuopt/solution/{req_id}", headers=HEADERS, timeout=10
)
🧰 Tools
🪛 Ruff (0.15.17)

[error] 75-75: Probable use of requests call without timeout

(S113)

🤖 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/cuopt-server-api-python/assets/vrp_simple/client.py around
lines 75 - 77, The requests.get() call used for polling the server lacks a
timeout parameter, which can cause the polling loop to hang indefinitely if the
server becomes unresponsive. Add a timeout parameter to the requests.get()
method call that retrieves the solution from the cuopt/solution endpoint. Choose
an appropriate timeout value (e.g., 10-30 seconds) that balances between
allowing sufficient time for the server to respond and preventing excessive
hangs during network issues.

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