Changes in version 0.3.2 (2026-06-26) Cross-platform reproducibility of the regression (golden) tests - Portable golden tolerances. The Leave-Cluster-Out and reweighting golden tests previously asserted bit-exact equality (expect_identical) against fixtures frozen on the development machine. The underlying computations run through floating-point linear algebra (BLAS), whose last few significant digits are not portable across CRAN's heterogeneous platforms / BLAS builds, so the bit-exact assertions failed on the CRAN check farm at the ~1e-11 (Leave-Cluster-Out) and ~1e-7 (reweighting) level. The portable invariant is now numerical: expect_equal() with tolerances (1e-6 and 1e-5 respectively) that absorb the non-portable noise while staying two-to-five orders below the scale of any genuine algorithmic regression. The stronger bit-exact assertion is retained as a developer-machine guard via skip_on_cran(). Logical outputs (robust) remain compared bit-exactly, as they are platform-invariant. No package code changed; this is a test-rigor fix that keeps the three rigor layers (algebraic / statistical / numerical) strictly separate. Changes in version 0.3.1 Wedge diagnostics for the transformation problem - New: compute_wedge(), wedge_stationarity(), placebo_values() (file R/wedge_diagnostics.R). The wedge W_i = Phi_i - V_i = K_i * G' - p_i isolates the marxian redistribution of surplus, cancelling the shared cost price k = c + v, and sums to zero across sectors by construction. The module builds the wedge (with a per-period zero-sum check), tests its per-sector and panel mean-reversion / unit-root behaviour (AR(1) reversion speed and half-life plus an augmented Dickey-Fuller test via urca), and constructs aggregate-preserving placebo "values" as negative controls (a uniform-profit- rate scheme, where the wedge vanishes and value equals the production price, and a seeded derangement that mis-pairs capital and surplus while preserving the per-period total). Used to move the evidential weight of the gravitation claim from the definitional level co-movement to the construction-orthogonal wedge dynamics, and to provide negative controls for the internal adversarial validation. Fully tested in tests/testthat/test-wedge.R. Changes in version 0.3.0 Single canonical disaggregation engine and a cross-sectional leave-out test for coupling robustness under input-output dependence. Canonical disaggregation (breaking) - Local disaggregation duplicate removed. The deterministic weight-blend run_disaggregation_custom_prior() (and its private helpers compute_L_from_P, spread_likelihood, posterior_weighted) never conditioned on the observed CPI and duplicated the purpose of the dedicated package. They are deleted. The single source of truth is now the closed-form conjugate engine BayesianDisaggregation::disaggregate_conjugate() (a Kalman/RTS smoother, pure R), added to Imports. - test_reweighting_robustness() rewired. Each alternative weighting scheme is a constant-in-time prior replicated across periods to form the weight matrix; the sectoral levels are the conjugate posterior median, genuinely conditioned on the CPI, instead of a deterministic blend. - Readers retained and relocated. The hardened read_cpi() (clean error on an unidentifiable column) and the internal read_weights_matrix() move to R/data_io.R; they are generic Excel input/output, not part of the disaggregation engine, and stay in this package. Leave-Cluster-Out - test_leave_cluster_out() (new, exported). Generalizes the delete-one-sector jackknife to delete-one-cluster: each group of sectors is dropped from both X and Y and the coupling is re-estimated. Under input-output ("MIP") dependence a naive leave-one-out is optimistic; dropping an entire value chain forces the prediction onto the general gravitation. It is the cross-sectional complement of the temporal time-shift / block-bootstrap nulls and reuses their coupling pipeline (it does not reimplement it). - build_cluster_map() (new, exported). Pluggable sector-to-cluster map. A genuine map (the Leontief partition) is supplied via cluster_map; when it is absent a documented fallback ("correlation" or "com") is built and flagged as a stopgap proxy, not a demand-linkage partition. - Delete-a-group (block) jackknife bias/se are reported with the documented balanced-cluster caveat; the primary outputs are per-cluster influence and the robustness verdict. Reproducibility - test_reweighting_robustness() now propagates its seed to the data diagnosis and the cross-validated PLS component selection, closing a gap where the per-scheme couplings depended on the ambient RNG state (call order). A pre-existing error-handler bug that dropped the failure marker for a failed scheme (<- instead of <<-) is fixed. Tests and documentation - New always-on tests (test-disaggregation-import.R, test-leave-cluster-out.R) and regression goldens (test-golden-convergence.R): the Leave-Cluster-Out reproduces a frozen result bit-exactly, and the rewired reweighting reproduces frozen couplings within numerical tolerance (the layers are kept separate). Goldens and Excel fixtures are regenerated by validacion/make_golden_convergence.R. - New vignette canonical-disaggregation-and-leave-cluster-out documents both decisions. Changes in version 0.2.0 Robustness-focused overhaul. This release fixes several correctness bugs and methodological flaws that could bias or invalidate convergence/coupling inference, and aligns the documentation with the implemented API. Methodology (breaking / behavioural) - Coupling null reconstructed. rotation_null_test() previously generated its null by random orthogonal rotation of the factor space. The four coupling statistics (Procrustes, CCA, principal angles, dynamic-beta norm) are invariant to orthogonal rotation, so the null was degenerate and the test could never reject. The default null is now a circular time-shift / moving-block bootstrap that preserves each series' marginal dynamics while breaking the cross-series temporal alignment. The pure-rotation null is kept only as an explicitly documented invariance diagnostic (null_method = "rotation"). - Permutation test reconstructed. test_permutation_robustness() previously permuted the columns of the Y factors; the coupling strength is invariant to that permutation, so the null was degenerate. It now permutes the time index of Y (circular shift) to break the X->Y relationship. - Convergence test de-tautologized. The OU/AR(1) persistence phi is no longer hard-constrained to (0, 1); it can express unit-root and mildly explosive dynamics, so the convergence verdict is now a genuine test of H0: not stationary rather than a constraint that is always satisfied. The prior on phi is weakly informative and centred at a neutral value rather than at high persistence. - MCMC diagnostics. estimate_factor_OU() now returns and (optionally) warns on R-hat, bulk/tail effective sample size and divergent transitions, and the previously dead adapt2/mtd2 controls now drive an automatic re-run when divergences are detected. - Real jackknife. test_jackknife_sectors() now performs a leave-one-sector -out jackknife with bias and standard-error estimates and influence ranking, instead of a single leave-top-k drop. - Out-of-sample significance. Nested out-of-sample comparisons (deltaR2_ou(), rescue_short_run_channel()) now report a Clark-West / Diebold-Mariano style test instead of a bare RMSE delta. - Multiplicity control. Benjamini-Hochberg FDR adjustment is applied to the per-series unit-root p-values and to the coupling-metric p-values. Reproducibility - All stochastic routines now honour their seed argument: rotation_null_test(), test_permutation_robustness(), sensitivity_analysis_weights() and the noise injection in diagnose_data() previously ignored it. Bug fixes - zzz.R defined .onAttach() twice; the Stan-availability message is restored. - .pkgenv was overwritten with a vector, destroying the package environment; it is now a real environment created in .onLoad(). - read_cpi() used which.max() on a logical, which silently selected column 1 when no date/CPI column matched; it now errors cleanly. - run_convergence_robustness_tests() used exists("indices$sensitivity") (always FALSE); the sensitivity block is now propagated. - to_num_commas() now parses both European and Anglo-Saxon number formats. - calculate_hc_manual() implements HC4 (it previously fell through to HC0) and uses sandwich/lmtest when available. - estimate_DFM() now returns robust t-statistics and p-values, reports the dominant-root half-life, and no longer floors the out-of-sample R^2 at -2. - visualize_factor_dynamics() no longer fails when save_plot = TRUE without a file name, and graphics are opt-in within the pipeline. - test_reweighting_robustness() no longer references an unassigned object when weight reading fails. Documentation - prepare_marxist_factors() now actually incorporates the auxiliary series (TMG, COM_matrix, SPVR_matrix, CA) it accepts. - README "Basic Usage" used non-existent functions (prepare_panel_data, estimate_dfm, estimate_ou_process, plot_convergence); it now uses the real API. - @return sections of the test functions, select_optimal_components_safe() and estimate_DFM() now match the objects actually returned. - New vignette section "Methodological notes and design decisions" documents the discrete-time OU/AR(1) interpretation, PLS vs PCA factor extraction, the generated-regressor caveat in residual-based unit-root tests, and the weighting-blend ("disaggregation") method. - DESCRIPTION no longer over-claims sandwich/lmtest usage; both are now Suggests and used when present, with a documented HC fallback. Changes in version 0.1.4 (2025-12-01) - Initial package structure.