Skip to content

Pre-publication MacBook verification for the brush-ocap engine + host-shell (before shipping crates; cut 0.7.0-rc.1) #205

Description

@hartsock

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):

  • Publish brush-ocap-{core,builtins} (and -coreutils-builtins if the carried-coreutils refactor lands) to crates.io — local publish from gnuc, causal order core→builtins.
  • Swap PR feat(shell): carried brush engine (BrushShellTool) [DRAFT — needs brush-ocap-* published] #204's git deps → crates.io version deps; un-draft; merge.
  • Bump the agent-bridle workspace version 0.1.0 → 0.7.0-rc.1; just publish-crates (core, tool-shell, tool-web, facade, mcp).
  • Bump newt's agent-bridle pin to the published 0.7.0-rc.1; wire newt's brush engine value to BrushShellTool; 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions