Repository navigation
Adoption hygiene: native Claude Code pin is a floor (2.1.281), ai-memory assistant capture opt-in, ignore Claude Code local state - #159
Conversation
…ory assistant capture is opt-in, ignore Claude Code local state bootstrap-macos.sh's install_native ran `"$bin" install <pin>` even when Claude Code's native auto-updater had already installed something newer, so re-running the bootstrap downgraded it. It now keeps a ~/.local/bin/<bin> whose --version is at or above the pin (logs "Kept", downloads and installs nothing); a missing, older or unreadable launcher takes the unchanged checksum-verified install. The check lives inside install_native because tests/test_adoption_bootstrap.py runs that function on its own. Bash 3.2 safe. Both claude-code pins move to 2.1.281 together (shared components keep one version on both platforms). darwin-arm64 a922981f... comes from the official 2.1.281 manifest.json and matches, byte for byte, the copy the native updater installed on a Mac. linux-x64 56fe3da8... comes from the same manifest and was not re-hashed; fetch() checks it before running anything. 2.1.281 fixes a recursive rm of command-substitution output running unprompted in auto and --dangerously-skip-permissions mode. The macOS page's pin table and the generated new-host grand list follow the pins. The Claude settings template no longer passes --capture-assistant to ai-memory's Stop hook. render_config.py adds it only when AI_MEMORY_CAPTURE_ASSISTANT=true (host value file or --set) and rejects any value other than true, false or empty. defaultMode and skipDangerousModePermissionPrompt are unchanged. .gitignore adds .claude/settings.local.json and .claude/worktrees/. Not included, because open PRs #116, #145 and #151 own these files: the manifests/evidence.json re-hash of the 12 changed files, and the adoption/bootstrap.md "changed after `v2026.09.23.1`" marker for the three changed install inputs. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Records the SHA-256/byte entries for every file this branch changes and adds the "changed after `v2026.09.23.1`" note that the docs-consistency test requires for the new install behavior (pins 2.1.281, floor instead of unconditional reinstall). Both files are also edited by open PRs; whichever lands later re-runs the same host_receipts.register_file helper. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Resolves the manifests/evidence.json conflict with #161 by regenerating the adoption/bootstrap.md entry through scripts/host_receipts.py register_file(). Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
|
Foundation lane here: this PR is in the foundation lane (labelled lane:foundation). It is now conflicting with main (evidence manifest and generated grand-list files moved). Its local worktree on the Mac was last touched around 00:00 EDT at 98ab747, while the remote head is 48297c8. If this is your PR, please claim it on seathatflowsinourveins/agent-ecosystem#28 and rebase it; see the hot-file protocol in the proposed docs/lanes.md. If nobody claims it by 2026-09-25 12:00 UTC, the foundation lane will rebase it from the remote head: resolve manifests/evidence.json by re-registering, regenerate the grand list, re-run validate.py and the adoption tests, then merge. |
…up (#195) Measured on macos-m5pro-20260924 (Apple M5 Pro, 24 GB) on 2026-09-24: - Excluding the gitleaks runaway, processes held 26.84 GiB of footprint plus 3.07 GiB wired on 24 GiB. There were 357.8 GiB of swap writes in 4.81 days, and two Jetsam events (09:45 and 09:46 EDT) killed 405 and then 4,255 processes. - Loading the RAG embedder (qwen3-embedding:4b, 4.09 GiB) leaves 2,079 MB unused with Chrome closed. - The Metal working-set limit is 17.76 GiB, below the 17.67 GiB of the 27B Q4_K_M weights plus any cache. Added: - evidence/artifacts/host-upgrade-20260924/upgrade-evidence.json: the RAM gate, the replacement recommendation (64 GB, M5 Pro) with Apple Store prices read 2026-09-24, and the Mac role. The Mac is the cockpit and coordinator; heavy and always-on lanes run on the WSL2 workstation. It supersedes the projected-64 GB MacBook item of host-upgrade-20260923. - evidence/artifacts/host-upgrade-20260924/foundation-alignment.json: memory, RAG and foundation-layer state on the Mac, the saturation status, and the model candidates. It also records the user's 2026-09-24 license decision and the open items for the replacement Mac. - docs/next-host-stages.md: the macOS role row and upgrade row, and replacement-Mac pickup steps. The pickup steps skip bootstrap-macos launchd agents where the agent-ecosystem services exist, and add the RAM-fit matrix and SSH to the workstation. - manifests/evidence.json: registrations and the updated doc hash. No Mac global state was changed. It has one writer (foundation-lane-setup, agent-ecosystem#28). This leaves the files of #185, #159 and #177 alone. Co-authored-by: seathatflowsinourveins <[email protected]> Co-authored-by: Claude Opus 5.5 <[email protected]>
# Conflicts: # .gitignore # docs/new-host-grand-list.md # manifests/evidence.json
# Conflicts: # manifests/evidence.json
…loor (stacked on #159) (#177) * Adoption hygiene: native Claude Code pin is a floor (2.1.281), ai-memory assistant capture is opt-in, ignore Claude Code local state bootstrap-macos.sh's install_native ran `"$bin" install <pin>` even when Claude Code's native auto-updater had already installed something newer, so re-running the bootstrap downgraded it. It now keeps a ~/.local/bin/<bin> whose --version is at or above the pin (logs "Kept", downloads and installs nothing); a missing, older or unreadable launcher takes the unchanged checksum-verified install. The check lives inside install_native because tests/test_adoption_bootstrap.py runs that function on its own. Bash 3.2 safe. Both claude-code pins move to 2.1.281 together (shared components keep one version on both platforms). darwin-arm64 a922981f... comes from the official 2.1.281 manifest.json and matches, byte for byte, the copy the native updater installed on a Mac. linux-x64 56fe3da8... comes from the same manifest and was not re-hashed; fetch() checks it before running anything. 2.1.281 fixes a recursive rm of command-substitution output running unprompted in auto and --dangerously-skip-permissions mode. The macOS page's pin table and the generated new-host grand list follow the pins. The Claude settings template no longer passes --capture-assistant to ai-memory's Stop hook. render_config.py adds it only when AI_MEMORY_CAPTURE_ASSISTANT=true (host value file or --set) and rejects any value other than true, false or empty. defaultMode and skipDangerousModePermissionPrompt are unchanged. .gitignore adds .claude/settings.local.json and .claude/worktrees/. Not included, because open PRs #116, #145 and #151 own these files: the manifests/evidence.json re-hash of the 12 changed files, and the adoption/bootstrap.md "changed after `v2026.09.23.1`" marker for the three changed install inputs. Co-Authored-By: Claude Opus 5.5 <[email protected]> * Re-hash evidence and mark the Claude Code floor in the bootstrap guide Records the SHA-256/byte entries for every file this branch changes and adds the "changed after `v2026.09.23.1`" note that the docs-consistency test requires for the new install behavior (pins 2.1.281, floor instead of unconditional reinstall). Both files are also edited by open PRs; whichever lands later re-runs the same host_receipts.register_file helper. Co-Authored-By: Claude Opus 5.5 <[email protected]> * Keep a newer native Claude Code on Linux/WSL2: the pin is a floor there too adoption/bootstrap-linux.sh's install_native ran `"$bin" install <pin>` unconditionally, so on a Linux/WSL2 host whose native updater (latest channel) was ahead of the pin, re-running the bootstrap moved Claude Code back to the pin and dropped newer fixes. install_native is now the same function as bootstrap-macos.sh's (#159): a ~/.local/bin/<bin> whose --version first word is a dotted numeric version at or above the pin is kept (nothing downloaded or installed; install_pin logs "Kept installed ..." instead of "Installed ..."); a missing, older, non-numeric or failing launcher takes the unchanged checksum-verified install. Tests: NativeInstallFloorTests in tests/test_adoption_bootstrap.py run the verbatim fetch/install_native/install_pin against a one-pin fixture (curl shimmed; a shasum-backed sha256sum shim only where GNU --check --status is missing), plus an identity check that both scripts share one install_native. Docs: the Linux claude-code install_note describes the floor; bootstrap.md step 2's stale "Linux/WSL2's script and pins are the same at v2026.09.23 as on main" now says what differs at that tag; the claude-code floor notes on bootstrap.md, linux-wsl2.md and macos-arm64.md name the currently pinned release v2026.09.24.1 (#171), which the docs-consistency test requires. Co-Authored-By: Claude Opus 5.5 <[email protected]> * linux-wsl2.md: keep the changed-after marker on one line (docs-consistency) Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> --------- Co-authored-by: seathatflowsinourveins <[email protected]> Co-authored-by: Claude Opus 5.5 <[email protected]> Co-authored-by: Scout <scout@local>
…obed install_pin now records a pin in installed_pin_ids before #177's early return for a kept native launcher, so a Claude Code at or above its 2.1.281 floor is still checked by the version report (minimum match). Pins re-taken from main (2.1.281) with the version_probe declarations re-applied; the linux-wsl2 step keeps both changed-after notes. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
- Step 3 now runs install-hooks with explicit --agent, --config-file and --server-url http://127.0.0.1:49474 for Claude Code and Codex, and keeps this host's capture choices: neither hook set carries --capture-assistant today, and a re-run without it removes the flag. It notes that 49374 is another WSL distro's default on this machine. - Step 2 adds adoption/templates/claude.settings.template.json, whose eight hook commands hardcode tools/ai-memory-2.3.2. - The header says the doc was first written against 720e294 and that #159 (83b6f87) made assistant capture opt-in. - Only GHSA-9pj6 affects the HTTP server; GHSA-9g45 affects the rmcp client used by mcp-bridge, and GHSA-33f5 affects OAuth discovery, which 2.3.2 does not enable (checked against its rmcp features). - The %USERPROFILE% fallback is not Windows-only (#804 reads it on every platform). #859 merged into release/2.5. The overturn condition no longer says "Adopt 2.4.0" and "not 2.4.0" at once. - Adds two default-on changes: the memory_briefing pinned list (#780) and memory_status evidence_rows. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
…ay, Nemotron qualification on the RTX 4090, ai-memory 2.4.0 review (#256) * Re-record the workstation systemd install receipt as the Ubuntu apt package Supersedes nativestack-5975wx-20260925--systemd--install--20260925, whose limitation said systemd was an install under the ecosystem prefix; its independent review is needs_changes. The new -2 generation adds `command -v systemctl` and `dpkg-query -S /usr/bin/systemctl`, keeps the version, package, cgroup-delegation and pin checks, and states that systemd is the Ubuntu apt package 255.4-1ubuntu8.17 at /usr/bin/systemctl. The original file is unchanged. The matrix and the manifest registration are regenerated in the branch's last commit (docs/lanes.md hot-file protocol). Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * Replay the SPY/LEAN parity harness on the RTX 4090 workstation (CPU only) Ran the spy-parity README's bwrap replay on nativestack-5975wx-20260925 with this host's roots (~/.local/share/codex-ecosystem/nautilus-py312 and lean/Lean/Data instead of the README's tools/ paths). run.py exited 0 with the five frozen inputs accepted; every economic field and both normalized economic hashes equal receipt-v2.json (fills 304 @ 323.58 / -304 @ 291.69, distributions 0.00 and 428.64, native end cash 90734.08). compare.py --lean-data on receipt-v2.json on this host: exit 0, PASS, complete, 0 failed, equal to verdict-v2.json except the replay-history check's observed text. On this host's own receipt: exit 1, FAIL, 106/106 execution checks, with the two review preconditions failing by design, since a retry of the reviewed cc4503f harness cannot qualify. The --bars mode gives FAIL on both receipts, because v2 counts its skipped input-rehash check as FAIL; I predicted PASS and kept that wrong prediction. Negative controls: tampered bars and an altered input are both refused. The run is recorded in the blueprint's format: the fresh receipt and verdicts go under evidence/artifacts/workstation-lane-20260925/spy-parity/, the replay is appended to replay-history-v2.json, and the README gets a dated note. The agreed nautilustrader quickstart host receipt is not superseded. Gate G-a and every catalog status are unchanged. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * Qualify Nemotron-3-Embed-1B on the RTX 4090 vLLM service (model-card bar) Supersedes nativestack-5975wx-20260925--vllm--use--20260925 with a -2 generation that keeps its three commands: /version, unit, GPU and pin; /v1/models; and the asserted backup ranking. The new generation adds a qualified_models entry for nvidia/Nemotron-3-Embed-1B-BF16 at revision c0c9fea93ea424587517f2c59e20db9f1d6bf615 on vllm 0.25.0. The requests are read-only HTTP to the running 127.0.0.1:18231; the service was not touched. The bar is the repository's reproducible model-card qualification (docs/hf-memory-model-qualification.md): - hf cache verify of the served directory: 15 files at the revision. A two-file copy passes, and the same copy fails after a one-byte alteration. - NVIDIA's exact /v2/embed Recommended Retrieval example, with only the URL changed, ranks 4/4 intended documents first, max |d| 0.0006 to the card's printed output. - /v1/embeddings with query:/passage: prefixes ranks 4/4, 2048 dims, unit norms, max |d| 0.0005 to the 2026-09-21 laptop scores. - With the documents rotated, the ranking assertion fails (0/4). The 0.005 tolerance and the rotated control were preregistered; the checking script and the preregistration are in evidence/artifacts/workstation-lane-20260925/nemotron-qualification/. The laptop's ai-memory hybrid-retrieval bar was not rerun: its corpus is a private sealed store and its query set is not committed. Its winning arm also needed max-model-len 8192, while this service runs 4096. The matrix, the grand list and the manifest registration are regenerated in the branch's last commit (docs/lanes.md hot-file protocol). Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * Record the ai-memory 2.4.0 release review for the workstation (no upgrade) This read-only review compares the v2.4.0 release (tag 5c4350e3, commit b1b25219) with the 2.3.2 pin: 118 commits and 137 files. Findings: - Two additive migrations, V65 and V66. Both are forward-only, and a 2.3.2 binary or hook fails closed on the migrated store. - rmcp 2.2 fixes three MCP transport advisories. This host serves the HTTP transport on 127.0.0.1:49474. - Several default behaviour changes: access reinforcement, refusal of page writes that collide on case or Unicode normalization, broader capture redaction, and a memory_status scope object. - The new config keys all default to off. - The server, hooks and MCP clients need a coordinated restart. Upstream PR #859 (query/document embedding prefixes) merged after the release, so 2.4.0 does not contain it. The record lists what a later upgrade window must check. No binary, hook, configuration, service or store was changed, and the pin stays 2.3.2. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * Add the independent review of the workstation systemd install -2 receipt An independent headless Claude Code session re-ran all six commands with byte-identical output hashes and appended an independent_session agree (2026-09-25T14:51:57Z). The review is committed exactly as it recorded it. The receipt's catalog_revision, 720e294, is on main. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * Require exactly 0/4 from the Nemotron rotated-documents control preregistration.txt (Q4) says the rotated check "must report 0/4 intended-first and fail its ranking assertion". model_card_check.py v1-rotated exited 0 for any result below 4/4, so a partial 1/4 to 3/4 would have counted as the expected control. It now exits 0 only at exactly 0/4, and prints control_required "0/4". Checked on synthetic rankings: 0/4 exits 0; 1/4, 3/4 and 4/4 exit 1. The independent review of the first recording found this. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * Withdraw the first workstation vLLM use -2 recording to an artifact Its catalog_revision, 66fd7e96, is a local pre-rebase commit. GitHub returns 422 for it, so host_receipts.py validate fails in CI (run 36149652903), and the independent review recorded needs_changes. A receipt is never edited after recording, so the file moves out of evidence/hosts/ unchanged, with both reviews, to evidence/artifacts/workstation-lane-20260925/nemotron-qualification/withdrawn/. The README there quotes the reviewer's reasons verbatim and names the replacement recording. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * Re-record the workstation vLLM use -2 receipt at origin/main 8c7b7f3 Recorded with scripts/host_receipts.py record from a detached worktree whose HEAD was origin/main 8c7b7f3, so catalog_revision is on GitHub. The branch's committed model_card_check.py (with the strict 0/4 rotated control) and preregistration.txt were copied in at the same paths; the fifth command prints their sha256. --supersedes names the #231 original, so record assigned the next free generation, -2. It keeps the original three use commands, the hf cache verify check and its altered-file control, the /v2/embed and /v1/embeddings ranking checks and the rotated control, and adds an OS and WSL version command (Ubuntu 24.04.5 LTS, WSL 2.7.13.0). The claim and bars say that the /v2 run was compared only with the card's printed scores (max |d| 0.0012) and the /v1 run only with the 2026-09-21 laptop scores (max |d| 0.0005). The limitations give the preregistration timing (about 3 minutes before the first recording; the rehearsal ran after it) and say every result was known before this recording. All ten commands exit 0. It carries only the self review and needs an independent_session review. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * Correct the SPY/LEAN host replay record after review - The checkout now names 720e294 instead of 156d9cc7, a local commit that is not on GitHub, in the new replay-history-v2.json entry and in spy-parity-host-replay.json. The first seven history entries are byte-identical, and compare.py's own append check still passes on both receipt-v2.json (extended by 2) and the host receipt (extended by 1). - The record now acknowledges the second wrong prediction: C2 predicted bytes equal to verdict-v2.json (1816835f...) and got 9decd956..., which differs at replay_history_at_comparison. - B2: only no_prior_replay_ran_the_reviewed_harness fails by design. retained_record_before_run fails because the README's run.py command omits --review-record (compare.py:702-704), although review-record-v2-cc4503f.json exists. - The README note says the --bars example exits 1 on both v2 receipts. - The history note no longer says every listed replay is superseded and unreviewed; compare.py compares only `replays`, so the note edit does not affect the append check. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * Correct the ai-memory 2.4.0 release review after independent review - Step 3 now runs install-hooks with explicit --agent, --config-file and --server-url http://127.0.0.1:49474 for Claude Code and Codex, and keeps this host's capture choices: neither hook set carries --capture-assistant today, and a re-run without it removes the flag. It notes that 49374 is another WSL distro's default on this machine. - Step 2 adds adoption/templates/claude.settings.template.json, whose eight hook commands hardcode tools/ai-memory-2.3.2. - The header says the doc was first written against 720e294 and that #159 (83b6f87) made assistant capture opt-in. - Only GHSA-9pj6 affects the HTTP server; GHSA-9g45 affects the rmcp client used by mcp-bridge, and GHSA-33f5 affects OAuth discovery, which 2.3.2 does not enable (checked against its rmcp features). - The %USERPROFILE% fallback is not Windows-only (#804 reads it on every platform). #859 merged into release/2.5. The overturn condition no longer says "Adopt 2.4.0" and "not 2.4.0" at once. - Adds two default-on changes: the memory_briefing pinned list (#780) and memory_status evidence_rows. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * Register the branch's files and regenerate the matrix and grand list Hot-file protocol (docs/lanes.md): manifests/evidence.json starts from main's copy (8c7b7f3), and register_file re-registers the 28 evidence, blueprint and receipt files this branch adds or changes, including the withdrawn vLLM -2 artifact and the re-recorded vLLM -2 receipt. component_matrix.py --write and new_host_grand_list.py --write then regenerated the four reports. The vLLM row no longer shows the withdrawn receipt's dissent, and the grand list gains the Nemotron qualified-model row from the new receipt. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> * Record the independent-session review of the corrected vllm use receipt A separate headless Claude Code session re-ran all ten receipt commands read-only (all exit 0) and recorded agree; the matrix counts for vllm in foundation/semantic-rag move from 3/0/1/0 to 3/0/2/0. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> --------- Co-authored-by: Scout <scout@local> Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
Why
adoption/bootstrap-macos.sh'sinstall_nativealways ran"$bin" install <pin>. On a Mac whose native updater follows the latest channel (now 2.1.281), every bootstrap re-run moved Claude Code back to the 2.1.280 pin and lost 2.1.281's fixes. Per its CHANGELOG, 2.1.281 stops a recursivermof command-substitution output (e.g.rm -rf "$(pwd)") from running unprompted in auto and--dangerously-skip-permissionsmode.adoption/templates/claude.settings.template.jsonput--capture-assistanton ai-memory's Stop hook, so capturing assistant output was on by default. The owner's rule is to keep automatic history capture off..claude/settings.local.jsonand in-repo.claude/worktrees/were not ignored. A Claude Code worktree inside the repo showed up as untracked, sogit add -Acould commit it as an embedded repository.What
The native pin is a floor.
install_nativekeeps~/.local/bin/<bin>when its--versionreports a dotted numeric version at or above the pin, compared field by field (2.1.99 < 2.1.281). In that case it downloads and installs nothing and logsKept installed claude-code <v>. A missing, older or unreadable launcher gets the unchanged checksum-verified install. The check is bash 3.2 safe.Both claude-code pins are now 2.1.281. Shared components keep one version on both platforms (
test_shared_components_keep_the_linux_pinned_version), so Linux moves too. Checksums come from the official 2.1.281 manifest:a922981f6f3b55a251ef9f9dbaa0621a5f99cbcb5ca67f8a797476ccfc83f62656fe3da88458465fb27d7e9299dddb3fead55750fb9c2de795f233b5eea6dce1Both were re-checked independently against that manifest on 2026-09-24, and CI's bootstrap jobs downloaded and verified both binaries. The macOS page's pin table, a floor paragraph and the generated new-host grand list (
scripts/new_host_grand_list.py --write) are updated.Assistant capture is an explicit opt-in. The Stop hook ends at
--server-url http://${AI_MEMORY_URL}${AI_MEMORY_CAPTURE_ASSISTANT}.render_config.pyrendersAI_MEMORY_CAPTURE_ASSISTANT=true(host value file or--set) as--capture-assistant. Absent, empty orfalserenders nothing, and any other value is an error. This is documented in the renderer's--helpand inadoption/README.md.defaultMode: bypassPermissionsandskipDangerousModePermissionPromptare unchanged (the owner's choice)..gitignoreadds.claude/settings.local.jsonand.claude/worktrees/.Evidence and docs contract.
manifests/evidence.jsonis re-hashed for all 13 changed files with the repo'shost_receipts.register_filehelper.adoption/bootstrap.mdstep 2 gains the requiredchanged after `v2026.09.23.1`note.Merge notes
manifests/evidence.jsonis also edited by #116, #145, #151 and #158, andadoption/bootstrap.mdby #145. Whichever lands later should rebase, keep both sides, and re-run the helper for its changed files. Pass each path as a separate argument; a zsh variable holding a newline-joined list is rejected as non-canonical:How verified
validateandvalidate-macos(full suites),bootstrap-linux,bootstrap-macos,bootstrap-macos-brew,secret-scan,verdict-review-gate, CodeQL (6 languages), osv-scanner, dependency-review, token-report and Socket. The 3 skipped jobs run only on main.scripts/validate.py,scripts/validate_convergence.py --all-recorded --root .andscripts/host_receipts.py validateall exit 0.LlamaWrapperQuotingTests. That test fails identically on an untouched checkout of main (8eacd8b), because System Integrity Protection stripsDYLD_LIBRARY_PATHfrom/bin/shon a real Mac. It is pre-existing and not caused by this PR.NativeInstallFloorTests(5 tests, 12 launcher cases, including a real bash 3.2 run and a checksum mismatch that still fails closed) and 3test_render_configcases.shellcheck -S style,bash -nand actionlint 1.7.12 are clean. gitleaks 8.30.1 found no leaks.Notes for the owner
tools/adoption/apply_claude_settings.pynever drops live hooks. A live~/.claude/settings.jsonthat already has the--capture-assistantStop hook keeps it; remove that entry by hand. This Mac's live settings have no such hook.adoption/bootstrap-linux.shstill reinstalls the pin unconditionally. That is out of scope here.adoption/bootstrap.mdsays "Linux/WSL2's script and pins are the same atv2026.09.23as on main". That was already untrue on main before this PR:bootstrap-linux.sh+56 lines andpins-linux-x86_64.json+43/−5 since that tag. It is left unchanged to avoid widening the conflict with Blind lanes round 2: sanitized export, receipt aliases, two-family adjudication #145.🤖 Generated with Claude Code