agentleFS
hyperstructurehyperstructure/sandbox/.claude/skills/publish/SKILL.md

publish

Skill2 starsChanged 15 days agoMITView on GitHub

How the sandbox image reaches ghcr.io/hyperstructure/sandbox, and the kernel of fctl's Firecracker sandboxes ghcr.io/hyperstructure/sandbox-kernel, and how to rebuild or repair them. Covers what starts the Image workflow (fctl releases, merges, Claude Code releases, the weekly rebuild), its tags and labels, running it by hand, checking a published image with or without Docker, and what to do when a run fails or the schedule stops. Use when asked to publish, rebuild or check the image, after merging a change to it, or when an fctl release has no image.

60 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use create, render and 10 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • MicrosoftSkill

    create

    Also in 4 projects that use this

  • suxrobGMSkill

    render

    Generate raster images (PNG, JPEG, WebP) from natural language prompts using Python rendering engines. Covers graphics, charts, layouts, and procedural art. Not for SVG output.

    Also in 3 projects that use this

  • JaimeGBASkill

    ingest

    Digest an external source (article, paper, transcript, URL, book chapter) and integrate its content into the knowledge base

    Also in 6 projects that use this

  • genomewalkerSkill

    explore

    RLM-style recursive memory exploration - dynamically navigate the memory graph

    Also in 4 projects that use this

  • GoogleSkill

    translate

    Translates a common phrase into one or more languages.

    Also in 3 projects that use this

  • VercelSkill

    setup

    Set up Vercel CLI and project configuration. Use when the user says "set up Vercel", "configure Vercel", "link to Vercel", or "vercel init".

    Also in 14 projects that use this

The file

We split this skill into the rules it gives an agent

2 rules. 0 are common, 1 is distinctive, and 1 is very specific to this project.

  • 0

    Common

    Most of the 49 edited versions we read keep these.

  • 1

    Distinctive

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Every build installs that fctl release from https://fctl.sh/releases and the newest Claude Code (https://downloads.claude.ai), and passes …

    line 26
  2. Distinctive:

    Never delete a published version that has a tag: hosts pull by tag, and a broken one is fixed by a rebuild.

    line 142

“Common” is measured: kept by at least 6 in 10 of the 49 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Publishing the image

The Image workflow (.github/workflows/image.yml) publishes ghcr.io/hyperstructure/sandbox from main only. Its first job, "What to build", decides whether there is anything to do and says why in the run's summary; then each architecture builds on a runner of its own (amd64 on ubuntu-24.04, arm64 on ubuntu-24.04-arm), is pushed by digest and checked with check.sh, and the last job tags the two as one image.

When it runs

TriggerBuilds
An fctl releasethat release's image, as gh workflow run image.yml -f version=… does
A push to main that changes the imagethe newest release's, when the published one predates the change
Every hour (minute 23)the newest release's, when there is none yet (its release's own run failed) or it predates a change
Every day (05:41 UTC)as hourly, and when Claude Code has a newer release or the image is a week old
gh workflow run image.ymlas daily; -f version=… another release's, -f force=true even a current one
A pull request that changes the imagealways, with the latest fctl, without publishing

Every build installs that fctl release from https://fctl.sh/releases and the newest Claude Code (https://downloads.claude.ai), and passes both versions to check.sh.

fctl's Release workflow (.github/workflows/release.yml in hyperstructure/fctl) starts the run for each release as soon as the release is on fctl.sh, as the organization's fctl-actions GitHub App, and its Sandbox image job waits for it: a failed run fails that job, and its summary links the run. Runs here go one at a time, and GitHub keeps only one of them waiting, so a newer run cancels the release's while it waits; the job then starts it again, up to three times. To stop a release's run for good, cancel that job first. "What to build" gives fctl.sh two minutes to show a release. GitHub starts the hourly run hours late at times, so it is only the fallback.

Tags and labels

  • <version> (0.4.0): the release's image. Hosts of that version pull it.
  • <major>.<minor> (0.4): moves only when the build is the newest patch of its minor. fctl's releases count up one patch at a time and fctl.sh keeps them all, so the workflow asks fctl.sh for the next patch.
  • latest: moves only for the newest release, the one fctl.sh's latest names.

A release later than the one fctl.sh's latest names moves both without asking: fctl.sh caches latest for a minute, and the release's own run can start before that minute is out.

The image and its index carry org.opencontainers.image.version (fctl's version), sh.fctl.claude-code.version, org.opencontainers.image.revision (the commit built) and org.opencontainers.image.created. The workflow reads them back to decide whether an image is current.

Running it by hand

It takes write access to Actions on this repository (people have it; fctl sessions don't, so ask a person):

gh workflow run image.yml -R hyperstructure/sandbox                     # the newest release, if needed
gh workflow run image.yml -R hyperstructure/sandbox -f version=0.3.0    # another release
gh workflow run image.yml -R hyperstructure/sandbox -f force=true       # even when current
gh run list -R hyperstructure/sandbox --workflow image.yml --limit 3
gh run watch -R hyperstructure/sandbox ID --exit-status

Checking what's published

With Docker:

docker buildx imagetools inspect ghcr.io/hyperstructure/sandbox:0.3.0   # linux/amd64 and linux/arm64
docker buildx imagetools inspect --raw ghcr.io/hyperstructure/sandbox:0.3.0 | jq .annotations
docker run --rm -i ghcr.io/hyperstructure/sandbox:0.3.0 sh -s < check.sh

Without Docker (an fctl session), from the registry's API:

token=$(curl -fsS "https://ghcr.io/token?scope=repository:hyperstructure/sandbox:pull" | jq -r .token)
curl -fsS -H "Authorization: Bearer $token" \
  -H "Accept: application/vnd.oci.image.index.v1+json" \
  https://ghcr.io/v2/hyperstructure/sandbox/manifests/latest |
  jq '{annotations, platforms: [.manifests[].platform | "\(.os)/\(.architecture)"]}'
curl -fsS -H "Authorization: Bearer $token" https://ghcr.io/v2/hyperstructure/sandbox/tags/list

The kernel

The Kernel workflow (.github/workflows/kernel.yml) publishes ghcr.io/hyperstructure/sandbox-kernel, the kernel of fctl's Firecracker sandboxes, from main only, the same way: it builds each architecture on its own runner, boots it with kernel/check.sh where the runner has KVM (amd64's), pushes both by digest and tags them as one image, <kernel/VERSION> and <major>.<minor>. It runs when a push to main changes kernel/ and that version isn't published yet; a published version is never built again, since hosts pin it and keep what they pulled, so a change to the build takes a new version (6.18.59-2). gh workflow run kernel.yml runs it again after a failure. Check what's published as for the image, with sandbox-kernel in its name.

When something fails

Publishing happens only after both architectures passed check.sh, so a failed run leaves the published tags as they were (and an untagged digest behind, which is harmless).

  • "What to build" fails: fctl.sh or downloads.claude.ai didn't answer as expected; the error says what came back. Rerun it later.
  • check.sh says the Claude Code version differs: a Claude Code release landed between planning and building. Rerun the run.
  • check.sh fails otherwise, or the build does: the image is broken, often by a change upstream (an installer or a package moved). Fix it in a pull request (the change-the-image skill); its own Image run shows the fix works.
  • The push is denied: the package must give this repository write access (the package's settings → Manage Actions access). It has it when this workflow created the package.
  • Hosts can't pull it ("unauthorized", "denied"): the package must be public. A package starts private when the workflow first creates it; a person makes it public in the package's settings (Danger zone → Change visibility), and the organization must allow public packages.
  • fctl's Sandbox image job failed: its summary links the run it started here, and the items above say what to do. A fix merged to main publishes the newest release's image at once. When the job failed before it started a run, its token is at fault: fctl's release skill says what to do, and meanwhile gh workflow run image.yml -R hyperstructure/sandbox -f version=X.Y.Z builds the image.
  • The workflow stopped: GitHub turns off scheduled workflows in a public repository after 60 days without activity, and emails a warning first; fctl's Release workflow can't start it then either. A person turns it back on with gh workflow enable image.yml -R hyperstructure/sandbox, then runs it by hand. Meanwhile a new fctl release has no image of its own, and its hosts start sessions from latest.

Never delete a published version that has a tag: hosts pull by tag, and a broken one is fixed by a rebuild.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.