Troubleshooting
First place to look
Your script talks to a background daemon. When something is wrong, the daemon's log usually says why:
tail -50 .sillon/daemon.log
Common messages
No active sillon run. Call sillonpy.init() first...
You logged before opening a run.
sp.log_param("x", 1) # no run open
with sp.track_run(): # fix
sp.log_param("x", 1)
Not in a sillon project.
The CLI needs to be run from a directory containing .sillon/. Either cd
there, or find it:
sillon projects
(sillon projects itself works from anywhere.)
Daemon failed to start. Check logs at .../daemon.log
The daemon could not come up. The log names the cause. Most common:
AF_UNIX path too long(Linux/macOS only) — the socket path has a hard OS limit of about 104 characters, and it lives inside your project. A deeply nested project directory hits it. Move the project somewhere shallower, or point the run elsewhere withproject_path=. Windows uses a loopback TCP port instead and has no such limit.- An import error in your environment — the daemon runs on the same interpreter as your script.
Result '<name>' ... is recorded in the database but missing from the run's HDF5 store
The run's row survived but its array store did not — usually a deleted or
partially copied .sillon/. The value is genuinely gone; the error is telling
you rather than handing back a placeholder.
TypeError: Object of type X is not JSON serializable
You logged a custom object. Convert it first — a dict, a list, a string, or a numpy array all work.
A command failed and my script stopped
That is intentional. A failed log call raises rather than continuing, because a
run that silently drops a value is a run that lies about what it contains. The
message names the command that failed; .sillon/daemon.log has the traceback.
Run status
| Status | Meaning |
|---|---|
SUCCESS |
the script finished normally |
CRASHED |
it raised an uncaught exception, or the process was killed |
RUNNING |
still in flight, or the daemon died before it could be sealed |
A crashed run records why:
sillon show my_run -m %all% | grep error
sillon.error.type RuntimeError
sillon.error.message the simulation blew up
A run stuck at RUNNING long after the script ended means the daemon was killed
mid-commit. The data logged before that point is in the store; the row was
never finalised.
The daemon
ps aux | grep sillon-server-daemon
- One per project, started on the first log call.
- Exits after five minutes idle. Override with
SILLON_IDLE_TIMEOUT(seconds) — raise it if you run scripts in bursts and want it to stay warm. - It will not exit while a run is still open.
Its endpoint files live in .sillon/ and are removed when it exits:
daemon.sock on Linux/macOS, or daemon.port and daemon.token on Windows.
To stop one by hand:
kill "$(cat .sillon/daemon.pid)" # Linux/macOS
taskkill /PID (Get-Content .sillon\daemon.pid) /F # Windows PowerShell
Killing it while a run is open loses that run's unsealed data. Killing it between runs is harmless.
Starting over
A project is just a directory:
rm -rf .sillon/ # deletes every run in the project
To remove individual runs and reclaim space instead:
sillon delete my_run
sillon prune --older-than 30d
Upgrading sillon
Databases from older versions are migrated in place the first time a newer
sillon opens them — new columns and indexes are added automatically, and no run
is rewritten. Back up .sillon/ before upgrading anyway if the project
matters; a migration is still a change to a file full of results.
Reporting a bug
Include:
sillon --version, your Python version and OS- the relevant part of
.sillon/daemon.log - the smallest script that reproduces it