docs(01-01): complete nix flake and sandbox script plan
This commit is contained in:
parent
26bdf368b5
commit
14642eb32e
4 changed files with 161 additions and 63 deletions
|
|
@ -7,27 +7,27 @@
|
||||||
|
|
||||||
### Sandbox Core
|
### Sandbox Core
|
||||||
|
|
||||||
- [ ] **SAND-01**: Wrapper script produces a `claudebox` binary via Nix `writeShellApplication`
|
- [x] **SAND-01**: Wrapper script produces a `claudebox` binary via Nix `writeShellApplication`
|
||||||
- [ ] **SAND-02**: bwrap sandbox starts with `--clearenv` — empty environment, only explicitly allowed vars pass through
|
- [x] **SAND-02**: bwrap sandbox starts with `--clearenv` — empty environment, only explicitly allowed vars pass through
|
||||||
- [ ] **SAND-03**: Environment allowlist includes only: HOME, PATH, TERM, EDITOR, LANG, LC_ALL, NIX_SSL_CERT_FILE, SSL_CERT_FILE, ANTHROPIC_API_KEY, USER, SHELL, XDG_RUNTIME_DIR
|
- [x] **SAND-03**: Environment allowlist includes only: HOME, PATH, TERM, EDITOR, LANG, LC_ALL, NIX_SSL_CERT_FILE, SSL_CERT_FILE, ANTHROPIC_API_KEY, USER, SHELL, XDG_RUNTIME_DIR
|
||||||
- [ ] **SAND-04**: Filesystem starts as tmpfs root — nothing from host is visible unless explicitly mounted
|
- [x] **SAND-04**: Filesystem starts as tmpfs root — nothing from host is visible unless explicitly mounted
|
||||||
- [ ] **SAND-05**: CWD is bind-mounted read-write inside the sandbox
|
- [x] **SAND-05**: CWD is bind-mounted read-write inside the sandbox
|
||||||
- [ ] **SAND-06**: `/nix/store` is mounted read-only inside the sandbox
|
- [x] **SAND-06**: `/nix/store` is mounted read-only inside the sandbox
|
||||||
- [ ] **SAND-07**: Nix daemon socket (`/nix/var/nix/daemon-socket`) is bind-mounted for `nix shell` / comma to work
|
- [x] **SAND-07**: Nix daemon socket (`/nix/var/nix/daemon-socket`) is bind-mounted for `nix shell` / comma to work
|
||||||
- [ ] **SAND-08**: `~/.claudebox` on host is bind-mounted as `~/.claude` inside the sandbox
|
- [x] **SAND-08**: `~/.claudebox` on host is bind-mounted as `~/.claude` inside the sandbox
|
||||||
- [ ] **SAND-09**: Secret paths are never mounted: `~/.ssh`, `~/.gnupg`, `~/.aws`, `~/.config/gcloud`, age key paths, `/var/lib/tailscale`
|
- [x] **SAND-09**: Secret paths are never mounted: `~/.ssh`, `~/.gnupg`, `~/.aws`, `~/.config/gcloud`, age key paths, `/var/lib/tailscale`
|
||||||
- [ ] **SAND-10**: PATH inside sandbox contains only Nix store paths: coreutils, git, curl, jq, ripgrep, fd, nix, comma, bash
|
- [x] **SAND-10**: PATH inside sandbox contains only Nix store paths: coreutils, git, curl, jq, ripgrep, fd, nix, comma, bash
|
||||||
- [ ] **SAND-11**: Working `/tmp` (tmpfs), `/dev` (bwrap `--dev`), `/proc` (bwrap `--proc`)
|
- [x] **SAND-11**: Working `/tmp` (tmpfs), `/dev` (bwrap `--dev`), `/proc` (bwrap `--proc`)
|
||||||
- [ ] **SAND-12**: DNS resolution works inside sandbox (`/etc/resolv.conf` and its symlink targets mounted)
|
- [x] **SAND-12**: DNS resolution works inside sandbox (`/etc/resolv.conf` and its symlink targets mounted)
|
||||||
- [ ] **SAND-13**: SSL/TLS works inside sandbox (cert bundle mounted, `NIX_SSL_CERT_FILE` set)
|
- [x] **SAND-13**: SSL/TLS works inside sandbox (cert bundle mounted, `NIX_SSL_CERT_FILE` set)
|
||||||
- [ ] **SAND-14**: Exit code from Claude Code passes through to the wrapper's caller
|
- [x] **SAND-14**: Exit code from Claude Code passes through to the wrapper's caller
|
||||||
- [ ] **SAND-15**: Signals (Ctrl+C) reach Claude Code via `exec` — no intermediate shell
|
- [x] **SAND-15**: Signals (Ctrl+C) reach Claude Code via `exec` — no intermediate shell
|
||||||
|
|
||||||
### Tool Provisioning
|
### Tool Provisioning
|
||||||
|
|
||||||
- [ ] **TOOL-01**: comma (`,`) is available in sandbox PATH for on-demand tool installation
|
- [x] **TOOL-01**: comma (`,`) is available in sandbox PATH for on-demand tool installation
|
||||||
- [ ] **TOOL-02**: `nix shell` works inside the sandbox for installing arbitrary packages
|
- [x] **TOOL-02**: `nix shell` works inside the sandbox for installing arbitrary packages
|
||||||
- [ ] **TOOL-03**: Newly installed Nix store paths are visible inside sandbox (live bind mount)
|
- [x] **TOOL-03**: Newly installed Nix store paths are visible inside sandbox (live bind mount)
|
||||||
|
|
||||||
### User Experience
|
### User Experience
|
||||||
|
|
||||||
|
|
@ -36,7 +36,7 @@
|
||||||
- [ ] **UX-03**: `--yes` / `-y` flag skips the env audit confirmation
|
- [ ] **UX-03**: `--yes` / `-y` flag skips the env audit confirmation
|
||||||
- [ ] **UX-04**: `--dry-run` flag prints the full bwrap command without executing
|
- [ ] **UX-04**: `--dry-run` flag prints the full bwrap command without executing
|
||||||
- [ ] **UX-05**: `--check` flag verifies bwrap exists, required Nix packages are available, and `~/.claudebox` exists
|
- [ ] **UX-05**: `--check` flag verifies bwrap exists, required Nix packages are available, and `~/.claudebox` exists
|
||||||
- [ ] **UX-06**: `claude --dangerously-skip-permissions` is always passed — the sandbox is the permission layer
|
- [x] **UX-06**: `claude --dangerously-skip-permissions` is always passed — the sandbox is the permission layer
|
||||||
|
|
||||||
### Claude Awareness
|
### Claude Awareness
|
||||||
|
|
||||||
|
|
@ -45,14 +45,14 @@
|
||||||
|
|
||||||
### Git Support
|
### Git Support
|
||||||
|
|
||||||
- [ ] **GIT-01**: Git works inside the sandbox with a minimal `.gitconfig` (user name/email)
|
- [x] **GIT-01**: Git works inside the sandbox with a minimal `.gitconfig` (user name/email)
|
||||||
- [ ] **GIT-02**: `safe.directory` is configured to trust the mounted CWD
|
- [x] **GIT-02**: `safe.directory` is configured to trust the mounted CWD
|
||||||
|
|
||||||
### Nix Packaging
|
### Nix Packaging
|
||||||
|
|
||||||
- [ ] **NIX-01**: Project is a Nix flake with `claudebox` as default package
|
- [x] **NIX-01**: Project is a Nix flake with `claudebox` as default package
|
||||||
- [ ] **NIX-02**: All runtime dependencies are pinned via flake inputs
|
- [x] **NIX-02**: All runtime dependencies are pinned via flake inputs
|
||||||
- [ ] **NIX-03**: `nix run` or `nix profile install` produces a working `claudebox` command
|
- [x] **NIX-03**: `nix run` or `nix profile install` produces a working `claudebox` command
|
||||||
|
|
||||||
## v2 Requirements
|
## v2 Requirements
|
||||||
|
|
||||||
|
|
@ -89,37 +89,37 @@
|
||||||
|
|
||||||
| Requirement | Phase | Status |
|
| Requirement | Phase | Status |
|
||||||
|-------------|-------|--------|
|
|-------------|-------|--------|
|
||||||
| SAND-01 | Phase 1 | Pending |
|
| SAND-01 | Phase 1 | Complete |
|
||||||
| SAND-02 | Phase 1 | Pending |
|
| SAND-02 | Phase 1 | Complete |
|
||||||
| SAND-03 | Phase 1 | Pending |
|
| SAND-03 | Phase 1 | Complete |
|
||||||
| SAND-04 | Phase 1 | Pending |
|
| SAND-04 | Phase 1 | Complete |
|
||||||
| SAND-05 | Phase 1 | Pending |
|
| SAND-05 | Phase 1 | Complete |
|
||||||
| SAND-06 | Phase 1 | Pending |
|
| SAND-06 | Phase 1 | Complete |
|
||||||
| SAND-07 | Phase 1 | Pending |
|
| SAND-07 | Phase 1 | Complete |
|
||||||
| SAND-08 | Phase 1 | Pending |
|
| SAND-08 | Phase 1 | Complete |
|
||||||
| SAND-09 | Phase 1 | Pending |
|
| SAND-09 | Phase 1 | Complete |
|
||||||
| SAND-10 | Phase 1 | Pending |
|
| SAND-10 | Phase 1 | Complete |
|
||||||
| SAND-11 | Phase 1 | Pending |
|
| SAND-11 | Phase 1 | Complete |
|
||||||
| SAND-12 | Phase 1 | Pending |
|
| SAND-12 | Phase 1 | Complete |
|
||||||
| SAND-13 | Phase 1 | Pending |
|
| SAND-13 | Phase 1 | Complete |
|
||||||
| SAND-14 | Phase 1 | Pending |
|
| SAND-14 | Phase 1 | Complete |
|
||||||
| SAND-15 | Phase 1 | Pending |
|
| SAND-15 | Phase 1 | Complete |
|
||||||
| TOOL-01 | Phase 1 | Pending |
|
| TOOL-01 | Phase 1 | Complete |
|
||||||
| TOOL-02 | Phase 1 | Pending |
|
| TOOL-02 | Phase 1 | Complete |
|
||||||
| TOOL-03 | Phase 1 | Pending |
|
| TOOL-03 | Phase 1 | Complete |
|
||||||
| UX-01 | Phase 2 | Pending |
|
| UX-01 | Phase 2 | Pending |
|
||||||
| UX-02 | Phase 2 | Pending |
|
| UX-02 | Phase 2 | Pending |
|
||||||
| UX-03 | Phase 2 | Pending |
|
| UX-03 | Phase 2 | Pending |
|
||||||
| UX-04 | Phase 2 | Pending |
|
| UX-04 | Phase 2 | Pending |
|
||||||
| UX-05 | Phase 2 | Pending |
|
| UX-05 | Phase 2 | Pending |
|
||||||
| UX-06 | Phase 1 | Pending |
|
| UX-06 | Phase 1 | Complete |
|
||||||
| AWARE-01 | Phase 3 | Pending |
|
| AWARE-01 | Phase 3 | Pending |
|
||||||
| AWARE-02 | Phase 3 | Pending |
|
| AWARE-02 | Phase 3 | Pending |
|
||||||
| GIT-01 | Phase 1 | Pending |
|
| GIT-01 | Phase 1 | Complete |
|
||||||
| GIT-02 | Phase 1 | Pending |
|
| GIT-02 | Phase 1 | Complete |
|
||||||
| NIX-01 | Phase 1 | Pending |
|
| NIX-01 | Phase 1 | Complete |
|
||||||
| NIX-02 | Phase 1 | Pending |
|
| NIX-02 | Phase 1 | Complete |
|
||||||
| NIX-03 | Phase 1 | Pending |
|
| NIX-03 | Phase 1 | Complete |
|
||||||
|
|
||||||
**Coverage:**
|
**Coverage:**
|
||||||
- v1 requirements: 31 total
|
- v1 requirements: 31 total
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ Decimal phases appear between their surrounding integers in numeric order.
|
||||||
**Plans:** 2 plans
|
**Plans:** 2 plans
|
||||||
|
|
||||||
Plans:
|
Plans:
|
||||||
- [ ] 01-01-PLAN.md -- Create flake.nix and claudebox.sh with complete bwrap sandbox
|
- [x] 01-01-PLAN.md -- Create flake.nix and claudebox.sh with complete bwrap sandbox
|
||||||
- [ ] 01-02-PLAN.md -- Build verification and manual sandbox smoke test
|
- [ ] 01-02-PLAN.md -- Build verification and manual sandbox smoke test
|
||||||
|
|
||||||
### Phase 2: Env Audit and CLI Polish
|
### Phase 2: Env Audit and CLI Polish
|
||||||
|
|
|
||||||
|
|
@ -2,16 +2,16 @@
|
||||||
gsd_state_version: 1.0
|
gsd_state_version: 1.0
|
||||||
milestone: v1.0
|
milestone: v1.0
|
||||||
milestone_name: milestone
|
milestone_name: milestone
|
||||||
status: planning
|
status: executing
|
||||||
stopped_at: Phase 1 context gathered
|
stopped_at: Completed 01-01-PLAN.md
|
||||||
last_updated: "2026-04-09T08:46:45.040Z"
|
last_updated: "2026-04-09T09:13:00.977Z"
|
||||||
last_activity: 2026-04-09 -- Roadmap created
|
last_activity: 2026-04-09
|
||||||
progress:
|
progress:
|
||||||
total_phases: 3
|
total_phases: 3
|
||||||
completed_phases: 0
|
completed_phases: 0
|
||||||
total_plans: 0
|
total_plans: 2
|
||||||
completed_plans: 0
|
completed_plans: 1
|
||||||
percent: 0
|
percent: 50
|
||||||
---
|
---
|
||||||
|
|
||||||
# Project State
|
# Project State
|
||||||
|
|
@ -26,9 +26,9 @@ See: .planning/PROJECT.md (updated 2026-04-09)
|
||||||
## Current Position
|
## Current Position
|
||||||
|
|
||||||
Phase: 1 of 3 (Minimal Viable Sandbox)
|
Phase: 1 of 3 (Minimal Viable Sandbox)
|
||||||
Plan: 0 of 3 in current phase
|
Plan: 1 of 3 in current phase
|
||||||
Status: Ready to plan
|
Status: Ready to execute
|
||||||
Last activity: 2026-04-09 -- Roadmap created
|
Last activity: 2026-04-09
|
||||||
|
|
||||||
Progress: [░░░░░░░░░░] 0%
|
Progress: [░░░░░░░░░░] 0%
|
||||||
|
|
||||||
|
|
@ -52,6 +52,7 @@ Progress: [░░░░░░░░░░] 0%
|
||||||
- Trend: -
|
- Trend: -
|
||||||
|
|
||||||
*Updated after each plan completion*
|
*Updated after each plan completion*
|
||||||
|
| Phase 01 P01 | 1min | 2 tasks | 3 files |
|
||||||
|
|
||||||
## Accumulated Context
|
## Accumulated Context
|
||||||
|
|
||||||
|
|
@ -60,7 +61,9 @@ Progress: [░░░░░░░░░░] 0%
|
||||||
Decisions are logged in PROJECT.md Key Decisions table.
|
Decisions are logged in PROJECT.md Key Decisions table.
|
||||||
Recent decisions affecting current work:
|
Recent decisions affecting current work:
|
||||||
|
|
||||||
- None yet.
|
-
|
||||||
|
|
||||||
|
- [Phase 01]: Claude Code discovered from host PATH at runtime, not bundled as runtimeInput
|
||||||
|
|
||||||
### Pending Todos
|
### Pending Todos
|
||||||
|
|
||||||
|
|
@ -72,6 +75,6 @@ None yet.
|
||||||
|
|
||||||
## Session Continuity
|
## Session Continuity
|
||||||
|
|
||||||
Last session: 2026-04-09T08:46:45.037Z
|
Last session: 2026-04-09T09:13:00.975Z
|
||||||
Stopped at: Phase 1 context gathered
|
Stopped at: Completed 01-01-PLAN.md
|
||||||
Resume file: .planning/phases/01-minimal-viable-sandbox/01-CONTEXT.md
|
Resume file: None
|
||||||
|
|
|
||||||
95
.planning/phases/01-minimal-viable-sandbox/01-01-SUMMARY.md
Normal file
95
.planning/phases/01-minimal-viable-sandbox/01-01-SUMMARY.md
Normal file
|
|
@ -0,0 +1,95 @@
|
||||||
|
---
|
||||||
|
phase: 01-minimal-viable-sandbox
|
||||||
|
plan: 01
|
||||||
|
subsystem: infra
|
||||||
|
tags: [nix, bubblewrap, bwrap, sandbox, writeShellApplication, flake, comma-with-db]
|
||||||
|
|
||||||
|
requires: []
|
||||||
|
provides:
|
||||||
|
- "claudebox command via nix build/run"
|
||||||
|
- "bwrap sandbox with clearenv + env allowlist"
|
||||||
|
- "filesystem isolation with secret path hiding"
|
||||||
|
- "git identity forwarding via generated .gitconfig"
|
||||||
|
- "comma/nix tool provisioning inside sandbox"
|
||||||
|
affects: [02-verification-and-hardening]
|
||||||
|
|
||||||
|
tech-stack:
|
||||||
|
added: [bubblewrap, writeShellApplication, nix-index-database, comma-with-db]
|
||||||
|
patterns: [clearenv-allowlist, tmpfs-root-selective-bind, exec-for-signal-passthrough]
|
||||||
|
|
||||||
|
key-files:
|
||||||
|
created: [flake.nix, claudebox.sh, flake.lock]
|
||||||
|
modified: []
|
||||||
|
|
||||||
|
key-decisions:
|
||||||
|
- "Claude Code discovered from host PATH at runtime, not bundled as runtimeInput"
|
||||||
|
- "Sandbox-generated vars (TMPDIR, XDG_RUNTIME_DIR) never read from host"
|
||||||
|
- "CLAUDEBOX_EXTRA_ENV comma-separated escape hatch for user-added env vars"
|
||||||
|
|
||||||
|
patterns-established:
|
||||||
|
- "writeShellApplication + builtins.readFile: keep shell script separate for syntax highlighting and independent shellcheck"
|
||||||
|
- "clearenv + setenv: start empty, allowlist explicitly"
|
||||||
|
- "tmpfs root + selective bind-mounts: nothing visible unless explicitly mounted"
|
||||||
|
- "exec bwrap: no intermediate shell, signals propagate, exit code passes through"
|
||||||
|
|
||||||
|
requirements-completed: [SAND-01, SAND-02, SAND-03, SAND-04, SAND-05, SAND-06, SAND-07, SAND-08, SAND-09, SAND-10, SAND-11, SAND-12, SAND-13, SAND-14, SAND-15, TOOL-01, TOOL-02, TOOL-03, GIT-01, GIT-02, NIX-01, NIX-02, NIX-03, UX-06]
|
||||||
|
|
||||||
|
duration: 1min
|
||||||
|
completed: 2026-04-09
|
||||||
|
---
|
||||||
|
|
||||||
|
# Phase 1 Plan 01: Nix Flake and Sandbox Script Summary
|
||||||
|
|
||||||
|
**Nix flake with writeShellApplication producing claudebox wrapper that runs Claude Code inside bwrap with clearenv, env allowlist, tmpfs root, secret hiding, git identity forwarding, and comma/nix tool access**
|
||||||
|
|
||||||
|
## Performance
|
||||||
|
|
||||||
|
- **Duration:** ~1 min
|
||||||
|
- **Started:** 2026-04-09T09:10:55Z
|
||||||
|
- **Completed:** 2026-04-09T09:12:10Z
|
||||||
|
- **Tasks:** 2
|
||||||
|
- **Files created:** 3 (flake.nix, claudebox.sh, flake.lock)
|
||||||
|
|
||||||
|
## Accomplishments
|
||||||
|
- Nix flake with 11 runtimeInputs (bubblewrap, coreutils, git, curl, jq, ripgrep, fd, nix, comma-with-db, bash, nodejs) and nix-index-database flake input
|
||||||
|
- Shell script with complete bwrap invocation: clearenv, env allowlist with CLAUDEBOX_EXTRA_ENV escape hatch, tmpfs root, selective bind-mounts, git identity generation, secret path exclusion
|
||||||
|
- `nix build` succeeds -- derivation builds and passes shellcheck
|
||||||
|
|
||||||
|
## Task Commits
|
||||||
|
|
||||||
|
Each task was committed atomically:
|
||||||
|
|
||||||
|
1. **Task 1: Create flake.nix** - `0ed2d33` (feat)
|
||||||
|
2. **Task 2: Create claudebox.sh** - `51dba04` (feat)
|
||||||
|
3. **flake.lock generated by nix flake check** - `26bdf36` (chore)
|
||||||
|
|
||||||
|
## Files Created/Modified
|
||||||
|
- `flake.nix` - Nix flake with writeShellApplication, all runtimeInputs, nix-index-database input
|
||||||
|
- `claudebox.sh` - bwrap sandbox script with clearenv, env allowlist, filesystem isolation, git identity
|
||||||
|
- `flake.lock` - Pinned nixpkgs and nix-index-database versions
|
||||||
|
|
||||||
|
## Decisions Made
|
||||||
|
None - followed plan as specified.
|
||||||
|
|
||||||
|
## Deviations from Plan
|
||||||
|
|
||||||
|
None - plan executed exactly as written.
|
||||||
|
|
||||||
|
## Issues Encountered
|
||||||
|
None.
|
||||||
|
|
||||||
|
## User Setup Required
|
||||||
|
None - no external service configuration required.
|
||||||
|
|
||||||
|
## Next Phase Readiness
|
||||||
|
- claudebox builds successfully via `nix build`
|
||||||
|
- Ready for 01-02 (verification and manual testing)
|
||||||
|
- Requires `claude` to be available on host PATH for runtime use
|
||||||
|
|
||||||
|
## Self-Check: PASSED
|
||||||
|
|
||||||
|
All 3 files exist. All 3 commits verified.
|
||||||
|
|
||||||
|
---
|
||||||
|
*Phase: 01-minimal-viable-sandbox*
|
||||||
|
*Completed: 2026-04-09*
|
||||||
Loading…
Add table
Reference in a new issue