Lane 4: govern the cockpit's local agent-machine via agent-control-bridge#71
Merged
Conversation
…rol-bridge The cockpit's bundled Noetica agent-machine sidecar runs pipelines, mutates graphs, writes knowledge, and could reach the host shell/fs — currently ungoverned. Lane 4 puts BearBrowser's enforcing policy engine in front of it, so the SAME engine that governs the browser (79/79) and the IoT estate (20/20) governs the cockpit agent. - policy/bearbrowser-contract.yaml: spec.agentMachineActionContract (allowed reads / gated mutations / prohibited host-reaching+destructive; user-gesture reclassifies prohibited→gated, unforgeable by the agent planner). - agent-control-bridge.py: --surface agent-machine (emits agent.<action> / agent.policy.violation) — the bridge was already namespace-aware. - scripts/bearbrowser-agent-machine-gate.py: loopback governance proxy. cockpit → gate → classify via bridge → forward permitted / 403+attest prohibited → sidecar. Unrecognized mutating routes fail closed. - scripts/tests/test_agent_machine_containment.py: 28/28 (surface + route mapping); injected execute-shell/read-credentials/disable-governance BLOCKED at decision time. Browser 79/79 + IoT 20/20 unchanged. - docs/cockpit-lane4-governance.md: design + the one-line Lane 3 launcher integration. Does NOT edit the Noetica engine (sits in front of it). Built in an isolated worktree off main so it doesn't collide with the parallel Lanes 1-3 branch.
mdheller
added a commit
that referenced
this pull request
Jul 20, 2026
…erned decision) (#72) The 5th cockpit surface, and the differentiator Gartner says agentic browsers lack: a live, verifiable ledger of every decision the enforcing bridge made across ALL surfaces. agent-control-bridge.py attests each decision to one evidence stream (reasoning-events.ndjson); this service reads it and unifies browser.* + iot.* + agent.* by event-type prefix. - scripts/bearbrowser-receipts.py: loopback read-only service — GET /receipts (filters: surface/decision/violations/since/limit), /receipts/summary (counts by surface/decision/class + violations), /receipts/stream (SSE live tail), /health. Loopback bind = the security boundary. - scripts/tests/test_receipts.py: real browser+iot decisions + synthetic agent.* → 7 receipts, 3 surfaces unified, 3 violations flagged, 4 permit / 3 deny. Live HTTP smoke verified. - docs/cockpit-receipts.md: design + API + how the client-vue Receipts panel consumes it. Reads only the local stream, serves loopback — no off-device egress. agent.* rows appear automatically once Lane 4 (PR #71) lands (surface derived from the prefix). Built in an isolated worktree off main; no collision with the parallel cockpit branch.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Lane 4 of docs/cockpit-composition-plan.md. Puts the enforcing policy engine in front of the bundled Noetica agent-machine sidecar — the same engine that governs the browser (79/79) and the IoT estate (20/20) now governs the cockpit's local agent.
What
spec.agentMachineActionContract— allowed (reads) / gated (mutations, per-action token) / prohibited (host-reaching + destructive). Prohibited→gated only on an unforgeable cockpit user gesture (actor==user && userGesture==true).agent-control-bridge.py --surface agent-machine(bridge was already namespace-aware).scripts/bearbrowser-agent-machine-gate.py— loopback governance proxy: cockpit → gate → classify → forward permitted /403 + agent.policy.violationfor prohibited → sidecar. Unrecognized mutating routes fail closed.scripts/tests/test_agent_machine_containment.py— 28/28. Injectedexecute-shell/read-credentials/disable-governanceblocked at decision time. Browser 79/79 + IoT 20/20 unchanged.docs/cockpit-lane4-governance.md— design + the one-line Lane 3 launcher integration.Notes
mainin an isolated worktree so it doesn't collide with the parallel Lanes 1–3 branch (feat/cockpit-embed-lane2). Integrates with Lane 3's launcher via one documented change when both land.🤖 Generated with Claude Code