Snapcraft 9: snapcraftctl errors in core22 snaps
Metadata
Current evaluation
Regression in snapcraft 9: core22 snaps using snapcraftctl in override-build fail validation. Maintainer confirmed as a regression.
Suggested action: keep open
Reason: Maintainer @mr-cal confirmed this is a regression in snapcraft 9.0.1 and reproduced it. The bug is in snapcraft/models/project.py line 2159: the validator checks info.data.get("build-base") with a hyphen, but pydantic v2 stores field names with underscores (build_base), so the check always returns None and incorrectly rejects snapcraftctl for core22 snaps. Fix is a one-line change.
Impact:
75
Quick Win:
67.5
Staleness:
45
Complexity:
10
Confidence:
85
Support Request:
0
Issue body
### Check existing issues
- [x] I've verified that this bug isn't described by any existing issues.
### Bug description
While running a new build of a kernel snap for core 22, there was no significant changes on the snapcraft.yaml but it leaded to a build failure.
The only major difference was the jump from snapcraft 8.14.5 to 9.0.1.
The build-base is core 22.
### Steps to reproduce
Prepare a snapcraft core 22.
Use `snapcraftctl build` in an `override-build` stage.
Trigger a build on launchpad.
### Environment
This error popped up in launchpad snap building service
### snapcraft.yaml
```yaml
name: XXXX-a-m1-kernel
adopt-info: kernel
summary: Ubuntu XXXX Linux Kernel
description: The XXXX Ubuntu kernel package as a snap for XXXX project
type: kernel
confinement: strict
build-base: core22
environment:
LD_LIBRARY_PATH: ${SNAP}/usr/lib
hooks:
fde-setup:
plugs:
- tee
- home
parts:
kernel:
plugin: nil
build-packages:
- kmod
stage-packages:
- linux-image-uc22-XXXX
- linux-image-XXXX
- linux-XXXX-firmware
organize:
boot: ./
lib/firmware: firmware
lib/modules: modules
usr/share/doc: doc
override-build: |
craftctl set version="$(apt show linux-image-uc22-XXXX 2>/dev/null | sed -n 's/^Version: //p' | head -n1)"
rm -f "$SNAPCRAFT_PART_INSTALL"/boot/vmlinuz-* "$SNAPCRAFT_PART_INSTALL"/boot/fit-*-nofde
mv "$SNAPCRAFT_PART_INSTALL"/boot/fit-*-fde "$SNAPCRAFT_PART_INSTALL"/boot/kernel.img
depmod -b "$SNAPCRAFT_PART_INSTALL" $(basename "$SNAPCRAFT_PART_INSTALL"/lib/modules/*)
ls .
ls /
if [ -e /usr/lib/ubuntu-core-initramfs/main/usr/lib/snapd/info ]; then
cp /usr/lib/ubuntu-core-initramfs/main/usr/lib/snapd/info "$SNAPCRAFT_PART_INSTALL"/snapd-info;
elif [ -e /usr/lib/snapd/info ]; then
cp /usr/lib/snapd/info "$SNAPCRAFT_PART_INSTALL"/snapd-info;
elif [ -e chroot/usr/lib/snapd/info ]; then
cp chroot/usr/lib/snapd/info "$SNAPCRAFT_PART_INSTALL"/snapd-info;
else
echo "ERROR: no snapd-info found" 1>&2;
exit 1;
fi
craftctl default
stage:
- -doc/crda
- -doc/linux-base
- -doc/iw
- -etc
- -firmware/amd
- -firmware/amdgpu
- -firmware/asihpi
- -firmware/cavium
- -firmware/cxgb3
- -firmware/cxgb4
- -firmware/dpaa2
- -firmware/i915
- -firmware/intel
- -firmware/iwlwifi-*
- -firmware/liquidio
- -firmware/matrox
- -firmware/mellanox
- -firmware/mrvl
- -firmware/moxa
- -firmware/netronome
- -firmware/nvidia
- -firmware/qed
- -firmware/radeon
- -firmware/rockchip
- -firmware/ath10k/QCA9377/hw1.0/firmware-5.bin
- -firmware/ath3k-1.fw
- -firmware/qca/htbtfw20.tlv
- -firmware/qcom
- -firmware/s5p*
- -lib
- -sbin
- -usr
fdehook:
plugin: nil
build-packages:
- oem-fdehelper-optee
override-build: |
mkdir -p "$SNAPCRAFT_PART_INSTALL"/meta/hooks "$SNAPCRAFT_PART_INSTALL"/usr/lib
cp -a /usr/bin/fde-setup "$SNAPCRAFT_PART_INSTALL"/meta/hooks
cp -a /usr/lib/libteec* "$SNAPCRAFT_PART_INSTALL"/usr/lib
```
### Log output
```shell
snapcraft 9.0.1 from Canonical** installed
Running repo phase...
Cloning into 'XXXXX-kernel'...
[12/Jul/2026:22:36:16 +0000] "CONNECT git.launchpad.net:443 HTTP/1.1" 200 4520178 "-" "git/2.34.1"
Running pull phase...
Traceback (most recent call last):
File "/snap/snapcraft/18519/bin/snapcraft", line 12, in <module>
sys.exit(main())
^^^^^^
File "/snap/snapcraft/18519/lib/python3.12/site-packages/snapcraft/application.py", line 358, in main
return cli.run()
^^^^^^^^^
File "/snap/snapcraft/18519/lib/python3.12/site-packages/snapcraft/cli.py", line 258, in run
_run_dispatcher(dispatcher, global_args)
File "/snap/snapcraft/18519/lib/python3.12/site-packages/snapcraft/cli.py", line 231, in _run_dispatcher
dispatcher.run()
File "/snap/snapcraft/18519/lib/python3.12/site-packages/craft_cli/dispatcher.py", line 576, in run
return self._loaded_command.run(self._parsed_command_args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/snap/snapcraft/18519/lib/python3.12/site-packages/snapcraft/commands/core22/lifecycle.py", line 118, in run
parts_lifecycle.run(self.name, parsed_args)
File "/snap/snapcraft/18519/lib/python3.12/site-packages/snapcraft/parts/lifecycle.py", line 99, in run
project = models.Project.unmarshal(yaml_data_for_arch)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/snap/snapcraft/18519/lib/python3.12/site-packages/snapcraft/models/project.py", line 2120, in unmarshal
return pydantic.TypeAdapter(SnapcraftProject).validate_python(data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/snap/snapcraft/18519/lib/python3.12/site-packages/pydantic/type_adapter.py", line 441, in validate_python
return self.validator.validate_python(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pydantic_core._pydantic_core.ValidationError: 1 validation error for function-before[_validate_type(), tagged-union[tagged-union[function-after[_validate_platforms_and_architectures(), function-after[_validate_grade_and_build_base(), function-after[_validate_adoptable_fields(), function-after[_validate_bare_base_requires_build_base(), Core22Project]]]],function-after[_validate_grade_and_build_base(), function-after[_validate_adoptable_fields(), function-after[_validate_bare_base_requires_build_base(), Core24Project]]],function-after[_validate_grade_and_build_base(), function-after[_validate_adoptable_fields(), function-after[_validate_bare_base_requires_build_base(), Core26Project]]],function-after[_validate_grade_and_build_base(), function-after[_validate_adoptable_fields(), function-after[_validate_bare_base_requires_build_base(), DevelBaseProject]]],tagged-union[function-after[_validate_platforms_and_architectures(), function-after[_validate_grade_and_build_base(), function-after[_validate_adoptable_fields(), function-after[_validate_bare_base_requires_build_base(), BareCore22Project]]]],function-after[_validate_grade_and_build_base(), function-after[_validate_adoptable_fields(), function-after[_validate_bare_base_requires_build_base(), BareCore24Project]]],function-after[_validate_grade_and_build_base(), function-after[_validate_adoptable_fields(), function-after[_validate_bare_base_requires_build_base(), BareCore26Project]]],function-after[_validate_grade_and_build_base(), function-after[_validate_adoptable_fields(), function-after[_validate_bare_base_requires_build_base(), BareDevelProject]]]]],tagged-union[function-after[_validate_platforms_and_architectures(), function-after[_validate_no_base(), function-after[_validate_grade_and_build_base(), function-after[_validate_adoptable_fields(), function-after[_validate_bare_base_requires_build_base(), _BaselessCore22Project]]]]],function-after[_validate_no_base(), function-after[_validate_grade_and_build_base(), function-after[_validate_adoptable_fields(), function-after[_validate_bare_base_requires_build_base(), _BaselessProject]]]],function-after[_validate_no_base(), function-after[_validate_grade_and_build_base(), function-after[_validate_adoptable_fields(), function-after[_validate_bare_base_requires_build_base(), _BaselessProject]]]],function-after[_validate_no_base(), function-after[_validate_grade_and_build_base(), function-after[_validate_adoptable_fields(), function-after[_validate_bare_base_requires_build_base(), _BaselessProject]]]]]]]
baseless.core22.parts
Value error, Can't use 'snapcraftctl' in the override-build script for part 'kernel'. Use 'craftctl' instead. [type=value_error, input_value={'kernel': {'plugin': 'ni...RT_INSTALL"/usr/lib\n'}}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.12/v/value_error
Build failed
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/lpbuildd/target/build_snap.py", line 341, in run
self.pull()
File "/usr/lib/python3/dist-packages/lpbuildd/target/build_snap.py", line 264, in pull
self.run_build_command(
File "/usr/lib/python3/dist-packages/lpbuildd/target/operation.py", line 70, in run_build_command
return self.backend.run(args, cwd=cwd, env=full_env, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/lpbuildd/target/lxd.py", line 736, in run
subprocess.check_call(cmd, **kwargs)
File "/usr/lib/python3.12/subprocess.py", line 413, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['lxc', 'exec', 'lp-jammy-arm64', '--env', 'LANG=C.UTF-8', '--env', 'SHELL=/bin/sh', '--env', 'http_proxy=http://10.10.10.1:8222/', '--env', 'https_proxy=http://10.10.10.1:8222/', '--env', 'HTTP_PROXY=http://10.10.10.1:8222/', '--env', 'HTTPS_PROXY=http://10.10.10.1:8222/', '--env', 'GIT_PROXY_COMMAND=/usr/local/bin/lpbuildd-git-proxy', '--env', 'SNAPPY_STORE_NO_CDN=1', '--env', 'LAUNCHPAD_INSTANCE=production', '--env', 'LAUNCHPAD_SERVER_URL=launchpad.net', '--env', 'SNAPCRAFT_LOCAL_SOURCES=1', '--env', 'SNAPCRAFT_SETUP_CORE=1', '--env', 'SNAPCRAFT_IMAGE_INFO={"build-request-id": "lp-115638100", "build-request-timestamp": "2026-07-10T13:33:56Z", "build_url": "https://launchpad.net/~XXXXX-team/XXXXXX/+snap/XXXXXX-01/+build/3212660"}', '--env', 'SNAPCRAFT_BUILD_ENVIRONMENT=host', '--', '/bin/sh', '-c', 'cd /build/XXXXX-kernel && linux64 snapcraft pull']' returned non-zero exit status 1.
```
Evaluation history
| Date | Model | Scores | Action | Summary |
|---|---|---|---|---|
| qwen3.6-35b-a3b-mtp-q6 |
Impact:
75
Quick Win:
67.5
Staleness:
45
Complexity:
10
Confidence:
85
Support Request:
0
|
keep open | Regression in snapcraft 9: core22 snaps using snapcraftctl in override-build fail validation. Maintainer confirmed as a regression. | |
| qwen/qwen3.6-35b-a3b |
Staleness:
5
Complexity:
50
Confidence:
95
Support Request:
0
|
keep open | Regression in Snapcraft 9 causing build failures for core22 snaps using snapcraftctl. Maintainer confirmed as a regression. | |
| qwen3.6-35b-a3b-mtp-q6 |
Staleness:
0
Complexity:
10
Confidence:
80
Support Request:
80
|
needs triage | Build failure on core22 snap after upgrading to snapcraft 9.0.1. Error explicitly rejects 'snapcraftctl' in favor of 'craftctl'. Issue is fresh, unlabelled, and requires maintainer confirmation of expected behavior. |
Update history
No update history recorded yet.
Related issues
| Issue | Project | State | Summary | Similarity |
|---|---|---|---|---|
| #1990126 "snapcraft help <plugin>" fails with SC7 and core22 in project directory | snapcraft (launchpad) | open | snapcraft help <plugin> validates snapcraft.yaml unnecessarily, failing when core22 extensions are used. Untriaged, 1445 days old, no maintainer engagement. | |
| #4870 snapcraft pack error obtuse on snapd errors | snapcraft | closed | Closed as a duplicate of issue #4548. The snapcraft pack error handling regression affecting core22 and core24 is superseded by the referenced tracking issue. | |
| #5634 Core22 unit tests in snapcraft fails with craft application 5.5.0 | snapcraft | closed | Closed and deferred. The core22 test failure was traced to a validation change in craft-application PR #812. The issue was logged internally as SNAPCRAFT-1188 for tracking. | |
| #1987853 snapcraft terminates override-build script prematurely without error | snapcraft (launchpad) | open | Snapcraft prematurely terminates override-build scripts after core18 to core20 upgrade, with no error output. Untriaged and inactive for over 4 years. | |
| #2099923 Snapcraft builds are failing: install of snap "snapcraft" failed | snapcraft (launchpad) | open | Snapcraft builds failing due to outdated snapd (2.61) on build infrastructure unable to install core20 base. Issue is 556 days old with no maintainer response. | |
| #5983 feat!: error on snapcraftctl | snapcraft | merged | Merged. Introduces a breaking change that errors on snapcraftctl usage in core26+ override scripts and renames all internal references. Legacy binaries are deferred to a follow-up PR, with core22/24 example updates planned for a future release. |