docs: v0.62 sharing levers, a what-Paddock-touches page, and a full-site audit - #703
Merged
Conversation
…uches The release that split one Claude-home lever into five independent keys had no What's New entry, and no page answering the question every incident behind it was really about: what does this thing actually read and write on my machine? The entry leads with the action rather than the mechanism. `instructions` defaults to `own`, so a curated ~/.claude/CLAUDE.md stops reaching agents on the CLI paths — and the startup notice that says so is written at `info`, which the npx launcher's quiet default filters out. Nobody is going to be told, so the docs have to be what tells them. Adds the `Reading older entries` aside the house style assumes exists, and marks 0.61.1's `--isolated-claude-home` advice as superseded rather than rewriting the entry. Co-Authored-By: Claude <noreply@anthropic.com>
"Sharing your Claude Code state" listed transcripts, credentials, instructions and hooks, and omitted claude.mcpServers — which shipped alongside them. Adds it, plus a line for the sibling top-level mcpServers: block, which is the answer for an instance whose machine has no servers to borrow. Help text only. Co-Authored-By: Claude <noreply@anthropic.com>
An audit of all 48 pages against packages/server/src. The corrections, in rough order of blast radius: - The transcript home is <dataDir>/claude-home/projects/<enc>, not ~/.claude/projects/<enc>. Eight pages said the latter, including two giving operators a volume path to persist, and the storage figure. - A released chat under transcripts: host is still LISTED. config-file.md said it leaves the list; a passing test in the shipped code asserts the opposite (#693). - config-file.md said Paddock names the instructions key at startup so "you are told where". That notice is level info and the npx launcher sets LOG_LEVEL=warn, so on the common path it is filtered out. - README and NPM-README's docker run snippets omit PADDOCK_DANGEROUSLY_ALLOW_OPEN=1 and cannot start: the image binds 0.0.0.0, auth defaults to none, and the bind guard refuses. NPM-README also published on a routable address. - Dangling citations: ensureKeeperModel and KEEPER_DEFAULT_MODEL do not exist (ensureAgentModel / DEFAULT_MODEL); cfg.keeperDriveMode is cfg.driveMode; a config example used the pre-0.50 keeperDriveMode key. - overview.md warned that QueuedMessageStore's key separator is a space "unlike the others". It is NUL, like the others. Callout deleted. - environment.md claimed the Management API has no PADDOCK_* variables of its own. PADDOCK_MANAGEMENT_TRUSTED_PROXIES exists and was undocumented. - "hooks" now means two unrelated things; concepts/ and reference/ hooks pages now disambiguate from claude.hooks. - agent-capabilities said no config changes the toolset. Two keys widen it. - instance-settings omitted the five lever rows, and the deliberate absence of a row for the secret-bearing mcpServers: block. - self-mcp did not say paddock/paddock_manage are reserved names. Co-Authored-By: Claude <noreply@anthropic.com>
…ntee page #702 merged while this branch was open. env:VAR_NAME keeps a declared MCP server's credential out of the git-tracked config file; under driveMode: batch it does not keep it out of `ps`, because the engine serialises the whole definition into a --mcp-config argv element and /proc/<pid>/cmdline is world-readable. The default driveMode: session passes the record in-process, where the server gets its env owner-readable — what Claude Code itself does. #702 documented this on config-file.md. Three other places I had written the unqualified "tokens stay out of the file" claim now carry the limit too: the 0.62 What's New entry, the new what-Paddock-touches page (which gains a short section on credentials you hand Paddock), and the CLI --help. Documented as a property of driveMode: batch, not as a Paddock bug — the fix is upstream, and #702 ships a characterisation test that will fail if herdctl learns to pass --mcp-config as a file path. Co-Authored-By: Claude <noreply@anthropic.com>
Deploying paddock with
|
| Latest commit: |
a6cb606
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://16c0181a.paddock-7u2.pages.dev |
| Branch Preview URL: | https://docs-062-claude-sharing-leve.paddock-7u2.pages.dev |
Merged
edspencer
added a commit
that referenced
this pull request
Aug 6, 2026
…les (#707) The `claude.instructions: own` boot notice names which of the user's ~/.claude instruction files are not being loaded and which key turns them back on. It was written at `info`, and `cli/paddock.ts` sets LOG_LEVEL=warn unless `--verbose` — so on `npx @edspencer/paddock`, the documented install path, the one population the notice exists for never saw it. Raising it to `warn` is safe because the notice is already conditional on `present.length > 0`: it fires only when the user actually has files that are being withheld. An empty ~/.claude, or `instructions: host`, stays silent. Docs: #703 hedged around this in prose (config-file.md's "you will probably not be told" caution, and getting-started.md's `--verbose` advice). Those hedges are now stale for this notice only — the other `info`-level boot notices still need `--verbose`. Closes #706 Co-authored-by: HomeLab Agent <homelab-infra@valfenda.net>
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.
Docs for v0.62.0 — the release that split Paddock's single Claude-home lever into five independent keys (#691) — plus an audit of the whole site against
packages/server/srcata809cd5.Verified against the tree at
a809cd5(v0.62.0) with@herdctl/core5.29.1 installed. #702 was open and unmerged while I worked; I documented what is true onmaintoday, which means the--mcp-configargv exposure warning #702 adds is not described here. #700 (plugin-provided MCP servers) is not documented at all — it does not work.The plan
Audited: all 48 doc pages under
website/src/content/docs/**, plusREADME.md,packages/server/NPM-README.md, the CLIUSAGEstring, andastro.config.mjs. Three parallel audits (concepts+architecture / configuration+reference / using+guides+READMEs), each establishing ground truth from source rather than from the changelog.Two judgement calls the brief asked me to make explicitly:
configuration/config-file.mdalready covers all five keys in real depth, and it is genuinely good; a second reference page would duplicate and drift. But the question the incidents were about had no home, so I addedguides/what-paddock-touches.md: a file-by-file table of what is read, written and never opened by default, the one write Paddock ever makes outside its data dir, what--heredoes and does not decide, and two commands to verify the claim rather than trust it. Filed under Security in the sidebar, since that group is already "what a turn can do".whats-newshould say what you must do. It leads withinstructions: hostas an action, not with the mechanism — see correction 2 below for why that matters more than it looks.Changed, and why:
whats-new.mdxReading older entriesaside the house style assumes exists but which was absent, and a supersession note on 0.61.1's--isolated-claude-homeadviceguides/what-paddock-touches.mdcli/args.tsUSAGEmcpServerswas missing. Changeset includedREADME.md,NPM-README.mdclaude:block absent from README config; NPM-README listed 4 of 5 leversconfiguration/config-file.mdkeeperDriveModekey in the exampleconfiguration/environment.mdconfiguration/instance-settings.mdmcpServers:omission were undocumentedarchitecture/overview.md,herdctl-and-paddock.mdx,concepts/{chats,projects,agents}.md,guides/{kubernetes,dev-box-flavor}.md,contributing/testing.md~/.claude/projects/<enc>as the transcript home; dangling citationscomponents/diagram/StorageDiagram.astroconcepts/hooks.md,reference/hooks.mdguides/agent-capabilities.md,guides/securing.md,guides/untrusted-content.mdreference/self-mcp.mdpaddock/paddock_manageare reserved namesusing/working-in-chats.mdhostwas documented nowhere user-facinggetting-started.md--verboseis worth one run (correction 2)Deliberately left:
guides/connect-claude-code.md— not rewritten. I expected this to be the stalest page on the site. It isn't: it is about the outbound/mcpManagement API and has nothing to do with host-state sharing. Every claim spot-checked againstroutes/mcp.ts/management-*.tsstill holds. Added one disambiguating note at the top, because the title is what misleads.configuration/chat-recovery.md,reference/{api,mcp,websocket,schedules}.md,concepts/{workspaces,schedules,sweeper,provenance}.md,guides/{deploying,home-lab,proxmox-lxc,who-its-for}.md,using/*(bar one) — audited, found correct and current, unchanged.docs/— the stale fork.README.mdlinked into it; I repointed the config link to the site but did not touch the fork itself (docs/ and website/ are unsynced forks that have drifted two epics apart; docs/API.md is superseded by the OpenAPI spec #557 owns that).What the docs claimed and the code contradicts
This is the part worth reviewing. All verified from source, not inferred.
A released chat is still listed.
config-file.mdsaid that undertranscripts: host, deleting "releases it — the chat leaves your list". It does not leave the list.deleteSessioncallsunadoptSession, which drops the adoption record, and the engine rediscovers the transcript structurally on the next listing. There is a passing test in the shipped code asserting exactly this (delete-chat-host-transcripts.test.ts, "does NOT yet remove it from the list (the tombstone is still owed)"), tracked as A chat deleted in a Claude home Paddock doesn't own is released but still listed #693. The page written by the release PR claimed the intent was honoured.The
instructions: ownstartup notice is invisible on the documented install path.config-file.mdsaid Paddock "names the key at startup … so the fix is one line and you are told where". The notice islevel: "info"(claude-home.ts), andcli/paddock.tssetsLOG_LEVEL=warnunless--verbose. So onnpx @edspencer/paddock— the primary documented path — it is filtered out. A server run (LOG_LEVELdefaultinfo) does show it. This is why the What's New entry carries the warning instead of deferring to the notice.README.mdandNPM-README.md'sdocker runsnippets cannot start. The image setsHOST=0.0.0.0(Dockerfile:65), auth defaults tonone(config.ts:827), nothing setsPADDOCK_DANGEROUSLY_ALLOW_OPEN, andevaluateBindSafetyreturnsrefuse. The container exits.getting-started.mdandguides/deploying.mdboth have the flag — the READMEs were the outlier. NPM-README additionally published-p 4000:4000on a routable address.overview.md'sQueuedMessageStorenote is inverted. It warned the key separator is "a space, not the NUL byte the others use — a benign inconsistency". It is a NUL, identical to the other four sidecars. The callout warned contributors about an inconsistency that doesn't exist; deleted.environment.mdsaid the Management API has noPADDOCK_*variables of its own.PADDOCK_MANAGEMENT_TRUSTED_PROXIESexists (management-config.ts:255, env wins over file) and appeared in no table on the every-env-var page. Two other pages already documented it correctly.Three dangling code citations.
ensureKeeperModel(0 hits — it'sensureAgentModel),KEEPER_DEFAULT_MODEL(0 hits — it'sDEFAULT_MODEL), andcfg.keeperDriveMode(it'scfg.driveMode).overview.mdcontradicted its own sequence diagram, which already saidensureAgentModel. A config example also used the pre-0.50keeperDriveMode:key, which the loader silently ignores.agent-capabilities.mdsaid no Paddock setting changes the toolset. Two v0.62 keys widen the allow-list bymcp__<name>__*— they have to, or both would be no-ops with no error.contributing/testing.mddescribed a deleted guard (the Paddock should own its Claude home; ~/.claude should be read-only #620 refuse-to-migrate-out-of-an-unowned-home branch, removed by Design: independent levers for what Paddock shares with the host's Claude Code (transcripts / credentials / MCP / instructions / hooks) #691) and said the fakeclauderesolves~/.claude, when it resolvesCLAUDE_CONFIG_DIRfirst.One correction to the brief itself
The brief says the
instructions: owndefault "will silently drop their curatedCLAUDE.md". That is true only on the CLI paths — the sweeper, triggers, anddriveMode: batchchats. On a default SDK chat turn those files were already inert before v0.62: herdctl'ssdk-adapter.jssetssettingSources = ["project"]for any agent with aworking_directory, which is every Paddock keeper, so the Claude home'sCLAUDE.md/agents/commands/settings.jsonare never loaded there. I verified this in the installed bundle (sdk-adapter.js:139-150, andcli-runtime.js:152passing--setting-sourcesonly when an agent declares it) rather than taking #697's word for it. The What's New entry states both halves; writing the simpler version would have been the confident-and-wrong outcome this effort keeps producing.Caveat I can't close: the box has
@herdctl/core@5.29.1installed against a declared^5.31.0. That behaviour is verified for 5.29.1; #697 reached the same conclusion by live probe against the SDK.Verification
cd website && npm install && npm run build— passes, exit 0,50 page(s) built(baseline before this PR: 49; +1 is the new page).npm installworks fine under the box'sNODE_ENV=production, aswebsite/CLAUDE.mdsays.dist/, including anchors — each fragment checked against theid=attributes actually emitted by the target page.astro.config.mjs; every sidebar entry resolves to a real page.claude:inside a description). The second turned out to be a stale incremental content cache — a cleanrm -rf .astro distbuild is warning-free. Worth knowing, because the warning text implies a content problem.cli-paddock.test.ts+config.test.ts: 131 passed. These initially showed 3 failures caused by this box leaking 20PADDOCK_*vars into the suite; green with the list derived fromenvand unset. Unrelated to this change.192.168.hit is pre-existing prose about proxies).I have not run E2E locally:
npm run buildat the repo root fails on the pre-existingreapChatSessiontypecheck error from the@herdctl/coreversion skew above, which is present onmainuntouched. CI installs fresh — status in the checks below.🤖 Generated with Claude Code