Skip to content

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 20 Aug 07:05
b698870

Two things land here: the agent can load skills, and the project can say what it
is and release itself.

Skills (#74)

Shmobster reads skills in the skillz
format -- a directory holding SKILL.md, YAML frontmatter (name,
description) over a Markdown body. That catalog already targets claude and
codex; shmobster is now a third host reading the same files unchanged, so a
procedure written once reaches the agent that is actually in the channel with
you instead of being restated per agent.

Sources are explicit directories, skills.paths in the config. Order is
precedence: the first path defining a name wins, so a private catalog listed
first shadows the public one, and a shadowed entry is logged at boot rather than
silently dropped.

Delivery is two-stage, because the system prompt is paid on every turn by every
vendor in the waterfall. The prompt carries a menu -- one line per skill, name
plus the first sentence of its description, capped -- and a load_skill(name)
tool pulls a full body only when the model decides one is relevant. The 44-skill
public catalog measures about 7KB standing; inlining full descriptions would be
~25KB, and a search-only tool would go unused, since a model cannot search for
what it does not know exists. With no paths configured there is no menu and no
tool: the feature costs nothing when unused.

reload_skills re-scans without a restart, behind the same trust gate as
set_policy. Reading files is not a mutation, but it changes which instructions
the agent will follow, which is what the gate is for.

A skill is instructions, not permission. Anything a skill tells the agent to run
still passes YOLT and the channel policy, so no skill can widen what a channel
can do. Known edge: if a turn starts with an empty menu, reload_skills fills
the index immediately but the load_skill tool is not offered until the next
turn.

Versioning and releases (#76)

An instance can now state what it is. shmobster.__version__ is the anchor and
build() reports <version>+<short-sha> -- logged at boot, printed by
selfcheck, and in the system prompt, so asking an instance which build it is
gets an answer rather than a guess. Instances run as services on separate
machines that pull on their own schedule, and between tags the sha is the only
thing that tells two of them apart.

Releases cut themselves. Feature PRs leave the version alone; a release is its
own commit bumping __version__, and .github/workflows/release.yml turns a
version with no matching tag into the tag plus this release. Notes come from
docs/release-notes/vX.Y.Z.md when the file exists and from merged PR titles
otherwise, so prose never blocks a release.

The posture is adapted from skillz, minus what only serves a plugin catalog.
There the version is the install cache key, so a PR shipping code without a
bump silently freezes every install -- hence their per-PR bump gate. Nothing
here is keyed on the version, so that gate would only churn numbers.

This repo also has CI for the first time: selfcheck.py, a parse check on the
example configs every new operator copies, and a structural sensitive-term gate
ported from skillz (token and key shapes, account ids, private IPs, internal
domains). The name-wordlist half of that gate stays off CI deliberately -- it
reads a private out-of-repo file, and an Actions secret would not reach fork
PRs, so the job would report green without having run the check.

Fixed

python selfcheck.py had been failing since v0.1.0 for anyone without the live
keys exported -- the case README step 5 calls an offline sanity check. The
example config's own _comment spelled a literal dollar-brace VAR, so the
${VAR} interpolator read the documentation as a reference and killed startup
on an unset variable named VAR. The comment no longer spells one, and
selfcheck stubs the names the example refers to with placeholders.

Upgrading

Skills are opt-in and nothing else changes behavior, but the dependency and the
config key are new:

git pull
.venv/bin/pip install -r requirements.txt   # adds pyyaml
.venv/bin/python selfcheck.py               # prints the build it just checked
deploy/service.sh restart                   # pick up the new code under launchd
  • New dependency: pyyaml, for skill frontmatter. An instance that skips
    the pip install will fail to import.
  • New config key: skills.paths, a list of directories of <name>/SKILL.md.
    Omit it to run exactly as before.
  • No policy-file changes; shmobster-policies.json is untouched.