Repository navigation
Record the own-clone rule for sandboxed runs and the vendor sandbox's side effects - #1129
Open
seathatflowsinourveins wants to merge 3 commits into
Open
seathatflowsinourveins wants to merge 3 commits into
seathatflowsinourveins wants to merge 3 commits into
Conversation
… side effects The command center ruled on 2026-10-15 that a sandboxed Claude Code session runs in its own clone, never in the shared main checkout or one of its worktrees. - The sandbox row's note carries the rule and why. The 2.1.300 sandbox write-protects .git/config, .git/config.lock, .git/config.worktree and its lock, .git/hooks, .git/worktrees and more; bwrap creates an empty read-only placeholder for a missing path; and a worktree's common directory is the main .git. Sandboxed runs in worktrees therefore left .git/config.lock in the shared .git and blocked every lane's git config writes (2026-10-14 23:59:29Z to 2026-10-15 00:50:33Z, and again at 01:04Z). The note also gives the interim removal-with-stat and the 10-minute alert. - The same note records the env-scrub subprocess sandbox: CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1 runs Bash in a bwrap PID namespace with a seccomp filter whatever sandbox.enabled says (CHANGELOG 2.1.98; measured: NSpid 6, Seccomp 2, an outside write still allowed with sandbox.enabled false). That accounts for the "sandbox stayed on" report. - The client-core row watches the 0-byte placeholders left under C:\Program Files\ClaudeCode, among them a file named managed-settings.d. No effect was measured on WSL 2.1.300 or Windows claude.exe 2.1.270; it is re-checked at the next Windows client upgrade. - The practice record gets a 2026-10-15 addendum, and the snapshot label follows the slots file. Tests: a new module pins the three statements on both surfaces a session reads. Against main's rows it fails (2 failures, 1 error). Co-Authored-By: Claude Opus 5.5 <[email protected]>
5 tasks done
The local review of 6a6c3bf (review_output.json 55604e97) found that the correction at docs/decisions/2026-10-09-claude-code-native-practice.md :458-459 cited the lane's working files for its binary offsets and probes. - evidence/artifacts/sandbox-own-clone-20261015/SOURCE-RECORD.md: the 2.1.300 binary pinned by sha256 (674deba0, the signed manifest's linux-x64 checksum) with the three byte offsets re-read at 05:10Z and the bytes found there (the protected-path list, the WSL managed-settings directory, the wslInheritsWindowsSettings schema text); the probe table and the env-scrub probe; the CHANGELOG lines at 94506ff0 (2.1.98 and 2.1.299) and the docs quotes; and what is inference (the bind-to-placeholder step). No session ids. - probe.sh: the probe script as run. - The decision links the record instead of the working files. tests/test_native_practice_sandbox_own_clone.py gains an assertion that failed before this commit; the native-practice modules run 104 OK; validate rc 0. Co-Authored-By: Claude Opus 5.5 <[email protected]>
GPT read of #1129 at efa0b45 (P2): the source record said the GPG check of the signed 2.1.300 manifest was in the floor decision's 2026-10-14 addendum, which this tree does not contain (that addendum is #1128's). The check was re-run 2026-10-15T11:23:49Z and is retained here: release-signature-2.1.300.json, with the public manifest.json, manifest.json.sig and claude-code.asc it verified in release-2.1.300/. Result: good signature from 31DDDE24DDFAB679F42D7BD2BAA929FF1A7ECACE, and the manifest's linux-x64 checksum and size equal the installed binary's (674deba0..., 266972344). The record now cites the receipt. Regression test_the_signature_check_the_record_claims_is_retained_and_binds_the_binary checks: - the record names the receipt, and every decision file it cites contains 2.1.300; - the retained files match their sha256; - the manifest binds the binary. Fail-before: AssertionError: 'release-signature-2.1.300.json' not found. After: 5 OK; the privacy and provenance modules OK. validate reports only the inherited model-currency date checks that main has refreshed. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This branch has not been deployed
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.
Scope
a339425ca56ec3fb87dff0fa8ad5dffc83354168lane:foundation.claude/skills/claude-native-practice/reference/(slots.json, isolation.md, native-clients.md),docs/decisions/2026-10-09-claude-code-native-practice.md, the snapshot label inevidence/artifacts/claude-native-practice-20261009/claude-native-slot-manifest.json, the newtests/test_native_practice_sandbox_own_clone.py,manifests/evidence.jsonSOTA sources
~/.local/share/claude/versions/2.1.300, sha256674deba0…5453, which matches the GPG-verified signed manifest). Around byte offset 110513214, the sandbox's protected list includes/.git/hooks,/.git/config,/.git/config.lock,/.git/config.worktree,/.git/config.worktree.lock,/.git/commondir,/.git/worktrees,/.git/modules,/.git/info/exclude,/.gitmodulesand/.github.94506ff0d3bd9185f1752da36e968775021fb48f, the 2.1.98 entry "Added subprocess sandboxing with PID namespace isolation on Linux whenCLAUDE_CODE_SUBPROCESS_ENV_SCRUBis set". Also https://code.claude.com/docs/en/env-vars (CLAUDE_CODE_SUBPROCESS_ENV_SCRUB).6bfb4f80…). An empty managed settings file counts as{}; amanaged-settings.dthat exists but cannot be read makes sessions exit at startup unless the operating system denied the read. Binary 2.1.300 offsets 216332425 and 216588776 show the WSL path and thewslInheritsWindowsSettingsread.sandbox.enabled: https://code.claude.com/docs/en/settings-reference (sandbox.enabled: defaultfalse; precedence managed >--settings> local > project > user).Evidence-class table
.git/config.lockin the shared.gitand blocked git config writesnative_provengit worktree add -bfailed with "could not lock config file";statof the file (born 2026-10-14T23:59:29Z), recorded and removed at 2026-10-15T00:50:33Z; it re-appeared at 01:04Z during a sandboxed run in a worktree (the running lane's report).gitpathssource_review--settingssandbox.enabledfalse turns the sandbox off; with the env scrub, Bash still runs in a bwrap PID namespace with seccompnative_proven/sbin/init; scrub with off wrote outside the cwd, NSpid 6, Seccomp 2, PID 1 bwrapnative_provenclaude.exe2.1.270doctorand-p, all start past managed settings (01:01Z)synthetictests/test_native_practice_sandbox_own_clone.pyLocal commands run
Decision record
docs/decisions/2026-10-09-claude-code-native-practice.md, addendum of 2026-10-15.Notes for the reads
Fix round 2 (cdee315)
From GPT full1 at efa0b45 (
full1-pr1129/GPT-VERDICT-efa0b45a0.md); the local review at efa0b45 had no findings. Pushed under the command center's standing release rule (2026-10-15).release-signature-2.1.300.jsonholds the receipt;release-2.1.300/holds the publicmanifest.json,manifest.json.sigandclaude-code.ascit verified. Result: a good signature from31DDDE24DDFAB679F42D7BD2BAA929FF1A7ECACE, and the manifest's linux-x64 checksum and size equal the installed binary's (674deba0…, 266972344). The record now cites the receipt.test_the_signature_check_the_record_claims_is_retained_and_binds_the_binarychecks that the record names the receipt, that every decision file it cites contains 2.1.300, that the retained files' sha256 values match, and that the manifest binds the binary. It failed with'release-signature-2.1.300.json' not found.The receipt field holding the signer fingerprint is named
signer_fingerprint: gitleaks' generic-api-key rule flagged it under the namekey_fingerprint, and the hook was not bypassed.Follow-ups
Checklist
🤖 Generated with Claude Code