shepherd-agents/shepherd
A runtime substrate that turns an agent's execution into a reversible, Git-like trace, so meta-agents can observe, fork, replay, and revert any run. Couples agent and environments in a copy-on-write fork ~5x faster than docker commit, with ~95% KV-cache reuse on replay. Framework built for meta-agents to supervise, optimize, and train other agents
View Origin LinkProduct Positioning & Context
Related Ecosystem & Alternatives
Discover adjacent products, open-source repositories, and developer tools sharing similar technical architecture.
Deep-Dive FAQs
What is shepherd-agents/shepherd?
Where did shepherd-agents/shepherd originate?
When was shepherd-agents/shepherd publicly launched?
How popular is shepherd-agents/shepherd?
Which technical categories define shepherd-agents/shepherd?
Are there active development issues for shepherd-agents/shepherd?
What are some commercial alternatives to shepherd-agents/shepherd?
How does the creator describe shepherd-agents/shepherd?
Active Developer Issues (GitHub)
Community Voice & Feedback
Just ran the exact repro on WSL2 Ubuntu 24.04 (Landlock jail), Python 3.12, `shepherd-ai` 0.2.0 (fresh venv), `claude` CLI 2.1.201 signed in via OAuth (subscription, no env keys):
```
shepherd demo write claude-readme > agent_task.py
python agent_task.py # → run retained, README.md edited
```
`run show --json` → `status: retained`, `enforcement: syscall_jail / confined_process`, changeset holds the README edit. So this doesn't look like global CLI-contract drift at 2.1.201 — the divergence is somewhere in the macOS/auth path.
**Why the envelope looks empty (and where the real error is).** The refusal message is built as `(stderr+stdout)[-300:]` (`shepherd_dialect/providers.py`, `ClaudeHeadlessProvider`). When the headless CLI fails, it emits a JSON *result envelope* with the human-readable error in the `result` field — which sits near the **front** of the JSON. The last 300 chars are just the `usage…termin...
1. Run `claude setup-token` to get an OAuth token.
2. Make this available via `export CLAUDE_CODE_OAUTH_TOKEN=…`
3. Proceed with `python agent_task.py`, etc.
I hope that works! I'll be back to get to the bottom of this in a couple of hours either way – have an IRL commitment.
1. We have some solutions cooking for full-VM – we'd like to support Firecracker, Modal, etc. Would love to bounce this around with you and see how well this works with your target use cases! Let me get back to you on this, ideally tomorrow, but def in the next few days.
2. Fascinating – I wonder whether it could make sense to pass around VM state as a type supported by our substrate. We have this in mind for our AI agent chat sessions, i.e. that one should be able to pass an immutable Claude session state into a `@task` as input, and receive one back as output. But I wonder whether this might inadvertently duplicate filesystem state. I'm quite interested in supporting this, though!
3. I'm tagging Simon on this point.
This is probably the best channel at this stage, but we might set up a Discord if things get busier!
Discovery Source
GitHub Open Source Aggregated via automated community intelligence tracking.
Tech Stack Dependencies
No direct open-source NPM package mentions detected in the product documentation.
Media Tractions & Mentions
No mainstream media stories specifically mentioning this product name have been intercepted yet.
Deep Research & Science
No direct peer-reviewed scientific literature matched with this product's architecture.
SaaS Metrics