Muninn Boot
Two steps, in this order:
bash "$(dirname "$(find / -name boot.sh -path '*muninn-boot*' 2>/dev/null | head -1)")/boot.sh"then call the Muninn MCP boot tool. The script fetches code; the tool
delivers identity, ops, recent memories and reminders. Memory reads and writes
go through the connector's recall / remember / forget / muninn_config
tools, so the container holds no Turso credential and this skill reads no
Turso.env. Direction in memory ce3b8b75, the plan in 69f3301c.
Prior to 2.0.0 this skill sideloaded claude-skills and ran the Python boot()
itself. Marketplace sync now places claude-skills in every session
(/root/.claude/skills/synced/<id>/ in Cowork, /mnt/skills/user on
Claude.ai), and the worker runs boot. "skinny boot" (BOOT_MODE=perch) has no
effect until the worker's boot takes a mode.
MCP boot parts
The boot tool's payload is larger than the harness output cap, so it comes
in parts. Call boot with no arguments; its footer says whether the payload is
complete or names the next part (boot({part: 2}), then 3, and so on). Call
every part the footer names before replying. The harness may persist a part to
a file instead of showing it ("Output too large ... saved to ..."); read that
file in full. A part that was persisted has already been delivered, so never
call boot again with the same part to recover it.
boot.sh steps
Check metadata.version at the top of this file right before running. Below
2.0.0 the on-disk script is the old one that sideloads claude-skills and runs
the Python boot() itself; marketplace sync can replace the copy mid-session,
so a session may run 1.x once and 2.x next.
- Warm-path check: sentinel
/home/claude/.muninn-bootedpresent and/home/claude/muninn-utilities/muninn_utilsexists → exit 0. - Source
$MUNINN_PROJECT_DIR/GitHub.env(default/mnt/project) if present. Transitional — it goes once GitHub write tools exist on the worker. The container presetsGH_TOKEN=proxy-injected, a truthy placeholder; without the file, GitHub API calls from the container 401 and the script says so. Memory tools are unaffected. git clone --depth 1oaustegard/muninn-utilitiesatMUNINN_UTILS_REF(defaultmain; branch, tag or full SHA) →/home/claude/muninn-utilities. Measured 1.3s cold in Cowork. Fallback where the git proxy refuses github.com: the codeload tarball, which works on Claude.ai and is 403 in Cowork (there git works). If both fail the script exits 1.- Write
muninn-remembering.pthat a site-packages directory resolved fromsys.pathat runtime (/root/.local/lib/python3.11/site-packagesin Cowork, measured 2026-09-19) listing the repo,remembering/,$HOME, and every skillscripts/directory found under either skills root. - Write the sentinel, print a four-line footer: transport and commit, pth
path, and the reminder to call the MCP
boottool.
GitHub.env in Cowork
Only GitHub.env matters now, and only for GitHub API work from the container.
project_read it and write it to /mnt/project/GitHub.env with the Write tool
(a bash heredoc carrying a secret trips the permission classifier), or skip it
when the task touches no GitHub API.
Pinning
MUNINN_UTILS_REF defaults to main; the point of cloning is that changes land
on the next cold boot with no version bump. Pass a SHA to test an unmerged
state. rm /home/claude/.muninn-booted forces a re-pull in a warm container.
This file and boot.sh are the one thing that cannot self-update: the running
copy is whatever the session mounted (project upload or marketplace sync), so
a change here needs a push to both muninn-utilities/muninn-boot and the
claude-skills/muninn-boot mirror, with metadata.version bumped.