Igor Trujnara
05/12/2026, 12:30 PMext.args either". This includes several aspects: enabling optional outputs, setting output formats, controlling postprocessing steps, and selecting one of several actions of a tool. They are used in a minority of modules, but a non-negligible one: according to a quick AI-powered semantic search, 69 modules currently have an input channel of this kind (some examples: minimap2/align, fastp , sourmash/gather, bwa/mem, salmon/quant). As of today, there is no specific guidance on this topic in the module specification. I think we should establish some rules on this, since currently it's seemingly handled ad hoc. What do you think about this?Mahesh Binzer-Panchal
05/12/2026, 12:40 PMinput:? What kind of guidance do you want to document specifically?Igor Trujnara
05/12/2026, 1:09 PMinput is task.ext , a solution with little support in the community and limited to certain types of optional inputs. My problem is that we currently have no documented good practices for this kind of input: the docs only specify "file inputs" and "mandatory non-file inputs", with the instruction to provide everything else through task.ext.args . This covers most situations, but not all. Two cases that stand out are behavior flags (compress , sort , save_bam , etc.) and output file extensions ā neither of which is really an argument for the command itself. I don't necessarily want to change any practices, but rather state plainly that:
⢠non-mandatory non-file inputs can be fine if they don't reasonably fit into ext.args
⢠the correct mechanism for setting output formats is a val input, not any other hack
⢠perhaps more controversially, for modules with more than one behavior, flag-like (save_X, compress) or enum-like (action , subcommand) inputs are okay, as long as they relate to behaviors that the average user would expectMahesh Binzer-Panchal
05/12/2026, 1:16 PMext as something very specific which I realise many don't distinguish. For me the ext map is the only means in which a pipeline user can provide a dynamically controlled string into a script. If a pipeline user doesn't need dynamic manipulation of the string it should be an input: , perhaps becoming user exposed with a parameter.
However more documentation is always welcome. Navigating nf-core docs content to find it is still an issue, but at least if some people know where it's located, it can be pointed to.Igor Trujnara
05/12/2026, 1:19 PMIgor Trujnara
05/13/2026, 9:58 AMIgor Trujnara
05/27/2026, 7:23 AMMatthieu Muffato
05/27/2026, 8:16 AM