Changes in version 1.0.4 (2026-05-19) CRAN submission preparation - DESCRIPTION: removed redundant "in R" from the title. - DESCRIPTION: expanded acronyms (ATAC-seq, NGS, ChIP-seq) and added a reference to the methods paper in the form . - quaqc(): replaced the cat() call that printed the program help with a message() call so that it can be suppressed by the user. - footprint() and pileup() examples: switched from \dontrun{} to a guarded \donttest{} that no-ops when the quaqc binary or a sample BAM is unavailable. Changes in version 1.0.3 CRAN submission preparation - Reverted the footprint() and pileup() examples to \dontrun{} because they additionally require a user-supplied BAM file that the user must obtain themselves; the previous \donttest{} wrapper caused R CMD check --run-donttest to fail. The quaqc() example continues to use \donttest{ if (nzchar(Sys.which("quaqc"))) }. - Added cran-comments.md to .Rbuildignore. Changes in version 1.0.2 CRAN submission preparation - Added SystemRequirements: quaqc to DESCRIPTION. - Moved options(quaqc.bin = ...) initialisation into .onLoad() in R/zzz.R. - Migrated inst/CITATION from deprecated citEntry()/personList() to bibentry()/c(person(), person()). - Updated .Rbuildignore to exclude development files (CLAUDE.md, .claude/). - Removed empty merge_reports() stub (R/merge.R). - Converted \dontrun{} to \donttest{ if (nzchar(Sys.which("quaqc"))) } in examples for quaqc(), footprint(), and pileup(). - Fixed typo genereal → general in DESCRIPTION. Changes in version 1.0.1 Bug fixes - parse_quaqc(): input validation now checks that all required JSON keys are present and reports which are missing, rather than accepting any subset of valid names. - parse_quaqc(): non-list input now produces a clear error message ('json.text' must be a list). - parse_quaqc_file(): the length/type guard used && instead of ||, allowing numeric length-1 inputs or character length->1 inputs to bypass validation and crash inside gzfile(). - parse_quaqc(): fixed typo fagment_histogram_max → fragment_histogram_max in the params key vector; the misspelled key was silently absent from $params$integer on every parsed report. - parse_quaqc(): removed tss_histogram_max from the params key vector; this key is not emitted by quaqc (only tss_histogram_size is), so it was silently missing from every parsed report. - quaqc(): calling quaqc() with no arguments (to print help) would error with object 'version' not found; fixed by returning just the help text. - quaqc(): when json is a file path, the parsed report was discarded and NULL returned; the file connection was also leaked on error. Both issues are fixed. - quaqc(): when peaks, tss, target.list, or blacklist was supplied as a GRanges object, the temporary BED file's on.exit(unlink(...)) handler lacked add = TRUE; passing more than one GRanges argument would leak all but the last temp file. - quaqc(): GRanges objects are 1-based inclusive; the BED files written from them now correctly use 0-based half-open coordinates (start - 1L). - quaqc(): verbose = NULL caused an error (argument is of length zero); the verbosity block now guards against NULL. - melt_reports(): calling with a quaqc object containing failed reports caused a crash on NULL subscript-assignment inside the get_* helper functions; failed reports are now filtered out automatically (with a message). - melt_reports(): histogram and TSS-pileup helpers used 1:nRow[i] to build row indices, which produces c(1, 0) when a sample has zero rows; replaced with seq_len(nRow[i]) throughout. - melt_reports(): TSS background normalisation could call rep(0, n) with a negative n; clamped to max(0L, n). - melt_reports(): dividing TSS depth by nranges when nranges is 0 or NA produced Inf/NaN; guarded with a fallback to 1. - melt_reports(): use.basename = TRUE failed on R < 4.0 because data.frame() converts character columns to factors by default in those versions; the Sample column is now explicitly coerced to character before basename() is called. - pileup(): passing tss in ... previously issued a warning then crashed with a confusing "formal argument matched by multiple actual arguments" error from R; it now stops with a clear message. - footprint(): the unreachable tss-in-... warning (R errors before the body runs due to ambiguous partial matching against tss.size/tss.qlen/ tss.tn5) has been removed. Other - Added a testthat test suite covering parsing, all 13 melt_reports() sections, validators, print snapshots, and input-validation paths.