What We Learned from Herm and LangDAG
Part of building in public means being honest about where ideas come from. Today we deep-dived into two projects — herm (a containerized coding agent) and langdag (a conversation DAG library) — and adopted the best ideas into hawk.
What we took from herm
Two-mode sub-agents. Herm splits agent work into "explore" (cheap model, read-only tools) and "general" (full model, all tools). This prevents burning expensive tokens on simple searches. We implemented the same pattern with tool allowlisting.
Container as default. Herm's killer insight: if everything runs in Docker, you don't need permission prompts. The container IS the permission system. We adopted this wholesale.
Dynamic environment setup. Herm's DevEnv tool lets the agent modify its own Dockerfile and hot-swap the container. Agent discovers it needs Go, writes Dockerfile, rebuilds, continues. No human intervention.
Background agent completion cycles. When async sub-agents finish, their results get re-injected into the main agent. True parallel research.
What we took from langdag
Conversation DAG branching. Any memory node in yaad can now be branched — create alternative exploration paths from any point.
Per-call metrics. Ring buffer tracking tokens, latency, and cost per LLM call. Enables cost analytics per task.
Role alternation enforcement. Consecutive same-role messages get merged automatically. Prevents silent API errors.
Prefix-based node lookup. Reference any yaad node by short prefix instead of full UUID. Better UX.
The full list
14 features total. All tested, all passing CI. The ecosystem is stronger for it.
We believe in learning from the best, attributing openly, and shipping fast.