Added
- Split downstream release workflow with project-owned extension hook (#326)
- Add local
workflow_callrelease phases (release-core.yml,release-publish.yml) and a lightweightrelease.ymlorchestrator inassets/workspace/.github/workflows/ - Add
release_kindsupport with candidate mode (X.Y.Z-rcN) and final mode (X.Y.Z) in downstream release workflows - Candidate mode now auto-computes the next RC tag, skips CHANGELOG finalization/sync-issues, and publishes a GitHub pre-release
- Add project-owned
release-extension.ymlstub and preserve it duringinit-workspace.sh --forceupgrades - Add
validate-contractcomposite action for single-source contract version validation - Add downstream release contract documentation and GHCR extension example in
docs/DOWNSTREAM_RELEASE.md
- Add local
jqin devcontainer image (#425)- Install the
jqCLI in the GHCR image so containerized workflows (e.g.release-corevalidate / downstream Release Core) can pipe JSON throughjq
- Install the
Changed
- Dependabot dependency update batch (#302, #303, #305, #306, #307, #308, #309)
- Bump
@devcontainers/clifrom0.81.1to0.84.0andbats-assertfromv2.2.0tov2.2.4 - Bump GitHub Actions:
actions/download-artifact(4.3.0->8.0.1),actions/github-script(7.1.0->8.0.0),actions/attest-build-provenance(3.0.0->4.1.0),actions/checkout(4.3.1->6.0.2) - Bump release workflow action pins:
sigstore/cosign-installer(4.0.0->4.1.0) andanchore/sbom-action(0.22.2->0.23.1)
- Bump
- Dependabot dependency update batch (#314, #315, #316, #317)
- Bump GitHub Actions:
actions/attest-sbom(3.0.0->4.0.0),actions/upload-artifact(4.6.2->7.0.0),actions/create-github-app-token(2.2.1->3.0.0) - Bump
docker/login-actionfrom3.7.0to4.0.0 - Bump
justminor version from1.46to1.47
- Bump GitHub Actions:
- Node24-ready GitHub Actions pin refresh for shared composite actions (#321)
- Update Docker build path pins in
build-image(docker/setup-buildx-action,docker/metadata-action,docker/build-push-action) to Node24-compatible releases - Set
setup-envdefault Node runtime to24and upgradeactions/setup-node - Align test composite actions with newer pins (
actions/checkout,actions/cache,actions/upload-artifact)
- Update Docker build path pins in
- Smoke-test dispatch payload now carries source run traceability metadata (#289)
- Candidate release dispatches now include source repo/workflow/run/SHA metadata plus a deterministic
correlation_id - Smoke-test dispatch receiver logs normalized source context, derives source run URL when possible, and writes it to workflow summary output
- Release-cycle docs now define required vs optional dispatch payload keys and the future callback contract path for
publish-candidate
- Candidate release dispatches now include source repo/workflow/run/SHA metadata plus a deterministic
- Smoke-test repository dispatch now runs for final releases too (#173)
release.ymlnow triggers the existing smoke-test dispatch contract for bothcandidateandfinalrelease kinds- Final release summaries and release-cycle documentation now reflect dispatch behavior for both release modes
- Workspace CI templates now use a single container-based workflow (#327)
- Consolidate
assets/workspace/.github/workflows/ci.ymlas the canonical CI workflow and remove the obsoleteci-container.ymltemplate - Extract reusable
assets/workspace/.github/actions/resolve-imageand run workspace release tests in the same containerized workflow model - Update smoke-test and release-cycle documentation to reference the single CI workflow contract
- Consolidate
- Final release now requires downstream RC pre-release gate (#331)
- Add upstream final-release validation that requires a downstream GitHub pre-release for the latest published RC tag
- Move smoke-test dispatch to a dedicated release job and include
release_kindin the dispatch payload - Add downstream
repository-dispatch.ymltemplate that runs smoke tests and creates pre-release/final release artifacts
- Ship changelog into workspace payload and smoke-test deploy root (#333)
- Sync canonical
CHANGELOG.mdinto both workspace root and.devcontainer/template paths - Smoke-test dispatch now copies
.devcontainer/CHANGELOG.mdto repository root so deploy output keeps a root changelog
- Sync canonical
- Final release now publishes a GitHub Release with finalized notes (#310)
- Add a final-only publish step in
.github/workflows/release.ymlthat creates a GitHub Release forX.Y.Z - Source GitHub Release notes from the finalized
CHANGELOG.mdsection and fail the run if notes extraction or release publishing fails
- Add a final-only publish step in
- Release dispatch and publish ordering hardened for 0.3.1 (#336)
- Make smoke-test dispatch fire-and-forget in
.github/workflows/release.ymland decouple rollback from downstream completion timing - Add bounded retries to the final-release downstream RC pre-release gate API check
- Move final GitHub Release creation to the end of publish so artifact publication/signing completes before release object creation
- Add concurrency control to
assets/smoke-test/.github/workflows/repository-dispatch.ymlto prevent overlapping dispatch races - Handle smoke-test dispatch failures with a targeted issue while avoiding destructive rollback after publish artifacts are already released
- Make smoke-test dispatch fire-and-forget in
- Redesigned smoke-test dispatch release orchestration (#358)
- Replace premature
publish-releasebehavior with full downstream orchestration: deploy-to-dev merge gate,prepare-release.yml, release PR readiness/approval, andrelease.ymldispatch polling - Add upstream failure issue reporting with job-phase results and cleanup guidance when dispatch orchestration fails
- Replace premature
- Smoke-test release orchestration now runs as two phases (#402)
- Keep
repository-dispatch.ymlfocused on deploy/prepare/release-PR readiness and move release dispatch to a dedicated merged-PR workflow (on-release-pr-merge.yml) - Add release-kind labeling and auto-merge enablement for release PRs, and keep upstream failure notifications in both phases
- Remove release-branch upstream
CHANGELOG.mdsync fromrepository-dispatch.yml(previously added in #358)
- Keep
- Dependabot dependency update batch (#414)
- Bump
github/codeql-actionfrom4.32.6to4.34.1andanchore/sbom-actionfrom0.23.1to0.24.0 - Bump
actions/cacherestore/save pins from5.0.3to5.0.4insync-issues.yml
- Bump
- Dependabot dependency update batch (#413)
- Bump
@devcontainers/clifrom0.84.0to0.84.1
- Bump
- cursor-agent install is now resilient to CDN failures (#434)
- Retries 3 times with backoff before giving up
- Build succeeds without cursor-agent when Cursor's CDN is unavailable
- Immutable GitHub releases, tag rulesets, and forward-fix policy (#446)
- Final releases create a draft GitHub Release for human review before publishing; rollback no longer deletes remote tags
- Release workflows skip redundant tag push when the tag already matches the finalized commit; workspace
release-core/release-publishand smoke-test failure guidance updated accordingly - Document tag rulesets, immutable releases, and recovery in
docs/RELEASE_CYCLE.md,docs/DOWNSTREAM_RELEASE.md, anddocs/CROSS_REPO_RELEASE_GATE.md
- Container image tests expect current GitHub CLI minor line
- Update
tests/test_image.pyEXPECTED_VERSIONS["gh"]to2.89.to match the CLI shipped in the image
- Update
Removed
- PR Title Check GitHub Actions workflow (#444)
- Remove
.github/workflows/pr-title-check.yml; commit message rules remain enforced via local hooks andvalidate-commit-msg - Remove
--subject-onlyfromvalidate-commit-msg(it existed only for PR title CI)
- Remove
Fixed
-
Smoke-test deploy restores workspace CHANGELOG for prepare-release (#417)
- Add
prepare-changelog unprepareto rename the top## [semver] - …heading to## Unreleased init-workspace.sh --smoke-testcopies.devcontainer/CHANGELOG.mdinto workspaceCHANGELOG.mdand runs unprepare; remove duplicate remap from smoke-test dispatch workflow
- Add
-
Release app permission docs now include downstream workflow dispatch requirements (#397)
- Update
docs/RELEASE_CYCLE.mdto requireActionsread/write forRELEASE_APPon the validation repository - Clarify this is required so downstream
repository-dispatch.ymlcan trigger release orchestration workflows viaworkflow_dispatch
- Update
-
Smoke-test dispatch no longer fails on release PR self-approval (#402)
- Remove bot self-approval from
repository-dispatch.ymland replace with release-kind labeling plus auto-merge enablement - Remove in-job polling for release PR merge and downstream release execution from phase 1 orchestration
- Phase 2 (
on-release-pr-merge.yml) fails validation unless the merged release PR hasrelease-kind:finalorrelease-kind:candidate
- Remove bot self-approval from
-
Sync-main-to-dev PRs now trigger CI reliably in downstream repos (#398)
- Replace API-based sync branch creation with
git pushinassets/workspace/.github/workflows/sync-main-to-dev.yml
- Replace API-based sync branch creation with
-
Sync-main-to-dev no longer dispatches CI via workflow_dispatch (#405)
workflow_dispatchruns are omitted from the PR status check rollup, so they do not satisfy branch protection on the sync PR- Remove the post-PR
gh workflow run ci.ymlstep and dropactions: writefrom the sync job in.github/workflows/sync-main-to-dev.ymlandassets/workspace/.github/workflows/sync-main-to-dev.yml
-
Sync-main-to-dev conflict detection uses merge-tree (#410)
- Replace working-tree trial merge with
git merge-tree --write-treeso clean merges are not mislabeled as conflicts - Enable auto-merge when dev merges cleanly with main; print merge-tree output on conflicts; fail the step on unexpected errors
- Replace working-tree trial merge with
-
Smoke-test release phase 2 branch-not-found failure (#419)
- Merge phase 2 (
on-release-pr-merge.yml) back intorepository-dispatch.ymlso the release runs whilerelease/<version>still exists, matching the normal release flow - Remove
on-release-pr-merge.ymlfrom the smoke-test template
- Merge phase 2 (
-
Pinned commit-action to v0.2.0 (#354)
- Updated workflow pins from
vig-os/commit-action@c0024cb(v0.1.5) to1bc004353d08d9332a0cb54920b148256220c8e0(v0.2.0) in release, sync-issues, prepare-release, and smoke-test workflows - Upstream v0.2.0 adds bounded retry with exponential backoff for transient GitHub API failures (configurable
MAX_ATTEMPTSand delay bounds) - Efficient multi-file commits via
createTreeinline content for text files, binary blobs only when needed, and chunked tree creation for large change sets - Exports
isBinaryFile,getFileMode, andTREE_ENTRY_CHUNK_SIZEfor library use; sequential binary blob creation to reduce secondary rate-limit bursts
- Updated workflow pins from
-
Release finalization now commits generated docs and refreshes PR content (#300)
- Final release automation regenerates docs before committing so pre-commit
generate-docsdoes not fail CI with tracked file diffs - Release PR body is refreshed from finalized
CHANGELOG.md
- Final release automation regenerates docs before committing so pre-commit
-
Release attestation warnings reduced by granting artifact metadata permission (#348)
- Add
artifact-metadata: writeto the release publish job so attestation steps can persist metadata storage records - Keep
actions/attest-based SBOM attestation path and remove missing-permission warnings from publish runs
- Add
-
Smoke-test dispatch deploy now repairs workspace ownership before changelog copy (#352)
- Add a write probe and conditional
sudo chown -Rinassets/smoke-test/.github/workflows/repository-dispatch.ymlafter installer execution - Prevent
Permission deniedfailures when copying.devcontainer/CHANGELOG.mdto repository root in GitHub-hosted runner jobs
- Add a write probe and conditional
-
Smoke-test release lookup no longer treats missing tags as existing releases (#355)
- Change
assets/smoke-test/.github/workflows/repository-dispatch.ymlto branch ongh apiexit status when queryingreleases/tags/<tag> - Ensure missing release tags follow the create path instead of failing with
prerelease=nullmismatch
- Change
-
Bounded retry added for network-dependent setup and prepare-release calls (#357)
- Replace shell-based retry helper with pure Python
retryCLI invig-utils(packages/vig-utils/src/vig_utils/retry.py) - Update this repository CI workflows to call
uv run retryaftersetup-envdependency sync - Update downstream workflow templates to call
retrydirectly in devcontainer jobs and removesourcelines - Ensure downstream containerized jobs resolve image tags from
.vig-osinstead of hardcodedlatest - Bundle idempotency guards for branch/PR/tag/release creation paths to keep retried network calls safe on reruns
- Remove synced
retry.shartifacts and BATS retry tests in favor ofvig-utilspytest coverage
- Replace shell-based retry helper with pure Python
-
Release workflow no longer fails when retry tooling is unavailable (#365)
- Extend
.github/actions/setup-env/action.ymlwith a reusableretryshell function exported viaBASH_ENVas the retry single source of truth - Add
setup-envinput support for uv-only usage by allowing Python setup to be disabled when jobs only need retry tooling - Switch release workflow retry calls from
uv run retryto sharedretryand remove duplicated inline retry implementations
- Extend
-
Upstream sync workflows no longer depend on pre-published GHCR image tags (#367)
- Remove upstream
.vig-osfiles at repository root andassets/smoke-test/to eliminate downstream-only configuration from upstream CI - Refactor
.github/workflows/sync-issues.ymland.github/workflows/sync-main-to-dev.ymlto run natively on runners via./.github/actions/setup-envinstead ofresolve-image+container
- Remove upstream
-
Release test-image setup now recovers from uv sync crashes (#370)
- Harden
.github/actions/setup-env/action.ymlto retryuv sync --frozen --all-extrasonce after clearing uv cache and removing stale.venv - Prevent repeat release test failures when
setup-envis executed multiple times in the same job
- Harden
-
Release setup-env no longer self-sources retry helper via BASH_ENV (#374)
- Guard the retry-helper merge logic in
.github/actions/setup-env/action.ymlto skip merging whenPREV_BASH_ENValready equalsRETRY_HELPER - Prevent infinite
sourcerecursion and exit 139 crashes whensetup-envis invoked multiple times in one job
- Guard the retry-helper merge logic in
-
Smoke-test dispatch now checks out repository before local setup action (#376)
- Add
actions/checkoutto thesmoke-testjob in.github/workflows/release.ymlbefore invoking./.github/actions/setup-env - Prevent dispatch failures caused by missing local action metadata (
action.yml) in a fresh job workspace
- Add
-
Workspace resolve-image jobs now checkout local action metadata (#380)
- Update
sparse-checkoutin workspaceresolve-imagejobs to include.github/actions/resolve-imagein addition to.vig-os - Prevent CI failures in downstream deploy PRs where local composite actions were missing from sparse checkout
- Update
-
Smoke-test dispatch gh jobs now set explicit repo context (#386)
- Add job-level
GH_REPO: ${{ github.repository }}tocleanup-release,trigger-prepare-release,ready-release-pr, andtrigger-releaseinassets/smoke-test/.github/workflows/repository-dispatch.yml - Prevent
ghCLI failures (fatal: not a git repository) in runner jobs that do not performactions/checkout
- Add job-level
-
Smoke-test release orchestration now validates workflow contract before dispatch (#389)
- Add a preflight check that verifies
prepare-release.ymlandrelease.ymlare resolvable on dispatch refdevbefore downstream orchestration starts - Dispatch and polling now use explicit ref/branch context (
--ref dev/--branch dev) to avoid default-branch workflow registry drift and404 workflow not foundfailures
- Add a preflight check that verifies
-
Smoke-test preflight now uses gh CLI ref-compatible workflow validation (#392)
- Update
assets/smoke-test/.github/workflows/repository-dispatch.ymlpreflight checks to callgh workflow viewwith--yamlwhen--refis set - Prevent false preflight failures caused by newer GitHub CLI argument validation before
prepare-releasedispatch
- Update
-
Downstream release workflow templates hardened for smoke-test orchestration (#394)
- Add missing
git config --global --add safe.directory "$GITHUB_WORKSPACE"in containerized release and sync jobs that run git after checkout - Decouple
release.ymlrollback container startup fromneeds.core.outputs.image_tagby resolving the image in a dedicatedresolve-imagejob - Add explicit release caller/reusable workflow permissions for
actionsandpull-requestsoperations, and update dispatch header comments to reference only current CI workflows
- Add missing
-
Workspace containerized workflows now pin bash for run steps (#395)
- Set
defaults.run.shell: bashin containerized workspace release and prepare jobs soset -euo pipefailscripts do not execute under POSIXsh - Prevent downstream smoke-test failures caused by
set: Illegal option -o pipefailin container jobs
- Set
-
Downstream release templates now require explicit app tokens for write paths (#400)
- Update
assets/workspace/.github/workflows/prepare-release.yml,release-core.yml,release-publish.yml,release.yml, andsync-issues.ymlto removegithub.tokenfallback from protected write operations - Route protected branch/ref writes through Commit App tokens and release orchestration/issue operations through Release App tokens
- Document downstream token requirements in
docs/DOWNSTREAM_RELEASE.mdanddocs/CROSS_REPO_RELEASE_GATE.md - Use
github.tokenspecifically for Actions cache deletion insync-issues.ymlbecause that API path requires explicitactions: writejob token scope - Use Commit App credentials for rollback checkout in
release.ymlso rollback branch/tag writes can still bypass protected refs
- Update
-
setup-env retries uv install on transient GitHub Releases download failures (#407)
- Add
continue-on-errorplus a delayed second attempt forastral-sh/setup-uvin.github/actions/setup-env/action.yml - Reduce flaky release publish failures when GitHub CDN returns transient HTTP errors for uv release assets
- Add
-
Smoke-test deploy keeps workspace scaffold as root CHANGELOG (#403)
- Stop overwriting
CHANGELOG.mdwith a minimal stub inassets/smoke-test/.github/workflows/repository-dispatch.yml - Require the workspace
CHANGELOG.mdfrominit-workspaceso downstreamprepare-releasevalidation matches shipped layout - When the first changelog section is
## [X.Y.Z] - …(TBD or a release date), remap that top version header to## Unreleasedso downstreamprepare-releasecan run
- Stop overwriting
-
Smoke-test dispatch release validate no longer runs docker inside devcontainer (#421)
- Remove redundant
docker manifest inspectstep fromrelease-core.ymlvalidate job (container image is already proof of accessibility;resolve-imagevalidates on the runner) - Set
GH_REPOfor rollbackgh issue createin workspacerelease.ymlwhen git checkout is skipped
- Remove redundant
-
Container image tests expect current uv minor line (#423)
- Update
tests/test_image.pyEXPECTED_VERSIONS["uv"]to match uv 0.11.x from the latest release install path in the image build
- Update
-
Container image tests expect current just minor line (#423)
- Update
tests/test_image.pyEXPECTED_VERSIONS["just"]to match just 1.48.x from the latest release install path in the image build
- Update
-
Smoke-test dispatch approves release PR before downstream release (#430)
- Grant
pull-requests: writeonready-release-prand approve withgithub.token(github-actions[bot]) - Satisfy
release-core.ymlapproval gate without the release app self-approving its own PR
- Grant
-
commit-action retries enabled for transient git ref API failures (#436)
- Set
MAX_ATTEMPTS: "3"on everyvig-os/commit-actionstep so v0.2.0 bounded retry actually runs (default was 1) - Covers smoke-test deploy, prepare-release, release finalization, sync-issues, and workspace templates
- Set
-
Release validation fails when bot approves PR (#438)
- Add fallback to individual PR review check when
reviewDecisionis empty (bot approvals not counted by branch protection)
- Add fallback to individual PR review check when
-
Downstream candidate RC tag can match upstream dispatch (#441)
- Workspace
release.yml/release-core.ymlaccept optionalrc-numberso candidate tags are not always recomputed from local tags only - Smoke-test
repository-dispatch.ymlexposesbase_versionandrc_numberjob outputs for orchestration that calls workspacerelease.yml
- Workspace
-
Release validate fails early when GitHub Release already exists (#443)
- Validate job in
.github/workflows/release.ymlqueriesGET /repos/.../releases/tags/<PUBLISH_VERSION>with retries and classifies errors like the downstream RC gate; only a documented not-found response is treated as “no release,” and ambiguous API failures fail closed before build/sign/publish - Publish job uses the same existence checks before and after
gh release createinstead ofgh release viewwith discarded stderr
- Validate job in
-
Release tag resolution and GitHub Release view retries (#446)
- Fall back to plain
refs/tags/<tag>when the peeled ref is empty (lightweight remote tags) in.github/workflows/release.yml,release-core.yml, andrelease-publish.yml - Use one retried
gh release viewin workspacerelease-publish.ymlso draft/prerelease skip paths parse JSON from the same successful response
- Fall back to plain
-
Workspace release publish
tag_already_existsinput coercion (#451)- Pass a boolean into
release-publish.ymlvianeeds.core.outputs.tag_already_exists == 'true'soworkflow_calldoes not reject string"true"/"false"job outputs
- Pass a boolean into
Security
- Smoke-test dispatch workflow permissions now follow least privilege (#340)
- Reduce
assets/smoke-test/.github/workflows/repository-dispatch.ymlworkflow token permissions from write to read by default - Grant
contents: writeonly topublish-release, the single job that creates or edits GitHub Releases
- Reduce