

# Changelog

All notable changes to this project will be documented in this file.

This project follows a pragmatic interpretation of Semantic Versioning.
Given its role as CI automation infrastructure, behavioral changes may be considered breaking even if the API surface remains stable.

## [3.3.0] — 2026-04-05

This release softens the TOML migration for CI pipelines and adds an optional internal path for surfacing prior job results in Slack notifications.

### Added

- Pre-parse TOML env interpolation with `${VAR}` and `${VAR:-default}` so CI-owned values such as LLM toggles and model filenames can stay external while non-secret runtime config remains in `mr-milchick.toml`.
- Optional `notifications.pipeline_status` config that recursively scans `*/milchick-status/*.json` and feeds normalized job-status lines into Slack templates.
- New notification template placeholders for pipeline-status output and counts, including `pipeline_status_block`, `pipeline_status_count`, and the passed/failed/unknown counters.

### Changed

- Built-in Slack app and Slack workflow thread templates now include the optional pipeline-status block when status files are present.
- CI-facing examples now show the recommended pattern of using non-`MR_MILCHICK_*` shell env vars together with TOML interpolation for local LLM model setup.

### Docs

- Documented TOML interpolation semantics and caveats, including the fact that the syntax is intentionally Milchick-specific rather than standard TOML.
- Documented the optional internal `milchick-status` JSON convention, the tolerant fields Milchick reads today, and how to render the result in Slack templates.

## [3.2.0] — 2026-04-03

This release draws a much firmer line around configuration, so the codebase and the docs finally describe the same runtime model.

### Added

- A single resolved-config entrypoint that loads one authoritative `ResolvedConfig` from defaults, `mr-milchick.toml`, and env-provided secrets.
- Strict TOML schema, resolver validation, and unit coverage for config parsing, defaults, secret injection, and capability mismatches.
- Clear rejection of removed legacy runtime env vars, so stale pipeline configuration fails loudly instead of being silently half-applied.

### Changed

- Non-secret runtime settings now live in `mr-milchick.toml`, including platform base URL, execution mode, reviewer routing, CODEOWNERS behavior, Slack notification shape, templates, and local inference settings.
- `MR_MILCHICK_CONFIG_PATH` is now the canonical config-path override, replacing the old flavor-path naming.
- Runtime wiring now receives typed config from the resolved boundary instead of mixing direct env reads into app orchestration and connector setup.
- Local LLM smoke tooling now uses dedicated smoke-test env names so the removed runtime inference env surface no longer leaks into developer helpers.

### Docs

- README, architecture notes, config reference, CI quickstart, local testing, reviewer-routing guidance, fixture-testing notes, and local-LLM docs were rewritten to match the new resolved-config boundary.

## [3.1.0] — 2026-04-02

This release trims Slack channel noise during follow-up review passes and makes the sink behavior easier to understand from the docs.

### Added

- Fixture coverage for a threaded Slack app notification flow, including a pair of fixture scenarios that exercise a first MR notification followed by an update for the same MR.

### Changed

- Slack app update notifications now try to post into the existing thread for the same `MR #...` instead of always creating a fresh channel-level root message.
- Fixture-backed CLI coverage now verifies that a later Slack app update for the same merge request reuses the original thread when it exists.

### Docs

- README now calls out that same-thread update reuse currently applies only to the Slack app sink; Slack workflow delivery keeps its own workflow-driven message behavior.

## [3.0.0] — 2026-03-31

This release makes Mr. Milchick materially smarter without making it less predictable. Review snapshots now retain patch hunks, the core can run advisory local GGUF inference asynchronously, and generated recommendations can be threaded into MR output and downstream notification sinks while policy enforcement stays deterministic.

### Added

- Advisory local-inference plumbing for external GGUF models, including new runtime configuration for enabling the feature and pointing the binary at a model path outside the repository.
- An opaque core inference layer that keeps model-specific runtime details out of connectors and execution surfaces.
- Smoke-test coverage for local model initialization so backend/device issues can be isolated from the rest of the review pipeline.

### Changed

- Review snapshots now preserve diff and patch content instead of reducing changes to file-level counts only.
- Recommendation generation is now asynchronous and timeout-bounded, which makes it safer to use inside CI even when local CPU inference is slow.
- Review commentary can now carry AI-generated advisory insights into MR summaries first and notification sinks second.

### Fixed

- Local `llama.cpp` execution is now pinned to the CPU backend where needed, avoiding the backend-selection failures that previously surfaced on macOS during smoke tests.
- Token sampling now uses the correct decoded position, preventing local inference runs from failing after prompt evaluation.

### Breaking Changes

- The release now formalizes a broader review-analysis runtime with new `llm` configuration surface area and snapshot semantics; for CI automation, that behavioral expansion is treated as a major-version change.

## [2.0.4] — 2026-03-31

This release fixes the follow-up release packaging changes from `v2.0.3`.

### Fixed

- The GitHub release workflow now downloads and uploads the slack-enabled artifacts it actually builds, and it again ships the companion flavor manifests alongside those binaries.
- The sample flavor manifests once again keep Slack notification blocks commented out by default, so they remain valid opt-in examples instead of enabling notification sinks accidentally.
- The sample Slack user mapping entries are again scoped under `[slack_app.user_map]` instead of leaking into the TOML root.

## [2.0.3] — 2026-03-31

This release refines connector packaging and makes notification sinks a clearer opt-in capability.

### Added

- Slack-enabled GitHub release artifacts for both supported review platforms: `mr-milchick-gitlab-slack-linux-x86_64-musl` and `mr-milchick-github-slack-linux-x86_64-musl`.

### Changed

- The default compiled feature set now builds the GitHub connector without Slack sinks; notification delivery is enabled only when those features are explicitly compiled in.
- Flavor manifests now use `[platform_connector]` to describe the compiled review platform and present Slack sink sections as optional examples.
- CI and docs now consistently refer to the action step as `refine`, matching the CLI command surface.
- Brand assets and release-facing documentation were refreshed to match the new connector packaging model.

## [2.0.2] — 2026-03-29

This release fixes the GitHub release workflow after the GitHub connector launch.

### Fixed

- The release job now passes `--repo "${GITHUB_REPOSITORY}"` to `gh release` commands, so publishing release assets no longer depends on a checked-out `.git` directory.
- The release workflow now also triggers on published GitHub Releases, covering the GitHub UI release path in addition to raw tag pushes.

## [2.0.0] — 2026-03-29

This release adds first-class GitHub pull request support and formalizes the connector-neutral runtime model.

### Added

- GitHub review connector with snapshot loading, reviewer assignment, summary comment upsert, and pagination-aware API access.
- GitHub Actions workflows for:
  - pull request `observe` execution
  - tag-based GitHub Releases that publish both GitLab and GitHub binaries
- GitHub-specific flavor example in `mr-milchick.github.toml`.
- Connector-specific release assets for:
  - `mr-milchick-gitlab-linux-x86_64-musl`
  - `mr-milchick-github-linux-x86_64-musl`

### Changed

- CI context loading is now review-platform aware and can read either GitLab CI or GitHub Actions metadata.
- Flavor templates now support both `[templates.gitlab]` and `[templates.github]`.
- Capability reporting now prints the actually compiled review connector instead of assuming GitLab.
- Documentation now describes both supported review connectors and the GitHub release workflow.

### Breaking Changes

- Public Rust context types were renamed to connector-neutral forms:
  - `ProjectId` -> `ProjectKey`
  - `MergeRequestRef` -> `ReviewContextRef`
  - `MergeRequestIid` -> `ReviewId`
- Public `CiContext` helpers were renamed from merge-request-specific names to review-neutral names.
- Summary rendering is now selected by review platform rather than a GitLab-only public function path.
- The default build now compiles the GitHub connector plus Slack sinks.

## [1.4.0] — 2026-03-28

This release adds connector-owned message templating and a much better local iteration loop for notification work.

### Added

- Connector message templates in `mr-milchick.toml` for:
  - GitLab summary comments
  - Slack app root and thread messages
  - Slack workflow title and thread messages
- Field-level template override validation with fallback to built-in defaults when a template field is invalid.
- Fixture-backed `observe`, `explain`, and `refine` runs for local scenario testing without a live merge request.
- Fixture-driven Slack delivery via `refine --fixture ... --send-notifications`.
- Explicit fixture notification variants:
  - `notification_variant = "first"`
  - `notification_variant = "update"`
- CLI override for fixture notification rendering with `--fixture-variant first|update`.
- Starter fixture scenarios for:
  - `fixtures/first-notification.toml`
  - `fixtures/update-notification.toml`
  - `fixtures/blocking-refine.toml`

### Changed

- Connector notification templates are now split into `first_*` and `update_*` fields instead of a single shared Slack message shape.
- Default Slack notification copy now uses a neutral `first` lifecycle framing instead of the older review-request-specific wording.
- Template placeholders were simplified:
  - added `notification_subject`
  - removed `notification_subject_action`
  - removed `notification_subject_suffix`
  - removed `mr_line`
- Documentation now includes full template examples, fixture-testing guidance, and starter config snippets based on the current built-in defaults.

## [1.1.0] — 2026-03-24

This release makes Slack app review notifications capable of pinging the right people directly.

### Added

- Slack app user mapping via `MR_MILCHICK_SLACK_USER_MAP`, using a JSON object keyed by GitLab username.
- Optional `[slack_app.user_map]` configuration in `mr-milchick.toml`.
- Repository TOML scaffolding for every username currently present in the checked-in `CODEOWNERS` file.

### Changed

- Slack app notifications now rewrite mapped GitLab-style mentions like `@principal.engineer` into Slack user mentions like `<@U01234567>` in both the compact channel message and the threaded follow-up.
- When both config sources are present, the environment-provided Slack user map takes precedence over the TOML mapping.
- Documentation and local testing examples now describe Slack user-ID based mentions instead of plain `@username` references.

## [1.0.0] — 2026-03-23

This release is the connector architecture reset.

Mr. Milchick is now organized as a workspace with a thin app crate, a platform-neutral core, a runtime wiring layer, and connector-owned integrations. It is the first release where the codebase reflects the intended long-term capability model: exactly one compiled review connector plus zero or more notification sinks.

### Added

- Cargo workspace layout with:
  - `apps/mr-milchick`
  - `crates/milchick-core`
  - `crates/milchick-runtime`
  - `crates/milchick-connectors`
- Neutral review domain model:
  - `ReviewSnapshot`
  - `ReviewAction`
  - `RenderedMessage`
  - `NotificationMessage`
- Runtime traits and wiring for:
  - `ReviewConnector`
  - `NotificationSink`
  - capability-aware execution flow
- GitLab review connector implementation behind the new connector boundary
- Slack sink split into:
  - `slack-app`
  - `slack-workflow`
- Connector-owned integration tests for GitLab and both Slack sink variants
- `mr-milchick.toml` flavor file for compiled review/sink intent

### Changed

- Core planning and analysis now operate on platform-neutral types instead of GitLab-specific snapshot structs.
- Summary generation now produces a neutral rendered message model before connector-specific formatting.
- CLI integration coverage was reduced to thin app-level smoke tests; connector behavior now lives in connector crate tests.
- Slack workflow notifications now use `MR_MILCHICK_SLACK_WEBHOOK_URL` and render a simplified plain-text thread body.
- Documentation now reflects the workspace layout, connector model, and sink split.

### Removed

- Legacy root single-crate source layout in favor of the workspace structure.

### Breaking Changes

- The published crate/binary version moves from `0.x` to `1.0.0`.
- Slack notification configuration is now connector-specific:
  - Slack app sink uses `MR_MILCHICK_SLACK_BOT_TOKEN`
  - Slack workflow sink uses `MR_MILCHICK_SLACK_WEBHOOK_URL`

## [0.4.0] — 2026-03-23

This release tightens the Slack review-request experience and aligns the binary versioning/docs with the new Slack app messaging shape.

### Changed

- Slack review notifications now use a more compact top-level channel message that links directly to `MR #iid` and names the MR author.
- The threaded Slack follow-up now renders as a strict three-line mrkdwn message with a bold opener and emphasized reviewer assignment line.
- README examples and Slack documentation now reflect the Slack app-oriented notification format.

### Added

- Release metadata for the Slack messaging refresh in the changelog and crate version.

## [0.3.1] — 2026-03-18

This release corrects reviewer assignment behavior in active monorepos and hardens the CLI integration harness.

### Fixed

- `refine` now preserves reviewers already assigned on the merge request and complements them with Milchick's recommendations instead of replacing them.
- Slack review-request follow-up now reflects the final merged reviewer set actually assigned on the merge request.
- The CLI integration mock server now tolerates transient nonblocking socket reads during full test runs, preventing spurious connection resets under `cargo test --all --locked`.

### Added

- Reviewer-merge coverage in both unit tests and CLI integration tests, including a case where an existing reviewer remains assigned after refinement.

## [0.3.0] — 2026-03-18

This release hardens day-to-day operability with better diagnostics, stronger integration confidence, and tighter project documentation.

### Added

- End-to-end CLI integration tests covering mode output, GitLab HTTP behavior, and idempotency across repeated `refine` runs.
- README guidance for running the integration harness locally.

### Changed

- Structured `tracing` spans and logs now cover snapshot fetch, reviewer planning, execution, and notification decisions.
- Contributor and user docs now consistently describe runtime configuration as environment-driven.
- Small dead-code cleanup to keep the codebase intentional as it grows.

## [0.2.0] — 2026-03-17

Configuration architecture has been intentionally broken and rebuilt around pipeline-provided environment variables.

This release removes the bundled `mr-milchick.toml` model and replaces it with runtime configuration sourced directly from CI.

### Changed

- Reviewer routing is now configured through `MR_MILCHICK_REVIEWERS` JSON instead of repository TOML.
- `MR_MILCHICK_MAX_REVIEWERS` now controls reviewer selection limits at runtime.
- CODEOWNERS integration is now controlled through `MR_MILCHICK_CODEOWNERS_ENABLED`, which defaults to `true`.
- CODEOWNERS path resolution now auto-discovers common file locations when `MR_MILCHICK_CODEOWNERS_PATH` is not set.

### Removed

- `mr-milchick.toml` as a runtime configuration source.
- Embedded default config fallback baked into the binary.
- TOML-based reviewer pool configuration.

### Migration Notes

- Pipelines must now provide reviewer capability data explicitly through environment variables.
- Teams upgrading from `0.1.0` should replace TOML reviewer pools with JSON entries shaped like `{"username":"alice","areas":["frontend","packages"]}`.
- If CODEOWNERS-based routing should be disabled, set `MR_MILCHICK_CODEOWNERS_ENABLED=false`.

## [0.1.0] — 2026-03-16

Initial public foundation of Mr Milchick, a deterministic merge-request governance steward designed to operate inside GitLab CI pipelines.

This release establishes the architectural baseline, execution model, and policy enforcement primitives.

### Added

#### Core CLI framework
- Initial CLI interface with commands:
  - `observe`
  - `refine`
  - `explain`
- Async runtime execution model
- Centralized application orchestration layer

#### CI context intelligence
- Structured parsing of GitLab CI environment variables
- Merge-request pipeline detection logic
- Context normalization for rule evaluation
- Graceful handling of missing CI metadata

#### Rule engine foundation
- Initial policy evaluation engine
- Finding severity classification (blocking vs informational)
- Branch policy validation primitives
- Deterministic rule evaluation pipeline

#### Tone system (deterministic communication engine)
- Tone categories:
  - Observation
  - Refinement
  - Resolution
  - Blocking
  - Praise (reserved for future behavioral activation)
- Deterministic tone selection seeded by MR identity
- Structured message registry
- Configurable tone mode architecture (future-ready)

#### GitLab snapshot intelligence
- Initial GitLab API integration layer
- Merge request snapshot model
- Changed file surface retrieval
- Snapshot-driven evaluation entry point

#### Path topology classification
- File path → engineering domain classification
- Support for shared / frontend / backend surface detection
- Aggregated area summary model for routing logic

#### Reviewer routing engine
- Deterministic reviewer recommendation logic
- Author exclusion safeguards
- Dominant area inference for reviewer selection
- Config-driven routing policy model
- Max reviewer enforcement

#### CODEOWNERS support
- CODEOWNERS file parsing and matching engine
- Per-file ownership resolution
- Aggregated ownership extraction
- Hybrid routing policy:
  - CODEOWNERS preferred
  - topology routing fallback

#### Action planning system
- Action planning abstraction separating evaluation from execution
- Initial action types:
  - Assigned reviewers
  - Post summary comment
  - Fail pipeline
- Deterministic planning flow

#### Execution strategy layer
- Strategy-driven execution model:
  - Dry-run executor
  - GitLab mutation executor
- Environment-controlled mutation safety
- Idempotent action execution principles

#### MR communication system
- Structured summary comment renderer
- Tone-aligned decision reporting
- Human-readable governance output

#### Ownership context refactor
- Introduction of:
  - `CodeownersContext`
  - `AppConfigContext`
- Single-pass CODEOWNERS parsing per run
- Planner-owned ownership decision logic
- Alignment between explain and refine decision paths

### Changed

- Reviewer routing now incorporates hybrid ownership + topology logic
- Summary comment planning behavior standardized
- Tone resolution alignment improved for final MR state reporting
- Internal architectural boundaries clarified between:
  - evaluation
  - planning
  - execution

### Fixed

- Inconsistent reviewer recommendation resolution when CODEOWNERS present
- Tone selection drift between execution modes
- Planner decision leakage into explain-only pathways
- Summary comment tone mismatches in non-blocking scenarios

### Architectural Guarantees Established

This release formalizes the following system invariants:

- Deterministic MR evaluation given identical inputs
- CI-native operation without persistent infrastructure
- Policy logic isolated from mutation logic
- Tone generation treated as first-class system concern
- Ownership intelligence treated as governance signal, not authority override

### Known Limitations

- Risk scoring engine not yet implemented
- Reviewer load balancing not yet supported
- Governance DSL not yet available
- Merge readiness modeling not yet introduced
- Policy configuration still code-driven
- Partial GitLab API coverage
- No persistent decision telemetry

### Project State

At this stage, Mr Milchick has transitioned from:

concept → executable governance engine

Future releases will focus on:

- risk modeling
- organizational topology awareness
- policy declarative configuration
- autonomous merge stewardship
