Repository navigation
feat(rootless): the CONTAINERD.md §4 checklist, the rootless units, and a fatal nerdctl-full checksum - #12
Merged
Conversation
…nd a fatal checksum The candy installed the rootless binaries but carried none of the CONTAINERD.md §2/§4 checklist, promised rootless containerd/buildkit units that no plan step wrote, and made the nerdctl-full checksum advisory: the release publishes one SHA256SUMS file, so the per-asset `.sha256sum` fetch 404'd and `|| true` hid it. - per-distro uidmap helpers (shadow/uidmap/shadow-utils), the user D-Bus, containerd explicitly, `user:100000:65536` in /etc/subuid and /etc/subgid, the user@.service delegation drop-in, and slirp4netns pinned as the network driver; - the rootless containerd/buildkit user units written from the upstream setuptool templates (ExecStart via /usr/bin/env, so one unit serves both install prefixes); - ONE written checksum verifier (no --ignore-missing, no || true) plus a negative check that proves a corrupted archive is rejected; - the CNI plugins linked at the ONE cni_path the toml declares (/opt/cni/bin): the tarball extracts to /usr/local/libexec/cni, Arch's package installs to /opt/cni/bin, and no per-distro cni_path is needed; - `namespace = "default"` replaces the retired `charly` value; - check-nerdctl-rootless: a disposable Fedora VM bed in the absence/perform/presence shape (linger, daemon-reload, the setuptool over the written units, `nerdctl info` rootless, the helpers, /dev/fuse, the units active), with the daemon-safety proof that the daemon's namespace socket is the USER socket by device:inode and that the host system socket's inode/mtime is unchanged; - the bed image declares its fedora distro chain: without it img.DistroDef is nil and no declarative package install is emitted at all. Closes #10 Closes #11 Agent: containerd-crabbox-program/w4c3 · session 8b1c01cf-7f79-4a75-bff8-240415a06208 Assisted-by: Claude Code deepseek-v4.1-flash:cloud (fully tested and validated)
Review — PASSI re-derived every claim in the body against the current diff and the (empty) comment thread. Body honesty / arithmetic
Correctness / tests
Security / scope
Non-blocking observations
No derivable defect rises to blocking; the body's evidence is consistent with the diff and the tests are real. Verdict: PASS ollama-cloud/deepseek-v4.1-flash — action-review. |
This was referenced Oct 22, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Head
cbb6ba33791477cd33088a9731aa9a060d43f3c8· tree455802a09784b0a40440f8d11f2e5beccf6d9aa1· 7 files, +682/−55.The candy installed the rootless binaries but carried none of the CONTAINERD.md §2/§4
checklist, promised rootless containerd/buildkit units that no
plan:step wrote, and madethe nerdctl-full checksum advisory. Both halves of #10 are closed
here, together with the checklist itself (#11).
newuidmap/newgidmapare declared per distro (shadowon Arch/Alpine,
uidmapon Debian/Ubuntu,shadow-utilson Fedora),containerdisdeclared explicitly, and a plan step writes
user:100000:65536to/etc/subuidand/etc/subgidfor the uid-1000 user. The step resolves the name from the UID rather thanhardcoding
user./etc/systemd/system/user@.service.d/delegate.confcarries
Delegate=cpu cpuset io memory pids;dbus/dbus-daemon/dbus-user-sessionisinstalled for the
dbus.socketthe rootless unit requires.~/.config/systemd/user/containerd.serviceandbuildkit.servicefrom the upstream setuptool templates.ExecStartgoes through/usr/bin/envso one unit serves both install prefixes (/usr/local/binfromnerdctl-full,
/usr/binfrom the distro packages), and the file carries a candy markerthe checks assert.
CONTAINERD_ROOTLESS_ROOTLESSKIT_NET=slirp4netns.pastaandbypass4netnsaredocumented from their measured state instead of being recommended, and
net.ipv4.ip_unprivileged_port_startis a documented option, never forced.SHA256SUMSfile, not per-asset.sha256sumfiles, so the old${url}.sha256sumfetch 404'd and|| truehid it. Onewritten verifier (no
--ignore-missing, no|| true) now checks the archive against theextracted line, and a negative check proves a corrupted archive is rejected.
plugins to
/usr/local/libexec/cni, butnerdctl.tomlnames/opt/cni/bin; a step linksevery real plugin at the ONE declared path, and a check asserts the five the conflist names
resolve. (Arch's package already installs there; the tarball did not.)
namespace = "default"replaces the retiredcharlyvalue innerdctl.toml; thecharlyCNI network name stays (it names a network, not a containerdnamespace).
check-nerdctl-rootlessis a disposable Fedora VM bed (the tarball arm — itproves the CNI-path fix end to end) whose candy is applied by the
VM deploy's own
add_candy:(not a nestedlocal:member — see the filed plugin-check pinissue), in the three-step shape:
ABSENCE (no rootless daemon, the system socket recorded), PERFORM (daemon-reload,
linger,
containerd-rootless-setuptool.sh install+install-buildkit), PRESENCE(
name=rootlessinnerdctl info, helpers resolve,/dev/fuseopens, units active,slirp4netns is the driver, a memory-limited container runs). PERFORM starts the
candy-written units through systemd and waits for
nerdctl infobefore running thesetuptool: the installer gives a unit three seconds, which a cold guest can exceed, and a
slow start must report the unit's journal rather than an opaque exit. The daemon-safety proof
asserts the daemon's namespace socket is the USER socket by device:inode across
/proc/<pid>/root, that the host system socket is a different object or absent, andthat its inode/mtime is unchanged before/after.
distro: ["fedora:43", fedora]img.DistroDefis nil and the generator emits no declarative package installs, so thecandy's package arms did nothing. The first run's
command -v dbus-daemonfailure ishow that surfaced.
/image/is ignored: the VM bed renders a disk + seed there.How tested
Gate on the committed tree (
cbb6ba3), with a fresh worktree-local charly build (2026.295.1709,scripts/bootstrap-charly.shfromcharlyorigin/main— the umbrella's older2026.293.1809binary predates the sdk repo-root skill reader and cannot render thisrepo):
The 4 skips in
check boxare the three mutatingrun:steps (verify-only mode) and thecontext: [runtime]/dev/fusestep;charly check runexecutes them at deploy-add.check-live/check-live-rebuildprinted23 steps: 20 passed, 0 failed, 3 skipped.The 3 SKIPs are the candy's three MUTATING
run:steps (tarball install, subuid write,CNI link) under
charly check live's verify-only mode;charly check runexecuted them atdeploy-add, and every PRESENCE assertion that depends on them PASSED (subuid range,plugins at
cni_path,nerdctl version).summary.ymlreportserrors: 0, warnings: 0(
allowlisted: 11, alldev-worktree-binary-notice).Artifacts verified inside the built image beyond the checks:
shadow-utils-4.18.0,dbus-daemon-1.16.2,slirp4netns-1.3.1,fuse-overlayfs-1.13installed; the units under/home/user/.config/systemd/user/;namespace = "default".Rulebook compliance
DistroDef, the wrong/opt/cni/binpath, and the first bed run'sname=rootlessspelling were eachroot-caused before the fix; all are fixed. An Arch venue needed a pacman
IgnorePkgkernel hold to survive its full upgrade, and that hold printed an unallowlisted
ignoring package upgradewarning; the bed now runs a Fedora guest, whose dnf installkeeps the running kernel's modules — no hold, no warning, and the tarball arm is what
gets proven.
units are written once for both install prefixes.
charlynamespace value is deleted, proven by the claim-keyed grep inthe PR (only the check that asserts its absence matches).
fails without the units, the helpers, the subuid entries and the daemon.
not used.
nested-pod posture gate.
Change classification
Runtime change (candy install steps + a new VM R10 bed):
charly box validate(0/0), thebuild,
charly check boxandcharly check run check-nerdctl-rootlesson a disposabletarget.
Filed issues
charly/go.modpins plugin-checkv0.2026293.1223, whichpredates the merged fix(check): build a nested child's deploy key from its root plugin-check#128 fix: a non-namespaced nested bed member
(
root.member) is rewritten toroot/memberand cannot deploy. Non-blocking herebecause the bed applies the candy through the VM deploy's own
add_candy:instead.Closes #10
Closes #11
Agent:
containerd-crabbox-program/w4c3· session8b1c01cf-7f79-4a75-bff8-240415a06208Assisted-by: Claude Code deepseek-v4.1-flash:cloud (fully tested and validated)