pihme / hobelbank

Hobelbank

The umbrella over Hermetarium, Fregoli, Git Warden, grok-budget-mcp, claude-budget-mcp and Helferlein. They share one question: how do you build software in the age of AI? Each takes on one part of the answer, from the world an agent works in to the guards on its way out.

docs-only · no CI · the map of the workshop

#What it is

Hobelbank is the umbrella over the projects below. They share one question: how do you build software in the age of AI? Each project takes on one part of the answer, from the world an agent works in to the guards on its way out.

This repository holds no code. It explains the pieces, where each one sits, and how they are meant to connect. Each piece’s own repo stays the source of truth for what it does; this map only links them up.

#Current status

Last updated 6 November 2026 · main@0efffd1

Hobelbank is a docs-only map of the workshop. The readme names every released piece, where it sits among habitat, inhabitant and wall, how the pieces are meant to connect, the shared design philosophy and the risks each measure reduces. Two diagrams show the essential setup and the full map. A glossary keeps the words the same across the repos. There is no release yet. The license matches the rest of the workshop.

This repository holds no code and no runnable setup. The pieces do not yet run together end to end: example configs and Compose files that would let them work as one are still open work. Some named pieces are ideas only, such as the package proxy and scanner. The map can lag a piece's own repository when that piece moves faster than the map is updated.

#The problem

What follows is what I have run into so far and the working hypothesis the workshop is built on, not a settled finding.

Working with agents, I keep running into a trade-off between autonomy and control. Agents seem to do their best work with broad rights, and for coding agents shell access has mattered most. But an agent with a shell can step around other safety measures, for example by calling the Azure CLI directly instead of going through the Azure MCP server.

Many approaches limit the tools an agent may use. In my practical work, though, I have rarely been able to predict which tool an agent would need to solve a problem. That points towards giving it broad rights, and doing that without any check seems reckless.

My working hypothesis is that control is still needed, but of a particular kind: control the agent cannot get around, and control that needs no human. It decides on its own and never waits for anyone. The wall blocks by itself, and you hear about it afterwards; you are told, not asked to approve.

Simon Willison calls the dangerous mix the lethal trifecta: access to private data, exposure to untrusted content, and a way to send data out. The wall works on the third part without taking tools away from the agent. It does not close the way out completely: only allowlisted destinations such as model APIs and package registries are reachable, and every request is logged.

#The picture

The pieces form three layers around one rule: an agent may do anything inside its world, and everything that controls it lives outside, where it cannot reach.

  1. Habitat. Hermetarium boots an agent inside an OCI image, behind a wall. Inside, the agent is root.
  2. Inhabitants. Agents that live in a habitat and build software there. Fregoli is one of them; others can move in too.
  3. Wall services. Everything that sits on the wall, on the only network path: the I/O log today, a package proxy with a scanner later.

Some wall services may use a model of their own, like the AI security scanner. Such wall agents are trusted more than inhabitants, because they see what crosses the wall and decide on it. In return they may do far less: no shell and no tools, only reading what they are handed and answering.

Around the habitat sit tools the agents use, like grok-budget-mcp and claude-budget-mcp, and guards on the way to the Git remote, like Git Warden. Helferlein is a building block for the pages an inhabitant serves, not part of the wall.

Host: your machine or clusterWallSupervisorHermetariumInhabitantan agent, root insideSquidthe only way out, loggedInternetmodel APIs, packagesstartsstartsall trafficallowlisted

The essential pieces: a supervisor starts an inhabitant behind a wall, and all its traffic leaves through Squid.

#The pieces

PieceLayerStateWhere
HermetariumHabitathermetarium release porter releasepihme/hermetarium · website
Sandbox loggingWall service, part of HermetariumBuilt: Squid access log turned into io.jsonl, metadata onlyHermetarium
FregoliInhabitantFregoli releasepihme/fregoli · website
grok-budget-mcpTool for agentsgrok-budget-mcp releasepihme/grok-budget-mcp · website
claude-budget-mcpTool for agentsclaude-budget-mcp release, tested livepihme/claude-budget-mcp · website
Package proxy and AI security scannerWall service (or tool inside)Idea with an architecture sketchNot public yet
Git WardenGuards between agents and their Git remote: a Push Guard that checks every push, a Backup Guard that keeps an append-only backup of every branch and tagGit Warden releasepihme/git-warden · website
HelferleinBuilding block for an app’s web page, outside the three layers: an animated 3D avatar that shows when an agent is workingHelferlein releasepihme/helferlein · website

All released pieces are public and have their own website.

Host: your machine or clusterWall: runc (weak) or Firecracker (strong)Habitat: OCI image, agent is rootSupervisorHermetarium · GoWatching agentwith a budget MCP · possibleFregoliinhabitantOther agentsinhabitantsBudget MCPgrok- or claude- · possibleSquidonly way out · I/O log · keysPackage proxy + scannerideaInternetGit Wardenpush and backup guards · releasedGit remotestartssleep / wakeall trafficpackage fetchesgit push

The full map with every piece. Dashed lines and boxes are not built yet.

#How they connect

#Design philosophy

  1. Keep it simple. Each piece does one job with as few moving parts as it can. A small piece is easier to check, to replace and to trust.
  2. Set and forget. You set up an agent’s world once, and after that the agent never stops to ask you for permission. The decisions live outside, where the agent cannot reach them.
  3. Batteries included, assembly required. Together the pieces make a working setup, but it is meant to be adapted: your images, your allowlists, your agents.
  4. Bricks, not a stack. The pieces fit together, and each one can be swapped for something else that does the same job.
  5. The good side of Pareto. Aim for the solution that solves 80% of the problems with a fraction of the effort, and leave the rest out rather than make everything heavier.
  6. The show must go on. A check never stops the job. When something looks wrong, it is held back and you are warned, but the agent keeps working.

#Shared principles

#Risks and measures

The risks of giving an agent broad rights are leaking information, leaking or misusing secrets, downloading malicious code, a compromised agent, harmful changes to code, and harmful changes to infrastructure. Each measure below reduces some of them, but none removes a risk completely.

MeasureStateReducesOWASP
The wall. Everything the agent runs, including downloaded code, runs inside the habitat behind runc or Firecracker, and the habitat can be thrown away.BuiltDownloading malicious code, a compromised agent, harmful changes to infrastructure (the host is out of reach)LLM05, ASI05, ASI08, ASI10
One logged way out. All traffic leaves through Squid, only to allowlisted destinations, and every request is logged.BuiltLeaking information, a compromised agentLLM01, LLM02, ASI01, ASI02
Keys on the wall. API keys never enter the habitat; Squid adds them on the way out.BuiltLeaking or misusing secretsASI03
Package proxy and scanner. Downloads are stored, scanned and served from the wall.PlannedDownloading malicious codeLLM03, ASI04
Git Warden. Agents push to the warden instead of their Git remote; it holds suspicious changes back and warns, and only it holds the credential for the remote. A separate Backup Guard keeps an append-only backup of every branch and tag.BuiltHarmful changes to code, harmful changes to infrastructure, leaking or misusing secretsLLM06, ASI02, ASI03

Harmful changes to infrastructure are reduced the least. The wall protects the host, and Git Warden would catch infrastructure kept as code. But if a cloud API is on the allowlist and its key is added on the wall, an agent can call it directly, as with the Azure CLI in The problem, and only the allowlist and the log stand in the way.

#Roadmap

Planned milestones; neither has been released yet.

#Glossary

Words used the same way across all repos of the workshop.

Habitat

The world an agent wakes up in: an OCI image it may use freely as root. Provided by Hermetarium. A common noun, not a product name.

Inhabitant

An agent that lives in a habitat. Fregoli is one; any agent can be one.

Wall

The isolation boundary around a habitat, outside the image. Weak: Docker/runc, shared host kernel. Strong: Firecracker microVM, own guest kernel.

Supervisor

The Go process on the host that boots a habitat behind a wall, owns its only network path and writes the I/O log.

I/O log

What crosses the wall, recorded on the supervisor (io.jsonl). The inhabitant cannot switch it off.

Key injection

API keys stay in the host-side ACL; Squid adds them to requests for allowed destinations, so they never exist inside the image.

Wall service

Anything that runs on the wall’s network path rather than inside the habitat, such as the I/O log or a future package proxy.

Wall agent

A wall service that uses a model, such as the AI security scanner. Trusted more than an inhabitant, but with no shell and no tools.

Cordis

The plugin kernel Fregoli is built on (“everything is a plugin”), from the paper A Programming Paradigm for Spatiotemporal Composability.