Skip to content

chore(release): merge werf v3 into delivery-kit - #225

Draft
alexey-igrychev wants to merge 239 commits into
mainfrom
3
Draft

chore(release): merge werf v3 into delivery-kit#225
alexey-igrychev wants to merge 239 commits into
mainfrom
3

Conversation

@alexey-igrychev

@alexey-igrychev alexey-igrychev commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

Summary

Align delivery-kit with the current werf v3 release line while retaining the fork-specific SBOM, OCI attestation, image signing, and CI behavior. The branch includes delivery-kit/main and the latest werf/werf:3 tip available during the merge.

What

Version transition

  • BREAKING: delivery-kit moves from the werf 2.75 code line to werf 3.x; users relying on the removed v2 Stapel artifact or Ansible builder behavior must migrate before upgrading.
  • The branch includes current werf v3 build, deploy, validation, caching, release, and development behavior through werf/werf@ea66ed8b9.
  • The combined changelog retains both the werf v3 release history and delivery-kit release history.

Delivery-kit capabilities

  • build.sbom and image-level SBOM configuration continue to generate and validate SBOMs, including Go, Python, Rust, Lua, JavaScript, and OS package inputs.
  • Dedicated English and Russian SBOM workflow pages document configuration and package directives and are linked from the documentation sidebars and CLI references.
  • OCI attestation, SBOM retrieval/merge/validation, manifest signing, ELF signing, and signature verification remain available on the v3 build pipeline.
  • OCI fallback artifacts without a live parent image remain removable by cleanup and purge; fatal registry authorization errors still stop deletion.
  • werf sbom get preserves the complete calculated build options when it needs to build an image.
  • SBOM-enabled commands with --without-images skip SBOM convergence instead of dereferencing an empty image graph.
  • Packages stages participate in v3 holistic content digests; SBOM enablement invalidates content anchors, while cached images expose their content-tag image information to SBOM retrieval.
  • os-pm build secrets (e.g. PACKAGES_VERSION, REGISTRY) resolve on a scratch base image again: the packages stage reads them with the scratch-safe stapel head binary instead of the cat binary the v3 stapel toolchain dropped.
  • Manifest-signing and dm-verity mutation stages contribute stable content dependencies to v3 content anchors instead of panicking during digest calculation.
  • v3's removal of legacy artifact, Ansible, Stapel docker, import-metadata, and import-by-file-checksum paths is preserved in runtime and English/Russian template documentation; delivery-kit features use the v3 graph and import-by-source-image-tag model.
  • VERIFIED: the merged Linux/CGO Buildah code compiles on Ubuntu 22.04 amd64; targeted signing+dm-verity, attestation, verification, complex build, stages-copy, SBOM caching/stage-dependencies, docs, context-digest, image-spec, and giterminism scenarios pass there.
  • UNVERIFIED: BSign E2E reached ELF signing but the review host lacks the required privilege; the full CI matrix is authoritative for remaining scopes.

Why

Delivery-kit had continued on the v2 architecture while werf v3 removed legacy build and storage paths and changed the stage graph, digest, deployment, and validation APIs. A direct merge left fork features connected to removed APIs; porting the integration points preserves delivery-kit behavior without restoring the v2 architecture or dropping current v3 fixes.

ilya-lesikov and others added 30 commits March 28, 2026 00:08
Signed-off-by: Ilya Lesikov <ilya@lesikov.com>
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>

# Conflicts:
#	pkg/deploy/helm_for_werf_helm/chart_extender_for_werf_helm/helpers_for_werf_helm/service_values.go
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>

# Conflicts:
#	cmd/werf/common/components_manager.go
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>

# Conflicts:
#	cmd/werf/bundle/publish/publish.go
#	docs/_includes/reference/cli/werf_bundle_apply.md
#	docs/_includes/reference/cli/werf_converge.md
#	docs/_includes/reference/cli/werf_plan.md
#	docs/_includes/reference/cli/werf_render.md
#	go.mod
#	go.sum
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>

# Conflicts:
#	pkg/deploy/helm_for_werf_helm/chart_extender_for_werf_helm/helpers_for_werf_helm/service_values.go
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>
Signed-off-by: Dmitry Mordvinov <dmitry.mordvinov@flant.com>

# Conflicts:
#	go.mod
#	go.sum
Remove all Ansible-related code, config parsing, CLI flags, tests,
Stapel container packages, and documentation (EN/RU) for the Ansible
builder in Stapel build instructions. Only the Shell builder remains.

Deleted:
- pkg/build/builder/ansible.go, ansible_assets.go, ansible_assets_data.go
- pkg/build/builder/ansible/ (Python scripts, static embed)
- pkg/config/ansible.go, ansible_task.go, raw_ansible.go, raw_ansible_task.go
- test/legacy_e2e/suites/ansible/ (16 test files)
- stapel/omnibus/config/software/ansible.rb

Modified:
- Removed Ansible branches from builder selection, config parsing,
  conveyor checks, and CLI env annotations
- Relocated shared Extra struct and inlined mkdirP in shell.go
- Cleaned Stapel Dockerfile and omnibus dependency
- Updated all EN/RU docs and data YAML files

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
Remove deprecated artifact image type from werf codebase:
- Rename ArtifactExport → Export, rawArtifactExport → rawExport
- Delete StapelImageArtifact struct and artifact parsing logic
- Remove artifact/fromArtifact/ArtifactName fields from config structs
- Remove artifact directive references from parser and validator
- Clean up build pipeline (dependencies, imports, image checks)
- Update test fixtures to use image with final: false
- Remove artifact references from documentation and data files

BREAKING CHANGE: The artifact directive is no longer supported.
Use image with final: false instead.

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
Bring the SBOM documentation update from delivery-kit main into the v3 branch.

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
## Summary

Cached content anchors from Git-backed images are now reused even when
the source commit recorded by an existing stage is unavailable. Ordinary
Git stages retain commit validation because they need history to
generate patches.

## What

- A cached content anchor with a matching digest is selected without
requiring its recorded Git commit to exist.
- Non-anchor Git stages continue to reject cached stages whose recorded
commits are unavailable.

## Why

The terminal Git stage serving as a content anchor inherited ordinary
stage selection, which validates the cached stage's recorded commit. A
content anchor is content-addressed, so that validation wrongly prevents
reuse when the commit is unavailable despite an intact remote stage.
Selecting it through the base-stage policy removes the unnecessary Git
dependency without weakening patch-stage safety.

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
Bring the content-anchor reuse fix from the current upstream v3 branch into delivery-kit.

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
Include signing and dm-verity mutation stages in content-anchor dependency calculation instead of inheriting the BaseStage panic.

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
Use the v3 Docker backend mode in build E2E coverage and restore strict image-spec port assertions.

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
Keep the English and Russian template documentation aligned with the v3 removal of Ansible, artifact images, and the Stapel docker directive.

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
@alexey-igrychev alexey-igrychev changed the title chore(release): merge werf v3 into delivery-kit v3 Aug 5, 2026
Include the packages stage in holistic checksums, accept packages stage dependencies, and use the content-tag descriptor when a cached image has no built stage image.

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
Tag external fixture images and use exact v3 digest and backend-specific exposed-port expectations.

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
Clear WERF_DISABLE_AUTO_HOST_CLEANUP during regeneration so local and CI output use the same default.

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
Include SBOM enablement in anchor digests and use cached content-tag image information when no stage image was built.

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
Require generated packages shell instructions before accepting git.stageDependencies.packages.

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
@alexey-igrychev alexey-igrychev changed the title v3 chore(release): merge werf v3 into delivery-kit Aug 5, 2026
alexey-igrychev and others added 17 commits August 5, 2026 19:12
The v3 Docker backend build error no longer prints the "Code: 127" prefix; keep asserting the pm-not-found diagnostic that still surfaces.

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
The v3 stapel toolchain dropped the embedded cat binary, so resolving PACKAGES_VERSION/REGISTRY from /run/secrets produced an empty value and failed the packages stage on a scratch base. Read the secret with stapel head, which stays embedded and scratch-safe; the bash $(<file) builtin cannot be used because the surrounding 2>/dev/null || true guard turns it into a bare redirection that yields nothing.

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
Pin the delivery-kit release to the werf v3 base merged into this branch (3.0.0-test.1), per the merge-upstream -dk.N policy. release-please reads this Release-As footer on push to main; CHANGELOG and the manifest are left for release-please.

Release-As: v3.0.0-test.1-dk.1
Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
The `--local-resource-validation` flag is not needed anymore as we
embedded schemas to the binary. So, we may validate by kubeconform even
without network access.

Signed-off-by: Ilya Drey <ilya.drey@flant.com>
…rf#7752)

## Summary

Agents verifying a change in this repo prove conditions from shell
output — a match count, or a command "succeeding". Both can report
success while being structurally incapable of reporting failure: a
mis-typed `grep -c` pattern yields the same `0` as a genuinely absent
condition, and `… | grep x || echo clean` always prints `clean` because
a pipeline returns only its last command's status. `AGENTS.md` now
forbids citing such a check until a failing case has been shown to look
different from a passing one.

## What

- The delta in what an agent produces: a count- or status-based
verification is now accompanied by a control proving the check *can*
fail, or restructured so failure is visible (`if` / `$?` instead of `||
echo`). Neither a bare count nor a bare "the command succeeded" is
acceptable as evidence.
- VERIFIED: the rule's own text is checked the way it prescribes — `^-
NEVER` returns 15 hits as a known-positive control, `^- NEVER cite a
count` returns 1, and the superseded wording returns 0.
- No `task` target, `.golangci.yml` rule or CI check is added: the rule
governs commands an agent composes in a shell at runtime, which leave no
artifact for a check to read.
- The `NEVER trust LSP/gopls diagnostics … as proof of build failure`
rule directly above is unchanged; the new line joins it as the same
class of rule.

## Why

Three incidents, two mechanisms. First: patch-equivalent commits counted
with `git range-diff … | grep -c ' = '` returned 0 of 7 and read as a
broken rebase. The rebase was correct — git's column spacing differed
from what the pattern assumed.

Then, within the hour of the first wording landing, its own author broke
the rule twice more by a different route: `… | grep -E '<pattern>' ||
echo none` and `… | grep … | head || echo accepted`. A pipeline reports
only its last command's status, so the `||` branch can never run and the
reassuring message always prints. One of the two produced a false
`rejected` in a push test that was deciding a finding's severity.

The first wording named `grep -c`/`wc -l` only and would not have caught
either recurrence. Both mechanisms share one shape and one direction of
failure: the check does not merely stop working, it reports success.
That is worse than having no check, because the result then gets cited
as proof.

Rejected alternative: a linter or `task` target flagging `grep -c` or
`|| echo`. These commands are composed ad hoc in a shell and never
committed, so there is no artifact for a check to inspect.

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
## Summary

`review/SKILL.md` referenced a PR's description only as a source for
deriving DoD criteria, so a reviewing agent read it as input and never
checked it as an artifact. The skill now states that the description's
own claims are subject to review, and why that matters more here than in
most repositories.

## What

- The delta in what a reviewing agent produces: a finding is now raised
when the PR description asserts a property the review disproves, instead
of only when code does. Previously such a contradiction went unreported
even with findings that directly refuted it.
- The bullet lands in `## Gotchas`, alongside the other werf-specific
traps; no other section changes and no existing bullet is reworded.
- Nothing is added to `pull-request/SKILL.md`: that skill governs
*writing* a description and already states the squash-permanence fact.
This is the reviewing side, and duplicating the fact would let the two
drift.
- `.claude/skills` is a symlink to `.agents/skills`, so the change is
visible under both paths with no second edit.

## Why

A four-round review of a submodule-reuse change produced 17 inline
comments. Its description asserted three safety properties the findings
contradict — a probe that "cannot itself trigger a fetch" (true only on
git >= 2.45, while `pkg/true_git/init.go` admits 2.18), a reuse failure
that "costs a slower build rather than a broken one" (untrue for probe
failures, which return with no fallback), and that every URL used is "a
path werf computed itself" (ambient `url.*.insteadOf` can rewrite it).
None of that was noticed until the user asked whether the description
was still accurate.

Two properties make the omission expensive. werf squashes on merge, so
the description becomes the commit body: a wrong safety claim outlives
the review in `git log` indefinitely. And inline comments anchor to code
lines, so a reader of the description never encounters them — the
reviewer can be simultaneously thorough about the code and silent about
false claims made on top of it.

Rejected alternative: a CI check comparing description claims against
the diff. Claims are prose, and deciding whether one contradicts a
finding is the review judgment itself, not something a check can make.

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
## Summary

The three tests covering `include.path` forwarding in `pkg/true_git`
were written with testify, while AGENTS.md mandates Ginkgo and Gomega
and every other spec in the package already uses them. This converts
them and drops the testify-only git helpers they needed. Follow-up to
werf#7736, which converted the specs it added and left these behind.

## What

- No production code changes: the invariant is that the same three
behaviors stay pinned — `getIncludePathOptions` resolving absolute,
repository-relative and `~` include paths; `updateSubmodules` forwarding
those includes to its git invocations; and `switchWorkTree` on a
repository without submodules being unaffected by an ambient include.
VERIFIED: mutation-checked, both falsifiable behaviors caught.
- `pkg/true_git` no longer uses testify: `helpers_ai_test.go` is deleted
and the converted specs use the helpers already in `helpers_test.go`.
- The suite reports 102 specs where it reported 99 plus three `go test`
functions; nothing is skipped and no assertion is dropped.

## Why

Two test styles in one package mean two sets of git helpers doing the
same thing and two failure formats to read. The testify tests also ran
invisibly under `task test:unit`, which reports Ginkgo specs only, so
their result was only ever observable through a failure.

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
## Summary

Cached content anchors from Git-backed images are now reused even when
the source commit recorded by an existing stage is unavailable. Ordinary
Git stages retain commit validation because they need history to
generate patches.

## What

- A cached content anchor with a matching digest is selected without
requiring its recorded Git commit to exist.
- Non-anchor Git stages continue to reject cached stages whose recorded
commits are unavailable.

## Why

The terminal Git stage serving as a content anchor inherited ordinary
stage selection, which validates the cached stage's recorded commit. A
content anchor is content-addressed, so that validation wrongly prevents
reuse when the commit is unavailable despite an intact remote stage.
Selecting it through the base-stage policy removes the unnecessary Git
dependency without weakening patch-stage safety.

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
…7739)

## Summary

werf records a per-project marker in `--repo` naming the `--meta-repo`
that holds the project's metadata, and refuses to run when a later
invocation disagrees with it. Previously, dropping `--meta-repo` from
one pipeline step silently sent werf to read metadata from `--repo`,
where the managed-images set is incomplete — and the next `werf cleanup`
deleted images that were still in use. Two new commands, `werf meta-repo
migrate` and `werf meta-repo detach`, move existing metadata into a
meta-repo and remove the marker.

## What

### Safeguard

- A project whose marker names a meta-repo fails every storage-touching
command run without `--meta-repo`, with an error naming the recorded
address and `werf meta-repo detach` as the way out. This ends the
previous silent fallback, so a pipeline that relied on it now fails
instead — the behavior being fixed. Only setups already passing
`--meta-repo` are affected, and that flag exists solely in unreleased
v3, so no released setup changes.
- Passing `--meta-repo` to a project whose metadata still sits in
`--repo` no longer fails: the new metadata goes to the meta-repo
immediately. `migrate` is still what brings the existing records over,
and nothing enforces that it ran — a `cleanup` before it decides from an
incomplete metadata view, which the docs state.
- Passing a `--meta-repo` that disagrees with the marker fails the same
way; a `--meta-repo` that canonically resolves to `--repo` is validated
too, and gets its own error rather than being told to pass the flag it
already passed.
- Address comparison is tag-insensitive: `--meta-repo repo:tag` and
`--repo repo` compare equal.
- The marker is written lazily, on the first real metadata write, so
read-only commands never push and pull-only credentials keep working.
- `cleanup.disable: true` together with `--meta-repo` now writes neither
a cleanup record nor a marker; previously the meta-repo gained a record
while `--repo` kept no marker, so a later run without the flag passed
validation and silently read `--repo`.
- The marker tag is `werf-meta-repo-marker-<project>`, which matches no
tag parser in werf v2 or v3, so a v2 running against the same `--repo`
ignores it.

### `werf meta-repo migrate`

- Takes the source in `--from` and destination in `--to`, moves the
`managed-image-*`, `meta-*`, `custom-tag-meta-*` and `cleanup` records,
then plants the marker; it copies, verifies the copy, and only then
deletes. `--from` also exposes the source registry credential flags
(`--from-docker-hub-token`, `--from-quay-token`, …) that the default
delete needs on Docker Hub, Harbor and Quay. Every flag is scoped to
this command through `WERF_META_REPO_MIGRATE_FROM[_*]` and
`WERF_META_REPO_MIGRATE_TO` env vars, so the generic
`WERF_FROM`/`WERF_TO` used by another copy command cannot leak in.
`--repo` and `--meta-repo` are not accepted by this command.
- `--remove-source` defaults to `true` (`$WERF_REMOVE_SOURCE`), so the
command moves rather than copies; `--remove-source=false` copies and
leaves `--from` intact.
- Matches metadata by record shape, not by the `werf` label: a
repository holds one project, and records written before werf started
labeling them (2021) carry no label. Previously migrate refused outright
to delete any unlabeled record, so the default `--remove-source` failed
on exactly the long-lived repositories the meta-repo is meant to drain.
- Never treats a stage image as a metadata record, so a custom tag alias
named like a metadata record (`--add-custom-tag managed-image-release`)
is left untouched instead of being copied and deleted — deleting it
would have destroyed the stage, because the registry drops the manifest
by digest. Multi-platform aliases are covered: an index carries no
top-level labels, so it is recognized as a stage by being an index.
- The `--meta-repo` record wins for the two families whose content is
mutable under a stable tag (`cleanup`, `custom-tag-meta-*`), since that
is the copy werf reads; the `--repo` one is skipped with a warning
naming the tag and both addresses. Under `--remove-source=false` the
records left in `--repo` are frozen after the first migration, so the
reverse rule pushed a stale stage ID back over the current one and
`cleanup`, which groups aliases by that stage ID, could delete a custom
tag pointing at a live stage.
- Refuses to run when `--to` is the same repository as `--from`.

### `werf meta-repo detach`

- Removes the marker only, and says so: metadata is NOT moved back, and
the command is not a reverse migration.
- Refuses to delete anything if the marker tag holds a stage image or
custom tag alias rather than a marker.
- `werf purge` removes the marker as its last step, once every other
deletion has succeeded, so a re-created project builds without
`--meta-repo` again and never needs `detach` for that. A purge that
fails partway leaves the marker in place, keeping metadata still sitting
in the meta-repo protected. It is a no-op for the non-registry stages
storage `werf host purge` operates on.

### Docs

- `docs/_includes/reference/cli/werf_meta_repo*` and
`docs/pages_en/reference/cli/werf_meta_repo*` are the generated
reference for the new command group, added by `task doc:gen` along with
their sidebar and overview entries.
- `docs/pages_{en,ru}/usage/build/process.md` is the authority for the
safeguard, and states the motivation as tag-count: image-metadata
records are written per image, per commit and per stage, and every stage
lookup lists the whole tag set of `--repo`.

## Why

`--meta-repo` (werf#7637) split metadata into a second repository but left
the two repositories with no link between them, so the correct
`--meta-repo` value existed only in each pipeline's flags. Nothing
detected its absence: `GetOptionalMetaStorage` falls back to the stages
storage, so werf read an empty managed-images set from `--repo` and
`cleanup` treated every image whose metadata it could not see as
unmanaged. The cost is deleted in-use images, discovered only when a
deploy pulls a missing tag.

The marker is per-project rather than per-repository because werf never
enforces one project per repository: a repository-wide marker would let
one project's `werf purge` drop the safeguard for every other project in
that `--repo`. `detach` is not called `reset`, because `reset` reads as
the inverse of `migrate` — metadata moved back — which is exactly the
expectation that ends in deleted images.

---------

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
## Summary

Merges `origin/main` into `3`, bringing 6 commits that had diverged. One
is user-visible: concurrent builds pulling the same base image no longer
race under the Buildah backend. The rest are agent-tooling docs
(`AGENTS.md`, `.agents/skills`) with no runtime effect.

## What

- Under the Buildah backend, concurrent stage builds that pull the same
base image are serialized, so parallel builds no longer race on the
shared pull (werf#7664).
- No other user-visible werf behavior changes; remaining commits edit
`AGENTS.md`, `.agents/skills/pull-request`, and CLI-docs generation env
handling (werf#7754, werf#7749, werf#7748, werf#7747).
- Conflict resolutions are docs-only: `AGENTS.md` keeps branch-3's macOS
Docker-backend e2e guidance and adds main's `git diff --check`/`task
test:unit` caveats and registry-deletion note; `pull-request/SKILL.md`
takes main's rewording but keeps branch-3's dependency-bump lists
without `werf/3p-helm` (not a dependency on `3`).

## Why

`3` was 6 commits behind `main`; merging keeps the release branches from
diverging further. All conflicts were in agent-facing docs edited
independently on both branches — resolved by unioning the two sets of
guidance, no code conflict.

---------

Signed-off-by: Radmir Khurum <radmir.khurum@flant.com>
Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
Co-authored-by: Radmir Khurum <radmir.khurum@flant.com>
🤖 I have created a release *beep* *boop*
---


## [3.1.0](werf/werf@v3.0.2...v3.1.0)
(2026-08-05)


### Features

* `--no-values-schema-validation`; don't break values.schema.json with
service values ([werf#7756](werf#7756))
([01eeb94](werf@01eeb94))
* add support for additional patches files and disable default patches
([werf#7735](werf#7735))
([01aa2e5](werf@01aa2e5))
* **build:** add per-project meta-repo safeguard and migration
([werf#7739](werf#7739))
([4f7de94](werf@4f7de94))
* bump nelm version ([werf#7731](werf#7731))
([ca44562](werf@ca44562))
* embed kubeconform schemas
([werf#7729](werf#7729))
([23bcaf1](werf@23bcaf1))


### Bug Fixes

* **build, buildah:** serialize concurrent base image pulls
([werf#7664](werf#7664))
([6eb9144](werf@6eb9144))
* **build, dockerfile:** allow dockerfile outside the build context
([werf#7722](werf#7722))
([a5c2011](werf@a5c2011))
* **build, stapel, git:** remove git commit ancestry check on reuse
([werf#7746](werf#7746))
([544a07d](werf@544a07d))
* **build, stapel:** make service script executable regardless of umask
([werf#7720](werf#7720))
([8b67264](werf@8b67264)),
closes [werf#2339](werf#2339)
* **build:** drop empty image digest warnings from the build report
([werf#7717](werf#7717))
([24babbb](werf@24babbb)),
closes [werf#7667](werf#7667)
* **build:** reuse content anchors without git commits
([werf#7764](werf#7764))
([5df466c](werf@5df466c))
* **build:** stop re-fetching submodules the checkout already has
([werf#7736](werf#7736))
([8ff0bf3](werf@8ff0bf3))
* **build:** validate image names in werf.yaml
([werf#7711](werf#7711))
([cd993db](werf@cd993db))
* **deploy:** optimize local validation args
([werf#7760](werf#7760))
([6a4c6c4](werf@6a4c6c4))
* **dev:** self-heal a stale worktree index.lock left by a killed run
([werf#7733](werf#7733))
([ca0e803](werf@ca0e803))
* **dev:** warm a persistent dev-index so --dev stops re-reading
unchanged files ([werf#7732](werf#7732))
([f0b13cc](werf@f0b13cc))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>

# Conflicts:
#	CHANGELOG.md
#	pkg/cleaning/purge.go
#	scripts/docs/regen.sh
Release-As: v3.1.0-dk.1
Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
The merge added GetOrphanedArtifactNames and DeleteArtifact to StagesStorage
but the upstream meta-repo marker test pins the PrimaryStagesStorage method
set. Both read or act on artifact images rather than project metadata, so
they belong in markerUnguardedMethods.

Signed-off-by: Aleksei Igrychev <aleksei.igrychev@palark.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants