[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-nvidia-udf-gen-test":3,"mdc-wtgtl0-key":37,"related-org-nvidia-udf-gen-test":926,"related-repo-nvidia-udf-gen-test":1085},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":32,"sourceUrl":35,"mdContent":36},"udf-gen-test","generate unit tests for Spark UDFs","Assists with generating a unit test for an Apache Spark UDF. This is step 1 of 3 in the UDF conversion workflow (udf-gen-test -> udf-convert-to-* -> udf-benchmark). Use this skill when you have a CPU UDF and need to create a unit test for the UDF before converting it into a GPU-compatible implementation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},"nvidia","NVIDIA","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fnvidia.png",[12,16,17,20],{"name":13,"slug":14,"type":15},"Java","java","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Spark","spark",{"name":21,"slug":22,"type":15},"Testing","testing",987,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fcudf-spark","2026-07-14T05:30:55.30163","CC-BY-4.0 AND Apache-2.0",289,[29,30,31,19],"big-data","gpu","rapids",{"repoUrl":24,"stars":23,"forks":27,"topics":33,"description":34},[29,30,31,19],"Spark RAPIDS plugin - accelerate Apache Spark with GPUs","https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fcudf-spark\u002Ftree\u002FHEAD\u002Fskills\u002Fudf-gen-test","---\nname: udf-gen-test\ndescription: Assists with generating a unit test for an Apache Spark UDF. This is step 1 of 3 in the UDF conversion workflow (udf-gen-test -> udf-convert-to-* -> udf-benchmark). Use this skill when you have a CPU UDF and need to create a unit test for the UDF before converting it into a GPU-compatible implementation.\nlicense: CC-BY-4.0 AND Apache-2.0\nmetadata:\n  spdx-file-copyright-text: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\nmodel: inherit\n---\n\n# UDF Unit Test Generation\n\n## Workflow\n\n- [ ] Step 1: Set up project (copy template, add UDF source)\n- [ ] Step 2: Implement the unit test (fill in TODO methods)\n- [ ] Step 3: Compile and test until passing\n- [ ] Step 4: Run coverage and inspect gaps\n- [ ] Step 5: Verify outputs\n\n**Before making any edits, create a visible TODO checklist for every workflow step in this skill and keep it updated.** Do not produce a final answer until every required checklist item is marked complete.\n\n## Prerequisites\n\n- Path to the input UDF file (Java or Scala)\n\nDerive `\u003CCamelName>` and `\u003Csnake_name>` from the UDF class name.\n\n> **Note:** Commands require access to `\u002Ftmp` (Spark temp storage) and `\u002Fdev` (GPU device). If commands fail due to sandbox restrictions, re-run them unsandboxed.\n\n## Step 1: Set Up the Project\n\n### 1a. Copy the template project\n\nThe project can be found under this skill's templates directory.\n```bash\ncp -r templates\u002Fscala \u003Cproject_root>\u002F\u003CCamelName>\u002F\n```\n\nThis provides a complete Maven project with all test and benchmark infrastructure.\n\n### 1b. Copy or extract the UDF source\n\nBefore copying code, decide whether the input UDF is already self-contained:\n- If the UDF file contains only the target UDF and local helpers it directly needs, copy it as-is.\n- If the UDF is part of a larger project or a file containing unrelated UDFs\u002Fclasses, extract only the target UDF class\u002Fobject and all local helper classes\u002Fmethods required for that UDF to compile and run (modifying package declarations as needed).\n\nThe template project should contain the smallest self-contained implementation of the target CPU UDF.\n\nPlace the resulting source file(s) in the source directory:\n- Java: `\u003CCamelName>\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fudf\u002F`\n- Scala: `\u003CCamelName>\u002Fsrc\u002Fmain\u002Fscala\u002Fcom\u002Fudf\u002F`\n\nSet the package declaration to `com.udf`:\n- Java: `package com.udf;`\n- Scala: `package com.udf`\n\n## Step 2: Implement the Unit Test\n\nRead `src\u002Ftest\u002Fscala\u002Fcom\u002Fudf\u002FUnitTest.scala`. Replace placeholders with the actual camel\u002Fsnake UDF name.\n\nFill in the TODO methods following the docstrings. Include diverse edge cases in `createTestData` (nulls, empty strings, malformed inputs, varying lengths).\n\n### Test Data Coverage\n\nThe generated tests should serve as a strong specification of the CPU UDF behavior over a documented input domain, and are intended to prove that a GPU or SQL implementation preserves the CPU UDF behavior.\nFor each input type and visible UDF branch, include applicable examples from these coverage dimensions:\n- null inputs and null elements\n- empty strings, arrays, maps, or structs\n- malformed or unparsable inputs\n- edges of input boundaries, such as min\u002Fmax valid values, string length, or array length\n- numeric sign\u002Fidentity cases, such as negative, zero, and positive values\n- string variety, such as unicode, ASCII, and encoding-sensitive inputs\n- date\u002Ftime boundaries, such as epoch, end-of-day\u002Fmonth\u002Fyear, leap day, and DST\u002Ftimezone transitions\n- decimal precision and scale\n- duplicate rows and repeated values\n- mixed valid\u002Finvalid rows in the same DataFrame\n- nested empty and nested null values\n\nAssertions should verify schema, row count, deterministic ordering, output values, null propagation, and exception\u002Fdefault behavior. Every visible UDF branch should be covered by the unit test or explicitly documented as out of scope.\n\n### Critical Requirements\n\n- Do NOT hardcode the UDF name; use the provided `udfName` argument. This ensures the correct registered UDF is exercised.\n- Assume the user's UDF implementation is correct; the assertions should reflect its actual behavior.\n\n## Step 3: Compile and Test\n\n```bash\nmvn test -Dsuites=com.udf.UnitTest\n```\n\nIf it fails, analyze the error output (stdout\u002Fstderr) and fix the test code. Continue iterating until the test passes.\n\n## Step 4: Coverage Report\n\nThe template projects use JaCoCo (Java) \u002F scoverage (Scala) code coverage tools.\n\n```bash\n# Java UDF\nmvn -Pcoverage test jacoco:report -Dsuites=com.udf.UnitTest\n\n# Scala UDF\nmvn -Pcoverage scoverage:report -Dsuites=com.udf.UnitTest\n```\n\nFor a Java UDF, read `target\u002Fsite\u002Fjacoco\u002Fjacoco.csv` and inspect LINE, BRANCH, and METHOD counters for the target CPU UDF class and local helper classes. In `jacoco.xml`, counters appear as `\u003Ccounter type=\"...\">` elements, and source-line misses appear under `\u003Csourcefile>\u003Cline nr=\"...\" mi=\"...\" ci=\"...\" mb=\"...\" cb=\"...\">`.\n\nFor a Scala UDF, read `target\u002Fscoverage.xml` and inspect statement, branch, and method-level coverage for the target CPU UDF class\u002Fobject and local helper classes\u002Fobjects. scoverage XML stores package\u002Fclass\u002Fmethod `statement-rate` and `branch-rate` attributes, and each executable statement has `line`, `branch`, and `invocation-count` attributes.\n\nUse the coverage report as actionable feedback:\n1. Inspect missed Java line, branch, and method coverage, or missed Scala statement, branch, and method-level coverage.\n2. Add test cases and assertions that exercise those paths.\n3. Re-run the unit test and coverage report.\n4. Repeat until important CPU UDF branches are covered.\n\nIf a missed line, statement, branch, or method path cannot or should not be tested, add a clear comment explaining why. Examples include:\n- unreachable defensive code\n- unsupported input domains\n- unrelated template infrastructure\n\nReport the relevant counters for the target CPU UDF and local helper classes\u002Fobjects:\n- Java: LINE, BRANCH, and METHOD counters from JaCoCo.\n- Scala: statement and branch coverage from scoverage, plus method-level statement\u002Fbranch rates from `\u003Cmethod>` elements.\n\nNOTE: JaCoCo and scoverage will not track source-level coverage in external JARs. If the UDF relies on external JAR business logic, make a note of this residual coverage gap.\n\n## Step 5: Verify Outputs\n\nAfter the test passes, verify that:\n1. The test data covers various edge cases and reflects realistic input formats\n2. The assertions reflect actual UDF behavior (no \"cheating\" by hardcoding values)\n3. The coverage report shows strong coverage of the target CPU UDF and local helper logic\n4. Any uncovered lines, branches, or methods are explicitly explained\n5. Any external JAR logic invoked by the UDF is called out as outside the coverage scope\n\nIf any quality checks fail, revise the test code and re-run.\n\n## Output\n\nUpon successful completion:\n- Project directory: `\u003Cproject_root>\u002F\u003CCamelName>\u002F`\n- Unit test: `src\u002Ftest\u002Fscala\u002Fcom\u002Fudf\u002FUnitTest.scala`\n\nThese outputs are required for **Step 2: Convert UDF**.\n",{"data":38,"body":42},{"name":4,"description":6,"license":26,"metadata":39,"model":41},{"spdx-file-copyright-text":40},"Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.","inherit",{"type":43,"children":44},"root",[45,54,61,117,129,135,143,165,195,201,208,213,298,303,309,314,327,332,337,362,375,398,404,417,430,436,441,499,504,510,531,537,562,567,573,578,659,696,747,752,776,781,799,804,825,830,836,841,869,874,880,885,909,920],{"type":46,"tag":47,"props":48,"children":50},"element","h1",{"id":49},"udf-unit-test-generation",[51],{"type":52,"value":53},"text","UDF Unit Test Generation",{"type":46,"tag":55,"props":56,"children":58},"h2",{"id":57},"workflow",[59],{"type":52,"value":60},"Workflow",{"type":46,"tag":62,"props":63,"children":66},"ul",{"className":64},[65],"contains-task-list",[67,81,90,99,108],{"type":46,"tag":68,"props":69,"children":72},"li",{"className":70},[71],"task-list-item",[73,79],{"type":46,"tag":74,"props":75,"children":78},"input",{"disabled":76,"type":77},true,"checkbox",[],{"type":52,"value":80}," Step 1: Set up project (copy template, add UDF source)",{"type":46,"tag":68,"props":82,"children":84},{"className":83},[71],[85,88],{"type":46,"tag":74,"props":86,"children":87},{"disabled":76,"type":77},[],{"type":52,"value":89}," Step 2: Implement the unit test (fill in TODO methods)",{"type":46,"tag":68,"props":91,"children":93},{"className":92},[71],[94,97],{"type":46,"tag":74,"props":95,"children":96},{"disabled":76,"type":77},[],{"type":52,"value":98}," Step 3: Compile and test until passing",{"type":46,"tag":68,"props":100,"children":102},{"className":101},[71],[103,106],{"type":46,"tag":74,"props":104,"children":105},{"disabled":76,"type":77},[],{"type":52,"value":107}," Step 4: Run coverage and inspect gaps",{"type":46,"tag":68,"props":109,"children":111},{"className":110},[71],[112,115],{"type":46,"tag":74,"props":113,"children":114},{"disabled":76,"type":77},[],{"type":52,"value":116}," Step 5: Verify outputs",{"type":46,"tag":118,"props":119,"children":120},"p",{},[121,127],{"type":46,"tag":122,"props":123,"children":124},"strong",{},[125],{"type":52,"value":126},"Before making any edits, create a visible TODO checklist for every workflow step in this skill and keep it updated.",{"type":52,"value":128}," Do not produce a final answer until every required checklist item is marked complete.",{"type":46,"tag":55,"props":130,"children":132},{"id":131},"prerequisites",[133],{"type":52,"value":134},"Prerequisites",{"type":46,"tag":62,"props":136,"children":137},{},[138],{"type":46,"tag":68,"props":139,"children":140},{},[141],{"type":52,"value":142},"Path to the input UDF file (Java or Scala)",{"type":46,"tag":118,"props":144,"children":145},{},[146,148,155,157,163],{"type":52,"value":147},"Derive ",{"type":46,"tag":149,"props":150,"children":152},"code",{"className":151},[],[153],{"type":52,"value":154},"\u003CCamelName>",{"type":52,"value":156}," and ",{"type":46,"tag":149,"props":158,"children":160},{"className":159},[],[161],{"type":52,"value":162},"\u003Csnake_name>",{"type":52,"value":164}," from the UDF class name.",{"type":46,"tag":166,"props":167,"children":168},"blockquote",{},[169],{"type":46,"tag":118,"props":170,"children":171},{},[172,177,179,185,187,193],{"type":46,"tag":122,"props":173,"children":174},{},[175],{"type":52,"value":176},"Note:",{"type":52,"value":178}," Commands require access to ",{"type":46,"tag":149,"props":180,"children":182},{"className":181},[],[183],{"type":52,"value":184},"\u002Ftmp",{"type":52,"value":186}," (Spark temp storage) and ",{"type":46,"tag":149,"props":188,"children":190},{"className":189},[],[191],{"type":52,"value":192},"\u002Fdev",{"type":52,"value":194}," (GPU device). If commands fail due to sandbox restrictions, re-run them unsandboxed.",{"type":46,"tag":55,"props":196,"children":198},{"id":197},"step-1-set-up-the-project",[199],{"type":52,"value":200},"Step 1: Set Up the Project",{"type":46,"tag":202,"props":203,"children":205},"h3",{"id":204},"_1a-copy-the-template-project",[206],{"type":52,"value":207},"1a. Copy the template project",{"type":46,"tag":118,"props":209,"children":210},{},[211],{"type":52,"value":212},"The project can be found under this skill's templates directory.",{"type":46,"tag":214,"props":215,"children":220},"pre",{"className":216,"code":217,"language":218,"meta":219,"style":219},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","cp -r templates\u002Fscala \u003Cproject_root>\u002F\u003CCamelName>\u002F\n","bash","",[221],{"type":46,"tag":149,"props":222,"children":223},{"__ignoreMap":219},[224],{"type":46,"tag":225,"props":226,"children":229},"span",{"class":227,"line":228},"line",1,[230,236,242,247,253,258,264,269,274,279,284,289,293],{"type":46,"tag":225,"props":231,"children":233},{"style":232},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[234],{"type":52,"value":235},"cp",{"type":46,"tag":225,"props":237,"children":239},{"style":238},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[240],{"type":52,"value":241}," -r",{"type":46,"tag":225,"props":243,"children":244},{"style":238},[245],{"type":52,"value":246}," templates\u002Fscala",{"type":46,"tag":225,"props":248,"children":250},{"style":249},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[251],{"type":52,"value":252}," \u003C",{"type":46,"tag":225,"props":254,"children":255},{"style":238},[256],{"type":52,"value":257},"project_roo",{"type":46,"tag":225,"props":259,"children":261},{"style":260},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[262],{"type":52,"value":263},"t",{"type":46,"tag":225,"props":265,"children":266},{"style":249},[267],{"type":52,"value":268},">",{"type":46,"tag":225,"props":270,"children":271},{"style":238},[272],{"type":52,"value":273},"\u002F",{"type":46,"tag":225,"props":275,"children":276},{"style":249},[277],{"type":52,"value":278},"\u003C",{"type":46,"tag":225,"props":280,"children":281},{"style":238},[282],{"type":52,"value":283},"CamelNam",{"type":46,"tag":225,"props":285,"children":286},{"style":260},[287],{"type":52,"value":288},"e",{"type":46,"tag":225,"props":290,"children":291},{"style":249},[292],{"type":52,"value":268},{"type":46,"tag":225,"props":294,"children":295},{"style":238},[296],{"type":52,"value":297},"\u002F\n",{"type":46,"tag":118,"props":299,"children":300},{},[301],{"type":52,"value":302},"This provides a complete Maven project with all test and benchmark infrastructure.",{"type":46,"tag":202,"props":304,"children":306},{"id":305},"_1b-copy-or-extract-the-udf-source",[307],{"type":52,"value":308},"1b. Copy or extract the UDF source",{"type":46,"tag":118,"props":310,"children":311},{},[312],{"type":52,"value":313},"Before copying code, decide whether the input UDF is already self-contained:",{"type":46,"tag":62,"props":315,"children":316},{},[317,322],{"type":46,"tag":68,"props":318,"children":319},{},[320],{"type":52,"value":321},"If the UDF file contains only the target UDF and local helpers it directly needs, copy it as-is.",{"type":46,"tag":68,"props":323,"children":324},{},[325],{"type":52,"value":326},"If the UDF is part of a larger project or a file containing unrelated UDFs\u002Fclasses, extract only the target UDF class\u002Fobject and all local helper classes\u002Fmethods required for that UDF to compile and run (modifying package declarations as needed).",{"type":46,"tag":118,"props":328,"children":329},{},[330],{"type":52,"value":331},"The template project should contain the smallest self-contained implementation of the target CPU UDF.",{"type":46,"tag":118,"props":333,"children":334},{},[335],{"type":52,"value":336},"Place the resulting source file(s) in the source directory:",{"type":46,"tag":62,"props":338,"children":339},{},[340,351],{"type":46,"tag":68,"props":341,"children":342},{},[343,345],{"type":52,"value":344},"Java: ",{"type":46,"tag":149,"props":346,"children":348},{"className":347},[],[349],{"type":52,"value":350},"\u003CCamelName>\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fudf\u002F",{"type":46,"tag":68,"props":352,"children":353},{},[354,356],{"type":52,"value":355},"Scala: ",{"type":46,"tag":149,"props":357,"children":359},{"className":358},[],[360],{"type":52,"value":361},"\u003CCamelName>\u002Fsrc\u002Fmain\u002Fscala\u002Fcom\u002Fudf\u002F",{"type":46,"tag":118,"props":363,"children":364},{},[365,367,373],{"type":52,"value":366},"Set the package declaration to ",{"type":46,"tag":149,"props":368,"children":370},{"className":369},[],[371],{"type":52,"value":372},"com.udf",{"type":52,"value":374},":",{"type":46,"tag":62,"props":376,"children":377},{},[378,388],{"type":46,"tag":68,"props":379,"children":380},{},[381,382],{"type":52,"value":344},{"type":46,"tag":149,"props":383,"children":385},{"className":384},[],[386],{"type":52,"value":387},"package com.udf;",{"type":46,"tag":68,"props":389,"children":390},{},[391,392],{"type":52,"value":355},{"type":46,"tag":149,"props":393,"children":395},{"className":394},[],[396],{"type":52,"value":397},"package com.udf",{"type":46,"tag":55,"props":399,"children":401},{"id":400},"step-2-implement-the-unit-test",[402],{"type":52,"value":403},"Step 2: Implement the Unit Test",{"type":46,"tag":118,"props":405,"children":406},{},[407,409,415],{"type":52,"value":408},"Read ",{"type":46,"tag":149,"props":410,"children":412},{"className":411},[],[413],{"type":52,"value":414},"src\u002Ftest\u002Fscala\u002Fcom\u002Fudf\u002FUnitTest.scala",{"type":52,"value":416},". Replace placeholders with the actual camel\u002Fsnake UDF name.",{"type":46,"tag":118,"props":418,"children":419},{},[420,422,428],{"type":52,"value":421},"Fill in the TODO methods following the docstrings. Include diverse edge cases in ",{"type":46,"tag":149,"props":423,"children":425},{"className":424},[],[426],{"type":52,"value":427},"createTestData",{"type":52,"value":429}," (nulls, empty strings, malformed inputs, varying lengths).",{"type":46,"tag":202,"props":431,"children":433},{"id":432},"test-data-coverage",[434],{"type":52,"value":435},"Test Data Coverage",{"type":46,"tag":118,"props":437,"children":438},{},[439],{"type":52,"value":440},"The generated tests should serve as a strong specification of the CPU UDF behavior over a documented input domain, and are intended to prove that a GPU or SQL implementation preserves the CPU UDF behavior.\nFor each input type and visible UDF branch, include applicable examples from these coverage dimensions:",{"type":46,"tag":62,"props":442,"children":443},{},[444,449,454,459,464,469,474,479,484,489,494],{"type":46,"tag":68,"props":445,"children":446},{},[447],{"type":52,"value":448},"null inputs and null elements",{"type":46,"tag":68,"props":450,"children":451},{},[452],{"type":52,"value":453},"empty strings, arrays, maps, or structs",{"type":46,"tag":68,"props":455,"children":456},{},[457],{"type":52,"value":458},"malformed or unparsable inputs",{"type":46,"tag":68,"props":460,"children":461},{},[462],{"type":52,"value":463},"edges of input boundaries, such as min\u002Fmax valid values, string length, or array length",{"type":46,"tag":68,"props":465,"children":466},{},[467],{"type":52,"value":468},"numeric sign\u002Fidentity cases, such as negative, zero, and positive values",{"type":46,"tag":68,"props":470,"children":471},{},[472],{"type":52,"value":473},"string variety, such as unicode, ASCII, and encoding-sensitive inputs",{"type":46,"tag":68,"props":475,"children":476},{},[477],{"type":52,"value":478},"date\u002Ftime boundaries, such as epoch, end-of-day\u002Fmonth\u002Fyear, leap day, and DST\u002Ftimezone transitions",{"type":46,"tag":68,"props":480,"children":481},{},[482],{"type":52,"value":483},"decimal precision and scale",{"type":46,"tag":68,"props":485,"children":486},{},[487],{"type":52,"value":488},"duplicate rows and repeated values",{"type":46,"tag":68,"props":490,"children":491},{},[492],{"type":52,"value":493},"mixed valid\u002Finvalid rows in the same DataFrame",{"type":46,"tag":68,"props":495,"children":496},{},[497],{"type":52,"value":498},"nested empty and nested null values",{"type":46,"tag":118,"props":500,"children":501},{},[502],{"type":52,"value":503},"Assertions should verify schema, row count, deterministic ordering, output values, null propagation, and exception\u002Fdefault behavior. Every visible UDF branch should be covered by the unit test or explicitly documented as out of scope.",{"type":46,"tag":202,"props":505,"children":507},{"id":506},"critical-requirements",[508],{"type":52,"value":509},"Critical Requirements",{"type":46,"tag":62,"props":511,"children":512},{},[513,526],{"type":46,"tag":68,"props":514,"children":515},{},[516,518,524],{"type":52,"value":517},"Do NOT hardcode the UDF name; use the provided ",{"type":46,"tag":149,"props":519,"children":521},{"className":520},[],[522],{"type":52,"value":523},"udfName",{"type":52,"value":525}," argument. This ensures the correct registered UDF is exercised.",{"type":46,"tag":68,"props":527,"children":528},{},[529],{"type":52,"value":530},"Assume the user's UDF implementation is correct; the assertions should reflect its actual behavior.",{"type":46,"tag":55,"props":532,"children":534},{"id":533},"step-3-compile-and-test",[535],{"type":52,"value":536},"Step 3: Compile and Test",{"type":46,"tag":214,"props":538,"children":540},{"className":216,"code":539,"language":218,"meta":219,"style":219},"mvn test -Dsuites=com.udf.UnitTest\n",[541],{"type":46,"tag":149,"props":542,"children":543},{"__ignoreMap":219},[544],{"type":46,"tag":225,"props":545,"children":546},{"class":227,"line":228},[547,552,557],{"type":46,"tag":225,"props":548,"children":549},{"style":232},[550],{"type":52,"value":551},"mvn",{"type":46,"tag":225,"props":553,"children":554},{"style":238},[555],{"type":52,"value":556}," test",{"type":46,"tag":225,"props":558,"children":559},{"style":238},[560],{"type":52,"value":561}," -Dsuites=com.udf.UnitTest\n",{"type":46,"tag":118,"props":563,"children":564},{},[565],{"type":52,"value":566},"If it fails, analyze the error output (stdout\u002Fstderr) and fix the test code. Continue iterating until the test passes.",{"type":46,"tag":55,"props":568,"children":570},{"id":569},"step-4-coverage-report",[571],{"type":52,"value":572},"Step 4: Coverage Report",{"type":46,"tag":118,"props":574,"children":575},{},[576],{"type":52,"value":577},"The template projects use JaCoCo (Java) \u002F scoverage (Scala) code coverage tools.",{"type":46,"tag":214,"props":579,"children":581},{"className":216,"code":580,"language":218,"meta":219,"style":219},"# Java UDF\nmvn -Pcoverage test jacoco:report -Dsuites=com.udf.UnitTest\n\n# Scala UDF\nmvn -Pcoverage scoverage:report -Dsuites=com.udf.UnitTest\n",[582],{"type":46,"tag":149,"props":583,"children":584},{"__ignoreMap":219},[585,594,620,629,638],{"type":46,"tag":225,"props":586,"children":587},{"class":227,"line":228},[588],{"type":46,"tag":225,"props":589,"children":591},{"style":590},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[592],{"type":52,"value":593},"# Java UDF\n",{"type":46,"tag":225,"props":595,"children":597},{"class":227,"line":596},2,[598,602,607,611,616],{"type":46,"tag":225,"props":599,"children":600},{"style":232},[601],{"type":52,"value":551},{"type":46,"tag":225,"props":603,"children":604},{"style":238},[605],{"type":52,"value":606}," -Pcoverage",{"type":46,"tag":225,"props":608,"children":609},{"style":238},[610],{"type":52,"value":556},{"type":46,"tag":225,"props":612,"children":613},{"style":238},[614],{"type":52,"value":615}," jacoco:report",{"type":46,"tag":225,"props":617,"children":618},{"style":238},[619],{"type":52,"value":561},{"type":46,"tag":225,"props":621,"children":623},{"class":227,"line":622},3,[624],{"type":46,"tag":225,"props":625,"children":626},{"emptyLinePlaceholder":76},[627],{"type":52,"value":628},"\n",{"type":46,"tag":225,"props":630,"children":632},{"class":227,"line":631},4,[633],{"type":46,"tag":225,"props":634,"children":635},{"style":590},[636],{"type":52,"value":637},"# Scala UDF\n",{"type":46,"tag":225,"props":639,"children":641},{"class":227,"line":640},5,[642,646,650,655],{"type":46,"tag":225,"props":643,"children":644},{"style":232},[645],{"type":52,"value":551},{"type":46,"tag":225,"props":647,"children":648},{"style":238},[649],{"type":52,"value":606},{"type":46,"tag":225,"props":651,"children":652},{"style":238},[653],{"type":52,"value":654}," scoverage:report",{"type":46,"tag":225,"props":656,"children":657},{"style":238},[658],{"type":52,"value":561},{"type":46,"tag":118,"props":660,"children":661},{},[662,664,670,672,678,680,686,688,694],{"type":52,"value":663},"For a Java UDF, read ",{"type":46,"tag":149,"props":665,"children":667},{"className":666},[],[668],{"type":52,"value":669},"target\u002Fsite\u002Fjacoco\u002Fjacoco.csv",{"type":52,"value":671}," and inspect LINE, BRANCH, and METHOD counters for the target CPU UDF class and local helper classes. In ",{"type":46,"tag":149,"props":673,"children":675},{"className":674},[],[676],{"type":52,"value":677},"jacoco.xml",{"type":52,"value":679},", counters appear as ",{"type":46,"tag":149,"props":681,"children":683},{"className":682},[],[684],{"type":52,"value":685},"\u003Ccounter type=\"...\">",{"type":52,"value":687}," elements, and source-line misses appear under ",{"type":46,"tag":149,"props":689,"children":691},{"className":690},[],[692],{"type":52,"value":693},"\u003Csourcefile>\u003Cline nr=\"...\" mi=\"...\" ci=\"...\" mb=\"...\" cb=\"...\">",{"type":52,"value":695},".",{"type":46,"tag":118,"props":697,"children":698},{},[699,701,707,709,715,716,722,724,729,731,737,739,745],{"type":52,"value":700},"For a Scala UDF, read ",{"type":46,"tag":149,"props":702,"children":704},{"className":703},[],[705],{"type":52,"value":706},"target\u002Fscoverage.xml",{"type":52,"value":708}," and inspect statement, branch, and method-level coverage for the target CPU UDF class\u002Fobject and local helper classes\u002Fobjects. scoverage XML stores package\u002Fclass\u002Fmethod ",{"type":46,"tag":149,"props":710,"children":712},{"className":711},[],[713],{"type":52,"value":714},"statement-rate",{"type":52,"value":156},{"type":46,"tag":149,"props":717,"children":719},{"className":718},[],[720],{"type":52,"value":721},"branch-rate",{"type":52,"value":723}," attributes, and each executable statement has ",{"type":46,"tag":149,"props":725,"children":727},{"className":726},[],[728],{"type":52,"value":227},{"type":52,"value":730},", ",{"type":46,"tag":149,"props":732,"children":734},{"className":733},[],[735],{"type":52,"value":736},"branch",{"type":52,"value":738},", and ",{"type":46,"tag":149,"props":740,"children":742},{"className":741},[],[743],{"type":52,"value":744},"invocation-count",{"type":52,"value":746}," attributes.",{"type":46,"tag":118,"props":748,"children":749},{},[750],{"type":52,"value":751},"Use the coverage report as actionable feedback:",{"type":46,"tag":753,"props":754,"children":755},"ol",{},[756,761,766,771],{"type":46,"tag":68,"props":757,"children":758},{},[759],{"type":52,"value":760},"Inspect missed Java line, branch, and method coverage, or missed Scala statement, branch, and method-level coverage.",{"type":46,"tag":68,"props":762,"children":763},{},[764],{"type":52,"value":765},"Add test cases and assertions that exercise those paths.",{"type":46,"tag":68,"props":767,"children":768},{},[769],{"type":52,"value":770},"Re-run the unit test and coverage report.",{"type":46,"tag":68,"props":772,"children":773},{},[774],{"type":52,"value":775},"Repeat until important CPU UDF branches are covered.",{"type":46,"tag":118,"props":777,"children":778},{},[779],{"type":52,"value":780},"If a missed line, statement, branch, or method path cannot or should not be tested, add a clear comment explaining why. Examples include:",{"type":46,"tag":62,"props":782,"children":783},{},[784,789,794],{"type":46,"tag":68,"props":785,"children":786},{},[787],{"type":52,"value":788},"unreachable defensive code",{"type":46,"tag":68,"props":790,"children":791},{},[792],{"type":52,"value":793},"unsupported input domains",{"type":46,"tag":68,"props":795,"children":796},{},[797],{"type":52,"value":798},"unrelated template infrastructure",{"type":46,"tag":118,"props":800,"children":801},{},[802],{"type":52,"value":803},"Report the relevant counters for the target CPU UDF and local helper classes\u002Fobjects:",{"type":46,"tag":62,"props":805,"children":806},{},[807,812],{"type":46,"tag":68,"props":808,"children":809},{},[810],{"type":52,"value":811},"Java: LINE, BRANCH, and METHOD counters from JaCoCo.",{"type":46,"tag":68,"props":813,"children":814},{},[815,817,823],{"type":52,"value":816},"Scala: statement and branch coverage from scoverage, plus method-level statement\u002Fbranch rates from ",{"type":46,"tag":149,"props":818,"children":820},{"className":819},[],[821],{"type":52,"value":822},"\u003Cmethod>",{"type":52,"value":824}," elements.",{"type":46,"tag":118,"props":826,"children":827},{},[828],{"type":52,"value":829},"NOTE: JaCoCo and scoverage will not track source-level coverage in external JARs. If the UDF relies on external JAR business logic, make a note of this residual coverage gap.",{"type":46,"tag":55,"props":831,"children":833},{"id":832},"step-5-verify-outputs",[834],{"type":52,"value":835},"Step 5: Verify Outputs",{"type":46,"tag":118,"props":837,"children":838},{},[839],{"type":52,"value":840},"After the test passes, verify that:",{"type":46,"tag":753,"props":842,"children":843},{},[844,849,854,859,864],{"type":46,"tag":68,"props":845,"children":846},{},[847],{"type":52,"value":848},"The test data covers various edge cases and reflects realistic input formats",{"type":46,"tag":68,"props":850,"children":851},{},[852],{"type":52,"value":853},"The assertions reflect actual UDF behavior (no \"cheating\" by hardcoding values)",{"type":46,"tag":68,"props":855,"children":856},{},[857],{"type":52,"value":858},"The coverage report shows strong coverage of the target CPU UDF and local helper logic",{"type":46,"tag":68,"props":860,"children":861},{},[862],{"type":52,"value":863},"Any uncovered lines, branches, or methods are explicitly explained",{"type":46,"tag":68,"props":865,"children":866},{},[867],{"type":52,"value":868},"Any external JAR logic invoked by the UDF is called out as outside the coverage scope",{"type":46,"tag":118,"props":870,"children":871},{},[872],{"type":52,"value":873},"If any quality checks fail, revise the test code and re-run.",{"type":46,"tag":55,"props":875,"children":877},{"id":876},"output",[878],{"type":52,"value":879},"Output",{"type":46,"tag":118,"props":881,"children":882},{},[883],{"type":52,"value":884},"Upon successful completion:",{"type":46,"tag":62,"props":886,"children":887},{},[888,899],{"type":46,"tag":68,"props":889,"children":890},{},[891,893],{"type":52,"value":892},"Project directory: ",{"type":46,"tag":149,"props":894,"children":896},{"className":895},[],[897],{"type":52,"value":898},"\u003Cproject_root>\u002F\u003CCamelName>\u002F",{"type":46,"tag":68,"props":900,"children":901},{},[902,904],{"type":52,"value":903},"Unit test: ",{"type":46,"tag":149,"props":905,"children":907},{"className":906},[],[908],{"type":52,"value":414},{"type":46,"tag":118,"props":910,"children":911},{},[912,914,919],{"type":52,"value":913},"These outputs are required for ",{"type":46,"tag":122,"props":915,"children":916},{},[917],{"type":52,"value":918},"Step 2: Convert UDF",{"type":52,"value":695},{"type":46,"tag":921,"props":922,"children":923},"style",{},[924],{"type":52,"value":925},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":927,"total":1084},[928,946,964,975,987,1001,1014,1028,1039,1050,1064,1073],{"slug":929,"name":929,"fn":930,"description":931,"org":932,"tags":933,"stars":943,"repoUrl":944,"updatedAt":945},"nemoclaw-user-guide","retrieve NemoClaw documentation and configuration","Guides human users' AI agents to the NemoClaw docs MCP server and canonical Fern documentation in Markdown form. Use when users ask how to install, configure, operate, troubleshoot, secure, or learn NemoClaw with an AI coding assistant. Trigger keywords - nemoclaw docs, use nemoclaw with ai agent, nemoclaw mcp docs, nemoclaw install help, nemoclaw quickstart, nemoclaw markdown docs, llms.txt, agent skills.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[934,937,940],{"name":935,"slug":936,"type":15},"Documentation","documentation",{"name":938,"slug":939,"type":15},"MCP","mcp",{"name":941,"slug":942,"type":15},"Search","search",21777,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002FNemoClaw","2026-07-20T06:00:01.461044",{"slug":947,"name":947,"fn":948,"description":949,"org":950,"tags":951,"stars":961,"repoUrl":962,"updatedAt":963},"mcore-build-and-dependency","manage Megatron-LM development environments","Container-based dev environment setup and dependency management for Megatron-LM. Covers acquiring and launching the CI container, uv package management, and updating uv.lock.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[952,955,958],{"name":953,"slug":954,"type":15},"Containers","containers",{"name":956,"slug":957,"type":15},"Deployment","deployment",{"name":959,"slug":960,"type":15},"Python","python",17049,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002FMegatron-LM","2026-07-27T06:06:11.249662",{"slug":965,"name":965,"fn":966,"description":967,"org":968,"tags":969,"stars":961,"repoUrl":962,"updatedAt":974},"mcore-bump-base-image","update NVIDIA PyTorch base images","Bump the NVIDIA PyTorch base image (`nvcr.io\u002Fnvidia\u002Fpytorch:YY.MM-py3`) used by Megatron-LM CI. Covers the two pin sites (GitHub CI in `docker\u002F.ngc_version.dev` and GitLab CI in `.gitlab\u002Fstages\u002F01.build.yml`), the post-bump CI loop (re-run functional tests, refresh golden values, mark broken tests), and the gotchas that bit PRs",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[970,973],{"name":971,"slug":972,"type":15},"CI\u002FCD","ci-cd",{"name":956,"slug":957,"type":15},"2026-07-14T05:25:59.97109",{"slug":976,"name":976,"fn":977,"description":978,"org":979,"tags":980,"stars":961,"repoUrl":962,"updatedAt":986},"mcore-cicd","manage CI\u002FCD pipelines for Megatron-LM","CI\u002FCD reference for Megatron-LM. Covers CI pipeline structure, PR scope labels, triggering internal GitLab CI (which force-pushes the current branch to a pull-request\u002FBRANCH ref — always dry-run and verify the destination first; never run against shared or protected branches), and CI failure investigation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[981,982,983],{"name":971,"slug":972,"type":15},{"name":956,"slug":957,"type":15},{"name":984,"slug":985,"type":15},"GitHub","github","2026-07-27T06:06:12.278222",{"slug":988,"name":988,"fn":989,"description":990,"org":991,"tags":992,"stars":961,"repoUrl":962,"updatedAt":1000},"mcore-create-issue","investigate CI failures and create issues","Investigate a failing GitHub Actions run or job and create a GitHub issue for the failure.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[993,996,997],{"name":994,"slug":995,"type":15},"Debugging","debugging",{"name":984,"slug":985,"type":15},{"name":998,"slug":999,"type":15},"Triage","triage","2026-07-14T05:25:57.442089",{"slug":1002,"name":1002,"fn":1003,"description":1004,"org":1005,"tags":1006,"stars":961,"repoUrl":962,"updatedAt":1013},"mcore-linting-and-formatting","lint and format Megatron-LM code","Linting and formatting for Megatron-LM. Covers running autoformat.sh, tools (ruff, black, isort, pylint, mypy), and code style rules.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1007,1010],{"name":1008,"slug":1009,"type":15},"Best Practices","best-practices",{"name":1011,"slug":1012,"type":15},"Code Analysis","code-analysis","2026-07-14T05:25:56.18433",{"slug":1015,"name":1015,"fn":1016,"description":1017,"org":1018,"tags":1019,"stars":961,"repoUrl":962,"updatedAt":1027},"mcore-migrate-gpt-to-hybrid","migrate Megatron-LM models to HybridModel","Migration guide for moving Megatron Core GPTModel checkpoints, model providers, training commands, and layer mappings to HybridModel.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1020,1023,1026],{"name":1021,"slug":1022,"type":15},"Machine Learning","machine-learning",{"name":1024,"slug":1025,"type":15},"Migration","migration",{"name":9,"slug":8,"type":15},"2026-07-17T06:07:11.777011",{"slug":1029,"name":1029,"fn":1030,"description":1031,"org":1032,"tags":1033,"stars":961,"repoUrl":962,"updatedAt":1038},"mcore-onboard-gb200-1node-tests","onboard functional tests for GB200","Onboard 1-node GitHub MR functional tests for GB200 from existing mr-scoped 2-node tests.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1034,1037],{"name":1035,"slug":1036,"type":15},"QA","qa",{"name":21,"slug":22,"type":15},"2026-07-14T05:25:53.673039",{"slug":1040,"name":1040,"fn":1041,"description":1042,"org":1043,"tags":1044,"stars":961,"repoUrl":962,"updatedAt":1049},"mcore-run-on-slurm","launch distributed training jobs on SLURM","How to launch distributed Megatron-LM training jobs on a SLURM cluster. Covers a minimal sbatch skeleton, environment-variable setup for torch.distributed.run, CUDA_DEVICE_MAX_CONNECTIONS rules across hardware and parallelism modes, container conventions, monitoring, and per-rank failure diagnosis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1045,1046],{"name":956,"slug":957,"type":15},{"name":1047,"slug":1048,"type":15},"Infrastructure","infrastructure","2026-07-14T05:25:49.362534",{"slug":1051,"name":1051,"fn":1052,"description":1053,"org":1054,"tags":1055,"stars":961,"repoUrl":962,"updatedAt":1063},"mcore-split-pr","split pull requests to reduce review load","Split a PR into multiple PRs to reduce the number of required CODEOWNERS reviewer groups.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1056,1059,1060],{"name":1057,"slug":1058,"type":15},"Code Review","code-review",{"name":984,"slug":985,"type":15},{"name":1061,"slug":1062,"type":15},"Pull Requests","pull-requests","2026-07-14T05:26:01.226578",{"slug":1065,"name":1065,"fn":1066,"description":1067,"org":1068,"tags":1069,"stars":961,"repoUrl":962,"updatedAt":1072},"mcore-testing","run and manage Megatron-LM tests","Test system for Megatron-LM. Covers test layout, recipe YAML structure, adding and running unit and functional tests, golden values, marker filters, and CI parity.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1070,1071],{"name":1035,"slug":1036,"type":15},{"name":21,"slug":22,"type":15},"2026-07-14T05:25:54.928983",{"slug":1074,"name":1074,"fn":1075,"description":1076,"org":1077,"tags":1078,"stars":961,"repoUrl":962,"updatedAt":1083},"nightly-sync","manage nightly main-to-dev sync workflows","Domain knowledge for the nightly main-to-dev sync workflow. Covers merge strategy, CI architecture, failure investigation, and known issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1079,1082],{"name":1080,"slug":1081,"type":15},"Automation","automation",{"name":971,"slug":972,"type":15},"2026-07-30T05:29:03.275638",496,{"items":1086,"total":1168},[1087,1102,1115,1126,1139,1146,1157],{"slug":1088,"name":1088,"fn":1089,"description":1090,"org":1091,"tags":1092,"stars":23,"repoUrl":24,"updatedAt":1101},"udf-benchmark","benchmark Spark UDF performance on GPU","Assists with benchmarking and profiling the performance of an Apache Spark UDF on the GPU. This is step 3 of 3 in the UDF conversion workflow (udf-gen-test -> udf-convert-to-* -> udf-benchmark). Use this skill when you have a CPU UDF and a RapidsUDF or SQL implementation, and need to benchmark the performance of the CPU UDF against the GPU implementation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1093,1096,1097,1100],{"name":1094,"slug":1095,"type":15},"Benchmarking","benchmarking",{"name":9,"slug":8,"type":15},{"name":1098,"slug":1099,"type":15},"Performance","performance",{"name":18,"slug":19,"type":15},"2026-07-14T05:30:56.546112",{"slug":1103,"name":1103,"fn":1104,"description":1105,"org":1106,"tags":1107,"stars":23,"repoUrl":24,"updatedAt":1114},"udf-convert-to-cuda","convert Spark UDFs to CUDA RapidsUDFs","Assists with converting a non-aggregating Apache Spark UDF to a native CUDA RapidsUDF using JNI and libcudf. This is step 2 of 3 in the UDF conversion workflow (udf-gen-test -> udf-convert-to-cuda -> udf-benchmark). Use this skill when you have a CPU UDF with a unit test and need to convert it to a native CUDA implementation. Prefer udf-convert-to-cudf unless a CUDA implementation is necessary for performance or correctness, or if requested by the user.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1108,1111,1112,1113],{"name":1109,"slug":1110,"type":15},"Engineering","engineering",{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"2026-07-14T05:30:51.534401",{"slug":1116,"name":1116,"fn":1117,"description":1118,"org":1119,"tags":1120,"stars":23,"repoUrl":24,"updatedAt":1125},"udf-convert-to-cudf","convert Spark UDFs to GPU-accelerated RapidsUDFs","Assists with converting an Apache Spark UDF to a GPU-accelerated RapidsUDF using cuDF Java APIs. This is step 2 of 3 in the UDF conversion workflow (udf-gen-test -> udf-convert-to-cudf -> udf-benchmark). Use this skill when you have a CPU UDF with a unit test and need to convert it to a RapidsUDF.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1121,1122,1123,1124],{"name":1109,"slug":1110,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"2026-07-14T05:30:54.048693",{"slug":1127,"name":1127,"fn":1128,"description":1129,"org":1130,"tags":1131,"stars":23,"repoUrl":24,"updatedAt":1138},"udf-convert-to-sql","convert Spark UDFs to SQL expressions","Assists with converting an Apache Spark UDF to a functionally equivalent Spark SQL expression. This is step 2 of 3 in the UDF conversion workflow (udf-gen-test -> udf-convert-to-sql -> udf-benchmark). Use this skill when you have a CPU UDF with a unit test and need to convert it to SQL for GPU acceleration.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1132,1133,1134,1135],{"name":1109,"slug":1110,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},{"name":1136,"slug":1137,"type":15},"SQL","sql","2026-07-14T05:30:57.785224",{"slug":4,"name":4,"fn":5,"description":6,"org":1140,"tags":1141,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1142,1143,1144,1145],{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},{"name":21,"slug":22,"type":15},{"slug":1147,"name":1147,"fn":1148,"description":1149,"org":1150,"tags":1151,"stars":23,"repoUrl":24,"updatedAt":1156},"udf-judge-conversion","review UDF tests and GPU implementations","Reviews generated UDF tests and GPU\u002FSQL implementations for robustness, anti-cheating, and GPU execution integrity. Use when the user requests a judge\u002Freview-agent pass, or when manually reviewing a completed conversion.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1152,1153,1154,1155],{"name":1057,"slug":1058,"type":15},{"name":1109,"slug":1110,"type":15},{"name":9,"slug":8,"type":15},{"name":1035,"slug":1036,"type":15},"2026-07-14T05:30:59.022808",{"slug":1158,"name":1158,"fn":1159,"description":1160,"org":1161,"tags":1162,"stars":23,"repoUrl":24,"updatedAt":1167},"udf-optimize-cudf","optimize cuDF RapidsUDF performance","Iteratively optimizes a cuDF RapidsUDF implementation for GPU performance. Use after testing and benchmarking with udf-benchmark. Runs a loop of profiling, optimizing, testing, and benchmarking until performance converges or the iteration budget is exhausted.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[1163,1164,1165,1166],{"name":1094,"slug":1095,"type":15},{"name":1109,"slug":1110,"type":15},{"name":9,"slug":8,"type":15},{"name":1098,"slug":1099,"type":15},"2026-07-14T05:30:52.785634",7]