# Changelog All notable changes to AutoChangelog are documented here. ## [Unreleased] ## [1.3.9] — 2026-04-23 ### Added - Verbose mode (--verbose) for all four commands: validate, add, init, release; trace to stderr, stdout unaffected - ComputeEffectiveOverrides internal method on ChangelogValidator with 7 new unit tests covering all exclusion cases ### Fixed - ActiveOverrides now excludes unknown rule IDs, HardInvariant override attempts, and no-op overrides equal to the registry default - rule_overrides removed from schema required array; field is always emitted but optional per SCHEMA_STABILITY posture - README, PKGSTORE_LISTING, ACQUISITION_AND_INSTALL, TEST_SURFACE, SCHEMA_STABILITY, JsonReportFormatter comments reconciled to v1.3.8 implementation ## [1.3.8] — 2026-04-23 ### Added - KnownSectionNameRule: section headings not in the canonical taxonomy (Added/Changed/Deprecated/Removed/Fixed/Security) now fail validation with UNKNOWN_SECTION (exit 1) - NoDuplicateSectionsRule: duplicate section headings within the same [Unreleased] or versioned release block now fail validation with DUPLICATE_SECTION (exit 1) - SectionValidationTests: 41 new tests covering 10 families — unknown sections, duplicate sections, severity verification for NON_SEMVER/MISSING_DATE/EMPTY_SECTION, and regression coverage - ORPHAN_SECTION parse error: section headings outside any block are now detected and rejected at parse time (exit 2) - ORPHAN_ENTRY parse error: entry bullets inside a block but before any section heading are now detected and rejected at parse time (exit 2) - BLANK_ENTRY parse error: entry bullets with no text content are now detected and rejected at parse time (exit 2) - EMPTY_RELEASE validation error: versioned releases with no sections are now rejected (exit 1); [Unreleased] is explicitly exempt - SECTION_ORDER validation warning: sections within a block that are not in canonical order (Added, Changed, Deprecated, Removed, Fixed, Security) now produce a warning; fails under --strict - Rule classification system: HardInvariant vs Policy categories with stable rule ID constants in ValidationRules registry - Severity model (Error/Warning/Off) with GetEffectiveSeverity resolution: hard invariants always Error, policy rules respect override chain - Persistent rule policy config via .autochangelog.json (keys: full rule IDs, values: error/warning/off) - CLI --allow one-shot override for Policy rules; applying to HardInvariant rules is a UsageError (exit 4) - ValidationReport.ActiveOverrides: active rule override dict included in all validation results for auditability - JSON output: rule_overrides field (always present; empty object when no overrides active) - Text output: Active rule overrides section when overrides are in effect - 57 new tests: RuleGovernanceTests (unit, 30 tests) and RuleOverrideTests (integration, 27 tests) - JSON schema: rule_overrides property added to validation-report.schema.json (now required field) - Constitution §13 Rule Governance Rule: ratifies HardInvariant/Policy classification and override auditability requirements ### Fixed - H2_version_without_brackets test expectation corrected: unbracketed heading leaves subsequent section headings orphaned, producing exit 2 (not exit 1) under the new ORPHAN_SECTION parse rule - BLANK_ENTRY parser gap closed: exact blank bullets '- ' and '* ' (length 2) were silently discarded; corrected >= 2 guard now detects all blank bullet forms - ORPHAN_ENTRY now fires for bullets outside any block; previously silently treated as preamble noise - CHANGELOG.md 1.0.0 release: renamed non-canonical 'Ratified at 1.0' section to 'Added' entries to satisfy UNKNOWN_SECTION rule enforced since Pass 4 ## [1.3.7] — 2026-04-23 ### Added - AutoChangelog.Wasm project (src/AutoChangelog.Wasm/): browser WebAssembly bridge exposing canonical AutoChangelog.Core parse and validation via [JSExport]. Single exported function ValidateFull(content, strict, requireUnreleased) returns wire-format output. Targets net8.0-browser. No validation logic in the bridge; all behavior from AutoChangelog.Core. - AutoChangelog.slnx: AutoChangelog.Wasm added to solution. - RequireChangelogStructureRule: files with no [Unreleased] block and no versioned releases now fail validation with NO_CHANGELOG_STRUCTURE (exit 1) instead of passing silently - AbnormalInputValidationTests: 39 new tests covering 8 families of abnormal input (junk, prose, bullets, headings, empty, near-miss, whitespace, valid pass-through) ### Changed - PKGSTORE_LISTING.md: polished to v1.3.6 product surface — full validation rule table (all 7 rules), updated JSON example, tightened copy, CI examples, trust section - ACQUISITION_AND_INSTALL.md: example version updated to v1.3.6 ## [1.3.6] — 2026-04-20 ### Added - autochangelog-128.png, -256, -512, -1024 PNG assets and updated autochangelog.ico added to assets/ ### Changed - AutoChangelog.Cli.csproj: PackageIcon wired to autochangelog-128.png; PNG asset packed into NuGet package alongside README and LICENSE ## [1.3.5] — 2026-04-19 ### Added - validate --require-unreleased flag: warns (fails under --strict) when no [Unreleased] block is present ### Fixed - RequireUnreleased ValidationPolicy field now backed by RequireUnreleasedRule — field was declared and documented but no rule read it - Added constitutional §12 Layered Safety Rule formalizing the validate-vs-mutator boundary for workflow-unsafe conditions - README validate section expanded: rule table, severity semantics, --strict behavior, failure modes, and explicit read-only statement - validate now emits parse error (exit 2) for malformed release headings: unclosed bracket, empty bracket - validate now emits parse error (exit 2) for duplicate [Unreleased] headings - validate now flags present-but-invalid release dates (e.g. 'yesterday') as an INVALID_DATE error (exit 1) - validate now warns on non-semver release version identifiers via NON_SEMVER_VERSION; fails under --strict ## [1.3.4] — 2026-04-18 ### Changed - README.md — added suite toolchain declaration alongside AutoVersion and BuildStamp for symmetric cross-repo positioning - Help output is now unified across root and subcommand `--help` entry points - 'add --help' --message description now explicitly states that multi-word messages require normal shell quoting - ChangelogMutator now sorts releases by semantic version (descending) on every mutation; non-parseable versions sort last; pre-release labels rank below release for same numeric components ### Fixed - Bare positional argument to 'add' (e.g. 'add --section X "msg"') no longer emits misleading 'Unknown option' — now reports 'Unexpected argument' and points to --message - Invalid section name now reports 'Invalid section' with 'Accepted sections' list instead of 'Unknown section' / 'Valid sections' - Bare bullet marker messages ('-', '*', '- ', '* ') are now rejected with a clear error; '- ' was previously silently accepted after trimming - Unquoted multi-word message (e.g. 'add --section Added --message aa bb') now produces quote-guidance error with corrected invocation example instead of generic parser complaint - 'add' now writes releases in canonical newest-first order regardless of the order they appear in the source file; sorting is applied on every mutation - 'release' also writes canonical release order in the output file ## [1.3.3] — 2026-04-14 ### Added - Structured error surface with self-contained hint types: `ErrorDisposition` (enum), `HintDescriptor` (disposition + suggestion), `AutoChangelogErrors` (named descriptors), `ErrorWriter` (formats Error/Hint lines); no external dependencies - `Hint:` block on `autochangelog validate` (and `--format json`) when CHANGELOG.md is absent: suggests `autochangelog init` for the default path, "check the path" for explicit paths - `Hint:` block on all usage errors (unknown command, unknown option, missing required option) pointing to `--help` - `Hint:` block on `release --version` / `release --date` format violations - 20 new tests: `Integration/HintTests.cs` (10 runner-level) and `Usage/HintCliTests.cs` (10 CLI-level) ## [1.3.2] — 2026-04-14 ### Changed - README rewritten for first-contact legibility: Why It Exists, Quickstart, before/after release example, machine-readable output with real captured output, release evidence and verification, Guarantees table with test backing, CI integration examples - docs/TEST_SURFACE_AUTCHANGELOG.md: all test counts reconciled to exact runner output at v1.3.1; total coverage table replaced with verified layer breakdown (Unit 98, Integration 118, Contract 73, CLI 114, Total 403) ### Fixed - CI self-validation now skips gracefully when the release binary is not yet published (race on release-cut commits); emits a warning instead of failing - Install verification command corrected to autochangelog --help in README and docs/ACQUISITION_AND_INSTALL.md; autochangelog --version is not a valid command (exits 4) ## [1.3.1] — 2026-04-13 ### Added - `artifact_filename` and `artifact_sha256` fields added to `release-evidence.schema.json` as required fields; evidence now binds each archive to its SHA256 hash, enabling buyer verification - `ReleaseEvidenceSchemaConformanceTests`: 23 contract tests (positive and negative) proving release evidence JSON conforms to its schema - Release evidence schema copied to test output directory so conformance tests can load it by path - "Verifying a downloaded binary" instructions added to README and PKGSTORE_LISTING.md ### Changed - Release workflow: archive step now runs before evidence generation so the SHA256 hash can be computed and recorded in the evidence file - Release workflow: added smoke-verification step that confirms `artifact_filename` and `artifact_sha256` in evidence match the actual produced archive before upload - Release workflow: `publish_release` job now extracts the relevant CHANGELOG.md section for the release tag and passes it as `--notes` instead of relying on `--generate-notes` - Release workflow: `publish_release` job now checks out the repository so CHANGELOG.md is available for note extraction - CI workflow: self-validation version pin (`AC_VERSION`) removed; the version is now resolved dynamically from `package.json` at run time, eliminating CI/release drift ## [1.3.0] — 2026-04-08 ### Added - `autochangelog release` command: controlled release-cut from `[Unreleased]` into a versioned block; requires explicit `--version` (semver) and `--date` (yyyy-MM-dd); recreates an empty `[Unreleased]` block; validates before write; fails clearly on missing Unreleased, empty Unreleased, duplicate version, invalid version format, or invalid date format - `src/AutoChangelog.Core/Mutation/ChangelogMutator.ReleaseCut()` — pure model-level release-cut; extracts Unreleased sections into a new `ChangelogRelease`, prepends to release list, returns fresh empty `UnreleasedBlock` - `src/AutoChangelog.Core/Runner/ReleaseRunner.cs` — orchestrates release: validate inputs → read → parse → release-cut mutation → render → validate → write (LF, no BOM) → report - 36 new runner integration tests covering the release pipeline, all precondition rejections, LF output, preamble preservation, validation pass, and null guards - 26 new CLI certification tests covering all success paths, `init → add → release → validate` workflow, all rejection exits, determinism, and byte-identical output ## [1.2.0] — 2026-04-08 ### Added - `autochangelog init` command: creates a canonical minimal changelog skeleton at the target path. - `src/AutoChangelog.Core/Generation/ChangelogInitializer.cs` — deterministic skeleton generation via `ChangelogDocument` and `ChangelogRenderer.Render()`. - `src/AutoChangelog.Core/Runner/InitRunner.cs` — init pipeline: file-existence check, parent-directory check, generation, validation, write, and reporting. - 20 new tests covering `InitRunner`: success path, content shape, validation pass, LF/no-BOM output, existing-file rejection, missing-parent-directory rejection, and argument guards. - CLI certification test layer under `tests/AutoChangelog.Core.Tests/Usage/`. - 83 new process-level tests covering `init`, `add`, and `validate` through the real CLI boundary. - Determinism certification coverage for byte-identical outputs, stable JSON/text output, LF-only output, and repeatable workflow results. ### Changed - Version authority migrated from `version.txt` to `package.json` (`version` field); `package.json` is now the sole canonical version source. - `Directory.Build.props` now resolves version from `package.json`. - Tool-version contract tests and test-project output copying updated to use `package.json`. - Release workflow evidence generation updated to read version from `package.json`. - `scripts/push_pkgstore.ps1` updated to resolve version from `package.json`. - `README.md` and implementation documentation updated to reflect `package.json` as sole version authority. - Standalone binary in `E:\Omni\bin\autochangelog.exe` refreshed and verified at `v1.2.0`. - Total test count increased to 292. ## [1.1.0] — 2026-04-08 ### Added - `autochangelog add` command: first deterministic write surface for appending a single bullet entry to a target section. - `src/AutoChangelog.Core/Mutation/ChangelogMutator.cs` — pure model-level mutation with canonical section insertion order. - `src/AutoChangelog.Core/Rendering/ChangelogRenderer.cs` — deterministic document-to-text renderer with LF output. - `src/AutoChangelog.Core/Runner/AddRunner.cs` — add pipeline: validate inputs, read, parse, mutate, render, validate, write. - `src/AutoChangelog.Core/Mutation/MutateResult.cs` — result type for mutation operations. - 45 new tests covering mutation behavior and `AddRunner` integration. - Packaging metadata required for dotnet tool distribution. - `docs/PKGSTORE_LISTING.md` — canonical pkgstore.io listing copy. - `docs/UNITY_PORT_STRATEGY.md` — Unity Asset Store port/adaptation planning. - `scripts/push_pkgstore.ps1` — pkgstore push helper. - `assets/autochangelog.ico` — branded Windows application icon. - `scripts/generate_app_icon.py` — deterministic icon generation from Solcogito brand-pack sources. ### Changed - `autochangelog add` creates the `[Unreleased]` block when absent. - README command-surface documentation expanded for `add`, including examples and scope boundaries. - `InternalsVisibleTo` wired from `AutoChangelog.Core` to `AutoChangelog.Core.Tests`; helper methods reverted to `internal` where public exposure was only test-driven. - Preamble blank-line fidelity preserved during parse/render round-trips. - 4 additional tests added for preamble preservation behavior. - Release workflow updated so `.nupkg` is produced alongside standalone executables. - `Solcogito.AutoChangelog.1.0.0.nupkg` attached to the `v1.0.0` GitHub release. - CI self-validation pin updated from `v0.1.2` to `v1.0.0`. - `scripts/push_pkgstore.ps1` hardened to resolve exact package paths by version. - README installation and release-model sections clarified. - Windows executable icon embedding enabled via `ApplicationIcon`. ## [1.0.0] — 2026-04-08 ### Added - 1.0 boundary ratification document: `docs/AUTOCHANGELOG_1_0_RATIFICATION_AND_SLICE_PLAN.md`. - Formal release evidence JSON schema: `schemas/autochangelog/release-evidence.schema.json`. - CHANGELOG self-validation gate in CI. - Runner integration contract tests for version-order warnings, strict-mode pass behavior, `has_unreleased` false fixture handling, and JSON strict-field reflection. - Ratified CLI surface: `autochangelog validate [] [--format text|json] [--strict]` - Ratified exit code contract: 0 success, 1 validation failed, 2 parse error, 3 I/O error, 4 usage error, 5 internal error - Ratified JSON report schema (v1): `schemas/autochangelog/validation-report.schema.json` - Ratified validation rule set and severities: duplicate version (error), missing date / version order / empty section (warnings) ### Changed - `schemas/autochangelog/SCHEMA_STABILITY.md`: stability commitment updated from 0.x to 1.x releases. - README rewritten for 1.0 boundary clarity and validation-rule presentation. - `docs/IMPLEMENTATION_AUTCHANGELOG.md` updated to explicit 1.0 status with post-1.0 deferrals. ## [0.1.2] — 2026-04-08 ### Fixed - Version metadata mismatch between released artifacts and internal tool/report version metadata. ## [0.1.1] — 2026-04-07 ### Added - Product shell documents: README, genesis, constitution, implementation, proprietary license. - GitHub Actions CI and release packaging workflows. - Release evidence generation path for packaged CLI artifacts. - Contract tests for exit code stability and tool version metadata. - `.editorconfig` with Solcogito-uniform C# and IDE style settings. - `.gitattributes` with LF normalization and binary file declarations. ### Changed - Build/version metadata moved from hardcoded source constants to repository version authority. - `ToolVersion.cs` now reads assembly informational version metadata at runtime. - Test project copies version authority manifest and schema files to test output. - Restore/build made offline-safe in restricted environments by disabling implicit NuGet vulnerability audit. - `.gitignore` expanded to broader coverage for IDE noise, OS files, env files, and release artifacts. - GitHub Actions upgraded to newer action/runtime versions. - `publish_release` job guarded against spurious non-tag execution and release commands hardened. ## [0.1.0] — 2026-04-05 ### Added - Initial repository scaffold. - Core domain model: `ChangelogDocument`, `ChangelogRelease`, `ChangelogSection`, `ChangelogEntry`. - `ChangelogParser`: lenient line-by-line state machine with no-throw guarantee. - `ChangelogValidator` with default rule set. - `ValidationReport`: structured errors/warnings with stable JSON contract. - `TextReportFormatter` and `JsonReportFormatter`. - `ValidateRunner`: full validate pipeline with injected `TextWriter`. - CLI: `autochangelog validate` command with `--format` and `--strict`. - Deterministic exit codes (0–5). - xUnit test suite for parser, validator, formatters, report contract, and integration coverage. - JSON schema contract: `schemas/autochangelog/validation-report.schema.json`. - Schema stability policy document. - `Directory.Build.props`: unified artifact output paths, NuGet audit off, and product metadata.