Until now the ump-recall sidecar was started ad-hoc as a background process
and died with the session. This commit ships the systemd unit file that
makes it persist across reboots and Hermes gateway restarts.
The unit:
- Listens on 127.0.0.1:4380 (the sidecar port the MCP shim uses)
- Depends on ump-memory.service (canonical ump store at :4317)
- Reads env from /etc (UMP_URL, QDRANT_URL, OLLAMA_URL, GRAPH_FILE)
- Restarts on crash (RestartSec=3)
- Logs to journal under SyslogIdentifier=ump-recall-sidecar
Verifies cleanly via: curl http://127.0.0.1:4380/health
Returns upstreams reachable + graph loaded.
Install (idempotent):
sudo cp deploy/ump-recall-sidecar.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now ump-recall-sidecar.service
After moving the canonical ump store from /root/.openclaw/.../state/ump-local
to /root/.hermes/state/ump-local, two related fixes:
1. src/ump-recall-mcp.js (the MCP shim):
- UMP_DIR fallback updated: /root/.openclaw/... -> /root/.hermes/state/ump-local
(parent env always provides UMP_DIR explicitly, but the fallback
was a footgun if anyone unset it.)
- tools/call ump.get now routes to the sidecar's GET /get/{urn}
endpoint via HTTP, with fallback to the stdio child for resilience.
This replaces the silent-drop pattern where the npx child held
a stale UMP_DIR and returned "not_found: no record" for everything.
2. scripts/ump_verify.py (new):
File-layer verifier for ump-write verification. Replaces the
manual SOP with an executable that has deterministic exit codes:
0 verified, 2 silent drop, 3 malformed, 4 no store, 5 corrupted
Reads memory.ump.json directly (independent of any HTTP route),
supports --exists, --wait N, --list-last N.
3. .gitignore: ignore state/ (runtime cache: access_log.json, graph.json)
and __pycache__ (eval python tools).