Repository navigation
highlights:
--fastq_qmax/--fastq_qmaxoutnow default to the encoding's maximum (93 at offset 33, 62 at offset 64) instead of 41, so PacBio HiFi and Oxford Nanopore files are no longer rejected- default thread count now follows the cgroup/affinity limits the run actually has, not the host's core count (issue #584)
--fastq_statsnow requires--log, and--fastq_mergepairsnow honours--quiet- new commands:
--fastx_syncpairsand--scramble - new options:
--centroid_sizeout,--allow_fewer,--fastq_solexa, and ten new--userfields - shell completion for
bash/zsh/fish - an online per-command manual
- correctness and speed: abundances above 2^31 are handled everywhere, several out-of-bounds reads and silent-wrong-result bugs are fixed, and some commands are up-to 2–3x faster (
--fastq_filter,--fastq_mergepairs,--search_exact) - vsearch's test-suite now has more than 10,000 tests
changes:
- fix:
--gapopen/--gapext*now forbid gaps at the match/merge decision, not only in the alignment score: a*opening penalty forbids that gap class outright, a*extension penalty forbids gaps longer than one, and both apply per sequence (Q/T) and location (L/I/R/E) — e.g.--gapopen '*LQ'forbids opening left end-gaps in the query, and a bare--gapopen '*'forbids every gap opening including the terminal gaps used for substring matching. Previously*only lowered the score, so a pair whose best alignment still needed a forbidden gap was reported as a match (--cluster_fast --gapopen '*' --iddef 0merged sequences differing by one interior indel, issue 602; internal gaps still appeared despite--gapopen '*I', 2016 forum report) (commits 9407703, fd648c8) - fix: stop truncating the
*infinite gap penalty on the SIMD path, so--gapopen/--gapext'*' forbid gaps on short sequences too, not just long ones (commit 0fb49f8) - fix: stop truncating abundance to 32 bits when writing size annotations (commit ccb6362)
- fix: stop truncating abundances above 2^32 in the
--sortbysizeand--sortbylengthdecks, where the most abundant sequences sorted to the bottom (;size=4294967297truncated to 1, ranking below;size=100) and "Median abundance:" reported a median of the truncated values (commits e039236, 02774ac) - fix:
--fastq_mergepairswith--fastq_ascii 64and--fastq_qmaxoutbetween 63 and 93 wrote quality symbols outside printable ASCII (byte 127 at qmaxout 63, up to 149 at 93), producing an invalid FASTQ file — and a SIGSEGV in v2.31.0, which indexes a table with the resulting negative char. The sum rule was stated against--fastq_asciiout, which is the one fastq-writing command that does not accept it.--fastq_qminoutwas rejected for the mirror-image reason and is now accepted where the real offset represents it (commits bc01661, cd7b667) - fix: the k-mer pre-filter required a target to share more k-mers than it can hold, so a database sequence with less than
wordlength + minwordmatches - 1= 19 nt of distinct k-mer content could not be selected by any query, an exact match included — and the same pair gave opposite answers depending on direction (issue #328) (commit 919ac67) - fix:
--fastx_uniques --strand both --fastqoutmerged a minus-strand member's quality string positionally against the plus-strand seed, averaging seed position i with member position i instead of seqlen - 1 - i. Output changes versus released binaries for strand-both fastq dereplication (commit de8cda9) - fix:
--fastx_uniques --fastqouttruncated merged qualities through an irreversible probability round trip: quality 2 came back as 1, and qualities 3, 5, 6, 8, 10 and 17 moved with the abundances — two identical Q10 reads merged to Q10 at abundances 1+1, but to Q9 at 1+2. Present since v2.20.0 (commit 3122786) - fix:
--selfidnever excluded anything on any chimera path. The gate compared a query part, always shorter than a full-length identical reference, so the length pre-check short-circuited — and an identical reference in the database won every smoothing window and suppressed detection entirely (commit 4807479) - fix:
--cluster_unoisesilently ignored a user-supplied--weak_id, overwriting it with 0.90 unconditionally; 0.90 is now a true default (commit 7e8bc8d) - fix: count
--qsegout,--tsegoutand--fastapairsas output files in the "No output files specified" gates of--allpairs_global,--usearch_global,--search_exactand the--cluster_*commands, so each can be used as the sole output. Same defect and same fix as issue #82 (commit 9c1281f) - fix: enforce the documented ranges of option arguments. A negative
--idprefix/--idsuffixcrashed (out-of-bounds read under NDEBUG);--query_cov/--target_covoutside 0.0–1.0 silently made the filter unsatisfiable or inert; negative--maxdiffs,--maxsubs,--maxgaps,--mincols,--maxqsize,--mintsizeand--topnsilently rejected every hit or ignored the option entirely;--maxrejects -1was indistinguishable from not passing the option; and an empty argument such as--id ""was read as zero, accepting every hit (commits cf28d02, 8b14e45, bc0ee13, 299111b) - fix: accept a correctly-rounded underflowing double such as
--fastq_maxee 1e-320, which died with "Illegal option argument" although the manual admits any positive real. Overflow stays rejected. Whetherstrtodeven sets ERANGE on underflow is implementation-defined, so the old rejection varied with the platform's libc (commit 8f9dea5) - fix:
--fastx_getseqs --label_word ""matched every record. An empty needle gavestd::strstrno exit condition, so the search walked past the end of the header into the zero-filled buffer tail (commit f706b6a) - fix:
--fastq_filter/--fastx_filtersilently ignored--fastq_truncqualon fasta input instead of rejecting it; the comparison tested< LONG_MIN, which no value satisfies, where!= LONG_MINwas meant. The fatal message has always listed it among the not-accepted options (commit f0fac28) - fix: a second one-past-the-end abundance read in
--fastx_subsample(random_subsampling), in the priming read before the loop, reached on an empty database. The read inside the loop was guarded by PR #650; this is the one four lines above it (commit 83bcc16) - fix:
--makeudb_usearchwrote a UDB declaring zero sequences and exited 0, then rejected that file itself on every subsequent read with "Invalid UDB file". Reachable through--minseqlength, not only through an empty input file (commit e4e8d1d) - fix: extend the UDB load validation of PR #647 to
--udbinfo, which reads the header through its own path and so accepted both a UDB served from a pipe and an inflated stored sequence count, printing a garbage count and exiting 0. A stored word count larger than the database is now rejected by every reader too: it cannot describe a valid word list, and such slots were simply never visited while still being reported (commits a5aff50, ac969ea, 16f47ab) - fix:
--udb2fasta,--udbstatsand--udbinfono longer print "WARNING: Wordlength adjusted to N as indicated in UDB file". None of the three accepts--wordlength, so the warning announced a change to a setting the user had no way of making; for--udbstatsthe report prints the word length two lines later anyway. Search commands, which do have a configured value to override, keep it (commit 3c93ae1) - fix: uppercase the reference bases in SAM
MDfields, as the SAMtags grammar requires. A target lowercased by DUST masking producedMD:Z:20a19andMD:Z:20^a19, which disagree with what samtools calmd recomputes for the same alignment, and with the file itself after a BAM round trip (commit df67350) - fix:
--sff_convertread 32 header bytes where the format specifies 31 (the struct carries a trailing padding byte), shifting every later section by one: the reported key sequence lost its first base, and spec-valid files were wrongly rejected whenever31 + flows + keyis a multiple of 8. The per-record offsets re-synchronized through the padding arithmetic, so the fastq output itself was always correct (commit afd6871) - fix:
--gzip_decompressno longer disables the transparent read that lets uncompressed standard input through. Feeding plain input to the option died with "incorrect header check" instead of reading it as-is, against zlib 1.3.2 as shipped by FreeBSD; seven tests failed there (commit 0c883de) - fix:
--fastq_statssearched past the end of its per-position tables for the first complete EE filtering row. The bound islen_max, as in the pre-refactoring report loop (commit bfe6785) - fix:
--fastq_eestats2printed "0 reads, max len 0, avg -nan" to--logon empty input, where--outputprinted "0 reads" (commit c2dd623) - fix: restore one progress line per percent step when standard error is not a terminal. The behaviour added in v2.31.0 was silently reverted when the callers migrated to the progress class, which had been written from the older code (commit 697377c)
- fix: warnings now reach the
--logfile. Two of the fifteen warning sites (--sff_convert's missing index padding, the UDB adjusted-wordlength notice) wrote to standard error and stopped there, and the--rereplicateand sequence-retrieval warnings obeyed--quieton standard error while logging unconditionally — the manual says--quietsuppresses everything "except for warnings and error messages" (commits 2c8aa6e, 1c6afd9) - fix:
--chimeras_parents_maxabove 20 was an out-of-bounds heap write, and--iddefoutside 0–4 selected an undefined identity definition, for a caller reaching the engines through the library: both were range-checked in the command-line parser only. Both moved to the shared validator, and theparents_found <= 20assert became a runtime check so it holds under NDEBUG (commit 4fcfc47) - fix: reject
'-'given as both the query and--db. Since--dbgained standard-input support the two readers raced over the same stream and the command returned no hits with exit 0 (issue #506) (commit 5b62cd8) - fix:
--orientagainst a database of fewer than eight sequences gave a bitmap to every one of the 4^wordlength index slots, absent k-mers included, because integer division makes the threshold zero: +512 MB of peak memory and a full SIMD bitmap scan per absent k-mer (0.85 s to 0.25 s on a 4-sequence database) (commit 40d42a9) - fix: undefined behaviour at twelve
<cctype>call sites passing a plainchar, reachable wherevercharis signed (x86-64, Windows) through sequence headers carrying UTF-8 or Latin-1 (commit fefea7b) - fix:
--fastq_mergepairsno longer reports two discard reasons that could never occur — "indel errors", unassigned since it was added in 2017 because an ungapped aligner cannot detect an indel, and "undefined reason" (commit 0aaf85e) - fix: the FASTQ offset-warning threshold counted 101 records where the constant and its comment both say 100 (commit bd21825)
- fix:
--helpnow lists the commands--fastx_getseq,--fastx_getseqsand--fastx_getsubseq, under a new "Sequence retrieval" section, along with the options specific to them (--label,--labels,--label_word,--label_words,--label_field,--label_substr_match,--subseq_start,--subseq_endand--notmatchedfq). The three commands have manual pages but could not be discovered from the help text (commit 36fca2d) - fix:
--helpnow lists the output annotation options--lengthout,--xlengthand--samplewherever it already lists their siblings--sizeoutand--xsize, lists--allow_fewerunder--fastx_subsample, and lists--fastq_qout_max— the last of the twenty-nine options--fastx_uniquesaccepts that appeared nowhere in the help text (commits 29565d7, df6459e) - fix: out-of-bounds read in
--fastx_getsubseqwhen--subseq_startexceeds a sequence's length, in mixed-length files (also affects the--fastqoutpath) (PR #650) - fix: one-past-the-end abundance read in
--fastx_subsample(random_subsampling), reached with--sizeinwhen the last selected read is the last read of the last amplicon (PR #650) - fix: hit-list buffer overflow in clustering with large
--maxaccepts/--maxrejectson small datasets (PR #650) - fix: harden the SFF reader (
--sff_convert) against truncated or corrupt files: inverted clip regions under--sff_clip, flowgram truncation, and overflow guards that were previously compiled out of release builds (PR #650) - fix: bound-check the CIGAR walk in SAM output (
--samout) to prevent out-of-bounds reads on malformed or mismatched alignments (PR #649) - fix: reject non-finite floating-point command-line arguments such as
--sample_pctnan or inf, which previously slipped past range checks (PR #649) - fix: on Windows, load the zlib and bzip2 DLLs with
LOAD_LIBRARY_SEARCH_DEFAULT_DIRSso a plantedzlib1.dll/libbz2.dllin the working directory can no longer be loaded on the first.gz/.bz2input (PR #649) - fix: validate UDB header fields on load (kmerindex entries, kmerindexsize, seqcount, header offsets); corrupt or crafted
.udbfiles are now rejected with "Invalid UDB file" instead of causing out-of-bounds memory access; valid files are unaffected (PR #647) - fix: avoid int overflow when sizing and indexing the
--fastq_eestats2count table with a large--length_cutoffsrange and many--ee_cutoffsvalues (PR #644) - fix: avoid intermittent crashes from terminating in a worker thread on malformed or mismatched input (PR #635, #636)
- fix: data race on the query file position in --uchime_ref with multiple threads (PR #637)
- fix: print FASTA sequences longer than
INT_MAX(~2 GB, reachable with a raised--maxseqlength) correctly instead of silently truncating them, and reject FASTA/FASTQ headers longer than the int length limit instead of overflowing the query buffer (PR #643) - fix: bound sequence length at the central FASTA/FASTQ reader and lower the
--maxseqlengthhard cap toINT_MAX- 2001 (2147481646) to prevent int overflow in the search, cluster and chimera engines (PR #646; refines the 2^32-1 cap from PR #632) - fix: detect write, flush and close errors on output streams; a deferred write failure (full disk, exceeded quota, read-only remount) now aborts with a fatal error instead of silently producing a truncated output file that exits 0 (PR #651)
- fix: duplicated annotation separators (
;) in fastq and fasta headers (commit c211d5d, issue #271) - fix: shared-kmer counter overflow when aligning very long sequences (~75 kbp) (PR #630, commit 972c2ee)
- fix: SIMD alignment counters (aligned/matches/mismatches/gaps) could overflow when the alignment path exceeds 65535 columns; over-long sequence pairs are now diverted to the linear-memory aligner, with 64-bit length arithmetic (PR #631)
- fix: handle sequence abundances above 2^31 (
;size=) in storage, filtering and output (including;seqs=and centroid size) and in the library API; the abskew/size-ratio comparison is now exact above 2^53, and--maxseqlengthrejects values above 2^32-1 (PR #632) - fix: commands
--fastq_filter,--fastx_filter,--fastq_eestats, and--fastq_mergepairswriteqmintologfileinstead ofstderr(commits 310e7de and 6dbba98) - fix: off-by-one in MSA consensus
;length=output (PR #629) - fix: command
--rereplicatewrite warning to log file instead ofstderr(PR #628, commit 273c40d). - add: new command
--scramble: randomize the nucleotide order within each fasta or fastq entry, the within-entry counterpart of--shuffle. Useful for building null-model datasets: entry order, headers, lengths, and per-entry nucleotide composition are preserved; fastq quality strings are copied through unchanged. Reproducible with--randseed. The option--scramble_kmerk (1 to 9, default 1) additionally preserves the counts of all words of length k or less, by sampling a uniformly random Eulerian path of each entry's de Bruijn graph (Altschul-Erickson/uShuffle-style) (commits 5929176, e518c2a) - add: ten new
--userfieldsoutput fields (issue #548):diffsandmid, which report the quantities--maxdiffsand--midare compared against;qseqandtseq, the full-length query and target sequences;qrowdotsandtrowdots, the aligned segments with a dot at every position identical to the other sequence; andqlor,qhir,tlorandthir, the alignment span in 0-based coordinates - add: new option
--allow_fewerfor--fastx_subsample, which reads--sample_sizeas an upper bound: take at most N reads, and keep them all when fewer are available. Without it, a subset size larger than the input remains an error, as in usearch (commit f501b27) - add: new option
--fastq_solexafor--fastq_convert, which converts Solexa scores (-10 log10(p / (1 - p))) to Phred. The two scales share the ASCII offset 64 and nothing else, so a Solexa file was previously rebased and left otherwise untouched: fifteen of the 68 representable symbols came out wrong, and they were exactly the low ones a quality filter acts on (commit 6f5fdc7) - add: a warning when the quality symbols read contradict
--fastq_ascii. Raising--fastq_qmaxmeans a phred+64 file read at the default offset 33 is no longer stopped by the bound, so vsearch now says so instead. Run--fastq_charsto confirm (commit fce0297) - add: a warning when database sequences yield no k-mer for the index (issue #570). Such sequences are absent from the index and are never selected as candidates, so an all-lowercase reference database silently produced empty classifications — for 13 days across 40 CPUs in the report. Emitted once per run as a summary line, not once per sequence (commit 994e050)
- add: a warning when a minimum threshold exceeds its matching maximum (
--minuniquesize/--maxuniquesize,--minseqlength/--maxseqlength). Such a pair selects nothing, and the command used to write an empty output file and exit 0; the empty output stays legal. Also catches the implicit inversion, e.g.--maxseqlength 10alone against the default minimum of 32 (commit b887ade) - add: a warning when
--sampleresolves to an empty sample name ("",";abc"," abc"), which writes a bare;sample=annotation and yields an OTU table whose first column has no name (commit 37e3e35) - add: a warning when
--gzip_decompressor--bzip2_decompresscontradicts a seekable standard input, where autodetection now runs and wins and the asserted format is ignored. On piped stdin the same mistake is already fatal (commit ed1af58) - add: shell auto-completion scripts for bash, zsh and fish (issue #417), installed by
make installin the standard location for each shell. Completion offers the commands, then only the options the chosen command accepts, values for options taking a fixed set, and filenames filtered by extension. Configure with--disable-completionor--with-bashcompdir=DIRand friends - add: an online manual, published per command, with the released pages at
/vsearch/and the development pages under/vsearch/dev/;--helpnow points at both (commits 0885226, 68118c4) - add: a
--enable-sanitizeconfigure switch that builds the vsearch executable under the address and undefined-behaviour sanitizers, independently of--enable-debug(commit 3c09284) - add: new
--fastx_syncpairscommand (commit 94ab65e) - add: preliminary support for FreeBSD/x86-64 (PR #633, #634)
- add: new option
--centroid_sizeoutwill report centroid size in FASTA header after clustering (Issue #623) (commits 444ed00 and 6157fc3) - remove:
--search_exactno longer accepts--lcaoutand--lca_cutoff. It never implemented them — no call to the LCA writer exists on that code path, in this tree or upstream — so the run completed, exited 0, and created no file.--usearch_global, the only command that implements LCA output, is unaffected (commit 3b36941) - remove: the monolithic
vsearch.1manual page, deprecated since the per-command pages and the online manual took over (commit 4bd5486) - change:
--fastq_qmaxand--fastq_qmaxoutnow default to the highest quality score the offset can represent (93 with--fastq_ascii33, 62 with offset 64) instead of 41. PacBio HiFi reaches Q93 and nanopore basecallers pass Q50, and the old bound rejected those files outright (issues #522, #194 and #609). Pass--fastq_qmax 41for the previous behaviour (commit aec4a1f) - change:
--fasta2fastqand--fastq_mergepairskeep the previous--fastq_qmaxoutdefault of 41, because they generate the score they clamp rather than passing one through:--fasta2fastqhas no input quality, and--fastq_mergepairscaps a computed posterior (two agreeing Q40 bases would otherwise be reported as Q85 instead of Q41). Pass--fastq_qmaxout 93for the unclamped values (commit 70bca99) - change: the default thread count, and an explicit
--threads 0, now follow the cores this run may actually use — the CPU affinity mask and the cgroup CPU quota — instead of the machine's core count, and memory detection is cgroup-aware for the same reason. Inside a Slurm, Docker, podman, Kubernetes or Apptainer confinement vsearch read the host's figures: a session limited to 50 MB and one core was told it had 500+ GB and 128 cores, and then really did start 128 workers on that one core (issue #584). A virtual machine was already correct and is unaffected (commits 246e99e, 2bef977) - change:
--fastq_statsnow requires--log, as the manual documents; the report has no other destination (commit 5f07f57) - change:
--fastq_mergepairsnow honours--quietfor its final stderr report, diverging from the issue #527 resolution, and--logno longer takes that report away from stderr — every other command writes both copies (commits f53ddd1, 07682fd) - change:
--fastq_mergepairsapplies--fastq_maxlenafter quality truncation, as the shared option fragment ("Applied after trimming") and the discard-reason string ("reads too long (after truncation)") both already stated. A pair truncated to within--fastq_maxlenis no longer discarded as too long (commit d354cf2) - change:
--fastx_uniquesnow applies--fastq_qminand--fastq_qmaxto its input. Both were listed among its valid options and neither was enforced, although the command decodes every quality symbol, converts it to an error probability, takes an abundance-weighted mean across the cluster and re-encodes the result (commit 4cdc706) - change:
--derep_prefixnow requires an output option, like--derep_fulllengthand--derep_id. A run with neither--outputnor--ucused to read the input, write nothing, and exit 0 (commit 0f43514) - change:
--fastq_filterand--fastx_filternow reject a*_revoutput given without--reverse, for which the file was never opened: such a run created no file, wrote nothing, and exited 0 (commit c774adf) - change:
--udb2fasta --sizeoutnow needs--sizeinto reproduce the abundances stored in the UDB, following the convention of every other command. Previously--sizeoutalone overwrote every abundance withsize=1— the option that asks for the annotation was the one destroying it — and--sizeinhad no effect on this path (commit 9928b9a) - change:
--makeudb_usearchmasks on several threads instead of being forced to one and warning. Only the masking phase is parallel; reading, indexing and writing the UDB remain serial (commit 2b0dd06) - change: four commands accept options they already needed.
--cutaccepts--threads(it warns and forces one thread, like every other single-threaded command);--fastx_mask,--fastx_subsampleand--orientaccept--minseqlength/--maxseqlength, whose input was silently capped at the 50000-nt default with no way to raise it;--derep_fulllengthaccepts--label_suffix, like its four sibling dereplication commands; and--fastx_uniquesaccepts--tabbedoutwith fasta input, since none of the six tabbedout columns depends on quality data (commits 7e8bc8d, 2eedaf2, faf72cc, e63f767) - change: the
--sintax --randseedmultithreading warning is removed. The per-query RNG is seeded from a per-query substream, so the classification is reproducible whatever the thread count, exactly as the manual page states (commit 2eedaf2) - change: reject
--match/--mismatchoutside -32767..32767 and finite--gapopen/--gapextoutside 0..6553, instead of silently wrapping them to the 16-bit aligner (commit f8c0dcb) - improve:
--fastq_filterand--fastx_filterare about 2x faster (552 ms to 282 ms on 300000 records, byte-identical). Most of the gain is in the shared FASTQ reader, so every FASTQ-reading command benefits:--fastq_stats-27%,--fastq_eestats2-15%,--fastq_join-13%,--fastq_convert-13%,--fastx_revcomp-12%,--fastx_subsample-11%,--fastq_chars-11%,--fastx_uniques-8% - improve:
--fastq_mergepairsis 3.0x faster on one thread and 1.9x on eight, and 3.5x on a non-overlapping pair set, chiefly by indexing its 5-mers directly (1024 possible values) instead of hashing them - improve:
--search_exactis 1.74x faster at--threads 24and uses 61 MB instead of 3752 MB, by growing the per-thread hit buffer on demand rather than sizing it to the whole database, per strand, per thread. That allocation, not the search, was what made the command slower with more threads - improve:
--sintaxis 15% to 38% faster depending on how query-heavy the run is: byte-wide hit counters (a sintax count cannot exceed 32, so a 16-bit counter is twice the width it needs) and a block skip over the counters that cannot beat the running best — 99.94% of them - improve:
--udb2fastais 7% to 82% faster and uses 21 MB instead of 1.0 GB on a word length 13 database, by not loading a k-mer index it never reads.--udbstatsno longer sorts the whole k-mer table to print eleven rows and two order statistics (up to -91%), and no longer builds that report when--logis absent and it cannot be printed - improve:
--makeudb_usearchis 35% faster (4.93 s to 3.18 s on the PR2 reference): parallel masking, and a word-at-a-time scan that expands a bitmapped k-mer 8.6x faster than bit by bit - improve:
--uchime_denovoand the--uchime*_refcommands are 13% faster: clearing only the live prefix of the match and insert arrays (about 9 rows of the 400 allocated) and wiping each match column once instead of once per overlapping window - improve:
--fastx_syncpairsexecutes 16% fewer instructions and allocates far less, storing the reverse reads in a chunked arena instead of three separate allocations per record - improve:
--fastx_getseqs --labelshashes the labels for exact whole-header matching instead of comparing every record with every label — 1.95 billion string comparisons for 10000 labels against 200000 records, 90% of the command's runtime, and quadratic growth on both axes - improve: DUST masking skips the start positions that provably cannot score, which is 99.4% of windows on real data
- improve: command
--fastq_eestatscan now process long-reads in a memory-efficient way. It is also faster (14-27% in our tests) when processing short-reads (commit 6e6ce1af) - improve: output-open failure messages are harmonized and now include the offending filename (e.g.
--alnout,--samout,--uc,--clusters) (PR #652) - improve: building no longer requires
./autogen.shor the autotools; the generated build files are committed and authoritative (maintainer mode disabled), so an ordinary build needs only a C++ compiler and make (PR #648) - improve: recommend
-O3again now that the SIMD-aligner strict-aliasing miscompile (issue #589) is fixed at the root and the-fno-tree-partial-preworkaround is removed (PR #649) - improve: a documentation audit of the whole manual, correcting the per-command pages against measured behaviour: the actual
--minseqlengthdefault (32) for four commands,--derep_prefixaccepting only--strand plus,--borderlineas a sole output option for the uchime commands,--sizeoutpropagating rather than resetting sizes, how alignments against Ns are scored and counted, the OTU-table identifier uniqueness requirement, the cigar(5) example and the SAM run-length exception,--fastq_solexa,--derep_fulllengthmarked deprecated in favour of--fastx_uniques, and the accepted ranges for--match/--mismatchand the gap penalties - improve: fix double-hyphen rendering of option names in the manpages and online HTML documentation (en-dash "–cut" now renders as literal "--cut"), including the vsearch-userfields(7) NAME line (commits 2230a4f and 4ff6f76)
- improve: cross-platform pseudo-RNG reproducibility (PR #640)
- improve: documentation (issues #239, #282)
- improve: code testing (new automatic tests in vsearch-tests; PR #638, #641)