Repository navigation
Open
Labels
enhancementNew feature or requestNew feature or requestparkedOwner parked: not in the current passOwner parked: not in the current pass
Description
Problem
A file-deny-by-default profile stops a process reading what it needs just to start: the dyld shared cache and /usr/lib, /bin, /usr/bin, /System, /Library, /private/etc, parts of /private/var/db, /opt/homebrew, the Xcode command line tools that git and xcrun reach for, and metadata reads on every ancestor of a granted directory (getcwd, realpath). Today's profile is (allow default) because SH §5.2 judged that a deny-default profile "breaks Node and Go toolchains too often to maintain" (comment in internal/sessions/sandbox/sandbox.go, Render). That judgement was made without a measured baseline. #3 cannot ship without one.
Proposal
A spike in the shape of SP2 (plan-broker-and-sessions.md), then a fixed list in code.
- Run each tool below under a profile that denies all file reads and writes, collecting denials from the unified log (
log stream --predicate 'sender == "Sandbox"') orsandbox-execoutput: interactive zsh,git,ssh(client only, no keys granted),curl,node/npm,go,python3, a Homebrew-installed CLI,claude,pi. - Produce the smallest read-only baseline that lets them start. Each entry carries a comment naming the tool that needs it.
- Decide how a granted subdirectory becomes reachable: metadata-only reads on its ancestors (
/Users,~) versus a broader read. Metadata only, unless measurement shows otherwise. - The baseline lives in
internal/sessions/sandbox, is read-only, and applies to every sandboxed launch.
Constraints
- The baseline must not include
~,/Users, or any credential directory. ~/Library/Keychainsis not baseline. SP2 found that denying it logs Claude Code out of a desktop session, so it becomes an explicit read grant on the templates that need it (Seeded claude-code and pi templates: relay model key mapping and sandbox grants #5).
Acceptance
- A table of the tools above with pass or fail under the deny-default profile, kept in
docs/session-host.md. - A live-tier test that starts each available tool under the profile and skips gracefully when one is not installed.
- A test that the baseline does not allow reading a file under
~/.ssh.
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or requestparkedOwner parked: not in the current passOwner parked: not in the current pass
Activity
barelyworkingcode commentedon Sep 25, 2026
Triage: partly done. Re-scoped below.
Done on
main:baselineReadLiteralsandbaselineReadDirsininternal/sessions/sandbox/sandbox.go.~,/Usersand credential directories (TestRender_BaselineIsSystemOnly).TestRender_AncestorsGetMetadataButNotContents).~/.sshis unreadable (TestLive_UngrantedFilesAreUnreadable).Not done:
docs/session-host.mdgives one sentence of tools that passed. There is no per-tool pass/fail table, and it omits npm, a Homebrew CLI, claude and pi./usr/bin/true.Re-scoped problem: the deny-default baseline has no recorded per-tool measurement and no live test per tool.
Acceptance:
docs/session-host.mdfor interactive zsh, git, ssh (client, no keys), curl, node/npm, go, python3, a Homebrew CLI, claude and pi. It records the baseline plus which template grants each tool ran with.//go:build livetest that starts each installed tool under the profile, and skips a tool that is absent.barelyworkingcode commentedon Sep 25, 2026
Parked by the owner on 2026-09-25 as feature work, outside the stability pass. The triage comment above records what remains.