TestModule.create() calls mkdirs() to create its filesystem structure, but remove() only removes the dir above 'main' and below, leaving behind intermediate dirs.
The result of this is if you run the full testsuite with -Dts.basic, the dist/target/wildflyxxx/modules dir ends up with child dir 'test' in addition to the proper 'system'.
I'm not sure why this spurious dir doesn't end up in the final dists we publish. Perhaps its just luck due to the release process not running the testsuite when the final build with the 'deploy' target is invoked. I know my process for releasing WildFly Core doesn't re-run tests in that step.
Once remove() does its current work it should walk up the filesystem tree until it gets to the file returned by getModulesDir(). For each level in the tree it should check if that file is a dir with no children and if it is it should remove the dir.