Skip to content

chore: sync dev with main (conflicts)#508

Merged
c-vigo merged 46 commits intodevfrom
chore/sync-main-to-dev-4-1
Apr 8, 2026
Merged

chore: sync dev with main (conflicts)#508
c-vigo merged 46 commits intodevfrom
chore/sync-main-to-dev-4-1

Conversation

@vig-os-release-app
Copy link
Copy Markdown
Contributor

Automated sync of main to dev found merge conflicts that require manual resolution.

How to resolve

git fetch origin chore/sync-main-to-dev-4-1:chore/sync-main-to-dev-4-1
git checkout chore/sync-main-to-dev-4-1
git merge origin/dev
# resolve conflicts
git commit -S
git push origin chore/sync-main-to-dev-4-1

Once pushed, this PR will update and become mergeable.

commit-action-bot Bot and others added 30 commits April 5, 2026 11:29
Strip empty Unreleased section from release branch.
Release date TBD (set during finalization).
## Description

The release finalize job used the Release App token for
`vig-os/commit-action`, but branch protection / rulesets treat that app
differently than the Commit App. The workflow now generates a dedicated
token from `COMMIT_APP_ID` / `COMMIT_APP_PRIVATE_KEY` (same pattern as
`prepare-release.yml`) and passes it to `commit-action` as `GH_TOKEN`.

## Type of Change

- [ ] `feat` -- New feature
- [x] `fix` -- Bug fix
- [ ] `docs` -- Documentation only
- [ ] `chore` -- Maintenance task (deps, config, etc.)
- [ ] `refactor` -- Code restructuring (no behavior change)
- [ ] `test` -- Adding or updating tests
- [ ] `ci` -- CI/CD pipeline changes
- [ ] `build` -- Build system or dependency changes
- [ ] `revert` -- Reverts a previous commit
- [ ] `style` -- Code style (formatting, whitespace)

### Modifiers

- [ ] Breaking change (`!`) -- This change breaks backward compatibility

## Changes Made

- `.github/workflows/release.yml` — Add `Generate Commit App Token` step
in the finalize job; wire `commit-action` `GH_TOKEN` to
`steps.commit-app-token.outputs.token` instead of the Release App token.
- `CHANGELOG.md` — Document the fix under Unreleased / Fixed.
- `assets/workspace/.devcontainer/CHANGELOG.md` — Same changelog entry
(mirrored).

## Changelog Entry

### Fixed

- **Release finalize commit blocked by Release protection ruleset**
([#487](#487))
- Generate a dedicated Commit App token (`COMMIT_APP_ID`) for the
`commit-action` step in the `finalize` job of `release.yml`, matching
the pattern used by `prepare-release.yml` and other workflows; the
previous Release App token lacked ruleset bypass

## Testing

- [ ] Tests pass locally (`just test`)
- [ ] Manual testing performed (describe below)

### Manual Testing Details

N/A — workflow-only change; verify on the next release run after merge.

## Checklist

- [x] My code follows the project's style guidelines
- [x] I have performed a self-review of my code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have updated the documentation accordingly (edit
`docs/templates/`, then run `just docs`)
- [x] I have updated `CHANGELOG.md` in the `[Unreleased]` section (and
pasted the entry above)
- [x] My changes generate no new warnings or errors
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [x] Any dependent changes have been merged and published

## Additional Notes

Ensure repository secrets `COMMIT_APP_ID` and `COMMIT_APP_PRIVATE_KEY`
are configured for the Commit App with the permissions needed to push to
`release/*` per your ruleset design.

Refs: #487
Bumps [@devcontainers/cli](https://github.com/devcontainers/cli) from 0.84.1 to 0.85.0.
- [Changelog](https://github.com/devcontainers/cli/blob/main/CHANGELOG.md)
- [Commits](devcontainers/cli@v0.84.1...v0.85.0)

---
updated-dependencies:
- dependency-name: "@devcontainers/cli"
  dependency-version: 0.85.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps the actions-minor-patch group with 1 update: [docker/login-action](https://github.com/docker/login-action).


Updates `docker/login-action` from 4.0.0 to 4.1.0
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](docker/login-action@b45d80f...4907a6d)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 4.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions-minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
## Summary

Cherry-picks dependency updates from open Dependabot PRs targeting `dev`
so `release/0.3.2` stays aligned.

## Changes

- **#488** — Bump `@devcontainers/cli` from `0.84.1` to `0.85.0`
(`package.json`, `package-lock.json`)
- **#489** — Bump `docker/login-action` from `4.0.0` to `4.1.0`
(`.github/workflows/release.yml`,
`.github/workflows/promote-release.yml`)

## Changelog

- Added Dependabot batch entry under `## [0.3.2] - TBD` → `### Changed`
in root and workspace `CHANGELOG.md`.

Refs: #488, #489
## Description

Removes the nightly `schedule` trigger from `.github/workflows/ci.yml`
and all schedule-only checkout `ref` overrides, as agreed in #492. PR
and `workflow_dispatch` behavior is unchanged. Updates
`security-scan.yml` header comments so they no longer reference the
removed 04:00 UTC CI run. Changelog for 0.3.2 is adjusted: drop the
unreleased “Nightly CI schedule” (#461) bullet from **Changed** and
document the removal under **Removed** (#492).

## Type of Change

- [ ] `feat` -- New feature
- [ ] `fix` -- Bug fix
- [ ] `docs` -- Documentation only
- [x] `chore` -- Maintenance task (deps, config, etc.)
- [ ] `refactor` -- Code restructuring (no behavior change)
- [ ] `test` -- Adding or updating tests
- [x] `ci` -- CI/CD pipeline changes
- [ ] `build` -- Build system or dependency changes
- [ ] `revert` -- Reverts a previous commit
- [ ] `style` -- Code style (formatting, whitespace)

### Modifiers

- [ ] Breaking change (`!`) -- This change breaks backward compatibility

## Changes Made

- **`.github/workflows/ci.yml`** — Remove `schedule` (`cron: '0 4 * *
*'`); remove nightly trigger from file header; drop `with: ref: ${{
github.event_name == 'schedule' && 'dev' || github.ref }}` from all
checkout steps (default ref for PR/dispatch).
- **`.github/workflows/security-scan.yml`** — Header: describe PR-based
full CI + Trivy; remove “after nightly CI at 04:00 UTC”; keep nightly
05:00 UTC scan behavior unchanged.
- **`CHANGELOG.md`** / **`assets/workspace/.devcontainer/CHANGELOG.md`**
— Remove **Nightly CI schedule** (#461) from **Changed**; add **Nightly
full CI schedule from `ci.yml`** (#492) under **Removed** with
sub-bullets.

## Changelog Entry

Release section `## [0.3.2] - TBD` (this branch targets `release/0.3.2`,
not `## Unreleased`):

### Removed

- **Nightly full CI schedule from `ci.yml`**
([#492](#492))
- Remove the `schedule` trigger and schedule-only checkout overrides; CI
remains on pull requests and `workflow_dispatch` only
  - Nightly GHCR `:latest` scan in `security-scan.yml` is unchanged

### Changed (edit relative to prior 0.3.2 draft)

- Removed the **Nightly CI schedule**
([#461](#461)) bullet from
**Changed** so the release notes no longer claim a nightly full CI run.

## Testing

- [ ] Tests pass locally (`just test`)
- [ ] Manual testing performed (describe below)

### Manual Testing Details

N/A — workflow YAML and changelog only; validation via CI on this PR.

## Checklist

- [x] My code follows the project's style guidelines
- [x] I have performed a self-review of my code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have updated the documentation accordingly (edit
`docs/templates/`, then run `just docs`)
- [x] I have updated `CHANGELOG.md` in the `[0.3.2] - TBD` section (and
pasted the entry above)
- [x] My changes generate no new warnings or errors
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [x] Any dependent changes have been merged and published

## Additional Notes

N/A

Refs: #492
Set release date to 2026-04-07 and regenerate release docs.

Refs: #486
## Summary
Reverts the corrupted finalize + sync commits, fixes finalize job so
`just` is installed before `docs/generate.py`, and makes
`get_just_help()` exit non-zero on failure.

## Remote cleanup (done)

**vig-os/devcontainer**
- Draft GitHub Release `0.3.2` deleted
- Git tag `0.3.2` deleted
- GHCR final images `0.3.2`, `0.3.2-arm64`, `0.3.2-amd64` deleted (RC
tags kept)

**vig-os/devcontainer-smoke-test** (so re-dispatch does not fail on tag
SHA mismatch in downstream `release-core.yml`)
- Draft GitHub Release `0.3.2` deleted
- Git tag `0.3.2` deleted
- Kept: `0.3.2-rc1` tag and draft pre-release; merged deploy/release PRs
are historical only

## After merge
Run `just finalize-release 0.3.2` to complete the release.

Refs: #494
## Description

`prepare-changelog finalize` now writes version headings with a markdown
link to the GitHub release tag
(`https://github.com/owner/repo/releases/tag/X.Y.Z`). The repository
slug is taken from `GITHUB_REPOSITORY` (as in GitHub Actions) or from a
new `--github-repository` CLI flag. `unprepare` accepts linked `##
[semver](url) - …` headings so release rollback still works.

## Type of Change

- [x] `feat` -- New feature
- [ ] `fix` -- Bug fix
- [ ] `docs` -- Documentation only
- [ ] `chore` -- Maintenance task (deps, config, etc.)
- [ ] `refactor` -- Code restructuring (no behavior change)
- [ ] `test` -- Adding or updating tests
- [ ] `ci` -- CI/CD pipeline changes
- [ ] `build` -- Build system or dependency changes
- [ ] `revert` -- Reverts a previous commit
- [ ] `style` -- Code style (formatting, whitespace)

### Modifiers

- [ ] Breaking change (`!`) -- This change breaks backward compatibility

## Changes Made

- **`packages/vig-utils/src/vig_utils/prepare_changelog.py`**
- Add `_validate_github_repository_slug` and
`_resolve_github_repository`; `finalize_release_date` accepts optional
`github_repository` and emits linked headings; `unprepare_changelog`
regex allows optional `(url)` after the version; `finalize` subcommand
adds `--github-repository`; help text updated.
- **`packages/vig-utils/tests/test_prepare_changelog.py`**
- Coverage for linked headings, env vs flag slug, validation errors, and
subprocess/CLI behavior.
- **`docs/RELEASE_CYCLE.md`**, **`packages/vig-utils/README.md`**
- Document `finalize` signature, `GITHUB_REPOSITORY`, and
`--github-repository` example.
- **`CHANGELOG.md`**, **`assets/workspace/.devcontainer/CHANGELOG.md`**
  - Unreleased entry for #496.

**Commits (vs `release/0.3.2`):** `test: …`, `feat(vigutils): …`, `docs:
…` (Refs: #496).

## Changelog Entry

### Changed

- **prepare-changelog finalize adds GitHub release link to version
headings** ([#496](#496))
- `finalize_release_date` writes `##
[X.Y.Z](https://github.com/owner/repo/releases/tag/X.Y.Z) - date`;
repository slug comes from `GITHUB_REPOSITORY` (set in Actions) or from
`prepare-changelog finalize ... --github-repository owner/repo`
  - `unprepare` recognizes linked `## [semver](url) - …` headings

## Testing

- [ ] Tests pass locally (`just test`)
- [ ] Manual testing performed (describe below)

Full `just test` was not run. **vig-utils only:** `uv run pytest
packages/vig-utils/tests/test_prepare_changelog.py` — 121 passed.

### Manual Testing Details

N/A (CLI and library behavior covered by unit and subprocess tests in
`packages/vig-utils/tests/test_prepare_changelog.py`).

## Checklist

- [x] My code follows the project's style guidelines
- [ ] I have performed a self-review of my code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [x] I have updated the documentation accordingly (edit
`docs/templates/`, then run `just docs`)
- [x] I have updated `CHANGELOG.md` in the `[Unreleased]` section (and
pasted the entry above)
- [x] My changes generate no new warnings or errors
- [x] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published

## Additional Notes

N/A

Refs: #496
Set release date to 2026-04-07 and regenerate release docs.

Refs: #486
The `if "$@"; then return 0; fi; rc=$?` pattern always set rc=0 because bash's `if` compound command exits 0 when the condition fails and there is no `else` clause. Replace with `"$@" && return 0`.

Refs: #500
Branch protection rulesets reject force-push on release/* branches, causing silent rollback failures. Create a revert commit via the Git Data API (fast-forward update) instead.

Refs: #500
Reverts 10e2ff3 ("chore: finalize release 0.3.2"), the orphaned finalize commit left on release/0.3.2 by the broken rollback (#499). The release workflow will re-finalize when re-run.

Refs: #500
c-vigo and others added 15 commits April 7, 2026 23:20
## Description

Fixes [#500](#500): the CI
`retry` helper now returns the failed command’s non-zero exit status
after exhausting retries (so jobs fail correctly). Release workflow
rollback no longer force-pushes; it creates a revert commit via the Git
API so it works with branch protection on `release/*`. Includes BATS
coverage for `retry` exit-code behavior. The branch also contains
`revert: undo finalize release 0.3.2` so the release line can be
corrected before re-finalizing.

## Type of Change

- [x] `fix` -- Bug fix
- [ ] `feat` -- New feature
- [ ] `docs` -- Documentation only
- [ ] `chore` -- Maintenance task (deps, config, etc.)
- [ ] `refactor` -- Code restructuring (no behavior change)
- [ ] `test` -- Adding or updating tests
- [ ] `ci` -- CI/CD pipeline changes
- [ ] `build` -- Build system or dependency changes
- [ ] `revert` -- Reverts a previous commit
- [ ] `style` -- Code style (formatting, whitespace)

### Modifiers

- [ ] Breaking change (`!`) -- This change breaks backward compatibility

## Changes Made

- `.github/actions/setup-env/action.yml` — `retry` propagates the last
non-zero exit code when all attempts fail.
- `.github/workflows/release.yml` — Rollback uses a GitHub API revert
commit instead of force-push; aligns with protected `release/*`
branches.
- `.github/workflows/sync-main-to-dev.yml` — Inline `retry` helper
matches `setup-env`: run `"$@" && return 0` so the command’s exit code
is observed (same pattern as the fixed `retry` in `setup-env`).
- `CHANGELOG.md` — `## Unreleased` / **Fixed** entry for
[#500](#500).
- `assets/workspace/.devcontainer/CHANGELOG.md` — Same entry mirrored
for the workspace template changelog.
- `README.md` — “Latest Version” rolled back to 0.3.1 with the revert of
finalize 0.3.2 (will move forward again when the release is
re-finalized).
- `tests/bats/fixtures/retry_helper.bash` — Fixture shell `retry`
matching CI behavior for tests.
- `tests/bats/retry.bats` — BATS tests asserting exit-code propagation
from `retry`.

**Commits (vs `origin/release/0.3.2`):** `57789cc` test: BATS for retry
exit codes; `fcad7ef` fix(ci): propagate retry exit code; `4c7a4a4`
fix(ci): revert-commit rollback; `e033833` revert: undo finalize release
0.3.2; `e307f57` docs: changelog for retry and rollback fixes.

## Changelog Entry

```markdown
## Unreleased

### Fixed

- **Release rollback and CI `retry` exit codes** ([#500](#500))
  - `retry` shell helper now propagates the command's non-zero exit code when all attempts fail
  - Release rollback creates a fast-forward revert commit via the Git API instead of force-pushing, compatible with branch protection on `release/*`
```

(Same **Fixed** block appears under `## Unreleased` in
`assets/workspace/.devcontainer/CHANGELOG.md`.)

## Testing

- [ ] Tests pass locally (`just test`)
- [ ] Manual testing performed (describe below)

### Manual Testing Details

N/A — workflow and shell-helper behavior; rely on CI and BATS. Re-run
`just test` locally before merge if the full suite was not green in your
environment.

## Checklist

- [x] My code follows the project's style guidelines
- [x] I have performed a self-review of my code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have updated the documentation accordingly (edit
`docs/templates/`, then run `just docs`)
- [x] I have updated `CHANGELOG.md` in the `[Unreleased]` section (and
pasted the entry above)
- [x] My changes generate no new warnings or errors
- [x] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published

## Additional Notes

- **Base branch:** `release/0.3.2` (hotfix PR), not `dev`. Remote
`release/0.3.2` may already show a dated `## [0.3.2](…)` heading; this
branch includes a revert of finalize so the corrected changelog and
workflows can land before a new finalize.
- **Changelog convention:** On `release/*`, some teams fold fixes into
`## [0.3.2] - TBD` instead of `## Unreleased`. Confirm with release
owners whether to move the
[#500](#500) bullets under
the version section before merge.

Refs: #500
## Description

When finalize fails and the release workflow rolls back the release
branch, the release PR description could be left out of sync. This
change extends the `rollback` job in `release.yml` so that, for final
releases, it restores the PR body from the pre-finalization
`CHANGELOG.md` (TBD / prepare-release format) using `RELEASE_APP`, and
surfaces the outcome in the failure issue and job summary.

## Type of Change

- [ ] `feat` -- New feature
- [x] `fix` -- Bug fix
- [ ] `docs` -- Documentation only
- [ ] `chore` -- Maintenance task (deps, config, etc.)
- [ ] `refactor` -- Code restructuring (no behavior change)
- [ ] `test` -- Adding or updating tests
- [ ] `ci` -- CI/CD pipeline changes
- [ ] `build` -- Build system or dependency changes
- [ ] `revert` -- Reverts a previous commit
- [ ] `style` -- Code style (formatting, whitespace)

### Modifiers

- [ ] Breaking change (`!`) -- This change breaks backward compatibility

## Changes Made

- `.github/workflows/release.yml`
- Add rollback step(s) to restore release PR body after branch rollback
when `release_kind` is final, using changelog-derived description and
`RELEASE_APP`.
- `CHANGELOG.md` / `assets/workspace/.devcontainer/CHANGELOG.md`
  - Document the fix under `## [0.3.2] - TBD` → Fixed.

## Changelog Entry

```diff
@@ -91,6 +91,8 @@
   - Release rollback creates a fast-forward revert commit via the Git API instead of force-pushing, compatible with branch protection on `release/*`
   - Rollback Git Data API steps authenticate with the Commit app token (same as finalize) so protected `release/*` ref updates are not blocked
   - Canonical `retry()` implementation lives in `.github/scripts/retry.sh`; `setup-env` and BATS source it so CI and tests stay aligned (`sync-main-to-dev.yml` keeps an inline copy documented as in sync)
+- **Release rollback restores release PR body after finalize** ([#502](#502))
+  - `rollback` job in `release.yml` restores the PR description from pre-finalization `CHANGELOG.md` (TBD / prepare-release format) using RELEASE_APP when `release_kind` is final, after branch rollback; failure issue and job summary report the step outcome
 
 ### Security
```

## Testing

- [ ] Tests pass locally (`just test`)
- [ ] Manual testing performed (describe below)

### Manual Testing Details

N/A (CI workflow change; tests not run for this submission.)

## Checklist

- [x] My code follows the project's style guidelines
- [x] I have performed a self-review of my code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have updated the documentation accordingly (edit
`docs/templates/`, then run `just docs`)
- [x] I have updated `CHANGELOG.md` under `## [0.3.2] - TBD` (and pasted
the entry above)
- [x] My changes generate no new warnings or errors
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published

## Additional Notes

N/A

Refs: #502
Set release date to 2026-04-08 and regenerate release docs.

Refs: #486
## Description

Fix release notes extraction in the `publish` job of `release.yml`.
After #496 added GitHub release links to finalized changelog headings,
the `awk` command that extracts version-specific notes stopped matching
because it expected `## [X.Y.Z] - date` but got `## [X.Y.Z](url) -
date`. This changes the match to use the `## [VERSION]` prefix only.

## Type of Change

- [ ] `feat` -- New feature
- [x] `fix` -- Bug fix
- [ ] `docs` -- Documentation only
- [ ] `chore` -- Maintenance task (deps, config, etc.)
- [ ] `refactor` -- Code restructuring (no behavior change)
- [ ] `test` -- Adding or updating tests
- [ ] `ci` -- CI/CD pipeline changes
- [ ] `build` -- Build system or dependency changes
- [ ] `revert` -- Reverts a previous commit
- [ ] `style` -- Code style (formatting, whitespace)

### Modifiers

- [ ] Breaking change (`!`) -- This change breaks backward compatibility

## Changes Made

- **`.github/workflows/release.yml`** -- Changed the `awk` command in
the publish job to match on `## [VERSION]` prefix instead of `##
[VERSION] - `, so that linked headings (`## [X.Y.Z](url) - date`) are
correctly matched for GitHub Release notes extraction.
- **`CHANGELOG.md`** / **`assets/workspace/.devcontainer/CHANGELOG.md`**
-- Added changelog entry under Fixed for #504.

## Changelog Entry

### Fixed

- **Final release notes extraction after linked changelog headings**
([#504](#504))
- Publish job `awk` matches `## [VERSION]` prefix so finalized `##
[X.Y.Z](url) - date` headings produce GitHub Release notes (regression
after prepare-changelog linked headings in #496)

## Testing

- [ ] Tests pass locally (`just test`)
- [ ] Manual testing performed (describe below)

### Manual Testing Details

N/A

## Checklist

- [x] My code follows the project's style guidelines
- [x] I have performed a self-review of my code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have updated the documentation accordingly (edit
`docs/templates/`, then run `just docs`)
- [x] I have updated `CHANGELOG.md` in the `[Unreleased]` section (and
pasted the entry above)
- [x] My changes generate no new warnings or errors
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published

## Additional Notes

N/A

Refs: #504
Set release date to 2026-04-08 and regenerate release docs.

Refs: #486
# [Release
0.3.2](https://github.com/vig-os/devcontainer/releases/tag/0.3.2) -
2026-04-08

This PR prepares release 0.3.2 for merge to main.

## [0.3.2](https://github.com/vig-os/devcontainer/releases/tag/0.3.2) -
2026-04-08

### Added

- **Downstream `promote-release.yml` workspace template**
([#463](#463))
- Add `assets/workspace/.github/workflows/promote-release.yml` as the
counter-party to root `promote-release.yml`: validate draft release and
release PR, publish the release, merge to `main`, best-effort git RC tag
cleanup (no GHCR/cosign/smoke-test gate)
- Document in `docs/DOWNSTREAM_RELEASE.md` and align
`docs/RELEASE_CYCLE.md` Phase 5 for consumer vs upstream paths
- **Optional draft pre-release for downstream release candidates**
([#463](#463))
- Workspace `release.yml` adds `create-release` (`workflow_dispatch`,
default `false`); `release-publish.yml` creates a draft GitHub
pre-release only when set for `candidate` runs
- Smoke-test `repository-dispatch.yml` passes `create-release=true` when
triggering downstream `release.yml`
- `just publish-candidate` forwards `create-release` in `justfile.gh`
and the workspace template copy

### Changed

- **RELEASE_APP permissions and GHCR cleanup token model**
([#463](#463))
- Document Packages read/write on the org for `promote-release` cleanup,
align the app table in `docs/RELEASE_CYCLE.md`, and explain why cleanup
uses the GitHub App token instead of `GITHUB_TOKEN`
- **Promote-release cleans up stale RC artifacts after merge**
([#463](#463))
- Best-effort job deletes GHCR package versions for `${VERSION}-rc*` and
`sha256-*`-only orphans, and deletes remote git RC tags for that base
version when no GitHub Release exists; does not fail the workflow on
error
- **Downstream release helper recipes via GitHub justfile import**
([#373](#373))
- Move `prepare-release`, `finalize-release`, `publish-candidate`, and
`reset-changelog` into `justfile.gh` so downstream workspace templates
expose these release helpers by default
- Keep root recipe availability (including `pull`) through `import
'justfile.gh'` while consolidating release helper ownership in the
GitHub-focused recipe file; the workspace template copy omits the `pull`
recipe
- **Split final release into publish and promote phases**
([#456](#456))
- Final `release.yml` publishes versioned GHCR tags and a draft GitHub
Release but no longer updates `:latest`
- New `promote-release.yml` runs after downstream smoke-test publishes
its final release: updates `:latest`, publishes the draft release,
merges the release PR to `main`
- Add `just promote-release` in `justfile.gh` (and workspace template
copy)
- **Smoke-test dispatch fails fast when deploy PR checks fail**
([#381](#381))
- `wait-deploy-merge` in
`assets/smoke-test/.github/workflows/repository-dispatch.yml` exits as
soon as all required checks have completed with failures instead of
waiting for the merge poll timeout (`gh pr checks --required`)
- **Scheduled security scan pulls GHCR `:latest` instead of rebuilding**
([#461](#461))
- Runs nightly at 05:00 UTC, pulls the published image, gates on fixable
HIGH/CRITICAL vulnerabilities, auto-creates a deduplicated GitHub issue
on failure, and uploads SARIF under `container-image-latest`
- **Dependabot dependency update batch**
([#474](#474))
  - Bump `github/codeql-action` from `4.34.1` to `4.35.1`
  - Bump `sigstore/cosign-installer` from `4.1.0` to `4.1.1`
- **Dependabot dependency update batch**
([#488](#488),
[#489](#489))
  - Bump `@devcontainers/cli` from `0.84.1` to `0.85.0`
  - Bump `docker/login-action` from `4.0.0` to `4.1.0`
- **Simplify `just pull` in `justfile.gh`**
([#482](#482))
- Pull `ghcr.io/vig-os/devcontainer` by tag; drop redundant shell
fallback, per-recipe `repo` argument, and unused `REGISTRY_TEST` TLS
path (imported `justfile.gh` cannot reference root `repo`)
- **prepare-changelog finalize adds GitHub release link to version
headings** ([#496](#496))
- `finalize_release_date` writes `##
[X.Y.Z](https://github.com/owner/repo/releases/tag/X.Y.Z) - date`;
repository slug comes from `GITHUB_REPOSITORY` (set in Actions) or from
`prepare-changelog finalize ... --github-repository owner/repo`
  - `unprepare` recognizes linked `## [semver](url) - …` headings

### Removed

- **One-time GHCR/git RC prune script**
([#463](#463))
- Remove `scripts/prune-ghcr-tags.sh`; RC and `sha256-*` orphan cleanup
remains in root `promote-release.yml`
- **Downstream RC pre-release gate from release validate job**
([#463](#463))
- Removed dead `if: false` steps from `release.yml`; downstream final
release is verified only in `promote-release.yml` before promote
- **Nightly full CI schedule from `ci.yml`**
([#492](#492))
- Remove the `schedule` trigger and schedule-only checkout overrides; CI
remains on pull requests and `workflow_dispatch` only
  - Nightly GHCR `:latest` scan in `security-scan.yml` is unchanged

### Fixed

- **Prepare-release changelog commits silently skipped due to FILE_PATHS
delimiter mismatch**
([#483](#483))
- Change `FILE_PATHS` from space-separated to comma-separated in all
`commit-action` steps of `prepare-release.yml` so the action correctly
commits both `CHANGELOG.md` and
`assets/workspace/.devcontainer/CHANGELOG.md`
- Join finalization changed files with commas in `release.yml` (`Collect
finalization files`) so `commit-action` receives multiple paths
correctly
- **`publish-candidate` recipe sends unknown `create-release` input**
([#479](#479))
- Remove `create-release` parameter and `-f` flag from upstream
`justfile.gh`; the input was added to the downstream workflow only but
the recipe was updated in both places
- **Image tests expect current `just` minor**
([#479](#479))
- Align `EXPECTED_VERSIONS["just"]` with the latest `just` release
installed by the Containerfile (1.49.x)
- **Git commit now falls back to nano when editor config is unusable**
([#383](#383))
- `setup-git-conf.sh` now validates the effective Git editor and sets
`core.editor=nano` only when the configured editor is missing or invalid
in-container
- Add integration regression coverage to ensure invalid editor settings
are corrected during setup
- **Release finalize no longer races sync-issues; CHANGELOG TBD verified
after reset**
([#455](#455))
- Run `sync-issues` after capturing finalize SHA so downstream
build/publish use the finalized commit
- Fail finalize if `CHANGELOG.md` still contains `## [version] - TBD`
after `git reset --hard`
- **generate-docs pre-commit runs when CHANGELOG.md changes**
([#455](#455))
- Keeps README “Latest Version” and other generated docs aligned with
the changelog
- **prepare-release tolerates GitHub API ref propagation and reliable
CHANGELOG rollback**
([#453](#453))
- Poll until the new release branch ref resolves before `commit-action`
commits to it
- Fetch dev `CHANGELOG.md` by resolved commit SHA during rollback so
Contents API staleness does not skip the rollback commit
- **sync-main-to-dev sync job no longer depends on dev's setup-env**
([#459](#459))
- Inline the same `retry` shell helper used by `setup-env` so the job
works when `main`'s workflow expects helpers not yet on `dev`
- **CI container build avoids shared-runner Docker Hub rate limits**
([#473](#473))
- `build-image` logs in to `docker.io` before `setup-buildx-action` when
`DOCKERHUB_USERNAME` and `DOCKERHUB_TOKEN` secrets are set; `ci.yml` and
`release.yml` pass them
  - Omitting secrets (e.g. forks) keeps prior anonymous-pull behavior
- **Release finalize commit blocked by Release protection ruleset**
([#487](#487))
- Generate a dedicated Commit App token (`COMMIT_APP_ID`) for the
`commit-action` step in the `finalize` job of `release.yml`, matching
the pattern used by `prepare-release.yml` and other workflows; the
previous Release App token lacked ruleset bypass
- **Release finalize installs just for doc generation**
([#494](#494))
- Remove `install-just: 'false'` from the finalize job `setup-env` step
so `docs/generate.py` can run `just --list`
- `get_just_help()` exits non-zero on failure instead of writing
placeholder content into generated docs
- **Release rollback and CI `retry` exit codes**
([#500](#500))
- `retry` shell helper now propagates the command's non-zero exit code
when all attempts fail
- Release rollback creates a fast-forward revert commit via the Git API
instead of force-pushing, compatible with branch protection on
`release/*`
- Rollback Git Data API steps authenticate with the Commit app token
(same as finalize) so protected `release/*` ref updates are not blocked
- Canonical `retry()` implementation lives in
`.github/scripts/retry.sh`; `setup-env` and BATS source it so CI and
tests stay aligned (`sync-main-to-dev.yml` keeps an inline copy
documented as in sync)
- **Release rollback restores release PR body after finalize**
([#502](#502))
- `rollback` job in `release.yml` restores the PR description from
pre-finalization `CHANGELOG.md` (TBD / prepare-release format) using
RELEASE_APP when `release_kind` is final, after branch rollback; failure
issue and job summary report the step outcome
- **Final release notes extraction after linked changelog headings**
([#504](#504))
- Publish job `awk` matches `## [VERSION]` prefix so finalized `##
[X.Y.Z](url) - date` headings produce GitHub Release notes (regression
after prepare-changelog linked headings in #496)

### Security

- **Nightly vulnerability gate for published container image**
([#461](#461))
- Scheduled security scan now fails on fixable HIGH/CRITICAL CVEs and
auto-files a GitHub issue, replacing the previous non-blocking weekly
scan
@vig-os-release-app vig-os-release-app Bot requested a review from c-vigo as a code owner April 8, 2026 13:51
@c-vigo c-vigo self-assigned this Apr 8, 2026
…-to-dev-4-1

Add Unreleased sectoin to CHANGELOG
@c-vigo c-vigo enabled auto-merge April 8, 2026 14:49
@c-vigo c-vigo merged commit c8498da into dev Apr 8, 2026
23 of 27 checks passed
@c-vigo c-vigo deleted the chore/sync-main-to-dev-4-1 branch April 8, 2026 17:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant