Changes in version 1.0.0.9000 Planned - Add confidence intervals for medians. This will extend add_ci() to continuous variables displayed with median-based summaries. The interval method will be explicit in result metadata and table notes; a t-based mean interval will not be repurposed for medians. Implementation and validation are tracked in NEXT-VERSION.md. Changes in version 1.0.0 (2026-09-21) - save_output() no longer writes a bare filename implicitly to the current working directory. Supply path explicitly (use tempdir() for temporary output) or provide a filename that includes its destination directory. This prevents accidental writes to a user's working or package directory. - Added missing = "as_category" to summary_table() and add_summary(). For categorical variables, missing values are displayed as a category and included in percentage denominators. The existing "ifany", "always", and "no" settings retain non-missing denominators. Continuous missingness remains a separate row, and missing values are never silently recoded as a non-event. - Synchronised the README, app manual, function-options material, styling and export guide, GUI wording, and pkgdown navigation around the three distinct table routes: summary_table() for participant-level data, epi_table() for outbreak/surveillance calculations, and value-preserving as_stats_table() for final results calculated elsewhere. - Finalised the pre-CRAN presentation API. add_summary() now uses one statistic argument and leaves confidence intervals exclusively to add_ci(). Removed development-only no-op digits and pvalue_style controls from to_gt() and save_output(); working p-value styling remains available through customise_table(). - Removed the hidden internal ... interface from compare_groups(). Package layers now call a private comparison engine while the public function has a fully explicit, documented signature. - Added explicit statistic = "mean_se" support. It is never selected automatically because SE describes precision of the estimated mean rather than variability among observations. - summary_table() now returns the engine-neutral gtstats_summary class. Use to_gt() or to_flextable() for explicit rendering. - Standardised add_p(test = ...) with compare_groups(test = ...) and retired the development-only method spelling for inferential test choice. - Retired the redundant tbl_stats() renderer and development-only summary_table(mode = "rate") route. Use to_gt() and add rates with add_rate(). - Added two real, traceable CDC teaching datasets: outbreak_data, the classic Oswego foodborne-outbreak line list, and surveillance_data, an archived weekly hospital-admission surveillance extract. They demonstrate the line-list and aggregate routes of epi_table() and include explicit source, transformation, and reuse documentation. - summary_table() gains overall_categorical. Automatic mode shows counts in the Overall column when grouped cells use row percentages; users can explicitly request n (%), n/N (%), counts, or percentages. - add_ci() now accepts as_stats_table() results and calculates confidence intervals from explicitly mapped aggregate columns for proportions, rates, means, or estimates with standard errors. Statistical meaning is never guessed from column names. - Added as_stats_table() to format, customise, and export an already summarised data frame without recalculating its values. - The GUI can now select a data frame from the current R environment and can send already summarised data directly to the table customiser. - Added show_dichotomous = "single_row" with optional named value choices to summary_table() and add_summary(). This matches gtregression and gives conventional one-event-per-row binary summaries without changing full-variable inference. - Replaced the Summary-table app's hidden text mapping for compact binary summaries with an explicit event-level selector for every selected binary variable. Switching between one event row and all levels now produces a visible, reproducible change in both the table and generated R code. - Reduced publication footnote type in flextable and gt output, and exposed the binary display and advanced styling choices in the gtstats app. - Made publication output Office-first: supported results now print as flextable objects by default. to_gt() provides an explicit HTML-focused route. The redundant development renderer alias was retired; use to_gt(). save_output() now accepts raw gtstats results, flextables and gt tables and supports PPTX. - Extended customise_table() with spanning headers, additional or suppressed footnotes, journal-ready border and density controls, named column widths, and configurable p-value styling. Its default engine is now "flextable"; use engine = "gt" when that output is required. - Continuous summary overrides now support a global fallback plus exceptions, for example statistic = c(continuous = "mean_sd", lwt = "median_iqr"). The deliberate variable-selection model is retained: an empty builder now directs beginners to include = c(age, sex, bmi) or include = everything(). - Redesigned the Summary table workflow as a progressive, layer-by-layer API. summary_table() builds the descriptive foundation; the new add_ci() layer adds confidence intervals globally or to selected variables; add_p() adds comparisons; and specialist rows remain explicit optional ingredients. The Shiny app now mirrors the same sequence and generates the corresponding reproducible pipeline. - Simplified add_proportion() defaults so its display, layout, confidence settings and precision inherit from the parent table. It is now documented as a selected-event highlight rather than the route for adding CIs to ordinary categorical summaries. - Tightened summary-table presentation: missing-value rows now remain inside the correct variable block and are emitted once per variable. A requested layout = "separate" no longer creates empty CI columns before a CI layer is added. Compact cells and separate-column headers avoid repeating the confidence level; the level and interval method are stated once in the publication footnote. - Separate CI layouts now use context-aware estimate headers (n (%), Mean (SD), Median (IQR), or Summary) and an explicit confidence-level header such as 95% CI. Categorical-only tables without intervals can use categorical_layout = "separate" to display n and % in distinct columns. - Redesigned the GUI Summary workspace as a recipe. Users can now build an ordinary summary or rate table and add total, selected-proportion, rate, custom-row and p-value ingredients with their relevant options. Compact and separate-column layouts are available at table creation, and generated code reproduces the complete builder pipeline. - Simplified add_proportion() footnotes in summary tables. Publication output no longer repeats the selected event or explains internal add_p() behavior; when confidence intervals are shown, only their level and method are noted. - Completed the GUI plotting workflow. Distribution assessments now expose histogram, density, Q-Q and boxplot diagnostics; group comparisons expose plot_compare() controls; and correlation plots expose labels, confidence level, typography and colour controls. Every plot is downloadable as PNG or PDF and represented in the generated reproducible R code. - Added a dedicated Customise table workspace immediately after Summary table in gtstats_app(), matching the post-processing workflow in the gtregression app. The latest Summary table is carried forward and displayed automatically. Users can relabel columns, rows and levels, change titles, notes and styling, hide columns, download the result, and copy reproducible customise_table() code without altering the underlying statistics. - crosstabs(format = "tibble") now returns plain console-friendly cells such as 86 (66.15%) instead of HTML line-break markup. The default publication table retains its stacked cell layout. - add_p() now accepts tidy-select include, allowing variables to remain in a descriptive table without receiving an inappropriate p-value. The GUI exposes the same control as Do not test and reproduces it in generated R code. Birth-weight examples now avoid testing bwt against the category derived from bwt. - Finalised the pre-CRAN comparison API: effect_size() and plot_compare() now use variable and group, matching compare_groups(). add_p() now calls its marked-skewness option distribution_check, replacing the misleading normality_check name. - Automatic "recommended" continuous summaries are now resolved once per variable across all displayed groups, preventing a Table 1 from mixing mean (SD) and median (IQR) for the same variable. Categorical confidence intervals now use Wilson intervals by default, with ci_method = "exact" available. - Simulated Fisher exact tests for larger contingency tables are reproducible by default via fisher_seed = 1049 and preserve the caller's RNG state. - Repeated-measures ANOVA now reports a Greenhouse-Geisser-corrected p-value and diagnostics. plot_compare() now supports repeated continuous and paired categorical displays and exposes the same repeated-test choices as compare_groups(). - Redesigned gtstats_app() around a safer end-to-end workflow. Original data now remain the active analysis dataset until prepared data are explicitly chosen; Data Prep can set publication display labels; and Table 1 is now named Summary table. The summary builder provides per-variable descriptive and inferential choices, live table styling, matching export output, and copy/download access to both analysis code and the complete session script. - Replaced the Summary table's expanding per-variable dropdown grid with two validated override editors. Unlisted continuous variables use Recommended; unlisted tests use Auto. Users enter only exceptions as variable = option, can use none to suppress a test, receive live validation and examples, and obtain matching named-vector R code. - Organised the app's Summary table controls into four numbered sections: contents, summaries, statistical comparisons, and appearance. Advanced Auto settings and cosmetic options are collapsed until needed. mean_ci cells now show the estimate and interval without repeating "95% CI" in every cell; the confidence level remains clearly defined in the relevant footnote. - Extended correlation() with a multi-variable matrix route via vars. Matrix output uses one transparent Pearson or Spearman method throughout, retains pairwise denominators and adjusted p-values in tidy $summary, and supports lower, upper or full publication layouts. plot_correlation() now visualises these results as a labelled coefficient heatmap. - Correlation matrices can now preserve input order, sort labels alphabetically, or use correlation-based clustering; users can hide the diagonal and include pairwise n alone or alongside adjusted p-values in each cell. Matrix heatmaps inherit the selected triangle and diagonal settings. - The app now includes a complete Correlation workspace for pair and matrix analyses, with checkbox variable selection, matrix layout and ordering, cell-content and multiplicity controls, table/heatmap previews, Audit tabs, downloadable tables and plots, and reproducible analysis/plot code. It also provides tidy CSV export, a selected-variable counter, large-matrix guidance, a visible warning when pairwise denominators differ, collapsible advanced controls, and a reset-to-defaults action. - Redesigned standalone proportion_stats() publication tables. Group values are now spanning headers with separate estimate and confidence-interval columns, while $summary remains a tidy long-form result. The compact row added by add_proportion() is unchanged. - Redesigned standalone rate_stats() publication tables to use group spanners with separate Events, accumulated time, Rate and confidence-interval columns. $summary remains tidy and add_rate() remains unchanged. - Corrected independent 2 x 2 audit wording from "complete pairs" to "complete observations", and ensured diagnostics_stats() identifies the crosstab outcome instead of displaying a missing variable name. - Automatic continuous comparisons now reserve rank-based methods for marked skewness. Shapiro-Wilk and mild asymmetry remain supporting information, so compare_groups() and add_p() consistently use Welch methods for the birth-weight example's maternal age. - assess_variance() now displays test = "levene" by default, implemented as the median-centred Brown-Forsythe modification. It is supporting information and never changes automatic test selection. - Restored variance to the visible assess_variance() output: every group cell now shows n, SD, and variance, with both observed SD and variance ratios shown in the publication table. No additional argument is required. - Paired comparison output now labels the estimate as a mean within-pair difference and reports exclusions caused by incomplete or non-unique pairs. Paired publication tables now identify the complete-pair denominator; McNemar/Cochran's Q notes are binary-specific; and Friedman fails clearly when there is no within-participant variation instead of printing NA. - assess_variance() now explicitly states that its spread diagnostics do not assess pairing or repeated-measures sphericity. Its interpretation no longer implies that Welch methods resolve repeated-measures assumptions. - add_proportion() now preserves an explicitly supplied publication label exactly and explains why add_p() does not duplicate the full-variable p-value on a selected-event row. - compare_groups() now has a public var_equal argument. The default remains FALSE, retaining Welch t-tests and Welch ANOVA for suitable independent continuous automatic comparisons. Set var_equal = TRUE only for a prespecified equal-variance assumption; it selects Student's t-test or classical ANOVA and is never inferred using a variance hypothesis test. - add_p() and plot_compare(show_p = TRUE) now forward var_equal to the same comparison engine, so their selected methods remain consistent. - summary_table(), add_summary(), add_proportion(), and add_rate() now support layout = "separate", which places estimates and confidence intervals in child columns beneath each cohort header. The backward-compatible "compact" layout remains the default. - Standardised the public result-output contract. Core analytical functions now accept format = "table" (the publication-ready default) or format = "tibble" for plain console output. The earlier output argument remains a compatibility alias on describe_data(), assess_distribution(), and assess_variance(). The assumptions, diagnostics, and denominator inspection helpers now follow the same publication-table default and format = "tibble" console route. - Corrected the paired manual case study to use summary_table(by = visit) and added an explicit console example for variance diagnostics. - Redesigned the app's Summary table workspace as a five-stage ribbon (Foundation, Statistics, P-values, Add, and Design). Foundation keeps data, compact searchable variable selection, grouping and Overall together. Downloads and reusable R code now sit with the persistent publication preview instead of occupying a separate Export tab. - Made Summary-table variable selection explicitly reversible: the app shows selected and available-variable counts, provides an Add variables button, and reopens the searchable list after an item is removed. Ribbon menus now render beyond their cards instead of being clipped. - Added epi_table() for publication-ready outbreak and surveillance tables from either individual line-list data or aggregate numerator/denominator data. The function makes events, denominators, scale and confidence-interval methods explicit; optional p-values and two-group epidemiological effects are separate reporting layers.