                 Changes in version 2.0.1 (2026-08-06)                  

Documentation-only release prepared in response to the CRAN
pre-acceptance review of 2.0.0. No user-visible behavior changed.

  - wf_report() now carries a self-contained, executable example built
    on wf_attrition() weights, replacing the previous \dontrun{} block.
  - The non-installed prototype in inst/reference/wfc_future_usability.R
    restores graphics::par() with the explicit oldpar idiom instead of
    on.exit(), matching the CRAN convention for script files.

                        Changes in version 2.0.0                        

WFC 2.0 makes the verified, outcome-blind workflow the only supported
path to weight construction. This is a deliberate breaking release:
unsafe 1.x compatibility paths have no shim or override.

  - Public calibration, raking, post-stratification, automatic trimming,
    automatic weighting, and pipeline entry points now require unchanged
    wf_design_data and non-demo wf_verified_target objects before an
    engine can run.
  - Removed wf_target_manual(), wf_target_shrink(), inline moment
    targets, manual pipeline targets, and run-time margin injection.
    There is no supported replacement for pass-rate goals, desired
    outcome means or intervals, or other target choices intended to
    steer a result.
  - Preserved categorical entropy and fixed, predeclared
    soft-calibration tolerances only when constraints come from a
    verified external target; WFC does not search for a target or
    tolerance after seeing an outcome.
  - Rewrote current READMEs and articles around source evidence,
    design-only inputs, deterministic planning, qualified human
    approval, locked execution, post-lock impact assessment, and audit
    export.
  - Added concrete import samples for survey researchers and a stable
    refusal and handoff contract for AI agents. Decision makers receive
    a compact view while statistical users can inspect the full evidence
    and diagnostics from the same result object.
  - Added a WFC 1.x to 2.0 migration guide. Removed behaviors require a
    scientific redesign rather than an API rename.

                        Changes in version 1.1.0                        

Safety-oriented weighting workflow. This release adds a controlled path
for bringing the defensible parts of external calibration workflows into
WFC while preventing outcome-driven target or weight adjustment.

  - Added wf_prepare_design() to create a design-only object that
    rejects undeclared columns and keeps outcome variables outside
    weight planning.
  - Added CSV and optional Excel target/reference import with sidecar
    DCF source metadata, SHA-256 verification, stable identities, and
    bundled import samples.
  - Added outcome-blind cell-merge and weight plans. Category changes
    must follow an explicit ladder; the planner never widens limits,
    relaxes targets, changes method, or executes automatically.
  - Added human-attested plan approval and exact execution. Approvals
    are bound to plan identity, and locked weights retain design,
    target, plan, approval, and source identities for audit.
  - Added a practitioner composition API and lower-level composable APIs
    suitable for AI agents. Neither path can approve its own plan.
  - Added decision-maker and statistician report aliases, post-lock
    descriptive impact assessment, and the wfc_audit_v2 evidence schema.
  - Deprecated subjective manual targets, target shrinkage, inline
    moment targets, manual pipeline target declarations, and runtime
    margin injection. They remain compatible in 1.1 with a warning and
    are scheduled for removal in WFC 2.0.0.
  - Added controlled simulation validation, a survey reference
    comparison, and CI enforcement of that reference check. Independent
    qualified statistical review remains a separate release/reliance
    gate.

                        Changes in version 1.0.0                        

  - Standardized the maintainer and company contact identities, adopted
    GPL (>= 2), and added inst/COPYRIGHTS for dependency copyright
    boundaries.

API freeze and publication release. This release closes the 0.10 -> 1.0
roadmap by freezing the public WFC core API, documenting the deprecation
policy, and adding release infrastructure for CRAN and the bilingual
pkgdown site.

  - Declared the 1.0 public API freeze for exported signatures, core S3
    object fields, classed conditions, and stable English programmatic
    keys. Additive changes remain allowed; removals or semantic breaks
    require a major version.
  - Added an installed stability contract under
    inst/stability/api-freeze.md, including the frozen exported
    signatures, object-field expectations, condition taxonomy, and the
    one-minor-release deprecation policy.
  - Added the reserved wf_warning_deprecated warning class for future
    deprecations.
  - Refreshed cran-comments.md for the 1.0 initial CRAN submission and
    the current local check status.
  - Added _pkgdown.yml for the 1.0 publication site, with the English
    reference and article structure plus a link to the existing
    Simplified Chinese README.
  - Updated the WFCstudio integration contract to pin the sibling beta
    to the WFC 1.0 API boundary without adding GUI code or hard
    dependencies to WFC core.

                       Changes in version 0.16.0                        

Performance engineering. This release adds opt-in fork parallelism and
optional progress reporting for the long-running calibration paths while
preserving serial defaults and deterministic result ordering.

  - Added parallel = TRUE to wf_rake() and wf_poststrat() so independent
    target groups can run through parallel::mclapply on Unix-alike
    platforms. Windows falls back to serial execution with a note.
  - Added parallel = TRUE to wf_replicates() so replicate refit closures
    can run concurrently after the replicate multipliers have been
    generated.
  - Added progress = TRUE to the same APIs. When the optional cli
    package is installed, WFC shows a progress bar; otherwise execution
    silently falls back to the existing no-progress behavior.
  - Parallel execution captures classed WFC warnings and errors from
    child tasks and replays them in the main process, preserving the
    package's condition contracts.
  - Provenance now records whether parallel/progress execution was
    requested and how many workers were used. The R IPF kernel remains
    the default because this pass did not introduce an Rcpp dependency.

                       Changes in version 0.15.0                        

Methods II and influence diagnostics. This release adds panel attrition
weighting, high-influence unit diagnostics, and Fay's BRR while
preserving the existing wf_weights and replicate-variance contracts.

  - Added wf_attrition() to estimate inverse-retention weights for panel
    nonresponse. It fits base-R logistic retention models, supports
    grouped fits, stabilization, optional trimming,
    retention-probability diagnostics, and balance checks against the
    full prior wave.
  - wf_attrition() returns wf_attrition_weights, an additive subclass of
    wf_weights, so attrition correction can be chained through
    wf_compose() before calibration.
  - Added wf_influence() to rank units by weight ratio, squared-weight
    design effect share, leave-one-out design effect, and optional
    target-margin share.
  - Added Fay's BRR through wf_replicates(method = "brr", rho = ...),
    with the standard BRR behavior preserved at rho = 0.
  - as_svrepdesign() now preserves Fay BRR metadata by forwarding rho to
    survey when available.
  - wf_report() now carries attrition balance and retention-probability
    sections for attrition-stage weights.
  - Added the attrition-weighting and influence-diagnostics vignette.
  - Added focused tests for attrition validation, composition, influence
    diagnostics, Fay multipliers, and Fay replicate metadata.

                       Changes in version 0.14.0                        

Method-family expansion. This release adds soft calibration and entropy
balancing while keeping both methods inside the existing wf_calibrate()
and wf_weights contracts.

  - Added wf_calibrate(method = "soft"), a penalized calibration engine
    that preserves exact group totals while allowing declared margin
    relaxation within scalar or per-dimension tolerances.
  - Soft calibration now treats zero-support target categories as
    relaxable only when the achieved-vs-target gap remains inside the
    declared tolerance, and it records a $relaxation audit table for
    every group, dimension, and category.
  - Added wf_calibrate(method = "ebal") for entropy balancing. It
    minimizes divergence from base weights under exact categorical
    margins and optional continuous moment targets supplied through
    moments = c(var = mean).
  - Entropy balancing records per-group KL divergence and an optional
    $moments table with target and achieved means.
  - wf_report() now carries soft-calibration relaxation and
    entropy-moment sections, and wf_pipeline() / wf_run() can execute
    both new methods.
  - Added the soft-calibration and entropy-balancing vignette.
  - Added focused tests for infeasible soft margins, moment validation,
    pipeline execution, reporting sections, and method-specific
    printing.

                       Changes in version 0.13.0                        

Production infrastructure. This release makes recurring weighting rounds
declarative, auditable, and drift-checkable while continuing to run
through the existing weighting engines.

  - Added wf_pipeline() to declare a serializable
    target/stage/validation specification with a stable provenance hash.
  - Added wf_run() to execute population, reference, manual, or
    ready-target pipelines, optionally prepend a propensity
    pseudo-weight stage, accept numeric base weights for replicate refit
    closures, and attach pipeline provenance to the returned wf_weights.
  - Added wf_validate() to compare new weights against a reference
    release on group coverage, design effect, effective sample size,
    total weights, optional margin residuals, and matched-unit
    weight-ratio drift.
  - Added wf_audit_export() to write dependency-free JSON audit records
    with provenance, pipeline metadata, optional guided-workflow
    ledgers, input hashes, and user-supplied metadata.
  - Pipeline validation thresholds now emit classed wf_warning_quality
    conditions and preserve structured validation tables for downstream
    review.
  - Added the production-infrastructure vignette covering pipeline
    specs, runs, drift checks, replicate refit closures, and audit
    exports.

                       Changes in version 0.12.0                        

Ecosystem interoperability. This release connects WFC results to
survey/srvyr and broom-style consumers without changing any calibration
engine or adding a hard dependency.

  - Added as_svydesign() to align wf_weights with analysis data by exact
    unit ID and return a standard survey.design2, including cluster,
    strata, finite population, nesting, and downstream survey-estimator
    support.
  - Added as_svrepdesign() for wf_replicate_weights, mapping bootstrap,
    JK1, JKn, and BRR metadata while preserving WFC scale/rscales and
    full-estimate MSE semantics. survey::svymean() reproduces
    wf_variance() standard errors for all three WFC replication methods.
  - Both bridges enforce unique, identical ID sets, preserve input row
    order and provenance, reject reserved controls, avoid input
    mutation, and raise a classed wf_error_dependency when the suggested
    survey package is absent.
  - Added conditionally registered generics::tidy(), glance(), and
    augment() methods for weights, diagnostics, blend results, and
    variance results. They return base data frames with stable English
    programmatic keys; augment.wf_weights() appends .weight and .feature
    by exact ID.
  - Added the ecosystem-interoperability vignette and froze the
    separate, no-statistics WFCstudio sibling-package integration
    contract.
  - Raised the minimum R version from 3.5.0 to 3.6.0, the release that
    introduced delayed S3 registration for suggested-package generics.

                       Changes in version 0.11.0                        

Guided workflow and localized output. This release adds an auditable
non-specialist path over the existing engines without changing their
numerical semantics or stable object keys.

  - Added wf_autoweigh() to build or accept a target, enforce precheck,
    apply only declared category-collapse remediations, route to raking,
    post-stratification, or bounded logit calibration, and return
    weights, diagnostics, a manager report, final inputs, and an ordered
    decision ledger.
  - Automatic method selection now chooses post-stratification only when
    both a reviewed collapse ladder and min_cell are supplied; otherwise
    it uses raking and never silently selects bounded logit calibration.
  - Guided raking integrates wf_auto_trim(): finite recommendations may
    be confirmed and applied, while no-trim and no-solution outcomes are
    recorded explicitly. Non-interactive runs remain reproducible and
    auditable.
  - Added matched English and Simplified Chinese output catalogs with
    explicit argument, option, and locale resolution. wf_report() and
    all package plot methods now localize human-facing labels while
    preserving English object, column, condition, action, and ledger
    keys.
  - Added wf_autoweigh_result printing, aligned structured artifacts,
    localized narration, classed refusal paths, and focused tests for
    every routing, remediation, trim, and language branch.
  - wf_apply_collapse() now keeps retained joint population cells
    synchronized with collapsed margins, so guided post-stratification
    cannot use stale joint categories after remediation.

                       Changes in version 0.10.0                        

Usability foundations. This release adds review and communication layers
over the existing weighting engines without changing their numerical
semantics.

  - Added wf_report() with manager and analyst projections, structured
    method-specific sections, Markdown output, dependency-free escaped
    HTML, print(), and as.data.frame() support. Reports accept both
    wf_weights and wf_blend_result objects.
  - Added wf_auto_trim() to sweep candidate caps, expose the
    bias-variance frontier, preserve candidate warnings/failures, and
    recommend the loosest cap satisfying declared design-effect and
    margin-residual criteria.
  - Added wf_suggest_ladder() to draft adjacent category merges from
    worst-group support, order dimensions by affected sample share, and
    return a validated ladder for explicit human review.
  - Added base-graphics methods for weights, diagnostics, automatic trim
    results, blend sensitivity, and propensity overlap/balance.
  - Propensity results now inherit from the additive
    wf_propensity_weights subclass and retain fitted propensity vectors
    for overlap plotting while remaining fully compatible with
    wf_weights consumers.
  - The lang argument on wf_report() reserves the 0.11 localization
    contract; 0.10 reports are English-only and reject unsupported
    languages explicitly.

                        Changes in version 0.9.1                        

Stabilization release. No public API signatures or weighting-method
semantics changed.

  - Added an external oracle test comparing grouped raking, including
    non-uniform initial weights, against survey::rake().
  - Added determinism and order-invariance contracts for sample rows and
    calibration dimensions.
  - Added an 80% line-coverage CI gate and a reproducible performance
    benchmark harness for the core raking workloads.
  - Added the three workflow vignettes promised by the core design: the
    complete precheck-execute-diagnose loop, population-data mapping,
    and dirty-data / infeasibility handling.
  - Regenerated wfc_example with support in every documented joint cell.
    The former deterministic pattern passed marginal precheck but made
    the README raking quick start structurally non-convergent.
  - Fixed wf_precheck() so an NA grouping key is reported as na_group
    without leaking into group arithmetic and causing an unrelated
    missing-value error.
  - Added CRAN release notes and refreshed contributor, package-name,
    data-policy, and verification instructions after the rename to WFC.

                        Changes in version 0.9.0                        

Package renamed from weightflow to WFC: CRAN already hosts an unrelated
survey-weighting package named weightflow, so the old name could not be
submitted and would shadow installations from CRAN.

  - Renamed the package, GitHub URLs, and test harness accordingly. All
    wf_* function names, classes, and condition classes are unchanged.
  - Renamed the bundled example dataset weightflow_example to
    wfc_example (regenerated by data-raw/make-wfc-example.R).
  - Added the Extension 3 design document
    (inst/design/wfc_future_design.md) committing the 0.10 -> 1.0
    roadmap: guided workflow, localized reports, survey/broom bridges,
    pipeline infrastructure, soft calibration, entropy balancing,
    attrition weighting, and influence diagnostics; with reference
    prototypes under inst/reference/wfc_future_*.R.

                        Changes in version 0.8.1                        

Audit fixes for robustness and CRAN/GitHub compliance. No new public
API.

  - wf_rake() now raises a classed wf_error_convergence (with the group,
    the worst dimension, and the last deviation) when IPF fails to
    converge within max_iter, instead of silently recording a
    non-converged log row. This implements the behaviour specified in
    the core design document.
  - wf_poststrat() now validates the init_weight column name and raises
    wf_error_schema when it is absent, matching wf_rake().
  - wf_propensity() now rejects NA values in membership-model predictors
    with a classed wf_error_input instead of failing inside glm() with
    an unrelated message.
  - wf_rake() and wf_poststrat() provenance now records the installed
    package version instead of a hard-coded historical string.
  - Vectorized respondent-to-resolved-cell assignment in wf_poststrat()
    (per-ladder-level instead of per-row), improving large-sample
    performance.
  - Declared Imports: stats, utils, set a real package maintainer, and
    extended .Rbuildignore (nested .DS_Store, .worktrees, root
    tarballs).
  - Added a GitHub Actions R CMD check --as-cran workflow across R
    devel, release, and oldrel on Linux, macOS, and Windows.

                        Changes in version 0.8.0                        

Bounded calibration. Adds a Deville-Sarndal calibration engine to
wf_calibrate() with linear (GREG) and bounded (logit) distances.

  - Added wf_calibrate(method = "greg") for the linear GREG estimator.
  - Added wf_calibrate(method = "logit", bounds = c(L, U)) for
    calibration with weights bounded within (L, U) by construction,
    merging margin alignment and weight trimming into one step.
  - Both calibrate to the existing wf_target margins, honour
    init_weight, and return the standard wf_weights so they compose and
    support replicate variance.

                        Changes in version 0.7.0                        

Variance and uncertainty. Adds replicate-weight variance that re-runs
the calibration pipeline per replicate, so estimates carry standard
errors and confidence intervals including calibration uncertainty.

  - Added wf_replicates() to generate re-calibrated replicate weights
    via Rao-Wu bootstrap, stratified delete-one jackknife, or BRR,
    driven by a user refit closure.
  - Added wf_variance() to combine replicate weights and an estimator
    into an estimate, variance, standard error, and normal or percentile
    confidence interval, using one unified combining rule across
    methods.
  - Added an init_weight argument to wf_rake() so raking can consume
    replicate base weights (unchanged behaviour when NULL).

                        Changes in version 0.6.0                        

Non-probability correction via propensity. Adds a two-step propensity
workflow that corrects a self-selected online sample against an offline
probability reference, emitting pseudo-design weights that feed
calibration as initial weights.

  - Added wf_target_propensity() to stack an online sample and a
    probability reference into a membership-model specification.
  - Added wf_propensity() to fit a base-R logistic membership model and
    emit inverse-propensity pseudo-design weights as a wf_weights stage,
    with stabilized IPW on by default and optional trimming.
  - Added overlap / common-support and covariate-balance diagnostics,
    with a wf_warning_quality on poor support.

                        Changes in version 0.5.0                        

Dual-source fusion. Adds estimator-level online/offline fusion without
stacking row-level weights.

  - Added wf_blend() for estimator-level dual-source fusion of online
    and offline wf_weights objects.
  - Added wf_blend_result with source estimates, applied lambda values,
    diagnostics, sensitivity output, and provenance.
  - Added support for neff, inverse_variance, and fixed lambda
    strategies.

                        Changes in version 0.4.0                        

Weight pipeline ledger. Adds a composition layer for chaining weighting
stages while preserving stage-level provenance.

  - Added wf_compose() to multiply compatible wf_weights stages into one
    auditable wf_weights result.
  - Added ID-safe composition with classed errors for duplicate IDs,
    missing IDs, different ID sets, incompatible groups, and invalid
    weights.
  - Added optional composed-weight normalization with normalize =
    "mean1" and normalize = "sum".

                        Changes in version 0.3.0                        

Foundation API completion. Extends the calibration workflow with manual
targets, target shrinkage, and a unified dispatcher, while preserving
the existing raking and post-stratification engines.

  - Added wf_target_manual() to build a canonical target from a
    ready-made long margin table.
  - Added wf_target_shrink() to shrink a target toward a reference
    target.
  - Added wf_suggest_collapse() to turn precheck findings into a
    reviewable collapse plan using ladders declared in wf_dims().
  - Added wf_apply_collapse() to apply a collapse plan consistently to
    both the sample and the target.
  - Added wf_calibrate(), a unified dispatcher that routes to wf_rake()
    or wf_poststrat() while preserving the common wf_weights contract.

                        Changes in version 0.2.0                        

Post-stratification engine. Adds cell-level calibration against joint
population targets, with reviewable collapse ladders and planning.

  - Added joint population targets via wf_target_population(...,
    keep_joint = TRUE).
  - Added wf_collapse_ladder() to declare post-stratification collapse
    ladders.
  - Added wf_plan_poststrat() to plan cell resolution before execution.
  - Added wf_poststrat() to run cell-level post-stratification,
    returning a cell_report and collapse_map.

                        Changes in version 0.1.0                        

Initial package foundation and core raking workflow.

  - Added wf_dims() to declare schema-agnostic calibration dimensions.
  - Added wf_target_population() and wf_target_reference() target
    constructors.
  - Added wf_precheck() for structured sample/target compatibility
    checks.
  - Added wf_rake() grouped raking (iterative proportional fitting) with
    trimming cycles and a missing-data policy.
  - Added wf_diagnose() weight and margin diagnostics.
  - Added the simulated weightflow_example dataset for examples and
    tests.
