Gate for publishing brush-ocap-* to crates.io and cutting the agent-bridle 0.7.0-rc.1 line. Run this on the owner's MacBook (Seatbelt L3, Apple-Silicon, Homebrew) to confirm everything works on the target platform before the irreversible publish. All local; nothing ships until this is green.
What's staged
Environment
rustup default stable # need >= 1.87 for std::io::pipe; brush needs 1.88
brew --prefix # confirm /opt/homebrew on PATH
A. Brush engine builds + confines on macOS (agent-bridle PR #204 branch)
git fetch origin && git checkout feat/brush-ocap-engine
cargo test -p agent-bridle-tool-shell --features brush
Expect: brush_real green — $(...) runs in-process; a restricted-exec out-of-scope command is denied (denied:true, kind:exec) and never runs; in-scope runs. (This is the engine host-shell can't do: confining a restricted exec grant.)
B. Host-shell Seatbelt keystone on macOS
cargo test -p agent-bridle-tool-shell --features host-shell,macos-seatbelt --test host_shell_real
Expect: macos_dynamic_construct_runs_but_out_of_scope_write_is_seatbelt_denied green — sandbox_kind == \"seatbelt\", the in-scope $(...) write succeeds, the out-of-scope write is kernel-denied. Plus the new full_access_seeds_default_path_into_the_child / bare_name_resolves_* (PR #203).
C. Full-access PATH parity on macOS (Homebrew)
Confirm the full-access PATH seed picks up /opt/homebrew/bin. With a Homebrew-only tool installed (e.g. brew install ripgrep):
D. newt end-to-end on macOS (from main)
cd newt-agent && git checkout main && just install-real # or the real-shell build
newt doctor # → \"L3 kernel jail (this platform): Seatbelt — available\"; engine readout
Then a real newt --shell-engine host (and --full-access) session; confirm these run and are Seatbelt-jailed:
ls -la
grep -n fn src/**/*.rs # or any grep
find . -name '*.rs' | head
echo "$(whoami)" # dynamic construct — safe-subset refuses, host runs
ls | wc -l # pipeline
- Confirm a restricted preset (
[tui.permissions] preset=\"workspace_dev\") still denies an out-of-scope write (Seatbelt) and that host refuses a restricted-exec grant.
- Confirm the reworded
--full-access banner reads the ambient-authority/OCAP prose (#926).
E. Local-inference E2E (the owner's standing bar)
Ollama on the Mac driving newt --shell-engine host (or --full-access) on a task that requires a $(...) one-liner the safe-subset engine refuses — it runs, Seatbelt-jailed, and (restricted preset) an out-of-scope write is denied.
F. Publishability rehearsal (simulate post-publication)
On a scratch copy of PR #204, swap the two brush-ocap-* git deps in agent-bridle-tool-shell/Cargo.toml to version deps and dry-run the chain:
# brush-ocap-core = \"0.5\" / brush-ocap-builtins = \"0.2\" (once published)
cargo publish --dry-run -p agent-bridle-core
cargo publish --dry-run -p agent-bridle-tool-shell --features brush # should be git-dep-free
Confirm no git = sources remain in any published manifest.
Version bump (on green)
Cut 0.7.0-rc.1 (semver pre-release; note the dash/dot form, not 0.7.0rc1):
Exit criteria
A–F all green on the MacBook ⇒ publish brush-ocap-* ⇒ swap deps ⇒ merge #204 ⇒ cut 0.7.0-rc.1. Any red blocks the publish (crate names are permanent).
Refs: PR #204, #203, agent-bridle#20, newt #951 / #868 / #926, reubeno/brush#1184.
Gate for publishing
brush-ocap-*to crates.io and cutting the agent-bridle 0.7.0-rc.1 line. Run this on the owner's MacBook (Seatbelt L3, Apple-Silicon, Homebrew) to confirm everything works on the target platform before the irreversible publish. All local; nothing ships until this is green.What's staged
feat/brush-ocap-engine) — the carried brush engine (BrushShellTool), in-process bash confined by theCommandInterceptor, behind thebrushfeature. Uses a git dep on the fork, so it's held as draft until publish.hartsock/brush @ brush-ocap(ee58e24) = upstream + the hook (feat(core): add CommandInterceptor exec/open hook to ShellExtensions reubeno/brush#1184) + thebrush-ocap-{core,builtins,coreutils-builtins}rename.cargo publish --dry-runonbrush-ocap-coreis green on Linux.main.--shell-engine,[shell] engine,--full-access→host,newt doctor) is merged (newt #951). newt'sbrushvalue currently falls back tohost(wiring newt→brush is a follow-up after publish).Environment
A. Brush engine builds + confines on macOS (agent-bridle PR #204 branch)
Expect:
brush_realgreen —$(...)runs in-process; a restricted-exec out-of-scope command is denied (denied:true,kind:exec) and never runs; in-scope runs. (This is the engine host-shell can't do: confining a restricted exec grant.)B. Host-shell Seatbelt keystone on macOS
cargo test -p agent-bridle-tool-shell --features host-shell,macos-seatbelt --test host_shell_realExpect:
macos_dynamic_construct_runs_but_out_of_scope_write_is_seatbelt_deniedgreen —sandbox_kind == \"seatbelt\", the in-scope$(...)write succeeds, the out-of-scope write is kernel-denied. Plus the newfull_access_seeds_default_path_into_the_child/bare_name_resolves_*(PR #203).C. Full-access PATH parity on macOS (Homebrew)
Confirm the full-access PATH seed picks up
/opt/homebrew/bin. With a Homebrew-only tool installed (e.g.brew install ripgrep):Caveats::top()andcmd: \"rg --version\"(bare name, in/opt/homebrew/bin) → resolves and runs. Pre-fix(tool-shell): seed PATH in the sandbox-host engine so full-access resolves bare names #203 it would not (empty PATH → dash_CS_PATHmisses homebrew).printf '%s' \"$PATH\"under full-access equalsdefault_exec_path()(the ambient PATH incl./opt/homebrew/bin).D. newt end-to-end on macOS (from
main)Then a real
newt --shell-engine host(and--full-access) session; confirm these run and are Seatbelt-jailed:[tui.permissions] preset=\"workspace_dev\") still denies an out-of-scope write (Seatbelt) and thathostrefuses a restricted-exec grant.--full-accessbanner reads the ambient-authority/OCAP prose (#926).E. Local-inference E2E (the owner's standing bar)
Ollama on the Mac driving
newt --shell-engine host(or--full-access) on a task that requires a$(...)one-liner the safe-subset engine refuses — it runs, Seatbelt-jailed, and (restricted preset) an out-of-scope write is denied.F. Publishability rehearsal (simulate post-publication)
On a scratch copy of PR #204, swap the two
brush-ocap-*git deps inagent-bridle-tool-shell/Cargo.tomlto version deps and dry-run the chain:Confirm no
git =sources remain in any published manifest.Version bump (on green)
Cut 0.7.0-rc.1 (semver pre-release; note the dash/dot form, not
0.7.0rc1):brush-ocap-{core,builtins}(and-coreutils-builtinsif the carried-coreutils refactor lands) to crates.io — local publish from gnuc, causal order core→builtins.0.1.0 → 0.7.0-rc.1;just publish-crates(core, tool-shell, tool-web, facade, mcp).0.7.0-rc.1; wire newt'sbrushengine value toBrushShellTool; cut a newt rc.Exit criteria
A–F all green on the MacBook ⇒ publish
brush-ocap-*⇒ swap deps ⇒ merge #204 ⇒ cut 0.7.0-rc.1. Any red blocks the publish (crate names are permanent).Refs: PR #204, #203, agent-bridle#20, newt #951 / #868 / #926, reubeno/brush#1184.