Release ledger

Release

v3.3.1

signpost

A hotfix from first customer feedback: failure issues link the CI job that raised them and drop the boilerplate footer, and runs with couplings now leave a per-registry drift audit for diagnosing out-of-sync mirrors.

Highlights

  • 01

    The issue names its run

    The context table links the CI job that raised the failure (from CI_JOB_URL), so the full log, the artifacts and the retry button are one click from the issue — which matters for an issue that is rewritten in place across runs. Local runs, which have no job, omit the row.

  • 02

    Diagnostics, not boilerplate

    The closing paragraph restating the feature's own lifecycle contract is gone from every issue. That contract is documentation and the docs carry it; the issue body now ends with the logs and the scan report, and the regression asserts the footer's absence so it cannot quietly return.

Full notes

Added

  • Registry drift audit: runs with couplings write <out>/registry-audit/<groupId>__<artifactId>.json per coupling dependency — per-registry version listings with foundIn/missingFrom and an inSync/behind verdict, registries named as in config.yml. Always on; unreachable registries are recorded with their error.
  • Regression evidence: mock GitLab state is persisted per case (mock-state.json); five stdout-only cases gained artifact-backed assertions; the Go-test wrapper jobs preserve the Maven projects they build for artifact review.

Fixed

  • Failure issues carry a 'CI job' row linking the raising job when CI_JOB_URL is set; local runs omit the row.
  • Failure issues no longer append the lifecycle-contract footer; reg-092 now asserts its absence.