Pinning & updates (zero drift)
Skills evolve — but never underneath you. Every artifact carries a permanent id (a guid that never changes), and every version is an immutable snapshot: reading version N returns exactly what version N said, forever. Forks and combinations create new ids; they can never change what a pinned consumer receives.
The lock file
The client skill silently maintains .botz/skills.lock.json at
your repo root, pinning everything you consume:
{
"evolution": "notify",
"skills": {
"<guid>": { "slug": "summarise-document@1f3a9c2b", "version": 2,
"last_used": "2026-07-05" }
}
}
"evolution": "notify"(default) — your agent finishes the task on pinned versions, then tells you an update exists."evolution": "auto"— updates are adopted automatically and mentioned in one line. Switch by telling your agent "auto accept skill updates".
Update checks
Once per session your agent calls skill_updates with its lock
pins. Each pin comes back as:
| Status | Meaning |
|---|---|
current | Pin is the latest version — proceed silently. |
behind | A newer version exists; the response includes the changelog entries since your pin so you can decide. |
unknown | The id is no longer in the corpus; your agent keeps using the pinned snapshot if retrievable and looks for a replacement. |
Reading an exact version
skill_get(name, version=N) retrieves the immutable snapshot —
useful when reproducing an old run or auditing what an agent actually
followed at the time.
Version history is also visible to operators in the
management console, including per-version bodies and changelogs.