@snowyroad/braid 0.94.0 → 0.96.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -192,23 +192,30 @@ OWN login: the bridge never sends a model API key. Provider-specific notes:
192
192
  ## Security model
193
193
 
194
194
  - **Read and reply only by default.** Unless you opt in, tool permission requests
195
- that execute, write, edit, delete, or fetch are denied. Your agent can read
196
- context and reply with text, nothing more. Honest caveat: read-and-reply still
197
- permits READING non-credential local files your agent's own permissions allow,
198
- and what it reads can appear in its channel replies. Run the bridge in a
199
- directory you are comfortable sharing from.
195
+ that execute, write, edit, delete, or fetch are denied. Your agent can read files
196
+ under the directory you started the bridge in (plus any `--allow-read` paths) and
197
+ reply with text, nothing more. Credential files (`~/.ssh`, `~/.aws`, `~/.npmrc`,
198
+ `~/.config/gh`, `~/.docker/config.json`, git credentials, shell history, your
199
+ agent's own login file, and more) are never readable through your agent's file
200
+ tools in either mode. Read results are never sent to Braid as activity content
201
+ (only file names and edit diffs or command output appear in the activity view);
202
+ what your agent quotes back in its own chat reply is bounded by the read
203
+ confinement above.
200
204
  - **Full access is an explicit opt-in,** chosen at the first-run prompt or with
201
205
  `braid tools full <name>`. Understand what that means: remote messages can drive
202
206
  local tool use on your machine. The bridge prints a warning at startup in this
203
207
  mode. (Advanced: the `BRAID_TOOL_MODE` env var, `readonly`|`full`, overrides the
204
- saved choice for one run and is never persisted.)
208
+ saved choice for one run and is never persisted.) Reads outside the launch
209
+ directory are allowed in full access, except the credential files above.
205
210
  - **In both modes** the bridge denies agent access to its credential store (`~/.braid`
206
211
  or `$BRAID_CONFIG_DIR`) for permission requests it sees, strips relay credentials
207
212
  from the agent subprocess environment, and treats all channel content as untrusted
208
213
  data in prompts (fenced, never as instructions).
209
214
  - **Honest limitation:** the bridge can only gate permission requests your agent
210
215
  surfaces. Your agent's own permission settings apply first; anything your agent is
211
- configured to auto-allow never reaches the bridge's policy.
216
+ configured to auto-allow never reaches the bridge's policy. For defense in depth,
217
+ Claude Code users can also set `permissions.blockReadsOutsideWorkingDirectories`
218
+ in their own settings to enforce the same boundary at the agent level.
212
219
 
213
220
  ## OS sandbox (scope)
214
221
 
@@ -234,9 +241,11 @@ descendant process and cannot be shed.
234
241
  write, and reach.
235
242
  - **Widen it:** add paths/domains via the `scope` block on the saved agent config,
236
243
  or the `BRAID_SCOPE_ALLOW_WRITE` / `BRAID_SCOPE_ALLOW_READ` / `BRAID_SCOPE_ALLOW_DOMAINS`
237
- env vars (see below). *Granting a tool CLI:* to let the agent run `gh`, add
238
- `~/.config/gh` to `allowRead` — `github.com` is already in the default network
239
- allow-list, so the CLI works inside the jail.
244
+ env vars (see below). Credential directories (`~/.ssh`, `~/.aws`, `~/.config/gh`,
245
+ and the rest of the protected inventory) are reserved and CANNOT be granted: a
246
+ grant that lands inside one is refused at startup with a SCOPE ERROR. A tool CLI
247
+ that only needs network still works inside the jail (`github.com` is in the default
248
+ allow-list); grant a project data directory, never a credential store.
240
249
 
241
250
  - **Unix socket access (Linux):** on Linux, seccomp-bpf cannot filter Unix sockets
242
251
  by path. The default `compat` IPC profile allows all pathname sockets. The `strict`
@@ -297,6 +306,16 @@ Provider ACP adapters (Claude Code, Codex, Gemini) are exact version-pinned and
297
306
  fetched from the npm registry on first use of that provider. The `grok` CLI is not
298
307
  an npm package; you install it yourself and the bridge resolves it from `PATH`.
299
308
 
309
+ ### Push guard + advisories (contributors)
310
+
311
+ `pnpm install` sets `core.hooksPath` to `.githooks`, whose `pre-push` hook (1) scans
312
+ exactly the commits being pushed with gitleaks against `.gitleaks.toml`, so a
313
+ secret-looking literal never leaves your machine, and (2) refuses a push to `main`
314
+ while `ci.yml` or `security.yml` is still running or is red. To push the one fix for
315
+ a red main: `BRAID_FIX_RED=1 git push ...`, then wait for the gates. Emergency bypass:
316
+ `BRAID_PUSH_FORCE=1`. Dependency advisories are checked daily by `advisories.yml` and
317
+ surface as a GitHub issue labeled `advisory`, never as a red on an unrelated push.
318
+
300
319
  ## Environment variables
301
320
 
302
321
  Every variable below also accepts its pre-rename `ARP_*` twin as a fallback <!-- braid-rename: env-fallback -->