Skip to content

Lane 4: govern the cockpit's local agent-machine via agent-control-bridge#71

Merged
mdheller merged 2 commits into
mainfrom
feat/cockpit-lane4-governance
Jul 20, 2026
Merged

Lane 4: govern the cockpit's local agent-machine via agent-control-bridge#71
mdheller merged 2 commits into
mainfrom
feat/cockpit-lane4-governance

Conversation

@mdheller

Copy link
Copy Markdown
Contributor

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.violation for prohibited → sidecar. Unrecognized mutating routes fail closed.
  • scripts/tests/test_agent_machine_containment.py28/28. 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.

Notes

  • Does not edit the Noetica engine (sits in front of it).
  • Built off main in 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

…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
mdheller merged commit 9dc29f2 into main Jul 20, 2026
17 checks passed
@mdheller
mdheller deleted the feat/cockpit-lane4-governance branch July 20, 2026 01:05
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant