Observed behavior
User clicks Settings > Server > Update & Restart in the dashboard. Expected: server pulls latest code, installs deps, restarts, dashboard header shows new version. Actual: process keeps running its original version (PID unchanged, _version.py in running code is stale).
Reproduction (production, macOS):
- Running HTTP server process started days before a new release
_version.py on disk was already updated to v10.38.2 (via git pull elsewhere)
- Clicked Update & Restart in dashboard — saw a progress toast, no error
- Dashboard continued displaying v10.36.3 in the header (from the still-running old process)
ps aux confirmed PID unchanged and start-time unchanged (days-old)
Likely causes (one or more)
- Uncommitted / conflicting working tree —
git pull in /server/update may bail silently. git status showed locally modified files (.claude/settings.json, untracked .claude/agents/, config/) at the time.
_restart_server_delayed() execv path failure — in src/mcp_memory_service/web/api/server.py lines 162–187 the execv call's error is logged but never surfaces to the user; HTTP response returns "restart scheduled" regardless.
- Auth / network error in update route — if
/server/update returns 4xx/5xx, dashboard toast may not make that visible enough.
Desired UX
- Update endpoint must pre-check
git status and refuse (with a clear, user-facing message) when working tree is dirty — or accept --force via explicit dashboard confirmation.
- Update endpoint must stream / return
git pull + pip install stdout/stderr so the dashboard can show them, not just a generic "updating…" toast.
- Restart endpoint must verify the old process actually exits (health poll after
RESTART_DELAY_SECONDS + N) and warn the user if the new process never responds with a different PID / start-time / version.
- Version badge in dashboard header should auto-poll or refresh after a successful restart so the user sees the new version without a manual hard-reload.
Tangentially related
PR #728 fixes the adjacent UX bug where "Update Available: Checking..." never resolved on its own.
Affected files
src/mcp_memory_service/web/api/server.py (/server/update, /server/restart, _restart_server_delayed)
src/mcp_memory_service/web/static/app.js (updateAndRestart, restartServer, version badge refresh)
Observed behavior
User clicks Settings > Server > Update & Restart in the dashboard. Expected: server pulls latest code, installs deps, restarts, dashboard header shows new version. Actual: process keeps running its original version (PID unchanged,
_version.pyin running code is stale).Reproduction (production, macOS):
_version.pyon disk was already updated to v10.38.2 (viagit pullelsewhere)ps auxconfirmed PID unchanged and start-time unchanged (days-old)Likely causes (one or more)
git pullin/server/updatemay bail silently.git statusshowed locally modified files (.claude/settings.json, untracked.claude/agents/,config/) at the time._restart_server_delayed()execvpath failure — insrc/mcp_memory_service/web/api/server.pylines 162–187 theexecvcall's error is logged but never surfaces to the user; HTTP response returns "restart scheduled" regardless./server/updatereturns 4xx/5xx, dashboard toast may not make that visible enough.Desired UX
git statusand refuse (with a clear, user-facing message) when working tree is dirty — or accept--forcevia explicit dashboard confirmation.git pull+pip installstdout/stderr so the dashboard can show them, not just a generic "updating…" toast.RESTART_DELAY_SECONDS + N) and warn the user if the new process never responds with a different PID / start-time / version.Tangentially related
PR #728 fixes the adjacent UX bug where "Update Available: Checking..." never resolved on its own.
Affected files
src/mcp_memory_service/web/api/server.py(/server/update,/server/restart,_restart_server_delayed)src/mcp_memory_service/web/static/app.js(updateAndRestart,restartServer, version badge refresh)