Updating
How to pull a new version, what survives an update, and what to do when behavior changes.
The simple path
python3 hollow.py stop
git pull
docker compose pull # if using GHCR-published images
python3 hollow.py
That’s it for patch and minor version bumps (e.g. 5.7.x → 5.7.32, 5.7 → 5.8).
What survives an update
- Agent identity (
memory/identity/<agent>/), names, traits, opinions, narrative - Agent memory (
memory/agents/, semantic index), everything they’ve learned - Goal history (
memory/goals/<agent>/registry.jsonl) - Lessons (
memory/identity/<agent>/lessons.json) - Workspace files (
workspace/<agent>/) - Audit log (
memory/audit.log) - Config (
config.json)
What gets reset
- Container state: anything in-memory dies on
docker compose down. Agents re-cold-start their daemon loops. - Active goals in flight: if you stop mid-cycle, that cycle’s work is rolled back via txn rollback. Agents pick up from the last persisted state on restart.
When to nuke
A “nuke” wipes agent state and starts fresh. Use it when:
- Baseline is contaminated. An early bad goal cascade poisoned the agent’s worldview and they keep returning to the same loop. Symptoms: same goal text appearing in 10+ cycles, suffering stuck at high load, no new artifacts.
- Major version bump. Releases that change identity structure, lesson schemas, or capability registration will mention “memory reset required” in the release notes.
- You want to see the cold-start emergence. First-cycle agents pick names, set initial opinions, draft early goals. Watching this from scratch is worth doing once.
How to nuke:
- Via panel: click the Nuke button. Confirms before acting.
-
Via shell ,
python3 hollow.py stop rm -rf memory/audit.log memory/goals/* memory/identity/* memory/agents/* memory/semantic-index.json python3 hollow.py
Workspace files and config.json survive a nuke. If you want a TRULY clean slate, also delete workspace/<agent>/*.
Reading release notes
Each release on GitHub releases has notes. Read them before updating, especially for minor bumps (5.7 → 5.8). The pattern:
- Patch (
5.7.31 → 5.7.32): bug fixes, internal refactors. Safe to pull without thinking. - Minor (
5.7 → 5.8): new features, changed defaults. May require config tweak. Notes will say. - Major (
5.x → 6.x): substrate changes. Memory reset likely required.
What if behavior changes after an update?
First check the release notes. Most changes are explicitly called out.
Common change-after-update patterns:
- “My agents complete more goals now”: that’s intentional, v5.7.32 fixed the completion math; before that,
progress >= 1.0was mathematically unreachable in many configurations. - “My agents pick different fallback goals”: also intentional, v5.7.32 fixed the deterministic fallback that produced the same text every cycle for the same stressor.
- “Validation now rejects things it used to accept”: placeholder gate widened in v5.7.32. Files with
[From LLM Output],[Hypothesis], etc, patterns are caught now. - “Cycles take longer”: probably the cycle worker timeout bumped from 600s → 1500s to accommodate qwen3.6’s real cycle lengths. Each cycle has more headroom, completes more often.
Downgrading
git checkout v5.7.31 # or whatever tag
docker compose down
docker compose up -d --build
Memory and identity from a higher version may not be readable by a lower version. Check the release notes for forward/backward compat, most patch releases are bidirectional, minor and major are not.
Reporting regressions
If an update made things worse, report it with:
- Old version, new version
- What changed (specific behavior)
- Logs from before AND after (
docker logs hollow-api) - Whether you nuked or carried memory forward