Launcher
brew tap nvk/tap
brew install nvk/tap/agent-bondage
The formula name is agent-bondage. The installed command is bondage.
local C launcher · pinned artifacts · shell out of the trust boundary
______ _____ _ _______ ___ _____ _____
| ___ \| _ | \ | | _ \/ _ \| __ \| ___|
| |_/ /| | | | \| | | | / /_\ \ | \/| |__
| ___ \| | | | . ` | | | | _ | | __ | __|
| |_/ /\ \_/ / |\ | |/ /| | | | |_\ \| |___
\____/ \___/\_| \_/___/ \_| |_/\____/\____/
Coding agents are useful, but you cannot let them run loose with live keys,
weak dependency provenance, and broad ambient environment access. Exact paths.
Exact hashes. Optional envchain-xtra. Optional nono.
Your shell gets names. Bondage gets trust.
Agent launch stacks drift. Shell wrappers grow policy logic. Global npm installs mutate under your feet. PATH resolution quietly becomes part of the trust boundary whether you intended it or not.
Bondage is the correction: move the security decisions into one small local launcher, pin the actual artifacts, and demote the shell back to naming sugar instead of policy.
Keep the package simple. Install the launcher from Homebrew. Bring your own
nono, optional envchain-xtra, and your own pinned tool tree.
brew tap nvk/tap
brew install nvk/tap/agent-bondage
The formula name is agent-bondage. The installed command is bondage.
brew tap nvk/tap
brew install nvk/tap/envchain-xtra
envchain-xtra is optional per profile. Use it only when a profile actually needs secret release.
Versioned directories. Absolute paths. No PATH-sensitive trust decisions.
~/.config/bondage/bondage.conf defines profiles, hashes, optional envchain, optional nono, optional Touch ID.
codex() { bondage exec codex ~/.config/bondage/bondage.conf -- "$@"; }
This is the shortest clean path: install the launcher, point it at one real tool, verify the exact argv, then add a thin wrapper.
bondage and optionally envchain-xtra.~/.config/bondage/bondage.conf from the sample config.bondage hash-file.bondage verify, then bondage argv, then bondage exec.bondage exec.brew tap nvk/tap
brew install nvk/tap/agent-bondage
mkdir -p ~/.config/bondage
cp /path/to/bondage.conf.example ~/.config/bondage/bondage.conf
bondage hash-file /absolute/path/to/codex
bondage verify codex ~/.config/bondage/bondage.conf
bondage argv codex ~/.config/bondage/bondage.conf -- --help
bondage exec codex ~/.config/bondage/bondage.conf -- --help
codex() { bondage exec codex ~/.config/bondage/bondage.conf -- "$@"; }
Convenience only. Names, tab colors, tiny prompt shaping. Not policy.
Verifies exact paths and exact hashes, expands the chosen profile, builds the final argv, and execs.
Optional secret-release layer. Namespace-scoped. Only used for profiles that truly need secrets.
Optional sandbox layer. The profile that Bondage selects still decides what the process can read, write, and reach.
bondage verify codex ~/.config/bondage/bondage.conf
bondage argv codex ~/.config/bondage/bondage.conf -- --help
bondage exec codex ~/.config/bondage/bondage.conf -- --help
bondage hash-file /absolute/path/to/tool
bondage hash-tree /absolute/path/to/package-root
Because aliases and shell functions are fine for convenience, terrible for a narrow auditable trust boundary.
Because launch-time controls are only half the story. Mutable global installs are a poor foundation for anything you plan to bless with secrets.
Bondage is a launch-time control, not a procurement miracle. If you install compromised garbage and then pin it, Bondage will faithfully protect the compromised garbage.
Immutable versioned bundles. Pinned interpreter. Pinned entrypoint. Whole-tree hash. No trust in mutable global installs.
Static site, live repo state. If GitHub is unavailable, the page falls back to the baked-in values.
tag fallback
Small local C launcher. Exact paths. Exact hashes. Optional envchain-xtra. Optional nono.
tag fallback
Companion secret-release layer. Modernized macOS backend, public tap install, and compatibility shell guards if you still need them.
Small trusted computing base. Explicit file-descriptor discipline. No new crate ecosystem to escape one package ecosystem.
Because the main problem is launch policy and artifact verification, not just secret storage. envchain-xtra stays focused on secret release.
Because aliases and shell functions are fine for convenience, terrible for a narrow auditable trust boundary.
An explicit no-nono escape hatch. It should be obvious, ugly, and deliberate.