                 Changes in version 1.2.1 (2026-09-25)                  

  - dcc_check(), dcc_run(), and dcc_template() no longer default their
    write destination to the working directory. output_dir and path are
    now required; calling without them raises the package's own error
    instead of writing to getwd(). Existing calls that pass a
    destination are unaffected.
  - dcc_run() validates output_dir as one non-empty string before any
    work starts.
  - Documentation and DESCRIPTION follow CRAN's quoting convention: only
    third-party software names are single-quoted; file formats such as
    CSV, JSON, YAML, and HTML are not.

                        Changes in version 1.2.0                        

  - Add stable finding code and detector_id; range checks now report
    INVALID_NUMERIC instead of silently coercing invalid values to
    missing.
  - YAML rules use declared IDs publicly while preserving direct
    detector IDs; unambiguous legacy action aliases warn for one
    transition release.
  - Add dcc_dispositions() with one terminal state per finding and make
    reconciliation verify those states against audit evidence.
  - Add start/end/outcome/hash/count provenance and preserve legacy
    timestamp records.
  - Preserve NA totals for entirely missing scored rows and validate
    custom scoring return type and length.
  - Publish dcc_run() outputs atomically; manifest and other failures
    create a failed diagnostic directory and cannot be returned as
    success.
  - Capability contract 1.2 and new disposition/provenance schemas
    describe the additive machine contract.
  - Add a single format-adapter registry and strict dcc_import()
    canonical layer with dictionaries, explicit missing states,
    import-plan hashes, and source-aware conversion errors.
  - Add declared text/FWF/JSONL/RDS input, bounded gzip and safe
    explicit-member ZIP input, XLS/XLSX/ODS and limited Experimental
    XLSB, SPSS/Stata/SAS/XPT, and Parquet/Feather adapters. All formal
    input backends are now installed with DCC.
  - dcc_capabilities()$formats now reports registry status, extensions,
    backend, semantics, and limitations; dcc_doctor(formats = "all")
    checks backend versions and platform constraints.
  - Add the versioned strict dcc_plan contract and published plan
    Schema; protected bilingual dcc_template() workbook; exact
    Excel/JSON parsing with cell coordinates or JSON Pointers;
    non-mutating dcc_check() diagnostics; additive dcc_run(plan =)
    support; and synchronized dcc_help() guidance.
  - Add dcc_report_model() as a validated single source for three
    audience renderers: bilingual redacted staff Excel/HTML/text,
    complete statistical tables and methods with SHA-256 manifests, and
    deterministic versioned machine JSON/JSONL with bundled schemas.
  - dcc_run() can atomically publish selected staff/, statistical/, and
    machine/ bundles. Run manifests expose report lifecycle states,
    common counts and hashes, and retain cleaning evidence on renderer
    failure. PDF is optional and is not generated by the base contract.
  - Add Phase E acceptance and release engineering: generated
    property/fault suites, immutable multi-format fixtures with
    three-platform CI, reviewed one-million-row time and memory
    baselines, and strict dependency/install verification with a
    complete offline source-repository builder.
  - Add explicit staff, statistician, and AI-Agent acceptance contracts.
    The staff path includes a validated facilitator workbook and
    requires signed real-user evidence for a staff-study pass; automated
    preparation cannot be reported as usability success, and staff-study
    status does not block release.
  - Add a staff acceptance workbook supporting one or more real
    participants as an advisory, non-release-blocking usability study,
    and an executable twenty-task AI-Agent harness with closed per-task
    JSON, whitelist and validation/preview gates, artifact assertions,
    and evidence hashes.
  - Strict plan validation now surfaces format preflight codes such as
    IMPORT_SOURCE_MISSING and IMPORT_SHEET_REQUIRED before import, and
    dcc_rerun() can reproduce manifests whose rules came from strict
    JSON or Excel plans through the same canonical import compiler.
  - Add a closed release-evidence schema and one fail-closed verifier
    covering R checks, zero-skip tests, coverage, format semantics,
    benchmarks, all three audiences, dependencies, schemas, versions,
    freshness, and artifact hashes.
  - Classify R CMD check NOTEs with an exact machine-readable allowlist:
    only the CRAN first-submission NOTE (cran_new_submission) is
    non-actionable; every other NOTE remains release-blocking.
  - Performance CI now distinguishes GitHub-hosted ARM64 from local
    Apple Silicon and compares against a reviewed three-run hosted
    baseline with explicit CPU identity and a 45-second execution limit.
  - Shared GitHub runner timing regressions are now reported as review
    advisories, while benchmark correctness, evidence compatibility,
    memory limits, minimum repetitions, and the 45-second execution
    budget remain release-blocking. Strict 20% relative comparison
    remains available for stable like-for-like hardware.

                        Changes in version 1.1.0                        

Additive-contracts release: machine-readable capabilities and formal
schemas for AI callers, plus a one-command workflow and structured
validators for survey staff. Every change is additive; no 1.0.x call
changes shape.

  - dcc_run() runs the whole Detect -> Execute -> Report pipeline from a
    dcc_config() and writes a fixed output layout (cleaned-data.csv,
    findings.xlsx, audit-log.csv, the two HTML reports, manifest.yaml,
    run-summary.txt). Preview is the default mode and the raw input file
    is never modified in any mode. dcc_run_files() lists what was
    written.
  - dcc_read_config() reads an Excel cleaning-plan workbook into a
    dcc_config(), so survey staff configure a run in a spreadsheet
    instead of YAML; dcc_write_config_template() writes a starter
    workbook.
  - dcc_apply_codebook() applies a declarative codebook (rename, recode,
    missing declaration, type, labels, roles) with a dry_run preview
    that shares one planner with the apply path, so a change is
    previewed exactly as applied. The raw input is never overwritten.
  - A declarative skip_logic rule marks skipped items as not
    administered so the missing-items detector no longer counts a
    legitimately skipped item as missingness.
  - dcc_config() bundles rules, actions, an id column, and items.
  - dcc_validate_rules(), dcc_validate_data(), dcc_validate_config(),
    and dcc_doctor() return a structured dcc_validation report (code,
    severity, field, affected rows, and a suggested fix) and change
    nothing. dcc_run() validates before it detects or executes.
  - dcc_capabilities() returns a versioned, deterministic document of
    every feature (with Stable/Experimental/Planned status and since),
    rule type, action type, and input format, plus the operations DCC
    does not support. The action-type and format lists are the same
    source of truth the engine uses, so the document cannot drift from
    the implementation.
  - dcc_schema() returns published draft-07 JSON Schemas (installed
    under inst/schemas/) for a finding, an audit-log row, a rule file,
    an action map, and a manifest.
  - Added public accessors so callers never read hidden attributes:
    dcc_unhandled() (a result's unhandled findings), dcc_item_map() and
    dcc_mapping_findings() (a dcc_map_forms() result's item map and
    mapping problems).
  - Added AI_USAGE.md: the approved public functions and the safe
    capabilities -> validate -> preview -> execute -> reconcile ->
    export -> verify flow for AI systems.

                        Changes in version 1.0.1                        

Audit-correctness and format-reliability release. Every finding now has
a stable identity that every audit row and reconciliation joins on
exactly, and every supported input format is certified. All changes are
additive to the public schemas; no valid dcc_*() call changes shape.

  - Every finding carries a deterministic finding_id (run + check +
    record + variable + occurrence). dcc_detect() and
    dcc_detect_chunked() derive the run prefix from the rule and
    source-file hashes, so the same data and rules reproduce the same
    identities.
  - dcc_execute() validates the whole plan before any data changes:
    unknown action IDs, unmapped recodes, missing or duplicated record
    IDs, and cell-level actions on group-level findings are now errors
    instead of silent degradations. Each audit row carries the exact
    finding_id it came from.
  - Findings without an explicit action are returned as result$unhandled
    rather than being silently auto-flagged, so an unhandled finding can
    never be reported as handled. (default is retained for call
    compatibility but no longer auto-dispositions.)
  - dcc_reconcile() joins audit rows to findings on finding_id only and
    assigns each finding one terminal status (changed, excluded,
    flagged, or unhandled); an audit row with no matching finding raises
    a dcc_reconcile_error. The loose record_id + check_id matching and
    the unreconciled_changes attribute are gone.
  - dcc_detect_chunked() infers the separator from the extension (sep =
    NULL gives a tab for .tsv, a comma otherwise) and locks first-chunk
    column types via a data.table-compatible colClasses map, so chunked
    runs are warning-free on exact chunk multiples, later all-NA chunks,
    quoted delimiters, embedded newlines, and latin1 input.
  - Certified the full input matrix (CSV, TSV, JSON, Excel, SPSS, Stata,
    SAS, Parquet, Feather) with a format-matrix test suite and Arrow
    multi-batch Parquet/Feather parity against in-memory findings. Added
    writexl to Suggests and to the CI dependency set.

                        Changes in version 1.0.0                        

First stable, CRAN-targeted release. The public API -- the exported
dcc_* functions and the dcc_findings and audit-log schemas -- is now
stable; breaking changes to either schema will be major releases.

  - Added an end-to-end vignette, vignette("dcc-pipeline"), covering the
    Detect -> Execute -> Report workflow.
  - Completed \examples coverage for every exported function
    (dcc_detect_chunked(), dcc_manifest(), dcc_rerun()).
  - Rewrote the README around the package, licensed the project under
    GPL (>= 2) (copyright WEIAN DATA TECH (Beijing) Co., Ltd.), recorded
    authorship, copyright, and funding in DESCRIPTION, and documented
    external dependency copyright boundaries in inst/COPYRIGHTS.

                        Changes in version 0.5.0                        

First package release, covering the full Detect -> Execute -> Report
workflow.

  - dcc_read() multi-format, multi-encoding input layer; the dcc_data
    container with a provenance chain; dcc_l0_diagnose() structural
    diagnostics.
  - dcc_rules() / dcc_detect() declarative YAML rule engine and the five
    response-quality detectors (missing items, straight-lining, response
    time, trap items, score anomalies), producing the dcc_findings
    object.
  - dcc_execute() execution engine with a cell-level audit log;
    dcc_score() answer-key scoring; dcc_map_forms() multi-form item-bank
    alignment.
  - dcc_report() dual-layer HTML reports, dcc_reconcile() closed-loop
    verification, dcc_trace() cell lineage, and dcc_manifest() /
    dcc_rerun() manifest-based reproduction.
  - dcc_detect_chunked() larger-than-memory detection with an adaptive
    CSV/Arrow backend, plus CI performance benchmarks.
