chore(agent-tools): bump the Claude Code pin 2.1.221 → 2.1.222 — re-verified, worktree posture confirmed live #291
No reviewers
Labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Cloonar/coding-lab!291
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "afk/290"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Moves
CLAUDE_CODE_VERSION+CLAUDE_CODE_SHA256_X64_MUSLtogether with the compat record, in one commit, ascontainers/agent-tools/versions.envanddocs/ops.md § "Agent-tools images"require. No adapter code changed — the re-verification found no drift that needed one.The blocking check passes
2.1.222 broadens worktree isolation to "file edits and Bash in every session type". Every lab session has a linked worktree as cwd, so this could have started refusing
git commit/git pushto the bare origin. It does not.git worktree add, so.gitis a file): an interactiveclaude --permission-mode auto --model haikuwrote a file, committed, and pushed. Verified in the bare origin (worktreeHEAD==refs/heads/afk/probe), not from the model's narration. Dialog sequences byte-identical to 2.1.221; no new prompt, refusal, or isolation language. A subagent doing the same was verified on disk too.--git-dirredirect is refused on 2.1.222 underclaude --worktree("…a worktree-isolated session's git operations must target its own worktree") and succeeds on 2.1.221 — the changelog's bug and fix, reproduced in both directions.isolationRoot ?? agentWorktree, whereisolationRootresolves throughBg()?.worktreePath— a record only Claude Code's own worktree flows set (--worktree/-w,/fork,WorktreeCreate, Agent-toolisolation:"worktree"). It is never derived from cwd or from.gitbeing a file, so lab's externally-created worktrees never arm it.Verification actually run
manifest.json2.1.222 (Claude Code)— via the loader the deployed image bundles at/opt/lab/lib/ld-musl-x86_64.so.1, the same proofContainerfile.claude's pre-patch sanity run makesPostToolUsedeletes it, additive merge proven--helpdiff is one added line (import, unused by lab); 12/12 subcommand helps byte-identical;--permission-modestill acceptsauto;--effortvalues unchanged; model catalog byte-identicalgo test ./...golangci-lint run ./...gofmt -l§9 needed its own probe because the live recipe suite never wires the dialog spool — that gap is now recorded in the doc so the next sweep doesn't assume coverage it doesn't have.
Corrections this pass makes
ultraplanpremise is wrong. "Removed ultraplan feature" is not observable in the bundle — the row is still present and identical, gated by a remote-config flag,grep -creturning 220 on all three artifacts. So a registry row-count drop is not a valid extractor-freshness check. The embeddedVERSION/GIT_SHApair is, and it matches the manifest'scommit.ultraplanwas never pinned, so nocommands.goedit either way.helpsat behind a resync failure in the older extractor. Offered with its evidence, not asserted as proof. Same count on both versions, so the A/B answer is unaffected.feedbackalias is a misattribution —feedbackhas no aliases;aliases:["share"]belongs to the separate, unpinnedbugrow.doctorcarries an undocumentedcheckup. Both pre-existing and identical on 2.1.221.Not done, and why — please read before merging
masterConfigDir()there resolves to an injected consumer snapshot, so the forge-and-poke recipe would rotate the shared OAuth family from a snapshot and invalidate the master plus every sibling instance — exactly the failure the credential-authority seam exists to prevent. An operator must run it on the lab host. Unchanged by this bump.tool_useflush A/B; the §2 deep-link live capture; thepermission_promptNotification variant (onlyidle_promptdriven); and the changelog's PreToolUse auto-allow/background-task fix, which left no distinguishing string literal in the bundle and so is unsettled by static extraction.Also worth knowing
The new
SendMessageclassifier gate isEjs(e){return e==="auto"||e==="plan"&&GB()}—autois lab's spawn mode, so that dispatch path now goes through the classifier rather than an unconditional allow. Defence in depth; no lab-side change.Closes #290
[autoland] verdict: pass
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.