Cross-link all docs

This commit is contained in:
Your Name
2026-09-04 00:59:19 -07:00
parent ef86224b2a
commit 350dd2e6c4
5 changed files with 56 additions and 36 deletions
+37 -25
View File
@@ -22,27 +22,30 @@ python3 -c "import pandas" # full data science stack
ls /mnt/skills # the 40 playbooks Claude follows
```
Want the exact bytes instead of a rebuild? The GitHub release carries the
full filesystem of a live session (8.9 GB, sanitized):
Want the exact bytes instead of a rebuild? The
[GitHub release](https://github.com/Razshy/Wiggle/releases/tag/v1.0-live-rootfs)
carries the full filesystem of a live session (8.9 GB, sanitized):
```bash
cat wiggle-part-aa wiggle-part-ab > wiggle.tar.zst
zstd -d -c wiggle.tar.zst | docker import - wiggle:live
```
See [ROOTFS.md](ROOTFS.md) for the full download and verification steps.
## How it works
- Claude decides to run something and sends the command over a private
channel to a supervisor process inside the VM.
- The supervisor starts the command with a fixed environment (see
`meta/env-contract.md`) and streams the output back.
[meta/env-contract.md](meta/env-contract.md)) and streams the output back.
- The command runs as root with no seccomp and no user sandbox. Inside this
VM, root is normal. The isolation that matters is the VM boundary itself.
- User files arrive as mounted folders under `/mnt/user-data`. In production
those are remote storage; here they are plain directories.
Machine spec to match if you care about parity: 1 vCPU, 3.9 GiB RAM, no
swap. Details in `meta/box-spec.md`.
Machine spec to match if you care about parity: 1 vCPU, 3.9 GiB RAM, no swap.
Details in [meta/box-spec.md](meta/box-spec.md).
## What is inside
@@ -56,18 +59,19 @@ swap. Details in `meta/box-spec.md`.
| Numbers and data | pandas, numpy, scipy, scikit-learn, Jupyter |
| Typesetting and PDFs | TeX Live 2023, poppler, qpdf, ImageMagick, wkhtmltopdf |
| Media | ffmpeg |
| **The playbooks Claude follows** | `/mnt/skills`, 40 skills, verbatim |
| **The playbooks Claude follows** | [mnt-skills/](mnt-skills/), 40 skills, verbatim |
The skills are the interesting part. They are plain Markdown instruction
files that Claude reads before doing certain jobs: how to fill a PDF form,
how to run deep research (including the sub-agent prompts), how to drive the
desktop with computer use, how to build a skill. Public ones cover office
documents and file reading; example ones cover deep-research, morning
briefings, painting, MCP server building, and more.
briefings, painting, MCP server building, and more. Browse them under
[mnt-skills/](mnt-skills/).
Two custom Anthropic binaries are included: `extract-text` (turns uploaded
documents into text, Rust) and the mount daemon interface (`rclone-filestore`,
Go, documented in `meta/filestore-api.md`).
Go, documented in [meta/filestore-api.md](meta/filestore-api.md)).
## What is not included
@@ -76,7 +80,8 @@ Four things live outside the filesystem, so no dump could contain them:
- The supervisor binary itself (runs from RAM, never from disk).
- The model, which is remote by definition.
- Anthropic's egress firewall and its CA roots.
- The remote storage service behind `/mnt/user-data` (contract documented).
- The remote storage service behind `/mnt/user-data`, whose contract is
documented in [meta/filestore-api.md](meta/filestore-api.md).
For e2b users: e2b's own daemon takes the supervisor's role, which is why
this image drops straight into an e2b template.
@@ -84,9 +89,10 @@ this image drops straight into an e2b template.
## Using it with your own agent
Any agent that can shell into a container can use this box exactly the way
Claude does: read the relevant `/mnt/skills/*/SKILL.md`, then run the tools
it names. Inject the environment from `meta/env-contract.md` and the
behavior matches production, quirks included.
Claude does: read the relevant `/mnt/skills/*/SKILL.md`, then run the tools it
names. Inject the environment from
[meta/env-contract.md](meta/env-contract.md) and the behavior matches
production, quirks included.
## Known quirks (present in the original, kept on purpose)
@@ -94,8 +100,8 @@ behavior matches production, quirks included.
Chromium fallback. The real sandbox has the same hole.
- `pip install` is blocked by PEP 668. Use `uv`. The offline wheel cache is
included.
- ImageMagick has no SVG coder and ignores `-quality` for webp. Use
Pillow or sharp.
- ImageMagick has no SVG coder and ignores `-quality` for webp. Use Pillow or
sharp.
- Tool exit codes lie often. Verify outputs (`test -s out && file out`)
instead of trusting success.
- `extract-text` segfaults under x86 emulation on ARM Macs. It is fine on
@@ -103,23 +109,29 @@ behavior matches production, quirks included.
## Repository layout
```
Dockerfile recovered build recipe (verified to build green)
_context/ build inputs: pinned manifests + the Anthropic binaries
mnt-skills/ the 40 skills, copied to /mnt/skills
meta/ manifests, env contract, filestore API, machine spec
ROOTFS.md how to get the exact live filesystem dump
```
- [Dockerfile](Dockerfile) the recovered build recipe (verified to build green)
- [_context/](_context/) build inputs: pinned manifests and the Anthropic binaries
- [mnt-skills/](mnt-skills/) the 40 skills, copied into the image at `/mnt/skills`
- [meta/](meta/)
[dpkg-manifest](meta/dpkg-manifest.txt),
[uv-manifest](meta/uv-manifest.txt),
[env-contract](meta/env-contract.md),
[filestore-api](meta/filestore-api.md),
[box-spec](meta/box-spec.md)
- [ROOTFS.md](ROOTFS.md) how to get the exact live filesystem dump
- [LICENSE](LICENSE) and [NOTICE](NOTICE)
## License
The build recipe, scripts, and documentation in this repo are MIT (`LICENSE`).
The build recipe, scripts, and documentation in this repo are MIT
([LICENSE](LICENSE)).
Everything Anthropic-made is theirs, not MIT:
- The 40 skill files in `mnt-skills/` and the Anthropic binaries each carry
Anthropic's own license (`NOTICE` and each `LICENSE.txt`), which does not
clearly allow redistribution. They are here as captured research artifacts.
- The 40 skill files in [mnt-skills/](mnt-skills/) and the Anthropic binaries
each carry Anthropic's own license ([NOTICE](NOTICE) and each
`LICENSE.txt`), which does not clearly allow redistribution. They are here
as captured research artifacts.
- If you would rather not ship them, delete `mnt-skills/` and remove the one
`COPY mnt-skills/` line from the Dockerfile. The box still builds and runs;
any user can re-obtain the skills by asking Claude to show them.
+9 -7
View File
@@ -8,16 +8,18 @@ Two ways, from fastest to most authentic.
docker build -t wiggle .
```
The `Dockerfile` is the build recipe recovered from the container's own
package timestamps and logs. It replays the exact build (verified green).
Takes about 25 to 40 minutes and produces an image functionally equal to the
live sandbox, minus the Anthropic-only daemons. On e2b:
`e2b template build -n wiggle` (needs the e2b CLI and `E2B_API_KEY`).
The [Dockerfile](Dockerfile) is the build recipe recovered from the
container's own package timestamps and logs. It replays the exact build
(verified green). Takes about 25 to 40 minutes and produces an image
functionally equal to the live sandbox, minus the Anthropic-only daemons. On
e2b: `e2b template build -n wiggle` (needs the e2b CLI and `E2B_API_KEY`).
See [meta/box-spec.md](meta/box-spec.md) for the VM settings around it.
## 2. Exact live rootfs (byte-level session export)
The GitHub release `v1.0-live-rootfs` carries the complete filesystem of a
live session, split in two for GitHub's 2 GiB asset limit:
The [GitHub release](https://github.com/Razshy/Wiggle/releases/tag/v1.0-live-rootfs)
carries the complete filesystem of a live session, split in two for GitHub's
2 GiB asset limit:
```bash
# download wiggle-part-aa and wiggle-part-ab from the release, then:
+3 -2
View File
@@ -1,7 +1,8 @@
# Machine spec
The image is the disk. To match Anthropic's sandbox, configure the VM around
it like this:
it like this. Companion docs: [env-contract.md](env-contract.md),
[filestore-api.md](filestore-api.md), [../README.md](../README.md).
| Setting | Value |
|---|---|
@@ -43,7 +44,7 @@ Two intentional oddities: `HOME` is `/root` but `PATH` leads with
## Gotchas (all present in the original)
- `pandoc x.md -o x.pdf` fails until you add `fonts-lmodern` or use a
fallback engine. See the README.
fallback engine. See [../README.md](../README.md).
- ImageMagick has no SVG coder and ignores `-quality` on webp. Use Pillow or
sharp.
- `pip install` is blocked by PEP 668. Use `uv`. The offline cache is included.
+4 -1
View File
@@ -1,7 +1,10 @@
# The exec-environment contract
What every command Claude runs receives, injected by the supervisor at
handoff. Reproduce it and behavior matches production.
handoff. Reproduce it and behavior matches production. Companion docs:
[box-spec.md](box-spec.md) (VM settings),
[filestore-api.md](filestore-api.md) (the mount backend),
[../README.md](../README.md).
```
DEBIAN_FRONTEND=noninteractive
+3 -1
View File
@@ -2,7 +2,9 @@
What the mount daemon (`rclone-filestore`, a custom Go build) speaks.
Recovered from the binary's symbols. Included so you can build a stand-in
backend if you want the mounts to behave like production.
backend if you want the mounts to behave like production. Companion docs:
[env-contract.md](env-contract.md), [box-spec.md](box-spec.md),
[../README.md](../README.md).
## Transport