Changes in version 0.5.0 - This release follows 0.1.1 on CRAN. Versions 0.2.0 to 0.4.0 were never on CRAN: they were early development snapshots archived on Zenodo, so this release is numbered 0.5.0 to avoid clashing with them. Breaking changes - asc_null() has been rewritten. The triad of null models of 0.1.x (A0: Curveball, B0: SAD reshuffle, C0: trait shuffle; they were called A, B and C in 0.1.x) is replaced by two null models, chosen after a simulation study of their error rates and power: - A (sampling): individuals (or, when both states have replicates, whole samples) are reassigned at random between the two states. Asks whether the change is larger than expected from sampling alone. - B stratified (traits): trait positions are permuted among species of similar abundance (groups of stratum_size species, default 5). Asks whether the change depends on which traits the species have. Reported with both tails for position: the lower tail flags compensation. - A0 and B0 were removed after that simulation study and C0 was replaced by B stratified; there is no option to run the 0.1.x models in 0.5.0. - The letters now mean something different: in 0.5.0, A is the sampling null model and B the stratified trait null model. The 0.1.x models are written A0, B0 and C0 to avoid any confusion. - New output of asc_null(): null_models has columns Contrast, Test, Layer, Observed, Null_mean, Null_sd, SES, P_upper, P_lower and P_two (p-values are no longer rounded; they are (b + 1) / (n + 1)). summary() reads each test in words. - For asc_pairwise() objects, asc_null() now runs one global test per layer over all communities (instead of one p-value per pair): mean distance of the centroids to the common centroid, and standard deviation of FDis and FRic among communities. It also returns site_contribution. - asc_transitions(): the default reference point is now the midpoint between the two centroids (ref = "midpoint"), which makes the result independent of which state is called the reference. Use ref = "reference" for the 0.1.x values. Species absent from both states are no longer listed. - Abundances are now matched to traits by species name (an error names any species without traits). - The dependency on 'vegan' was removed; 'withr' was added. New features - asc_null(entities = ): null model A on abundances summed by functional entity, to tell replacement among similar species from change in the functional groups themselves. - asc_transitions() returns the partition of the shift among shared, gained and lost species (with its range across reference points) and, with entities, the exact split of the shift between and within entities. - asc_entities() chooses k by the mean silhouette width when neither k nor h is given, and reports the suggestions of the silhouette, Mojena's rule and the gap statistic. - correction = "sqrt" (Gower 1971) in all functions that build the functional space: makes the Gower distance Euclidean (quality = 1). Use it when assess_functional_space() reports quality below 0.8. - type and weights are passed to cluster::daisy() for ordinal, asymmetric binary or weighted traits. - seed in asc_null() and asc_entities() no longer changes the user's random number stream. Validation - The null models were evaluated by simulation (false-positive rate under no change and power under directed change, change in dispersion, change in volume and compensation) on the functional space of a real butterfly data set and on synthetic spaces. A by samples and B stratified keep the error rate at or below about 5 %; B is slightly liberal for dispersion (about 6.5 %) and when individuals are captured in groups (about 7 %). B has little power to detect compensation: use entities for that. Changes in version 0.1.1 (2026-07-30) CRAN Resubmission Updates - Expanded ASC-CFD acronym in DESCRIPTION to 'ASC-CFD' (Assemblage Shift Characterization - Community Functional Dynamics). - Added missing \value tag in plot.ascfcd_entities.Rd. - Refactored random number generation (RNG) in asc_null() to strictly comply with CRAN policies regarding .GlobalEnv and .Random.seed manipulation. Changes in version 0.1.0 Initial CRAN release Core Framework - asc_paired(): Temporal/paired functional restructuring (Layer 1-3). - asc_pairwise(): Bidirectional spatial functional divergence across all community pairs. - asc_baseline(): Absolute functional topology (CWM, FDis, FRic) for isolated communities. - asc_null(): Hierarchical triad of null models A0, B0 and C0 (Structural/Curveball, Quantitative/SAD, Identity/Trait Shuffle). - asc_transitions(): Species-level Functional Leverage decomposition. - asc_entities(): Species clustering into discrete functional entities. - assess_functional_space(): Diagnostic tool for evaluating PCoA quality before analysis. Architecture - Centralized internal engines (.build_functional_space(), .calc_core_topology()) shared across all modules. - S3 class system with print(), summary(), and plot() methods for all output types. - PCoA quality metric ($Q = \sum\lambda^+ / \sum|\lambda|$) with automatic warning when $Q < 0.80$. Null Models (Labelled A, B and C in 0.1.x; written A0, B0 and C0 since 0.5.0, where A and B name the new null models.) - Model A0 (Structural): Curveball algorithm preserving richness and prevalence. - Model B0 (Quantitative): SAD reshuffle with fixed incidence. FRic reported as NA (hull invariant). - Model C0 (Identity): Trait shuffle breaking species-trait association. Validation - 28 testthat unit tests covering class structure, edge cases, orthogonal scenarios, null model isolation, and leverage additivity. - 61 functional tests (standalone script) including cross-validation against manual computation.