The h5i Blog

Contained development environments for AI agents

A coding agent runs unattended, which makes two questions urgent at once: what could it reach, and what did it actually do? These posts are about answering both with something other than the agent's word. Isolation tiers and what each one honestly claims, egress allowlists and which layer they hold at, receipts written where the box cannot reach them, and how to review a branch nobody watched being written.

00
Pillar

The boundary

One enforced boundary around the code, the agent, the toolchain, the dev server and a browser, with a single human-operated exit. Everything else on this blog is a consequence of that shape.

Explainer 2026-06-01 8 min read

What is a contained agentic development environment?

Sandboxing one command was the right idea at the wrong scale. An agent's work is a shell, a package manager, a build, a dev server and a browser, and all of them have to be inside or the boundary is decorative.

Feature 2026-06-10 11 min read

The agent sandbox with an output gate

The product walkthrough: how a box is made, what the policy pins before any state exists, what the receipt records, and why export is deliberately a step a human takes.

Patterns 2026-06-14 7 min read

Four shapes a box can take

One create command, four meanings. Where the code came from decides whether the box is a worktree you can land in one step or a detached repository that refuses to.

Comparison 2026-05-30 7 min read

Git worktrees vs h5i boxes

A worktree separates checkouts. A box separates authority. When each is right, and the four moments a worktree quietly stops being enough.

01
Series

Sandboxing AI agents

Four parts, from the threat model to the kernel primitives to a comparison of every approach in the field to h5i's own design. Start at part one if the words Landlock and seccomp are new.

Part 1 2026-06-12 15 min read

Foundations

What a sandbox is, which threat models matter for an autonomous agent, and why each Linux primitive contains exactly one axis of authority.

Part 2 2026-06-12 17 min read

Implementing kernel-tier confinement

Probe, self-test, fail closed. The kernel reporting that a primitive exists does not mean confinement works, and that gap is where the dangerous bugs live.

Part 3 2026-06-12 18 min read

The landscape, compared by threat model

From nothing to full VMs, ranked by what each boundary actually defends against rather than by a leaderboard. Egress control measured in OSI layers.

Part 4 2026-06-12 16 min read

h5i's tier ladder and policy model

Five tiers, three egress mechanisms with three different guarantees, the lints that refuse a self-contradictory profile, and why the receipt is a sibling of the spool.

02
Theme

Evidence

Logging is easy and auditing is hard, and the difference is whether the thing being described could have written the description. What h5i records, where it puts it, and what it refuses to claim.

Essay 2026-04-28 9 min read

An audit you do not have to trust

Point at any line in your agent's audit trail and ask whether the agent could have written it. If yes, it is testimony, and testimony is not an audit.

Opinion 2026-05-18 7 min read

Why a diff is not enough for AI-generated code

Four things a comparison of two trees structurally cannot show, and why that gap only started hurting when the author stopped being a person you could ask.

Reference 2026-05-15 8 min read

What is inside an execution receipt

The record format field by field, including the three flags that exist purely so a reviewer cannot mistake missing evidence for clean evidence.

Feature 2026-05-08 7 min read

The flight recorder: five lanes and three colours

Red means the egress allowlist refused a destination, and nothing else is ever red. Grey means the evidence is weak, which is the most useful thing a dashboard can say.

How-to 2026-05-28 7 min read

How to track what Claude Code actually ran

Recording prompts feels like the obvious thing to log and is close to the least useful. Four commands for the part with consequences.

Retrospective 2026-06-02 8 min read

We built AI blame, then deleted it

Per-line provenance for AI-written code worked, and it was cut. The reason is more interesting than the feature was, and it explains the shape of everything that replaced it.

03
Theme

Review

What to do with a branch an agent wrote unattended, or a pull request from someone you have never met.

Feature 2026-05-24 9 min read

Review a pull request by running it

A diff review is a reading exercise. Give the branch a disposable machine to execute on and review a report of what it did there, starting with what the boundary refused.

Practice 2026-05-20 8 min read

Reviewing code an AI agent wrote

A reading order that puts the least trustworthy evidence at the bottom. The diff is the third thing worth opening, and the agent's summary is the last.

Practice 2026-05-12 8 min read

Triaging a fleet of agent boxes

One branch you can read closely; thirty is an allocation problem. Why the obvious fix, a risk score, stops working the week after you ship it.

Practice 2026-06-08 7 min read

Many boxes, one repository

Running three agents at one problem is easy. Comparing what they produced needs a base that cannot move, and there is deliberately no verifier to do the judging for you.

04
Theme

Policy

The boundary is a file. What goes in it, which contradictions it refuses, and what deliberately stays outside.

Tutorial 2026-06-18 9 min read

Write your first box profile

Built up one field at a time, with the failure each field prevents. Everything is fail-closed, so the fastest way to learn the file is to start from nothing.

Design 2026-06-20 7 min read

Why the sandbox policy is a file, not flags

A flag describes an invocation and lives in someone's shell history. A file arrives whole before anything runs, which is the only reason it can be refused.

Design 2026-05-04 7 min read

Pinning what was actually enforced

Resolve, hash, then create. Three small orderings that decide whether this ran under that policy is a verifiable fact or somebody's recollection.

Reference 2026-05-22 7 min read

What a box copies from your config, and what it strips

Your agent keeps its settings and its credentials in one directory. A box takes the first, prunes the second for size, and drops the third by shape at any depth.

Feature 2026-05-26 7 min read

Making boxes start in seconds, not minutes

A disposable environment stops being disposable at four minutes of cold install. Three rules that make a shared cache safe rather than merely fast.

05
Theme

Security

Threats that reach a coding agent through the text it reads, and what actually holds against them.

Security 2026-05-06 11 min read

Prompt injection: contain it, because you cannot detect it

Every defence that works by reading the attacker's text is a filter the attacker can read back. Bound what a compromised agent can reach instead.

Security 2026-05-06 8 min read

CVE-2026-33068: when a repo's settings.json decides trust

A committed bypassPermissions was read before the trust dialog, so the dialog never appeared. Inside a box, permission mode is a convenience setting rather than a boundary.

Security 2026-05-06 7 min read

CVE-2025-59536: code execution before the trust dialog

Project code ran before the user accepted the prompt. In a box that premise is already true and already handled, because agreeing happens at the end.

Comparison 2026-06-03 10 min read

Claude Code hooks vs Git hooks

Two lifecycles, two trust models. The right question is not whether a hook runs but who can turn it off, and the answer is why h5i moved observation below the agent.

06
Theme

Working in a box

The browser, the viewer, the control lock, and how the agent learns any of this exists.

Design 2026-06-05 6 min read

Who is driving the browser?

An agent and a human in front of one page is a concurrency problem with a pointer. Three rules, and the third one is the one nobody expects.

Design 2026-06-16 7 min read

Watching a box's browser without giving it a port

The stream port is never published. h5i enters the namespace by pid, connects from inside, and hands the socket back out. The terminal viewer binds nothing at all.

Design 2026-06-22 6 min read

Teaching an agent to use its own box

Documentation drift is annoying for humans and actively harmful for agents, because an agent will run the command your docs describe and then report that your tool is broken.