== A. validate_hook clean file: JSON status pass + issues_count 0 == PASS: clean file -> status pass, issues_count 0 == B. validate_hook planted anti-pattern: issues_count > 0 == PASS: time.sleep flagged, issues_count > 0 -> Avoid time.sleep() in ROS 2 nodes — use create_wall_timer() instead == C. launch_validator duplicate node names (error severity) -> exit 1 == PASS: duplicate node names rejected (exit 1) Checked 1 launch file(s) [INFO ] /tmp/ros2-functest2/dup.launch.py:6: Node() has no 'output' argument. Add output='screen' to see node logs in terminal. [INFO ] /tmp/ros2-functest2/dup.launch.py:7: Node() has no 'output' argument. Add output='screen' to see node logs in terminal. [ERROR ] /tmp/ros2-functest2/dup.launch.py:7: Duplicate node name 'driver' in namespace '/robot' (first defined at line 6) == D. launch_validator hardcoded executable= absolute path -> warning == FAIL: warning detection exit 0, warnings: 1 Checked 1 launch file(s) [INFO ] /tmp/ros2-functest2/hard.launch.py:6: Node() has no 'output' argument. Add output='screen' to see node logs in terminal. [WARNING] /tmp/ros2-functest2/hard.launch.py:6: Hardcoded absolute path '/opt/ros/humble/lib/demo/demo_node' in 'executable'. Use just the executable name and let the package resolve the path. [INFO ] /tmp/ros2-functest2/hard.launch.py:7: Node() has no 'output' argument. Add output='screen' to see node logs in terminal. [INFO ] /tmp/ros2-functest2/hard.launch.py:8: Node() has no 'output' argument. Add output='screen' to see node logs in terminal. [WARNING] /tmp/ros2-functest2/hard.launch.py:8: Hardcoded file path detected. Use FindPackageShare + PathJoinSubstitution for portable paths. Found: 0 error(s), 2 warning(s), 3 info(s) == E. launch_validator syntax error -> error exit 1 == PASS: syntax error -> exit 1 ROUND2 RESULTS: 4 passed, 1 failed