Every rootfs on the fleet had sat on Claude Code 2.1.223–2.1.226 since August while the container tier moved to 2.1.276, and nothing recorded either. GLM and Kimi exist only as microVM backends, so "have we upgraded GLM and Kimi" is this change and the rebuild it drives. Pins. All four agent-* images pin 2.1.276 — as separate ARGs, since Docker has no include and each file has to stay reproducible alone — and scripts/fc-build-rootfs.sh refuses to build if they disagree, naming the odd one out. They had already drifted (claude 226, the rest 223) under comments saying "same version on purpose". Between 2.1.226 and 2.1.276, 2.1.265 and 2.1.275 each broke every turn on ANTHROPIC_BASE_URL endpoints, which is how glm and kimi reach `claude` inside a VM; the container-tier verification never exercised that path, so the VM runs on those backends are the real test. Provenance. `VmOutcome` carries the rootfs the node reported booting and the guest's own `claude --version`; `launch_microvm_phase` persists both as `checkpoint.vm` beside `records` (the two readers parse only `records`) and names them in its log line. "Which image and CLI did this mission run on" is a query now. Independence. `evaluator` derived the implementer family from a constant `"anthropic"`, true while every backend was Claude on Anthropic. With glm and kimi rootfs it made a glm mission judged by glm:glm-5.3 read as `independent = true` — the one claim that path exists to make honestly. `implementer_family(missions.backend)` mirrors `microvm_credential_for`; the subscription judge is now independent exactly when the agent did NOT run on Anthropic. Harness. `verify-mission-delivery.sh glm|kimi` run the microvm scenario on each backend and add the proof the mission itself cannot give: the placed node's journal must show the VM dialling that provider's host, never being denied it, and dialling nothing else but the forge — a model's self-report is measured worthless here. `assert_cli_version` reads checkpoint.vm. The stale scratch-repo default (dead since the 09-14 wipe) is the re-synced id. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01WZb5A2kfVfjpdwSochkuHz
56 lines
3.0 KiB
Docker
56 lines
3.0 KiB
Docker
# Plan A6, first of three: one image per agent CLI, independently versioned.
|
|
#
|
|
# Everything shared lives in agent-toolchain (git, node, rust, scanners, tea).
|
|
# This layer is only the CLI and its env contract, so bumping Claude Code does
|
|
# not rebuild 3 GB of toolchain and cannot disturb agent-kimi / agent-glm.
|
|
#
|
|
# Build (on the node that will run it — see agent-toolchain for why this is not
|
|
# in AGENT_IMAGES):
|
|
#
|
|
# ssh osobh@tank "cd ~/clawmates && \
|
|
# docker build -f images/agent-toolchain/Dockerfile -t clawmates/agent-toolchain:dev images/agent-toolchain/ && \
|
|
# docker build -f images/agent-claude/Dockerfile -t clawmates/agent-claude:dev images/agent-claude/"
|
|
#
|
|
# Then turn it into a microVM rootfs and prove a VM boots from it:
|
|
#
|
|
# scripts/fc-build-rootfs.sh osobh@tank clawmates/agent-claude:dev claude 8G
|
|
FROM clawmates/agent-toolchain:dev
|
|
|
|
# Pinned: an unpinned `npm i -g` makes the image's behaviour depend on the day
|
|
# it was built, and a mission that regresses would have no version to compare.
|
|
#
|
|
# 2.1.223, up from 2.1.220, for one reason that matters to how we use subagents:
|
|
# 2.1.222 "Fixed PreToolUse auto-allow hooks bypassing tool restrictions in
|
|
# background agent tasks". Subagents run in the background by default since
|
|
# 2.1.198, and our `verifier` role's whole guarantee is a TOOL RESTRICTION — no
|
|
# Edit, no Write — so on 2.1.220 the one property we rely on was the one the bug
|
|
# could undo. 2.1.221 also fixes `--mcp-config` servers not connecting before the
|
|
# first turn in print mode, which is exactly the mode we run and will matter when
|
|
# the MCP door reaches a VM.
|
|
# 2.1.276, 2026-09-18. Between 2.1.226 and here, 2.1.265 and 2.1.275 each broke
|
|
# every turn on ANTHROPIC_BASE_URL endpoints (HTTP 400) — the path the glm and
|
|
# kimi images use — and 2.1.276 is the first version after both that is fixed.
|
|
# All four agent-* images pin the SAME version; scripts/fc-build-rootfs.sh
|
|
# refuses to build if they drift. Bump them together, on purpose, and run a
|
|
# mission on each backend before promoting (see deploy/clawmates-runtime/Dockerfile
|
|
# for the same rule on the container tier).
|
|
ARG CLAUDE_CODE_VERSION=2.1.276
|
|
RUN npm install -g "@anthropic-ai/claude-code@${CLAUDE_CODE_VERSION}" \
|
|
&& npm cache clean --force \
|
|
&& rm -rf /root/.npm \
|
|
&& claude --version
|
|
|
|
# The CLI reads its credentials from $HOME/.claude. On the container path HOME is
|
|
# /zeroclaw-data because the daemon owns it; here there is no daemon, so HOME is
|
|
# just root's home. Credential injection (B4.4) writes into this directory over
|
|
# vsock at VM start so the credentials live and die with the VM and are never
|
|
# baked into the image.
|
|
ENV HOME=/root \
|
|
CLAWMATES_AGENT_CLI=claude
|
|
RUN mkdir -p /root/.claude
|
|
|
|
# No ANTHROPIC_API_KEY, and none is accepted: this backend authenticates by
|
|
# subscription via CLAUDE_CODE_OAUTH_TOKEN. An API key present in the
|
|
# environment silently overrides the subscription OAuth (fixed once already,
|
|
# task #16) and would bill per-token against a plan we already pay for.
|