chore(skills): add NVIDIA skills bundle artifacts#5546
Conversation
📝 WalkthroughWalkthroughThis PR adds multiple ChangesSkill package additions
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Suggested labels
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
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 winAddress 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.mdandreferences/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 winPotential 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 anytotal_revenueis 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_revenuevalues 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 | 🟡 MinorReplace deprecated
Problem.readMPS()withProblem.read().Line 74 uses
Problem.readMPS(), which is deprecated in current cuOpt versions. The unifiedProblem.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 winUnused loop variable
station.The loop variable
stationis 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 winUnused unpacked variables
reportandgroup_nulls.The variables
reportandgroup_nullsare unpacked fromanalyze_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 | 🟡 MinorAdd clarifying comments about intentional missing stream synchronization.
The observation is accurate:
consume_on_streamreadstable->dataonconsumer_stream(line 94) without explicit synchronization withtable->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 | 🟡 MinorMissing stream synchronization in destructor—intentional teaching bug that requires fixing.
The destructor (lines 61–69) frees
dataand destroysproducer_streamwithout synchronizing. Thebuild_table_asyncfunction launchesfill_kernelonproducer_streamasynchronously (line 77), andconsume_on_streamreadstable->datafrom 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_streambefore 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 | 🟡 MinorAdd 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 encounterNameError: 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 | 🟡 MinorAdd a requirements.txt or dependency declaration for eval assets.
The eval scripts import
numpyandpandas(and likelycudf), but there is norequirements.txt,environment.yml, or dependency declaration in the eval asset directory or rootpyproject.tomlto document these requirements. Users runninggenerate_data.pyorparquet_pipeline.pywill 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 winGuard 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
inforNaN. 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 winClarify or revise the company email classification logic.
The
is_company_emailflag is set when the domain ends with.orgor.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_emailto 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 | 🟡 MinorFix 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 winCatch specific exception type instead of bare
Exception.Line 25 catches
Exceptionbroadly, which masks programming errors. Catchrequests.RequestExceptionspecifically 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 winFix 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 | 🟡 MinorAddress 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:48andresults.md:69are actually scientific notation (+2.58776093e+04) from solver output and do not represent data exposure risks.The legitimate actionable findings are:
- Missing recommended section:
## Instructionsin SKILL.md- Missing recommended section:
## Examplesin SKILL.mdAdd 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 winCheck solver status before accessing objective value.
Line 46 accesses
problem.ObjValueregardless 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 winAdd status check before accessing objective value.
Line 35 accesses
problem.ObjValuewithout 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 winValidate
solution_costarray 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 anIndexError.🛡️ 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
📒 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
| 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") |
There was a problem hiding this comment.
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.
| 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 |
There was a problem hiding this comment.
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.
| 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.
| 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); | ||
| } |
There was a problem hiding this comment.
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
| 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); |
There was a problem hiding this comment.
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.
| # 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. |
There was a problem hiding this comment.
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:
- The security issue on line 72 is fixed in
references/server_examples.md:7(bind to a specific interface, not 0.0.0.0). - The duplicate-content findings are resolved.
- The SKILL.md is updated with missing sections (Instructions, Purpose, Prerequisites, Limitations).
- 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.
| response = requests.post( | ||
| f"{SERVER}/cuopt/request", json=payload, headers=HEADERS | ||
| ) | ||
| response.raise_for_status() |
There was a problem hiding this comment.
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.
| 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
| for _ in range(30): | ||
| response = requests.get( | ||
| f"{SERVER}/cuopt/solution/{req_id}", headers=HEADERS | ||
| ) |
There was a problem hiding this comment.
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.
| 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
| response = requests.post( | ||
| f"{SERVER}/cuopt/request", json=payload, headers=HEADERS | ||
| ) |
There was a problem hiding this comment.
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.
| 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"] |
There was a problem hiding this comment.
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.
| response = requests.get( | ||
| f"{SERVER}/cuopt/solution/{req_id}", headers=HEADERS | ||
| ) |
There was a problem hiding this comment.
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.
| 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.
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
.agents/skills.skills-lock.jsonfor installed skill bundle state.Type of Change
Verification
Verifiedin GitHubnpx prek run --from-ref main --to-ref HEADpassesnpm testpasses (broad runtime changes only)npm run docsbuilds without warnings (doc changes only)Signed-off-by: Musab musab@local
Summary by CodeRabbit
New Features
Documentation