diff --git a/_posts/2026-07-01-your-coding-agent-will-always-tell-you-its-safe.md b/_posts/2026-07-01-your-coding-agent-will-always-tell-you-its-safe.md index a59929f..3e916af 100644 --- a/_posts/2026-07-01-your-coding-agent-will-always-tell-you-its-safe.md +++ b/_posts/2026-07-01-your-coding-agent-will-always-tell-you-its-safe.md @@ -67,9 +67,9 @@ So trust can't come from the agent's account of itself. It has to come from outs ## Why perch exists -That's perch, built to exactly that spec: a macOS notch and menu bar monitor for Claude Code and Codex sessions, watching on two axes. Actions: every tool call is risk-scored offline the instant it fires — when an agent runs something dangerous, a red card drops from the notch with the exact command and why it was flagged, even when the call was auto-approved. The riskiest calls are exactly the ones nobody asks you about. And footholds: a live scan of the persistence surface — config, hooks, memory files, MCP servers, LaunchAgents — read straight from disk, so it also catches what happened before perch launched. That payload from three sessions ago? This is the scan that catches it. Sessions, rate limits, and token usage ride along in the same glance. +That's perch, built to exactly that spec: a macOS notch and menu bar monitor for Claude Code and Codex sessions, watching on two axes. Actions: every tool call is risk-scored offline the instant it fires — when an agent runs something dangerous, a red card drops from the notch with the exact command and why it was flagged, even when the call was auto-approved. The riskiest calls are exactly the ones nobody asks you about. And footholds: a live scan of the persistence surface — config, hooks, memory files, MCP servers, LaunchAgents — read straight from disk, so it also catches what happened before perch launched. That payload from three sessions ago? This is the scan that catches it. Sessions, rate limits, and token usage ride along in the same glance — and a monitoring-health strip applies the same skepticism to perch itself: it won't call an agent's coverage *verified* until a real event from that agent has actually arrived. - + What matters is *where it stands*: outside the agent's process. Agent content reaches it only as data to display: there's no model inside to prompt-inject, and a transcript is something it draws, not something it obeys. And what it shows isn't the agent's story about itself: session state, flagged commands, and token counts come from the harness's own records — which tools actually fired, what they actually ran. The model can narrate whatever it likes; the record is written by the harness, not by the narration. When the agent claims it's idle, the notch either agrees or it doesn't. @@ -83,7 +83,7 @@ Threat model, stated bluntly: perch trusts the local OS account boundary and the At the scale of one person and a handful of sessions, perch is enough. Picture four hundred engineers, each running coding agents all day. One agent going wrong is an incident. A fleet going wrong is a breach. -At fleet scale, the risks worth catching are only visible *across* machines: one agent tripping a curl-pipe-bash rule is noise; nine endpoints tripping it within the hour is a campaign. So the events have to flow somewhere central. That's [crowsnest](https://github.com/theMobiusStrip/crowsnest). Every endpoint ships its tool-decision events — what the agent asked to do, how risky it was, what got approved — to one place, where they land in ClickHouse. Deterministic SQL rules decide what looks suspicious, and a dashboard turns the hits into fleet views and incidents you can drill into. It's local-first: one machine today, multi-endpoint tomorrow, no rewrite in between. +At fleet scale, the risks worth catching are only visible *across* machines: one agent tripping a curl-pipe-bash rule is noise; nine endpoints tripping it within the hour is a campaign. So the events have to flow somewhere central. That's [crowsnest](https://github.com/theMobiusStrip/crowsnest). Every endpoint ships its tool-decision events — what the agent asked to do, how risky it was, what got approved — to one place, where they land in ClickHouse. Deterministic SQL rules decide what looks suspicious, and a dashboard turns the hits into fleet views and incidents you can drill into. It's local-first: one machine today, multi-endpoint tomorrow, no rewrite in between. And perch now meets it halfway: deduplicated detections land in a compact local SQLite record — metadata only, never commands, paths, or prompts, 30 days — behind a [versioned read-only view](https://github.com/theMobiusStrip/perch/blob/main/docs/detection-storage.md) built for a future crowsnest adapter to poll. And yes, crowsnest is a watcher everything phones home to — the difference is whose home: your ClickHouse, your rules, your infrastructure, not a vendor's black box. Same caveat as perch, one level up: a compromised endpoint can go quiet (which the fleet view surfaces) or lie convincingly (which no dashboard fixes). Its LLM triage is optional, advisory, and off by default — the verdict belongs to deterministic rules, because if another LLM gets the final say, you're back to agents supervising agents. diff --git a/assets/img/perch-notch.png b/assets/img/perch-notch.png index 28d4aa9..9d1569c 100644 Binary files a/assets/img/perch-notch.png and b/assets/img/perch-notch.png differ diff --git a/perch/img/icon.png b/perch/img/icon.png index eb7ffad..134f7b1 100644 Binary files a/perch/img/icon.png and b/perch/img/icon.png differ diff --git a/perch/img/insights.png b/perch/img/insights.png new file mode 100644 index 0000000..3afc666 Binary files /dev/null and b/perch/img/insights.png differ diff --git a/perch/img/integrity.png b/perch/img/integrity.png index c3a1e82..c4beb74 100644 Binary files a/perch/img/integrity.png and b/perch/img/integrity.png differ diff --git a/perch/img/notch.png b/perch/img/notch.png index e6815c0..9d1569c 100644 Binary files a/perch/img/notch.png and b/perch/img/notch.png differ diff --git a/perch/img/usage.png b/perch/img/usage.png index bf57f7d..d4135a6 100644 Binary files a/perch/img/usage.png and b/perch/img/usage.png differ diff --git a/perch/img/worktrees.png b/perch/img/worktrees.png index d27b5fe..c72de76 100644 Binary files a/perch/img/worktrees.png and b/perch/img/worktrees.png differ diff --git a/perch/index.html b/perch/index.html index f0fee13..de7b31b 100644 --- a/perch/index.html +++ b/perch/index.html @@ -4,7 +4,7 @@
Apple silicon (M1+) · macOS 14+ · MIT license
+
Every tool call is scored offline: rm -rf, sudo, curl | sh, credential reads, persistence tricks. Danger fires an OS notification and a red notch card with the exact command and why it was flagged — even when the call was auto-approved.
Every tool call is scored offline: rm -rf, sudo, curl | sh, credential reads, persistence tricks. Danger fires an OS notification and a red notch card with the exact command and why it was flagged — even when the call was auto-approved. Notification actions jump straight to the matching detection, session, or usage view.
Esc dismisses, ←→ walk the queue. Your editor keeps focus.
A separate notch page scans the persistence surface straight from disk: agent config and hooks, MCP servers, plugins, CLAUDE.md and memory files, LaunchAgents, shell profiles. No hook required — it covers changes made before Perch launched — and a flag stays up until you acknowledge it.
A coverage strip checks the deployed bridge, the local event socket, Claude wiring, and Codex hook trust — then refuses to report verified until a real event from each configured agent actually arrives. Its state colors the collapsed notch and the menu-bar bird, and a guided setup installs or repairs the integrations.
+Offline caution/danger trends for this Mac: 24-hour, 7-day, and 30-day timelines, plus findings grouped by code, agent, tool, and session (menu bar → Insights…). Built on a metadata-only local record — never commands, paths, or prompts — that records what Perch observed, not whether a request ran.
+Agent sessions mint git worktrees and leave them behind. Perch audits them across every project — tiered reclaimable / review / active / orphaned, with disk sizes — and its git calls never write; even status runs lock-free. Perch never deletes.
Claude 5h/7d and Codex 5h/weekly windows with reset countdowns and an 80% warning — the Claude gauges are fed by terminal sessions (the desktop app doesn't report them). Token totals for today / 7 days / 30 days, and a full per-day, per-model, per-project dashboard.
A rolling 0–100 posture score in the notch and menu bar: −25 per danger, −5 per caution over the last hour. A quiet hour heals it back to 100.
+A rolling 0–100 posture score in the notch and menu bar: −25 per danger, −5 per caution over the last hour; a quiet hour heals it back to 100. Open the strip for the formula and retained recent detections — dismissing an alert card doesn't erase its history, and the score survives an app restart.
Live list of all Claude Code and Codex sessions — running / waiting / idle, last message, context gauge, red badge on any session that just ran something dangerous.
-
-
-
+
+
+
+ .dmg and drag Perch into Applications./hooks once in the terminal codex TUI./hooks once in the terminal codex TUI.~/.claude settings and plugins, ~/.claude.json, CLAUDE.md and memory files, LaunchAgents, shell profiles (some checked by timestamp only). All read-only; nothing leaves your machine — Perch makes zero network calls.~/.claude settings and plugins, ~/.claude.json, CLAUDE.md and memory files, LaunchAgents, shell profiles (some checked by timestamp only). All read-only; nothing Perch observes ever leaves your machine.